반응형
목차
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문을 좀 더 깔끔하게 개선하였다.
반응형
'스파르타 내일배움캠프 > TIL(Today I learned)' 카테고리의 다른 글
25.03.27 TIL - HTTP(3) (2) | 2025.03.27 |
---|---|
일정 관리 앱 프로젝트 회고 (2) | 2025.03.26 |
25.03.25 TIL - HTTP(2) (2) | 2025.03.25 |
25.03.24 TIL - HTTP(1) (2) | 2025.03.24 |
25.03.21 TIL - 용어 모음(2) (2) | 2025.03.21 |