2024. 10. 2. 12:53ㆍ내일배움캠프/Schedule Management
'필수 기능' 에 대한 예외를 처리했으니 이번에는 '도전 기능' 의 'Lv.4 요구사항' 을 반영해보려 한다. 해당 요구사항은 이미 정리를 한 번 했지만 생각할 것이 많아 해당 게시글에서 다시 한 번 정리한 뒤 요구사항을 프로젝트에 반영해 보고자 작성하게 되었다.
1. 요구사항 정리
현재 '필수 기능' 요구사항을 반영한 프로젝트의 경우 'schedule' 테이블에서 '작성자명(author)' 만으로는 이게 누가 작성한 것인지 명확하게 확인을 할 수 없다. 요구사항에서는 '동명인' 문제를 예시로 들어주었는데, 다른 사용자가 같은 작성자명을 사용할 경우 앞서 말한 문제가 발생한다.
물론 이런 문제를 해결하기 위해서는 각 사용자별로 '사용자 정보(우리가 흔히 말하는 계정)' 를 저장해두고 사용자 정보와 요청 정보를 검증하는 '요청 권한 검증' 에 대한 부분을 추가해야 하겠지만, '테이블의 연관관계를 적용해보는 것' 이 해당 요구사항의 목적이라 판단해 순수하게 테이블 연관관계를 통해 최대한 사용자를 식별할 수 있도록 요구사항을 반영할 생각이다. 현재 과제는 'Spring + JDBC' 를 활용해 Spring 과 DB 가 어떻게 소통하고 작동하는지를 파악하는게 주 목적이므로 위와 같이 결정한 것도 있다.
다시 요구사항에 대해 이야기하면 '작성자' 를 식별할 수 있는 테이블을 추가하고 해당 테이블에 '작성자 이름, 이메일 주소, 등록일, 수정일' 에 대한 정보를 가지도록 요구하고 있다. 그리고 '작성자' 테이블의 기본 키를 '일정(schedule) 테이블' 에서 참조 키로 사용할 것 또한 요구하고 있다. 그래서 아래와 같이 다시 ERD 를 작성해 주었다.
우선 '작성자' 테이블을 따로 생성해야 하기에 'author' 테이블을 생성해 주었다. 'scdedule_author' 라 네이밍 할 까도 고민해 봤지만 과제에서 더 이상의 테이블 생성은 없을거라 판단 'author' 라 네이밍 해주었고, '작성자' 정보를 가질 별도의 테이블이 생겼으므로 'schedule' 테이블에서 'author' 컬럼을 제거해 주었다.
'author' 테이블은 요구사항에서 명시된 '작성자 이름(name), 이메일 주소(eMail), 등록일(createAt), 수정일(updateAt)' 정보를 각 컬럼에 저장하도록 테이블을 위와 같이 구성했다.
또한 두 테이블은 'author' 테이블의 'PK(기본 키)' 와 'shcedule' 테이블의 'FK(참조 키)' 를 통해 '연관관계' 를 맺어야 하므로 'schedule' 테이블에 'FK' 로 'authorId(= author 테이블 기본키)' 를 추가했다. 그리고 연관관계 표기는 위 이미지처럼 '없거나 하나 또는 여러개' 로 해주었다. 처음에는 " '일정' 이 생성되어야 'schedule, author' 테이블에 레코드가 추가되므로 실상 'author' 테이블의 각 'PK' 는 적어도 한 번은 참조되지 않을까? " 라는 생각을 했지만 '일정 삭제' 를 통해 작성자가 작성한 모든 일정을 삭제할 경우 '작성자 정보' 는 남아 있지만 '작성자 정보' 를 참조하는 '일정 정보' 는 남아있지 않는 경우도 생길 수 있기에 위와 같이 표기하였다.
마지막으로 다음의 내용을 명확하게 정리하고 요구사항을 반영하고자 한다. 앞서 말했듯 'author' 테이블을 추가한다고 해서 동명인에 대한 문제가 완벽히 해결되는 것은 아니다. 물론 '이메일 주소' 정보도 함께 전달되지만 그럼에도 명확하다는 느낌은 받지 못했다. 그래서 나의 경우 '이메일 주소' 는 '인증된 이메일 주소' 라 가정하고 요구사항을 반영하려고 한다. '이메일 주소' 는 본디 한 사람만이 가질 수 있는 값이다. 그러니 '이메일 주소' 를 통해 이전에 일정 작성 이력이 있는 사용자인지 확인하고, 'DB 에 저장된 작성자명' 과 '요청 정보의 작성자명' 이 다르다면 'DB 에 저장된 작성자명' 을 수정하고, 'author' 테이블의 'updateAt' 또한 수정해줄 것이다.
2. DB 세팅
신규 테이블이 추가되고 기존의 테이블도 일부 컬럼이 제거/추가되야 하기에 기존 Table 을 삭제후 이번에 사용될 'schedule, author' 테이블을 아래와 같이 생성해 주었다.
-- 기존 schedule_management.schedule 삭제
DROP TABLE schedule;
-- author Table 생성 쿼리
CREATE TABLE author (
id int NOT NULL AUTO_INCREMENT,
name varchar(20) NOT NULL,
e_mail varchar(254) NOT NULL,
create_at DATETIME NOT NULL,
update_at DATETIME NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX e_mail_unique (e_mail ASC) VISIBLE
);
-- schedule Table 생성 쿼리
CREATE TABLE schedule (
id int NOT NULL AUTO_INCREMENT,
body varchar(150) NOT NULL,
author_id int NOT NULL,
password varchar(6) NOT NULL,
create_at DATETIME NOT NULL,
update_at DATETIME NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (author_id) REFERENCES author (id)
);
이전 테이블 작성과 다른 점은 'author' 테이블의 'e_mail' 컬럼에 'Unique' 옵션을 설정한 것인데, 이는 위에서 말한대로 '작성자 정보' 를 식별할 때 '이메일(인증됬음을 가정)' 을 통해 작성자가 신규 작성자인지 기존에 있던 작성자인지를 파악하기 위해서이다. 해당 설정으로 인해 'e_mail' 컬럼 값은 컬럼 내에서 유일한 값을 가지게 된다(엄밀히 말하면 중복 컬럼 값을 막는 것이지만).
IntelliJ 에서 아래와 같이 생성한 두 테이블을 확인할 수 있었다.
'내일배움캠프 > Schedule Management' 카테고리의 다른 글
[일정 관리 앱] 일정 생성, 조회 API 테스트 (0) | 2024.10.08 |
---|---|
[일정 관리 앱] JPA 를 사용한 일정 관리 앱 구현시작 (0) | 2024.10.07 |
[일정 관리 앱] 요구사항 반영 후 API 테스트 (0) | 2024.10.04 |
[일정 관리 앱] API 테스트 - 일정 수정 및 삭제 (0) | 2024.09.30 |
[일정 관리 앱] Spring Framework 파라미터 인식 오류 (0) | 2024.09.30 |