지난 글에서 이어서 사용 예시를 더 알아보자. 지난 글은 여기서 볼 수 있다.
한 객체가 멤버 변수로 다른 객체를 가진 상황이다. 이때도 별다른 작업없이 mapper가 자동적으로 매핑해준다. 그러나 객체의의 변수명이 달라진 경우는 @Mapping
annotation을 이용해서 source
와 target
을 지정해주어야 한다. 그리고 추가적인 매핑 로직이 필요한 경우 별도의 mapper를 두어서 로직을 구현할 수 있다. 한 mapper에서 별도로 구현한 다른 mapper를 가지고 와서 사용한다. 문제는 테스트 코드에서 별도의 mapper를 Mappers.getMapper()
로 가지고 올 수 없다. 별도의 mapper를 사용할 때, 스프링 빈으로 주입해서 사용하고 있다는 점을 고려하면 테스트 코드도 이처럼 스프링 빈으로 가져와야 한다. 따라서 mapper의 구현체 를 빈(bean)으로 가져와서 테스트 코드를 작성할 수 있다.
기본적으로 mapper는 자바 8의 날짜 클래스를 지원한다. (참고: link) 따로 형식을 지정하지 않으면 default 형식으로 동작한다. 만약 형식을 지정하고 싶다면 @Mapping annotation의 dateFormat
값을 지정하면 된다.
객체 데이터를 json value 또는 json value를 객체로 매핑할 수 있다. 기본적으로 제공하는 방법이 따로 있지는 않아 보여서 추상 클래스로 매핑하는 로직을 구현하였다.
두 객체의 데이터로 한 객체로 매핑하기 위해서는 별도의 로직 없이 바로 매핑할 수 있다. 그러나 한 가지 유의할 점은 두 객체 안의 동일한 이름의 변수는 source
와 target
을 지정해주어야만 매핑할 수 있다.
두 객체의 각각의 변수는 한 객체로 매핑할 때, 별도의 로직 구현이 필요없다. 그러나 두 개의 변수를 하나의 변수로 매핑할 때에는 별도의 로직 구현이 필요하다.
앞서 말했듯이 entity의 날짜 관련 데이터는 따로 관리한다. 다수의 entity 객체에서 동일한 형식으로 날짜를 매핑해주기 위해 하나로 통일하도록 한다. 통일하기 위해 날짜 관련해서 매핑을 할 수 있도록 기본 매퍼를 만들고 이를 각각의 매퍼에서 사용할 수 있도록 한다. 그러나 한 가지 유의할 점은 다수의 객체를 한 객체로 매핑할 때, createdAt
처럼 동일한 이름의 변수는 자동으로 매핑할 수 없기 때문에 source
와 target
을 지정해주어야 한다.
계층 간의 데이터 전달을 할 때, 단순하지만 귀찮은 함수를 계속 만들어내고 있었다. 이 부분을 Map Struct로 더 간결하게 풀어낼 수 있고 특히 스프링 프레임워크까지 지원하고 있어 사용하기 편하다. 한번 설정만 해놓는다면 데이터 매핑은 지루한 코드 작성없이 할 수 있지 않을까.