민스씨의 일취일장

TIssue | Spring Data JPA | 실전! 스프링 데이터 JPA | Class Projection 안되는 이슈 본문

Programming Language & Framework/JAVA & Spring

TIssue | Spring Data JPA | 실전! 스프링 데이터 JPA | Class Projection 안되는 이슈

읻민스 2024. 12. 5. 18:33
반응형

Spring Data JPA의 클래스 프로젝션 적용 중 오류가 발생하는 이슈에 대한 내용이다.

class projection 썸네일 이미지이다.
class projection

상황

인프런 <실전! 스프링 데이터 JPA - 김영한> 강의의 '섹션 8 - Projections' 실숩 중 class projection(클래스 프로젝션)이 적용되지 않는 이슈가 발생했다. 클래스를 작성후 Repository에 메서드를 등록하기만 하면, 실행 중 에러가 발생했다.

작성했던 코드

작성했던 코드는 아래와 같다.

public class UsernameOnlyDto {

    private final String username;

    public UsernameOnlyDto(String username){
        this.username = username;
    }

    public String getUsername(){
        return username;
    }
}

발생 오류 모습

에러가 발생한 모습이다.에러가 발생한 모습이다.
발생 오류 모습

문제지점 파악의 어려움

원인 파악이 어려웠던 점은, 에러의 모습이 Database가 연결되지 않았을 때와 비슷한 형식이였기 때문에 원인이 클래스에 있을 것이라고 생각지 못했다.

해결책

일단 해결책을 먼저 살펴 보려고 한다. 클래스를 아래와 같이 수정했더니 정상 작동했다.

public record UsernameOnlyDto(String username){}

코드를 이렇게 수정한 이유는 공식문서에 이와 같이 작성하라고 명시돼 있기 때문이다.

Class-based Projections (DTOs)
Class-based Projections (DTOs) [출처 : https://docs.spring.io/spring-data/jpa/reference/repositories/projections.html]

원인

정확한 원인을 파악하기 위해서 역 추적을 해봤지만, 정확한 원인은 찾지 못했다. 

record

record 형식은 자동으로 getter, toString(), equals(), hashCode() 메서드를 생성해준다.

getter, toString(), equals(), hashcode()

그럼 해당 메서드들을 작성하지 않아서 문제가 발생한 것인가? 그렇지 않았다. 해당 메서드들을 작성해 테스트 해봐도 똑같은 오류가 발생했다.

Spring Boot 3

그럼 스프링 부트3에서는 class projection을 위해 record 형식의 dto만을 사용해야 하는가? 그것도 아니라고 한다. 

결론

정확한 원인은 찾지 못했다. 혹시 댓글로 원인을 아는 분은 알려주시면 정말 감사하겠습니다.🙇🏻‍♂️

 

 

728x90
반응형