์ž๋ฐ” ์ง„์˜์—์„œ ์˜ค๋ธŒ์ ํŠธ ๊ฐ„ ๋ณ€ํ™˜์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ ๋งคํ•‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ModelMapper์™€ MapStruct๊ฐ€ ์žˆ๋‹ค. ํ˜„์žฌ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ModelMapper๋กœ๋„ ์ถฉ๋ถ„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— MapStruct๋ฅผ ๊ตณ์ด ๋„์ž…ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์•˜๋‹ค. ์˜ค๋ธŒ์ ํŠธ ๋ณ€ํ™˜์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ๋งŽ์ด ์ด๋ฃจ์–ด์ง€๋Š” ์ผ€์ด์Šค๊ฐ€ ์žˆ์„๋•Œ ๋ฆฌํ”Œ๋ ‰์…˜์œผ๋กœ ์ธํ•œ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ง์ ‘์ ์œผ๋กœ ์˜ค๋ธŒ์ ํŠธ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ๋นŒ๋“œ ๊ณผ์ •์—์„œ ๋งคํผ์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“œ๋Š” Mapstruct๊ฐ€ ์š”๊ตฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋„์ž…ํ•˜๊ฒŒ ๋œ๋‹ค. ํ˜„์žฌ ์‹œ์Šคํ…œ์—์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฝค๋‚˜ ๋งŽ์€ ๋ณ€ํ™˜์ด ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ๋ฐœ์ƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— (์˜ˆ๋ฅผ ๋“ค์–ด ์•ฝ 2~300๋ช…์˜ ๊ฐœ๋ณ„ ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ์กฐํšŒ) ๋„์ž…์„ ๊ณ ๋ คํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

Mapstruct์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ

โ€ป MapStruct์— ๋Œ€ํ•œ ์˜ˆ์ œ๋Š” github.com/mapstruct/mapsturct-examples์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐœ๋ณ„ ๋””ํŽœ๋˜์‹œ ์ถ”๊ฐ€

Mapstruct๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ธ€์—์„œ ์‚ดํŽด๋ณด๋ฉด ๋””ํŽœ๋˜์‹œ ์ˆœ์„œ๋ฅผ ์ค‘์š”ํ•˜๊ฒŒ ์ •์˜ํ•ด์•ผํ•œ๋‹ค๊ณ  ๋˜์–ด์žˆ์ง€๋งŒ ์ƒ๊ด€์—†์–ด์ง„์ง€ ์˜ค๋ž˜๋˜์—ˆ๋‹ค. ์•„๋ฌดํŠผ Lombok ๊ทธ๋ž˜๋“ค ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ๊ฒฝ์šฐ์—๋„ lombok-mapstruct-binding๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์—ดํ•˜๋ฉด ๋œ๋‹ค.

build.gradle
plugins { id 'io.freefair.lombok' version '8.0.1' } ext { mapstructVersion = "1.5.5.Final" lombokVersion = "1.18.26" lombokMapstructBindingVersion = "0.2.0" } dependencies { implementation "org.mapstruct:mapstruct:${mapstructVersion}" annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}", "org.projectlombok:lombok-mapstruct-binding:${lombokMapstructBindingVersion}" }

Gradle ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• (Recommanded)

io.freefair.lombok ๊ทธ๋ž˜๋“ค ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ์œ„์˜ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋””ํŽœ๋˜์‹œ๋ฅผ ๋‚˜์—ดํ•˜๊ธฐ๋ณด๋‹ค๋Š” Gradle Mapstruct Plugin์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋” ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋กฌ๋ณต๊ณผ ๋™์ผํ•˜๊ฒŒ ๊ทธ๋ž˜๋“ค ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐฉ์‹์„ ์ถ”์ฒœํ•œ๋‹ค.

build.gradle
plugins { id 'io.freefair.lombok' version '8.0.1' id 'com.github.akazver.mapstruct' version '1.0.5' }

Plugin will add mapstruct with mapstruct-processor by default
If you are using lombok it will add lombok-mapstruct-binding, if spring - mapstruct-spring-extensions

๊นƒ์—์„œ src/main/generated ๋””๋ ‰ํ† ๋ฆฌ ๋ฌด์‹œํ•˜๊ธฐ (Intellij IDEA)

๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ๋ž˜๋“ค ๋นŒ๋“œ ๊ณผ์ •์—์„œ build/generated/sources/annotationProcessor ๊ฒฝ๋กœ์— ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ  build/classes ๊ฒฝ๋กœ๋กœ ๋ณต์‚ฌ๋œ๋‹ค. ํ•˜์ง€๋งŒ, ์ธํ…”๋ฆฌ์ œ์ด์—์„œ Gradle์ด ์•„๋‹Œ Intellij IDEA๋กœ ์„ ํƒํ•˜์—ฌ ๊ตฌ๋™๋˜๋„๋ก ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” src/main/generated ๊ฒฝ๋กœ์— ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋˜๋ฏ€๋กœ .gitignore ํŒŒ์ผ์— ๋นŒ๋“œ ๊ณผ์ •์—์„œ MapStruct์— ์˜ํ•ด ๋งŒ๋“ค์–ด์ง€๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด๋ฅผ ์ œ์™ธํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค.

.gitignore
src/main/generated/