# http request process flow
User가 화면에서 Spring Boot Web Server 로 Request 시 일어나는 흐름을 정리해보았다.
아는 선에서 혼자 만들어본 프로세스입니다. 참고만 하시기 바랍니다!
# 1. 최초 요청 ~ @Controller 진입 전!
최초 요청은 페이지 이동이나, ajax를 통한 요청으로 볼 수 있다!
- https://hjho95.tistory.com/14 jQuery ajax 예제 코드
요청이 들어오면 Controller 에 진입 하기 전까지 많은 일이 벌어지는데, 첫 진입은 필터로 시작 된다. 필터를 이용하여 진입하는 요청이 정당한(?) 요청인지 확인하는 작업으로 검증, 인증, 권한부여 등이 이루어 질 수 있다.
- https://hjho95.tistory.com/28 CommonsRequestLoggingFilter 이용하여 요청로그 남기기!
- https://hjho95.tistory.com/13 OncePerRequestFilter GET, POST만 요청 허용하기!
필터에서 걸러져 진입하는 요청은 인증이 완료된 요청이라 보고, 인터셉터를 이용하여 해당 요청자에 대한 정보를 설정하거나, 로그를 남긴다거나 할 수 있다. (쓰기나름)
- https://hjho95.tistory.com/15 HandlerInterceptor 적용하여 요청-응답 시간 재기!
인터셉터를 지나면 RequestWrapper 가 요청 시에 같이 넘겨준 데이터를 Wrapper해준다. 음,,, 요청 데이터와 @Controller에서의 입력 변수와 매핑시켜준다고 볼 수 있다. 해당 부분에서! 매핑이 될 때 해당 파라미터의 값이 javascript 문법은 없는 지 또는 sql 문법은 없는 지 체크해서 해당 값을 다른 값으로 변경하여 입력 변수와 매핑 시켜 줄 수 있다.
- https://hjho95.tistory.com/29 HttpServletRequestWrapper를 이용한 XSS Filter 만들기
요청이 들어온 후, 필터에서 검증, 인증, 권한을 받은 요청자가 인터셉터에서 추가적인 정보를 설정한 후에 요청데이터도 처리가 되면 Aspect를 이용하여 Controller에 진입하는 데이터에 대한 정형화된 로그를 남길 수 있다. (요긴하게 사용할 로그들)
- https://hjho95.tistory.com/30 @Aspect
# 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 라던가,,, 추가 될 부분이 조금 있다.
'스프링 부트' 카테고리의 다른 글
[SpringBoot] ChatGPT야! DataSource, SqlSessionFactory, SqlSessionTemplate 에 대해서 설명해주겠니? (0) | 2023.03.28 |
---|---|
[SpringBoot] ChatGPT야! JDBC, MyBatis, HikariCP 에 대해서 설명해주겠니? (1) | 2023.03.28 |
[SpringBoot] OpenAPI 3.0 추가 구성 해보기! (swagger-ui) (0) | 2023.01.15 |
[SpringBoot] OpenAPI 3.0 구성하기! (swagger-ui) (0) | 2023.01.14 |
[SpringBoot] OpenAPI 3.0 설정하기! (swagger-ui) (0) | 2023.01.14 |