[JPA] 엔티티 매핑

형이·2023년 10월 12일

Spring

목록 보기
18/21
post-thumbnail

📝 JPA

🖥️ 1. 엔티티 매핑 소개

1-1. 엔티티 매핑 소개

  • 객체와 테이블 매핑 - @Entity, @Table
  • 필드와 컬럼 매핑 - @Cloumn
  • 기본 키 매핑 - @Id
  • 연관관계 매핑 - @ManyToOne, @JoinColumn

1-2. 객체와 테이블 매핑 - @Entity

  • @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다.
  • JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수
  • 주의사항
    : 기본 생성자 필수 (파라미터가 없는 public 또는 protected 생성자)
    : final 클래스, enum, interface, inner 클래스 사용 불가
    : 저장할 필드 final 사용 불가

1-3. @Entity 속성 정리

  • 속성 : name -> JPA에서 사용할 엔티티 이름을 지정

 ✔️ 기본값 : 클래스 이름을 그대로 사용한다.

 ✔️ 같은 클래스 이름 없으면 가급적 기본값을 사용한다.

 ✔️ 기본값을 쓸 것

1-4. @Table

  • 엔티티와 매핑할 테이블 지정
  • name : 매핑할 테이블 이름 (엔티티 이름을 사용)
  • catalog : 데이터베이스 catalog 매핑
  • schema : 데이터베이스 schema 매핑
  • uniqueConstraints : DDL 생성 시에 유니크 제약 조건 생성

🖥️ 2. 데이터베이스 스키마 자동 생성

  • hibernate.hbm2ddl.auto
  • create : 기본테이블 삭제 후 다시 생성 (Drop + Create)
  • create-drop : create와 같으나 종료 시점에 drop
  • update : 변경문만 반영 (운영 DB에는 사용하면 안 된다)
  • validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
  • none : 사용하지 않음

📌 데이터베이스 방언 별로 달라진다.

  • 운영장비에는 절대 create, create-drop, update 사용하면 안됨
  • 개발 초기 단계는 create 또는 update
  • 테스트 서버는 update 또는 validate
  • 스테이빙과 운영 서버는 validate 또는 none

🖥️ 3. DDL 생성 기능

  • 제약조건 추가

    	ex) 회원 이름은 필수, 10자 초과 X
    	    @Column(nullable=false, length=10)
  • 유니크 제약조건 추가

    		@Table(uniqueConstraints={
    
    	    @UniqueConstraint(
    		name="NAME_AGE_UNIQUE",
    		columnNames={"NAME", "AGE"}
    		)
    
    	   })

📌 DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다.


🖥️ 4. 필드와 컬럼 매핑

  • @Column : 컬럼 매핑
  • @Temporal : 날짜 타입 매핑
  • @Enumerated : enum 타입 매핑
  • @Lob : BLOB, CLOB 매핑
  • @Transient : 특정 필드를 컬럼에 매핑하지 않음 (매핑 무시)

4-1 . @Column

  • name : 필드와 매핑할 테이블의 컬럼 이름
  • nullable : null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성시에 non null 제약조건이 붙는다.
  • unique : @Table uniqueConstraints 와 같지만 한 컬럼에 간단히 유니크 제약 조건을 걸 때 사용한다.
  • length : 문자 길이 제약조건, String 타입에만 사용

🖥️ 5. 기본키 매핑 방법

  • 직접 할당 : @Id만 사용
  • 자동 생성 : @GeneratedValue -> 전략

 ✔️ IDENTITY

   - 데이터베이스에 위임 (MYSQL, SQL Server, DB2)

 ✔️ SEQUENCE
데이터베이스 시퀀스 오브젝트 사용 (ORACLE, PostgreSQL, DB2, H2)

   - @SequenceGenerator 필요

 ✔️ TABLE

   - 키 생성용 테이블 사용, 모든 DB에서 사용

   - @TableGenerator 필요

 ✔️ AUTO

   - 방언에 따라 자동 지정, 기본값

   - AUTO는 DB 방언에 맞춰서 IDENTITY, SEQUENCE, TALBE 3개의 방식 중 하나가 선택

5-1. @SequenceGenerator

  • name : 식별자 생성기 이름
  • sequenceName : 데이터베이스에 등록되어 있는 시퀀스 이름
  • initialValue : DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정한다. (기본값 1)
  • allocationSize : 시퀀스 한번 호출에 증가하는 수 (데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야 한다.) / (기본값 50)
  • catalog, schema : 데이터베이스 catalog, schema

🖥️ 6. TABLE 전략

잘 쓰진 않는다.

  • 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략
  • 장점 : 모든 데이터베이스에 적용 가능
  • 단점 : 성능

0개의 댓글