TIL_0217 - JPA 개념 정리를 하면서

johaS2·2025년 2월 17일

1. JPA란?

JPA 는 자바 애플리케이션에서 관계형 데이터베이스를 보다 쉽게 다룰 수 있도록 하는 ORM 표준 기술이다.

JPA의 핵심 개념

  • ORM : 객체와 데이터베이스 테이블을 매핑하여 객체 ㅈ ㅣ향 프로그래밍 방식으로 데이터를 조작할 수 있도록 한다.
  • 데이터베이스 의존성 감소 : SQL을 직접 다루지 않고 엔티티 객체 중심으로 개발 가능
  • 자동화된 SQL 생성 및 실행 : JPA가 SQL을 대신 생성하여 실행
  • 트랜잭션 관리 지원 : EntityManager를 통해 트랜잭션을 쉽게 다룰 수 있다.
  • 캐싱 및 성능 최적화 : 1차 캐시, 지연 로딩 등의 기능 제공

2. 기본 매핑

JPA에서 엔티티는 데이터베이스 테이블과 매핑되는 자바 클래스이다.

엔티티 클래스 정의

@Entity // 해당 클래스가 JPA 엔티티임을 명시
@Table(name = "users") // 매핑할 테이블 이름 지정
public class User {

    @Id // 기본 키(PK) 매핑
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 자동 증가 값
    private Long id;

    @Column(nullable = false, length = 50) // 필드 매핑
    private String name;

    @Column(unique = true)
    private String email;

    @Column(name = "created_at", updatable = false) // 테이블의 컬럼명과 매핑
    private LocalDateTime createdAt;
}

주요 매핑 어노테이션

@Entity : 클래스가 엔티티임을 선언

@Table(name = "테이블명") : 매핑할 테이블 이름 지정 (생략 시 클래스명 사용)

@Id : 기본 키 지정

@GeneratedValue(strategy = GenerationType.IDENTITY) : 자동 증가값 설정

@Column(name = "컬럼명", 옵션) : 컬럼 매핑 (nullable, unique 등 설정 가능

3. 연관관계 매핑

1:다 Many-to-One 관계

@Entity
public class Order {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id") // 외래 키 매핑
    private User user;
}

@ManyToOne : 다대일 관계 매핑

@JoinColumn(name = "컬럼명") : 외래 키 지정

FetchType.LAZY : 지연 로딩 설정

1:다 One-to-Many 관계

@Entity
public class User {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Order> orders = new ArrayList<>();
}

@OneToMany(mappedBy = "반대편 필드") : 일대다 관계 매핑

cascade = CascadeType.ALL : 부모 엔티티 변경 시 자식 엔티티도 자동 반영

orphanRemoval = true : 연관된 자식 엔티티가 없을 경우 삭제

다:다 Many-to-Many 관계

@Entity
public class Student {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @ManyToMany
    @JoinTable(name = "student_course",
               joinColumns = @JoinColumn(name = "student_id"),
               inverseJoinColumns = @JoinColumn(name = "course_id"))
    private List<Course> courses = new ArrayList<>();
}

@ManyToMany : 다대다 관계 매핑

@JoinTable : 중간 테이블을 생성하여 다대다 관계를 풀어줌


정리

  • JPA는 ORM 기반 기술로 SQL 대신 객체 중심으로 데이터 조작 가능
  • @Entity, @Id, @Column 등을 사용하여 엔티티와 데이터베이스를 매핑
  • 연관관계 매핑(@OneToMany, @ManyToOne, @ManyToMany)으로 테이블 간 관계를 객체로 표현

오늘의 배운 점

프로젝트를 진행하면서 JPA 매핑을 처음부터 잘 설계하는 것이 얼마나 중요한지 깨닫게 되었다. 처음에는 단순히 엔티티만 만들어두면 될 거라 생각했지만, 실제로 연관관계를 고려하지 않고 설계하면 나중에 유지보수가 어렵고, 쿼리 최적화도 힘들어진다.
특히 양방향 연관관계, Lazy Loading, Cascade 설정 등은 신중하게 고민하고 적용해야 한다는 점을 알게 되었다.
앞으로는 도메인 모델을 설계할 때 연관관계 매핑을 먼저 고려하고, 이후 구현을 진행하는 방식을 적용해야겠다고 생각했다.

profile
passionate !!

0개의 댓글