ModelMapper로 DTO ->엔티티 객체 매핑
웹 프로젝트를 만들면서 엔티티 객체를 DTO 객체를 변환시켜주는 작업을 하는데에 간단하게 해결할 수 있는 기술이 ‘ModelMapper’를 사용하는 것이다.
Reply
ReplyDTO
Board
ModelMapper 매핑 전략
Test케이스에서 엔티티 객체를 바로 생성해서 db에 등록하면 모든 데이터에 제대로 값이 들어가는데, DTO를 거쳐서 db에 넣으려고 하면 db의 bno값이 null이 되었다.
원인은 위에 Reply 객체의 board 엔티티의 id인 bno가 필요하여 ReplyDTO 객체의 bno로 꺼내올려고 하였으나, ModelMapper는 연관관계가 존재하지 않거나 모호하다면 원활히 매핑이 이루어지지 않기에 위의 Reply 객체의 board 필드값과 ReplyDTO 객체의 bno가 일치하지 않아 null값이 들어간 것이다.
ModelMapper 설정으로 매핑 전략을 바꿀 수 있으며 총 3가지가 있다.
STANDAND
기본 매칭 전략으로, source와 destination의 속성들을 지능적으로 매치시킬 수 있다
- 토큰은 어떤 순서로든 일치될 수 있다
- 모든 destination 속성 이름 토큰이 일치해야 한다
- 모든 source 속성 이름은 일치하는 토큰이 하나 이상 있어야 한다.
- 정확하지 않은 반면에 대부분의 상황에서 이상적이다.
LOOSE
느슨한 매칭 전략으로, 계층 구조의 마지막 destination 속성만 일치하도록 요구한다
- 토큰은 어떤 순서로든 일치될 수 있다
- 마지막 destination 속성 이름에는 모든 토큰이 일치해야 한다
- 마지막 source 속성 이름은 일치하는 토큰이 하나 이상 있어야 한다
- 더 높은 수준의 모호한 일치가 탐지될 수 있지만 반대로 모호하기에 원하는 필드값들이 아닌 다른 필드값들이 매핑 될 수 있는 가능성이 았다.
STRICT
엄격한 일치 전략으로, source 속성을 destination 속성과 엄격하게 일치시킬 수 있다. 따라서 불일치나 모호성이 발생하지 않도록 완벽한 일치 정확도를 얻을 수 있다. 하지만 각 속성 이름들이 서로 정확하게 일치해야한다.
- 토큰들은 엄격한 순서로 일치해야 한다
- 모든 destination 속성 이름 토큰이 일치해야 한다
- 모든 source 속성 이름에는 모든 토큰이 일치해야 한다
- 위의 LOOSE와 반대로 모호성, 예상치 않은 매핑이 발생하지 않도록 하고 싶을 때 사용하것이 이상적이다. 단점은 내가 겪은 것처럼 일부 필드값들이 일치하는 상태로 남을 수 있다.
그래서 나는 기존의 매핑 전략을 STRICT에서 LOOSE로 바꿔서 다시 ModelMapper로 변환하여 테스트를 한 결과 값이 제대로 잘 들어갔다.
PropertyMap
하지만 LOOSE 전략의 단점이 명확했기에 난 저 각 객체의 2개의 필드값만 매핑하고 싶기에 다른 방법이 있지 않을 까 찾아보았는데 PropertyMap를 선언하여 내가 원하는 필드값들을 매핑시켜주는 방법이 있다.
이를 위해서 각 엔티티 객체에 Setter 어노테이션을 추가하였고, 내가 사용할 ModelMapper 객체의 addMappings 함수로 등록해주면서 완전히 해결하였다.