Mapstruct (Feat. Gradle)
์๋ฐ ์ง์์์ ์ค๋ธ์ ํธ ๊ฐ ๋ณํ์ ์ํด์ ์ฌ์ฉํ ์ ์๋ ์ค๋ธ์ ํธ ๋งคํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ModelMapper์ MapStruct๊ฐ ์๋ค. ํ์ฌ ์์คํ ์์๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ModelMapper๋ก๋ ์ถฉ๋ถํ๊ธฐ ๋๋ฌธ์ MapStruct๋ฅผ ๊ตณ์ด ๋์ ํ์ฌ ์ฌ์ฉํ์ง๋ ์์๋ค. ์ค๋ธ์ ํธ ๋ณํ์ด ๋ฐ๋ณต์ ์ผ๋ก ๋ง์ด ์ด๋ฃจ์ด์ง๋ ์ผ์ด์ค๊ฐ ์์๋ ๋ฆฌํ๋ ์ ์ผ๋ก ์ธํ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด์ ์ง์ ์ ์ผ๋ก ์ค๋ธ์ ํธ ๋ณํ์ ์ํํ๋๋ก ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ๋น๋ ๊ณผ์ ์์ ๋งคํผ์ ๋ํ ์ธํฐํ์ด์ค ๊ตฌํ์ฒด๋ฅผ ๋ง๋๋ Mapstruct๊ฐ ์๊ตฌ๋๊ธฐ ๋๋ฌธ์ ๋์ ํ๊ฒ ๋๋ค. ํ์ฌ ์์คํ ์์ ํน์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๊ณผ์ ์์ ๊ฝค๋ ๋ง์ ๋ณํ์ด ์ด๋ฃจ์ด์ง ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ (์๋ฅผ ๋ค์ด ์ฝ 2~300๋ช ์ ๊ฐ๋ณ ํต๊ณ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ์กฐํ) ๋์ ์ ๊ณ ๋ คํ๊ฒ ๋์๋ค.
Mapstruct์ ๋ํด ์์๋ณด๊ธฐ
- Object Mapping ์ด๋๊น์ง ํด๋ดค๋?
- ํธ๋ฆฌํ ๊ฐ์ฒด ๊ฐ ๋งคํ์ ์ํ MapStruct ์ ์ฉ๊ธฐ (feat. SENS)
- Performance of Java Mapping Frameworks
โป MapStruct์ ๋ํ ์์ ๋ github.com/mapstruct/mapsturct-examples์์ ํ์ธํ ์ ์๋ค.
๊ฐ๋ณ ๋ํ๋์ ์ถ๊ฐ
Mapstruct๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ธ์์ ์ดํด๋ณด๋ฉด ๋ํ๋์ ์์๋ฅผ ์ค์ํ๊ฒ ์ ์ํด์ผํ๋ค๊ณ ๋์ด์์ง๋ง ์๊ด์์ด์ง์ง ์ค๋๋์๋ค. ์๋ฌดํผ Lombok ๊ทธ๋๋ค ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๊ณ ์์ ๊ฒฝ์ฐ์๋ lombok-mapstruct-binding
๋ฅผ ์๋์ ๊ฐ์ด ๋์ดํ๋ฉด ๋๋ค.
build.gradleplugins { 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.gradleplugins { 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์ ์ํด ๋ง๋ค์ด์ง๋ ์ธํฐํ์ด์ค ๊ตฌํ์ฒด๋ฅผ ์ ์ธํ๋ ๊ฒ์ด ํ์ํ๋ค.
.gitignoresrc/main/generated/