개인 과제 중 중간에 막혀서 튜터님께 도움을 요청하러 갔는데 디버그로 정확한 원인을 파악하는 방법을 알려주셨는데 이걸 왜 여태껏 몰랐을까 하는 중요한 기본기였다. 그래서 들은 내용을 정리해놓는다.
지금까진 어떤 문제가 생기면 문제가 생길 것 같은 부분에서 System.out.print 로 일일히 콘솔에 찍어보았는데 디버그모드를 사용하면 그럴 필요가 없었다.
과제 중 생긴 문제
@GetMapping("/lists")
public ResponseEntity<List<ScheduleResponseDto>> findListSchedules(
@RequestParam(required = false) String date,
@RequestParam(required = false) String name
) {
return new ResponseEntity<>(scheduleService.findListSchedules(date, name), HttpStatus.OK);
}
과제 중 날짜나 작성자명 으로 필터링하여 일정 목록을 조회하는 미션이 있었다. 그래서 일단은 `@ResponseParam` 으로 값을 받고 둘 중 하나가 값이 비어있어도 실행될 수 있도록 `requied = false` 값을 주었다.
public List<ScheduleResponseDto> findListSchedules(String date, String name) {
LocalDate updateAt = (date != null) ? LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd")) : null;
return scheduleRepository.findListSchedules(updateAt, name);
}
받은 값을 Service Layer 에서 날짜값은 `LocalDate` 타입으로 바꿔주고 데이터베이스에 넘겨 필터링 된 일정 목록 데이터를 받아오면 된다.
public List<ScheduleResponseDto> findListSchedules(LocalDate date, String name) {
return jdbcTemplate.query("select * from Schedule where user_name = ? or update_date = ?", scheduleRowMappers(), name, date);
}
jdbc 는 강의에서 따라적어본 게 전부라 강의내용에 있던 전체목록을 조회하는 코드를 활용해 나름 코드를 짜봤다.
그렇게 포스트맨에서 테스트해본 결과...
조회는 되는데 목록이 아니라 일정 1개만 가져오는 문제가 생겼다. 그리고 날짜를 테스트해보니
날짜는 아예 빈 배열을 반환하고 있었다. 그래서 문제를 파악하기 위해 일단 데이터값이 제대로 로직까지 전달이 되는 지 확인해야 되는데 디버그를 사용하기 전이라면 변수가 전달되는 Controller, Service, Repository 에서 각각 전부 sout으로 콘솔에 찍어보았다.
그런데 오늘 배운 디버그를 활용하면 그럴 필요없이 확인할 수 있었다.
디버그 활용해서 원인 찾기
우선 인텔리제이에서 코드줄 번호에 보면 가끔씩 이렇게 빨간 원이 뜨는 걸 볼 수 있었는데 이게 알고보니 디버그할 때 중단점를 체크하는 것이였다.
실행 옆에 벌레모양의 디버그모드를 실행하고 포스트맨에서 테스트요청을 날려보았다.
디버그 모드에선 요청을 날리면 그냥 바로 결과값을 보여주는게 아니라 중단점에서 멈춘다.
그리고 인텔리제이에선 중단점으로 체크한 지점을 보여주면서 이때의 결과값을 보여준다.
이렇게 각 중단점에서 원하는 데이터가 잘 전달됐는지 확인해보고 문제 보이는 데이터베이스의 쿼리 검색하는 부분까지 원하는 데이터가 잘 오는 것까지 확인하였다.
select * from Schedule where user_name = "작성자1" or update_date = NULL
쿼리를 그대로 데이터베이스의 쿼리콘솔에 적고 ? 에 받은 데이터값을 넣어보았다. 그랬더니 아까 조회했던 대로 하나의 목록이 나오는데 여기서 하나 실수했던 걸 발견했다.
테스트를 위해 인텔리제이 안에서 행 추가가 보이길래 추가해서 그냥 적으면 데이터가 추가되는 줄 알았는데 작성을 하고 제출 버튼을 눌렀어야 하는 것이였다...! 그래서 다시 여러개의 데이터를 만들고 조회해보니...
해결이 되었다. 그럼 날짜는 왜 조회가 안 되던걸까?
select * from Schedule where user_name = NULL or update_date = "2024-12-03"
값을 그대로 쿼리에 넣어보니 빈값이 나와 빈 배열이 결과값으로 나온 것이였다. 그럼 이제 올바른 쿼리를 전달해서 원하는 데이터를 조회할 수 있도록 계속 테스트해보면 해결될 것이다.
오늘 해본 이 디버깅 과정은 앞으로도 계속 사용하게 될 중요한 기능이라고 느껴졌다.
'개발 > 내일배움캠프 TIL' 카테고리의 다른 글
[TIL #35] 빈 생명주기 콜백 (0) | 2024.12.06 |
---|---|
[TIL #33] 컴포넌트 스캔 탐색 위치와 기본 스캔 대상 (0) | 2024.12.04 |
[TIL # 31] SQL 타입과 함수 (0) | 2024.12.02 |
[TIL #30] HttpEntity (0) | 2024.12.01 |
[TIL #29] @RestController (0) | 2024.11.30 |