TIL을 작성하면서 오늘 하루 무엇을 공부했는지 회고해보려한다.
이렇게라도 정리해두지 않으면 제대로 끝낸게 없어보여서 '하루종일 뭐했니!' 하고 자책하게 되는 것 같다. 😣
1
개인 프로젝트 마무리
오늘은 개인프로젝트 마지막날이라 오전 내내 정신이 없었다.
원래는 Lv.6까지 구현하는게 목표였는데, 시간 부족으로 Lv.5 일부까지 구현하고 제출하였다.
(점심도 거르고 마지막까지 최선을 다했지만 스스로 정한 기준이 너무 높은건지 썩하니 만족스럽지는 않다.)
그래도 테스트코드를 새로 배운 기념으로 꼭 한 번 적용해보고싶었는데, 쉽지는 않았지만 과제를 통해 사용해볼 수 있는 기회를 얻게 되어 좋았다.
새로 배운 내용을 적용하는 것은 쉽지않지만, 정말 '백문이불여일타'라고 직접 써보는게 개념 이해에 정말 큰 도움이 된다.
또 튜터님과 대화하면서 예외처리를 어느 계층에 위임하는 것이 좋을지 고민하는 시간을 가졌다.
오늘 해결되지 않은 문제가 있어서 튜터님께 조언을 구하러 갔다가, '왜 예외처리를 Repository에서 했는지'에 대한 질문을 받았다.
생각해보니 스스로 그렇게 구현한 명확한 이유와 근거가 없었다.
'그렇게 배웠기 때문에'라는 부끄러운 답변밖에는 생각이 나지 않았다.
지금까지 관성적으로 DB관련 예외처리를 Repository에서 구현했던 것이다.
덕분에 예외처리가 어떤 계층에 더 알맞는지 고민하는 계기가 되었다.
개발에는 정답이 없기 때문에 '왜?'라는 고민이 더더욱 중요한 것 같다.
항상 무슨 일을 하든지 명확한 목적을 파악하고, '왜?'를 고민하는 행위가 중요하다고 그렇게 스스로에게 말해왔는데..
정작 과제를 진행하면서 요구사항 맞추기에만 급급했던 것 같다.
시키는대로만 하던 수동적인 태도를 반성한다. 이번 팀 프로젝트 때는 목표부터 명확히 파악해야겠다.
2
스프링 인터셉터 학습
Lv.5에서 API 로깅 부분을 완성하지 못했다.
요구사항에서 Interceptor와 AOP를 활용하라고 되어있는데, 해당 개념을 잘 몰라서 공부하였다.
필터가 서블릿에서 제공하는 기능이라면,
스프링 인터셉터는 스프링 MVC가 제공하는 기술이다.
필터와 인터셉터는 웹과 관련된 공통 관심사항을 처리한다는 점이 비슷하지만, 적용되는 순서와 범위, 사용방법이 다르다.
HTTP 요청 → WAS → 필터 → 서블릿 → 스프링 인터셉터 → Controller
스프링 인터셉터의 특징
1. 컨트롤러 호출 직전에 호출된다.
2. 스프링 MVC에서 제공하는 기능이기 때문에 디스패처 서블릿 이후에 등장한다.
(스프링 MVC의 시작점 = 디스패처 서블릿 이라고 생각하면 이해가 쉽다)
3. URL 패턴을 매우 정밀하게 설정할 수 있다.
필터보다 더 정밀하게 설정 가능하다.
4. 스프링 인터셉터는 체인으로 구성된다. 즉, 중간에 인터셉터를 여러 개 추가할 수 있다.
스프링 인터셉터의 사용
스프링 인터셉터를 사용하기 위해서는 HandlerInterceptor 인터페이스를 구현해야한다.
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception {}
default void postHandle(HttpServletRequest request, HttpServletResponse response,Object handler, @Nullable ModelAndView modelAndView) throws Exception {}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response,Object handler, @Nullable Exception ex) throws Exception {}
}
코드에서 볼 수 있듯이 인터셉터는
컨트롤러 호출 전(preHandle), 호출 후(postHandle), 요청 완료 이후(afterCompletion)
3가지 단계로 나뉘어져있다.
또한 어떤 컨트롤러(handler), modelAndView가 반환되는지 다양한 응답 정보도 받을 수 있다.
1. preHandle
컨트롤러(정확히는 '핸들러 어댑터') 호출 전에 호출된다.
preHandle의 반환값이 true면 다음 인터셉터를 호출하고,
false, 예외 발생시 나머지 인터셉터와 핸들러 어댑터를 호출하지 않고 종료한다.
2. postHandle
컨트롤러(정확히는 '핸들러 어댑터') 호출 후에 호출된다.
3. afterCompletion
View가 렌더링 된 이후에 호출된다. 앞의 흐름에서 예외가 발생하더라도 호출된다.
예외를 파라미터로 받아서 로그로 출력할 수 있다.
3
오픈톤 공개 세션 참여
저녁에는 수강생들이 각자 주제를 선정해 진행하는 오픈톤 공개 세션에 참여했다.
Exception, AOP, Spring Security, Bean의 생명주기, 테스트 코드를 주제로 짧게 진행됐다.
평소 관심있지만 제대로 알지 못했던 내용들이라 인사이트를 얻기 위해 참여했다.
아쉽게도 시간상의 이유로 짧게 진행돼서 개념을 완전히 이해하지는 못했다.
하지만 바쁜 와중에도 시간을 내서 세션을 준비한 동료들이 정말 멋있었고,
다들 얼마나 열정을 가지고 공부하고 있는지 느껴져서 나도 빨리 따라잡아야겠다는 좋은 자극을 받았다.
'TIL > Spring' 카테고리의 다른 글
[TIL] Spring 의존관계 주입 방법 (0) | 2024.12.11 |
---|---|
[TIL] Pageable, PageRequest - 페이지네이션 (0) | 2024.12.10 |