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

일정 관리 앱 프로젝트 회고

by pandastic 2025. 3. 26.
반응형

 

 

목차

     

     

    📆 일정 관리 앱


    ✅ 기본적인 CRUD가 제공되는 일정 관리 앱

     

    1. 기능 및 조건

    Lv 0. API 명세 및 ERD 작성

    • 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 '수정일'
    );

     

     

    Lv 1. 일정 생성 및 조회

    1. 일정 생성(일정 작성하기)

    • 일정 생성 시, 포함되어야할 데이터
      • 할일, 작성자명, 비밀번호, 작성/수정일을 저장
      • 작성/수정일은 날짜와 시간을 모두 포함한 형태
      • 각 일정의 고유 식별자(ID)를 자동으로 생성하여 관리
      • 최초 입력 시, 수정일은 작성일과 동일

    2. 전체 일정 조회(등록된 일정 불러오기)

    • 다음 조건을 바탕으로 등록된 일정 목록을 전부 조회
      • 수정일 (형식 : YYYY-MM-DD)
      • 작성자명
    • 조건 중 한 가지만을 충족하거나, 둘 다 충족을 하지 않을 수도, 두 가지를 모두 충족할 수도 있음.
    • 수정일 기준 내림차순으로 정렬하여 조회.

    3. 선택 일정 조회(선택한 일정 정보 불러오기)

    • 선택한 일정 단건의 정보를 조회할 수 있음.
    • 일정의 고유 식별자(ID)를 사용하여 조회.

     

    Lv 2. 일정 수정 및 삭제

    1. 선택한 일정 수정

    • 선택한 일정 내용 중 할일, 작성자명 만 수정 가능.
      • 서버에 일정 수정을 요청할 때 비밀번호를 함께 전달.
      • 작성일 은 변경할 수 없으며, 수정일 은 수정 완료 시, 수정한 시점으로 변경.

    2. 선택한 일정 삭제

    • 선택한 일정을 삭제할 수 있음.
      • 서버에 일정 수정을 요청할 때 비밀번호를 함께 전달.

    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 명세서를 처음 작성해서 옳게 작성한건지도 아직 감이 안잡힌다.

    반응형