[스프링] JPA 기본 매핑 어노테이션

2025. 7. 24. 18:17·스프링

JPA는 자바 객체와 데이터베이스 테이블을 연결해주는 기술이다.
개발자는 SQL을 일일이 작성하지 않고, 객체만 다뤄도 데이터베이스와 연동되는 프로그램을 만들 수 있다.
이때 가장 기본이 되는 것이 매핑 어노테이션이다.
하나씩 자세히 설명한다.

 

1. @Entity – 이 클래스는 테이블과 매핑되는 엔티티다

@Entity
public class Member {
    @Id
    private Long id;
    private String name;
}
  • @Entity는 JPA가 이 클래스를 테이블과 연결된 엔티티로 인식하게 만든다.
  • 이 클래스는 데이터베이스의 한 테이블에 대응된다.
  • @Entity가 있어야 JPA가 이 객체를 관리하고, SQL을 자동 생성한다.

규칙

  • 기본 생성자(파라미터가 없는 생성자)가 반드시 있어야 한다.
  • 클래스는 final이면 안 된다.
  • 내부 클래스(클래스 안의 클래스)는 사용할 수 없다.
  • equals, hashCode, toString 등을 잘 정의해두는 것이 좋다.

 

2. @Table – 매핑할 테이블의 이름을 지정한다

@Entity
@Table(name = "members")
public class Member {
    ...
}
  • @Table은 어떤 테이블과 매핑할 것인지를 정하는 어노테이션이다.
  • name 속성에 테이블 이름을 지정한다.
  • 생략하면 클래스 이름을 그대로 사용한다. (Member → member)

추가 속성

  • schema, catalog: 특정 데이터베이스 스키마나 카탈로그를 지정할 수 있다.

 

3. @Id – 이 필드는 기본 키로 지정된다

@Id
private Long id;
  • 테이블에는 기본 키(primary key)가 반드시 있어야 한다.
  • @Id는 이 필드가 기본 키임을 지정한다.
  • JPA는 이 키를 기준으로 데이터를 저장하거나 불러온다.
  • 엔티티에는 반드시 @Id가 하나 이상 있어야 한다.

 

 

4. @GeneratedValue – 기본 키 값을 자동으로 생성하게 한다

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
  • @GeneratedValue는 기본 키 값을 자동으로 생성하도록 설정한다.
  • strategy 속성을 통해 어떤 방식으로 키를 생성할지 정한다.

주요 전략

  • GenerationType.IDENTITY
    • 데이터베이스가 자동 증가값(AUTO_INCREMENT)을 생성한다.
    • MySQL 등에서 주로 사용된다.
  • GenerationType.SEQUENCE
    • 시퀀스 객체를 이용해 값을 만든다.
    • Oracle 등에서 주로 사용된다.
  • GenerationType.AUTO
    • JPA가 데이터베이스에 맞게 전략을 자동으로 선택한다.
  • GenerationType.TABLE
    • 별도의 키 생성용 테이블을 만들어 값을 관리한다.
    • 성능상 불리해 잘 쓰이지 않는다.

 

5. @Column – 필드를 컬럼과 매핑한다

@Column(name = "member_name", nullable = false, length = 100)
private String name;
  • @Column은 필드를 컬럼에 명시적으로 매핑할 때 사용한다.
  • 이름, null 여부, 문자열 길이 등을 조절할 수 있다.
  • 생략하면 필드 이름 그대로 컬럼 이름이 된다.

주요 속성

  • name: 실제 컬럼 이름을 지정한다.
  • nullable: false면 NOT NULL 제약조건이 붙는다. (기본값: true)
  • length: String 타입의 최대 길이를 지정한다. (기본값: 255)
  • unique: true면 유니크 제약조건이 붙는다.
  • insertable, updatable: 이 컬럼을 insert, update 할 때 SQL에 포함시킬지 여부를 정한다.

 

6. @Lob – 큰 데이터를 매핑한다

@Lob
private String description;
  • @Lob은 대용량 데이터를 저장할 때 사용한다.
  • String 타입이면 CLOB, byte[] 타입이면 BLOB으로 매핑된다.

예시

  • 긴 글을 저장해야 하는 게시글 본문
  • 이미지, 파일 등 바이너리 데이터를 저장할 때

7. @Transient – 이 필드는 매핑하지 않는다

@Transient
private int tempCount;
  • @Transient는 이 필드를 데이터베이스에 저장하지 않도록 설정한다.
  • 계산용, 임시 저장용 필드에 주로 사용된다.

예: 계산된 결과를 잠시 저장하지만, DB에는 필요 없는 값

 

8. 날짜/시간 필드 매핑

private LocalDate createdDate;
private LocalDateTime updatedDate;
  • LocalDate, LocalDateTime 타입은 JPA에서 기본적으로 매핑이 지원된다.
  • 별도의 어노테이션 없이도 테이블에서 날짜/시간 컬럼으로 저장된다.
  • JPA 2.2 이상부터는 java.time 패키지 타입을 직접 사용할 수 있다.

예전에는 @Temporal을 사용했으나, LocalDate 사용 시 필요 없다.

(자세한 설명은 자바 날씨와 시간에 대하여 장을 참고하면 된다.)

 

9. @Enumerated – Enum 타입 매핑이다

@Enumerated(EnumType.STRING)
private MemberType memberType;
  • 자바의 enum 타입을 컬럼으로 저장할 때 사용한다.
  • EnumType.ORDINAL: 숫자로 저장된다 (기본값)
  • EnumType.STRING: 문자열 그대로 저장된다 (권장)

주의

  • ORDINAL은 enum의 순서가 바뀌면 기존 데이터가 꼬일 수 있기 때문에 되도록 사용하지 않는다.
  • 항상 STRING을 명시하는 것이 안전하다.

 

10. @Embedded / @Embeddable – 값 타입을 분리할 때 사용한다

값 타입은 식별자(ID)가 없고, 엔티티 내부에서만 의미를 갖는 객체다.

@Embeddable
public class Address {
    private String city;
    private String street;
    private String zipcode;
}
@Entity
public class Member {
    @Id
    private Long id;

    @Embedded
    private Address address;
}
  • @Embeddable: 값 타입 클래스에 선언한다.
  • @Embedded: 엔티티에서 그 값을 포함시킬 때 사용한다.
  • 테이블에는 Address의 필드들이 Member의 컬럼처럼 저장된다.

마무리하며

JPA를 사용하면 객체 중심으로 코드를 작성하면서도, 데이터베이스와 자연스럽게 연동할 수 있다.
이를 가능하게 해주는 것이 바로 엔티티와 컬럼 매핑이다.
어노테이션들의 의미와 동작 방식을 정확히 이해해두면, SQL 없이도 안정적인 데이터 처리가 가능해진다.

 

다음 장에서는 연관관계 매핑 (OneToOne, 등)에 대해 설명할 것이다.

 

감사합니다.

 

'스프링' 카테고리의 다른 글

[스프링] JPA 상속관계 매핑  (7) 2025.07.25
[스프링] JPA 연관관계 매핑  (2) 2025.07.25
[스프링] JPA란?  (1) 2025.07.24
[스프링] 빈 스코프  (1) 2025.07.24
[스프링] 빈 생명주기 콜백  (3) 2025.07.24
'스프링' 카테고리의 다른 글
  • [스프링] JPA 상속관계 매핑
  • [스프링] JPA 연관관계 매핑
  • [스프링] JPA란?
  • [스프링] 빈 스코프
0kingki_
0kingki_
자바 + 스프링 웹 개발
  • 0kingki_
    0kingki_
    0kingki_
  • 전체
    오늘
    어제
    • 분류 전체보기 (134)
      • 코딩 테스트 (54)
      • 자바 (21)
      • 스프링 (27)
      • 타임리프 (16)
      • 스프링 데이터 JPA (8)
      • 최적화 (2)
      • QueryDSL (4)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    타임리프
    spring
    예외 처리
    쿼리dsl
    BFS
    백준
    스프링 컨테이너
    컬렉션
    LocalDateTime
    Java
    재귀
    SOLID
    스프링
    자바
    다형성
    쿼리
    JPA
    스프링 데이터 JPA
    SpringDataJpa
    fetch join
    코딩테스트
    코딩 테스트
    불변객체
    예외처리
    객체지향
    최적화
    thymeleaf
    mvc
    dfs
    QueryDSL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
0kingki_
[스프링] JPA 기본 매핑 어노테이션
상단으로

티스토리툴바