[Spring Boot] Spring domain내의 엔티티 생성

근이의 개발일기·2024년 11월 5일

[Spring Boot]

목록 보기
4/4
post-thumbnail

Spring에서 Domain 엔티티 생성하기

Spring 프로젝트에서 데이터베이스와의 상호작용을 위한 기본적인 Domain 엔티티를 설정하는 과정입니다. 엔티티를 설정하는 단계별 과정과 주요 개념들을 설명합니다.


1. 데이터베이스(DB) 연결 설정

Spring Boot에서 데이터베이스와 연결하기 위해서는 application.properties 또는 application.yml 파일에 데이터베이스 URL, 사용자명, 비밀번호 등 연결 정보 설정이 필요합니다. 이를 통해 JPA가 데이터베이스와 연동될 수 있도록 합니다.


2. 기본 Entity 생성

엔티티를 정의할 때는 기본 키(Primary Key)를 설정해야 합니다. @GeneratedValue(strategy = GenerationType.IDENTITY) 어노테이션을 통해 기본 키를 자동으로 생성하도록 설정할 수 있습니다. 예를 들어, 다음과 같이 기본적인 User 엔티티를 생성할 수 있습니다.

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    private String email;
}

@Id 어노테이션은 해당 필드를 기본 키로 설정하며, @GeneratedValue는 기본 키의 생성 전략을 지정합니다.


3. Enum 타입 필드 생성

엔티티에서 열거형(Enum) 타입을 사용할 때는 @Enumerated(EnumType.STRING) 어노테이션을 통해 문자열 타입으로 저장하도록 설정할 수 있습니다. 이를 통해 Enum의 이름 자체가 데이터베이스에 저장되며, 의미 있는 값을 유지할 수 있습니다.

public enum UserType {
    ADMIN,
    USER
}

@Entity
public class User {
    @Enumerated(EnumType.STRING)
    private UserType userType;
}

위 예시에서는 UserType Enum을 문자열 형식으로 데이터베이스에 저장하게 됩니다.


4. Created_at, Updated_at 필드를 위한 BaseEntity 생성

엔티티의 생성일자와 수정일자를 자동으로 관리하기 위해 base 패키지에 BaseEntity 클래스를 생성하고, 각 엔티티가 이를 상속하도록 구성합니다. BaseEntity에는 @CreatedDate@LastModifiedDate 어노테이션을 사용해 생성일자와 수정일자를 자동으로 관리할 수 있습니다.

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime updatedAt;
}

@MappedSuperclass 어노테이션을 사용하여 해당 클래스의 필드를 상속받는 엔티티에서 재사용할 수 있도록 합니다.


5. 매핑 테이블 설계

양방향 관계를 설정하기 위해 mapping 패키지에 매핑 테이블을 생성합니다. 양방향 매핑의 장점은 객체 그래프 탐색이 가능해진다는 점과 Cascade 설정이 가능하다는 점입니다. Cascade 설정은 연관된 엔티티 간의 작업을 전파하는 역할을 하며, 이를 통해 편리한 데이터 관리가 가능합니다.

Cascade 설정

Cascade 설정은 엔티티 간 관계에서 특정 작업(예: 저장, 삭제 등)을 관련 엔티티에도 전이시킵니다. 주로 JPA에서 사용하는 CascadeType 옵션을 통해 설정할 수 있으며, 양방향 매핑에서 필수적인 설정으로 활용됩니다.

  • CascadeType 옵션
    • ALL: 모든 작업(저장, 삭제 등)을 전파합니다.
    • PERSIST: 저장 시 연관된 엔티티도 함께 저장합니다.
    • MERGE: 병합 시 연관된 엔티티도 함께 병합합니다.
    • REMOVE: 삭제 시 연관된 엔티티도 함께 삭제합니다.
    • REFRESH: 상태를 DB의 최신 상태로 갱신합니다.
    • DETACH: 영속성 컨텍스트에서 분리합니다.

양방향 매핑에서 Cascade 설정을 통해 주 엔티티에 대한 작업이 종속 엔티티에도 적용되도록 할 수 있습니다. 예를 들어, 부모 엔티티가 삭제될 때 자식 엔티티가 함께 삭제되도록 CascadeType.REMOVE를 설정할 수 있습니다.

@Entity
public class Parent {
    @Id
    @GeneratedValue
    private Long id;

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    private List<Child> children = new ArrayList<>();
}

@Entity
public class Child {
    @Id
    @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;
}

위 코드에서 CascadeType.ALL을 설정하면 Parent 엔티티가 저장될 때 Child 엔티티도 함께 저장되고, 삭제될 때 자식 엔티티도 함께 삭제됩니다. 단, 예상치 못한 데이터 손실을 방지하기 위해 신중히 설정해야 합니다.


6. 연관 관계 매핑 설정

엔티티 간 연관 관계는 주로 @ManyToOne@OneToMany 어노테이션을 사용하여 설정합니다. 이를 통해 양방향 매핑을 설정하고, 연관 엔티티 간의 데이터 관계를 효율적으로 관리할 수 있습니다. 예를 들어, OrderCustomer 엔티티 간의 관계를 설정할 때, Order에서 Customer를 참조하고, Customer에서도 Order를 참조하도록 매핑할 수 있습니다.


7. 칼럼에 대한 세부 설정

각 엔티티의 칼럼에 대해 세부 설정을 추가할 때는 @Column 어노테이션을 사용하여 칼럼 속성을 정의할 수 있습니다. 예를 들어, 칼럼의 길이, 유일성, nullable 여부 등을 지정할 수 있습니다.

@Entity
public class User {
    @Column(length = 50, nullable = false, unique = true)
    private String email;
}

위 예시에서는 email 필드에 대해 최대 길이를 50으로 제한하고, 필수 입력 필드로 설정했으며, 유일성 제약을 추가했습니다.


위와 같은 설정을 통해 Spring 프로젝트에서 Domain 엔티티를 체계적으로 생성하고 관리할 수 있습니다. 이를 통해 엔티티 간의 연관 관계, 필드 속성, 데이터베이스의 무결성을 효과적으로 관리할 수 있습니다.

0개의 댓글