[JPA 활용 1] Entity 매핑

홍정완·2022년 4월 6일
0

JPA

목록 보기
1/38
post-thumbnail

Entity 매핑


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



JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙인다.
@Entity가 붙은 클래스는 JPA가 관리하고, 엔터티라 부른다.



@Entity 어노테이션 적용 시,


  • 기본 생성자 필수(파라미터가 없는 public or protected 생성자)

    • JPA가 엔터티 객체를 생성할 때 기본 생성자를 사용하기 때문이다.
  • final, enum, interface, inner 클래스에 사용 X

  • 저장할 필드에 final 사용 X





@Table


  • @Table은 엔터티와 매핑할 테이블을 지정
    • 생략하면 매핑 한 엔터티 이름을 테이블 이름으로 사용



예시


@Entity
@Table(name = "USER") 
public class User

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

@Column(name = "NAME")
private String userName;

@Column(name = "age")
private Integer age;

// 자바 enum 타입은 @Enumerated 어노테이션으로 매핑
@Enumerated(EnumType.STRING)
private RoleType roleType;

// 자바의 날짜 타입은 @Temporal을 사용해서 매핑
@Temporal(TemporalType.TIMESTAMP)
private Date createDate;

@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;


// 회원을 설명하는 필드는 길이 제한이 없는 CLOB 타입으로 저장해야 합니다. 
@Lob
private String description;


public enum RoleType{
    ADMIN, USER
}



hibernate.ddl-auto 속성


옵션개념
create기존 테이블 삭제 후, 생성 -> DROP + CREATE
create-drop종료 시, 생성한 DDL을 제거 -> DROP + CREATE + DROP
update데이터베이스 테이블과 엔터티 매핑 정보를 비교해서 변경 사항 수정
validate매핑 정보를 비교해서 차이가 있으면 경고 후, 애플리케이션을 실행 X
DDL 수정 X
none자동 생성 기능을 사용하지 않으려면 hibernate.ddl-auto 속성 자체를 삭제 or
유효하지 않는 옵션 값을 주면 된다.



예시


spring:
  jpa:
    hibernate:
      ddl-auto: create 




기본키 매핑


직접 할당 : 기본 키를 어플리케이션에서 직접 할당
자동 생성 : 대리 키 사용


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

    • 자동 생성 전략은 다양하다
    • 데이터베이스 벤더마다 지원하는 방식이 다르기 때문이다.

IDENTITY 전략과 최적화


  • IDENTITY 전략은 데이터를 데이터베이스에 INSERT 한 후 기본 키값을 조회할 수 있다.
    따라서 엔터티에 식별자 값을 할당하려면 JPA는 추가로 데이터베이스를 조회해야 한다.



@Entity
@Table(name = "USER")
public class User{

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

}



Column 매핑


@Enumerated



예시


enum Role{
    ADMIN, USER
}

@Enumerated(EnumType.STRING)
private Role role;

member.setRole(Role.ADMIN);



@Access


  • JPA가 엔터티 테이블에 접근하는 방식 지정



  • 필드 접근 : AccessType.FIELD로 지정, 필드에 직접 접근, 필드 접근 권한이 private 이어도 접근 가능
    • @Id가 필드에 있으면 @Access 생략 가능

  • 프로퍼티 접근 : AccessType.PROPERTY로 지정, 접근자 Getter를 사용
    • @Id가 프로퍼티(get 메서드)에 있으면 @Access 생략 가능



예시


// 예시 코드는 @Access 생략 가능
@Entity
@Access(AccessType.PROPERTY)
public class User{
 
    private String id;

    private String data1;

    private String data2;

     @Id
     public String getId(){
         return id;
     }

     @Column
     public String getData1(){
         return data1;
     }

     public String getData2(){
         return data2;
     }
     
}
profile
습관이 전부다.

0개의 댓글