본문 바로가기
Error

[Spring] 매퍼는 안 되는데, 왜 빌더는 됐을까??

by 2D3 2022. 10. 31.
728x90

 

Contents

     

    에러메시지

    JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning

     

    어제의 문제를 여전히 해결하지 못한 나는.. 포스트맨이 정상적으로 작동하는 프로젝트 팀장님의 코드를 살펴봤다.

    가장 큰 차이점은 나는 mapper를 썼고 팀장님은 builder를 썼다는 점.. 그래서 내가 짠 코드에서 POST기능이 builder를 사용하게 만들었다. 그러자... 갑자기?? 포스트맨에 정상 요청/응답을 받을 수 있었다....ㅎㅎ

    둘의 차이점을 열심히 비교하던 중 같은 문제를 겪던 팀원분이 해결한 것 같다며 연락을 줬다...

     

    ---

     

    해결 방법

    mapper가 안 됐던 이유는 build.gradle 설정 때문이었다...ㅎㅎㅎㅎㅎㅎㅎㅎ

    implementation "org.mapstruct:mapstruct:1.5.3.Final"
    compileOnly "org.projectlombok:lombok:1.18.24"
    annotationProcessor "org.projectlombok:lombok-mapstruct-binding:0.2.0"

    build.gradle 파일에서 dependencies에 위의 의존성을 추가하면, mapper가 사용된 코드들이 정상적으로 작동한다.

     


     

    오류가 발생했던 이유?

     

    1. Mapstruct와 Lombok

    Mapstruct
    객체 간의 매핑에 대해 코드를 자동으로 생성해주는 매핑 라이브러리

    Lombok
    메서드 작성 코드를 줄여주는 자동 코드 생성 라이브러리

     

    2. 같이 사용한다면?

    Lombok의 @Getter, @Setter를 사용할 때, Mapstruct의 @Mapper를 사용하면 자동으로 코드를 생성하는데 제대로 생성되지 않음.

     

    3. Lombok을 사용하면 build.gradle 의존성의 순서가 중요

    gradle은 초기화 - 설정 - 실행의 순서로 동작된다.
    의존성의 순서가 달라진다면 동작 순서가 바뀌기 때문에 생성되는 코드가 달라진다.

    설정 단계에서 dependencies의 순서가 lombok이 먼저라면
    Lombok이 Getter, Setter로 만들어 놓은 것을 Mapper가 사용해서 코드생성하기 때문에 Setter 코드가 바로 생성된다.
    그 다음에 Lombok이 builder를 생성하더라도 이미 Mapper는 코드를 생성했기 때문에 변하지 않는다.

    따라서 dependencies에서 Mapstruct가 Lombok보다 에 있어야 된다.

     

    4. 함께 사용하기 위해 최소 버전

    lombok 1.16.14 이상
    MapStruct 1.2.0 이상

     

    5. lombok-mapstruct-binding을 사용

    Mapstruct 제작자의 홈페이지에서 가져온 글이다. lombok-mapstruct-binding을 의존성해 추가하면 순서와 상관없이 정상적으로 코드가 작동한다.

     

    Reference

     

     

    728x90

    댓글