오늘 진행한 학습 요약
1. CH 4 일정 관리 앱 만들기 development
- 필수 기능 가이드
- Lv 0. API 명세 및 ERD 작성
- Lv 1. 일정 CRUD
- Lv 2. 유저 CRUD
- Lv 3. 회원가입
- Lv 4. 로그인(인증)
- 추가 기능 가이드
- Lv 5. 다양한 예외처리 적용하기
- Lv 6. 비밀번호 암호화
- 트러블 슈팅
JPA 일정관리 앱 Git-hub 링크 : https://github.com/chews26/Schedule-jpa
2. 알고리즘 코드카다 Day30(작성 생략)
CodingTest Git-hub 링크 : https://github.com/chews26/CodingTest
학습 정리
1. CH 4 일정 관리 앱 만들기 development
👀 필수 기능 가이드
- Lv 0. API 명세 및 ERD 작성
- Lv 1. 일정 CRUD
- Lv 2. 유저 CRUD
- Lv 3. 회원가입
- 회원가입 기능 구현 및 회원가입 부분 Filter 기능 예외
- Lv 4. 로그인(인증)
- 로그인 기능 구현 및 세션유지 Filter 기능 추가
👀 추가 기능 가이드
- Lv 5. 다양한 예외처리 적용하기
- @NotBlank
- @NotNull (LocalDateTime에서는 @NotNull이 아니면 제대로 데이터타입이 입력되지 않는다)
- @Valid @RequestBody ScheduleRequestDto requestDto
- Lv 6. 비밀번호 암호화
- passwordEncoder.encode사용해서 비밀번호 암호화
- passwordEncoder.matches를 사용해서 입력비밀번호와 암호화된 비밀번호의 값을 비교
👾 트러블 슈팅
- 🤔 문제
- 로그인 예외처리를 안해서 HTTP 상태코드 500 error로 반환되었다.
- 요구사항을 다시 한번 읽어보는 과정에서 예외처리는 했는데 HttpStatus로 반환되게끔 구현하지 않은 것을 발견하였다.
- 😎 해결방법
- HttpStatus.NOT_FOUND 메서드를 사용해 404로 반환되게 수정하였다.
- 설정을 따로 하지 않으면 500 error가 반환되는 사실을 새롭게 알게 되었다.
- 🤔 문제
- Schedule, Session, User별 컨트롤러를 구현하였는데 /schedule 경로가 ScheduleController와 SessionHomeController에서 동시에 사용되어 경로 충돌이 발생하였다.
- 😎 해결방법
- 전체 일정을 조회하는 기능에 /schedule/all path를 이용하도록 수정하였다.
- Schedule을 home으로 사용하고 싶어 @GetMapping({"/","/schedule"})를 사용하였다. 이렇게 사용하면 메인페이지에 두개 다 모두 접근이 가능하다고 하는데 이렇게 사용하는게 맞는지는 잘 모르겠다.
- 🤔 문제
- DELETE 요청에서 @RequestBody를 사용했으나 요청 본문이 없어서 Required request body is missing 오류가 발생했다.
- 😎 해결방법
- DELETE은 본문이 필요하지 않다고 한다. 따라서 @RequestBody를 제거하니 정상적으로 처리되었다!
- 🤔 문제
- 필터를 필수구현해야하는 것을 모르고 스케줄 컨트롤러에 세션이 유지되고 있는지 검증하는 코드를 각각 넣었었다..
- 필터가 아니더라도 저 검증하는 코드는 반복되고 유지보수가 어렵고 효율이 낮다.
- 😎 해결방법
- 요구사항을 읽고 강의에서 배웠던 필터를 구현하였다.
- 필터를 구현하면 인증처리가 일관되게 관리되고 세션을 검사하여 세션이 유지되고 있는지 등의 관리를 알아서 한다고 한다.
- 그러니 쿠키,세션과 필터는 서로 같이 쓰는게 매우 좋다고 볼 수 있다.
- 🤔 문제
-
- DTO를 사용하면서 개별 파라미터를 전달하여 유지보수가 어렵고 코드를 읽기 어려웠다.
- 강의내용을 참고하면서 작성하다보니 계속 DTO를 제대로 활용하지 못했다.
-
- 😎 해결방법
- 개별 파라미터로 받던 것을 ScheduleRequestDto dto로 수정하고 dto.get으로 가져오게끔 수정하였다. 이렇게 하면 컨트롤러와 서비스 코드 가독성이 좋아진다.
- 🤔 문제
- 회원가입은 되는데 로그인이 안되는 문제가 발생했다.
- 로그인 이후 세션에 사용자 정보를 제대로 설정하지 않아 세션을 통해 사용자 식별이 불가능한 상황이 발생한 것이다.
- 😎 해결방법
- 로그인필터에서 sessionKey로 설정한 키를찾고있었으나 나는 Const.LOGIN_USER 로 키를 할당하였기 때문에 키를 찾지 못해 발생한 문제였다. Const.LOGIN_USER로 알맞게 수정하였다.
- 🤔 문제
- 비밀번호 암호화 적용 후 로그인이 안되는 문제가 발생했다.
- 😎 해결방법
- 비밀번호 일치여부를 passwordEncoder.matches메서드를 사용해야 원본 비밀번호와 암호화된 비밀번호를 비교할 수 있다고 한다.
- 따라서 !passwordEncoder.matches(password, user.getPassword()) 로 수정하였더니 잘 작동한다!
- 💀 해결 못한 문제
- LocalDateTime 필드를 "yyyy-MM-dd HH:mm:ss" 형식으로 전송할 때 변환 오류가 발생하여 @JsonFormat이랑 @DateTimeFormat 으로 해결하고자 하였지만 실패하였다.
- 그래서 그냥 필드를 " yyyy-MM-ddTHH:mm:ss" 형식으로 전송했다.