JPA 엔티티(Entity) 매핑

 

 

➤ 엔티티 매핑

 

JPA의 매핑 애너테이션을 이용하면 데이터베이스의 테이블과 엔티티 클래스를 매핑할 수 있다.

 

 

▶️ @Entity

  • 엔티티 클래스와 테이블을 자동으로 매핑해준다.
  • 이 애너테이션을 붙이면 JPA 관리 대상 엔티티가 된다.
  • name attribute를 설정하지 않으면 기본적으로 클래스명과 같은 테이블 명을 매핑한다.
  • 테이블 명과 엔티티 클래스 명이 다를 경우 name attribute를 설정해주어야 한다.

 

 

▶️ @Table

  • 데이터베이스의 테이블 이름을 설정할 때 사용한다.
  • name 애트리뷰트를 설정하지 않으면 기본값으로 클래스 이름을 테이블 이름으로 사용한다.
  • @Table 은 옵션이고 추가하지 않을 경우 클래스 이름을 테이블 이름으로 사용한다.

 

 

 

⚠️ 주의 사항

  • @Table ➡️ 옵션
  • @Entity, @Id ➡️ 필수
  • 파라미터가 없는 기본 생성자는 필수로 추가해주자

 

 

➤ 기본키 매핑

 

데이터베이스 테이블에 기본키 설정은 필수이다.

JPA에서 기본키 매핑은 @Id 를 필드에 추가해주면 되는데 JPA에서 어떤 방식으로 기본키를 생성할 것인지에 대한 다양한 전략을 지원해준다.

 

✅ 기본키 직접 할당

애플리케이션 코드 상에서 기본키를 직접 할당해주는 방식이다.

 

 

✅ 기본키 자동 생성

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

 

  • IDENTITY
    • 기본키 생성을 데이터베이스에 위임한다.
    • 데이터베이스에서 기본키를 생성해주는 대표적인 방식은 MySQL의 AUTO_INCREMENT 기능으로 자동 증가 숫자를 기본키로 사용하는 방식이 있다.
  • SEQUENCE
    • 데이터베이스에서 제공하는 시퀀스를 사용해서 기본키를 생성하는 전략이다.
  • TABLE
    • 별도의 키 생성 테이블을 사용하는 전략이다.
  • AUTO
    • JPA가 데이터 베이스 Dialect에 따라서 적절한 전략을 자동으로 선택한다.

 

 

TABLE 전략은 키 생성 전용 테이블을 별도로 만들어야 되고, 키를 조회하고 업데이트할 때 쿼리를 전송해야하기 때문에 성능면에서 떨어진다.

 

https://docs.jboss.org/hibernate/orm/5.6/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators-table

 

Hibernate ORM 5.6.10.Final User Guide

Fetching, essentially, is the process of grabbing data from the database and making it available to the application. Tuning how an application does fetching is one of the biggest factors in determining how an application will perform. Fetching too much dat

docs.jboss.org

 

 

 

▶️ 참고) Dialect란?

 

Dialect는 JDBC 타입과 SQL 타입 간에 연결하는 역할을 한다.

Dialect를 사용하면 Hibernate 가 특정 관계형 데이터베이스에 최적화된 SQL을 생성할 수 있다.

Hibernate Dialect 클래스를 기반으로 특정 데이터베이스에 대한 쿼리를 만든다.

hibernate dialect 는 프레임워크에 어떻게 hibernate 쿼리를 SQL 쿼리로 바꿀 지에 대한 정보를 제공해준다.

 

  • 적절한 SQL 쿼리를 생성한다.
  • 애플리케이션이 두 개 이상의 데이터베이스와 연결되어 있을 경우 특정 데이터베이스와 상호작용할 수 있다.
  • 구성 파일에 지정되지 않은 경우에도 데이터베이스 소프트웨어를 기반으로 hibernate 구성 파일 속성에 대한 기본값을 설정한다.

 

https://www.geeksforgeeks.org/hibernate-sql-dialects/

 

Hibernate - SQL Dialects - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

 

 

 

➤ 필드(멤버 변수)와 칼럼간의 매핑

 

 

▶️ @Column

 

  • 필드와 데이터베이스의 칼럼을 매핑해주는 애너테이션이다.
  • 이 애너테이션이 없고 필드만 정의되어 있다면 JPA는 기본적으로 이 필드가 테이블의 칼럼과 매핑되는 필드라고 간주하고 @Column 애너테이션에 사용되는 attribute 값은 모두 디폴트로 적용된다.

Attribute

  • nullable
    • default : true
    • 칼럼에 null을 허용할지 여부를 설정
  • updatable
    • 등록한 이후 칼럼 데이터를 수정할 수 있는지 여부를 지정한다.
    • default : true
  • unique
    • 하나의 칼럼에 unique 제약 조건을 설정한다. (중복 허용 x)
    • default : false
  • length
    • 칼럼에 저장할 수 있는 문자 길이를 지정한다.
    • default : 255
  • name
    • default : 필드 명
    • 필드와 매핑되는 칼럼의 이름이 필드명과 다를 경우 지정해 줄 수 있다.

 

 

▶️ @Temporal

 

  • java.util.Date, java.util.Calendar 타입을 매핑하기 위해서 이 애너테이션을 추가해야 한다.
  • LocalDate, LocalDateTime 타입일 경우는 생략가능하다.

 

 

 

▶️ @Transient

 

  • 이 애너테이션을 필드에 추가하면 테이블 칼럼과 매핑하지 않는다.
  • 데이터베이스에 저장하지 않고 조회할 때도 매핑되지 않는다.
  • 주로 임시 데이터를 메모리에서 사용하기위한 용도로 사용된다.

 

 

▶️ @Enumerated

 

  • enum 타입과 칼럼을 매핑할 때 사용한다.
  • Attribute
    • EnumType.ORDINAL : enum의 순서를 나타내는 숫자를 테이블에 저장한다.
    • EnumType.STRING : enum 이름을 테이블에 저장한다.

 

⚠️ 주의

EnumType.ORDINAL 로 지정할 경우

기존에 정의되어 있는 enum 사이에 새로운 enum을 추가한다면 그때부터 테이블에 이미 저장되어 있는 enum 순서 번호와 enum 에 정의되어 있는 순서가 일치하지 않게 되는 문제가 발생한다.

 

 

 

@Column doc

https://docs.oracle.com/javaee/7/api/

 

Java(TM) EE 7 Specification APIs

 

docs.oracle.com

 

 

 

 

 

엔티티 간의 연관관계 매핑

 

 

➤ 연관관계 매핑이란?

 

엔티티 클래스 간의 관계를 만들어 주는 것이다.

 

엔티티 간의 참조할 수 있는 객체수에 따라서

일대다(1:N), 다대일(N:1), 다대다(N:N), 일대일(1:1) 관계로 나눌 수 있다.

 

 

➤ 단방향 연관 관계

 

한 쪽 클래스만 다른 쪽 클래스의 참조 정보를 가지고 있는 관계

 

 

➤ 양방향 연관 관계

 

양 쪽 클래스 모두 서로의 객체를 참조 정보를 가지고 있는 관계

 

JPA는 단방향, 양방향 연관 관계 모두 지원하지만 Spring Data JDBC는 단방향 연관 관계만 지원한다.

 

 

➤ 일대다(1:N) 단방향 연관 관계

 

일(1)에 해당하는 클래스가 다(N)에 해당하는 객체를 List 등을 사용해서 참조할 수 있다.

일대다 단방향 매핑은 잘 사용하지 않는다.

 

 

➤ 다대일(N:1) 연관 관계

 

다(N)에 해당하는 클래스가 일(1)에 해당하는 객체를 참조할 수 있는 관계를 의미한다.

 

▶️ @ManyToOne

 

  • 이 애너테이션으로 다대일 관계를 명시한다.
  • @JoinColumn(name = “MEMBER_ID”)
    • 매핑하는 테이블의 외래키(부모 테이블의 기본키)에 해당하는 칼럼명을 적어준다.

 

 

➤ 일대다(1:N) 연관 관계

 

다대일 연관관계를 설정한 이후에 자식 테이블에도 일대다 관계를 만들어줘서 양방향 관계를 만들어 준다.

 

 

▶️ @OneToMany

 

  • 이 애너테이션을 부모테이블에 추가하여 일대다 관계를 만들어준다.

Attribute

  • mappedBy
    • 값은 관계를 소유하고 있는 필드(N(다)에 해당하는 필드)를 지정한다.
    • mappedBy는 참조할 대상이 있어야 한다.
    • 일대다 단방향 매핑의 경우에는 필요하지 않다.

 

 

➤ 다대다(N:N) 연관 관계

 

다대다는 관계는 중간에 테이블을 하나 추가해서 두 개의 일대다 관계로 만들어주는 것이 일반적이다.

 

 

➤ 엔티티 간의 연관 관계 매핑 권장 방법

 

  • 일대다 매핑은 사용하지 않는다.
  • 제일 먼저 다대일 단방향 매핑부터 적용한다.
  • 다대일 단방향 매핑을 통해 객체 그래프 탐색으로 조회할 수 없는 정보가 있을 경우, 양방향 매핑을 적용한다.

 

 

 

➤ Cascading

 

부모테이블에서 자식테이블로 데이터의 상태 변화를 전파(?)할 때 사용한다.

JPA javax.persistence.CacadeType 에 정의되어 있다.

부모 테이블의 @OneToMany 애너테이션에 Attribute로 추가한다.

 

@OneToOne(mappedBy = "member", cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
private Stamp stamp;

 

Attribute

  • ALL
  • PERSIST
  • MERGE
  • REMOVE
  • REFRESH
  • DETACH

 

 

 

 

읽어주셔서 감사합니다.

오개념에 대한 지적은 늘 환영입니다. 😄