개발/부트캠프

본캠프 : 개인 과제(일정 관리 앱 만들기)_ CRUD & 3 Layered Architecture 동작 과정

EJ EJ 2025. 2. 2. 13:18

 

▶ 전체 일정 조회(READ - GET) 동작 과정

(1) Controller

  • @RequestParam(required = false) → 쿼리 파라미터가 없어도 동작
  • 클라이언트가 updatedAt과 name을 선택적으로 전달 가능
    • GET /schedules → 모든 일정 조회
    • GET /schedules?updatedAt=2025-01-31 → 특정 날짜의 일정 조회
    • GET /schedules?name=홍길동 → 특정 name 일정 조회
    • GET /schedules?updatedAt=2025-01-31&name=홍길동 → 두 조건 모두 충족하는 일정 조회

(2) Service

 

  1. scheduleRepository.findAll(updatedAt, name) 호출
    • DB에서 조회 조건에 맞는 Schedule 객체 리스트를 가져옴
  2. map(schedule -> new ScheduleResponseDto(...))
    • 가져온 Schedule 객체를 ScheduleResponseDto로 변환
  3. .collect(Collectors.toList())
    • 변환된 데이터를 리스트 형태로 반환

→ 클라이언트는 ScheduleResponseDto 리스트를 받게 됨,

    데이터가 없을 경우 빈 리스트 반환( 200 OK [ ] )  *아래 예외 처리 적용 방식 참고

 

(3) Repository

  1. 기본 SQL 생성
    • "SELECT * FROM schedule WHERE 1 = 1"을 기본 쿼리로 설정
    • WHERE 1 = 1을 사용하여 조건을 동적으로 추가하기 쉽게 만듦
  2. 조건 추가 (updatedAt, name)
    • updatedAt 값이 있을 경우, AND DATE(updatedAt) = ? 추가
      • LocalDate.parse(updatedAt) 사용 (YYYY-MM-DD 형식 변환)
    • name 값이 있을 경우, AND name = ? 추가
  3. 최신 수정일 기준 정렬 (ORDER BY updatedAt DESC)
    • 최근 수정된 일정부터 조회
  4. SQL 실행 및 DTO 변환
    • jdbcTemplate.query(...)를 사용하여 SQL 실행
    • 결과를 ScheduleResponseDto 객체로 변환 후 반환

→ 조회 조건에 맞는 일정 목록을 최신 수정일 순으로 반환 

 

 

▶ 예외 처리 적용 방식

Service 비즈니스 로직에서 요청 데이터가 없을 경우 예외 발생하는 법

- List<ScheduleResponseDto> schedules 변수로 변환 후 예외 처리
- 리스트가 비어 있을 경우 ResponseStatusException 발생

 

public List<ScheduleResponseDto> findAll(String updatedAt, String name) {
    // 일정 조회
    List<ScheduleResponseDto> schedules = scheduleRepository.findAll(updatedAt, name).stream()
            .map(schedule -> new ScheduleResponseDto(
                    schedule.getId(),
                    schedule.getName(),
                    schedule.getTitle(),
                    schedule.getContents(),
                    schedule.getCreatedAt(),
                    schedule.getUpdatedAt()
            ))
            .collect(Collectors.toList());  //  리스트 변환 완료

    //  일정이 없을 경우 예외 발생
    if (schedules.isEmpty()) {
        throw new ResponseStatusException(HttpStatus.NOT_FOUND, "해당 일정이 존재하지 않습니다.");
    }

    return schedules;  //  정상적인 데이터 반환
}