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 : 연관관계 매핑

https://velog.io/@goniieee/JPA-OneToMany-ManyToOne으로-연관관계-관리하기

 

@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;
	
}

 

따라서 이런 코드가 나오게 되었다.

xoo | 수진