본문 바로가기

Spring/Spring JPA

Spring Boot JPA 간단하게

Spring Boot JPA(Java Persistence API)는 자바 애플리케이션에서 데이터베이스와 객체 간의 매핑을 쉽게 할 수 있도록 도와주는 ORM(Object Relational Mapping) 도구입니다. 주로 Spring Data JPA라는 스프링 모듈을 사용하여 JPA를 더욱 편리하게 활용할 수 있습니다. 여기서 JPA는 인터페이스이며, 구체적인 구현체로는 Hibernate가 많이 사용됩니다.

주요 개념과 기능

1. 엔티티(Entity)

  • 엔티티는 데이터베이스의 테이블과 매핑되는 클래스입니다. JPA에서는 각 클래스가 데이터베이스의 테이블로 매핑되고, 클래스의 필드는 테이블의 컬럼으로 매핑됩니다.
  • 예를 들어, @Entity 어노테이션을 사용하여 특정 클래스를 엔티티로 선언하고, @Id 어노테이션으로 기본 키를 지정합니다.
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;
    // getters and setters
}

 

 

2. 레포지토리(Repository)

  • 레포지토리는 데이터베이스에 접근하는 메서드를 정의하는 인터페이스입니다. Spring Data JPA에서는 인터페이스만 선언해도 CRUD 작업을 위한 메서드를 자동으로 제공해줍니다.
  • JpaRepository 인터페이스를 상속받으면 기본적인 CRUD 기능을 사용할 수 있으며, 커스텀 쿼리도 메서드 이름으로 선언할 수 있습니다.
public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByName(String name);
}

 

 

3. 쿼리 메서드(Query Method)

  • JPA는 메서드 이름으로 쿼리를 자동 생성해주는 기능을 제공합니다. findBy, deleteBy, countBy와 같은 키워드를 사용해 쿼리를 작성할 수 있습니다.
  • 예를 들어, findByName은 이름에 따라 유저를 찾는 쿼리를 자동으로 생성합니다.

4. 트랜잭션(Transaction) 관리

  • JPA는 데이터베이스와의 모든 상호작용을 트랜잭션 단위로 수행합니다. @Transactional 어노테이션을 사용하여 트랜잭션을 적용할 수 있습니다.
@Transactional
public void updateUserEmail(Long id, String email) {
    User user = userRepository.findById(id).orElseThrow();
    user.setEmail(email);
    userRepository.save(user);
}

 

 

5. JPQL(Java Persistence Query Language)

  • JPQL은 엔티티 객체를 대상으로 하는 쿼리 언어입니다. 데이터베이스의 테이블을 직접 다루는 SQL과 달리, JPA는 객체 모델을 기반으로 쿼리를 작성합니다.
@Query("SELECT u FROM User u WHERE u.name = :name")
List<User> findUserByName(@Param("name") String name);

장점

  • 생산성: 데이터베이스와의 상호작용을 위한 기본적인 CRUD 기능을 자동으로 제공해 코드 작성량을 줄입니다.
  • 유연성: 특정 데이터베이스에 종속되지 않으면서도 객체 중심의 데이터 접근이 가능합니다.
  • 유지보수성: 쿼리를 메서드 이름으로 간단히 선언할 수 있어 코드의 가독성과 유지보수성이 높아집니다.

 

'Spring > Spring JPA' 카테고리의 다른 글

[JPA] ENUM 타입  (0) 2024.11.12
[JPA] 엔티티 클래스에서 많이 사용되는 어노테이션  (1) 2024.11.12
[JPA] Paging  (1) 2024.11.12
[JPA] IsEmpty와 IsNotNulLL 의 차이점  (0) 2024.11.11
Query by Example(QBE)  (0) 2024.11.11