SchedulerApp Project
API 명세서 작성
일정 관리 앱 요구 사항
- 통신 데이터 형태 (request / response)는 JSON 형태 이다.
- 일정 생성 시 포함되어야 할 테이터는
- 식별자(id): 고유 식별자(ID)를 자동으로 생성 관리
- 할 일(task)
- 작성자명(authorName)
- 비밀번호(password)
- 작성일(createdDate) / 수정일(modifiedDate)
- 최초 입력 시 수정일은 작성일과 동일하면 된다.
- 형식: YYYY-MM-DD
HTTP API 설계
- 대부분의 API는 CRUD 작업을 수행한다.
설계 순서
1. HTTP Method
- POST : CREATE
- GET : READ
- PUT, PATCH : UPDATE
- DELETE : DELETE
2. Restful API → URL Mapping
3. 요청 및 응답값 설계
- HTTP Method + URL만으로 어떤 API인지 구분 가능해야 한다.
API 명세
일정 생성 / 일정 작성하기
- POST
- /api/schedules
전체 일정 조회 (등록된 일정 불러오기)
- GET
- /api/schedules
선택 일정 조회
- GET
- /api/schedules/{id}
선택한 일정 수정
- PATCH
- /api/schedules/{id}
선택한 일정 삭제
- DELETE
- /api/schedules/{id}
API 상세 명세
기능 | Method | URL | request | response | HTTP Status |
일정 생성 | POST | /api/schedules | 요청 body - id - task - authorName - password - createdDate |
일정 생성 정보 - id - task - authorName - password - createdDate - modifiedDate |
201 Created |
전체 일정 조회 | GET | /api/schedules | - | 다건 일정 정보 | 200 OK 404 NOT FOUND |
선택 일정 조회 | GET | /api/schedules/{id} | - | 단건 일정 정보 | 200 OK 404 NOT FOUND |
선택 일정 수정 | PATCH | /api/schedules/{id} | - task - authorName - password |
수정 일정 정보 | 200 OK 400 BAD REQUEST 404 NOT FOUND |
선택 일정 삭제 | DELETE | /api/schedules/{id} | - password | - | 200 OK 400 BAD REQUEST 404 NOT FOUND |
ERD (~LV2)
ERD(LV3~)
프로젝트 요구사항
LV0 API 명세 및 ERD 작성
✅API 명세서 > README.md에 작성
✅ ERD 작성 > README.md에 첨부
✅ SQL 작성 > schedule.sql 파일 생성 후 테이블 생성에 필요한 query 작성
GitHub - syuare-dev/SchedulerAppProject
Contribute to syuare-dev/SchedulerAppProject development by creating an account on GitHub.
github.com
LV1 일정 생성 및 조회
✅ 일정 생생 기능 구현
✅ 전체 일정 조회 기능 구현
✅ 선택 일정 조회 기능 구현
LV2 일정 수정 및 삭제
✅ 선택 일정 수정 기능 구현
✅ 선택 일정 삭제 기능 구현
✅ 수정/삭제 요청 시 비밀번호가 일치하면 동작하도록 구현
LV3 연관 관계 설정
✅ 작성자에게 고유 식별자를 부여
✅ 작성자를 할 일과 분리하여 관리
✅ 작성자 테이블 생성 > 일정 테이블에 FK를 생성해 연관 관계 설정
LV4 페이지네이션
✅ 등록된 일정 목록을 페이지 번호와 크기 기준으로 모두 조회
✅ 조회한 일정 목록에 작성자 이름 포함
✅ 범위를 넘어선 페이지 요청 시 빈 배열 반환
Paging 객체 활용 가능
트러블 슈팅
1. schedule 테이블에 author_id 컬럼 추가 시 NOT NULL 속성으로 바로 추가할 경우 오류 발생
LV3 연관 관계 설정에서 작성자의 고유 식별제를 부여하기 위해 schedules 테이블에 author_id 컬럼 추가하는 과정에서 author_id가 향후 작성자를 식별할 id이기 때문에 항상 값이 있어야 해서 NOT NULL 속성을 주며 생성하였다.
다만, 그 과정에서 오류가 발생하였다.
ALTER TABLE schedules
ADD COLUMN author_id BIGINT NOT NULL COMMENT '작성자 식별자' AFTER task;
ADD CONSTRAINT FK_schedule_author
FOREIGN KEY (author_id) REFERENCES authors(id)
ON DELETE RESTRICT
ON UPDATE CASCADE;
#오류 메세지
[23000][1452] Cannot add or update a child row: a foreign key constraint fails
(schedulerapp_test.#sql-15cc_d1,
CONSTRAINT FK_schedule_author
FOREIGN KEY (author_id) REFERENCES authors (id) ON DELETE RESTRICT ON UPDATE CASCADE)
문제 원인: 외래 키(FOREIGN KEY) 제약 조건과 관련된 오류
해당 오류에 대해 확인해본 결과 자식 테이블(schedules)에서 부모 테이블(authors)에 존재하지 않는 값을 참조하려고 할 때 발생한다. 즉, authors 테이블에 author_id 컬럼에 넣으려는 값이 존재하지 않을 때 발생한다.
ADD COLUMN author_id BIGINT NOT NULL
author_id 컬럼을 추가할 때 NOT NULL 속성이 추가됨에 따라 기본 값 0이 저장된다.
FOREIGN KEY (author_id) REFERENCES authors(id)
여기서 FOREIGN KEY로 schedule.author_id = 0 값을 author.id에서 찾아보지만
author 테이블에 id 값이 0이 존재하지 않기 때문에 오류로 직결된다.
해결 방법
1) schedule 테이블에 author_id 컬럼을 추가할 때 NULL 허용 속성으로 추가한다.
2) 작성자명 값을 기준으로 JOIN하여 schedules 테이블의 author_id에 author 테이블의 id값으로 저장한다
3) 이후 author_id 컬럼을 NOT NULL 속성으로 변경하고 FOREIGN KEY를 생성한다
# 컬럼 추가(NULL 허용)
ALTER TABLE schedules
ADD COLUMN author_id BIGINT NULL COMMENT '작성자 식별자' AFTER task;
/*
authors > name, created_date, modified_date 컬럼에 신규 데이터 삽입
schedules > authorName 중복 값 제외, created_date, modified_date 에 CURRENT_DATE 데이터를 넣기
> 데이터 삽입 시점에 작성자 레코드의 생성/수정일을 알 수 없기 때문
*/
INSERT INTO authors (name, created_date, modified_date)
SELECT DISTINCT authorName, CURRENT_DATE, CURRENT_DATE
FROM schedules;
/*
s.authorName = a.name 으로 JOIN
s.author_id 에 a.id 값을 넣기
*/
UPDATE schedules s
JOIN authors a ON s.authorName = a.name
SET s.author_id = a.id
WHERE s.author_id IS NULL;
/*
schedules > author_id 컬럼을 NOT NULL 로 변경
외래 키(Foreign Key)를 author_id 컬럼으로 선언 > id 컬럼 참조
authors > id 행 삭제 시 schedules id 참조 데이터가 있을 경우 삭제 X
authors > id 값 변경 시 schedules id 값도 자동 업데이트
*/
ALTER TABLE schedules
MODIFY author_id BIGINT NOT NULL COMMENT '작성자 식별자' AFTER task,
ADD CONSTRAINT FK_schedule_author
FOREIGN KEY (author_id) REFERENCES authors(id)
ON DELETE RESTRICT
ON UPDATE CASCADE;
2. jdbcTemplate.query 오류
(페이지네이션 코드 구현 중) 저장된 데이터(일정) 수를 구하는 메서드를 구현하는 와중에
지금까지 다른 메서드에서는 잘 작성되던 jdbcTemplate.query 가 오류가 발생하였다.

문제 원인
jdbcTemplate.query 는 List 형태를 반환하는 쿼리를 실행할 때 주로 사용한다.
public Schedule findScheduleByIDOrElseThrow(Long id) {
List<Schedule> result = jdbcTemplate.query("select * from schedules where id = ?", scheduleRowMapperV2(), id);
return result.stream().findAny().orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Does not exists id = " + id));
}
그런데 오류가 발생한 메서드는 List 형태가 아니라 Long 타입의 단일 값을 반환 타입으로 받는 메서드이다.
해결 방법
queryForObject 사용 > 하나의 결과만 반환하는 쿼리가 있을 경우 사용할 수 있는 메서드
count라는 단일 결과값을 반환받으면 되기 때문에 기존에 사용했던 query 대신 queryForObject 메서드를 사용하여 해결하였다.
@Override
public Long countSchedules() {
return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM schedules", Long.class);
}
3. Create 기능 오류
LV4 까지 구현하고 난 후 지금까지 구현한 기능을 테스트하는 과정에서 create 기능이 정상적으로 동작하지 않고 500 에러가 발생하는 것을 확인하였다.

문제 원인
과제 제출을 위해 급하게 작업을 하다보니 여러 과정을 패싱한 것이 문제로 보이는데,
그 중 예상 원인으로 생각하는 것은 테이블에는 작성자(Author)의 id값이 schedules 테이블과 Author 테이블에 있는데
코드 상으로는 author id 값에 해당하는 테이블 컬럼의 값이 Null로 인식해서 발생하는 문제로 판단된다.
해결 방법
아직 해결 중 (~ing..)
정리 / 회고
Spring Boot로 구현한 첫 과제였는데 결론은 너무 어렵고 아직도 이해가 되지 않는 것이 너무 많다.
과제를 진행해야한다는 압박감에 강의를 듣는데 조급함이 느껴졌다.
왜냐하면 과제 발제는 수요일에 진행되었는데 실제 과제 시작은 금주 월요일에 시작했기 때문이다.
그러다보니 여러 특강을 진행해주셔도 머리에 들어오지 않고 오로지 과제에 몰입했던 것 같다.
그러나 몇 번을 봐도 기본적인 CRUD 기능을 구현하는 것도 쉽지 않았다. 특히 JDBC를 이용해서는 더욱 더..
그래서 내가 선택한 방법은 일단 강의를 따라가면서 JDBC 없이, DB 없이 CRUD 기능을 만드는 것부터 천천히 진행하였다.
이러한 방법을 통해 CRUD 기능을 만드는 것에는 조금은 익숙해졌다? 이런 거구나 하면서 머리에 들어온 것 같은데
정신차리고 보니 이미 화요일... 급하게 JDBC로 리팩토링을 하고 도전 과제를 진행하려고 하는데 시간에 급급한 나머지 머릿속에는 는 고민이 필요하다고 생각되는 과정을 생략하고 과제에 대한 구현에만 몰두한 것 같다.
그 결과.. 기존에 구현해둔 CRUD 기능이 마비가 되버렸다.
기초의 중요성을 알게 되었지만, 기초를 익히는 것은 쉽지 않았음을 또 알게 되었다.
반복 학습이 필요하고, 현재 내 수준도 조금 알게 되었던 것 같다.
멘탈이 조금 힘들긴 하지만 이 또한 반복적으로 하다보면 익숙해지겠지 하며 마음을 다잡는 날이었던 것 같다.
과제 제출하면서 느꼈던 것은..
개발자로 가려고 했던 선택이 잘못된 걸까?
라는 생각이 문득든 날이었던 것 같다.
완벽하게 모든 것을 다 알고 이해할 수는 없겠지만,
그래도 지금보다는 기초가 잘 다져져서, 기본적인 실력이 얼른 좋아져서 이런 고민을 조금은 덜할 수 있는 날이 오기를..
참고 자료
JDBCTemplate 관련
'Sparta > Projects' 카테고리의 다른 글
[Project] 주특기 심화 - 트러블 슈팅 (0) | 2025.06.12 |
---|---|
[Project] CRUD 코드 개선 (2) | 2025.06.12 |
[Project] 일정 관리 앱 Develop 하기 (with JPA) (0) | 2025.05.26 |
[Project] 키오스크를 만들어보자 (0) | 2025.05.01 |
[Project] 계산기를 만들자 (0) | 2025.04.18 |