❑ 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 전략은 키 생성 전용 테이블을 별도로 만들어야 되고, 키를 조회하고 업데이트할 때 쿼리를 전송해야하기 때문에 성능면에서 떨어진다.
▶️ 참고) Dialect란?
Dialect는 JDBC 타입과 SQL 타입 간에 연결하는 역할을 한다.
Dialect를 사용하면 Hibernate 가 특정 관계형 데이터베이스에 최적화된 SQL을 생성할 수 있다.
Hibernate Dialect 클래스를 기반으로 특정 데이터베이스에 대한 쿼리를 만든다.
hibernate dialect 는 프레임워크에 어떻게 hibernate 쿼리를 SQL 쿼리로 바꿀 지에 대한 정보를 제공해준다.
- 적절한 SQL 쿼리를 생성한다.
- 애플리케이션이 두 개 이상의 데이터베이스와 연결되어 있을 경우 특정 데이터베이스와 상호작용할 수 있다.
- 구성 파일에 지정되지 않은 경우에도 데이터베이스 소프트웨어를 기반으로 hibernate 구성 파일 속성에 대한 기본값을 설정한다.
https://www.geeksforgeeks.org/hibernate-sql-dialects/
➤ 필드(멤버 변수)와 칼럼간의 매핑
▶️ @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/
❑ 엔티티 간의 연관관계 매핑
➤ 연관관계 매핑이란?
엔티티 클래스 간의 관계를 만들어 주는 것이다.
엔티티 간의 참조할 수 있는 객체수에 따라서
일대다(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
읽어주셔서 감사합니다.
오개념에 대한 지적은 늘 환영입니다. 😄
'TIL(Today I Learned)' 카테고리의 다른 글
7/8 (금) [Spring MVC] 트랜잭션(Transaction) (0) | 2022.07.16 |
---|---|
7/7 (목) [Spring MVC] JPA 기반 데이터 액세스 계층 3️⃣ - Spring Data JPA (0) | 2022.07.16 |
7/5 (화) [Spring MVC] JPA 기반 데이터 액세스 계층 1️⃣ - JPA란? (0) | 2022.07.14 |
7/4 (월) [Spring MVC] JDBC 기반 데이터 액세스 계층 2️⃣ (0) | 2022.07.12 |
7/1 (금) [Spring MVC] JDBC 기반 데이터 액세스 계층 1️⃣ (0) | 2022.07.09 |