Authorization 헤더에 access token 정보를 주고 API 요청을 보낼 때, Member를 조회하는 과정에서 불필요한 쿼리 호출이 이루어지는 부분을 살펴보고 Entity Graph를 적용해서 해결해 보도록 하겠습니다. JwtAuthenticationFilter @RequiredArgsConstructor public class JwtAuthenticationFilter extends GenericFilterBean { private final TokenHelper accessTokenHelper; private final CustomUserDetailsService userDetailsService; @Override public void doFilter(ServletRequest req..
프로젝트를 진행하면서 중간중간 수정 작업이 있었지만 대부분 게시글 주제와는 거리가 좀 있어 설명을 생략했습니다. 이번에 수정했던 부분들을 짚어보면서 개념 정리도 다시 해보고 로그인 기능 구현 후 Swagger로 API 추가 했던 작업을 카테고리에서도 동일하게 해보겠습니다. Entity 수정 먼저 Member와 Role 을 이어주는 MemberRole Entity를 수정하겠습니다. [Before] MemberRole @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter public class MemberRole { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id..
이번에는 Category API 처리를 위한 웹 계층을 구현해보겠습니다. Category Controller @RestController @RequiredArgsConstructor public class CategoryController { private final CategoryService categoryService; @GetMapping("/api/categories") @ResponseStatus(HttpStatus.OK) public Response readAll(){ // 모든 카테고리 조회 return Response.success(categoryService.readAll()); } @PostMapping("/api/categories") @ResponseStatus(HttpStatus..
이번에는 Token 관련 코드에 대해서 리팩토링을 진행해 보겠습니다. 문제 현재 프로젝트에서는 JwtAuthenticationFilter 클래스와 SignService 클래스에서 Token Service를 이용하여 token 생성, 추출, 검증 기능을 사용하고 있습니다. 그런데 TokenService 클래스를 살펴보면 /* access */ public String createAccessToken(String subject) { return jwtHandler.generateJwtToken(accessKey, subject, accessTokenMaxAgeSeconds); } public boolean validateAccessToken(String token) { return jwtHandler.val..
이번에는 이전 시간에 만든 인증 로직을 테스트 해보겠습니다. 원래대로라면 코드만 보여드리고 설명을 생략하겠지만 이전에 만든 인증 로직에 대한 이해를 돕고자 테스트를 따로 준비했습니다. 테스트를 진행하기에 앞서 데이터베이스 초기화를 위한 TestInitDB를 생성하겠습니다. 데이터베이스 초기화 @Component public class TestInitDB { @Autowired RoleRepository roleRepository; @Autowired MemberRepository memberRepository; @Autowired PasswordEncoder passwordEncoder; private String adminEmail = "admin@admin.com"; private String mem..
이번에는 로그인 관련하여 인증 로직을 추가해보겠습니다. 전체적인 인증 로직은 다음과 같습니다. 클라이언트가 API 를 요청한다. 요청시에 로그인해서 발급받은 access token을 HTTP Authorization 헤더에 담아서 보내준다. JwtAuthenticationFilter에서 토큰을 검증하고, 토큰으로 요청한 사용자 정보를 데이터베이스에서 조회해서 SecurityContext에 저장한다. 요청한 API url에 따라서 접근 허용 여부를 검사한다. 접근에 성공하면 요청한 API url에 따라 Controller에서 작업을 수행한다. 접근에 실패하면 인증되지 않은 사용자의 경우 401응답을 내려주는 곳으로 redirect 요청한 자원에 접근 권한이 없는 경우 403응답을 내려주는 곳으로 redir..
이번에는 member를 조회하고 삭제하는 기능을 추가해 보겠습니다. MemberDto 생성 먼저 Member 데이터 전송을 위한 MemberDto 객체를 생성합니다. @Data //자동으로 필드에 대한 getter, setter, equals(), hashCode(), toString() 메서드 등을 생성 @AllArgsConstructor @NoArgsConstructor public class MemberDto { public Long id; private String email; private String username; private String nickname; public static MemberDto toDto(Member member){ return new MemberDto(member...
이번 글에서는 잠시 쉬어가는 시간으로 Exception처리를 해보려고 합니다. 기존에 예외처리는 모두 RuntimeException으로 처리를 해서 오류가 났을때 어디서 났는지 확인하기가 어려웠는데요, 이번에 각 기능별로 Exception처리를 달리하여 오류가 발생했을 때 어디서 발생했는지 확인하기 쉽게 만들어보겠습니다. Exception 클래스 생성 각 기능에 대해서 Exceptino 클래스를 생성하겠습니다. 현재까지 구현된 기능중에서 발생할 만한 Exception들은 다음과 같습니다. LoginFailureException.java public class LoginFailureException extends RuntimeException { } MemberEmailAlreadyExistsExcepti..