JPA 엔티티 매핑

zwon·2023년 10월 2일
0

JPA

목록 보기
3/9

JPA에서 객체와 테이블을 어떻게 매핑하는지 자세히 알아보자.


객체와 테이블 매핑

  • 객체와 테이블을 매핑할 떄는 @Entity 또는 @Table을 사용한다.
  • @Entity가 붙은 클래스는 JPA가 관리하는 엔티티라는 것을 의미해서 JPA를 사용해서 테이블과 매핑할 클래스에는 필수 어노테이션이다.

@Entity를 사용할 때 주의 할 점

  • 기본 생성자 필수
  • final 클래스 enum, interface, inner클래스 사용 X
  • 저장할 필드에 final 사용X
@Entity
public class Member {
	@Id
    private Long id;
    private String name;
    
    public Member() {
    }
	
}

만약 DB에 있는 테이블명고 객체명이 다른데 매핑을 해야한다면 @Table을 사용해주면 된다.

@Entity
@Table(name="User")
public class Member {
	@Id
    private Long id;
    private String name;
    
    public Member() {
    }
	
}
  • User테이블과 Member객체를 매핑한다.

객체 필드와 테이블 컬럼 매핑

@Column

  • name속성은 @Table처럼 DB 컬러명과 객체 필드명이 다를 경우 name속성을 사용해서 매핑할 수 있다.
@Entity
public class Member {
	@Id
    private Long id;
    
    @Column(name="username")
    private String name;
    
    public Member() {
    }
}

@Column 속성

  • name : 필드와 매핑할 테이블의 컬럼명
@Column(name="username")
    private String name;
  • insertable, updatable : 컬럼(필드)를 수정했을 때 DB에 insert, update를 할껀지 말껀지를 지정. 기본값은 TRUE이다.
@Column(insertable = false, updatable = true)
private String name;
  • nullable : NOT NULL 제약조건, 기본값이 true이고 false로 지정 시 not null 제약조건이 걸린다.
@Column(nallable = false)
private String name;
  • unique : 유니크 제약조건, 하지만 컬럼에 바로 지정하는 것보다 @Table 속성에 지정하는 것을 선호함.
@Entity
// @Column(unique = true)와는 다르게 이름 지정 가능
@Table(uniqueConstraints = ...) 
public class Member {
	@Id
    private Long id;
    
    @Column(unique = true) // 유니크 제약조건을 만들어주지만 랜덤이름
    private String name;
    
    public Member() {
    }
}
  • length : 문자 길이 제약조건
@Column(length = 140) // = varchar(140)
private String name;
  • columnDefinition : 컬럼 정보 직접 지정
@Column(columnDefinition = "varchar(180) default 'OK'")
private String name;

등 여러 가지 속성이 있다.

@Enumerated

  • 클래스에는 enum타입인데 DB는 보통 enum타입이 없어서 이럴 경우 @Enumerated 어노테이션을 사용하면 된다.
public enum Roletype {
	USER, ADMIN
}
@Entity
public class Member {
	@Id
    private Long id;
    
    @Column(name="username")
    private String name;
    
    @Enumerated(EnumType.STRING)
    private Roletype type;
    
    public Member() {
    }
}
  • EnumType에는 ORDINAL과 STRING이 있는데 EnumType.STRING을 사용하는 것을 추천한다.
    • ORDINAL : enum 순서를 DB에 저장
    • STRING : enum 이름을 DB에 저장
  • default값이 ORDINAL이라서 STRING을 사용할려면 직접 타입을 지정해줘야한다.

@Temporal

  • 날짜를 나타낼 때 사용하는 어노테이션인데 자바8의 LocalDate, LocalDateTime을 사용할 때는 생략이 가능하다.

@Lob

  • DB의 varchar를 넘어서는 큰 내용을 넣고싶을 땐 @Lob을 사용한다.
  • 매핑하는 필드의 타입이 문자면 CLOB, 나머지는 BLOB과 매핑
@Entity
public class Member {
	@Id
    private Long id;
    
    @Lob
    public String description;
    
    public Member() {
    }
	
}

@Transient

  • 특정 필드를 DB 컬럼과 매핑하고 싶지 않을 때 사용하는 어노테이션이다.
@Entity
public class Member {
	@Id
    private Long id;
    
    @Transient
    public String etc;
    
    public Member() {
    }
}

기본 키 PK 매핑

@Id

  • 기본 키로 지정할 컬럼(필드)에 붙여주면 되고 직접 ID를 할당해줄 때 사용한다.
@Entity
public class Member {
	@Id
    private Long id;
    
    public Member() {
    }
}

@GeneratedValue

  • 기본 키 자동 생성하게 해주는 어노테이션

@GeneratedValue 전략

AUTO

  • 기본값이고 DB 방언에 맞추어서 자동으로 전략 생성
@Entity
public class Member {
	@Id @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    
    ...
}

IDENTITY

  • 기본 키 생성을 DB에 위임하는 전략
  • MySQL, PostgreSQL 등에서 주로 사용
  • JPA는 보통 트랜잭션 커밋 시점에 쿼리문을 DB에 날린다. 그래서 이 전략은 쿼리문이 DB에 날라가야만 PK값을 알 수 있다.
  • 그래서 이 전략을 사용할 때에는 em.persist() 시점에 insert sql 쿼리문을 실행하고 DB에서 PK값을 조회할 수 있다.
@Entity
public class Member {
	@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    ...
}

SEQUENCE

TABLE

  • 두 전략은 추후에 정리하겠다.

JPA를 사용하면서 직접 매핑을 해보면서 익숙해져야한다.


자바 ORM 표준 JPA 프로그래밍-기본편을 학습하면서 정리한 블로그입니다.

profile
Backend 관련 지식을 정리하는 Back과사전

0개의 댓글