-
Notifications
You must be signed in to change notification settings - Fork 0
Driving Adapter
Hexagonal Architecture(ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ)์ Driving Adapter๋ ์ฌ์ฉ์์ ์ ๋ ฅ์ ๋ฐ์ Application Core๋ก ์ ๋ฌํ๋ ์ญํ ์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ธ๋ถ ๊ณ์ธต(์ฌ์ฉ์, ์์คํ , ์ด๋ฒคํธ ์์ค ๋ฑ)๊ณผ Application์ ๋๋ฉ์ธ ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ์ ์ฐ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํฌ ์ ์์์ต๋๋ค.
๋ํ, Application์ UseCase๋ฅผ ํฌํธ๋ก ํ ๋น ๋ฐ์ ์ ์ถ๋ ฅ์ ์ ์ํ์์ต๋๋ค. ๊ทธ๋ก ์ธํด ์์กด๋ ๋ํ Application์ผ๋ก ํฅํ ์ ์์์ต๋๋ค. ์ด๋ฒ backend-sample-hexagonal-simple-crud์ Driving Adapter๋ Rest API๋ฅผ ์ฒ๋ฆฌํ๋ Web Adapter๋ฅผ ๊ตฌํํ์์ต๋๋ค.
CQRS ํจํด์ ๋์ ํ์ฌ Board(๊ฒ์ํ) ๋๋ฉ์ธ์ ์กฐํ์ ๋ช ๋ น์ ๊ฐ๊ฐ ๋ถ๋ฆฌํ์ฌ ์งํํ์์ต๋๋ค.
ํญ๋ชฉ | ์์ ์ |
---|---|
QueryApi | shin-jingyu |
CommandApi | silberbullet |
- HTTP ์์ฒญ ์์ : ํด๋ผ์ด์ธํธ์ GET, POST, PATCH, DELETE ์์ฒญ ์ฒ๋ฆฌ
- UseCase ํธ์ถ: ์์ฒญ๋ ๋ฐ์ดํฐ๋ฅผ ๋น์ฆ๋์ค ๋ก์ง์ผ๋ก ์ ๋ฌ
API | ์ค๋ช | ๊ธฐ๋ฅ |
---|---|---|
QueryApi | ๋ฐ์ดํฐ ์กฐํ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ฉฐ, ํด๋ผ์ด์ธํธ๋ก๋ถํฐ์ GET ์์ฒญ์ ์ฒ๋ฆฌํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ |
|
CommandApi | ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ(์์ฑ, ์์ , ์ญ์ ) ์์ฒญ์ ์ฒ๋ฆฌํ๋ฉฐ, ํด๋ผ์ด์ธํธ์ POST, PATCH, DELETE ์์ฒญ์ ์ฒ๋ฆฌ |
|
๋ช ํํ ๋ฐ์ดํฐ ๋ณํ ๋ฐ ๊ตฌ์กฐํ๋ฅผ ์ํด Mapper์ DTO(Data Transfer Object) ๋ฅผ ํ์ฉํ์ฌ Application ์์ญ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ์ ๋ต์ ์ฌ์ฉํ์์ต๋๋ค.
- Domain(๋๋ฉ์ธ)๊ณผ DTO ๊ฐ ๋ณํ์ ์ํํ์ฌ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ํํ ๊ณ์ธต์ ๋ถ๋ฆฌ
- ์๋น์ค ๋ ์ด์ด์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๋ ์ญํ ์ ์ต์ํํ๊ณ , ๋จ์ ๋ณํ ๋ก์ง์ ์ ๋ด
- ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ ์ผ๊ด๋ ๋ฐ์ดํฐ ํฌ๋งท ์ ์ง
- ๋๋ฉ์ธ ๋ชจ๋ธ ๋ณดํธ
- REST API์ ์์ฒญ๊ณผ ์๋ต์ ๋ช ํํ๊ฒ ์ ์ํ์ฌ ์ ์ง๋ณด์์ฑ ํฅ์
-
@WebMvcTest(BoardQueryApi::class)
-
BoardQueryApi
๋ฅผ ๋น์ผ๋ก ๋ก๋ํ๊ณ MockMvc๋ฅผ ํ์ฉํ์ฌ HTTP ์์ฒญ์ ํ ์คํธํ ๋ ์ฌ์ฉ
-
-
@MockitoBean
- ํน์ ๊ฐ์ฒด๋ฅผ Mockingํ์ฌ ํ ์คํธ ์ปจํ ์คํธ์ ์ฃผ์
- Kotest์์ ์ ๊ณตํ๋ ํ ์คํธ ์คํ์ผ ์ค ํ๋๋ก, ๋ณด๋ค ์์ ๋ก์ด ๊ตฌ์กฐ์ ํ ์คํธ๋ฅผ ์์ฑํ ์ ์์
- ๊ณ์ธต์ ๊ตฌ์กฐ ์์ด ๊ฐ๊ฒฐํ ํ ์คํธ ์์ฑ ๊ฐ๋ฅ
@WebMvcTest(BoardQueryApi::class)
class BoardQueryApiTest(
@MockitoBean private val boardReadUseCase: BoardReadUseCase,
@MockitoBean private val boardReadByStatusesUseCase: BoardReadByStatusesUseCase,
@MockitoBean private val boardDtoMapper: BoardDtoMapper,
@Autowired private val mvc: MockMvc
) : FreeSpec({
-
beforeSpec {}
- ์ ์ฒด ํ ์คํธ ์คํ๋๊ธฐ ์ ์ ํ ๋ฒ๋ง ์คํ๋๋ ๋ธ๋ก์ผ๋ก ๊ณตํต์ ์ธ ์ค์ ์์ ์ ๊ตฌํ
-
๊ตฌ์กฐ
- ๊ฐ๋ ์ฑ์ ์ํด ๋๊ดํธ[]๋ฅผ ์ด์ฉํ ํ ์คํธ ์ผ์ด์ค๋ช ๊ธฐ๋ฅ ์ ์
- ์ค์ ์ฝ๋(Mock ์ค์ ๋ฑ)๋ฅผ ํ ์คํธ ์คํ ์ฝ๋ ์๋ ๋ฐฐ์นํ์ฌ ๊ฐ๋ ์ฑ ํฅ์
@shin-jingyu
ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ฅผ ์ ์ฉํ๋ฉด์ API์์ ๋๋ฉ์ธ๊ณผ DTO๋ฅผ ๋งคํํ๋ ๊ณผ์ ์ด ์ฒ์์ ํท๊ฐ๋ ธ์ง๋ง, ๊ตฌํ์ ์งํํ๋ฉด์ ์ ์ ๊ตฌ์กฐ๊ฐ ๋ช ํํด์ก์ต๋๋ค. ์ด๋ฒ ๊ฒฝํ์ ํตํด Git๋ ๋ ์ต์ํ๊ฒ ๋ค๋ฃฐ ์ ์๊ฒ ๋์์ต๋๋ค. PR๊ณผ ์ด์ ๊ด๋ฆฌ๋ฅผ ์ง์ ์ฌ์ฉํด๋ณด๋ฉด์ ํ์ ๊ณผ์ ์์ ์ด๋ป๊ฒ ํ์ฉ๋๋์ง ๋ฐฐ์ธ ์ ์์์ต๋๋ค. ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด์ ๊ตฌ์กฐ์ ์ธ ๋ถ๋ถ์ ๋ ๊น์ด ๊ณ ๋ฏผํ ์ ์์๊ณ , ๊ฐ์ด ์์ ํ ๊ฒฝ์ฐ๋ ๋๋ถ์ ๊ฐ๋ ์ฑ์ด ์ข์ ์ฝ๋๋ก ๋ค๋ฌ์ ์ ์์์ต๋๋ค. ๋ํ, HTTP ํ ์คํธ ์ฝ๋๋ฅผ ์ง์ ์์ฑํ๋ฉด์ ํ ์คํธ์ ๋ํ ์ดํด๊ฐ ๋ง์ด ๋์๊ณ , ์ ๋ฐ์ ์ผ๋ก ์ฝ๋์ ๊ตฌ์กฐ์ ํ ์คํธ ์ค๊ณ์ ๋ํด ๋ฐฐ์ธ ์ ์๋ ์ข์ ๊ฒฝํ์ด์์ต๋๋ค.