엔티티 매핑

2023. 6. 17. 10:15·💻 Dev/JPA

JPA로 객체를 관리할 때 주로 쓰는 어노테이션을 배운 섹션이었다.

 

 

객체와 테이블 매핑

@Entity

•  @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다.

•  J•PA를 사용해서 테이블과 매핑할 클래스는 @Entity를 필수로 붙여줘야 한다.

 

@Table

•  엔티티와 매핑할 테이블 지정

•  예약어라 다른 테이블명과 매치해 줄 때 사용 ex) order

 

 

필드와 컬럼 매핑

@Table(name="members")
@Entity
public class Member {

    @Id
    private Long id;

    @Column(name = "name")
    private String username;

    private Integer age;

    @Enumerated(EnumType.STRING)
    private RoleType roleType;

    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    @Lob
    private String description;

    @Transient
    private int calCnt;
}

@Column

컬럼 매핑

 

@Temporal

날짜 타입 매핑 - 날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용

 

•  TemporalType.DATE: 날짜, DB date 타입과 매핑(예: 2013–10–11)

•  TemporalType.TIME: 시간, DB time 타입과 매핑(예: 11:11:11)

•  TemporalType.TIMESTAMP: 날짜와 시간, DB timestamp 타입과 매핑(예: 2013–10–11 11:11:11)

•  💡 참고: LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버네이트는 지원)

 

@Enumerated

enum을 매핑할 때 사용

 

•  EnumType.ORDINAL: enum 순서를 데이터베이스에 저장

•  EnumType.STRING: enum 이름을 데이터베이스에 저장

•  💡 절대 ORDINAL 사용 금지 : 0, 1로 저장했다가 enum이 추가, 삭제되어 순서를 바꿔버리면 꼬여버리기 때문이다.

 

@Lob

•  데이터베이스 BLOB, CLOB 타입과 매핑

•  속성X

 

@Transient

•  컬럼에 매핑 하지 않고 단순 계산을 위한 컬럼에 사용할 수 있다.

•  데이터베이스에 저장X, 조회X

 

 

기본 키 매핑

Long형 + 대체키 + 키 생성전략 사용을 권장하셨다.

 

기본 키의 제약 조건은 NULL이 아니고, 유일하며 변하면 안 된다.

미래까지 이 조건을 만족하는 자연키를 찾기 어렵다. 예로 주민 번호도 기본 키로 적절하지 않을 수 있다.

그 이유는 정책상 주민번호를 DB에 저장하지 못하게 바뀐다면 여기저기 외래키로 잡혀있는 주민번호를 전부 삭제해줘야 하기 때문이다.

@Id
@GeneratedValue
private Long id;

 

직접 할당

@Id만 사용

 

자동 생성

@GeneratedValue 사용

 

IDENTITY

•  기본 키 생성을 데이터베이스에 위임

•  주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다.

•  데이터베이스에 INSERT SQL을 실행한 이후에 ID 값을 알 수 있다.

•  IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL 실행하고 DB에서 식별자를 조회한다.

 

SEQUENCE

•  시퀀스 오브젝트 사용

•  오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용

•  데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트(예: 오라클 시퀀스)

@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;
}

💡 allocationSize 

시퀀스 한 번 호출에 증가하는 수(성능 최적화에 사용됨)

데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야 한다(기본값:50)

 

TABLE

•  키 생성용 테이블 사용, 모든 DB에서 적용 가능하다.

•  키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내 내는 전략

•  장점 : 모든 데이터베이스에 적용 가능

•  단점 : 성능

create table MY_SEQUENCES (
 sequence_name varchar(255) not null,
 next_val bigint,
 primary key ( sequence_name )
);

@Entity
@TableGenerator(
			 name = "MEMBER_SEQ_GENERATOR",
			 table = "MY_SEQUENCES",
			 pkColumnValue = "MEMBER_SEQ", allocationSize = 1)
public class Member {
		 @Id
		 @GeneratedValue(strategy = GenerationType.TABLE,
		 generator = "MEMBER_SEQ_GENERATOR")
		 private Long id;
}

 

 

AUTO

  • 방언에 따라 자동 지정된다.
  • 기본값이다.

 

 

 

 

 

[참고] 인프런 - 김영한 님의 자바 ORM 표준 JPA 프로그래밍-기본편 강좌를 보고 공부한 내용을 바탕으로 작성했습니다.

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

저작자표시 비영리 (새창열림)

'💻 Dev > JPA' 카테고리의 다른 글

변경감지와 병합  (0) 2024.01.06
단방향, 양방향 연관관계 매핑  (1) 2023.06.23
연관관계가 필요한 이유  (0) 2023.06.22
영속성 컨텍스트  (0) 2023.06.16
'💻 Dev/JPA' 카테고리의 다른 글
  • 변경감지와 병합
  • 단방향, 양방향 연관관계 매핑
  • 연관관계가 필요한 이유
  • 영속성 컨텍스트
현주먹
현주먹
끄적끄적 개발.log
  • 현주먹
    현주먹의 개발로그
    현주먹
  • 전체
    오늘
    어제
    • 전체글 (162)
      • 👶🏻 CS (15)
        • Operating System (8)
        • Database (4)
        • Data Structure (2)
        • Software Engineering (1)
      • 💻 Dev (54)
        • Java & OOP (24)
        • Spring (4)
        • JPA (5)
        • Test Code (1)
        • Database (1)
        • JSP & Servlet (13)
        • Etc (6)
      • 💡 Algorithm (25)
        • 인프런 (9)
        • 백준 (16)
      • 🛠 DevOps & Tool (11)
        • Linux (4)
        • AWS (1)
        • Git (2)
        • Etc (4)
      • 📝 끄적끄적 (57)
        • 후기 및 회고 (5)
        • TDD, 클린 코드 with Java 17기 (3)
        • F-Lab (23)
        • 🖥️ 자바의 정석 (11)
        • 📖 Clean Code (3)
        • 항해99 코테 스터디 (11)
  • 블로그 메뉴

    • 🐈‍⬛ GitHub
    • TIL
  • 인기 글

  • 태그

    개발자멘토링
    오라클
    인프런 특정문자뒤집기
    백준
    99클럽
    에프랩
    jsp
    로또 미션
    JPA
    코딩테스트준비
    티스토리챌린지
    ==와 equals()
    PostGreSQL함수
    백준10250
    데브클럽
    자바의정석
    오블완
    F-Lab
    에프랩 후기
    til
    f-lab 후기
    TDD 클린 코드 with Java
    개발자취업
    항해99
    NextSTEP
    C
    코테스터디
    인프런 단어뒤집기
    자바의신절판
    객체지향
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
현주먹
엔티티 매핑
상단으로

티스토리툴바