스프링부트 엔티티 코드

개발자되고싶은데·2025년 11월 18일

🧑‍💻 Member 엔티티 코드 예시

이 예시는 회원의 기본 정보와 생성/수정 시간을 포함하고 있습니다.

package com.example.demo.entity;

import jakarta.persistence.*;
import lombok.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

// Lombok 어노테이션
@Getter // 모든 필드의 Getter 메서드를 자동 생성
@NoArgsConstructor(access = AccessLevel.PROTECTED) // 인자 없는 기본 생성자 자동 생성 (protected 접근 제한자)
@AllArgsConstructor(access = AccessLevel.PRIVATE) // 모든 필드를 인자로 받는 생성자 자동 생성 (private 접근 제한자)
@Builder // 빌더 패턴을 사용하여 객체 생성
@ToString // toString 메서드 자동 생성

// JPA 어노테이션
@Entity // 해당 클래스를 JPA 엔티티로 지정
@Table(name = "member") // 매핑될 데이터베이스 테이블 이름 지정
@EntityListeners(AuditingEntityListener.class) // JPA Auditing 기능 활성화 (시간 자동 관리)
public class Member {

    // 1. Primary Key (기본 키) 설정
    @Id // 기본 키 지정
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본 키 생성 전략: DB에 위임 (MySQL의 AUTO_INCREMENT 등)
    @Column(name = "member_id") // 매핑될 컬럼 이름 지정 (snake_case 선호)
    private Long id;

    // 2. 일반 필드
    @Column(nullable = false, length = 50, unique = true) // NOT NULL, 최대 길이 50, UNIQUE 제약조건 추가
    private String email;

    @Column(nullable = false, length = 100)
    private String password;

    @Column(nullable = false, length = 20)
    private String name;

    // 3. 시간 자동 관리 (Auditing) 필드
    @CreatedDate // 엔티티가 생성될 때 시간이 자동 저장됨
    @Column(updatable = false) // 생성 시간은 수정되지 않도록 설정
    private LocalDateTime createdAt;

    @LastModifiedDate // 엔티티가 수정될 때 시간이 자동 저장됨
    private LocalDateTime updatedAt;

    // 4. 비즈니스 로직 메서드 (예시: 회원 정보 업데이트)
    public void updateName(String newName) {
        if (newName != null && !newName.trim().isEmpty()) {
            this.name = newName;
        }
    }
}

💡 코드 설명 및 실무 가이드

1. 주요 JPA 어노테이션

어노테이션설명실무 팁
@EntityJPA가 관리하는 객체, 데이터베이스 테이블과 매핑됩니다.반드시 import jakarta.persistence.Entity; 를 사용합니다.
@Table매핑될 테이블 이름을 지정합니다.테이블 이름은 보통 소문자 snake_case (member, product_order 등)로 명명하는 것이 일반적입니다.
@Id테이블의 기본 키(Primary Key) 필드를 지정합니다.보통 Long 타입을 사용하고 컬럼 이름은 엔티티명_id (member_id)를 선호합니다.
@GeneratedValue기본 키 값을 자동으로 생성하는 전략을 지정합니다.실무에서 가장 많이 사용되는 전략은 GenerationType.IDENTITY (MySQL, PostgreSQL 등 DB의 자동 증가 기능 사용)입니다.
@Column필드를 컬럼에 매핑하며, 상세 속성을 지정합니다.nullable=false (NOT NULL), length=50 (VARCHAR(50)), unique=true (UNIQUE 제약조건) 등을 활용합니다.

2. Auditing (시간 자동 관리)

  • @EntityListeners(AuditingEntityListener.class): 엔티티 변화를 감지하여 시간을 자동으로 주입합니다.
  • @CreatedDate: 엔티티가 생성될 때의 시간을 기록합니다. (updatable = false로 설정하여 수정 방지)
  • @LastModifiedDate: 엔티티가 수정될 때의 시간을 기록합니다.
  • 필수 설정: 이 기능을 사용하려면 **@EnableJpaAuditing**을 스프링 부트 메인 애플리케이션 클래스에 추가해야 합니다.

3. Lombok 활용

  • @Getter: 데이터를 조회할 때 필요한 Getter를 대신 작성해 줍니다.
  • @NoArgsConstructor(access = AccessLevel.PROTECTED): JPA는 리플렉션을 위해 기본 생성자가 필요합니다. **protected**로 지정하여 외부에서 임의 생성을 막고 JPA에서만 사용하도록 제한하는 것이 실무에서 권장되는 방식입니다.
  • @Builder: 객체를 명확하고 안전하게 생성할 수 있도록 빌더 패턴을 적용합니다. (예: Member.builder().email("...").name("...").build())

4. 비즈니스 로직 캡슐화

  • 엔티티는 단순한 데이터 덩어리가 아니라, 데이터와 비즈니스 로직을 함께 가지는 객체여야 합니다.
  • 데이터 변경은 Setter를 사용하기보다는, 예시의 updateName()처럼 의도를 명확히 하는 메서드를 엔티티 내부에 만들어 수행하는 것이 좋습니다 (객체 지향적인 설계).

0개의 댓글