본문 바로가기
스파르타 내일배움캠프/TIL(Today I learned)

25.03.26 TIL - 일정 관리 앱 트러블 슈팅

by pandastic 2025. 3. 26.
반응형

 

 

목차

     

    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