• MapStruct 란

    Spring 개발 시 Controller, Service, Repository 레이어 별로 통신에 사용하는 객체 타입간 형변환을 위한 라이브러리

  • 사용하는 이유

    각 레이어별로 서로 다른 데이터타입 (dto ↔ entity) 를 쓰는 이유는 entity 의 경우 DB 테이블과 1:1 로 대응 되는 객체이고 dto 의 경우 데이터 교환시에 이용되는 객체 이기 때문에 서로 근본적인 용도가 다르다. dto 는 사용자가 필요한 컬럼만 생성하거나 DB 에 존재하지 않는 필드도 생성하여 사용

    entity 는 내부적으로 EntityManager 가 관리 하고 실질적으로 DB 에 영향을 주는 객체 이기 때문에 함부로 값을 변경한다거나 객체를 생성해서는 안됨

    Untitled

    전세계적으로 가장 많이 쓰는 object mapping 라이브러리

  • dependency

    implementation 'org.mapstruct:mapstruct:1.5.1.Final'
    annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.1.Final'
    // lombok 과 mapstruct 를 동시에 사용하기 위한 바인딩 라이브러리
    implementation 'org.projectlombok:lombok-mapstruct-binding:0.2.0'
    annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0'
    
  • 사용법

    @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
    public interface MemberMapper {
        MemberMapper INSTANCE = Mappers.getMapper(MemberMapper.class);
    
        MemberDTO toDto(Member entity);
    
        Member toEntity(MemberDTO dto);
    }
    

    unmappedTargetPolicy = ReportingPolicy.IGNORE 의 옵션은 dto 와 entity 간 서로 맞지않은 필드 갯수가 있을 경우 런타임시 경고문이 뜨는데 해당 경고문을 무시하겠다는 옵션

    • 사용예시

      Untitled

      • 위와 같이 인터페이스 선언 후 런타임 시 개발자가 생성하는 것이 아닌 아래와 같이 라이브러리가 자동으로 코드를 생성해줌

      Untitled

      Untitled

      저장한 entity 를 dto 로 변환하여 리턴