본문 바로가기

RequestContextHolder, HttpServletRequest

 

  `RequestContextHolder`를 알아보자. Spring 프레임워크의 전 구간에서 `HttpServletRequest`에 접근할 수 있게 도와주는 구현체이다. request를 서비스레이어까지 전달하지 않더라도 `RequestContextHolder`를 이용하면 된다.

 

  `HttpServletRequest`는 HTTP URI, Method, body, header, cookie, session 등의 정보를  포함하고 있다. `RequestContextHolder`가 없으면 컨트롤러 레이어에서 서비스 레이어로 내려주는 방식으로 해야하는데 코드가 더러워지고 DRY원칙을 지키지 못한다. `RequestContextHolder`를 활용하면 위의 문제를 해결할 수 있다.

 

 

RequestContextHolder 원리

 

 

1. `ThreadLocal`을 사용해서 servlet이 호출되면 key,value (thread,HttpservletRequest)를 보관한다.

2. 호출된 servlet과 동일한 thread내에서는 어느 곳에서든 같은 HttpServletRequest를 꺼내서 쓸수 있다.

3. servlet이 종료 될 때 해당 thread를 key로 갖는 쌍을 제거한다.

 

 

RequestContextHolder 메서드

  • currentRequestAttributes()
    • RequestAttributes 리턴
  • getRequestAttributes()
    • RequestAttributes 리턴
  • resetRequestAttributes()
    • RequestAttributes 리셋

`currentRequestAttributes()`, `getRequestAttributes()`의 기능은 거의 일치한다. 둘의 차이점은 뭘까? `getRequestAttributes()`는 해당되는 `RequestAttributes`가 없으면 NULL을 반환한다.  `getRequestAttributes()`  해당되는 `RequestAttributes`가 없으면 예외를 발생시킨다.

'Spring & Spring Boot' 카테고리의 다른 글

Feign Client  (0) 2020.10.08
스프링 - 비동기 처리 @async  (0) 2020.08.16
컨트롤러 테스트 @WebMvcTest vs @SpringBootTest  (0) 2020.07.16
스프링 웹 프로그래밍 (2)  (0) 2020.02.22
스프링 웹 프로그래밍 (1)  (0) 2020.02.22

댓글