API ๊ณ์ธต์์ ์ ๋ฌ ๋ฐ์ ํด๋ผ์ด์ธํธ์ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์ง์ ์ธ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ์ฒ๋ฆฌํ๋ ๊ณ์ธต
Spring์ DI(์์กด์ฑ ์ฃผ์
)๋ฅผ ์ด์ฉํ์ฌ API ๊ณ์ธต๊ณผ ๋น์ฆ๋์ค(์๋น์ค) ๊ณ์ธต์ ์ฐ๋ํ๊ณ ,
API ๊ณ์ธต์์ ์ ๋ฌ๋ฐ์ DTO ๊ฐ์ฒด๋ฅผ ๋น์ฆ๋์ค(์๋น์ค) ๊ณ์ธต์ ๋๋ฉ์ธ Entity ๊ฐ์ฒด๋ก ๋ณํํด์ ์ ํ
โ๏ธ API ๊ณ์ธต๊ณผ ์๋น์ค ๊ณ์ธต์ ์ฐ๋ํ๋ค
โ API ๊ณ์ธต์์ ๊ตฌํํ Controller ํด๋์ค๊ฐ ์๋น์ค ๊ณ์ธต์ Service ํด๋์ค์ ๋ฉ์๋ ํธ์ถ์ ํตํด ์ํธ ์์ฉํ๋ค
โ๏ธ ์๋น์ค ๊ณ์ธต์ ๋๋ถ๋ถ ๋๋ฉ์ธ ๋ชจ๋ธ์ ํฌํจํ๊ณ ์์
๋๋ฉ์ธ ๋ชจ๋ธ์ ๋น์ฝํ ๋๋ฉ์ธ ๋ชจ๋ธ(anemic domain model) / ํ๋ถํ ๋๋ฉ์ธ ๋ชจ๋ธ(rich domain model)๋ก ๊ตฌ๋ถ๋๊ณ ,
์ด๋ DDD(๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ, Domain Driven Design)์ ๊ด๋ จ์ด ๊น์
โ๏ธ ๊ณ์ธต๋ณ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
๐ก DTO ํด๋์ค
- API ๊ณ์ธต์์ ํด๋ผ์ด์ธํธ์ Request Body๋ฅผ ์ ๋ฌ ๋ฐ๊ณ ํด๋ผ์ด์ธํธ์๊ฒ ๋๋๋ ค ์ค ์๋ต ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ์ญํ
- API ๊ณ์ธต์์ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ๋ฐ๊ณ , ์๋ต ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋๊ฒ์ด ์ฃผ ๋ชฉ์
๐ก Entity ํด๋์ค
- ์๋น์ค ๊ณ์ธต์์ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต๊ณผ ์ฐ๋ํ๋ฉด์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ์ญํ ์ ํ๋ ํด๋์ค
- API ๊ณ์ธต์์ ์ ๋ฌ ๋ฐ์ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋น์ค ๊ณ์ธต์์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ๋ฐ๊ณ , ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ ํ์๋ ๊ฒฐ๊ณผ ๊ฐ์ ๋ค์ API ๊ณ์ธต์ผ๋ก ๋ฆฌํดํด์ฃผ๋ ์ญํ
โ
( DTO ํด๋์ค์ ๋น์ฆ๋์ค ํด๋์ค ํฉ์น ์ญํ )
โ๏ธ ์ฝ๋ ๊ตฌ์ฑ์ ๋จ์ํ
โ๏ธ REST API ์คํ์ ๋ ๋ฆฝ์ฑ ํ๋ณด
โ MapStruct ์ฌ์ฉ์ ์ํด์๋ ์๋ ์์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ build.gradle ํ์ผ์ dependencies ์ ์ถ๊ฐํด์ผํจ
implementation 'org.mapstruct:mapstruct:1.4.2.Final' annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ Mapper ์ธํฐํ์ด์ค์๋ @Mapper
์ ๋ํ
์ด์
์ ๋ถ์ฌ MapStruct์ ๋งคํผ ์ธํฐํ์ด์ค๋ก ์ ์๋ ์ ์๋๋ก ํด์ผํ๊ณ ,
@Mapper
์ ๋ํ
์ด์
์ ์ ํธ๋ฆฌ๋ทฐํธ๋ก componentModel = "spring"
์ ์ง์ ํด์ฃผ์ด Spring Bean์ผ๋ก ๋ฑ๋ก๋ ์ ์๋๋ก ํด์ผํจ
์ด MapStruct๊ฐ ์๋์ผ๋ก ์์ฑํด์ค Mapper ์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์ค๋ ์๋์ผ๋ก ์์ฑ๋์ด build > classes
๋๋ ํ ๋ฆฌ ๋ด์ Mapper ์ธํฐํ์ด์ค๊ฐ ์์นํ ํจํค์ง ์์ MapperImpl
์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์์ฑ๋จ
projects ํด๋์ be-template-service-layer ์ฐธ๊ณ !
์ค์ต ๊ณผ์ ๋ git ํด๋์ be-homework-mpaaer ์ฐธ๊ณ !
์ด์ ์ค์ต์์ DTO ํด๋์ค๋ฅผ ์ฌ์ฉํด ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ ๋ค์ ์์ฒญ์ ์ ๋ฌํ๋๋ก Controller์ DTO ํด๋์ค๋ฅผ ์ฃผ์ ํ์ฌ ์ฌ์ฉํ์๋๋ฐ,
์ด๋ OOP์ SRP(๋จ์ผ ์ฑ
์ ์์น, Single Responsibility Principle)์ ๋ฐ๋ผ,
๊ฐ ํด๋์ค๋ ํ๋์ ์ญํ ๋ง ํ๋๋ก ๋ง๋๋ ๊ฒ์ด ์ข์
์ด์ ์ค์ต์์ ํ๋ ๋ฐฉ๋ฒ์ DTO ํด๋์ค๊ฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ๋ ๋ฐ๊ณ , ์ด๋ฅผ Entity ๊ฐ์ฒด๋ก ๋ณํ ์์ผ์ฃผ๋ ์ญํ ๊น์ง ํจ
( API ๊ณ์ธต๊ณผ Service ๊ณ์ธต ๊ตฌ๋ถ ๋ถ๊ฐ )
๋ฐ๋ผ์, ์ด ๋ ๊ณ์ธต์ ๋ถ๋ฆฌ์ํค๊ธฐ ์ํด
โ Service ํด๋์ค์ Entity ํด๋์ค๋ฅผ ๋ฐ๋ก ๋ง๋ ํ, MapStruct๋ฅผ ์ด์ฉํ Mapper ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ DTO - Entity ๊ฐ์ ๋ณ๊ฒฝ์ ํด์ค ๊ฒ์
๊ทธ๋ฆฌ๊ณ Controller ๊ฐ์ฒด์ ์์ฑ์์ ํ๋ผ๋ฏธํฐ๋ก Service ๊ฐ์ฒด, Entity ๊ฐ์ฒด ๋ชจ๋ ์์กด์ฑ ์ฃผ์
(DI)์ ํตํด
๊ฐ ํธ๋ค๋ฌ ๋ฉ์๋์ Body์ DTO ํด๋์ค๋ฅผ Mapper๋ก ์ด์ฉํด Entity ๊ฐ์ฒด๋ก ๋ฐ๊พธ๊ณ , ์ด๋ฅผ Service ํด๋์ค์ ์ฐ๋ํ ํ,
๋ฆฌํด๊ฐ์ผ๋ก ๊ทธ ๋ฐ๊ฟ ์ฐ๋ํ Entity ๊ฐ์ฒด์ ์ํ์ฝ๋๋ฅผ ๊ฐ์ด ๋ฃ์ด์ฃผ๋ฉด ๋จ
โ๏ธ Lombok ๊ธฐ๋ฅ๋ค (์ ๋ํ ์ด์ )
[์ฐธ๊ณ ] https://projectlombok.org/features/
Spring Boot initialize๋ก ํ๋ก์ ํธ ์์ฑ์, @SpringBootAplication
์ ๋ํ
์ด์
์ด ๋ถ์ Application.class ๊ฐ ์์ฑ๋จ
์ด @SpringBootAplication
์ ๋ํ
์ด์
์ด ๋ถ์ผ๋ฉด, ๊ทธ ํด๋์ค๋ถํฐ ๊ทธ ํ์๋ฅผ ๋ชจ๋ ๊ฒ์ฌํ๋ฉฐ @Component
๋ค ์ฐพ์์ ๊ฒ์ฌํจ
๊ทธ๋์ Application.class ๋ ์ต์์ ํด๋(ํ๋ก์ ํธ ์ด๋ฆ ํด๋) ๋ฐ๋ก ๋ฐ์๋ง ๋ค์ด๊ฐ๊ณ ์ด๋ ํ ํด๋์๋ ๋ค์ด๊ฐ๋ฉด ์๋จ !
โ ํ ํด๋์ ๋ค์ด๊ฐ๊ฒ ๋๋ฉด ๊ทธ ํด๋์ ํ์ ํ์ผ๋ค๋ง ๊ฒ์ฌํ๊ฒ ๋์ด์ ๋ชจ๋ ํด๋์ค๋ค์ด Application.class ๋ก๋ถํฐ ํ์๋ก ์ญ ์์๋์ด์ผ ํจ
์ด์ ๋ณด๋จ ๋ญ๊ฐ ์์ด ๋ง์์ ธ์ ๊ตฌ์กฐ๊ฐ ํ๋์ ์กํ์ง ์์์ง๋ง ๊ทธ๋๋ ํ๋ฉด์ ์ ์ ๊นจ๋ฌ์๊ฐ๊ณ ์ด๊ฒ ์ ์ด๋ ๊ฒ ์ด์ด์ ธ ์๋์ง ์ดํด๊ฐ ๋๋ ๊ฒ ์ฌ๋ฐ๋ค !
ํ์คํ ๊ฐ๋
๋ง ๊ณต๋ถํ๋ ๊ฒ ๋ณด๋ค ์ฝ๋๋ฅผ ์ง์ ์จ๋ณด๋ฉด์ ํ๋๊น ๊ธฐ์ต๋ ์ดํด๋ ๋ ์ ๋๋ ๊ฒ ๊ฐ๋ค ใ
ใ