[Beyond SW] Mapping

이경민·6일 전

한화시스템 Beyond SW

목록 보기
32/40

오늘은!! 졸지 않고 다 흡수할 것이다!!

hibernate.ddl-auto : Hibernate가 Entity 클래스와 연결된 테이블을 자동으로 생성, 수정, 삭제할 수 있게 하는 속성

spring:
 datasource:
   driver-class-name: org.mariadb.jdbc.Driver
   url: jdbc:mysql://localhost:3306/menudb
   username: ohgiraffers
   password: ohgiraffers
 jpa:
   show-sql: true
   hibernate:
     ddl-auto: create
   properties:
     hibernate:
       format_sql: true

create : 테이블 생성
update : 테이블 업데이트
validate : Entity 클래스와 테이블이 일치하는지만 검증
create-drop : 프로그램 종료 시 해당 테이블을 삭제. 존재하지 않는 테이블을 생성하면서 진행하기 위해 create 옵션을 설정한다.

Entity

@Entity 어노테이션

  • JPA에서 사용되는 엔티티 클래스임을 표시.
  • 해당 클래스가 데이터베이스의 테이블과 매핑됨.
  • name 속성을 사용하여 엔티티 클래스와 매핑될 테이블의 이름을 지정 가능. (생략시 자동으로 클래스 이름을 엔티티명으로 사용)
  • 프로젝트 내에 다른 패키지에도 동일한 엔티티가 존재하는 경우 해당 엔티티를 식별하기 위한 중복 되지 않는 name을 지정해주어야 함.
  • 기본 생성자는 필수로 작성해야 함.

@Id : primary key 지정
@GeneratedValue : primary key 생성에 관여

  • strategy : 자동 생성 전략을 지정
    • GenerationType.IDENTITY : 기본 키 생성을 데이터베이스에 위임(= MySQL의 AUTO_INCREMENT)
    • GenerationType.SEQUENCE : 데이터베이스 시퀀스 객체 사용(ORACLE의 SEQUENCE)
    • GenerationType.TABLE : 키 생성 테이블 사용
    • GenerationType.AUTO : 자동 선택 (MySQL이라면 IDENTITY, ORACLE이라면 SEQUENCE로 선택)
  • generator : strategy 값을 GenerationType.TABLE로 지정한 경우 사용되는 테이블 이름을 지정
  • initialValue : strategy 값을 GenerationType.SEQUENCE로 지정한 경우 시퀀스 초기값을 지정
  • allocationSize : strategy 값을 GenerationType.SEQUENCE로 지정한 경우 시퀀스 증가치를 지정

@Column : 엔티티 클래스의 필드와 데이터베이스의 컬럼 매핑을 지정. 필드의 이름과 데이터베이스의 컬럼명, 자료형 등을 지정할 수 있음

name 매핑할 테이블의 컬럼 이름
insertable 엔티티 저장 시 필드 저장 여부 (default : true)
updatable 엔티티 수정 시 필드 수정 여부 (default : true)
table 엔티티와 매핑될 테이블 이름. 하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용. (@SecondaryTable 사용)
nullable NULL 값 허용 여부 (default : true)
unique 컬럼의 유일성 제약 조건. 두 개 이상 컬럼에 unique 제약조건을 설정하기 위해서는 클래스 레벨에서 @Table의 uniqueConstraints 속성에 설정.
columnDefinition 직접 컬럼의 DDL을 지정
length 문자열 길이. String 타입에서만 사용. (default : 255)

@Transient : 해당 필드를 데이터베이스 테이블의 컬럼에 매핑하지 않는다. 해당 필드는 데이터베이스에 저장되거나 검색되지 않는다. 주로 데이터베이스에는 필요하지 않지만 객체 내에서 로직을 처리하는 데 사용되는 필드에 사용됨

@Enumerated : Enum 타입 매핑을 위해 사용됨.

  • EnumType.ORDINAL : Enum 타입을 순서로 매핑한다. (default)
    - 장 : 데이터 베이스에 저장 되는 데이터의 크기가 작다
    • 단 : 이미 저장 된 enum의 순서를 변경할 수 없다
  • EnumType.STRING : Enum 타입을 문자열로 매핑한다
    - 장 : 저장된 enum 순서 바뀌거나 enum 추가되어도 안전
    - 단 : 데이터베이스에 저장되는 데이터의크기가 큼
    *Enum 타입 : 서로 연관된 상수들의 집합. 코드의 가독성 높일 수 있음.

@TableGenerator : 테이블 이용해 기본 키 생성 @GeneratedValue와 함께 사용됨

Access

엔터티 접근 방식
1. 엔티티 객체의 필드에 직접 접근
@Access(AccessType.FIELD) (default이므로 제거해도 동일하게 동작)
2. getter 메소드를 이용하는 방식
@Access(AccessType.PROPERTY)
: 클래스 레벨에 설정하면 모든 필드에 대해 getter 방식 적용
(but, @Id 어노테이션이 필드에 있다면 엔티티를 생성하지 못하기 때문에 @Id 어노테이션을 getter 메소드 위로 옮겨야함)

Embedded

@Embeddable : 임베디드 타입을 정의
공통적으로 사용되는 것들을 재사용하기 위해 만든 별도의 클래스를 엔티티에 포함시키는 것을 말함
해당 임베디드 타입이 엔티티의 한 부분임을 명시하는데 사용됨
임베디드 타입을 포함하는 엔티티의 필드에 선언해야 함.
어노테이션이 선언된 클래스는 직렬화 가능해야하므로 Serializable 인터페이스 구현해야함

Composite key

복합키 매핑
1. @EmbeddedId 사용
복합키를 구성하는 필드들을 하나의 클래스로 묶은 뒤 해당 클래스를 어노테이션 사용하여 매핑
일부 필드만을 매핑할 수도 있으므로 유연한 매핑 가능함
2. @IdClass 사용
복합 키의 역할을 하는 클래스를 생성
복합키 구성하는 필드들을 별도의 클래스로 분리한 뒤 해당 클래스를 어노테이션의 갑으로 지정
모든 필드를 한번에 매핑 가능(매핑이 엔티티에 몰려 엔티티가 길어짐)
별도의 매핑 클래스를 사용하지 않기 때문에 코드가 간결

0개의 댓글