스프링 부트

[SpringBoot] 요청부터 응답까지! 프로세스 흐름도

h__hj 2023. 1. 15. 16:34

# http request process flow

 User가 화면에서 Spring Boot Web Server 로 Request 시 일어나는 흐름을 정리해보았다.

아는 선에서 혼자 만들어본 프로세스입니다. 참고만 하시기 바랍니다!

SpringBoot http request process flow

 # 1. 최초 요청 ~ @Controller 진입 전!

최초 요청은 페이지 이동이나, ajax를 통한 요청으로 볼 수 있다!

 요청이 들어오면 Controller 에 진입 하기 전까지 많은 일이 벌어지는데, 첫 진입은 필터로 시작 된다. 필터를 이용하여 진입하는 요청이 정당한(?) 요청인지 확인하는 작업으로 검증, 인증, 권한부여 등이 이루어 질 수 있다.

 필터에서 걸러져 진입하는 요청은 인증이 완료된 요청이라 보고, 인터셉터를 이용하여 해당 요청자에 대한 정보를 설정하거나, 로그를 남긴다거나 할 수 있다. (쓰기나름)

 인터셉터를 지나면 RequestWrapper 가 요청 시에 같이 넘겨준 데이터를 Wrapper해준다. 음,,, 요청 데이터와 @Controller에서의 입력 변수와 매핑시켜준다고 볼 수 있다. 해당 부분에서! 매핑이 될 때 해당 파라미터의 값이 javascript 문법은 없는 지 또는 sql 문법은 없는 지 체크해서 해당 값을 다른 값으로 변경하여 입력 변수와 매핑 시켜 줄 수 있다.

 요청이 들어온 후, 필터에서 검증, 인증, 권한을 받은 요청자가 인터셉터에서 추가적인 정보를 설정한 후에 요청데이터도 처리가 되면 Aspect를 이용하여 Controller에 진입하는 데이터에 대한 정형화된 로그를 남길 수 있다. (요긴하게 사용할 로그들)

# 2. @Controller 진입 ~ @Service

 @Service에서 RestTemplate으로 타 API에 요청 전 요청 보낼 데이터들을 수집하거나, 요청받은 데이터를 가공하여 요청 보낼 준비를 한다. 

# 3. RestTempalte 요청 및 응답!

 내가 생각한 Client 단에서의 주요 역할은 RestTemplate을 통한 통신이라고 본다. 데이터베이스 접속 없다는 가정하에,,,

  • https://hjho95.tistory.com/37 RestTemplate 설정하기! 
  • https://hjho95.tistory.com/38 ClientHttpRequestInterceptor, ResponseErrorHandler 이용하여 RestTemplate 요청, 응답 전 로그남기기
  • 가공한 데이터로 요청을 보내기 전에 ClientHttpRequestInterceptor intercept > before 에서 로그 증적!
  • 요청 및 응답을 받게 되면 ClientHttpRequestInterceptor intercept > after 에서 로그 증적!
  • 에러를 받게되면 ResponseErrorHandler hasError > handleError 에서 로그 증적!

# 4. @Controller 처리 후!

 외부 통신이 종료되면 해당 응답 값에 대한 로그를 남기는 게 중요하다. 그리고 응답이 정형화된 응답으로 나가야 Client 단에서 처리하기가 쉬워진다. 예를들면 "응답의 무조건 code, message, data 는 있어! 그리고 정상은 code가 0000 이야" 라고 정형화된 데이터를 줘야 응답처리가 쉬워진다.

  • https://hjho95.tistory.com/31 @ControllerAdvice 와 @ExceptionHandler 이용하여 응답하기
  • @Service에서 받고 응답데이터로 가공하여 응답 시 @Aspect @AfterReturning 에서 로그 증적!
  • Contorller 단에서 에러가 발생한다면 @Aspect @AfterThrowing 에서 로그 증적 후
  • @ExceptionHandler 통해 에러 데이터를 가공한다. (page이동인지, ajax요청인지에 따라 응답이 달라짐)

# 5. 요청에 대한 응답!

 응답을 Client로 전달하기 전에 응답 데이터에 대한 html escapes를 처리하는 게 안전하다! 

  • https://hjho95.tistory.com/6 HtmlCharacterEscapes 적용하기
  • 가공된 정상/에러 데이터를 HtmlCharacterEscapes 에서 html escapes, emoji 데이터들을 치환해준다.
  • 치환된 데이터를 HandlerInterceptor > postHandle 로 이동.
  • http 요청은 여기서 끝났다고 봐야함.
  • 응답이 되고 난 후 View의 Render가 이루어진 후 HandlerInterceptor > afterCompletion 호출.

# 설명

 전에 스리슬쩍 만들어본 프로세스인데 얼추 마무리 되어서 작성해보았다. 

기준이되는 프로젝트는 Web Project 여서 @RestController 부분이 없는데, Web Project와 Api Project 가 서로 상이한 부분이 있어 @RestController에서는 응답 시 사용하는 ResponseBodyAdvice<Object> 라던가 MessageSource 라던가 SqlInterceptor 라던가,,, 추가 될 부분이 조금 있다.