1. 엔티티(Entity)란?
1-1. 엔티티 개념
- 엔티티(Entity)는 데이터베이스의 테이블과 1:1로 매핑되는 객체로, 비즈니스 도메인을 표현하는 핵심 개념입니다.
- 엔티티는 고유한 식별자(Primary Key)를 가져야 하며 일반적으로 데이터 저장 및 조회를 위한 단위로 사용됩니다.
1-2. 엔티티와 테이블의 관계
- 관계형 데이터베이스(RDBMS)에서 엔티티는 테이블(Table), 속성(Attribute)은 컬럼(Column)에 대응됩니다.
- 객체지향 프로그래밍에서는 엔티티가 도메인 모델을 표현하고 JPA 같은 ORM(Object-Relational Mapping)을 사용하여 이를 테이블과 매핑합니다.
2. 엔티티 설계 방법
2-1. 엔티티 클래스 기본 구조

2-2. 기본 키(Primary Key) 설정
- @Id : 엔티티의 기본 키(Primary Key) 설정
- @GeneratedValue : 기본 키 자동 생성 전략 설정
- IDENTITY : 데이터베이스가 AUTO_INCREMENT 방식으로 키 생성
- SEQUENCE : 특정 DB 시퀀스 활용 (Oracle, PostgreSQL)
- TABLE : 키를 저장하는 별도 테이블 생성
- AUTO : 데이터베이스 방언에 맞게 자동 선택
2-2. 연관관계 매핑
JPA를 사용하면 객체 간의 관계를 데이터베이스의 관계와 매핑할 수 있습니다.
1)1:1 관계 (@OneToOne)

2) 1:N (단방향) (@OneToMany)

3) N:1 관계 (@ManyToOne)

4) N:N 관계 (@ManyToMany)

그러나 N:N 관계 또는 다대다 관계의 경우 중간 테이블을 컨트롤하기 어렵다는 단점이 있어서 거의 반드시 중간 테이블을 만들어줘야 합니다.

그렇다면 왜 N:N 관계를 사용하면 안되는 걸까요? 그 이유는 연결 테이블에 추가 컬럼을 넣을 수 없기 때문입니다. 실무에서 연결테이블에 컬럼을 추가하는 경우가 많아서 잘 사용하지 않는다고 합니다. 예를 들어 학생(Student)과 강의(Course)의 관계를 나타내는 테이블에서 등록일, 성적, 상태 같은 필드를 추가해야 할 수도 있습니다. 때문에 다대다 관계를 표현하고 싶으면 중간 엔티티를 생성하여 연결 테이블을 추가하는 것이 좋은 방식입니다.
FetchType.LAZY (지연 로딩)란?
JPA에서 연관관계를 설정할 때, 데이터를 어떻게 로딩할 것인지 결정하는 전략을 FetchType을 사용하여 설정할 수 있습니다. JPA는 2가지 전략을 제공하는데
- 즉시 로딩 (EAGER, 기본값) → 연관된 엔티티를 즉시 조회
- 지연 로딩 (LAZY, 권장) → 연관된 엔티티를 실제로 사용할 때 조회 (권장)
FetchType.LAZY 전략은 필요할 때만 데이터베이스에서 조회하는 방식으로 성능 최적화를 위해 실무에서는 대부분 LAZY 사용이 권장됩니다.

위의 그림에서 member.getTeam()을 호출하는 순간에만 Team 정보를 가져오는 쿼리가 실행됩니다. 즉 member.getTeam()을 사용하지 않으면 Team에 대한 쿼리는 실행되지 않기 때문에 불필요한 쿼리를 사용하지 않는 장점이 있습니다.
반대로 FetchType.EAGER 전략은 연관된 엔티티를 즉시 가져오기 때문에 N+1 문제가 발생할 가능성이 높아집니다.
'백엔드 스터디' 카테고리의 다른 글
| 스프링 OAuth2 로그인 구현하기 2 (4) | 2025.08.09 |
|---|---|
| 스프링 OAuth2 로그인 구현하기 1 (2) | 2025.08.04 |
| 디스패처 서블릿이란? (0) | 2025.04.02 |
| 서블릿이란? (0) | 2025.04.01 |
| RESTful API 란 (0) | 2025.03.25 |