๐ ์ค๋ ๋ฐฐ์ด ๋ด์ฉ!
- Cotroller ํด๋์ค์ Service ํด๋์ค์ ์ฐ๋ with DI
- MapStruct๋ฅผ ์ด์ฉํ Mapper
โ๏ธ ์๋น์ค ๊ณ์ธต
- API ๊ณ์ธต์์ ์ ๋ฌ ๋ฐ์ ํด๋ผ์ด์ธํธ์ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์ง์ ์ธ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ์ฒ๋ฆฌํ๋ ๊ณ์ธต
- Spring์ DI(์์กด์ฑ ์ฃผ์
)๋ฅผ ์ด์ฉํ์ฌ API ๊ณ์ธต๊ณผ ๋น์ฆ๋์ค(์๋น์ค) ๊ณ์ธต์ ์ฐ๋ํ๊ณ ,
API ๊ณ์ธต์์ ์ ๋ฌ๋ฐ์ DTO ๊ฐ์ฒด๋ฅผ ๋น์ฆ๋์ค(์๋น์ค) ๊ณ์ธต์ ๋๋ฉ์ธ Entity ๊ฐ์ฒด๋ก ๋ณํํด์ ์ ํ
โ๏ธ API ๊ณ์ธต๊ณผ ์๋น์ค ๊ณ์ธต์ ์ฐ๋ํ๋ค
โ API ๊ณ์ธต์์ ๊ตฌํํ Controller ํด๋์ค๊ฐ ์๋น์ค ๊ณ์ธต์ Service ํด๋์ค์ ๋ฉ์๋ ํธ์ถ์ ํตํด ์ํธ ์์ฉํ๋ค
โ๏ธ ์๋น์ค ๊ณ์ธต์ ๋๋ถ๋ถ ๋๋ฉ์ธ ๋ชจ๋ธ์ ํฌํจํ๊ณ ์์
๋๋ฉ์ธ ๋ชจ๋ธ์ ๋น์ฝํ ๋๋ฉ์ธ ๋ชจ๋ธ(anemic domain model) / ํ๋ถํ ๋๋ฉ์ธ ๋ชจ๋ธ(rich domain model)๋ก ๊ตฌ๋ถ๋๊ณ ,
์ด๋ DDD(๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ, Domain Driven Design)์ ๊ด๋ จ์ด ๊น์
DTO ํด๋์ค์ ์ํฐํฐ ํด๋์ค์ ์ญํ ๋ถ๋ฆฌ๊ฐ ํ์ํ ์ด์
โ๏ธ ๊ณ์ธต๋ณ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
- ๊ธฐ๋ฅ ๋ณ๋ก ์๋ก ์ฌ์ฉ๋๋ ๊ณ์ธต์ด ๋ค๋ฆ
โ OOP์ ๋จ์ผ ์ฑ ์์ ์์น (SRP)์ ๋ฐ๋ผ ๋ ์ข์ OOP ํ๊ธฐ ์ํด
๐ก DTO ํด๋์ค
- API ๊ณ์ธต์์ ํด๋ผ์ด์ธํธ์ Request Body๋ฅผ ์ ๋ฌ ๋ฐ๊ณ ํด๋ผ์ด์ธํธ์๊ฒ ๋๋๋ ค ์ค ์๋ต ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ์ญํ
- API ๊ณ์ธต์์ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ๋ฐ๊ณ , ์๋ต ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋๊ฒ์ด ์ฃผ ๋ชฉ์
๐ก Entity ํด๋์ค
- ์๋น์ค ๊ณ์ธต์์ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต๊ณผ ์ฐ๋ํ๋ฉด์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ์ญํ ์ ํ๋ ํด๋์ค
- API ๊ณ์ธต์์ ์ ๋ฌ ๋ฐ์ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋น์ค ๊ณ์ธต์์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ๋ฐ๊ณ ,
๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ ํ์๋ ๊ฒฐ๊ณผ ๊ฐ์ ๋ค์ API ๊ณ์ธต์ผ๋ก ๋ฆฌํดํด์ฃผ๋ ์ญํ
( DTO ํด๋์ค์ ๋น์ฆ๋์ค ํด๋์ค ํฉ์น ์ญํ )
โ๏ธ ์ฝ๋ ๊ตฌ์ฑ์ ๋จ์ํ
- DTO ํด๋์ค์์ ์ฌ์ฉํ๋ ์ ํจ์ฑ ๊ฒ์ฌ ์ ๋ํ ์ด์ ์ด Entity ํด๋์ค์์ ์ฌ์ฉ์ด ๋๋ค๋ฉด JPA์์ ์ฌ์ฉํ๋ ์ ๋ํ ์ด์ ๊ณผ ๋ค์์ธ ์ํ๊ฐ ๋์ด ์ ์ง๋ณด์ํ๊ธฐ ์๋นํ ์ด๋ ค์ด ์ฝ๋๊ฐ ๋ ๊ฒ
โ๏ธ REST API ์คํ์ ๋
๋ฆฝ์ฑ ํ๋ณด
- Entity ํด๋์ค๋ฅผ ์๋ต์ผ๋ก ์ ๋ฌํ๊ฒ ๋๋ฉด ์์น์๋ ๋ฐ์ดํฐ๊น์ง ์ ๋ฌ๋ ์ ์์ Ex. password
โ DTO ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์๋ต์ผ๋ก ์ ๋ฌํด ์ํ๋ ์ ๋ณด๋ง ์ ๊ณต ๊ฐ๋ฅ
โ๏ธ Mapper
- DTO ํด๋์ค์ฒ๋ผ Java Bean ๊ท์ฝ์ ์งํค๋ ๊ฐ์ฒด๋ค ๊ฐ์ ๋ณํ ๊ธฐ๋ฅ์ ์ ๊ณต
( ์ญํ ๊ตฌ๋ถ์ ์ํด DTO โ Entity / Entity โ DTO ์ ๋ณํ์ ์ด๋ฃจ์ด์ค )
โ๏ธ MapStruct
- ๋งคํผ(Mapper) ๊ตฌํ ํด๋์ค๋ฅผ ์๋์ผ๋ก ์์ฑํด์ฃผ๋ ์ฝ๋ ์๋ ์์ฑ๊ธฐ
โ 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
์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์์ฑ๋จ
๐ ๋น์ฆ๋์ค ๊ณ์ธต๊ณผ API ๊ณ์ธต ์ฐ๋ ์ค์ต
- 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 ๋ก๋ถํฐ ํ์๋ก ์ญ ์์๋์ด์ผ ํจ
๐ ๋๋์
์ด์ ๋ณด๋จ ๋ญ๊ฐ ์์ด ๋ง์์ ธ์ ๊ตฌ์กฐ๊ฐ ํ๋์ ์กํ์ง ์์์ง๋ง ๊ทธ๋๋ ํ๋ฉด์ ์ ์ ๊นจ๋ฌ์๊ฐ๊ณ ์ด๊ฒ ์ ์ด๋ ๊ฒ ์ด์ด์ ธ ์๋์ง ์ดํด๊ฐ ๋๋ ๊ฒ ์ฌ๋ฐ๋ค !
ํ์คํ ๊ฐ๋
๋ง ๊ณต๋ถํ๋ ๊ฒ ๋ณด๋ค ์ฝ๋๋ฅผ ์ง์ ์จ๋ณด๋ฉด์ ํ๋๊น ๊ธฐ์ต๋ ์ดํด๋ ๋ ์ ๋๋ ๊ฒ ๊ฐ๋ค ใ
ใ
( ๋ณธ ๊ฒ์๋ฌผ์ 2022/10/25์ ์์ฑํ ๊ธ์ ์ฎ๊ธด ๊ธ์ ๋๋ค. ์๋ฌธ์ ์๊ธฐ์ ์์! )
'โข CodeStates BootCamp > Section 3' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ [Section3] 6. [ Spring MVC ] Spring Data JDBC 2 (1) | 2023.04.10 |
---|---|
๐ [Section3] 5. [ Spring MVC ] Spring Data JDBC 1 (0) | 2023.04.10 |
๐ [Section3] 4. [ Spring MVC ] ์์ธ ์ฒ๋ฆฌ (0) | 2023.04.10 |
๐ [Section3] 2. [ Spring MVC ] API ๊ณ์ธต 2 (0) | 2023.04.10 |
๐ [Section3] 1. [ Spring MVC ] API ๊ณ์ธต 1 (0) | 2023.04.09 |