seaking110 님의 블로그
프로젝트에 부족한 부분을 찾아 리팩토링 본문
1. 문제 인식 및 정의
- @RequestMapping 미사용
- 중복된 도메인을 가지고 있음
- 공통 URL을 모아 @RequestMapping으로 만들면 가독성과 유지보수성이 향상
- ManagerController의 deleteManager에서 AuthUser를 미사용
- 다른 곳에서는 AuthUser를 사용하고 있기 때문에 통일성이 부족
- 또한 subString(7) 방식의 하드 코딩은 좋지 못하기 때문에 AuthUser 객체로 변경
- DTO 중 SignupRequest에서 UserRole 타입이 일치하지 않는 문제
- Enum 타입을 String 타입으로 처리
- Enum 타입으로 교체할 시 타입 안정성 확보 가능
2. 해결 방안
- 컨트롤러 URL을 @RequestMapping으로 묶어서 정리.
- JWT에서 사용자 정보를 직접 파싱하는 방식 대신, AuthUser 객체를 활용하도록 변경.
- DTO의 UserRole을 String에서 Enum으로 변경.
3. 해결 완료
- @RequestMapping을 활용하면서 URL 관리가 더욱 편해지고 가독성이 좋아졌다.
- JWT를 직접 파싱하는 방식보다 AuthUser 객체를 활용함으로써 통일성을 올리고 JWT 토큰의 형식이 변하더라도 AuthUser부분만 수정해주면 되는 코드가 되었다.
- DTO에서 Enum을 직접 사용하면서 불필요한 문자열 변환 과정을 줄일 수 있었다.
- 전반적으로 코드의 가독성과 유지보수성이 개선되었다고 생각함.
- 하지만 6단계를 먼저 진행하고 5단계를 진행하니 test코드가 꼬여버리는 상황이 발생해서 고생했습니다.
전후 데이터 비교
// 수정전
@RestController
@RequiredArgsConstructor
public class AuthController {
private final AuthService authService;
@PostMapping("/auth/signup")
public SignupResponse signup(@Valid @RequestBody SignupRequest signupRequest) {
return authService.signup(signupRequest);
}
@PostMapping("/auth/signin")
public SigninResponse signin(@Valid @RequestBody SigninRequest signinRequest) {
return authService.signin(signinRequest);
}
}
// 수정후
@RestController
@RequiredArgsConstructor
@RequestMapping("/auth")
public class AuthController {
private final AuthService authService;
@PostMapping("/signup")
public SignupResponse signup(@Valid @RequestBody SignupRequest signupRequest) {
return authService.signup(signupRequest);
}
@PostMapping("/signin")
public SigninResponse signin(@Valid @RequestBody SigninRequest signinRequest) {
return authService.signin(signinRequest);
}
}
// 수정 전
@DeleteMapping("/todos/{todoId}/managers/{managerId}")
public void deleteManager(
@RequestHeader("Authorization") String bearerToken,
@PathVariable long todoId,
@PathVariable long managerId
) {
Claims claims = jwtUtil.extractClaims(bearerToken.substring(7));
long userId = Long.parseLong(claims.getSubject());
managerService.deleteManager(userId, todoId, managerId);
}
// 수정후
@DeleteMapping("/todos/{todoId}/managers/{managerId}")
public void deleteManager(
@Auth AuthUser authUser,
@PathVariable long todoId,
@PathVariable long managerId
) {
managerService.deleteManager(authUser, todoId, managerId);
}
// 수정 전
@NotBlank
private String userRole;
// 수정후
@NotNull
private UserRole userRole;
// 추가적으로 변환 과정 삭제
'Today I Learned' 카테고리의 다른 글
헷갈리는 개념 정리 (2) | 2025.03.05 |
---|---|
트러블 슈팅 (0) | 2025.02.27 |
Cookie, JWT (0) | 2025.02.26 |
테스트 코드! (0) | 2025.02.25 |
N+1 문제 + 동시성 제어 (0) | 2025.02.24 |