인프런 커뮤니티 질문&답변

Jin님의 프로필 이미지
Jin

작성한 질문수

실전! 스프링 데이터 JPA

Projections

Projection 관련 질문이 있습니다.

해결된 질문

작성

·

98

·

수정됨

0

영한님의 예시인 UsernameOnly에서는 유저명만 가져왔는데, 혹시 조금 더 깊게 들어가서 유저명뿐만 아니라 해당 유저가 속한 팀의 팀명까지 같이 가져올 수 있는 방법이 있을까요?

public interface UsernameAndTeam {
    String getUsername();
    Team getTeam();
}

이렇게 하니 팀 객체까지는 잘 가져오던데, 여기서 팀의 이름만 딱 정해서 가져올 수도 있는지 궁금합니다.

머릿속으론 String getTeamGetName(); 이라는 무슨 괴상한 코드가 떠오르는데.. 이건 제가 봐도 좀 아닌 것 같네요 ㅋㅋㅋㅠㅠ

항상 답변 감사드립니다.

 

++ 혹시 몰라서 String getTeamGetName()으로 테스트를 실행해보니 No property 'getName' found for type 'Team'; 이라고 오류가 떴는데, 이 말은 Team에서 getName을 못 찾았다는 것 같은데 그럼 Team까진 잘 접근이 된 것 같으니 그럼 혹시 getTeamName이라고 하면 되지 않을까? 라는 생각이 들어 그렇게 바꿔 실행해보니 잘 되는 것 같네요..?! 이렇게 하면 되는 게 맞을까요?

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. Jin님

말씀하신 것 처럼 처리하면 됩니다 🙂

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

Jin님의 질문에 관련하여, 스프링 데이터 JPA에서 Projection을 사용해서 멤버와 그가 속한 팀의 이름을 가져오는 방법에 대한 궁금증이 있으신 것 같네요. 이런 경우에는 서로 다른 엔티티에서 정보를 조합하기 위해 Projection 인터페이스에 필요한 메서드를 정의해야 합니다.

“UsernameOnlyDto” 질문에서 비슷한 토픽으로 질의응답이 있었습니다. 해당 답변에서는 DTO를 통해서 특정 사용자의 이름만을 조회하는 방법을 설명하고 있습니다. 적절히 활용하시면, 팀 이름도 비슷한 방식으로 가져올 수 있습니다.

UsernameOnlyDto에 대한 질문 및 답변

public interface UsernameAndTeamName {
    String getUsername();
    String getTeamName();
}

위 코드처럼 UsernameAndTeamName 인터페이스를 정의하고, 팀 이름을 가져오기 위해 메서드를 정의할 때는 getTeamName과 같은 방식으로 명명합니다. 이 때, JPA 엔티티의 내부 필드구조나 메서드를 호출하는 형태로 명명 규칙을 정하면, 스프링 데이터 JPA가 알아서 처리합니다. 하지만 중요한 점은 엔티티 내부 구조와 매핑이 정확해야 한다는 것입니다.

예를 들어, Team 엔티티 내에 name 필드가 있고, Member 엔티티가 Team을 참조하고 있다면, getTeamNameTeam 엔티티의 name 필드 값을 가져오는 역할을 하게 되는 것입니다.

이렇게 Projection을 활용하면, 복잡한 쿼리 결과도 필요한 데이터만 선별하여 가져올 수 있어 성능 개선과 함께 클라이언트에 전송되는 데이터의 양도 줄일 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Jin님의 프로필 이미지
Jin

작성한 질문수

질문하기