이슈 리포트
이슈1
- 생성 파트 구현 후 POSTMAN에서 실행 시 500번대 / 400번대 에러가 나옴
- 에러 메시지 첫 줄에 'java.sql.SQLSyntaxErrorException: Table 'memo.schedulelist' doesn't exist'라고 적혀 있었음. 코드 전체를 통들어 ctrl+F로 memo를 찾아봐도 없었음. 결국 GPT한테 물어봄
- memo라는 데이터베이스 안에 scheduleList라는 테이블이 없어서 생긴 문제라고 함. memo는 어디서..? -> 데이터베이스 이름이 잘못 설정되었을 수 있다고 한다. application.properties 또는 application.yml에 설정한 데이터베이스가 memo가 맞는지 확인하라고.
- 확인해보니 datasource.url 끝이 memo로 되어 있었음. 강의에 있던 코드스니펫을 그대로 써서 생긴 문제인 듯. 마지막 경로를 schedule로 바꾸니 문제 해결!
- 새로운 문제 발견. id가 null로 나옴. 이유는, 강의에서는 jdbc에 넣을 때 Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters)); 이렇게 받아서 ResponseEntity<>(key.longValue(), schedule.getTask(), ... )이렇게 반환해줌. ResponseEntity의 입력 파라미터를 하나씩 받는데, 나는 Schedule을 통째로 넣어줬음.
- 해결 방법: ScheduleResponseDto(입력 파라미터)의 입력 파라미터에 Long id, Schedule schedule 이렇게 두 개를 넣어줌.
- id가 나옴. 이제 조회를 구현해보자.
이슈 2
- Schedule Entity에서 입력으로 RequestDto를 넣어주고, 이 값을 받아 Entity 속성으로 할당했는데, 에러가 남. 찾아보니 이게 RowMapper에서 DB에서 조회한 값을 직접 필드로 넣어주는 생성자가 존재하지 않거나, ScheduleRequestDto로만 객체를 생성할 수 있게 되어 있다면 문제가 된다고. (그러고 보니 RowMapper에서 ResultSet에서 getLong 같은 걸로 속성을 받아오는데, RequestDto를 입력으로 넣어주면 이런 경우에 Schedule에 속성을 할당해주지 못함)
- 그래서 Schedule 생성자를 아래와 같이 수정함
- 이렇게 하면 Controller에서 RequestDto에서 task, writer, password를 받아와 넘겨줘서 Service단에서 Schedule(task, writer, password)로 생성해줄 수 있음! 해결!
이슈 3
- 문제: updateSchedule의 리턴 타입으로 Schedule을 설정했는데, update 스케줄 자체를 schedule로 받아줄 수 없음(방법을 모름)
- 해결: 강의를 찾아보니 update와 update한 데이터의 수를 반환하는 jdbc메서드가 있었고, 이 메서드를 통과한 경우 findScheduleByIdOrElseThrow(id)로 바뀐 데이터를 보여주도록 하더라.
- To do: jdbc 문법에 대한 이해가 더 필요하겠다. RowMapper도 그렇고, ResultSet도 그렇고 jdbcTemplate.update 문법도 그렇고 이걸 파악하지 못하면 필요한 비즈니스 로직을 구현하지 못할 것 같다.
이슈 4
- 문제: @Transactional의 의미. 서비스의 updateSchedule 메서드에 삽입하는데, 왜 넣어주는지 정확히 이해를 못했다.
- 해결: 하나의 작업 단위(transaction)으로 묶어서 모든 작업이 성공해야 커밋되고, 하나라도 실패하면 전체 롤백 되도록 하는 어노테이션이라고 함. 데이터의 일관성과 무결성을 보장하기 위해 사용한다는데. 아마도 중간에 Throw로 걸리는 부분들에 걸렸을 때 실행되지 않도록 하기 위함이 아닐까? 하는 추측