feat : SOLID - DIP 샘플 코드 구현

This commit is contained in:
banjjoknim
2022-11-09 19:31:42 +09:00
parent 2dd284d300
commit 2ea7227b04
14 changed files with 167 additions and 0 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,6 @@
package com.banjjoknim.soliddesignpatternsample.solid.dip.before
enum class StorageType {
AMAZON,
GOOGLE
}

View File

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

View File

@@ -0,0 +1,5 @@
package com.banjjoknim.soliddesignpatternsample.solid.dip.common
interface AmazonStorageReadFileRequest {
val fileName: String
}

View File

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

View File

@@ -0,0 +1,5 @@
package com.banjjoknim.soliddesignpatternsample.solid.dip.common
interface GoogleStorageReadFileRequest {
val fileNumber: Int
}

View File

@@ -0,0 +1,5 @@
package com.banjjoknim.soliddesignpatternsample.solid.dip.common
data class ReadFileRequest(
val fileInformation: String
)

View File

@@ -0,0 +1,5 @@
package com.banjjoknim.soliddesignpatternsample.solid.dip.common
data class StorageFile(
val data: String
)