티스토리 뷰

IT/JAVA 및 Spring

[Spring/JPA] findAll()에서 PK와 일반컬럼 차이점

주인장 진빼이

JPA Query Method를 사용하고 있는데 ORM이 익숙하지 않다보니 자주 실수를 하게된다.

이 글에서는 PK컬럼과 일반컬럼에 대한 JPA 기본 지원 쿼리 메소드의 차이점에 대해 알아본다.

 

들어가기 전, 아래에서 설명하는 케이스는 개발자가 직접 Query Method를 선언하는 것이 아니라

JPA에서 save()와 같이 기본으로 지원하고 있는 함수에 대해서만 말한다.

 

Tag 테이블이 존재한다고 가정해보자, 아래 테이블 데이터에서 ID컬럼은 PK로 지정되어 있다.

[Table-Tag]
[ID(PK), Name]
1, #맛있어요
2, #혼나요
3, #맛있어요
4, #맛있어요

JPA에서는 태그 데이터를 하나 또는 리스트 객체로 findBy(), findAll() 메소드를 사용하여 가져올 수 있다.

쿼리 메소드하고 SQL문을 1:1 맵핑 시켜보자.

 

1. SELECT * FROM tag 이는 tagRepo.findAll() 로 해석한다.

 

2. SELECT * FROM tag where id = 1 이는 tagRepo.findById(1L); 로 해석한다.

 

차이1. PK컬럼을 기반으로 조회하는 경우 findAllById에 대한 매개변수 타입이 Iterable 이다.

 

차이2. 일반컬럼을 기반으로 조회하는 경우 findAllById에 대한 매개변수 타입이 Integer이다.

-> 그 이유는 PK 자체는 단 한개만 존재해야하므로 JPA 쿼리 메소드 자체에서 지원하는 매개변수에 차이가 발생한다.

 

 

예를들어 위 테이블에서 ID가 1,3,4인 태그 데이터를 List<Tag> 로 뽑아내려면

List listItems = tagRepo.findAllByTagName("#맛있어요"); 라고 작성하면 태그 리스트를 얻어올 수 있다.

TagName은 일반컬럼이므로 매개변수를 1개만 요구하며 String 타입이다.

 

반대로

PK 컬럼인 ID를 기반으로 TagList를 얻어오려면

findAllById(1L, 3L, 4L) 라고 작성하면 태그 리스트를 얻어올 수 있다.

PK 컬럼이므로 이미 중복이 없다는 가정하에 여러 매개변수(Interable Type)를 받게된다.

 

 

정리.

Table Data에 조건에 일치하는 데이터 리스트를 가져올 땐, findAll() 로 시작하는 쿼리 메소드를 사용한다.

PK컬럼의 findAll()은 매개변수 1개가 아니라 여러개를 받도록 강제화 되어 있다.

일반컬럼의 findAll()은 태그명과 같이 findAll() 메소드에 매개변수 1개만 사용하여 리스트 데이터를 가져온다.

PK의 findAll()은 일반컬럼의 findAll()과 다르다.

 

간단한 것도 실수하였으니 포스팅을 하여 재발을 방지하자.

쿼리문 짜다가 ORM하니까 적응하는데 시간이 걸릴 것 같다.

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
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
글 보관함