[TIL] 44일차 _ Spring 심화 프로젝트 #2

Seoyeon Lee·2025년 12월 4일

Today I Learned ...

오늘은 코드카타 SQL 63번 문제를 풀고, Spring 심화 프로젝트의 Lv.6까지 해결했다!


🗒️ 코드카타 #37

오늘은 1개의 SQL 문제를 풀었는데,
datediff로 기간을 구하고, avg로 평균을 구하고, round로 반올림까지 해야하는 어마어마한 작업을 해야했지만..
문제 자체는 별 문제 없이 해결할 수 있었다!!
심지어 오늘은 검색도 안하고 풀었다!!!ㅎㅎ

오늘 푼 문제와 풀이는 깃허브를 통해 업로드해두었다.
GitHub 보러가기


🖥️ Spring 심화 프로젝트 #2

오늘은 Spring 심화 프로젝트의 Lv.5, Lv.6을 진행했다.

Lv.5는 AOP 혹은 Interceptor를 활용해 관리자 페이지에 접근하는 경우 로그를 남기는 것이다.

Interceptor를 활용해 로그를 남기기 위해서는 스프링에서 이미 구현되어있는 HandlerInterceptor를 상속받아서 내가 원하는 작업을 진행해주면 된다.
그래서 나는 관리자 페이지에 관리자가 접근했는지 확인하고,
접근한 사람이 관리자라면 접근을 요청한 시간과 관리자 페이지의 URI를 로그로 기록하였다.

그리고 구현한 Interceptor를 WebMvcConfig 파일에 등록해주었다.
이전에 ArgumentResolver에서 만들었던 WebMvcConfig 파일이 있어서 그냥 같이 쓸까 생각하다가...
그래도 용도가 다르니 클래스를 새로 만들어 사용하기로 했다.

Interceptor를 활용하여 로그를 남기는 것은 강의 자료를 참고하여 매우 간단하게 해결할 수 있었다!

이제 AOP로도 로깅을 구현해보았는데...
AOP를 통한 로깅을 할 때는 요청 본문과 응답 본문도 함께 로그로 남기기를 요구하였다.
그런데 이게 정말 답이 없더라.

서블릿 컨테이너에는 HTTP 요청 본문과 응답 본문은 한 번만 읽을 수 있도록 설정이 되어있었다.
그러니 컨트롤러에서 요청 본문을 읽고 나면, AOP에서는 요청 본문을 읽지 못하게 된다.
그래서 이걸 해결하기 위해 요청 본문을 여러번 읽을 수 있도록 도와주는 ContentCachingRequestWrapper라는 친구를 데려와야 했고...
필터를 추가해서 컨트롤러에 요청 본문이 닿기 전에 저 친구로 요청 본문과 응답 본문을 바꿔주었다.

그리고 나서야 AOP 구현을 시작할 수 있었다.
Interceptor는 HttpServletRequest를 파라미터로 가지고 있지만, AOP는 그렇지 않다.
그래서 AOP에서 요청을 확인하려면 RequestContextHolder에서 요청 부분만 뽑아와서 그걸 또 HttpServletRequest로 바꿔주고...
이런저런 작업들을 해준 후에야 관리자 페이지에 접근할 때 로그를 남길 수 있었다.

AOP 구현 시의 또 다른 요구 사항이 메서드가 종료된 후에도 로그를 남기는 것이었다.
이건 비교적 쉽게 해결할 수 있었는데, joinPoint로 받은 결과값을 JSON으로 변환해주기만 하면 됐다.

이건 나중에 추가한 것이지만.. 예외가 발생하면 메서드 종료 후에 로그가 남지 않아서 예외 발생 시에 실행하는 다른 AOP를 새롭게 만들었다.

이렇게 Lv.5의 로깅도 잘 해결할 수 있었고...
Lv.6의 요구사항은 그냥 내가 생각하기에 수정해야 할 부분들을 수정하는 것이었다.

그래서 나는 디렉토리 구조를 변경하고, 로그 추가할 부분들을 추가하고, 없앨 부분들을 없애는 등의 리팩토링 작업을 했다.
그러던 중에 어마어마한 오류를 발견했는데...
내가 Lv.4의 4번째 테스트 코드 수정 부분에서 서비스 로직을 잘못 수정했던 것이다!!
내가 푼 방법으로도 문제를 풀 수는 있지만.. 그렇게 푸니 이후의 작업에서 로직이 제대로 실행되지 않았다.
이걸... Lv.6에 와서야 알았고... 열심히 수정해주었다.

Lv.7에서는 테스트 코드를 많이 작성해서 테스트 커버리지를 높이는 것인데,
Lv.6에서 리팩토링을 최대한 많이 해두어야 Lv.7에서 할 일이 줄어든다고 한다.
Lv.6 정말 필요한 부분들만 대충 했는데... 조금 더 다듬어봐야겠다..ㅠ

내가 작성한 코드는 깃허브에 업로드해두었다.
GitHub 보러가기


🙃 오늘의 느낀점

뭔가 과제를 하면 할수록 내가 만드는 것보다 남이 해둔 걸 수정하는 게 더 어렵다.
특정 작업을 할 때 이렇게 작동되도록 설계한 이유가 있을 텐데, 그걸 직접 물어볼 수도 없고.. 나는 또 그렇게 한 이유가 이해가 안 되고...

사실상 실제로 일을 할 때는 내가 직접 처음부터 무언가를 구현할 일보다 다른 사람이 해둔 내용을 수정하는 작업이 대부분일텐데..
남의 코드를 읽는 법도 배워가야겠다.

profile
백엔드 개발자 지망생

0개의 댓글