Spring 입문 (JPA Entity)

KimGwangmin·2026년 9월 7일

Entity

  • DB의 테이블과 1:1로 대응되는 자바 클래스
  • ORM의 핵심
  • 행을 객체로 매핑

관련 어노테이션

@Entity

  • 클래스가 JPA 엔티티임을 선언
  • 기본적으로 클래스와 동일한 이름의 테이블과 매핑
@Entity
public class Member { // member 테이블과 매핑
    // 클래스 내용
}

@Table

  • 엔티티와 매핑할 테이블 정보 지정
  • 보통 클래스명의 복수형으로 테이블 이름을 지정
    • user, like 등은 DB에서 예약어로 쓰여 충돌이 발생할 수 있다
@Entity
@Table(name = "members")
public class Member {
    // 클래스 내용
}

@Id, @GeneratedValue

  • @Id: PK 매핑
  • @GeneratedValue: PK 자동 생성 전략 지정. MySQL에선 IDENTITY를 사용
@Entity
@Table(name = "members")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	// ...
}

@Column

  • 컬럼(Attribute) 매핑 정보 지정
    • name: 컬럼명(디폴트는 필드명과 같음)
    • length: 문자 길이 제약 조건(디폴트: 255)
    • nullable: null 허용 여부
    • unique: 유일 제약 조건
@Entity
@Table(name = "members")
public class Member {
    @Id
		@GeneratedValue(strategy = GenerationType.IDENTITY)
		private Long id;
		@Column(unique = true, nullable = false)
		private String email;
}

DB와 Entity 매핑

DB 테이블

CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    address VARCHAR(255)
);

엔티티 클래스

@Getter
@Entity
@Table(name = "users")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User {

		@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(length = 50, nullable = false)
    private String name;
    @Column(unique = true, nullable = false)
    private String email;
    private String address;
}

JPA Entity 클래스 코드 작성 시, 다음의 어트리뷰트는 기본적으로 포함한다.
1. @Getter
2. @Entity
3. @Table
4. @NoArgsConstructor(access = AccessLevel.PROTECTED)
5. @Id
6. @GeneratedValue(strategy = GenerationType.IDENTITY)

실습

  • 의존성

    • Lombok
    • Spring Web
    • Spring Data JPA
    • MySQL Driver
  • User.java 추가

    package org.example.jpa_practice;
    
    import jakarta.persistence.*;
    import lombok.AccessLevel;
    import lombok.Getter;
    import lombok.NoArgsConstructor;
    
    @Getter
    @Entity
    @Table(name = "users")
    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @Column(length = 50, nullable = false)
        private String name;
    
        private String address;
    }
  • JPA DDL 설정

    • resources/application.properties: 프로젝트 설정 파일, 환경변수
    • 다음의 내용을 추가
# 호스트 정보
spring.datasource.url=jdbc:mysql://localhost:3306/{데이터베이스명}
spring.datasource.username=root
spring.datasource.password=12345678

# DB 정보
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect

# JPA 설정값
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
  • spring.jpa.hibernate.ddl-auto
    - 앱이 시작될 때 기존 테이블을 어떻게 할지를 결정

    옵션설명사용 시기
    create기존 테이블 삭제 후 재생성개발 초기
    create-dropcreate + 애플리케이션 종료 시 삭제테스트
    update변경분만 반영 (컬럼 추가만 가능)개발 중
    validate엔티티와 테이블 매핑 정보만 확인운영
    noneDDL 자동 생성 사용 안함운영
    • spring.jpa.show-sql: 실행하는 SQL 쿼리를 System.out에 출력할지 설정
    • spring.jpa.properties.hibernate.format_sql: 출력할 쿼리를 포매팅할지 설정
  • Docker 컨테이너를 실행하고, 데이터 소스를 설정한 뒤 애플리케이션을 실행하면 다음의 로그를 확인할 수 있다. 엔티티에서 구성한대로 테이블이 만들어진다.

0개의 댓글