From 2dd284d3000ec9c0d39a5ded84dae63038c564ea Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Wed, 9 Nov 2022 16:07:24 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20SOLID=20-=20ISP=20=EC=83=98=ED=94=8C?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solid-design-pattern-sample/README.md | 10 ++++++++ .../solid/isp/after/CinemaControllerAfter.kt | 25 +++++++++++++++++++ .../solid/isp/after/ReservationService.kt | 7 ++++++ .../solid/isp/after/ReservationServiceAfter.kt | 11 ++++++++ .../solid/isp/after/SeatStatusService.kt | 7 ++++++ .../solid/isp/after/SeatStatusServiceAfter.kt | 12 +++++++++ .../solid/isp/before/CinemaControllerBefore.kt | 25 +++++++++++++++++++ .../solid/isp/before/CinemaService.kt | 10 ++++++++ .../solid/isp/before/ReservationServiceBefore.kt | 16 ++++++++++++ .../solid/isp/before/SeatStatusServiceBefore.kt | 17 +++++++++++++ .../solid/isp/common/Reservation.kt | 11 ++++++++ .../solid/isp/common/SeatStatus.kt | 5 ++++ .../solid/isp/common/SeatStatusType.kt | 6 +++++ 13 files changed, 162 insertions(+) create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/CinemaControllerAfter.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/ReservationService.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/ReservationServiceAfter.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/SeatStatusService.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/SeatStatusServiceAfter.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/CinemaControllerBefore.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/CinemaService.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/ReservationServiceBefore.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/SeatStatusServiceBefore.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/Reservation.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/SeatStatus.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/SeatStatusType.kt diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md index 08e3c6a..bf75c9e 100644 --- a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md @@ -37,6 +37,16 @@ - 좌표를 입력하면 해당 좌표로 이동수단의 위치가 변한다. +### ISP(Interface Segregation Principle) + +- 인터페이스 분리 원칙 +- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다. + +#### 구현 요구사항 + +- 영화 상영관 좌석 현황을 조회할 수 있다. +- 영화표 예매를 진행할 수 있다. + ## 참고자료 - [SOLID (객체 지향 설계)](https://ko.wikipedia.org/wiki/SOLID_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%EC%84%A4%EA%B3%84)) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/CinemaControllerAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/CinemaControllerAfter.kt new file mode 100644 index 0000000..4998ee9 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/CinemaControllerAfter.kt @@ -0,0 +1,25 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.after + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.Reservation +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatus +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RequestMapping("/cinemas") +@RestController +class CinemaControllerAfter( + private val seatStatusService: SeatStatusServiceAfter, + private val reservationService: ReservationServiceAfter +) { + @GetMapping("/with-isp-get-seat-status") + fun getSeatStatus(): SeatStatus { + return seatStatusService.getSeatStatus() + } + + @PostMapping("/with-isp-make-reservation") + fun makeReservation(): Reservation { + return reservationService.makeReservation() + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/ReservationService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/ReservationService.kt new file mode 100644 index 0000000..85b60ef --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/ReservationService.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.after + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.Reservation + +interface ReservationService { + fun makeReservation(): Reservation +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/ReservationServiceAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/ReservationServiceAfter.kt new file mode 100644 index 0000000..c30265c --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/ReservationServiceAfter.kt @@ -0,0 +1,11 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.after + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.Reservation +import org.springframework.stereotype.Service + +@Service +class ReservationServiceAfter : ReservationService { + override fun makeReservation(): Reservation { + return Reservation(seat = "A1", id = 1L) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/SeatStatusService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/SeatStatusService.kt new file mode 100644 index 0000000..dc53340 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/SeatStatusService.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.after + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatus + +interface SeatStatusService { + fun getSeatStatus(): SeatStatus +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/SeatStatusServiceAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/SeatStatusServiceAfter.kt new file mode 100644 index 0000000..3a97a82 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/SeatStatusServiceAfter.kt @@ -0,0 +1,12 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.after + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatus +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatusType +import org.springframework.stereotype.Service + +@Service +class SeatStatusServiceAfter : SeatStatusService { + override fun getSeatStatus(): SeatStatus { + return SeatStatus(SeatStatusType.CAN_RESERVATION) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/CinemaControllerBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/CinemaControllerBefore.kt new file mode 100644 index 0000000..40791ca --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/CinemaControllerBefore.kt @@ -0,0 +1,25 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.before + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.Reservation +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatus +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RequestMapping("/cinemas") +@RestController +class CinemaControllerBefore( + private val seatStatusService: SeatStatusServiceBefore, + private val reservationService: ReservationServiceBefore, +) { + @GetMapping("/none-isp-get-seat-status") + fun getSeatStatus(): SeatStatus { + return seatStatusService.getSeatStatus() + } + + @PostMapping("/none-isp-make-reservation") + fun makeReservation(): Reservation { + return reservationService.makeReservation() + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/CinemaService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/CinemaService.kt new file mode 100644 index 0000000..538a7aa --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/CinemaService.kt @@ -0,0 +1,10 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.before + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.Reservation +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatus + +interface CinemaService { + fun makeReservation(): Reservation + + fun getSeatStatus(): SeatStatus +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/ReservationServiceBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/ReservationServiceBefore.kt new file mode 100644 index 0000000..5680588 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/ReservationServiceBefore.kt @@ -0,0 +1,16 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.before + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.Reservation +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatus +import org.springframework.stereotype.Service + +@Service +class ReservationServiceBefore : CinemaService { + override fun makeReservation(): Reservation { + return Reservation(seat = "A1", id = 1L) + } + + override fun getSeatStatus(): SeatStatus { + throw UnsupportedOperationException("좌석 현황 조회는 지원하지 않습니다.") // 불필요함에도 불구하고 구현해주어야 한다. + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/SeatStatusServiceBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/SeatStatusServiceBefore.kt new file mode 100644 index 0000000..db6a95e --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/SeatStatusServiceBefore.kt @@ -0,0 +1,17 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.before + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.Reservation +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatus +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatusType +import org.springframework.stereotype.Service + +@Service +class SeatStatusServiceBefore : CinemaService { + override fun makeReservation(): Reservation { + throw UnsupportedOperationException("영화표 예매는 지원하지 않습니다.") // 불필요함에도 불구하고 구현해주어야 한다. + } + + override fun getSeatStatus(): SeatStatus { + return SeatStatus(SeatStatusType.CAN_RESERVATION) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/Reservation.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/Reservation.kt new file mode 100644 index 0000000..c3cdfad --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/Reservation.kt @@ -0,0 +1,11 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.common + +import javax.persistence.Entity +import javax.persistence.Id + +@Entity +class Reservation( + val seat: String, + @Id + val id: Long = 0L +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/SeatStatus.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/SeatStatus.kt new file mode 100644 index 0000000..6b4e700 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/SeatStatus.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.common + +data class SeatStatus( + val type: SeatStatusType +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/SeatStatusType.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/SeatStatusType.kt new file mode 100644 index 0000000..182c281 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/SeatStatusType.kt @@ -0,0 +1,6 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.common + +enum class SeatStatusType { + CAN_RESERVATION, + CANNOT_RESERVATION +}