Today I Learned

2024 스파르타 내일배움캠프 Sping 트랙 참여 // day32

shinelee26 2024. 11. 15. 03:18

오늘 진행한 학습 요약

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 5. 다양한 예외처리 적용하기
    • @NotBlank
    • @NotNull (LocalDateTime에서는 @NotNull이 아니면 제대로 데이터타입이 입력되지 않는다)
    • @Valid @RequestBody ScheduleRequestDto requestDto
  • Lv 6. 비밀번호 암호화
    • passwordEncoder.encode사용해서 비밀번호 암호화
    • passwordEncoder.matches를 사용해서 입력비밀번호와 암호화된 비밀번호의 값을 비교
 

GitHub - chews26/Schedule-jpa: SPRING JPA 일정관리 앱

SPRING JPA 일정관리 앱. Contribute to chews26/Schedule-jpa development by creating an account on GitHub.

github.com

 


👾 트러블 슈팅

  • 🤔 문제
    • 로그인 예외처리를 안해서 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()) 로 수정하였더니 잘 작동한다!