[JPA 시리즈] 2 - 엔티티 매핑 (1 - 엔티티 매핑 / 스키마 자동 생성)

2025. 11. 27. 23:46·Development/Java(Spring, JPA, etc.)
위 포스트는 인프런 김영한님 강의(자바 ORM 표준 JPA 프로그래밍 - 기본편)의 내용을 포함하고 있음을 밝힙니다.

엔티티 매핑

앞서 영속성 컨텍스트로 객체(엔티티)를 저장하는 방법을 보았다.
이때 순수 자바 객체 상태로는 저장을 할 수 없기 때문에 영속성 컨텍스트에 저장하기 전에 사전처리를 해주어야 한다. 
이 사전처리를 엔티티 매핑이라고 부른다. 먼저 객체와 테이블 매핑부터 살펴보자.

객체 - 테이블 매핑

@Entity

객체와 테이블을 매핑하기 위해서는 반드시 객체에 @Entity 어노테이션을 붙여주어야 한다.
이때 @Entity를 붙인 클래스를 엔티티라 부르며, JPA에서 관리하게 된다.

주의할 점은 클래스에 기본 생성자를 반드시 만들어주어야 하고(파라미터가 없는 public이나 protected 생성자), final 클래스나 enum, interface, Inner 클래스는 사용해서는 안되며, 값을 저장할 필드에 final을 사용해서는 안된다.

속성은 name 하나인데, JPA에서 사용할 엔티티 이름을 지정하는데 쓴다. 기본값은 클래스 이름을 그대로 사용하는데, 어지간하면 기본값을 사용하는 것이 좋다.

@Table

이 어노테이션은 엔티티와 매핑할 테이블을 지정해 준다.

개발하다 보면 엔티티 이름과 테이블 명을 같게 가져가는 경우도 있지만 아닌 경우도 종종 있다. 이런 케이스들을 위해 설정을 할 수 있게 해주는 어노테이션이 @Table 어노테이션이다.

주요 속성은 name, catalog, schema, uniqueConstraints 4가지이다. 

  • name: 매핑할 테이블 이름
  • catalog: DB catalog 매핑
  • schema: DB schema 매핑
  • uniqueConstraints: DDL 생성 시 Unique 제약 조건을 생성

여기서 uniqueConstraints는 조금 뒤에 다시 나오니 일단은 넘어가자.

DB 스키마 자동 생성

JPA에서는 엔티티들을 바탕으로 DDL을 애플리케이션 실행 시점에 자동으로 생성해 준다. 이때 각 DBMS별로 SQL 문법에 조금씩의 차이가 있기 때문에 DB별 방언을 활용해서 DDL을 생성해 준다.

하지만 여기서 생성된 DDL은 개발 환경에서만 사용하고 실제 서비스 환경에서는 사용하지 않는다. JPA에서 나름 최적화해서 DDL을 뽑아주었다지만 아무리 그래도 자동 생성이기 때문에 제약조건 이름도 무작위로 생성되는 등 직접 써먹기에는 힘들기 때문이다. 혹은 사용한다 하더라도 적절하게 다듬어서 사용을 해야 한다.

제약조건 생성 쿼리문. 이런 식으로 제약조건 이름이 무작위이다.

이 데이터베이스 스키마 생성에도 생성 옵션이 있다.

  • create: 기존에 있던 테이블 삭제 후 다시 생성 (TABLE DROP 후 CREATE)
  • create-drop: create 옵션과 동일하나 종료 시점에 생성한 테이블을 DROP 한다
  • update: 스키마 변경분만 테이블에 반영한다. 이 옵션은 서비스 환경에서는 사용해서는 안된다.
  • validate: 엔티티-테이블 간 정상적으로 매핑이 되었는지만 확인
  • none: 생성하지 않음

여기서 가장 주의해야 할 부분은 실 서비스 제공 환경에서는 절대 create, create-drop, update를 사용해서는 안된다.
create나 create-drop은 두말할 것도 없이 데이터가 전부 날아가는 대참사가 일어나고, update 같은 경우도 기존 데이터 대상으로 데이터 정합성 측면에서 문제가 생길 가능성이 있기 때문이다.

그렇기 때문에 개발 초기 단계에서는 create나 update, 테스트 환경에서는 update / validate, 스테이징과 서비스 환경에서는 none 옵션으로 테이블을 건드리지 않거나 사용하더라도 validate로 매핑이 정확히 되었는지만 보는 수준으로 끝내야 한다.

또 제약조건이나 유니크 제약조건을 설정할 수도 있다.제약조건은 아래와 같이 @Column, 유니크 제약조건은 @UniqueConstraint어노테이션으로 설정 가능하다.

@Entity
public class Member {
    @Column(nullable = false, length = 8)  // 이름은 값을 비울 수 없으며 8자 이내로 설정해야 함
    private String name;
    
    // name, age 컬럼을 Unique로 지정
    @Table(uniqueConstraints = {
        @UniqueConstraint( name = "NAME_AGE_UNIQUE", columnNames = {"NAME", "AGE"} )
    })
    private int age;
    
    /* ... */
}

 


 

필드와 컬럼 매핑은 분량이 많아 다음 글로 따로 빼서 설명하기로 한다.

 

 

 

저작자표시 비영리 변경금지 (새창열림)

'Development > Java(Spring, JPA, etc.)' 카테고리의 다른 글

[JPA 시리즈] 2 - 엔티티 매핑 (2 - 컬럼 매핑과 기본 키 매핑)  (0) 2025.12.11
[JPA 시리즈] 1 - 영속성 컨텍스트 (2 - 준영속)  (0) 2025.11.19
[JPA 시리즈] 1 - 영속성 컨텍스트(1)  (0) 2025.11.12
'Development/Java(Spring, JPA, etc.)' 카테고리의 다른 글
  • [JPA 시리즈] 2 - 엔티티 매핑 (2 - 컬럼 매핑과 기본 키 매핑)
  • [JPA 시리즈] 1 - 영속성 컨텍스트 (2 - 준영속)
  • [JPA 시리즈] 1 - 영속성 컨텍스트(1)
Polaris_
Polaris_
  • Polaris_
    아무거나 다 적는 블로그
    Polaris_
  • 전체
    오늘
    어제
    • 분류 전체보기 (17)
      • Development (16)
        • TIL (Today what I Learned) (0)
        • 데브코스(TIL, 회고록 등등...) (10)
        • Java(Spring, JPA, etc.) (4)
        • 코딩 테스트 (알고리즘) (0)
        • 기타 (1)
      • 일상 (1)
      • 여행기 (0)
        • 국내 (0)
        • 해외 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    포트폴리오
    웹
    docker
    typescript
    프로젝트 설계
    TIL
    HTTP
    코딩부트캠프
    javascript
    React
    node.js
    국비지원교육
    MySQL
    Express.js
    Postman
    데브코스
    JPA
    css
    풀스택
    프로그래머스 데브코스
    html
    준영속
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Polaris_
[JPA 시리즈] 2 - 엔티티 매핑 (1 - 엔티티 매핑 / 스키마 자동 생성)
상단으로

티스토리툴바