반응형

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 작성 부담을 줄이고 유지보수성을 높일 수 있으므로, 프로젝트에서 적극적으로 활용해보세요!

 

반응형

+ Recent posts