반응형
목차
1. 기능 및 조건
- API 명세서 작성하기.
- ERD 작성하기.
- SQL 작성하기.
1. 일정 관리 API 명세서
2. ERD 작성
3. SQL 작성하기
CREATE TABLE todo
(
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '메모 식별자',
todo VARCHAR(2000) NOT NULL COMMENT '할일',
author VARCHAR(20) NOT NULL COMMENT '작성자',
pw VARCHAR(10) NOT NULL COMMENT '비밀번호',
created DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '작성일',
modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '수정일'
);
1. 일정 생성(일정 작성하기)
- 일정 생성 시, 포함되어야할 데이터
- 할일, 작성자명, 비밀번호, 작성/수정일을 저장
- 작성/수정일은 날짜와 시간을 모두 포함한 형태
- 각 일정의 고유 식별자(ID)를 자동으로 생성하여 관리
- 최초 입력 시, 수정일은 작성일과 동일
2. 전체 일정 조회(등록된 일정 불러오기)
- 다음 조건을 바탕으로 등록된 일정 목록을 전부 조회
- 수정일 (형식 : YYYY-MM-DD)
- 작성자명
- 조건 중 한 가지만을 충족하거나, 둘 다 충족을 하지 않을 수도, 두 가지를 모두 충족할 수도 있음.
- 수정일 기준 내림차순으로 정렬하여 조회.
3. 선택 일정 조회(선택한 일정 정보 불러오기)
- 선택한 일정 단건의 정보를 조회할 수 있음.
- 일정의 고유 식별자(ID)를 사용하여 조회.
1. 선택한 일정 수정
- 선택한 일정 내용 중 할일, 작성자명 만 수정 가능.
- 서버에 일정 수정을 요청할 때 비밀번호를 함께 전달.
- 작성일 은 변경할 수 없으며, 수정일 은 수정 완료 시, 수정한 시점으로 변경.
2. 선택한 일정 삭제
- 선택한 일정을 삭제할 수 있음.
- 서버에 일정 수정을 요청할 때 비밀번호를 함께 전달.
- 생성
- 목록 조건 조회
- id로 조회
- 수정
- 삭제(비밀번호 일치 시)
- 삭제(비밀번호 불일치 시)
3. 트러블 슈팅
1. 문제 상황
- 일정 목록 조건 조회 시 수정일 데이터가 Postman 출력 시 [ ] 빈 배열로 들어오는 이슈.
2. 해결 과정
- BreakPoint를 찍은 후 디버깅을 했더니 데이터 자체는 잘 받아오고 있었다.
- 데이터를 받은 후 최종적으로 목록을 출력할 때 비어버리는 것이었다.
- DATE(modified)로 감싸주어 날짜값만 가져오도록 하여 해결하였다.
3. 문제 발생 이유
CREATE TABLE todo
(
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '메모 식별자',
todo VARCHAR(2000) NOT NULL COMMENT '할일',
author VARCHAR(20) NOT NULL COMMENT '작성자',
pw VARCHAR(10) NOT NULL COMMENT '비밀번호',
created DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '작성일',
modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '수정일'
);
- 위와 같이 SQL을 작성할 떄 DATETIME으로 설정해서 넣었는데, DATETIME은 날짜와 시간까지 반환하는 타입이다.
- SQL에서는 할 일이 생성될 때 서버의 현재 날짜 + 시간까지 합쳐서 들어간다.
- 하지만 내가 Dto와 Entity 등에 설정한 modified의 타입은 LocalDate 타입으로 날짜까지만 들어가게 된다. (시간까지 넣으려면 LocalDateTime이나 TimeStamp을 사용.)
- 결국 타입이 맞지 않아서 생긴 문제였다.
[문제 코드]
더보기
@Override
public List<TodoResponseDto> findAllTodos(String author, LocalDate modified) {
StringBuilder sql = new StringBuilder("select id, todo, author, created, modified from todo where 1=1");
List<Object> list = new ArrayList<>();
// 둘 다 충족하는 경우
if(author != null && !author.isEmpty() && modified != null){
sql.append(" and author = ? and modified = ? ");
list.add(author);
list.add(modified);
// 둘 중에 하나 충족하는 경우
}else if(author != null && !author.isEmpty() || modified != null){
if(author != null && !author.isEmpty()){
sql.append(" and author = ?");
list.add(author);
}else {
sql.append(" and modified = ?");
list.add(modified);
}
}
sql.append(" order by modified desc");
return jdbcTemplate.query(sql.toString(), list.toArray(), todoRowMapper());
}
[문제 해결 및 개선된 코드]
더보기
@Override
public List<TodoResponseDto> findAllTodos(String author, LocalDate modified) {
StringBuilder sql = new StringBuilder("select id, todo, author, created, modified from todo where 1=1");
List<Object> list = new ArrayList<>();
if(author != null && !author.isEmpty()){
sql.append(" and author = ?");
list.add(author);
}
if(modified != null){
sql.append(" and DATE(modified) = ?");
list.add(modified);
}
sql.append(" order by modified desc");
return jdbcTemplate.query(sql.toString(), list.toArray(), todoRowMapper());
}
sql문에 DATE(modified) 로 바꿔주었고, if문을 좀 더 깔끔하게 개선하였다.
🤓 회고
강의를 제대로 이해하지 못한 채 실습만 급하게 따라해보고 과제를 진행해야했다.
아직까지 스프링의 흐름이 어떻게 진행되는지도 잘 이해가 안되고 API 명세서를 처음 작성해서 옳게 작성한건지도 아직 감이 안잡힌다.
반응형
'스파르타 내일배움캠프 > TIL(Today I learned)' 카테고리의 다른 글
25.03.28 TIL - Web Application(1) (3) | 2025.03.28 |
---|---|
25.03.27 TIL - HTTP(3) (2) | 2025.03.27 |
25.03.26 TIL - 일정 관리 앱 트러블 슈팅 (1) | 2025.03.26 |
25.03.25 TIL - HTTP(2) (2) | 2025.03.25 |
25.03.24 TIL - HTTP(1) (2) | 2025.03.24 |