1. Spring Data JPA 시작하기
Spring Data JPA는 Spring 프레임워크와 JPA를 결합하여 데이터베이스 작업을 더 쉽게 만들어줍니다. 기존에 JPA만 사용할 때는 EntityManager를 직접 다루거나, 복잡한 쿼리를 작성하는 것이 필요했습니다. 하지만 Spring Data JPA는 이러한 과정을 추상화하여, 개발자는 필요한 인터페이스만 정의하면 자동으로 CRUD(생성, 조회, 수정, 삭제) 및 복잡한 쿼리를 처리할 수 있습니다. Spring Data JPA는 특히 간단한 방식으로 쿼리 메소드를 생성할 수 있다는 점에서 강력한 도구입니다.
2. 핵심 개념 (Core Concepts)
JPA Entity
JPA 엔티티는 자바 객체와 데이터베이스 테이블을 매핑하는 클래스를 의미합니다. 이를 통해 객체지향적인 방식으로 데이터베이스를 다룰 수 있습니다. 각 엔티티 클래스는 데이터베이스의 테이블을 나타내며, 엔티티의 필드는 테이블의 컬럼과 매핑됩니다. 예를 들어, 다음과 같은 Post 엔티티는 posts라는 테이블에 대응될 수 있습니다.
@Entity
@Table(name = "posts")
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String content;
// Getters, Setters, etc.
}
• @Entity: 해당 클래스가 JPA 엔티티임을 나타냅니다.
• @Table(name = "posts"): 테이블 이름을 지정할 수 있습니다.
• @Id: 기본 키(Primary Key) 필드를 나타냅니다.
• @GeneratedValue: 자동으로 ID 값을 생성하는 방법을 설정합니다.
Repository
Spring Data JPA에서 리포지토리는 데이터 접근 로직을 캡슐화한 계층입니다. 리포지토리는 데이터베이스에 대한 CRUD 작업을 제공합니다. 일반적으로 리포지토리는 인터페이스로 정의되며, Spring Data JPA는 이 인터페이스를 기반으로 구현체를 자동으로 생성해줍니다. 이로써 개발자는 CRUD 작업에 필요한 코드를 직접 작성할 필요가 없습니다.
public interface PostRepository extends JpaRepository<Post, Long> {
}
• JpaRepository: Spring Data JPA에서 제공하는 기본 인터페이스로, 대부분의 CRUD 작업과 페이징, 정렬을 포함한 메소드를 제공합니다. 여기서 PostRepository는 Post 엔티티를 처리하며, ID 타입은 Long입니다.
EntityManager
Spring Data JPA에서는 EntityManager를 직접 사용할 필요가 없지만, JPA의 핵심 개념 중 하나입니다. EntityManager는 엔티티의 생명 주기를 관리하고, 데이터베이스에 대해 엔티티를 저장하거나 조회하는 역할을 합니다. 엔티티가 데이터베이스에서 어떻게 저장되고 불러오는지 관리하는데, Spring Data JPA는 이를 추상화하여 JpaRepository와 같은 리포지토리 인터페이스를 통해 쉽게 사용할 수 있게 합니다.
3. 리포지토리 인터페이스 정의 (Defining Repository Interfaces)
Spring Data JPA의 핵심 기능 중 하나는 간단한 리포지토리 인터페이스 정의만으로 데이터베이스 작업을 자동으로 처리할 수 있다는 것입니다. 이는 리포지토리 인터페이스에 CRUD 메소드를 정의할 필요 없이, JpaRepository나 CrudRepository와 같은 기본 인터페이스를 상속받음으로써 이루어집니다.
public interface PostRepository extends JpaRepository<Post, Long> {
List<Post> findByTitle(String title);
}
이 예제에서 PostRepository는 JpaRepository를 상속받아 Post 엔티티에 대한 CRUD 작업을 자동으로 제공합니다. 추가로, findByTitle 메소드는 title 필드를 기준으로 Post 엔티티를 검색하는 기능을 제공합니다.
4. 설정 (Configuration)
Spring Boot를 사용하면 기본적으로 spring-boot-starter-data-jpa 의존성을 추가하는 것만으로 Spring Data JPA가 자동으로 설정됩니다. 하지만 Spring Boot 없이 사용하려면, 직접 설정 파일을 작성해야 합니다.
Spring Boot 설정
Spring Boot에서 JPA 설정은 application.properties 또는 application.yml 파일에서 이루어집니다. 다음은 일반적인 설정 예시입니다.
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=1234
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
• spring.datasource.url: MySQL 데이터베이스 연결 URL입니다.
• spring.datasource.username: 데이터베이스 사용자 이름입니다.
• spring.datasource.password: 데이터베이스 비밀번호입니다.
• spring.jpa.hibernate.ddl-auto: Hibernate에서 스키마 자동 생성 전략을 지정합니다. update는 기존 스키마를 유지하면서 새 엔티티를 추가하거나 변경합니다.
• spring.jpa.show-sql: 콘솔에 실행된 SQL 쿼리를 출력하도록 설정합니다.
Spring Boot 없이 사용할 경우, Java 설정 클래스나 XML 설정을 통해 DataSource 및 JPA 관련 설정을 명시해야 합니다.
5. 엔티티 저장 (Persisting Entities)
Spring Data JPA에서는 save() 메소드를 사용해 엔티티를 데이터베이스에 저장합니다. 이 메소드는 새 엔티티를 데이터베이스에 삽입할 때는 INSERT, 이미 존재하는 엔티티는 UPDATE를 수행합니다. 예를 들어, 게시글을 저장하는 로직은 다음과 같습니다.
Post post = new Post("제목", "내용");
postRepository.save(post);
• save(): 엔티티를 저장하거나 업데이트하는 메소드입니다. 새 엔티티인 경우 INSERT, 기존 엔티티인 경우 UPDATE를 수행합니다.
• postRepository.save(post): 리포지토리를 통해 Post 엔티티를 데이터베이스에 저장하는 코드입니다.
Spring Data JPA는 save() 메소드 이외에도 saveAll(), findAll(), delete(), deleteById() 등 다양한 CRUD 관련 메소드를 제공합니다.
6. 쿼리 메소드 정의 (Defining Query Methods)
Spring Data JPA의 큰 장점 중 하나는 쿼리 메소드를 자동으로 생성할 수 있다는 것입니다. 쿼리 메소드는 메소드 이름을 기반으로 자동으로 SQL 쿼리를 생성하며, 복잡한 쿼리도 메소드 이름만으로 처리할 수 있습니다.
쿼리 메소드 작성 규칙
• 메소드 이름은 findBy, countBy, deleteBy와 같은 키워드를 사용해 시작합니다.
• 메소드 이름의 나머지 부분은 엔티티의 필드 이름을 사용합니다.
• 쿼리 조건을 추가하고 싶다면, And, Or 같은 키워드를 사용할 수 있습니다.
예시:
List<Post> findByTitle(String title);
List<Post> findByTitleAndContent(String title, String content);
long countByAuthor(String author);
boolean existsByTitle(String title);
void deleteByTitle(String title);
• findByTitle: title 필드를 기준으로 게시글을 검색합니다.
• findByTitleAndContent: title과 content 필드를 모두 만족하는 게시글을 검색합니다.
• countByAuthor: 특정 작성자의 게시글 수를 셉니다.
• existsByTitle: 특정 제목의 게시글이 존재하는지 확인합니다.
• deleteByTitle: 특정 제목을 가진 게시글을 삭제합니다.
복잡한 쿼리
복잡한 조건을 쿼리 메소드로 처리할 수 있습니다. 예를 들어, Containing, Like, OrderBy 같은 키워드를 사용하여 더 정교한 검색을 할 수 있습니다.
List<Post> findByTitleContaining(String keyword);
List<Post> findByTitleLike(String pattern);
List<Post> findByAuthorOrderByCreationDateDesc(String author);
findByTitleContaining: 제목에 특정 키워드를 포함한 게시글을 검색합니다.
• findByTitleLike: 제목이 특정 패턴과 일치하는 게시글을 검색합니다. (%를 사용해 와일드카드 검색을 할 수 있습니다)
• findByAuthorOrderByCreationDateDesc: 작성자를 기준으로 게시글을 내림차순으로 정렬합니다.
7. JPA 쿼리 메소드 (JPA Query Methods)
쿼리 메소드는 이름을 기반으로 하여 기본적인 데이터베이스 조회 기능을 제공합니다. Spring Data JPA는 자동으로 메소드 이름을 분석하여 적절한 JPQL(객체 지향 쿼리 언어)을 생성해줍니다.
요약
Spring Data JPA는 데이터베이스 작업을 매우 간단하게 만들어주는 강력한 도구입니다. 리포지토리 인터페이스를 정의하고, 쿼리 메소드를 이용하면 복잡한 데이터 작업도 메소드 이름만으로 해결할 수 있습니다. 핵심 개념으로는 JPA 엔티티와 리포지토리, EntityManager가 있으며, Spring Boot를 사용하면 최소한의 설정만으로도 쉽게 Spring Data JPA를 사용할 수 있습니다. Spring Data JPA의 save(), findBy 등의 메소드는 복잡한 데이터 작업을 간편하게 처리할 수 있게 해줍니다. 특히, 메소드 이름을 기반으로 자동으로 생성되는 쿼리 메소드는 데이터 검색을 매우 직관적이고 간단하게 만들어줍니다.
이처럼 Spring Data JPA는 개발자가 데이터베이스와의 상호작용을 더욱 효율적이고 쉽게 할 수 있도록 해주며, 복잡한 쿼리도 메소드 이름만으로 해결할 수 있는 장점이 있습니다.
'Spring Boot' 카테고리의 다른 글
Thymeleaf (3) | 2024.10.31 |
---|---|
HikariCP (1) | 2024.10.22 |
spring.factories (2) | 2024.10.21 |
@Import (0) | 2024.10.21 |
Spring Boot의 Auto-Configuration (2) | 2024.10.21 |