티스토리 뷰

발단

Spring Data JPA 학습을 하는 도중 메서드명으로 쿼리를 생성하는 부분에 궁금증이 생김.

필요한 Entitiy를 선언하고 메소드를 작성하던 중 동일한 키워드가 하나의 메소드에 여러 개가 선언되었는데 해당 경우에도 정상적으로 원하는 쿼리가 동작을 하는 것을 확인하였음.

내가 작성하였을 때만 어색하게 보일 뿐이지 내부적으로 어떠한 원리로 메소드명에서 정보를 추출하여 쿼리를 생성하는지 찾아봄.


학습환경 (발단의 원인)

회원정보인 Usr Entity에 권한을 뜻하는 Role Entity가 존재(OneToOne Join).

Entitiy 정보는 아래와 같음.

 

1
2
3
4
5
6
7
8
9
10
11
//회원정보 엔티티
public class UsrEntity {
    @OneToOne
    @JoinColumn(name = "usr_id", referencedColumnName = "usr_id"
    private RoleUsrEntity role;
      
    public void setRole(RoleUsrEntity role) {
        this.role = role;
    }
    ... 생략
}
cs

 

1
2
3
4
5
6
7
8
9
10
11

 

//권한엔티티
public class RoleUsrEntity {
    
    @Id
    @Column(nullable = false)
    private String usrId;
    
    @Column(nullable = false)
    private String roleCd;
    
}
cs

 

권한코드를 기준으로 회원 목록을 검색하려는 메소드를 작성하였을 때 아래와 같이 RoleRoleCd이라고 작성하였음. 

 

1
List<UsrEntity> findByRoleRoleCd(String roleCd);
cs

확인결과

JPA 프로젝트에서 repository에 메소드명을 정의하는 경우 spring data jpa 명세에 따라서 메소드명과 Entity를 이용하여 쿼리를 추출하게 됨.

JPA 관련 다양한 구현체가 존재하나 학습 중 이용하였던 JpaRepository를 기준으로 확인.

 

아래는 메소드명에서 쿼리 속성을 찾아가는 과정을 붉은색으로 표시한 것임.

순서 메서드
(확인중인 엔티티 속성)
설명
1 findByRoleRoleCd 가장 처음 확인하는 경우 By 이후의 전체 단어를 엔티티에 속성에 존재하는지 확인
2 findByRoleRoleCd 1번에서 속성을 찾지 못한 경우 오른쪽 끝에서부터 CamelCase 기준으로 왼쪽으로 이동하여 해당 단어가 엔티티에 속성에 존재하는지 확인
3 findByRoleRoleCd 2번에서 속성을 찾지 못한 경우 2번 단어 에서 다시 CamelCase 기준으로 왼쪽으로 이동하여 해당 단어가 엔티티 속성에 존재하는지 확인

즉, 제일 처음 확인하는 경우에는 By 이후 전체 단어를 Entity 속성에서 확인하고 확인에 실패한 경우에는 가장 오른쪽부터 CamelCase 기준으로 나누어 엔티티 속성에 존재하는지 확인하며 다시 확인에 실패하는 경우에는 해당 위치에서 CamelCase 기준 왼쪽으로 이동하며 엔티티 속성에 존재하는지 확인하는 과정이 존재하는 것임.

확인해보니 이러한 경우는 Traversal(순회) 속성이라고 함.

 

이러한 모호성을 구분할 수 있는 방법

수동으로 순회 지점을 (_) 밑줄을 이용하여 선언할 수 있음.

1
List<UsrEntity> findByRole_RoleCd(String roleCd);
cs
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함