JPA 레퍼런스를 보았을 때 findAllBy... findBy...... get... 엄청 많았다.
하지만 이것들만 가지고는 SQL의 where절 조건 걸어 조회하거나 업데이트 하는게 불가능해 보여서 추가로 조사를 진행했다.
메소드의 이름으로 조건을 줄 수 있다고 한다.
예를들면 레퍼런스에
findAllById 라는 항목이 있는데 Id가 고정된것이 아닌 유동적으로 변경이 가능하다.
findAllById를 SQL로 바꿔보면
SELECT * FROM {tableName} where ID;
//만약 ID가 리스트 타입이라면
SELECt * FROM {tableName} where ID in [{ListAttribute1}, {ListAttribute2}, ...];
이런식으로 JPA가 쿼리문으로 작성하는 것 같다.
하지만 나는 ID라는 변수가 아니라 다른 변수를 DB에서 조회하고 싶었다.
이런식으로 UserId와 DeleteRecord 컬럼을 고려하여 함께 조회하고 싶었는데
스프링 서비스 계층에서 메소드 이름만 바꿔서 쓸수가 없었다.
사용하기 위해서는
JpaRepository를 상속받는 인터페이스에 메소드를 정의해주어야 한다.
여기서 한가지 더 의문이 들었던건 서비스 계층에서도 상위 인터페이스가 존재하는데 여기에도 정의해 주어야 하는가? 였다.
내 상식적으로는 둘 다 정의하면 우리 자바형님이 어디꺼를 끌어다가 쓸지 헷갈려 하시거나 런타임 에러가 발생할 것 같았지만 그래도 혹시 몰라서 찾아보았는데 JpaRepository를 상속받은 인터페이스에만 정의해주면 된다고 한다.
이유는 예상대로 자바 컴파일러에게 혼동을 줄 수 있기 때문이었다.
쿼리가 조금이라도 복잡해지면 오히려 불편해질 것 같은 기능이지만 그럼에도 불구하고 메소드 이름으로 조회가 가능하고
CRUD 대부분의 기능을 DB와 직접 상호작용 하지 않고 자바 코드 내에서 가능하다는점이 참 매력적이다.
Entity 클래스만 제대로 구현해 놓으면 타입까지 알아서 맞춰주기도 한다.
JPA 관련해서는 조금 더 숙련되고 다시 정리 하겠다.
'java > Spring' 카테고리의 다른 글
Spring Annotation 컨닝페이퍼 (0) | 2024.10.21 |
---|---|
Spring Bean (2) | 2024.10.21 |
Spring Framework 기본 요소 개념 정리 (6) | 2024.10.21 |