뉴스피트 프로젝트 3일차
진행 상황
- 프로젝트를 시작할 때 필요한 작업을 하고 이제 기능 구현을 해보려고 합니다.
- 로그인과 회원가입 기능인데 우선 회원가입 기능을 구현하고 테스트 후 성공적으로 기능이 동작하면 로그인을 구현하기로 계획했습니다.
회원 가입 및 로그인 기능
- 기능 구현을 위한 로직을 작성하고 Postman을 이용하여 테스트, 에러 발생으로 실패
- 첫번째 에러 : 401에러
- 인텔리제이 콘솔과 Postman의 body에 에러는 없고 Postman의 status에 401 에러를 발견했습니다.
401 에러 - 401에러를 해결하기 위해 찾아보니
-
더보기HTTP 상태 401 (Unauthorized)이란
HTTP 상태 중 401은 클라이언트가 인증되지 않았거나, 유효한 인증 정보가 부족하여 요청이 거부되었음을 의미하는 상태값입니다.
즉, 클라이언트가 인증되지 않았기 때문에 요청을 정상적으로 처리할 수 없다고 알려주는 것입니다.
401 응답을 받는 대표적인 경우는 로그인이 되어 있지 않은 상태에서 무언가 요청을 하는 경우입니다.
예를 들어 어떤 쇼핑몰 사이트에 로그인을 하지 않았는데 나의 결제 내역과 같은 정보를 달라고 하면 401을 반환받게 될것입니다.
이와 많이 혼동되는 HTTP 상태로 403(Forbidden)이 있습니다.
HTTP 상태 403 (Forbidden) 이란
HTTP 상태 중 403은 서버가 해당 요청을 이해했지만, 권한이 없어 요청이 거부되었음을 의미하는 상태값입니다.
즉, 클라이언트가 해당 요청에 대한 권한이 없다고 알려주는 것입니다.
403 응답을 받는 대표적인 경우는 로그인하여 인증 되었지만 접근 권한이 없는 무언가를 요청하는 경우입니다.
예를 들어 어떤 쇼핑몰에 접속하여 로그인까지 하였지만, 다른 사용자의 결제 내역을 달라고 하면 403을 반환받게 됩니다. - 처음 회원가입 기능을 구현할 때에는 토큰과 security와는 상관 없을거라 생각하고 다른 검증 없이 회원가입을 구현했지만 인증 정보에 대한 로직이 필요하다는 것을 알게 되고 회원 가입 api 요청이 들어오면 접근 허가하겠다는 security 관련 config 클래스를 만들어 실행했더니 401에러는 해결했습니다.
-
- 인텔리제이 콘솔과 Postman의 body에 에러는 없고 Postman의 status에 401 에러를 발견했습니다.
- 두번째 에러 : Repository에 요청하는 값이 null 값이라는 에러
- 에러 내용
-
더보기2024-02-11T03:15:47.385+09:00 ERROR 14736 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.NullPointerException: Cannot invoke "com.pokemon.newsfeed.repository.UserRepository.findByUserId(String)" because "this.userRepository" is null] with root cause
java.lang.NullPointerException: Cannot invoke "com.pokemon.newsfeed.repository.UserRepository.findByUserId(String)" because "this.userRepository" is null
at cohttp://m.pokemon.newsfeed.service.UserService.signup(UserService.java:24) ~[main/:na]
at cohttp://m.pokemon.newsfeed.controller.UserController.signup(UserController.java:34) ~[main/:na]
-
- 이 에러는 로직에 문제가 있을 수 있겠다는 생각에 로직을 타고 가보니 Service 클래스에서 final이나 NotBlank 처리된 값들을 생성자로 만들어주는 RequiredArgsConstructor 어노테이션을 사용했는데 의존성을 위해 만들어둔 필드에 final을 작성하지 않아서 생긴 에러라는 것을 발견했습니다.
- 문제 원인과 해결
-
더보기
변환 전
@Service @RequiredArgsConstructor public class UserService { private UserRepository userRepository; private PasswordEncoder passwordEncoder; private JwtUtil jwtUtil;
변환 후@Service @RequiredArgsConstructor public class UserService { private final UserRepository userRepository; private final PasswordEncoder passwordEncoder; private final JwtUtil jwtUtil;
-
- 문제 원인과 해결
- 에러 내용
- 세번째 에러 : Controller 클래스 지정 어노테이션 문제
- 에러 내용
-
더보기2024-02-11T03:17:05.406+09:00 ERROR 13248 --- [nio-8080-exec-2] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-8080-exec-2] Exception processing template "회원가입 성공": Error resolving template [회원가입 성공], template might not exist or might not be accessible by any of the configured Template Resolvers
org.thymeleaf.exceptions.TemplateInputException: Error resolving template [회원가입 성공], template might not exist or might not be accessible by any of the configured Template Resolvers
-
- 이 에러는 찾아보니 Thymeleaf의 경로를 찾지 못한다는 내용이었습니다. 저는 Postman으로 기능 테스트를 하고 front적인 부분을 구현하려고 해서 thymeleaf를 추가하기는 했지만 아직 설정한 것이 없어 왜 이 경로를 찾을까 하고 찾아보니 Controller에 Controller 어노테이션을 사용하면 반환값으로 view를 반환하기 위해 사용한다고 알게 되었고 응답을 view가 아닌 data를 반환하기 위해서는 ResponseBody 어노테이션을 사용해야 한다는 것을 알게 되었고 또 다른 방법으로 ResponseBody가 추가된 RestController 어노테이션을 사용하면 된다는 것을 알게 되었습니다. RestController는 ResponseBody + Controller로 사용된다고 알게 되었습니다.
- 문제 원인과 해결
- String 타입으로 반환받고 싶었기 때문에 Controller 어노테이션을 RestController로 변환해 주었습니다.
- 문제 원인과 해결
- 에러 내용
- 첫번째 에러 : 401에러
- 이 문제들을 해결하면서 회원가입 기능을 구현할 수 있었습니다.
- 회원 가입 후 로그인 부분은 간단하게 파라미터를 받아서 와서 구현했습니다.
회고
- 사소한 실수부터 생각지도 못한 에러까지 여러가지의 에러를 마주하고 한가지의 에러를 해결하면 또 다른 에러가 발생하고 이런 상황을 반복하면서 문제를 해결했던 시간이었습니다. 이러한 시간을 거치면서 새로운 정보를 얻게 되고 문제 해결에 대한 재미도 생겼던 시간이라 생각합니다.
'Project > Newsfeed Project' 카테고리의 다른 글
[Project / Newsfeed] - 뉴스피드 프로젝트 6일차 (0) | 2024.02.18 |
---|---|
[Project / Newsfeed] - 뉴스피드 프로젝트 5일차 (0) | 2024.02.18 |
[Project / Newsfeed] - 뉴스피드 프로젝트 4일차 (0) | 2024.02.13 |
[Project / Newsfeed] - 뉴스피드 프로젝트 2일차 (0) | 2024.02.09 |
[Project / Newsfeed] - 뉴스피드 프로젝트 1일차 (0) | 2024.02.07 |