ํ์ฌ๊น์ง entity -> dto, dto -> entity, dto -> dto ๋งคํ์์
์ ์์ฑ์๋ ๋น๋๋ฅผ ์ด์ฉํด์ ์์
์ ํด์๋ค. ์ฌ์ค๋๋ก ๋งํ๋ฉด ๊ณ์ธต(layer)์ ๋ฐ๋ฅธ dto๋ฅผ ๋ฐ๋ก ๋์ง ์๊ณ entity๋ฅผ
๊ทธ๋๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ค. ์ด๋์๋ถํฐ ์๋ชป๋์ด์จ ๊ฒ์ธ์ง๋ ๋ชฐ๋ผ๋ ๋ชจ๋ ๊ณ์ธต์์ entity๋ฅผ ์ง์ ์ฐธ์กฐํ์ง ์๋๋ก ํ๋ ๊ฒ์ด ๋ชฉํ์๋ค.
๊ทธ๋ ๊ฒ ์ ๋ง์ entity์ ๊ฐ ๊ณ์ธต๋ง๋ค ์ฌ์ฉํ๋ dto๋ฅผ ๋ฐ๋ก ๋๊ณ ๋งคํ์์
์ ์งํํ๋ ค๊ณ ํ๋ค. ๋ฌธ๋ 1~2๋
์ฐจ ๋, ๋๊ตฐ๊ฐ๊ฐ ์ฌ์ฉํ๋ Model Mapper๊ฐ ์๊ฐ๋ฌ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ์ ๋ฌด์ฌ์ฝ
์ฝ์๋ ๋ธ๋ก๊ทธ ๊ธ์ด ๊ธฐ์ต๋ฌ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ธ๋ก๊ทธ ์ฝ๋ฉํธ ์ค Map Struct๋ฅผ ๋ฐ๊ฒฌํ๋ค.
์ฌ๋ฌ ๋ธ๋ก๊ทธ์์ ๋ณด๋ฉด ์ธ๊ธฐ๋, ์ฑ๋ฅ์ ๋ํ ๊ธ์ด ์ ์ง ์๋ค. ๋ช ๊ฐ๋ง ์ฝ์ด ๋ณด์๋ ์ถฉ๋ถํ Map Struct๊ฐ ์ข์ ์ ํ์ง๋ผ๊ณ ๋๋์ ์๋ค. ๊ฐ๋จํ ์ค์ ์ผ๋ก Spring Framework์์ ์ฌ์ฉํ๋๋ก bean์ผ๋ก ์ค์บ๋ํ ์ ์์ด ์ข์๋ค. ๋ํ ๋กฌ๋ณต(lombok)์ฒ๋ผ ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๊ณ ์ปดํ์ผ ์์ ์ ์์ฑ๋ ์ฝ๋๋ฅผ ํ์ธํ ์ ์๋ค๋ ์ ์ด๋ค.
๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด componentModel๋ฅผ '
springโ์ผ๋ก ์ง์ ํ๋ฉด โ@Autowiredโ๋ฅผ ๋ฃ์ด์ ๋ง๋ค์ด ์ค๋ค.
Gradle ์ค์ (build.gradle)
// To use Map Struct and Lombok together,
// Refer to this: https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-lombok
implementation 'org.projectlombok:lombok'
implementation 'org.mapstruct:mapstruct:1.4.2.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
annotationProcessor 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0'
All arguments constructor(ctor)๋ฅผ ์ ๊ทผ ์ ํ์ ๋์ด ์ธ๋ถ์์ ์ ๊ทผํ์ง ๋ชปํ๊ฒ ๋ง์๋ค. ๊ทธ๋ฆฌ๊ณ builder๋ฅผ ํตํด ์์ฑํ ์ ์๋๋ก ์ ๊ทผ ์ ํ์ ํ์ง ์์๋ค. Mapper์ ๊ตฌํ์ฒด ์ญ์๋
builder๋ฅผ ์ด์ฉํ์ฌ ์ฝ๋๊ฐ ์์ฑ๋๋ค.
๊ตฌํ์ฒด๋ MapperNameImpl์ผ๋ก ์์ฑ๋๋ค.
MSE-001-basic-usage
Person entity๋ฅผ PersonResponse dto๋ก ๋งคํํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ถ๊ฐ์ ์ผ๋ก ์คํ๋ง์ ๋น์ผ๋ก ๋ฑ๋กํ๊ธฐ ์ํด @Mapper annotation์ componentModel์ ๊ฐ์ โspringโ์ผ๋ก
์ฃผ์๋ค. ์ด ์ค์ ์ ๊ตฌํ์ฒด์ @Component annotation์ด ์์ฑํ๋ค.
public class BaseDatetime {
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime lastModifiedAt;
}Entity ๋ง๋ค ๊ณตํต์ผ๋ก ๋ค์ด๊ฐ๋ ๋ ์ง์ ๋ํ ๋ฐ์ดํฐ๋ ๋ฐ๋ก ์ถ์ถํ๊ณ entity ๊ฐ์ฒด๋ ์ด๋ฅผ ์์ํ๊ณ ์๋ค. ๋ถ๋ชจ ๊ฐ์ฒด์ ์๋ ๋ฐ์ดํฐ๋ mapper๊ฐ ์๋์ ์ผ๋ก ์ ๋งคํํด์ค๋ค.
MSE-002-inheritance-usage
ํ ๊ฐ์ฒด๊ฐ ๋ฉค๋ฒ ๋ณ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง ์ํฉ์ด๋ค. ๋ณ๋ค๋ฅธ ์์
์์ด mapper๊ฐ ์๋์ ์ผ๋ก ๋งคํํด์ค๋ค.
MSE-003-composition-usage
๊ทธ๋ฌ๋ ๊ฐ์ฒด์์ ๋ณ์๋ช
์ด ๋ฌ๋ผ์ง ๊ฒฝ์ฐ๋ @Mapping annotation์ ์ด์ฉํด์ source์ target์ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
MSE-003-composition-usage-diff-name
๋ํ, ์ถ๊ฐ์ ์ธ ๋งคํ ๋ก์ง์ด ํ์ํ ๊ฒฝ์ฐ ๋ณ๋์ mapper๋ฅผ ๋์ด์ ๋ก์ง์ ๊ตฌํํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ณ๋๋ก ๊ตฌํํ mapper๋ฅผ ๊ฐ์ง๊ณ ์์ ์ฌ์ฉํ๋ค.
๋ฌธ์ ๋ ํ
์คํธ ์ฝ๋์์ ๋ณ๋์ mapper๋ฅผ Mappers.getMapper()๋ก ๊ฐ์ง๊ณ ์ฌ ์ ์๋ค. ๋ณ๋์ mapper๋ฅผ ์ฌ์ฉํ ๋, ์คํ๋ง ๋น์ผ๋ก ์ฃผ์
ํด์ ์ฌ์ฉํ๊ณ ์๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด ํ
์คํธ ์ฝ๋๋ ์ด์ฒ๋ผ
์คํ๋ง ๋น์ผ๋ก ๊ฐ์ ธ์์ผ ํ๋ค. ๋ฐ๋ผ์ mapper์ ๊ตฌํ์ฒด๋ฅผ ๋น(bean)์ผ๋ก ๊ฐ์ ธ์์ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
MSE-003-composition-usage-another-mapper
How to Get Mapper as Spring Bean
๊ธฐ๋ณธ์ ์ผ๋ก mapper๋ ์๋ฐ 8์ ๋ ์ง ํด๋์ค๋ฅผ ์ง์ํ๋ค. (
์ฐธ๊ณ : link)
๋ฐ๋ก ํ์์ ์ง์ ํ์ง ์์ผ๋ฉด default ํ์์ผ๋ก ๋์ํ๋ค. ๋ง์ฝ ํ์์ ์ง์ ํ๊ณ ์ถ๋ค๋ฉด @Mapping annotation์ dateFormat ๊ฐ์ ์ง์ ํ๋ฉด ๋๋ค.
MSE-004-datetime-format-usage
๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ json value ๋๋ json value๋ฅผ ๊ฐ์ฒด๋ก ๋งคํํ ์ ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก ์์ง๋ ์์ ๋ณด์ฌ์ ์ถ์ ํด๋์ค๋ก ๋งคํํ๋ ๋ก์ง์ ๊ตฌํํ์๋ค.
MSE-005-json-usage
๋ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ก ํ ๊ฐ์ฒด๋ก ๋งคํํ๊ธฐ ์ํด์๋ ๋ณ๋์ ๋ก์ง ์์ด ๋ฐ๋ก ๋งคํํ ์ ์๋ค. ๊ทธ๋ฌ๋ ํ ๊ฐ์ง ์ ์ํ ์ ์ ๋ ๊ฐ์ฒด ์์ ๋์ผํ ์ด๋ฆ์ ๋ณ์๋ source์ target์ ์ง์ ํด์ฃผ์ด์ผ๋ง ๋งคํํ ์
์๋ค.
MSE-006-objects-to-a-object
๋ ๊ฐ์ฒด์ ๊ฐ๊ฐ์ ๋ณ์๋ ํ ๊ฐ์ฒด๋ก ๋งคํํ ๋, ๋ณ๋์ ๋ก์ง ๊ตฌํ์ด ํ์์๋ค. ๊ทธ๋ฌ๋ ๋ ๊ฐ์ ๋ณ์๋ฅผ ํ๋์ ๋ณ์๋ก ๋งคํํ ๋์๋ ๋ณ๋์ ๋ก์ง ๊ตฌํ์ด ํ์ํ๋ค.
MSE-007-fields-to-a-field
์์ ๋งํ๋ฏ์ด entity์ ๋ ์ง ๊ด๋ จ ๋ฐ์ดํฐ๋ ๋ฐ๋ก ๊ด๋ฆฌํ๋ค. ๋ค์์ entity ๊ฐ์ฒด์์ ๋์ผํ ํ์์ผ๋ก ๋ ์ง๋ฅผ ๋งคํํด์ฃผ๊ธฐ ์ํด ํ๋๋ก ํต์ผํ๋๋ก ํ๋ค. ํต์ผํ๊ธฐ ์ํด ๋ ์ง ๊ด๋ จํด์ ๋งคํ์ ํ ์ ์๋๋ก ๊ธฐ๋ณธ
๋งคํผ๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ ๊ฐ๊ฐ์ ๋งคํผ์์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค.
๊ทธ๋ฌ๋ ํ ๊ฐ์ง ์ ์ํ ์ ์ ๋ค์์ ๊ฐ์ฒด๋ฅผ ํ ๊ฐ์ฒด๋ก ๋งคํํ ๋, createdAt์ฒ๋ผ ๋์ผํ ์ด๋ฆ์ ๋ณ์๋ ์๋์ผ๋ก ๋งคํํ ์ ์๊ธฐ ๋๋ฌธ์ source์ target์ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
MSE-008-common-fields-usage