feat : SOLID - DIP 샘플 코드 구현
This commit is contained in:
@@ -47,6 +47,19 @@
|
|||||||
- 영화 상영관 좌석 현황을 조회할 수 있다.
|
- 영화 상영관 좌석 현황을 조회할 수 있다.
|
||||||
- 영화표 예매를 진행할 수 있다.
|
- 영화표 예매를 진행할 수 있다.
|
||||||
|
|
||||||
|
### DIP(Dependency Inversion 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))
|
- [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))
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package com.banjjoknim.soliddesignpatternsample.solid.dip.after
|
||||||
|
|
||||||
|
import com.banjjoknim.soliddesignpatternsample.solid.dip.common.AmazonStorage
|
||||||
|
import com.banjjoknim.soliddesignpatternsample.solid.dip.common.AmazonStorageReadFileRequest
|
||||||
|
import com.banjjoknim.soliddesignpatternsample.solid.dip.common.ReadFileRequest
|
||||||
|
import com.banjjoknim.soliddesignpatternsample.solid.dip.common.StorageFile
|
||||||
|
import org.springframework.stereotype.Service
|
||||||
|
|
||||||
|
@Service
|
||||||
|
class AmazonStorageService : StorageService {
|
||||||
|
override fun readStorageFile(request: ReadFileRequest): StorageFile {
|
||||||
|
val storage = AmazonStorage()
|
||||||
|
val amazonStorageReadFileRequest = object : AmazonStorageReadFileRequest {
|
||||||
|
override val fileName: String
|
||||||
|
get() = request.fileInformation
|
||||||
|
}
|
||||||
|
return storage.provideStorageFile(amazonStorageReadFileRequest)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package com.banjjoknim.soliddesignpatternsample.solid.dip.after
|
||||||
|
|
||||||
|
import com.banjjoknim.soliddesignpatternsample.solid.dip.common.GoogleStorage
|
||||||
|
import com.banjjoknim.soliddesignpatternsample.solid.dip.common.GoogleStorageReadFileRequest
|
||||||
|
import com.banjjoknim.soliddesignpatternsample.solid.dip.common.ReadFileRequest
|
||||||
|
import com.banjjoknim.soliddesignpatternsample.solid.dip.common.StorageFile
|
||||||
|
import org.springframework.stereotype.Component
|
||||||
|
|
||||||
|
@Component
|
||||||
|
class GoogleStorageService : StorageService {
|
||||||
|
override fun readStorageFile(request: ReadFileRequest): StorageFile {
|
||||||
|
val storage = GoogleStorage()
|
||||||
|
val googleStorageReadFileRequest = object : GoogleStorageReadFileRequest {
|
||||||
|
override val fileNumber: Int
|
||||||
|
get() = request.fileInformation.toInt()
|
||||||
|
}
|
||||||
|
return storage.provideStorageFile(googleStorageReadFileRequest)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package com.banjjoknim.soliddesignpatternsample.solid.dip.after
|
||||||
|
|
||||||
|
import com.banjjoknim.soliddesignpatternsample.solid.dip.common.ReadFileRequest
|
||||||
|
import com.banjjoknim.soliddesignpatternsample.solid.dip.common.StorageFile
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping
|
||||||
|
import org.springframework.web.bind.annotation.RestController
|
||||||
|
|
||||||
|
@RequestMapping("/storages")
|
||||||
|
@RestController
|
||||||
|
class StorageControllerAfter(
|
||||||
|
private val storageService: StorageService
|
||||||
|
) {
|
||||||
|
@GetMapping("/with-dip")
|
||||||
|
fun readStorageFile(request: ReadFileRequest): StorageFile {
|
||||||
|
return storageService.readStorageFile(request)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package com.banjjoknim.soliddesignpatternsample.solid.dip.after
|
||||||
|
|
||||||
|
import com.banjjoknim.soliddesignpatternsample.solid.dip.common.ReadFileRequest
|
||||||
|
import com.banjjoknim.soliddesignpatternsample.solid.dip.common.StorageFile
|
||||||
|
|
||||||
|
interface StorageService {
|
||||||
|
fun readStorageFile(request: ReadFileRequest): StorageFile
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package com.banjjoknim.soliddesignpatternsample.solid.dip.after
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean
|
||||||
|
import org.springframework.context.annotation.Configuration
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
class StorageServiceConfiguration {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AmazonStorageService 를 적용하고 싶은 경우
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
fun storageService(): StorageService {
|
||||||
|
return AmazonStorageService()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GoogleStorageService 를 적용하고 싶은 경우
|
||||||
|
*/
|
||||||
|
// @Bean
|
||||||
|
// fun storageService(): StorageService {
|
||||||
|
// return GoogleStorageService()
|
||||||
|
// }
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package com.banjjoknim.soliddesignpatternsample.solid.dip.before
|
||||||
|
|
||||||
|
import com.banjjoknim.soliddesignpatternsample.solid.dip.after.AmazonStorageService
|
||||||
|
import com.banjjoknim.soliddesignpatternsample.solid.dip.after.GoogleStorageService
|
||||||
|
import com.banjjoknim.soliddesignpatternsample.solid.dip.common.ReadFileRequest
|
||||||
|
import com.banjjoknim.soliddesignpatternsample.solid.dip.common.StorageFile
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam
|
||||||
|
import org.springframework.web.bind.annotation.RestController
|
||||||
|
|
||||||
|
@RequestMapping("/storages")
|
||||||
|
@RestController
|
||||||
|
class StorageControllerBefore(
|
||||||
|
private val amazonStorageService: AmazonStorageService,
|
||||||
|
private val googleStorageService: GoogleStorageService,
|
||||||
|
) {
|
||||||
|
@GetMapping("/none-dip")
|
||||||
|
fun readStorageFile(@RequestParam storageType: StorageType, @RequestParam fileInformation: String): StorageFile {
|
||||||
|
val readFileRequest = ReadFileRequest(fileInformation)
|
||||||
|
return when (storageType) {
|
||||||
|
StorageType.AMAZON -> amazonStorageService.readStorageFile(readFileRequest)
|
||||||
|
StorageType.GOOGLE -> googleStorageService.readStorageFile(readFileRequest)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package com.banjjoknim.soliddesignpatternsample.solid.dip.before
|
||||||
|
|
||||||
|
enum class StorageType {
|
||||||
|
AMAZON,
|
||||||
|
GOOGLE
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.banjjoknim.soliddesignpatternsample.solid.dip.common
|
||||||
|
|
||||||
|
class AmazonStorage {
|
||||||
|
fun provideStorageFile(request: AmazonStorageReadFileRequest): StorageFile {
|
||||||
|
return StorageFile("${request.fileName} data from amazon")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.banjjoknim.soliddesignpatternsample.solid.dip.common
|
||||||
|
|
||||||
|
interface AmazonStorageReadFileRequest {
|
||||||
|
val fileName: String
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.banjjoknim.soliddesignpatternsample.solid.dip.common
|
||||||
|
|
||||||
|
class GoogleStorage {
|
||||||
|
fun provideStorageFile(request: GoogleStorageReadFileRequest): StorageFile {
|
||||||
|
return StorageFile("${request.fileNumber} data from amazon")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.banjjoknim.soliddesignpatternsample.solid.dip.common
|
||||||
|
|
||||||
|
interface GoogleStorageReadFileRequest {
|
||||||
|
val fileNumber: Int
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.banjjoknim.soliddesignpatternsample.solid.dip.common
|
||||||
|
|
||||||
|
data class ReadFileRequest(
|
||||||
|
val fileInformation: String
|
||||||
|
)
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.banjjoknim.soliddesignpatternsample.solid.dip.common
|
||||||
|
|
||||||
|
data class StorageFile(
|
||||||
|
val data: String
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user