Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

seaking110 님의 블로그

프로젝트에 부족한 부분을 찾아 리팩토링 본문

Today I Learned

프로젝트에 부족한 부분을 찾아 리팩토링

seaking110 2025. 2. 27. 12:44

1. 문제 인식 및 정의

  1.  @RequestMapping 미사용
    • 중복된 도메인을 가지고 있음
    • 공통 URL을 모아 @RequestMapping으로 만들면 가독성과 유지보수성이 향상
  2. ManagerController의 deleteManager에서 AuthUser를 미사용
    • 다른 곳에서는 AuthUser를 사용하고 있기 때문에 통일성이 부족
    • 또한 subString(7) 방식의 하드 코딩은 좋지 못하기 때문에 AuthUser 객체로 변경
  3. 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