TIL-20210309

2021. 03. 10.
  • 미션2를 완료했다. 크게 어렵지는 않았다.
  • JPA에서 리플렉션을 어떻게 사용하는지 보고 싶었는데 구조가 생각보다 복잡해서 찾지 못했다. 다만, 반드시 기본 생성자를 찾고 그 생성자를 이용해서 클래스를 만든 뒤 프록시로 만들어 프로퍼티를 찾아오지 않을까 하는생각을 해봤다. 여유가 있으면 스택을 살펴봐야겠다.
  • 피어리뷰를 하다가 컨트롤러 어드바이스를 사용한 것을 봤다. 레거시 환경에서는 대부분 web.xml같은 곳에 설정하여 에러 코드로 공통 에러페이지를 리턴해줬던 것 같은데, 익셉션 핸들러로 캐치해서 직접 에러페이지를 보여주는 것을 보니 조금 생소하게 느껴졌다. 나쁘지 않은 것 같은데 작업이 귀찮을 것 같다.
  • RequestBody를 리턴하고 싶었다. 너목들 회의에 요구사항이 생겨서 그랬는데, 이전에 시도해봤지만 잘 되지 않았다. 이유는 다음과 같다.

    1. requestBody는 인풋스트림으로 들어있다. 따라서 한 번 읽으면 더 이상 해당 스트림을 사용할 수 없다.
    2. 컨트롤러 어드바이스에 도착할때면 리퀘스트 바디는 이미 한 번 읽은 상태다. 핸들러에서 읽어야 판단을 할테니 당연하다.

    어떻게 해결할 수 있을까 생각해보다가 aop를 떠올렸는데, 일단 돌아가는 코드가 필요하기 때문에 기본 핸들러를 수정하는 형태로 가닥을 잡았다. 하지만 바로 문제가 발생했는데, Request에 대한 것은 HttpRequestHandler에서 담당한다. 따라서 해당 클래스의 어댑터를 상속받아 리퀘스트를 읽기전에 복사하여 어트리뷰트로 넣어주면 될 것이라 생각했는데, 문제는 저번에 한 번 봤었던 WebMvcConfigurationSupport에서 설정을 넣어주는 것이기 때문에 스프링 부트의 기본 설정이 먹히지 않는 것 같았다. 물론 직접 나머지 설정까지 해줄 수 있겠지만, 이거 하나때문에 해야하는 작업이 너무 많아지기에 다른 방법을 찾아봤다.

    잭슨을 커스터마이징 하여 쓴다는 글을 찾아냈다. https://zepinos.tistory.com/33 인데, 사용 목적이 다르긴 하지만 어쨌든 리퀘스트까지 호출하였다. 당황했던 부분은, 커스터마이징을 하니 프로퍼티에 설정해놓은 잭슨 설정값들이 적용되지 않는다는 점이었는데, 생성자에서 세팅을 해주도록 처리했다. 어쨌든 컨트롤러 어드바이스까지 어트리뷰트가 전달되는 것을 확인했고, 이제 남은 것은 인풋스트림을 어떻게 다루느냐이다. 스프링을 하면서 파일 입출력 외에 스트림을 다룰 일이 있을 줄은 몰랐는데, 이래서 기본이 중요하다고 하나보다.

    남은 과정은 마저 한 뒤 글로 정리를 해봐야겠다. 그리고 진행하다보니 스프링 설정 같은걸 많이 잊은 것 같다. 가물가물한데 이것도 간만에 다시 정리를 해봐야겠다.

정대화
DaeHwa_Jeong@outlook.com

Powered with by Gatsby 2.0