1️⃣ Entity 란?
- JPA를 사용해 데이터베이스의 테이블과 매핑되는 자바 클래스
- 이를 통해 데이터베이스와의 상호작용을 객체 지향적인 방식으로 처리할 수 있음
- 기본 생성자 필수 👉 JPA의 구현체 ( hibernate ) 가 지원하는 다양한 기능을 사용하기 위함
2️⃣ Hibernate entity 매핑하기
@Entity(name = "YourEntityName") : 객체와 테이블 매핑
- 클래스가 엔터티임을 나타내며 데이터베이스 테이블에 매핑된 영속성 클래스임을 나타낸다.
- @Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라고 불린다.
- 속성
- Name : JPA에서 사용할 엔티티 이름을 지정
@Id : 기본 키 매핑
- 엔티티 클래스의 주요 키(primary key)를 나타내기 위해 사용.
- 엔티티 클래스의 필드 중 하나에 @Id 어노테이션을 부여하면 해당 필드가 데이터베이스에서의 주요 키(primary key) 역할을 수행하게 된다.
- PK는 각 레코드를 고유하게 식별하는 데 사용되며, JPA는 이를 활용하여 엔티티를 관리하고 검색한다.
@GeneratedValue(strategy = GenerationType.IDENTITY)
- JPA에서 엔터티의 기본 키(primary key) 값을 자동으로 생성하기 위한 전략을 지정하는 어노테이션.
- 특히, 데이터베이스의 자동 증가(AUTO_INCREMENT)와 같은 방식으로 기본 키를 생성할 때 사용된다.
- 데이터베이스가 자동으로 고유한 기본 키 값을 할당하게 된다.
- 직접 할당 방법
- 자동 생성 방법
- IDENTITY : 기본 키 생성을 데이터베이스에 위임 (=AUTO_INREMENT) MySQL DB 선택 시 사용
- SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당 식별자 값을 획득한 후 영속성 컨텍스트에 저장 유일한 값을 순서대로 생성 오라클 DB, PostgreSQL 선택 시 사용
@Column(name = "userId") : 필드와 컬럼 매핑
- JPA에서 엔터티 클래스의 특정 필드에 매핑되는 데이터베이스 컬럼을 설정하는 어노테이션.
- 이를 통해 개발자는 엔터티 클래스의 필드와 실제 데이터베이스 테이블의 컬럼 간의 매핑을 지정할 수 있다.
- 속성
- name : 필드와 매핑할 테이블 컬럼 이름
- nullable : null 값의 허용 여부 설정
- Length : 문자 길이 제약조건, String 타입에만 사용 (default 255)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "userId")
private Long id;
보통 이렇게 묶어서 쓴다.
@Temporal : 날짜 타입 매핑
- TemporalType.DATE : 날짜, 데이터베이스 date 타입과 매핑 ( 2023-12-19 )
- TemporalType.TIME : 시간, 데이터베이스 date 타입과 매핑 ( 18:30:33 )
- TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 ( 2023-12-19 18:30:33 )
@Temporal(TemporalType.DATE)private Date date; // 날짜
@Temporal(TemporalType.TIME)private Date date; // 시간
@Temporal(TemporalType.TIMESTAMP)private Date date; // 날짜와 시간
@Lob : 데이터 베이스 BLOB, CLOB 타입과 매핑
- 매핑하는 필드 타입이 문자면 CLOB을 매핑, 나머지는 BLOB을 매핑
- CLOB : String, char[]
- BLOB : byte[]
@ManyToOne, @JoinColumn : 연관관계 매핑
@ManyToOne 단방향
@ManyToOne은 가장 많이 쓰이는 연관관계이다. 엔티티의 관계를 표현하고 FK 관리에 있어서 가장 자연스럽기 때문이다.
@JoinColumn 어노테이션과 함께 쓰이며, 이때 @JoinColumn은 엔티티 테이블에 FK 칼럼을 정의해준다.
@ManyToOne
@JoinColumn
private User user
3️⃣ Lombok 라이브러리 어노테이션
@Getter
- @Getter는 롬복(Lombok) 라이브러리에서 제공하는 어노테이션 중 하나.
- 클래스의 필드에 대한 Getter 메서드를 생성할 때 사용된다. 일반적인 Getter 메서드를 수동으로 작성하는 수고를 덜 수 있다.
@Setter
- 클래스의 필드에 대한 Setter 메서드를 생성할 때 사용된다.
- 일반적인 Setter 메서드를 수동으로 작성하는 수고를 덜 수 있다.
@AllArgsConstructor
- 롬복(Lombok) 라이브러리에서 제공하는 어노테이션 중 하나.
- 클래스의 모든 필드를 초기화하는 생성자를 자동으로 생성. 이 생성자는 모든 필드를 매개변수로 받아 객체를 초기화하는 역할을 한다.
@NoArgsConstructor
- 매개변수 없는 디폴트 생성자를 자동으로 생성.
4️⃣ 기록
공부한 것들을 토대로 DB설계 했던 것을 보며 entity를 작성해주었다.
아래는 그 일부의 모습이다.
( CommentEntity 에서의 오류는 복합기본키에 관한 내용이 아직 확실치 않아 수정중이기 때문에 그렇다. )
@ManyToOne 을 사용해 연관관계를 작성한 부분도 있는데
그 중 하나를 기록해보자면
게시글 엔터티와 좋아요 엔터티 이다.
위 사진처럼 LikeListEntity 테이블에 board 테이블과의 관계가 있고, boardId 참조키 컬럼이 있다면, JPA에서 이 관계를 매핑하기 위한 설정이 필요하다.
LikeListEntity 입장에서는 여러 board와 관련될 수 있으므로 @ManyToOne 어노테이션을 사용해 n:1 관계를 표시해주고, boardId 컬럼이 board 테이블의 기본 키와 연결되어 있으므로 @JoinColumn 어노테이션을 사용해서 이를 명시했다.
package com.example.demo.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity(name = "LikeList")
@Getter @Setter
@AllArgsConstructor
@NoArgsConstructor
public class LikeListEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "likeListId")
private Long likeListId;
@ManyToOne // ManyToOne 관계 설정
@JoinColumn(name = "boardId") // name은 참조키 컬럼 이름
private BoardEntity board;
@Column(name = "userId")
private Long userId;
@Column(name = "storeId")
private Long storeId;
}
따라서 이런 코드가 나오게 되었다.
'Project 댕린이집' 카테고리의 다른 글
Repository & Service 초기 작성 (0) | 2023.12.22 |
---|---|
Entity 수정 (0) | 2023.12.20 |
Controller 기본 설정 (1) | 2023.12.18 |
스프링부트 프로젝트 구조 / sts 파일 구조 오류 / ERD 설계 (0) | 2023.12.14 |
개인 프로젝트 시작 : 아이디어 / 와이어 프레임 (2) | 2023.12.05 |