지난 글에서는 To-Do List 애플리케이션의 전반적인 소개, 요구사항 정리, 기본 프로젝트 설정들에 대해서 전반적인 내용들을 크게 알아보았습니다.
이번 글에서는 To-Do List 애플리케이션의 데이터 모델링에 대해 다루겠습니다. 데이터 모델링은 애플리케이션의 데이터 구조를 설계하는 과정으로, 데이터베이스 테이블 설계와 JPA 엔티티 클래스를 정의하는 것을 포함합니다. H2 데이터베이스를 사용하여 데이베이스를 설계하고, Data JPA를 사용하여 엔티티 클래스를 정의하는 방법을 설명합니다.
데이터 베이스 (Database) 설계
데이터베이스 설계는 애플리케이션의 데이터 저장 구조를 정의하는 중요한 단계입니다. To-Do List 애플리케이션의 경우, 단일 테이블로 구성된 간단한 데이터베이스를 사용할 수 있습니다.
데이터 베이스 (Database) 선택
To-Do List 애플리케이션에서의 데이터베이스는 H2 Database를 사용합니다. H2 Database는 Java로 작성된 경량의 관계형 데이터베이스로, 메모리 내 데이터베이스로 사용할 수 있어 개발 및 테스트에 매우 적합합니다. H2 Database는 Spring Boot와 잘 통합되어 있으며, 설정이 간단하고 빠릅니다.
💡 H2 Database
H2 Database는 데이터 베이스 엔진을 다운로드하여 설치해서 사용할 수 있습니다.
사이트: https://h2database.com/html/main.html
테이블 구조 정의
To-Do List 애플리케이션의 주요 데이터는 '할 일' 입니다. 할 일에는 제목, 설명, 생성날짜, 수정 날짜들이 포함되어 있어야 합니다. 그래서 이들을 저장하기 위한 테이블을 하나 만들게요. 테이블의 구조는 다음과 같이 정의할 수 있습니다.
필드명 | 타입 | 설명 |
id | Long | Primary Key, 자동생성 필드 |
title | String | 할 일 제목 |
description | String | 할 일 상세 설명 |
created_at | LocalDateTime | 할 일 생성 일시 |
updated_at | LocalDateTime | 할 일 수정 일시 |
기본키는 데이터베이스에 데이터를 쉽게 검색할 수 있게 만들어 주는 유일한 키 값입니다. 이는 데이터 베이스 스스로 자동생성되도록 만들 수 있습니다.
저장하는 데이터중 할 일의 상태 또는 우선순위와 같은 상태는 아직 구현할 데이터가 아니므로 추후 구현할 때 추가작업을 하는 방향으로 업데이트를 진행할게요.
엔티티 (Entity) 설계
엔티티(Entity)는 데이터베이스 테이블에 매핑되는 클래스입니다. Spring Data JPA를 사용하여 엔티티를 정의하면 데이터베이스의 상호작용이 훨씬 쉬워집니다.
엔티티 클래스 정의
엔티티 클래스는 ToDoItem으로 클래스를 정의하고 테이블에 매핑합니다. 이 클래스는 할 일의 각 속성을 필드로 포함하며, JPA 어노테이션을 사용하여 매핑을 설정합니다.
클래스가 엔티티임을 알려주기 위해서 @Entity 어노테이션을 붙여줍니다. 또한 어떤 테이블에 매핑할 것이지 알려주기 위해 @Table 어노테이션에 name="테이블 이름" 을 넣어줍니다.
package com.koonsland.todo.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import jakarta.persistence.Table;
import java.time.LocalDateTime;
@Entity
@Table(name = "todo_item")
public class ToDoItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "title", nullable = false)
private String title;
@Column(name= "description", length = 500)
private String description;
@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;
@Column(name = "updated_at")
private LocalDateTime updatedAt;
@PrePersist
protected void onCreate() {
LocalDateTime now = LocalDateTime.now();
this.createdAt = now;
this.updatedAt = now;
}
@PreUpdate
protected void onUpdate() {
this.updatedAt = LocalDateTime.now();
}
// Getters
// Setters 생성 안함 (필요한 비즈니스 메서드만 생성 예정)
public Long getId() {
return id;
}
public String getTitle() {
return title;
}
public String getDescription() {
return description;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
}
필드 타입 설명
각 필드는 ToDoItem 클래스의 속성을 나타내며, 데이터베이스 컬럼에 매핑됩니다.
id: 기본키로, @Id, @GeneratedValue 어노테이션을 사용하여 자동으로 생성합니다. 엔티티 클래스에는 반드시 @Id가 필요하며 기본 키 값을 자동생성하기 위해 @GeneratedValue를 사용합니다.
💡 @GeneratedValue 전략
@GeneratedValue에는 3가지 전략(IDENTITY, SEQUENCE, TABLE)이 있고 JPA에게 전략을 위임하는 옵션인 AUTO 옵션이 포함되어 총 4가지 옵션이 존재합니다.
title: 할 일의 제목으로, @Column을 사용하여 이름과 필수 입력값을 설정합니다. 할 일의 제목은 필수 요소이기 때문에 @Column 어노테이션 설정에 nullable = false 값을 추가해 줍니다.
descriptoin: 할 일의 설명으로, 최대 500자까지 입력할 수 있도록 @Column 어노테이션 설정에 length = 500을 사용합니다.
createdAt: 할 일이 생성된 시간을 기록합니다. @PrePersist 어노테이션을 사용한 메서드를 만들어서 엔티티가 처음 저장될 때 자동으로 설정되도록 하여 생성시간이 자동으로 만들어지도록 합니다.
updatedAt: 할 일의 마지막 수정된 시간을 기록합니다. @PreUpdate 메서드를 사용하여 엔티티가 수정될 때 자동으로 실행되게 합니다.
@PrePersist와 @PreUpdate
'@PrePersist'와 '@PreUpdate'는 JPA 라이프사이클 이벤트 어노테이션입니다. 이 어노테이션들은 엔티티의 상태 변화에 따라 특정 메서드를 호출할 수 있게 합니다.
@PerPersist
@PrePersist 어노테이션은 엔티티가 처음으로 영속성 컨텍스트에 저장되기 전에 실행되는 메서드에 적용됩니다. 이를 통해 생성 시간을 자동으로 설정할 수 있습니다.
@PrePersist
protected void onCreate() {
createdAt = LocalDateTime.now();
}
이 메서드는 엔티티가 처음 저장될 때 'createdAt' 필드를 현재 시간으로 설정합니다.
@PreUpdate
@PreUpdate 어노테이션은 엔티티가 수정되기 전에 실행되는 메서드에 적용됩니다. 이를 통해 마지막 수정 시간을 자동으로 갱신할 수 있습니다.
@PreUpdate
protected void onUpdate() {
updatedAt = LocalDateTime.now();
}
이 메서드는 엔티티가 수정될 때 'updatedAt' 필드를 현재 시간으로 설정합니다.
🚀 왜 @PrePersist와 @PreUpdate 메서드를 protected로 만드는가?
@PrePersist와 @PreUpdate 메서드를 protected로 만드는 데는 몇 가지 이유가 있습니다.
캡슐화: protected 접근 제어자는 해당 메서드가 같은 패키지에 있는 다른 클래스나 해당 클래스를 상속받은 하위 클래스에서만 접근할 수 있도록 제안합니다. 이를 통해 메서드의 외부 노출을 최소화하고, 의도하지 않은 접근을 방지할 수 있습니다.
JPA 스펙: JPA 스펙에서는 엔티티 라이프사이클 콜백 메서드가 'public, 'protected', 'private'일 수 있다고 명시하고 있습니다. 'protected'는 이 메서드가 외부에서 호출되지 않도록 하면서도, JPA가 이 메서드를 호출할 수 있도록 보장합니다.
유연성: protected 접근 제어자는 하위 클래스에서 메서드를 재정의할 수 있게 해 줍니다. 이는 객체지향 프로그래밍에서 클래스 계층 구조를 설계할 때 유연성을 제공합니다. 하위 클래스에서 라이프사이클 콜백 메서드를 재정의하여 특정 동작을 추가하거나 변경할 수 있습니다.
데이터베이스 설정
H2 Database를 사용할 수 있도록 Spring Boot 설정 파일(application.properties 또는 application.yml)에 다음과 같은 설정을 추가합니다. 이 프로젝트에서는 yml 파일을 사용하도록 하겠습니다. 중복된 글자들을 없애고 사용할 수 있는다는 편리함이 있습니다.
spring:
application:
name: todo
# H2 Database 설정
datasource:
url: jdbc:h2:mem:todo
driverClassName: org.h2.Driver
username: sa
password: password
h2:
console:
enabled: true
sql:
init:
mode: always
# JPA 설정
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
format_sql: true
이 설정을 통해 H2 Database를 메모리 내 데이터베이스로 사용하며, H2 콘솔을 활성화하여 웹 브라우저를 통해 데이터베이스를 확인할 수 있습니다.
웹 서버 구동
여기까지 진행했다면 다시 웹 애플리케이션을 구동시켜 보도록 하겠습니다. 위에서 설정한 설정들을 통해서 어떤 것들이 추가되었는지 확인할 수 있습니다.
기존 스프링 부트 실행에 추가되어 데이터베이스 설정들이 추가된 것들을 확인할 수 있습니다.
- H2 Database의 데이터베이스 이름인 todo가 만들어지고 user는 sa로 접근한 것을 확인할 수 있습니다.
- 접속 가능한 콘솔은 /h2-console이며, 접속이 가능합니다.
- 테이블 생성 쿼리를 확인할 수 있습니다. 데이터베이스 SQL을 백엑드 개발자에게는 필수 요소입니다. 하지만 공부하는 과정에서는 익숙치 않기 때문에 함께 확인하며 학습에 도움을 받을 수 있습니다.
- 톰캣 서버의 포트번호화 기본 접속 URL 정보도 확인할 수 있습니다.
H2 Database 접속
H2 Database에 접속해 보도록 하겠습니다. 스프링부트 웹 애플리케이션을 동작시켜 보면 /h2-console이라는 URL이 나타나며 접근 가능한 데이터베이스라 알려주고 있습니다. H2 Database의 장점은 URL로 바로 접근해서 데이터를 확인해 볼 수 있기 때문에 바로 접근해서 확인해 보겠습니다.
웹 브라우저를 하나 열어서 아래 경로를 입력해 줍니다.
경로: http://localhost:8080/h2-console
해당 URL로 접속하면 위와 같은 화면이 나타납니다. JDBC URL, 사용자명, 비밀번호는 모두 application.yml 파일에서 설정을 해 두었기 때문에 그 정보를 이용해서 접속하도록 합니다.
JDBC URL: jdbc:h2:mem:todo
사용자명: sa
비밀번호: password
입력을 모두 끝냈다면 '연결' 버튼을 눌러서 접속해 줍니다. 정상적으로 입력되었다면 아래와 같은 화면이 나타납니다.
스프링 부트 실행과 함께 create table 쿼리 (SQL 테이블 생성 쿼리)를 자동으로 실행했기 때문에 TODO_ITEM이라는 테이블이 생성된 것을 볼 수 있습니다. 이제 데이터를 생성하고 H2 Database에 접속해서 이 데이터들이 정상적으로 저장되었는지 확인해 보면서 개발을 진행할 수 있습니다.
이번 글에서는 To-Do List 애플리케이션의 데이터 모델링과 관련된 모든 단계를 다루었습니다. 데이터베이스 설계, 엔티티 클래스 정의, 데이터베이스 로그인 및 접속을 통해서 데이터를 확인할 수 있는 기본 구조를 완성했습니다. 이 글을 통해 To-Do List 애플리케이션의 데이터 모델링을 명확하게 이해할 수 있길 바랍니다.
다음 글에서는 할 일 추가(Create), 조회(Read), 수정(Update), 삭제(Delete)에 대한 Rest API를 구현하고, 실제로 테스트를 진행하면서 데이터가 어떻게 저장되는지 확인해 보는 방법을 다룰 예정입니다.
추가로 필요하거나 궁금한 사항이 있다면 언제든지 댓글로 남겨주시면 답변드리겠습니다. 감사합니다.
이전 글
2024.06.16 - [쿤즈 프로젝트/To-do List Application] - [Spring Boot] To-Do List 애플리케이션: Chap1. 프로젝트 소개
2024.06.20 - [쿤즈 프로젝트/To-do List Application] - [Spring Boot] To-Do List 애플리케이션: Chap2. 요구사항 정리
2024.06.26 - [쿤즈 프로젝트/To-do List Application] - [Spring Boot] To-Do List 애플리케이션: Chap3. 기본 프로젝트 설정
'쿤즈 프로젝트 > To-do List Application' 카테고리의 다른 글
[Spring Boot] To-Do List 애플리케이션: Chap6. API 계층별 구현 (2) 특정 할 일 조회(상세조회) (0) | 2024.07.22 |
---|---|
[Spring Boot] To-Do List 애플리케이션: Chap5. API 계층별 구현 (1) 모든 할 일 조회 (0) | 2024.07.15 |
[Spring Boot] To-Do List 애플리케이션: Chap3. 기본 프로젝트 설정 (0) | 2024.07.01 |
[Spring Boot] To-Do List 애플리케이션: Chap2. 요구사항 정리 (0) | 2024.06.24 |
[Spring Boot] To-Do List 애플리케이션: Chap1. 프로젝트 소개 (0) | 2024.06.17 |
댓글