매주 스프링 부트 핵심 가이드 를 읽으며 이전에 궁금했거나, 새롭게 알게 된 내용들을 정리할 예정이다.
(이번 주는 8장을 읽었다.)
find...By
조회하는 기능을 수행한다. 이외에 query...By, search...By, stream...By(스트림으로 반환) 등의 키워드로 사용 가능하다.
exists...By
특정한 데이터가 존재하는지 확인한다.
count...By
조회를 수행하고 나온 결과의 레코드의 개수를 반환한다.
delete...By, remove...By
삭제를 수행한다.
...First{number}..., Top{number}
조회된 결과의 개수를 제한한다. (LIMIT ...
과 유사한 역할)
is, (is)Not
값의 일치나 불일치를 조건으로 사용한다.
(is)Null, (is)NotNull
값이 null인지 아닌지를 확인한다
(is)True, (is)False
boolean
형태의 값을 확인한다.
And, Or
여러 조건을 묶을 때 사용한다.
(is)GreaterThan, (is)LessThan, (is)Between
숫자나 datetime
을 대상으로 비교하는 데에 사용한다. 경계값을 포함하려면(이상, 이하) 뒤에 Equal
을 추가한다.
(is)StartingWith(==StartsWith), (is)EndingWith(==EndsWith),(is)Containing(==Contains),
(is)Like
컬럼의 값의 일부가 일치하는지 확인한다. SQL에서의 %
와 동일한 역할을 하는데 Like
를 사용할 때에는 파라미터에 %
를 포함하여 전달해야 한다.
OrderBy{column}{Asc(오름차순)/Desc(내림차순)}
위와 같이 사용하면 된다. 여러 개의 컬럼을 기준으로 정렬하려면 먼저 정렬하고 싶은 컬럼과 기준을 순서대로 적어주되, And
와 Or
를 사용하지 않는다.
위의 방법으로도 가능하지만 JPA 라이브러리의 Sort
객체를 활용하여 정렬할 수도 있다. 예시는 다음과 같다.
// 이름이 "Kim" 인 사람을 성적순으로 오름차순 정렬
entityRepository.findByName("Kim", Sort.by(Order.asc("Grade")));
// 이름이 "Kim" 인 사람을 성적순으로 오름차순 정렬 후 나이순으로 내림차순 정렬
entityRepository.findByName("Kim", Sort.by(Order.asc("Grade"), Order.desc("age")));
이래도 길어보인다면 Sort
객체를 변수나 메소드화하여 사용할 수도 있다.
Page<Person> findByName(String name, Pageable pageable);
데이터베이스의 레코드를 개수별로 나눠 페이지를 구분할 수 있다. Page<T>
형태의 객체를 받아야 하며 두번째 파라미터인 Pagable
은 구현체인 PageRequest
를 사용한다. of
메소드는 페이지 번호, 페이지 당 개수, 혹은 정렬에 사용한 Sort
객체를 이용하여 Page
를 생성한다. 이렇게 객체를 생성한 뒤 값을 확인하려면 getContent()
메소드를 사용한다.
메소드의 키워드를 적절히 조합하여 메소드를 구현할 수도 있으나 직접 SQL을 작성하여 레포지토리의 메소드를 구현할 수도 있다.
@Query("SQL 문장")
의 방식으로 구현 가능하며, 파라미터를 바인딩하는 방식으로도 가능하다. 예시는 아래와 같다.
@Query("Select p FROM Person p WHERE p.name = :name")
List<Person> findByNameParam(@Param("name") String name);
그리고 @Query 를 사용하면 엔티티 전체가 아니라 SELECT
를 사용하듯이 원하는 컬럼만 가져올 수도 있다. 그러나 이에 대한 엔티티 타입은 지정되어 있지 않으므로 Object
형태의 객체로 가져와야 한다.
QueryDSL은 정적(static) 타입을 이용해 쿼리를 생성할 수 있도록 해주는 프레임워크이다. 이 역시 Spring Data JPA처럼 코드를 이용하여 쿼리를 생성하므로 자동완성, 가독성 향상 등 다양한 장점을 가질 수 있다.
Spring data JPA와 비슷하게 레포지토리에 빌더(Builder) 형식으로 각 요소들(select, where, from 등) 을 지정해주면 알맞은 결과를 반환해준다. 결과를 받기 위해선 fetch()
메소드를 사용한다.
엔티티의 생성 일자, 변경 일자, 생성자, 변경자 등을 감시(Audit) 하여 자동으로 값을 넣어주는 기능이다.
스프링 부트 어플리케이션에 @EnableJpaAuditing
어노태이션을 위에 달아주면 된다. 이런 요소가 들어가는 공통 엔티티(BaseEntity) 클래스를 생성하고, 각각 @CreatedDate, @LastModifiedDate
을 달아주면 된다. 예시는 다음과 같다.
// 엔티티가 상속받을 경우 자식에게 정보를 전달한다.
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
@CreateDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
}
이렇게 한 BaseEntity
를 상속받는 엔티티는 따로 LocalDateTime.now()
등으로 시간을 정해주지 않아도 자동으로 값이 생성되고 변경된다.