티스토리 뷰

엔티티 리포지토리란?

-엔티티 데이터 접근 로직을 캡슐화하는 패턴으로, 특정 엔터티 타입에 대한 CRUD(Create,Read,Update,Delete)연산을 제공합니다. 이를 이용해서 엔티티와 데이터베이스 사이에서 데이터 접근을 어떻게 할지 지정할 수 있습니다.
엔티티 리포지토리에서 지원하는 연산으로는 기본 CRUD 연산 + 쿼리 메서드 등이 있습니다.

 

 

엔티티 리포지토리 예시
public interface UserRepository extends JpaRepository<User, Long> {
    // 여기에 추가적인 쿼리 메서드를 정의할 수 있습니다.
    List<User> findByLastName(String lastName);
}

 

 

 

기본 CRUD 연산
  • save()
    -엔티티를 저장합니다. 새 엔티티일 경우 생성, 기존 엔티티면 업데이트 됩니다.
  • delete()
    -엔티티를 삭제합니다.

  • findById()
    -주어진 ID를 사용하여 엔티티를 찾습니다.

  • findAll()
    -모든 엔티티를 조회합니다.

  • count()
    -해당 엔티티에 존재하는 튜플들의 개수를 출력합니다.

  • exitstsById()
    -주어진 ID를 사용하여 해당 엔티티가 존재하는지를 찾습니다.

 

 

 

 

쿼리 메서드

-Spring Data JPA 같은 프레임워크에서 제공하는 기능중 하나로, 메서드 이름만으로 데이터베이스 쿼리를 생성하고 실행하는데 사용됩니다. 쿼리 메서드는 항상 기본 규칙으로 시작되어야 합니다.

 

<기본규칙> <속성조건> <조건키워드> <정렬>

EX) findBy Age LessThan OrderByFirstnameAsc

 

  • 기본 규칙
    쿼리 메서드의 시작은 항상 기본규칙으로 되어야 하는데 해당 규칙은 findBy, readBy, getBy, countBy, queryBy, searchBy, streamBy 등으로 시작이 되어야 합니다.
    즉, 해당 쿼리 메서드가 어떤 행동을 해야하는지를 정하는 것 입니다.

  • 속성 조건
    기본 규칙에 따라, 엔티티의 어떤 속성을 기준으로 규칙을 적용할지 정합니다.
    예를 들어, "Age라는 속성을 조건으로 작성시, 엔티티에서 Age라는 속성을 찾아  쿼리 규칙을 적용합니다.
    (AND를 이용해 여러개의 속성 조건을 설정할 수 있습니다.)
  • 조건 키워드
    속성조건을 설정하고 조건키워드를 작성하는데 해당 속성에서 어떤 조건을 적용시켜 쿼리를 찾을 지를 정합니다.
    즉,조건 키워드는 Where절과 유사합니다.
    해당 규칙은 Is, Equals, Not, Like, StartingWith, EndingWith, Containing, LessThan, GreaterThan, Between, IsNull, In 등이 있습니다.
    조건 키워드를사용하면 메서드의 파라미터에 해당 조건 기준을 할당해야합니다.
    (AND나 OR를 사용해서 여러개의 조건 키워드를 설정할 수 있습니다.)

  • 정렬
    OrderBy 키워드를 사용하여 정렬을 지정할 수 있는데, 이를 이용해서 속성조건을 기준으로 오름차순,내림차순 정렬을 할 수 있습니다.(ASC = 오름차순 , DESC = 내림차순)

 

 

 

 

 

쿼리 메서드 기본규칙 종류
기본규칙 키워드 설명
findBy 쿼리 조회
readBy
getBy
queryBy
searchBy
streamBy
existsBy 쿼리 조회 및 존재 여부 반환
countBy count 조회 및 long형식 숫자 반환
deleteBy 쿼리 삭제 및 long 반
removeBy

 

 

 

쿼리 메서드 조건 키워드 종류
키워드 샘플 JPQL
Distinct findDistinctByLastnameAndFirstname select distinct …​ where x.lastname = ?1 and x.firstname = ?2
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is, Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age <= ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull, Null findByAge(Is)Null … where x.age is null
IsNotNull, NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection<Age> ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection<Age> ages) … where x.age not in ?1
TRUE findByActiveTrue() … where x.active = true
FALSE findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstname) = UPPER(?1)

 

 

 

 

커스텀 쿼리

-쿼리 메서드처럼 리포지토리안에 메서드로 구현하는 것입니다. 쿼리 메서드와 유사하지만, 메서드 이름으로 작동하는 쿼리 메서드와 달리 직접 @Query애노테이션을 활용하여 SQL문을 직접 커스텀하여서 쓸 수 있습니다.

@Query("SELECT u FROM User u WHERE u.email = 1")
User findByEmailAddress(String emailAddress);

 

 

 

쿼리 메서드 리턴값
리턴값 종류 설명
Entity 해당 엔티티 타입의 엔티티 객체가 반환됩니다. 
만약 결과가 존재하지 않을 시, null이 반환됩니다.
Optional<Entity> 해당 타입의 엔티티 객체를 포함하는 Optional 객체를 반환합니다.
만약 결과가 없다면 Optional.empty()가 반환됩니다.
List<Entity> 해당 타입의 엔티티 객체 List가 반환됩니다.
Set<Entity> 해당 타입의 엔티티 객체 Set집합이 반환됩니다.
Page<Entity> 페이지네이션 정보와 함게 해당 타입의 엔티티 객체 리스트가 포함된 Page객체가 반환됩니다.
Slice<Entity> 다음 페이지의 유무와 함꼐 해당 타입의 엔티티 객체 리스트가 포함된 Slice 객체가 반환됩니다.
Long 해당 조건에 맞는 쿼리의 결과 수를 반환할 때 사용됩니다.
Boolean 해당 조건을 만족하는 데이터의 존재 여부를 확인할 때 사용됩니다.
Stream<Entity> 해당 타입의 엔티티 객체를 포함하는 Stream이 반환됩니다.
사용 후 반드시 close()작업을 해야합니다.

 

 

 

'자바 > JPA' 카테고리의 다른 글

JPA 엔티티  (0) 2023.08.24
JPA란?  (0) 2023.08.17
JPA 엔티티 관리  (0) 2023.07.09
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/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
글 보관함