본문 바로가기
Study

[Spring Boot] DB관련 어노테이션 (3) - Spring Data JPA, JPQL

by jisayDeveloper 2023. 10. 26.
728x90
반응형
SMALL

지난 포스팅에 이어서 Spring Data  JPA, JPQL 어노테이션을 알아보겠습니다.

https://jisaydeveloper.tistory.com/39

 

[Spring Boot] DB관련 어노테이션 (2) - 연관 관계

지난 포스팅에 이어서 이번엔 연관 관계 어노테이션을 알아보겠습니다. https://jisaydeveloper.tistory.com/38 [Spring Boot] DB관련 어노테이션 (1) - 엔티티 스프링 부트에서 데이터 베이스와 상호 작용하기

jisaydeveloper.tistory.com

 

Spring Data JPA, JPQL

  • @Repository : 스프링 데이터 JPA에서 사용되며, 데이터 액세스 계층의 구성 요소를 나타냅니다. 
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;
    private String email;

}

@Repository
public interface UserRepository extends CrudRepository<User, Long> {
    User findByUsername(String username);
}

※ @Repository는 JpaRepository를 상속받아 사용하면 사용할 필요가 없는데 그 이유는 Spring Data JPA가 JpaRepository 인터페이스를 스캔하여 빈으로 자동 등록하기 떄문입니다.

public interface UserRepository extends JpaRepository<User, Long> {}

 

  • @Query : JPQL 쿼리를 정의한 메서드를 생성합니다.
  • @Param : 메서드의 매개 변수와 JPQL 쿼리 파라미터를 연결합니다.
public interface UserRepository extends JpaRepository<User, Long> {
    @Query("SELECT u FROM User u WHERE u.username = :username")
    User findByUsername(@Param("username") String username);
}

 

  • @NamedQuery : 이름을 가진 JPQL 쿼리를 정의할 때 사용합니다.
    메서드에 직접 JPQL 쿼리를 작성하는 대신 이름을 사용하여 참조할 수 있습니다.
@NamedQuery(name = "User.findByUsername", query = "SELECT u FROM User u WHERE u.username = :username")
User findByUsername(@Param("username") String username);
  • @NamedQueries : 여러 개의 @NamedQuery 어노테이션을 그룹화하고, 한 번에 여러 개의 JPQL 쿼리를 정의할 때 사용합니다.
@Entity
@NamedQueries({
    @NamedQuery(name = "User.findByUsername", query = "SELECT u FROM User u WHERE u.username = :username"),
    @NamedQuery(name = "User.findAllActive", query = "SELECT u FROM User u WHERE u.active = true"),
})
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;
    
    private String active;
}

 

  • @EntityGraph :연관관계가 있는 엔티티를 조회할 경우 지연 로딩으로 설정되어 있으면 연관관계에서 종속된 엔티티는 쿼리 실행 시 select 되지 않고 proxy 객체를 만들어 엔티티가 적용시킵니다.
    그 후 해당 proxy 객체를 호출할 때마다 그때 그때 select 쿼리가 실행됩니다.
public interface UserRepository extends JpaRepository<User, Long> {
    @EntityGraph(value = "userWithRoles", type = EntityGraph.EntityGraphType.FETCH)
    User findByUsername(String username);
}

@EntityGraph는 추후 더 자세한 내용으로 포스팅 하겠습니다.

  • @CreatedDate & @LastModifiedDate : 엔티티의 생성일과 마지막 수정일을 자동으로 관리합니다.
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    private Long id;

    private String username;

    @CreatedDate
    private Date createdDate;

    @LastModifiedDate
    private Date lastModifiedDate;
}
728x90
반응형
LIST