🔖 핵심 주제
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 |