feat : SOLID - ISP 샘플 코드 구현

This commit is contained in:
banjjoknim
2022-11-09 16:07:24 +09:00
parent ddc3f84a5d
commit 2dd284d300
13 changed files with 162 additions and 0 deletions

View File

@@ -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))

View File

@@ -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()
}
}

View File

@@ -0,0 +1,7 @@
package com.banjjoknim.soliddesignpatternsample.solid.isp.after
import com.banjjoknim.soliddesignpatternsample.solid.isp.common.Reservation
interface ReservationService {
fun makeReservation(): Reservation
}

View File

@@ -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)
}
}

View File

@@ -0,0 +1,7 @@
package com.banjjoknim.soliddesignpatternsample.solid.isp.after
import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatus
interface SeatStatusService {
fun getSeatStatus(): SeatStatus
}

View File

@@ -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)
}
}

View File

@@ -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()
}
}

View File

@@ -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
}

View File

@@ -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("좌석 현황 조회는 지원하지 않습니다.") // 불필요함에도 불구하고 구현해주어야 한다.
}
}

View File

@@ -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)
}
}

View File

@@ -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
)

View File

@@ -0,0 +1,5 @@
package com.banjjoknim.soliddesignpatternsample.solid.isp.common
data class SeatStatus(
val type: SeatStatusType
)

View File

@@ -0,0 +1,6 @@
package com.banjjoknim.soliddesignpatternsample.solid.isp.common
enum class SeatStatusType {
CAN_RESERVATION,
CANNOT_RESERVATION
}