똑같은 삽질은 2번 하지 말자

JPA 에 관해서 본문

Spring/Spring Boot

JPA 에 관해서

곽빵 2020. 2. 22. 14:33

엔티티?

JPA에서는 엔티티는 테이블에 대응하는 하나의 클래스라고 생각하시면 편합니다.엄청나게 간단한 코드와 함께 같이 보겠습니다.

엔티티 클래스

@Entity
public class Member {

    @GeneratedValue
    @Id
    private long id;
    private long password;

}

데이터베이스의 테이블

Table

id 12342
password 12342

spring-boot-starter-data-jpa 의존성을 추가하고 @Entiy 어노테이션을 붙이면 테이블과 자바 클래스가 매핑이 됩니다.

그래서 JPA에서 '하나의 엔티티 타입을 생성한다'라는 의미는 '하나의 클래스를' 작성한다는 의미가 됩니다.

엔티티라는 용어는 때로는 클래스를 의미하는 경우도 있고, 클래스에 의해 생성된 인스턴스를 의미하는 경우가 있습니다.

정확히 얘기 하자면, 엔티티 클래스  엔티티 인스턴스 혹은 엔티티 객체라는 표현이 정확합니다.

엔티티 매니저?

엔티티 객체들을 관리하는 역할을 합니다. 여기서 관리란 Life Cycle이라고 할 수 있습니다.

엔티티 매니저는 관리하는 엔티티 객체들을 영속 컨텍스트(Persistence Context)에 넣어두고, 객체들의 생사를 관리하게 됩니다.

엔티티 매니저 관리 도식화 그림

영속 컨텍스트와 엔티티 객체

영속 컨텍스트는 JPA가 엔티티 객체들을 모아두는 공간이라고 이해할 수 있습니다.

이름설명

New(비영속) Java 영역에만 존재하고, 데이터베이스와 연동된 적 없는 상태.순수한 Java 객체로 엔티티 매니저가 관리하지 않음
Managed(영속) DB에 저장되고, 메모리상에서도 같은 상태로 존재하는 상태.PK 값을 통해 필요한 엔티티 객체를 꺼내 사용할 수 있게 됩니다.
Removed(삭제) DB 상에서 삭제된 상태. 객체는 영속 컨텍스트에 존재하지 않습니다.
Detached(준영속) 영속 컨텍스트에서 엔티티 객체를 꺼내서 사용하는 상태. 아직 DB와 동기화가 이루어지지 않은 상태

엔티티 클래스 설계

JPA는 자동으로 테이블을 생성할 수 있는 기능을 가지고 있어, 아래와 같은 방식을 이용할 수 있습니다.

  • SQL을 이용해서 테이블을 먼저 생성하고, 엔티티 클래스를 만드는 방식
  • JPA를 이용해서 클래스만 설계하고 자동으로 테이블을 생성하는 방식

엔티티 설계 과정

  1. 객체지향의 설계대로 클래스들을 설계합니다.
  2. @Id, @Column 이용해서 각종 제약 조건을 추가하고, 설정합니다.
  3. 엔티티 간의 연관관계를 설정합니다.

JPA와 H2 인메모리 DB를 이용한 실습은 여기서 확인하실 수 있습니다.
그리고 MySQL과 같은 DB연동은 여기서 확인하실 수 있습니다!

엔티티 클래스 관련 어노테이션

JPA와 관련 어노테이션은 여기서 확인할 수 있습니다👍

  • @Id
    - 해당 칼럼이 식별키(PK, Primary key)라는 것을 의미합니다.
    • 모든 엔티티에 반드시 @Id 지정해 주어야 합니다.
    • 주로 @GeneratedValue와 함께 식별키를 어떤 전략으로 생서하는지 명시합니다.
  • @GeneratedValue
    - strategy 속성과 generator 속성으로 구분됩니다.
    • strategy
      • AUTO: 특정 데이터베이스에 맞게 자동으로 생성되는 방식
        • TABLE: 별도의 키를 생성해주는 테이블을 이용하는 방식
        • SEQUENCE: 데이터베이스의 시퀀스를 이용해서 식별키 생성(오라클에서 사용)
        • IDENTITY: 기본키 생성 방식 자체를 데이터베이스에 위임하는 방식
          - generator
      • @TableGenerator, @SequenceGenerator
  • @Column
    - 인스턴스 변수가 칼럼이 되기 때문에, 컬럼명을 별도로 지정하거나 컬럼의 사이즈, 제약조건들을 추가하기 위해 사용됩니다.
  • @Table
    - 클래스가 테이블이 되기 때문에 클래스의 선언부에 작성하여 테이블명을 어떻게 정할지 결정합니다. 기본적으로 @Table이 지정되지 않으면, 클래스 명으로 테이블이 생성됩니다.
  • @Entity
    - 해당 클래스의 인스턴스들이 엔티티임을 명시합니다.
Comments