Map Struct 사용하기 - 2

지난 글에서 이어서 사용 예시를 더 알아보자. 지난 글은 여기서 볼 수 있다.

사용 예시

합성 관계에서 매핑하기(MSE-003-composition-usage, MSE-003-composition-usage-diff-name, MSE-003-composition-usage-another-mapper)

한 객체가 멤버 변수로 다른 객체를 가진 상황이다. 이때도 별다른 작업없이 mapper가 자동적으로 매핑해준다. 그러나 객체의의 변수명이 달라진 경우는 @Mapping  annotation을 이용해서 source와 target을 지정해주어야 한다. 그리고 추가적인 매핑 로직이 필요한 경우 별도의 mapper를 두어서 로직을 구현할 수 있다. 한 mapper에서 별도로 구현한 다른 mapper를 가지고 와서 사용한다. 문제는 테스트 코드에서 별도의 mapper를 Mappers.getMapper()로 가지고 올 수 없다. 별도의 mapper를 사용할 때, 스프링 빈으로 주입해서 사용하고 있다는 점을 고려하면 테스트 코드도 이처럼 스프링 빈으로 가져와야 한다. 따라서 mapper의 구현체를 빈(bean)으로 가져와서 테스트 코드를 작성할 수 있다.

날짜 형식 지정해서 매핑하기(MSE-004-datetime-format-usage)

기본적으로 mapper는 자바 8의 날짜 클래스를 지원한다. (참고: link) 따로 형식을 지정하지 않으면 default 형식으로 동작한다. 만약 형식을 지정하고 싶다면 @Mapping annotation의 dateFormat 값을 지정하면 된다. 

JSON을 사용하여 매핑하기(MSE-005-json-usage)

객체 데이터를 json value 또는 json value를 객체로 매핑할 수 있다. 기본적으로 제공하는 방법이 따로 있지는 않아 보여서 추상 클래스로 매핑하는 로직을 구현하였다.

두 개의 객체를 한 객체로 매핑하기(MSE-006-objects-to-a-object)

두 객체의 데이터로 한 객체로 매핑하기 위해서는 별도의 로직 없이 바로 매핑할 수 있다. 그러나 한 가지 유의할 점은 두 객체 안의 동일한 이름의 변수는 source와 target을 지정해주어야만 매핑할 수 있다.

두 개의 변수를 하나의 변수로 매핑하기(MSE-007-fields-to-a-field)

두 객체의 각각의 변수는 한 객체로 매핑할 때, 별도의 로직 구현이 필요없다. 그러나 두 개의 변수를 하나의 변수로 매핑할 때에는 별도의 로직 구현이 필요하다.

공통으로 사용하는 변수에 대한 매퍼를 추출하여 매핑하기(MSE-008-common-fields-usage)

앞서 말했듯이 entity의 날짜 관련 데이터는 따로 관리한다. 다수의 entity 객체에서 동일한 형식으로 날짜를 매핑해주기 위해 하나로 통일하도록 한다. 통일하기 위해 날짜 관련해서 매핑을 할 수 있도록 기본 매퍼를 만들고 이를 각각의 매퍼에서 사용할 수 있도록 한다. 그러나 한 가지 유의할 점은 다수의 객체를 한 객체로 매핑할 때, createdAt처럼 동일한 이름의 변수는 자동으로 매핑할 수 없기 때문에 source와 target을 지정해주어야 한다.

마치며

계층 간의 데이터 전달을 할 때, 단순하지만 귀찮은 함수를 계속 만들어내고 있었다. 이 부분을 Map Struct로 더 간결하게 풀어낼 수 있고 특히 스프링 프레임워크까지 지원하고 있어 사용하기 편하다. 한번 설정만 해놓는다면 데이터 매핑은 지루한 코드 작성없이 할 수 있지 않을까.