https://drive.google.com/file/d/1d-AOYJ5xOLBhM7NpL3n18fWvxY5NgRHf/view?usp=sharing
JPA 설계는 전통적인 RDBMS 스키마 설계와 차이가 있습니다.
RDBMS는 관계형 데이터베이스의 특성상 정규화를 중심으로 스키마를 설계합니다. 이에 따라 테이블 간의 Join이 빈번하게 발생하며, OneToMany
, ManyToOne
등의 다양한 관계 매핑이 필요합니다. 이러한 설계 방식은 테이블 구조와 쿼리 성능에 크게 의존하게 되어, 특히 데이터베이스 관리(DBA)에 대한 깊은 지식이 부족한 경우 백엔드 시스템이 데이터베이스 구조에 종속되는 경향이 있습니다. 이로 인해 성능 문제를 야기할 수 있습니다.
반면, JPA는 객체 지향 프로그래밍의 철학에 기반하여 도메인 모델을 중심으로 설계되며, 비즈니스 로직에서의 유연성을 강조합니다. JPA의 핵심 목표는 데이터베이스의 특정 구조나 기술에 종속되지 않고, 각 도메인을 객체화하여 Repository를 통해 데이터를 관리하는 것입니다. 이를 통해 백엔드 개발자가 테이블 구조나 SQL 성능 최적화에 덜 종속되도록 하며, 비즈니스 로직의 CRUD 작업을 보다 효율적으로 수행할 수 있습니다.
따라서, 아래의 설계는 단방향 관계를 기반으로, 객체의 id
를 이용한 최소한의 관계 유지를 통해 데이터베이스 의존성을 줄이는 방향으로 구성하였습니다.
■ Entity
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // 사용자 ID
@Column(nullable = false, length = 100, columnDefinition = "VARCHAR(100) COMMENT '사용자명'")
private String userName; // 사용자명
@Column(nullable = false, columnDefinition = "VARCHAR(255) COMMENT '비밀번호'")
private String password; // 비밀번호
@Column(length = 100, unique = true, columnDefinition = "VARCHAR(100) COMMENT '닉네임'")
private String nickName; // 닉네임
@Column(nullable = false, unique = true, length = 11, columnDefinition = "VARCHAR(20) COMMENT '핸드폰번호'")
private String phone; // 휴대폰 번호
@Column(nullable = false, unique = true, length = 100, columnDefinition = "VARCHAR(100) COMMENT '로그인 아이디 (이메일)'")
private String email; // 로그인 아이디 (이메일)
@Column(nullable = false, length = 20, columnDefinition = "VARCHAR(10) COMMENT '권한'")
private String role; // 권한
@Column(nullable = false, length = 10, columnDefinition = "VARCHAR(10) COMMENT '회원 상태'")
private String status; // 회원 상태
}
import jakarta.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "schedules")
public class Schedules {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // 일정 고유 ID
@Column(nullable = false, length = 100, columnDefinition = "VARCHAR(100) COMMENT '일정 제목'")
private String title; // 일정 제목
@Column(nullable = false, length = 500, columnDefinition = "VARCHAR(500) COMMENT '일정 설명'")
private String description; // 일정 설명
@Column(nullable = false, columnDefinition = "DATETIME COMMENT '시작 날짜 및 시간'")
private LocalDateTime startDateTime; // 시작 날짜 및 시간
@Column(nullable = false, columnDefinition = "DATETIME COMMENT '종료 날짜 및 시간'")
private LocalDateTime endDateTime; // 종료 날짜 및 시간
@Column(name = "user_id", nullable = false, columnDefinition = "BIGINT COMMENT '사용자 ID'")
private Long userId; // 사용자 ID
}
import jakarta.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "todos")
public class Todos {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // 할 일 고유 ID
@Column(nullable = false, length = 200, columnDefinition = "VARCHAR(200) COMMENT '할 일'")
private String task; // 할 일
@Column(nullable = false, columnDefinition = "BOOLEAN COMMENT '완료 여부'")
private boolean isCompleted; // 완료 여부
@Column(nullable = false, columnDefinition = "DATETIME COMMENT '기한'")
private LocalDateTime dueDate; // 기한
@Column(name = "schedule_id", columnDefinition = "BIGINT COMMENT '특정 일정 ID'")
private Long scheduleId; // 특정 일정과 연관된 할 일
@Column(name = "user_id", nullable = false, columnDefinition = "BIGINT COMMENT '사용자 ID'")
private Long userId; // 사용자 ID
}
import jakarta.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "notifications")
public class Notifications {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // 알림 고유 ID
@Column(nullable = false, length = 500, columnDefinition = "VARCHAR(500) COMMENT '알림 메시지'")
private String message; // 알림 메시지
@Column(nullable = false, columnDefinition = "DATETIME COMMENT '알림 시간'")
private LocalDateTime notificationTime; // 알림 시간
@Column(name = "schedule_id", nullable = false, columnDefinition = "BIGINT COMMENT '관련된 일정 ID'")
private Long scheduleId; // 관련된 일정 ID
}