[스프링 부트 핵심 가이드] 정리 4주차

AmeriKano·2023년 6월 10일
0

책 링크

매주 스프링 부트 핵심 가이드 를 읽으며 이전에 궁금했거나, 새롭게 알게 된 내용들을 정리할 예정이다.
(이번 주는 8장을 읽었다.)


JPA 쿼리 메서드(상세)

쿼리의 주제 키워드

  • 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(내림차순)}

위와 같이 사용하면 된다. 여러 개의 컬럼을 기준으로 정렬하려면 먼저 정렬하고 싶은 컬럼과 기준을 순서대로 적어주되, AndOr 를 사용하지 않는다.

위의 방법으로도 가능하지만 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() 메소드를 사용한다.

@Query 어노태이션

메소드의 키워드를 적절히 조합하여 메소드를 구현할 수도 있으나 직접 SQL을 작성하여 레포지토리의 메소드를 구현할 수도 있다.

@Query("SQL 문장") 의 방식으로 구현 가능하며, 파라미터를 바인딩하는 방식으로도 가능하다. 예시는 아래와 같다.

@Query("Select p FROM Person p WHERE p.name = :name")
List<Person> findByNameParam(@Param("name") String name);

그리고 @Query 를 사용하면 엔티티 전체가 아니라 SELECT 를 사용하듯이 원하는 컬럼만 가져올 수도 있다. 그러나 이에 대한 엔티티 타입은 지정되어 있지 않으므로 Object 형태의 객체로 가져와야 한다.

QueryDSL

QueryDSL은 정적(static) 타입을 이용해 쿼리를 생성할 수 있도록 해주는 프레임워크이다. 이 역시 Spring Data JPA처럼 코드를 이용하여 쿼리를 생성하므로 자동완성, 가독성 향상 등 다양한 장점을 가질 수 있다.

Spring data JPA와 비슷하게 레포지토리에 빌더(Builder) 형식으로 각 요소들(select, where, from 등) 을 지정해주면 알맞은 결과를 반환해준다. 결과를 받기 위해선 fetch() 메소드를 사용한다.

Jpa Auditing

엔티티의 생성 일자, 변경 일자, 생성자, 변경자 등을 감시(Audit) 하여 자동으로 값을 넣어주는 기능이다.

스프링 부트 어플리케이션에 @EnableJpaAuditing 어노태이션을 위에 달아주면 된다. 이런 요소가 들어가는 공통 엔티티(BaseEntity) 클래스를 생성하고, 각각 @CreatedDate, @LastModifiedDate 을 달아주면 된다. 예시는 다음과 같다.

// 엔티티가 상속받을 경우 자식에게 정보를 전달한다.
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
	
    @CreateDate
    private LocalDateTime createdAt;
    
    @LastModifiedDate
    private LocalDateTime updatedAt;
}

이렇게 한 BaseEntity 를 상속받는 엔티티는 따로 LocalDateTime.now() 등으로 시간을 정해주지 않아도 자동으로 값이 생성되고 변경된다.

profile
똑똑한 사람이 되게 해주세요

0개의 댓글