JPA(Java Persistence API)란?
JPA(Java Persistence API)는 자바 애플리케이션에서 관계형 데이터베이스를 쉽게 다룰 수 있도록 도와주는 ORM(Object Relational Mapping) 기술입니다. 개발자가 SQL을 직접 작성하지 않고도 객체를 통해 데이터베이스를 조작할 수 있도록 해줍니다. Hibernate, EclipseLink와 같은 구현체가 있으며, Spring Boot에서는 주로 Hibernate를 기본 JPA 구현체로 사용합니다.
@Entity 클래스: 데이터베이스 테이블과 1:1 매핑되는 클래스
@Entity
는 JPA에서 엔티티 클래스를 선언할 때 사용하는 어노테이션으로, 해당 클래스가 데이터베이스의 테이블과 매핑됨을 나타냅니다.
예제:
import jakarta.persistence.*;
@Entity
@Table(name = "users") // 테이블 명 지정 가능
public class User {
@Id // 기본 키 설정
@GeneratedValue(strategy = GenerationType.IDENTITY) // 자동 증가
private Long id;
@Column(nullable = false, length = 100)
private String name;
@Column(unique = true)
private String email;
}
위 코드에서 @Entity
를 통해 User
클래스가 users
테이블과 매핑됩니다. @Id
는 기본 키, @Column
은 필드에 대한 제약 조건을 설정하는 데 사용됩니다.
application.yml: 데이터 소스 및 JPA 설정
Spring Boot에서 데이터베이스 연결 및 JPA 설정을 위해 application.yml
파일을 사용합니다.
예제:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: secret
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update # 애플리케이션 실행 시 테이블 자동 업데이트
show-sql: true # 실행되는 SQL 출력
properties:
hibernate:
format_sql: true # SQL을 보기 좋게 포맷
위 설정은 MySQL 데이터베이스에 연결하고, Hibernate를 통해 JPA를 설정하는 방법을 보여줍니다.
레포지토리 인터페이스: JpaRepository를 상속받은 인터페이스
JPA에서 데이터베이스 조작을 쉽게 하기 위해 JpaRepository
를 활용할 수 있습니다.
예제:
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email); // 이메일로 사용자 검색
}
이렇게 JpaRepository<User, Long>
을 상속받으면 기본적인 CRUD 메서드(findAll, save, delete 등)를 자동으로 제공받을 수 있습니다.
JPA 일대다 관계 설정
JPA에서 엔티티 간의 관계를 설정할 때 @OneToMany
를 사용하여 일대다 관계를 정의할 수 있습니다.
예제:
@Entity
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "team", cascade = CascadeType.ALL)
private List<User> users = new ArrayList<>();
}
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "team_id") // 외래 키 설정
private Team team;
}
위 코드에서 Team
엔티티는 여러 User
엔티티를 가질 수 있으며, User
엔티티는 하나의 Team
에 속합니다.
JPA 문법 종류
JPA에서는 다양한 문법을 지원하며, 주로 사용되는 기능들은 다음과 같습니다.
1. JPQL (Java Persistence Query Language)
JPQL은 SQL과 유사하지만, 엔티티 객체를 대상으로 쿼리를 작성하는 방법입니다.
@Query("SELECT u FROM User u WHERE u.name = :name")
List<User> findByName(@Param("name") String name);
2. Native Query (SQL 직접 사용)
JPA에서도 SQL을 직접 실행할 수 있습니다.
@Query(value = "SELECT * FROM users WHERE email = ?1", nativeQuery = true)
User findByEmailNative(String email);
3. EntityManager 사용
JPA의 핵심 객체인 EntityManager
를 활용하여 데이터베이스 조작이 가능합니다.
@PersistenceContext
private EntityManager entityManager;
public User findUser(Long id) {
return entityManager.find(User.class, id);
}
마무리
JPA는 객체와 데이터베이스 간의 매핑을 쉽게 할 수 있도록 도와주는 강력한 기술입니다. @Entity
클래스를 활용하여 테이블을 정의하고, application.yml
에서 설정을 관리하며, JpaRepository
를 통해 데이터를 쉽게 조작할 수 있습니다. 또한, 일대다 관계 설정과 다양한 JPA 문법을 활용하여 보다 효율적인 데이터 처리를 할 수 있습니다.
JPA를 잘 활용하면 SQL 작성 부담을 줄이고 유지보수성을 높일 수 있으므로, 프로젝트에서 적극적으로 활용해보세요!
'개발 부트캠프 > 백엔드' 카테고리의 다른 글
[Spring] Stream (0) | 2025.02.15 |
---|---|
[Spring] DTO(Data Transfer Object) (0) | 2025.02.15 |
[Spring] 서버가 클라이언트한테 데이터를 전달 하는 방법 (0) | 2025.02.13 |
[Spring] 서버가 클라이언트로부터 데이터를 전달 받는 방법 (0) | 2025.02.10 |
[Spring] @Controller와 @RestController의 차이 (0) | 2025.02.10 |