JPA(Java Persistence API)

✒️ 2025-06-30 02:25 내용 수정

스프링부트3 자바 백엔드 개발입문 내용 참고 및 정리


Java에서 객체와 DB 데이터를 매핑 시켜주는 ORM 기술을 제공하는 도구


엔티티(Entity)

package com.example.demo.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import lombok.Data;

@Entity // Entity임을 명시하는 Annotation
@Data // Lombok
public class Article {

    @Id // 식별자
    @GeneratedValue
    private Long id;

    @Column // DB에서 열과 대응되는 속성
    private String title;

    @Column
    private String content;
}

엔티티 연관 개념과 특징

1) 엔티티 매니저(Entity Manager)

2. 엔티티 매니저 팩토리(Entity Manager Factory)

3. 영속성 컨텍스트(Persistence Context)

엔티티의 상태

  1. 분리 상태(detached) : 엔티티를 처음 만들거나 detach() 메소드를 사용하면 가지는 상태로, 영속성 컨텍스트가 관리하고 있지 않은 상태이다.

    • 객체는 여전히 존재하나 영속성 컨텍스트가 객체의 상태를 추적하지 않는 상태다.
  2. 관리 상태(managed) : persist() 메소드를 사용하면 가지는 상태로, 영속성 컨텍스트가 관리하는 상태이다.

    • 관리 상태일 때 변경 사항이 생기면 상태를 자동 추적하는 변경 감지가 일어난다.
  3. 비영속 상태(transient) : 영속성 컨텍스트에 등록되지 않은 상태다.

    • 엔티티 매니저가 관리하지 않는 객체이며, 데이터베이스와 연결되어 있지 않다.
  4. 삭제된 상태(removed) : remove() 메소드를 사용하면 가지는 상태로, 엔티티가 영속성 컨텍스트와 DB에서 삭제된다.

    • 삭제 상태의 트랜잭션이 commit되면 데이터베이스에서도 제거된다.

리파지토리(Repository)

interface 설명
Repository 최상위 Repository interface
CrudRepository Entity의 CRUD 기능 제공
ListCrudRepository Entity의 CRUD 기능 제공
PagingAndSortingRepository Entity의 Paging 및 정렬 기능 제공
ListPagingAndSortingRepository Entity의 Paging 및 정렬 기능 제공
JpaRepository Entity의 CRUD, Paging, 정렬, JPA 특화된 기능 제공
import org.springframework.data.jpa.repository.CrudRepository;

public interface CustomRepository extends CrudRepository<CustomClass, ID> {
    // CustomClass 부분엔 관리 대상 엔티티의 클래스 타입을 작성
    // ID 부분엔 관리 대상 엔티티의 대푯값 타입을 작성하며, 
    // 대상 엔티티의 @Id 식별자에 @GeneratedValue로 지정한 값의 타입을 작성한다
    // 추가적인 쿼리 메소드 정의 가능
}

메서드 목록

메서드 설명
findAll() 모든 Entity 조회
findById(Id id) Id로 Entity 조회
save(T entity) Entity를 저장
saveAll(Iterable<T> entities) Entity들을 저장
count() 사용 가능한 Entity 수 반환
existsbyId(Id id) id로 Entity 존재 여부 확인
delete(T entity) Entity를 제거
deleteById(Id id) 지정한 Id를 가진 Entity 제거
deleteAll(Interable<T> entities) Entity들을 모두 제거
// CrudRepository

package org.springframework.data.repository;

import java.util.Optional;

@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
    <S extends T> S save(S entity);

    <S extends T> Iterable<S> saveAll(Iterable<S> entities);

    Optional<T> findById(ID id);

    boolean existsById(ID id);

    Iterable<T> findAll();

    Iterable<T> findAllById(Iterable<ID> ids);

    long count();

    void deleteById(ID id);

    void delete(T entity);

    void deleteAllById(Iterable<? extends ID> ids);

    void deleteAll(Iterable<? extends T> entities);

    void deleteAll();
}

@Query 사용

public interface TestRepository extends JpaRepository<Test, Long> {
	@Query(
	value = "SELECT * FROM test WHERE count > ?",
	nativeQuery = true
	)
	List<Test> findTestGreaterThenCount(int count);
}

Spring JPA Connection 관련 설정

# 애플리케이션 이름
spring.application.name=security  

# port 설정
server.port=9000 

# MySQL 드라이버 설정
spring.datasource.driver-class-name=db_driver_name

# 연결할 DB 주소. 마지막은 db 이름이나 schema 이름을 입력한다.
spring.datasource.url=jdbc:db_type://localhost:3306/databasename  

# DB 사용자 이름 및 비밀번호
spring.datasource.username=username
spring.datasource.password=password

# hibernate ddl 설정 - create면 새로 생성
spring.jpa.hibernate.ddl-auto=create  

# sql을 콘솔에 표시할지 여부
spring.jpa.show-sql=true  

# Hibernate가 DB에 맞게 SQL을 생성하고 최적화(방언 설정)
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.db_type 

# Hibernate가 실행하는 SQL 쿼리를 보기 쉽도록 포맷팅
spring.jpa.properties.hibernate.format_sql=true