도입
지난 시간에는 객체와 엔티티를 매핑하는 방법에 대하여 알아보았다. 객체와 엔티티를 매핑하였다면, 다음에는 각 객체가 가지고 있는 속성(필드)와 엔티티의 칼럼을 매핑해주어야 한다. 이번 시간에는 칼럼과 필드를 매핑하는 과정을 알아보도록 하겠다.
2022.01.07 - [Tech-Stack & Language/JPA] - JPA로 객체와 테이블 매핑하기
칼럼과 필드를 매핑하는 방법
칼럼과 필드를 매핑하는 경우도 동일하게 어노테이션을 사용하여 매핑을 한다. @Column, @Temporal, @Enumerated, @LOB, @Transient 총 5개의 annotation이 있다. 이번시간에는 각각을 자세히 알아보도록 하겠다.
@Column
Column은 칼럼을 매핑할 때 사용한다. @Column의 속성으로 name을 줄 수 있으며 name값을 입력하면 테이블에 입력된 값으로 필드가 매핑이 된다. 그 외에도 null값을 허용할지의 여부(nullable), 문자열이라면 길이를 얼마나 줄지(length) 등의 ddl세팅을 해줄 때도 사용한다.
@Temporal
java의 날짜타입인 java.util.Date와 java.util.Calendar의 값을 매핑할 때 사용한다. 하지만 자바8부터 제공되는 LocalDate, LocalDateTime 등을 사용하게 되는 경우에는 이를 생략해도 하이버네이트가 알아서 찾아서 매핑해준다.
@Enumerated
자바의 enum 타입을 매핑할 때 사용하며 반드시 EnumType을 String으로 받아서 사용을 해야한다. Ordinal로 받아서 사용하게 된다면 추후 개발이나 프로그램이 확장을 하며 Enum이 추가되거나 삭제될 때 DB에 굉장히 큰 장애가 생기게 된다.
이유를 알기위해 예시를 들어보겠다. 만약 Enum Type을 Ordinal로 받아서 사용하며 고객서비스를 구현을 하고 있다고 가정하겠다. 일반 고객을 1, 매니저를 2라고 설정을하고 DB에 저장이 되어있는 상태이다. 그런데 갑작스럽게 VIP 고객을 추가해주어야하는 문제점이 생겨 VIP를 Enum의 앞부분에 넣어주었다. 그러면 VIP가 1, 일반고객은 2, 매니저는 3이 된다. DB에서 기존에 일반고객으로 정의되어 있던 사람들은 갑자기 VIP가 된 상태이며 매니저는 일반고객이 되어버린 상황이 발생하게 된다.
따라서 반드시 String Type으로 EnumType을 설정해주어야 한다.(기본 값은 Ordinal이기 때문에 반드시 변경해주어야한다.)
@LOB
LOB는 Large OBject의 약자로 매우 큰 데이터(텍스트)와 같은 정보를 처리해주는 것이다. DB에 저장되는 다양한 타입의 데이터중에서 구조화되지 않은 데이터를 처리하기 위한 용도로 사용된다.
매핑하는 필드 타입이 문자라면 CLOB으로 매핑되며 그 외에는 BLOB으로 매핑이 된다.
@Transient
필드매핑을 하고싶지 않을 경우 붙여주는 annotation이다. 이것이 붙어 있으면 DB에 저장 및 조회를 하지 않고 테이블의 칼럼과 매핑되지 않는다.
이 글은 김영한님의 강의 "자바 ORM 표준 JPA 프로그래밍"를 공부한 후 작성한 글 입니다.
'Back-end > JPA' 카테고리의 다른 글
JPA 연관관계 매핑하기 (0) | 2022.01.15 |
---|---|
JPA 기본 키 매핑하기 (0) | 2022.01.12 |
JPA로 객체와 테이블 매핑하기 (0) | 2022.01.07 |
JPA 영속성 컨텍스트란? (0) | 2022.01.03 |
JPA로 CRUD하기 (0) | 2021.12.30 |