JPA 설정

지원·2026년 2월 25일

SpringBoot

목록 보기
7/17
post-thumbnail

JPA (Java Persistence API)

  • 객체와 관계형 DB의 테이블을 짝지어 데이터를 영구적으로 저장할 수 있도록 정해진 Java 진영의 규칙
  • 객체는 마침표(.)를 통해 자유롭게 연관 객체를 탐색해야 하기 때문에 JPA는 '지연 로딩(Lazy Loading)'을 통해 실제 필요한 시점에 데이터를 가져오도록 지원

Hibernate

  • JPA에 맞춰서 구현을 한 구현체
  • 내부적으로 JDBC를 사용한다.

JPA 어노테이션 (매핑할 때 사용)

<*하단 Entity 클래스 만들기 참조>

  • @Entity
    스프링이 User 객체와 user 테이블을 같은 것으로 바라본다.
    Entity 객체는 매개변수가 하나도 없는 기본생성자가 꼭 필요하다. ( Protected도 가능)
    클래스 위에 작성
  • @Id : primary key 컬럼을 알려주는 어노테이션, 필드 위
  • @GeneratedValue : Primary key는 자동 생성되는 값
    TABLE : 별도 테이블 사용
    SEQUENCE : 시퀀스 객체 사용 (Oracle, H2 등)
    IDENTITY : 데이터베이스에 위임 (MySQL)
    AUTO : 자동 설정(기본값)
// id = bigint auto_increment *sql*
// @GeneratedValue(strategy = GenerationType.IDENTITY) *springboot*
// 둘이 동일
  • @Column
    null이 들어갈 수 있는지 여부, 길이 제한, DB에서의 cloumn 이름 등등
    칼럼 어노테이션은 생략 할 수도 있다. (완전히 동일할 경우)
    필드 위
@Coulumn(nullable = false, length = 20)
private String name;
private integer age;
	만약 객체와 테이블 이름이 다르다면 하단과 같은 방법 사용
@Coulumn(nullable = false, length = 20, name = "name")
private String nickname;
private integer age;
  • @Table
    이 엔티티 클래스가 어떤 테이블과 연결되는지 지정하는 어노테이션
    즉, 자바 클래스 이름과 실제 DB 테이블 이름이 다를 수 있는데, 그걸 연결해주는 역할
    @Table을 생략하면 클래스명으로 테이블 이름을 추측한다.
@Entity
@Table(name = "users")
public class User {
}
  • 관계 매핑 어노테이션
    ex) @OneToOne, @OneToMany, @ManyToOne, @ManyToMany
    두 엔티티 사이의 관계 표현 (Table Join)
  • @JoinColumn
    외래키(Foreign key) 컬럼의 이름 및 기타 속성을 지정할 때 사용

JPA 리스너 (Entity Listener)

엔티티의 생명주기 이벤트에 자동으로 반응하는 기능
@CreatedDate, @LastModifiedDate : 엔티티의 생성 시간과 수정 시간을 자동으로 관리하기 위한 어노테이션

  • @CreatedDate
    필드와 매핑된 컬럼에 행이 삽입된 날짜와 시간을 자동으로 관리
    @EnableJpaAuditing, @EntityListeners 어노테이션 사용 -> 어플리케이션에 활성화 시켜야함
  • @LastModifiedDate
    필드와 매핑된 컬럼에 행이 변경된 날짜와 시간을 자동으로 관리
    @EnableJpaAuditing, @EntityListeners 어노테이션 사용 -> 어플리케이션에 활성화 시켜야함
    • Entity 클래스에서 @EntityListeners(AuditingEntityListener.class)를 설정해야 필드에 사용가능
    • JPA 리스너를 사용하기 위해 Main 클래스에서 @EnableJpaAuditing을 사용해 JPA Auditing 기능 활성화

JPA 추가 설정

  • application.yml 내부 작성
spring:
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        show_sql: true
        format_sql: true
  • ddl-auto 내부
    1) create : 기존 테이블이 있다면 삭제 후 다시 생성
    2) create-drop : 스프링이 종료될 때 테이블을 모두 제거
    3) update : 객체와 테이블이 다른 부분만 변경
    4) validate : 객체와 테이블이 동일한지 확인
    5) none : 별다른 조치를 하지 않는다.
  • show_sql : SQL 로그 활성화
  • format_sql : SQL 로그 출력 시 줄바꿈을 추가해 가독성 증가
  • dialect : 이 옵션으로 DB를 특정하면 조금씩 다른 SQL을 수정해준다. (H2에서)

Spring Data JPA

  • 복잡한 JPA 코드를 스프링과 함께 쉽게 사용할 수 있도록 도와주는 라이브러리
  • SimpleJpaRepository에서 복잡한 쿼리 작성한 것들 가져다 쓰는 원리
  • CrudRepository 인터페이스랑 JpaRepository를 상속

사용법

  1. 의존성 추가 : Gradle 예시
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.mysql:mysql-connector-j'
}
  1. application.yml에 DB 연결 정보 작성
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/library
    username: root
    password: 1234
    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
  1. Entity 클래스 만들기
    Spring Data JPA를 사용하기 위해서는 DB 테이블과 연결될 엔티티 클래스가 있어야 한다.
    <*상단 JPA 어노테이션 참조>
@Entity
@Getter
@ToString
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {
	@Id
    @GeneratedValue
    private Long id;
    private String name;
    private STring email;
    private Integer age;
    
    @Builder
    public Member(STring name, String email, Integer age){
 	this.age = age;
    this.email = email;
    this.name = name;
    }
}
1. Setter 메소드 미작성 : 필요시 필드를 변경하는 메소드 직접 작성
2. 기본 생성자의 접근 제한자를 protected 변경
3. @AllArgsConstructor 미사용 : @Builder 어노테이션 사용시 에러
4. @toString(exclude = "...")어노테이션을 사용해 제외할 필드를 명시적으로 지정
  1. Repository 인터페이스 만들기
    JpaRepository 인터페이스를 사용해 데이터베이스에 엔티티 객체를 저장하거나 조회, 수정, 삭제 처리
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
}
  1. Service에서 사용
    이제 만든 인터페이스를 주입받아서 쓰면 된다.
profile
개발 공부하는 김지원

0개의 댓글