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 |
댓글