본문 바로가기
BackEnd/Project

[Loan] Ch02. 대출 상담 도메인 테이블 정의

by 개발 Blog 2024. 9. 11.

공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.

 

이번 장에서는 대출 상담 도메인 테이블을 정의하고, 관련된 Entity를 설계해 본다. 이를 통해 대출 상담을 위한 필수 정보와 Soft Delete 기능을 구현한다.

 

1. ID 정의 (Long 타입)

  • 대출 상담 정보의 기본 키(Primary Key)는 Long(BIGINT) 타입을 사용하여 정의한다. 이는 대용량 데이터를 다루거나 시스템 확장성을 고려할 때 유리하다.

2. Soft Delete

  • Soft Delete는 데이터가 삭제된 것처럼 표시되지만 실제로는 삭제되지 않고 남아있는 상태를 의미한다.
  • Soft Delete 기능은 @Where(clause = "is_deleted=false")를 통해 구현된다. 이 어노테이션을 통해 is_deleted 필드가 false인 경우에만 쿼리에서 해당 데이터를 조회하게 된다.

3. 상담을 위한 기본 필드 정의

상담 정보를 저장하기 위해 필요한 필드는 다음과 같다:

  • appliedAt: 상담 신청 일자 (LocalDateTime)
  • name: 상담 요청자 이름 (String)
  • cellphone: 상담 요청자 전화번호 (String)
  • email: 상담 요청자 이메일 (String)
  • memo: 상담 메모 (String)
  • address: 상담 요청자의 주소 (String)
  • addressDetail: 주소 상세 정보 (String)
  • zipCode: 우편 번호 (String)

각 필드는 적절한 데이터 타입으로 정의하고, 필요한 경우 제약 조건을 설정한다.

 

4. 코드에서 Entity 정의

아래는 위에서 정의한 테이블과 관련된 Counsel 엔티티 클래스 코드이다. 각 필드는 적절한 SQL 타입과 주석(COMMENT)을 통해 정의되었으며, Soft Delete를 위한 @Where 어노테이션을 포함한다.

package com.example.loan.domain;

import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.Where;

import javax.persistence.*;
import java.time.LocalDateTime;

@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@DynamicInsert
@DynamicUpdate
@Where(clause = "is_deleted=false")
public class Counsel extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false, updatable = false)
    private Long counselId;

    @Column(nullable = false, columnDefinition = "datetime COMMENT '신청일자'")
    private LocalDateTime appliedAt;

    @Column(nullable = false, columnDefinition = "varchar(12) COMMENT '상담 요청자'")
    private String name;

    @Column(nullable = false, columnDefinition = "varchar(23) COMMENT '전화번호'")
    private String cellphone;

    @Column(columnDefinition = "varchar(50) DEFAULT NULL COMMENT '상담 요청자 이메일'")
    private String email;

    @Column(columnDefinition = "text DEFAULT NULL COMMENT '상담메모'")
    private String memo;

    @Column(columnDefinition = "varchar(50) DEFAULT NULL COMMENT '주소'")
    private String address;

    @Column(columnDefinition = "varchar(50) DEFAULT NULL COMMENT '상세 주소'")
    private String addressDetail;

    @Column(columnDefinition = "varchar(5) DEFAULT NULL COMMENT '우편 번호'")
    private String zipCode;

}

 

5. 테이블 네이밍 전략

  • 카멜 케이스 네이밍 전략 적용 application.yml 파일에서 CamelCaseToUnderscoresNamingStrategy를 사용했기 때문에, 필드 이름이 카멜 케이스로 정의되었을 경우, 자동으로 스네이크 케이스로 변환된다. 예를 들어 counselId 필드는 데이터베이스 테이블에서 counsel_id로 변환된다.

6. application.yml 설정

다음은 H2 데이터베이스를 사용한 application.yml 설정 파일이다. 여기서는 JPA 설정, Hibernate 네이밍 전략, SQL 포맷팅 설정을 포함한다.

server:
  port: 8080
spring:
  datasource:
    driverClassName: org.h2.Driver
    url: jdbc:h2:mem:testdb
    username: sa
    password:
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true
      naming:
        physical-strategy: org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
    database-platform: org.hibernate.dialect.H2Dialect
  h2:
    console:
      path: /h2-console
      enabled: true
logging.level:
  org.hibernate.SQL: debug
  • JPA 설정: ddl-auto: create로 설정하여 애플리케이션 시작 시 테이블을 자동으로 생성한다.
  • SQL 포맷팅: hibernate.format_sql을 true로 설정하여 가독성 있는 SQL 로그를 출력한다.
  • 네이밍 전략: 카멜 케이스 필드명을 스네이크 케이스로 변환하기 위해 CamelCaseToUnderscoresNamingStrategy를 적용한다.
  • H2 콘솔: h2-console을 활성화하여 H2 데이터베이스에 접근할 수 있도록 설정한다.

이와 같이 Counsel 엔티티와 관련된 테이블 및 기본 설정을 정의할 수 있다. 이 코드를 기반으로 대출 상담 기능을 구현할 수 있으며, Soft Delete와 JPA 설정을 통해 효율적인 데이터 관리를 할 수 있다.