CH 3 심화 Spring_코드 개선 정리

최길중·2026년 3월 6일

0. [문제 파악]

  • 종범 튜터님의 말씀
    코드 위주로 봐라(코드를 읽는 연습을 많이 해봐라)
    나는 API 위주로 POSTMAN 테스트 위주로 하고 있었는디...큰일이다

0번 [문제]

application 추가로 이제 실행은 된다.

mysql 추가를 안 하고 맨날 실행을 눌러봐서 종종 겪었던 문제.


1번 [문제]

1번 [풀이 및 결과]


2. [문제]

2-1. [문제]

2-1. [풀이 및 결과]

 if (userRepository.existsByEmail(signupRequest.getEmail())) {
            throw new InvalidRequestException("이미 존재하는 이메일입니다.");
        }

이 코드를 그냥 위로 올려버림


2-2. [문제]

2-2. [풀이 및 결과]


2-3. [문제]

2-3. [풀이 및 결과]

. : 아무 문자 1개
* : 0번 이상 반복

비상

인식이 안되는 상황이 발생

은 원래 이런 거라고 종범 튜터님이 말씀 해주심(큰 문제 아님)

꺼이꺼이

테스트를 해보는데 계속 asd12345678 대문자 안 넣어도 통과가 되길래 문제가 뭔가 했더니
0-9 이렇게 써야 하는데 0~9 이렇게 작성했음.
추가로 Controller에 @Valid를 안붙여서 그냥 통과가 됐던 거였음
결론: 쫌 꼼꼼히 하자....


3. [문제]


3. [풀이 및 결과]

뭔 차이인지 잘 모르겠음


4. [문제]

4-1. [문제]

4-1. [풀이 및 결과]


4-2. [문제]

4-2. [풀이 및 결과]


4-3. [문제]

4-3. [풀이 및 결과]


5. [문제]

왜 500이 나오는거지?

5. [풀이 및 결과]

ADMIN으로 들어가면 잘 진행이 되지만 USER로 실행시 필터에서 막는 것 같다.

그래서 주석처리

잘나오는 모습


6. [문제]

6-1. [문제 인식 및 정의]

JwtFilter에서 JWTuserRole 값을 UserRole enum으로 변환해서 사용하고 있었지만, request attribute에는 다시 문자열로 저장하고 있었다.
이로 인해 이후 AdminCheckInterceptor에서 다시 문자열을 enum으로 변환해야 했고, 같은 역할 정보가 서로 다른 타입으로 처리되어 코드 흐름이 일관되지 않았다.
기능 자체는 동작할 수 있었지만, 타입 혼용으로 인해 유지보수성가독성 측면에서 개선이 필요하다고 판단했다.


6-2. [해결 방안]

6-2-1. [의사결정 과정]

문제의 원인은 userRole을 한 번은 enum으로, 한 번은 문자열로 다루고 있다는 점이라고 판단했다.
이미 JwtFilter에서 UserRole enum으로 변환한 값이 있으므로, 이후에도 동일한 타입을 유지하는 것이 가장 간단하고 자연스러운 해결 방법이라고 생각했다.
따라서 request attribute에도 문자열이 아닌 enum 자체를 저장하고, Interceptor에서도 이를 그대로 꺼내 사용하도록 수정하기로 했다.

6-2-2. [해결 과정]

기존에는 아래와 같이 userRoleenum으로 만든 뒤, request에는 다시 문자열로 저장하고 있었다.

UserRole userRole = UserRole.valueOf(claims.get("userRole", String.class));
httpRequest.setAttribute("userRole", claims.get("userRole"));

이를 아래와 같이 수정하여 enum 값을 그대로 저장하도록 변경했다.

UserRole userRole = UserRole.valueOf(claims.get("userRole", String.class));
httpRequest.setAttribute("userRole", userRole);

또한 AdminCheckInterceptor에서도 문자열을 다시 변환하는 방식 대신, request에 저장된 enum 값을 그대로 꺼내 사용하도록 수정했다.

기존:

UserRole role = UserRole.of((String) request.getAttribute("userRole"));

수정:

UserRole role = (UserRole) request.getAttribute("userRole");

이렇게 수정하여 userRoleJwtFilter부터 Interceptor까지 동일한 타입으로 전달되도록 정리했다.


6-3. [해결 완료]

6-3-1. [회고]

이번 작업을 하면서 느낀 점은, 기능이 동작하더라도 다른 사람이 작성한 코드를 이해하고 흐름을 파악하는 일은 생각보다 쉽지 않다는 것이었다.
특히 타입이 섞여 있는 작은 차이도 바로 보이지 않아, 코드를 더 꼼꼼하게 읽는 연습과 기본기에 대한 공부가 더 필요하다고 느꼈다.


6-3-2. [전후 데이터 비교]

전:


후:

출력까지 잘 나온다!!


7. [문제]

GPT를 사용해서 진행하였습니다.

사용 했던 프롬프트

  1. 절대 오류가 안나게 만들기(심볼 뭐를 해결 할 수 없습니다, 뭐뭐에 액세스 할 수 없습니다 등등)
  2. 필요한 코드가 있으면 말해줘
  3. 라인 커버리지만 100%만 되면 간단하게 작성해도돼

profile
취준생

0개의 댓글