Search

객체와 관계형 데이터베이스 매핑

Tags

개요

JPA를 사용하기 위해서 객체와 관계형 데이터 매핑은 필수인데요, 이번 포스팅에서는 매핑에 필요한 어노테이션들과 함께 조금 더 깊게 알아보면 좋을 내용들을 작성했습니다.

1. 실제 엔티티 코드는 어떻게 생겼을까

예제 코드를 통해 각 어노테이션이 어떤 역할을 하는지 알아보도록 하겠습니다.
import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import lombok.Builder; import lombok.NoArgsConstructor; @Entity @Table(name = "member") @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "memberId") private Long id; @Column(nullable = false, length = 100) private String name; @Column(nullable = false) @Enumerated(EnumType.STRING) private MemberRole role; public enum MemberRole { USER, ADMIN } @Builder public Member(Long id, String name, MemberRole role) { this.id = id; this.name = name; this.role = role; } }
Java
복사

@Entity

@Entity가 붙은 클래스는 JPA가 관리하며 엔티티 혹은 엔티티 클래스라고 불립니다.
JPA를 사용해서 객체와 관계형 데이터 베이스를 연결하고자 한다면 @Entity 어노테이션은 필수로 붙여줘야 합니다.
주의 할 점은 이 때 기본 생성자를 필수로 붙여줘야 한다는 점입니다.
 왜 기본 생성자가 반드시 필요할까요?
이를 알기 위해서는 Java Reflection에 대한 이해가 필요합니다.
손쉽게 객체를 생성하기 위해서 기본 생성자를 생성하고 필드 값들을 주입하는 것

@Table

엔티티가 매핑할 테이블을 지정해줍니다. 즉 관계형 데이터 베이스 안에서의 테이블 이름 입니다.
위 예제에서는 @Table(name = “Member”) 라고 되어 있는걸 확인할 수 있을텐데요, 이는 데이터 베이스의 Member 테이블과 매핑한다는 의미입니다.
만약 이를 생략한다면 엔티티 명을 테이블 명으로 사용합니다.
이 외에도 다양한 속성들이 존재합니다
Catalog : catalog 기능이 있는 데이터 베이스에서 catalog 를 매핑
Schema : schema 기능이 있는 데이터 베이스에서 schema를 매핑
uniqueConstraints : DDL 생성 시 유니크 제약조건을 만듦. 스키마 자동 생성 기능을 사용해서 DDL을 만들 때만 사용

@NoArgsConstructor

기본 생성자 주입을 위해 사용하는 어노테이션 입니다.
여기서 왜 AccessLevel.PROTECTED로 설정하는지 의문을 가지실 수 있는데요 이와 관련해서 짧게 나마 얘기해보고자 합니다.
위에서 언급했듯이 Java Reflection을 통해서 객체를 생성하려면 PUBLIC 또는 PROTECTED의 접근 제한을 가진 기본 생성자가 있어야 합니다.
하지만 PUBLIC으로 생성했을 경우 무분별한 객체 생성이 발생할 수 있기 때문에 PROTECTED로 접근 범위를 줄여주는 것이 좋습니다.

@GeneratedValue

기본 키 생성 전략입니다. 속성에 따라 기본 키가 다르게 할당 됩니다.
(만약 해당 어노테이션이 없자면 직접 할당입니다.)
자동 생성 전략 네 가지는 다음과 같습니다.
IDENTITY : 기본 키 생성을 데이터 베이스에 위임, ID 값을 알아서 AUTO_INCREMENT
SEQUENCE : 데이터베이스 Sequence Object를 사용. 유일한 값을 순서대로 생성
TABLE : 키 생성 전용 테이블을 하나 만들어서 데이터베이스 Sequence를 흉내냄
AUTO : 방언에 따라 위 세 가지 전략을 자동으로 채택

@Column

객체 필드를 테이블의 컬럼에 매핑시켜주는 어노테이션입니다.
주요 속성은 다음과 같습니다.
name : 필드와 매핑할 테이블의 컬럼 이름을 지정
unique : 하나의 컬럼에 간단한 유니크 제약 조건을 지정
nullable : DDL 생성 시 null 값의 허용 여부를 결정. (false = NOT NULL)

@Enumerated(EnumType.STRING)

Enum 값을 인덱스가 아닌 텍스트 값 그대로 저장하고 싶을 때 위 어노테이션을 사용합니다.