메뉴 닫기

Java JPA 기초, @Entity와 @Id로 배우는 엔티티 매핑 완벽 가이드

Java JPA 기초, @Entity와 @Id로 배우는 엔티티 매핑 완벽 가이드

🚀 JPA 입문자를 위한 @Entity와 @Id 사용법, 엔티티 매핑의 모든 것을 쉽게 설명합니다

JPA(Java Persistence API)는 자바 애플리케이션에서 데이터베이스를 더 직관적이고 객체지향적으로 다룰 수 있도록 해주는 표준 ORM 기술입니다.
하지만 JPA를 처음 접하는 분들은 엔티티 매핑 개념과 @Entity, @Id 같은 기본 어노테이션 사용법에서 막히는 경우가 많습니다.
저 역시 처음에는 데이터베이스 테이블과 객체를 연결하는 방식이 낯설었지만, 핵심 원리를 이해하니 훨씬 편리하게 개발할 수 있었습니다.
이번 글에서는 JPA 기초 중에서도 가장 중요한 엔티티 매핑 과정을 쉽게 설명하고, 실전 예제까지 함께 소개하겠습니다.

특히 @Entity를 이용해 자바 클래스를 데이터베이스 테이블과 매핑하는 방법, 그리고 @Id로 기본 키를 설정하는 규칙과 주의사항을 정리할 예정입니다.
이 글을 읽고 나면 JPA에서 엔티티를 선언하고 매핑하는 기본 틀이 완전히 잡히실 겁니다.
또한 Hibernate를 비롯한 주요 구현체에서의 동작 방식도 함께 다뤄, 실제 프로젝트에 바로 적용할 수 있도록 도와드리겠습니다.



🔗 JPA와 엔티티 매핑 기본 개념

JPA(Java Persistence API)는 자바 객체와 관계형 데이터베이스 간의 데이터를 매핑하고 관리하기 위한 표준 ORM(Object-Relational Mapping) 기술입니다.
기존 JDBC 방식처럼 SQL 쿼리를 직접 작성하지 않고, 객체 중심으로 데이터베이스 작업을 처리할 수 있게 해주죠.
이를 통해 개발자는 객체지향적인 설계와 데이터베이스 연동을 자연스럽게 결합할 수 있습니다.

JPA의 핵심은 자바 클래스와 데이터베이스 테이블 간의 엔티티(Entity) 매핑입니다.
즉, 데이터베이스의 한 테이블이 자바 클래스 하나와 연결되고, 테이블의 각 컬럼이 클래스의 필드와 매칭됩니다.
이 과정을 통해 자바 객체를 데이터베이스에 저장하거나 조회할 때 SQL을 직접 작성하지 않아도 되며, JPA가 내부적으로 적절한 SQL을 생성해 실행합니다.

📌 엔티티 매핑이 중요한 이유

엔티티 매핑은 단순히 테이블과 클래스를 연결하는 작업을 넘어, 애플리케이션의 유지보수성과 확장성을 높이는 핵심 과정입니다.
클래스 구조를 변경하면 매핑 설정만 수정해 데이터베이스와 동기화할 수 있어, 대규모 프로젝트에서도 안정적으로 데이터 모델을 관리할 수 있습니다.
또한 엔티티 매핑 규칙을 잘 지키면 데이터 무결성과 성능 최적화에도 유리합니다.

💬 엔티티 매핑은 JPA의 시작이자 끝이라고 할 수 있습니다. 올바른 매핑 구조를 잡아두면 이후 개발이 훨씬 수월해집니다.

  • 🛠️클래스와 테이블 간 매핑 규칙 이해
  • ⚙️@Entity@Id 기본 용도 숙지
  • 🔌매핑 전략과 키 생성 정책 선택

🛠️ @Entity 어노테이션 사용법

@Entity는 JPA에서 해당 클래스가 데이터베이스의 테이블과 매핑된 엔티티임을 나타내는 어노테이션입니다.
이 어노테이션이 선언된 클래스는 JPA의 관리 대상이 되어, 데이터베이스 CRUD 작업을 객체 지향적으로 수행할 수 있게 됩니다.
즉, @Entity를 붙여야만 해당 클래스가 영속성 컨텍스트에 의해 관리될 수 있습니다.

기본적으로 @Entity를 선언할 때 클래스에는 다음과 같은 규칙을 지켜야 합니다.
기본 생성자가 반드시 존재해야 하며, final 클래스나 final 메서드는 피하는 것이 좋습니다.
또한, 필드는 private 또는 protected로 선언하고, getter/setter를 통해 접근하도록 하는 것이 JPA 표준 가이드라인입니다.

📌 @Entity 속성과 옵션

@Entity에는 name 속성을 지정해 엔티티의 이름을 변경할 수 있습니다.
기본적으로 엔티티 이름은 클래스명과 동일하지만, name 속성을 사용하면 JPQL 쿼리에서 다른 이름을 사용할 수 있죠.
이는 데이터베이스 테이블명과 혼동을 피하거나, 비즈니스 용어에 맞춘 명명 규칙을 적용할 때 유용합니다.

CODE BLOCK
import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity(name = "MemberEntity")
public class Member {

    @Id
    private Long id;
    private String name;

    // 기본 생성자
    public Member() {}

    public Member(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    // Getter & Setter
}

💎 핵심 포인트:
@Entity는 클래스 레벨에 선언해야 하며, 최소 한 개의 @Id 필드가 반드시 포함되어야 합니다. 그렇지 않으면 애플리케이션 실행 시 매핑 예외가 발생합니다.



⚙️ @Id로 기본 키 매핑하기

@Id 어노테이션은 엔티티의 필드를 데이터베이스 테이블의 기본 키(Primary Key)와 매핑할 때 사용합니다.
JPA에서 엔티티를 저장하려면 반드시 식별자가 필요하며, 이 식별자는 데이터베이스에서 각 레코드를 유일하게 구분하는 값입니다.
@Id가 선언되지 않은 엔티티는 JPA가 관리할 수 없습니다.

기본 키를 설정할 때는 단순히 필드에 @Id를 붙이는 것 외에도, 키 생성 전략을 함께 고려해야 합니다.
키 값은 직접 애플리케이션에서 지정할 수도 있고, 데이터베이스나 JPA가 자동으로 생성하도록 할 수도 있습니다.
대표적인 자동 생성 전략은 IDENTITY, SEQUENCE, TABLE 전략이 있습니다.

📌 @Id 필드 선언 예시

CODE BLOCK
import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class Product {

    @Id
    private String productId;
    private String name;
    private int price;

    public Product() {}

    public Product(String productId, String name, int price) {
        this.productId = productId;
        this.name = name;
        this.price = price;
    }

    // Getter & Setter
}

💎 핵심 포인트:
기본 키는 불변성을 유지해야 하며, 변경하면 안 됩니다. 특히 자동 생성 전략을 사용할 경우, 엔티티를 저장하기 전에는 식별자가 null 상태여야 합니다.

⚠️ 주의: 복합 키를 사용하는 경우 @Id만으로는 매핑이 어렵기 때문에 @IdClass나 @EmbeddedId를 사용해야 합니다.

🔌 기본 키 생성 전략 이해하기

JPA에서 @Id를 사용할 때는 기본 키를 어떤 방식으로 생성할지도 함께 고려해야 합니다.
이를 위해 @GeneratedValue 어노테이션을 사용하며, 전략에 따라 키 생성 방식이 달라집니다.
대표적인 생성 전략은 다음과 같습니다.

전략 설명
IDENTITY 데이터베이스의 AUTO_INCREMENT 기능을 사용해 키를 생성합니다. 엔티티 저장 시 즉시 INSERT 쿼리가 실행됩니다.
SEQUENCE 시퀀스를 지원하는 DB에서 별도의 시퀀스 객체를 이용해 키를 생성합니다. @SequenceGenerator와 함께 사용됩니다.
TABLE 키 생성 전용 테이블을 만들어 키 값을 관리합니다. 모든 DB에서 동일하게 동작하지만 성능이 다소 떨어질 수 있습니다.
AUTO DB에 따라 적절한 전략을 JPA가 자동으로 선택합니다.

📌 기본 키 생성 전략 예시

CODE BLOCK
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class Order {

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

    private String orderNumber;
}

💎 핵심 포인트:
전략 선택은 데이터베이스 특성과 프로젝트 요구사항에 따라 달라집니다. IDENTITY는 간단하지만, 배치 INSERT에 불리할 수 있습니다.



💡 실전 예제: @Entity와 @Id 적용 코드

지금까지 살펴본 @Entity@Id 개념을 종합해, 실제로 JPA에서 엔티티를 선언하고 기본 키를 설정하는 예제를 만들어 보겠습니다.
아래 예제는 회원(Member) 엔티티를 생성하고, IDENTITY 전략을 사용해 기본 키를 자동 생성하는 방식입니다.

CODE BLOCK
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class Member {

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

    private String username;
    private String email;

    public Member() {}

    public Member(String username, String email) {
        this.username = username;
        this.email = email;
    }

    // Getter & Setter
}

📌 실행 및 확인

이 엔티티를 Spring Data JPA 저장소를 통해 저장하면, JPA가 자동으로 INSERT 쿼리를 생성해 데이터베이스에 레코드를 추가합니다.
저장 후에는 id 필드가 DB에서 생성된 기본 키 값으로 자동 채워집니다.
이는 JPA의 영속성 컨텍스트가 엔티티를 관리하기 때문에 가능한 동작입니다.

💬 실제 프로젝트에서는 엔티티 클래스 하나로 수많은 SQL 작업을 자동 처리할 수 있어, 생산성과 유지보수성이 크게 향상됩니다.

💎 핵심 포인트:
@Entity와 @Id를 올바르게 설정하면 JPA가 객체와 데이터베이스 간 매핑을 자동으로 처리합니다. 특히, 생성 전략을 적절히 선택하는 것이 성능과 데이터 무결성에 큰 영향을 줍니다.

자주 묻는 질문 (FAQ)

@Entity는 클래스 어디에 선언해야 하나요?
@Entity는 반드시 클래스 선언부 위에 작성해야 하며, 클래스 전체가 엔티티로 인식되도록 합니다.
@Id 없이 엔티티를 만들면 어떻게 되나요?
@Id가 없으면 JPA가 해당 엔티티를 식별할 수 없어 예외가 발생하며, 애플리케이션 실행이 중단됩니다.
기본 생성자가 꼭 필요한 이유는 무엇인가요?
JPA는 리플렉션을 이용해 객체를 생성하므로, 파라미터가 없는 기본 생성자가 필수입니다.
기본 키 전략 중 무엇을 선택해야 하나요?
데이터베이스 종류, 성능 요구사항, 운영 환경에 따라 다르지만, 간단한 경우에는 IDENTITY 전략이 자주 사용됩니다.
@Entity와 테이블 이름이 항상 같아야 하나요?
기본적으로 동일하지만, @Table 어노테이션을 사용해 데이터베이스 테이블명을 변경할 수 있습니다.
복합 키는 어떻게 매핑하나요?
@IdClass 또는 @EmbeddedId를 사용해 복합 키를 매핑할 수 있습니다.
@GeneratedValue를 사용하지 않고 키를 직접 지정할 수 있나요?
가능합니다. 이 경우 엔티티 저장 전에 키 값을 직접 세팅해야 합니다.
Spring Data JPA에서도 @Entity와 @Id가 필요한가요?
네. Spring Data JPA는 JPA를 기반으로 하므로, 엔티티 매핑 시 동일한 규칙이 적용됩니다.

📌 @Entity와 @Id로 완성하는 JPA 엔티티 매핑의 핵심 정리

이번 글에서는 JPA의 기본이 되는 엔티티 매핑과 @Entity, @Id 사용법을 살펴봤습니다.
@Entity는 자바 클래스를 데이터베이스 테이블과 매핑하는 핵심 어노테이션이며, @Id는 해당 엔티티의 기본 키를 지정해 데이터 무결성을 보장합니다.
또한 @GeneratedValue를 활용한 다양한 기본 키 생성 전략까지 함께 이해하면, 실무 프로젝트에서 더 안정적이고 효율적인 데이터 처리가 가능합니다.

JPA를 처음 배우는 단계에서는 매핑 규칙과 생성 전략을 꼼꼼히 익히는 것이 중요합니다.
특히, 엔티티 설계 초기에 올바른 식별자 전략을 선택하면 나중에 구조 변경 없이 장기적으로 유지보수가 가능합니다.
이제 여러분도 @Entity와 @Id를 활용해 객체지향적인 데이터베이스 연동을 구현할 수 있을 것입니다.


🏷️ 관련 태그 : JPA, 엔티티매핑, Entity, Id, ORM, 자바데이터베이스, Hibernate, 기본키전략, SpringDataJPA, GeneratedValue