내일배움캠프(Spring 7기)/내일배움캠프

[CH 3 일정 관리 앱 Develop] 요구 사항 정의 및 설계

가지코딩 2025. 5. 21. 15:31

필수 기능 -  요구 사항 정의

 

Lv 0. API 명세 및 ERD 작성

  • API 명세서 작성하기
    • API명세서는 프로젝트 root(최상위) 경로의 README.md 에 작성
  • ERD 작성하기
    • ERD는 프로젝트 root(최상위) 경로의 README.md 에 첨부
  • SQL 작성하기
    • 설치한 데이터베이스(Mysql)에 ERD를 따라 테이블을 생성

 

Lv 1. 일정 CRUD

  • 일정을 생성, 조회, 수정, 삭제할 수 있다.
  • 일정 필드
    • 작성 유저명, 할일 제목, 할일 내용, 작성일, 수정일
    • 작성일, 수정일 필드는 JPA Auditing 활용

 

Lv 2. 유저 CRUD

  • 유저를 생성, 조회, 수정, 삭제할 수 있다.
  • 유저 필드
    • 유저명, 이메일, 작성일 , 수정일 필드
    • 작성일, 수정일 필드는 JPA Auditing 활용
  • 연관관계 구현
    • 일정은 이제 작성 유저명 필드 대신 유저 고유 식별자 필드를 가진다.

 

Lv 3. 회원가입

  • 유저에 비밀번호 필드를 추가

 

Lv 4. 로그인(인증)

  • 설명
    • Cookie/Session을 활용해 로그인 기능 구현
    • 필터를 활용한 인증 처리
    • @Configuration 을 활용하여 필터 등록
  • 조건
    • 이메일과 비밀번호를 활용하여 로그인 기능 구현
      • 이메일, UNIQUE 속성 추가
    • 회원가입, 로그인 요청은 인증 처리에서 제외
  • 예외처리
    • 로그인 시 이메일과 비밀번호가 일치하지 않을 경우 HTTP Status code 401을 반환

도전 기능 -  요구 사항 정의

 

Lv 5. 다양한 예외처리 적용하기

  • Validation을 활용한 다양한 예외처리
    • Ex) 할일 제목은 10글자 이내, 유저명은 4글자 이내
    • @Pattern을 사용해서 회원 가입 Email 데이터 검증

 

Lv 6. 비밀번호 암호화

  • Lv.3에서 추가한 비밀번호 필드에 들어가는 비밀번호를 암호화 한다.
    • 암호화를 위한 PasswordEncoder를 직접 만들어 사용

 

Lv 7. 댓글 CRUD

  • 생성한 일정에 댓글을 남길 수 있다.
    • 댓글과 일정은 연관관계를 가진다.
  • 댓글을 저장, 조회, 수정, 삭제할 수 있다.
  • 댓글 필드
    • 댓글 내용, 작성일, 수정일, 유저 고유 식별자, 일정 고유 식별자
    • 작성일, 수정일 필드는 JPA Auditing 활용

 

Lv 8. 일정 페이징 조회

  • 일정을 Spring Data JPA의 Pageable과 Page 인터페이스를 활용하여 페이지네이션을 구현
    • 페이지 번호와 페이지 크기를 쿼리 파라미터로 전달하여 요청하는 항목을 나타낸다.
    • 할일 제목, 할일 내용, 댓글 개수, 일정 작성일, 일정 수정일, 일정 작성 유저명 필드 조회
    • 디폴트 페이지 크기는 10
  • 일정의 수정일을 기준으로 내림차순 정렬

API 명세서

Postman

https://documenter.getpostman.com/view/44635744/2sB2qaigm8

 

일정 관리 Develop

### **인증** --- 본 API는 **세션 기반 인증**을 사용합니다. - 세션이 유효하지 않은 경우 401 Unauthorized 응답이 반환됩니다. - 단, 회원가입, 로그인 요청은 인증 처리에서 제외합니다.

documenter.getpostman.com


ERD 설계 및 구현

개념적 설계

 

논리적 설계 - ERD

 

 

물리적 설계

-- DB 생성
DROP DATABASE IF EXISTS schedule;
CREATE DATABASE IF NOT EXISTS schedule;
USE schedule;

-- users 테이블 생성
DROP TABLE IF EXISTS users;
CREATE TABLE IF NOT EXISTS users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '유저 ID (PK)',
    name VARCHAR(50) NOT NULL COMMENT '유저명',
    email VARCHAR(100) NOT NULL UNIQUE COMMENT '유저 이메일',
    password VARCHAR(255) NOT NULL COMMENT '비밀번호',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '작성일',
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일'
) COMMENT = '유저 Table';

-- schedules 테이블 생성
DROP TABLE IF EXISTS schedules;
CREATE TABLE IF NOT EXISTS schedules (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '할일 ID (PK)',
    title VARCHAR(100) NOT NULL COMMENT '할일 제목',
    contents TEXT NOT NULL COMMENT '할일 내용',
    user_id BIGINT NOT NULL COMMENT '작성 유저 ID (FK)',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '작성일',
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일',

    FOREIGN KEY (user_id) REFERENCES users(id)
) COMMENT = '일정 Table';


-- schedule_comments 테이블 생성
DROP TABLE IF EXISTS schedule_comments;
CREATE TABLE IF NOT EXISTS schedule_comments (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '댓글 ID (PK)',
    contents TEXT NOT NULL COMMENT '댓글 내용',
    user_id BIGINT NOT NULL COMMENT '작성 유저 ID (FK)',
    schedule_id BIGINT NOT NULL COMMENT '일정 ID (FK)',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '작성일',
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일',

    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (schedule_id) REFERENCES schedules(id)
) COMMENT = '일정 댓글 Table';


Spring 프로젝트 구성