From 2ea7227b04df061cc481c2dea6404139ab9d0e64 Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Wed, 9 Nov 2022 19:31:42 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20SOLID=20-=20DIP=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 | 13 ++++++++++ .../solid/dip/after/AmazonStorageService.kt | 19 ++++++++++++++ .../solid/dip/after/GoogleStorageService.kt | 19 ++++++++++++++ .../solid/dip/after/StorageControllerAfter.kt | 18 +++++++++++++ .../solid/dip/after/StorageService.kt | 8 ++++++ .../solid/dip/after/StorageServiceConfiguration.kt | 24 +++++++++++++++++ .../solid/dip/before/StorageControllerBefore.kt | 26 +++++++++++++++++++ .../solid/dip/before/StorageType.kt | 6 +++++ .../solid/dip/common/AmazonStorage.kt | 7 +++++ .../solid/dip/common/AmazonStorageReadFileRequest.kt | 5 ++++ .../solid/dip/common/GoogleStorage.kt | 7 +++++ .../solid/dip/common/GoogleStorageReadFileRequest.kt | 5 ++++ .../solid/dip/common/ReadFileRequest.kt | 5 ++++ .../solid/dip/common/StorageFile.kt | 5 ++++ 14 files changed, 167 insertions(+) create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/AmazonStorageService.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/GoogleStorageService.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageControllerAfter.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageService.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageServiceConfiguration.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/before/StorageControllerBefore.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/before/StorageType.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/AmazonStorage.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/AmazonStorageReadFileRequest.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/GoogleStorage.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/GoogleStorageReadFileRequest.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/ReadFileRequest.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/StorageFile.kt diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md index bf75c9e..e09770a 100644 --- a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md @@ -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)) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/AmazonStorageService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/AmazonStorageService.kt new file mode 100644 index 0000000..21ea736 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/AmazonStorageService.kt @@ -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) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/GoogleStorageService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/GoogleStorageService.kt new file mode 100644 index 0000000..a209b54 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/GoogleStorageService.kt @@ -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) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageControllerAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageControllerAfter.kt new file mode 100644 index 0000000..bb5b822 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageControllerAfter.kt @@ -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) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageService.kt new file mode 100644 index 0000000..768ffb0 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageService.kt @@ -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 +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageServiceConfiguration.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageServiceConfiguration.kt new file mode 100644 index 0000000..3acf3e7 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageServiceConfiguration.kt @@ -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() +// } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/before/StorageControllerBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/before/StorageControllerBefore.kt new file mode 100644 index 0000000..19c615a --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/before/StorageControllerBefore.kt @@ -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) + } + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/before/StorageType.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/before/StorageType.kt new file mode 100644 index 0000000..0b2164e --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/before/StorageType.kt @@ -0,0 +1,6 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.before + +enum class StorageType { + AMAZON, + GOOGLE +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/AmazonStorage.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/AmazonStorage.kt new file mode 100644 index 0000000..53ad2b2 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/AmazonStorage.kt @@ -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") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/AmazonStorageReadFileRequest.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/AmazonStorageReadFileRequest.kt new file mode 100644 index 0000000..75f0614 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/AmazonStorageReadFileRequest.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.common + +interface AmazonStorageReadFileRequest { + val fileName: String +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/GoogleStorage.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/GoogleStorage.kt new file mode 100644 index 0000000..f62af11 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/GoogleStorage.kt @@ -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") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/GoogleStorageReadFileRequest.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/GoogleStorageReadFileRequest.kt new file mode 100644 index 0000000..a793716 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/GoogleStorageReadFileRequest.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.common + +interface GoogleStorageReadFileRequest { + val fileNumber: Int +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/ReadFileRequest.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/ReadFileRequest.kt new file mode 100644 index 0000000..ce48ecb --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/ReadFileRequest.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.common + +data class ReadFileRequest( + val fileInformation: String +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/StorageFile.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/StorageFile.kt new file mode 100644 index 0000000..1890897 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/StorageFile.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.common + +data class StorageFile( + val data: String +)