본문 바로가기

TIL

테스트코드

🔖 핵심 주제

Interceptor vs security Filter / 테스트코드작성

 

💡 배운 내용

1. Interceptor vs security Filter

  • 과제 진행 중 Todo가 본인이 수정한게 맞는지 검증하는 로직이 service에 작성됨
  • 직전 프로젝트에서는 spring security를 도입해서 filter 에서 처리하도록 작성, 그러나 지금 과제에선 interceptor에서 이미 admin을 검증하는 로직이 존재
  • 2가지 검증 로직을 filter로 수정할지 interceptor를 추가할지 고민.
  • interceptor는 Spring 컨텍스트 내부에서 동작
  • filter 는 디스패처 서블릿(Dispatcher Servlet) 전/후 URL 패턴에 맞는 모든 요청에 대한 부가 작업 기능 제공

처음엔 두 가지 방법 모두로 작성을 해야 하는건가? 했는데 둘중 하나만 사용해도 원하는 로직은 충분히 구현이 가능 하다는 것을 알 수 있었다.

이미 interceptor에 권한 검증 로직이 작성 되어있기도하고, 과제의 의도가 interceptor 위주 학습인거같아 interceptor에서 검증 로직 추가.

@Component
@RequiredArgsConstructor
public class TodoOwnerCheckInterceptor implements HandlerInterceptor {

    private final TodoAuthorization todoAuthorization;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
       ...
        todoAuthorization.validateOwner(Long.valueOf(pathVariables.get("todoId")), userId);
        return true;
    }
}

WebMvcConfigurer에 addinterceptor를 해주었습니다.

@Override
    public void addInterceptors(InterceptorRegistry registry) {
      ...
        registry.addInterceptor(todoOwnerCheckInterceptor)
                .addPathPatterns("...");
    }

 

2. 테스트 코드 작성

  • given/when/then 패턴
  • mock 과 InjectMocks 에 대하여
  • 회귀 방지(Regression Prevention): 새로운 기능을 추가하거나 리팩토링할 때, 기존 기능이 깨지지 않았는지 자동으로 검증해준다.
  • 빠른 피드백: 서버를 매번 띄우고 수동으로 확인하는 것보다 훨씬 빠르게 로직의 정확성을 확인할 수 있다.
  • 코드 설계 개선: 테스트하기 어려운 코드는 대부분 설계가 잘못되어 있다. 테스트를 작성하면서 자연스럽게 의존성을 줄이고 책임을 분리하게 된다.
  • 살아있는 문서: 잘 작성된 테스트 코드는 해당 코드가 어떻게 동작해야 하는지를 설명하는 문서 역할을 한다.
@Test
    public void Todo를_성공적으로_생성한다(){
        //given
        AuthUser authUser = new AuthUser(1L, "email", UserRole.USER);
        TodoSaveRequest todoSaveRequest = new TodoSaveRequest("할일 제목", "어쩌구 저쩌구");

        User user = User.fromAuthUser(authUser);
        String weather = "SUNNY";
        Todo todo = new Todo("할일 제목", "어쩌구 저쩌구", weather, user);

        // -> todoRepository.save(any()) -> willReturn to-do
        given(todoRepository.save(any())).willReturn(todo);
        given(weatherClient.getTodayWeather()).willReturn(weather);

        //when
        TodoSaveResponse result = todoService.saveTodo(authUser , todoSaveRequest);

        //then
        assertNotNull(result);
        verify(todoRepository).save(any());
    }

 

🚀 문제 해결 및 트러블슈팅

테스트 코드 작성 중 Todo not found 에러 발생

given에서 현재 findById를 해주고있는데 이를 -> findByIdWithUser로 변경

오늘 잘한 점

  • 나의 논리로 의사결정을 해보고 실행에 옮겨보았다
  • 단순히 의사결정 뿐 아니라 각 방법의 차이점을 알아보고 이해했다.
  • 모르는 부분을 기록하고 작성했다.

새로 알게 된 점

  • interceptor와 filter의 동작 시점의 차이 및 컨텍스트 차이
  • 테스트 코드의 작성 이유
  • 테스트 코드의 패턴과 mock

내일 더 학습하고 싶은 내용

  • nginX 서버 (web server) 이해하기

'TIL' 카테고리의 다른 글

ArgumentResolver  (0) 2026.03.06
유닛테스트와 통합테스트  (0) 2026.03.05
AOP  (0) 2026.03.03
github - 협업준비하기.  (0) 2026.02.15
SOLID 원칙  (1) 2026.02.06