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