ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [MapStruct] Enum과 Integer 간에 매핑 설정 방법
    자바/mapstruct 2021. 1. 16. 02:22

    이번 시간에는 MapStruct를 이용하여 Mapper 생성 시 Enum과 Integer간에 매핑하는 방법에 대해서 알아보도록 하겠습니다.

     

    우선 다음과 같이 01은 MALE을 뜻하고 02는 FEMAIL을 뜻하는 Enum이 존재합니다.

    클라이언트로부터 성별의 값으로 01, 02의 Integer 값을 수신하므로 그 뜻을 좀더 명확하게 표현하기 위해서 Enum을 생성합니다.

    public enum Gender {
        MALE(01),
        FEMALE(02),
        ;
    
        private Integer value;
        private static Map map = new HashMap();
    
        Gender(Integer value) {
            this.value = value;
        }
    
        static {
            for (Gender gender : Gender.values()) {
                map.put(gender.value, gender);
            }
        }
    
        public static Gender valueOf(Integer gender) {
            return (Gender) map.get(gender);
        }
    
        public Integer getValue() {
            return this.value;
        }
    }
    

     

    해당 Gender를 멤버 변수로 가지는 Session 엔티티를 생성합니다.

    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    @Getter
    @Entity
    public class Session {
        @Id
        private Long id;
    
        private String phone;
        private String name;
        private LocalDate birth;
        private Gender gender;
    
        public SessionInfo(Long id, String phone, String name, LocalDate birth, Gender gender) {
            this.id = id;
            this.phone = phone;
            this.name = name;
            this.birth = birth;
            this.gender = gender;
        }
    }
    

     

    Session 엔티티에 대한 DTO를 생성합니다.

    @Getter
    public class SessionDTO {
    	private Long id;
    	private String phone;
    	private String name;
    	private LocalDate birth;
    	private Integer gender;
    
    	public SessionDTO(Long id, String phone, String name, LocalDate birth, Integer gender) {
    		this.id = id;
    		this.phone = phone;
    		this.name = name;
    		this.birth = birth;
    		this.gender = gender;
    	}
    }

    Session <-> SessionDTO간에 매핑을 지원하는 Mapper를 생성합니다.

    • Gender <-> Integer간에 매핑을 위한 default 메소드를 생성합니다.
    @Mapper
    public interface SessionInfoMapper {
        SessionInfoMapper INSTANCE = Mappers.getMapper(SessionInfoMapper.class);
    
        SessionInfoDTO.Request.Create map(SessionInfo source);
        SessionInfo map(SessionInfoDTO.Request.Create source);
    
        default Gender map(Integer value) {
            return Gender.valueOf(value);
        }
    
        default Integer map(Gender gender) {
            return gender.getValue();
        }
    }
    

     

    이와 같이 구성이 되어 있으면 아래와 같이 테스트를 통해서 정상적으로 매핑되는 것을 확인 할 수 있습니다.

    @SpringBootTest
    public class SessionServiceTest {
    
        @Test
        public void Enum매핑테스트() throws Exception {
    
            SessionInfoDTO sessionInfoDto = new SessionInfoDTO(123l, "01047071628", "장지현", LocalDate.now(), 2);
            SessionInfo sessionInfo = SessionInfoMapper.INSTANCE.map(create);
            Assertions.assertThat(sessionInfo.getGender()).isEqualTo(Gender.FEMALE);
        }
    }

     

    댓글

Designed by Tistory.