이번 과제에서 세션 기반 인증을 사용하면서 느낀 점은
인증은 단순히 로그인 여부를 확인하는 것이 아니라
이 사용자가 누구인지 신뢰할 수 있게 증명하는 과정이라는 점이었다
@SessionAttribute(name = "loginUser") SessionUser sessionUser
이 코드는 단순히 값을 꺼내는 것이 아니라
넌 이미 인증된 사용자야 라는 의미를 가진다
다시보는 인증과 인과
과제를 하면서 이 말의 대한 정확히 의미를 느낄수있었는데
세션으로 로그인하며 인증상태라고 모든 일정이나,댓글은 건드는것이아닌
반드시 내 데이터인지 검증해야 한다라는걸 직접 느낄수있었다
findByIdAndUserId(scheduleId, userId)
조회 단계에서 확인하며 권한 검증까지 포함
DB 조회에 권한을 포함시키면 코드가 단순해지는걸 과제를 하면서 체감했다
일정 삭제 시 발생한 에러:
Cannot delete or update a parent row: a foreign key constraint fails
원인
댓글이 남아있는상태에서 일정을 삭제하려고하니, 삭제할수없는 에러가 떠있었다
그러면서 에러가 대한 사항을 확인하기위해서 검색을 해본결과, DB는 무결성을 자동으로 보장한다라는걸 알게되었고 부모 삭제 전에 자식 데이터를 반드시 처리해야 하는걸 깨달으며 JPA 의 DB구조를 다시한번 알게되었다
해결
commentRepository.deleteAllByScheduleId(scheduleId);
scheduleRepository.delete(schedule);
일정삭제를 처리하는 서비스로직에 댓글을 먼저 삭제할수있도록 추가해주었다
개념
진행흐름
1) 클라이언트 요청
GET /schedules?page=0&size=10
2) 컨트롤러에서 파라미터로 받기
@RequestParam int page
@RequestParam int size
3) 서비스에서 변환
Pageable pageable = PageRequest.of(page, size);
sort를 사용해 정렬처리가능
4) Repository DB 쿼리
LIMIT 10 OFFSET 0
stream 기능을 사용못하는 에러를 처리하면서, Page는 단순 리스트가 아니라 메타데이터 포함이라는걸 알게되었다 응답 DTO 변환 시 map() 사용해야 하며 repository에서 쿼리문을 두번실행하는것도 직접 에러를 통해 알게되었다