[JPA] 엔티티 매핑

·2024년 4월 13일
0

JPA

목록 보기
2/17
post-thumbnail

💡객체와 테이블 매핑

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

📗@Entity

  • @Entity가 붙은 클래스는 JPA가 관리하며, 엔티티라고한다.
  • JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수!\

📌 주의

  • 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자)
  • final 클래스, enum, interface, inner 클래스에 사용 불가
  • 저장할 필드에 final 사용 불가

@Entity 속성

  • name
    • JPA에서 사용할 엔티티 이름을 지정한다.
    • 기본값 : 클래스 이름을 그대로 사용
    • 같은 클래스명이 없으면 가급적 기본값을 사용한다.

📗@Table

  • @Table엔티티와 매핑할 테이블을 지정한다.

@Table 속성

속성기능기본값
name매핑할 테이블 명엔티티 이름을 사용
catalog데이터베이스 catalog 매핑
schema데이터베이스 schema 매핑
uniqueConstraints(DDL)DDL 생성시 유니크 제약 조건 생성

📗테이블 생성 예시

@Entity
@Table(name = "Members")	//DB의 Members테이블과 매핑
public class Member{
    @Id 
    private Long id;
    private String name;
}

💡데이터베이스 스키마 자동 생성

  • DDL을 애플리케이션 실행 시점에 자동 생성
  • 테이블 중심 -> 객체 중심
  • 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성
  • 이렇게 생성된 DDL은 개발 장비에서만 사용
  • 생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용

속성

옵션속성
create기존 테이블 삭제 후 다시 생성 (DROP + CREATE)
create-dropcreate와 같으나 종료시점에 테이블 DROP
update변경된 내역만 반영(운영 DB에는 사용하면 안됨)
validate엔티티와 테이블이 정상 매핑되었는지만 확인
none사용하지 않음

📗데이터베이스 스키마 자동생성 예시

persistence.xml

<persistence-unit name="hello">
        <properties>
            <!-- 필수 속성 -->
            ...

            <!-- 옵션 -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
          	<!--DB방언 설정-->
            <property name="hibernate.use_sql_comments"  value="true"/>
          	<!--데이터베이스 스키마 자동생성 속성-->
            <property name="hibernate.hbm2ddl.auto" value="create" />	
        </properties>
    </persistence-unit>

📗주의점

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

💡필드와 컬럼 매핑

  • 필드와 컬럼 매핑 어노테이션을 알아보자

📗매핑 어노테이션 정리

어노테이션설명
@Column컬럼 매핑
@Temporal날짜 타입 매핑
@Enumeratedenum 타입 매핑
@LobBLOB, CLOB 매핑
@Transient특정 필드를 컬럼에 매핑하지 않음(매핑 무시)

📗@Column

(1)name

  • 필드와 매핑할 테이블의 컬럼명 설정
  • 기본 값은 객체의 필드명이다.
//DB의 컬럼명이 user_name인 컬럼과 매핑
@Colum(name ="user_name")
private String name;

(2)insertable, updatable

  • 컬럼을 등록 또는 수정 했을 때 DB에 변경 할지 여부 설정
  • 기본 값은 TRUE
    //등록은 OK. 변경은 하면 안될때
    @Colum(updatable = false)
    private String name;

(3)nullable

  • 컬럼의 null값 허용 여부 설정
  • 기본 값은 TRUE
    //not null로 설정
    @Colum(nullable = false)
    private String name;

(4)unique

  • 컬럼에 간단한 유니크 제약 조건을 건다
  • @TableuniqueConstraints와 같지만, uniqueConstraints는 유니크 제약조건의 이름 설정이 가능하므로 잘 사용하지 않는다.
    //유니크 제약조건 설정
    @Colum(unique = true)
    private String name;
  • 유니크 제약조건 명이 랜덤으로 들어간다.
    @Entity
    //@Table의 uniqueConstraints를 사용하면 유니크 제약조건 이름을 설정할 수 있다.
    @Table(uniqueConstraints="Member_nuiqe")	
    public class Member{
       ...
    }

(5)columnDefinition

  • 데이터베이스의 컬럼 정보를 직접 설정
    //컬럼 타입은 varchar(100), 디폴트값은 'EMPTY'
    @Colum(columnDefinition="varchar(100) default 'EMPTY')
    private String name;

(6)length

  • 문자 길이 제약 조건
  • String 타입에만 사용 가능
  • 기본 값은 255
    //컬럼타입 길이를 10으로 변경 - varchar(10)
    @Colum(lenght = 10)
    private String name;

(7)percision,scale

  • 아주 큰 숫자정밀한 소수를 다루어야 할 때만 사용
  • percision은 소수점을 포함한 전체 자릿수를, scale은 소수의 자릿수를 의미
  • BigDecimal 타입에서 사용

📗@Enumerated

  • 자바 enum 타입을 매핑할 때 사용
  • 기본 값은 EnumType.ORDINAL
  • EnumType.ORDINAL : enum 순서를 데이터베이스에 저장
  • EnumType.STRING : enum 이름을 데이터베이스에 저장
    @Enumerated(EnumType.STRING)
    private int age;

📌 주의! ORDINAL는 사용 하면 안된다!

  • ORDINAL는 enum의 순서(0,1...)로 enum을 저장한다.
  • 이미 만들어둔 enum의 순서가 바뀌거나, 변경(추가,삭제)가 된다면?
    ➡️엄청나게 큰일이 벌어진다...

📗@Temporal

  • 날짜 타입(java.util.Date, java,util,Calendar)을 매핑할 때 사용
  • LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버 네이트 지원)
    //날짜. 데이터베이스 date 타입과 매핑(예 : 2013-10-11)
    @Temporal(TemporalType.DATE)
    private Date date1;
    //시간. 데이터베이스 time 타입과 매핑(예 : 11:11:11)
    @Temporal(TemporalType.TIME)
    private Date date2;
    //날짜와 시간. 데이터베이스 timestamp타입과 매핑(예 : 2013-10-11 11:11:11)
    @Temporal(TemporalType.TIMESPAMP)
    private Date date3;

📗@LOB

  • 데이터베이스 BLOB, CLOB 타입과 매핑
  • 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑
  @LOB
  private String text;

📗@Transient

  • 특정 필드를 컬럼에 매핑하지 않을 때 사용
  • 필드 매핑 X, 데이터베이스에 저장X, 조회X
  • 주로 메모리상에서만 임시로 어던 값을 보관하고 싶을 때 사용
@Transient
private Integer temp;

💡기본 키 매핑

기본 키 매핑에 대해 알아보자

📗 기본 키 매핑 - 직접 할당(@Id)

  • @Id 어노테이션을 사용하면 기본키 직접 할당이 된다.
@Id
private Long id;

📗 기본 키 매핑 - 자동생성(@GeneratedValue)

  • IDENTITY : 데이터베이스에 위임. MYSQL
  • SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용. ORACLE
    • @SequenceGenerator 필요
  • TABLE : 키 생성용 테이블 사용. 모든 DB에서 사용 가능
    • @TableGenerator 필요
  • AUTO : 방언에 따라 자동 지정. 기본 값

(1)IDENTITY 전략

  • 기본 키 생성을 데이터베이스에 위임
  • 주로 MYSQL, PostagreSQL, SQL Server, DB2에서 사용
    • ex) MySQL의 AUTO_INCREMENT
  • AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행한 후에 ID 값을 알 수 있다.
    ➡️ IDENTITY 전략은 em.persist()시점에 즉시 INSERT SQL 실행 후 DB에서 식별자를 조회

IDENTITY 전략 예시

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

(2)SEQUENCE 전략

  • 데이터베이스 시퀀스를 사용
  • 데이터베이스 시퀀스 : 유일한 값을 순서대로 생성하는 특별한 데이터 베이스 오브젝트
  • 오라클, PostagreSQL, DB2, H2 데이터베이스에서 사용
  • SEQUENCE 전략 사용 시 @SequenceGenerator 필요

📌@SequenceGenerator 속성

SEQUENCE 전략 예시

@Entity
@SequenceGenerator(name="MEMBER_SEQ_GENERATOR"),
  					sequenceName="MEMBER_SEQ",
  					initialValue=1, allocationSize=1)
public class Member{

    @Id @GeneratedValue(strategy = GenerationType.SEQUENCE,
  						generator="MEMBER_SEQ_GENERATOR")
    private Long id;
}

(3)TABLE 전략

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

📌@TableGenerator 속성

📗권장하는 식별자 전략

  • 기본 키 제약 조건 : null 아님, 유일, 변하면 안된다
  • 미래까지 이 조건을 만족하는 자연키는 찾기 어렵다.
    ➡️ 대리키(대체키)를 사용하자!
  • 권장 : Long형 + 대체키 + 키 생성전략 사용
profile
백엔드 개발자를 꿈꿉니다 / 이전 블로그 : https://po-dadak.tistory.com/category

0개의 댓글

관련 채용 정보