์น ์ค์ฝํ
์น ์ค์ฝํ๋ ์น ํ๊ฒฝ์์๋ง ๋์ํ๋ค.
์น ์ค์ฝํ๋ ํ๋กํ ํ์ ๊ณผ ๋ค๋ฅด๊ฒ ์คํ๋ง์ด ํด๋น ์ค์ฝํ์ ์ข ๋ฃ์์ ๊น์ง ๊ด๋ฆฌํ๋ค. ๋ฐ๋ผ์ ์ข ๋ฃ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.
์น ์ค์ฝํ ์ข ๋ฅ
request: HTTP ์์ฒญ ํ๋๊ฐ ๋ค์ด์ค๊ณ ๋๊ฐ ๋ ๊น์ง ์ ์ง๋๋ ์ค์ฝํ
๊ฐ๊ฐ์ HTTP ์์ฒญ๋ง๋ค ๋ณ๋์ ๋น ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ , ๊ด๋ฆฌ๋๋ค.
session: HTTP Session๊ณผ ๋์ผํ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ ์ค์ฝํ
application: ์๋ธ๋ฆฟ ์ปจํ
์คํธ( ServletContext )์ ๋์ผํ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ ์ค์ฝํ
websocket: ์น ์์ผ๊ณผ ๋์ผํ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ ์ค์ฝํ
request: HTTP ์์ฒญ ํ๋๊ฐ ๋ค์ด์ค๊ณ ๋๊ฐ ๋ ๊น์ง ์ ์ง๋๋ ์ค์ฝํ
๊ฐ๊ฐ์ HTTP ์์ฒญ๋ง๋ค ๋ณ๋์ ๋น ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ , ๊ด๋ฆฌ๋๋ค.
๋์์ ์ฌ๋ฌ HTTP ์์ฒญ์ด ์ค๋ฉด ์ ํํ ์ด๋ค ์์ฒญ์ด ๋จ๊ธด ๋ก๊ทธ์ธ์ง ๊ตฌ๋ถํ๊ธฐ ์ด๋ ต๋ค.
์ด๋ด๋ ์ฌ์ฉํ๊ธฐ ๋ฑ ์ข์๊ฒ์ด ๋ฐ๋ก request ์ค์ฝํ์ด๋ค.
request ์ค์ฝํ ์์ ๋ง๋ค๊ธฐ
๊ธฐ๋ํ๋ ๊ณตํต ํฌ๋ฉง: [UUID][requestURL] {message}
UUID๋ฅผ ์ฌ์ฉํด์ HTTP ์์ฒญ์ ๊ตฌ๋ถํ์.
requestURL ์ ๋ณด๋ ์ถ๊ฐ๋ก ๋ฃ์ด์ ์ด๋ค URL์ ์์ฒญํด์ ๋จ์ ๋ก๊ทธ์ธ์ง ํ์ธํ์.
MyLogger
@Component
@Scope(value = "request")
public class MyLogger {
private String uuid;
private String requestURL;
๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํ MyLogger ํด๋์ค์ด๋ค.
@Scope(value = "request") ๋ฅผ ์ฌ์ฉํด์ request ์ค์ฝํ๋ก ์ง์ ํ๋ค.
์ด์ ์ด ๋น์ HTTP ์์ฒญ ๋น ํ๋์ฉ ์์ฑ๋๊ณ , HTTP ์์ฒญ์ด ๋๋๋ ์์ ์ ์๋ฉธ๋๋ค.
@PostConstruct
public void init() {
String uuid = UUID.randomUUID().toString();
System.out.println("[" + uuid + "] request scope been create: " + this);
}
์ด ๋น์ด ์์ฑ๋๋ ์์ ์ ์๋์ผ๋ก @PostConstruct ์ด๊ธฐํ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ uuid๋ฅผ ์์ฑํด์ ์ ์ฅํด๋๋ค.
์ด ๋น์ HTTP ์์ฒญ ๋น ํ๋์ฉ ์์ฑ๋๋ฏ๋ก, uuid๋ฅผ ์ ์ฅํด๋๋ฉด ๋ค๋ฅธ HTTP ์์ฒญ๊ณผ ๊ตฌ๋ถํ ์ ์๋ค.
@PreDestroy
public void destroy() {
System.out.println("[" + uuid + "] request scope been close: " + this);
}
์ด ๋น์ด ์๋ฉธ๋๋ ์์ ์ @PreDestroy ๋ฅผ ์ฌ์ฉํด์ ์ข
๋ฃ ๋ฉ์์ง๋ฅผ ๋จ๊ธด๋ค.
public void setRequestURL(String requestURL) {
this.requestURL = requestURL;
}
requestURL ์ ์ด ๋น์ด ์์ฑ๋๋ ์์ ์๋ ์ ์ ์์ผ๋ฏ๋ก, ์ธ๋ถ์์ setter๋ก ์ ๋ ฅ ๋ฐ๋๋ค.
LogDemoController
@Controller
@RequiredArgsConstructor
public class LogDemoController {
private final LogDemoService logDemoService;
private final MyLogger myLogger;
๋ก๊ฑฐ๊ฐ ์ ์๋ํ๋์ง ํ์ธํ๋ ํ ์คํธ์ฉ ์ปจํธ๋กค๋ฌ๋ค.
@RequestMapping("log-demo")
@ResponseBody
public String logDemo(HttpServletRequest request) {
String requestURL = request.getRequestURL().toString();
myLogger.setRequestURL(requestURL);
@RequestMapping : ํน์ URL๋ก ์์ฒญ(Request)์ ๋ณด๋ด๋ฉด Controller์์ ์ด๋ ํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ง ์ ์
์ฌ๊ธฐ์ HttpServletRequest๋ฅผ ํตํด์ ์์ฒญ URL์ ๋ฐ์๋ค.
๋์ ์ง๋ฌธ
์๋ธ๋ฆฟ ๊ฐ์ฒด(HttpServeletReuqest) ๋ฅผ ๋ด๊ฐ ์ง์ ์์ฑํ๋๊ฒ ์๋
WAS ์์๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์์
์๋ธ๋ฆฟ ์ปจํ ์ด๋ ์์์ ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์์ฑํด์ฃผ๊ณ ํธ์ถ๋ ํด์ค
๊ทธ๋์ ๋๋ ์ฝ๋๋ง ๊ฐ์ ธ๋ค ์ฌ์ฉํ๋ฉด ๋๋ค
HttpServletRequest ๋ ?
Servlet
HTTP ์์ฒญ/์๋ต ์ ๋ณด๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ํจ
์๋ธ๋ฆฟ ์ปจํ ์ด๋
์๋ธ๋ฆฟ ๊ฐ์ฒด๋ฅผ ๋ด๊ฐ ์ง์ ์์ฑํ๋๊ฒ ์๋
WAS ์์๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์์
์๋ธ๋ฆฟ ์ปจํ ์ด๋ ์์์ ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์์ฑํด์ฃผ๊ณ ํธ์ถ๋ ํด์ค
๊ทธ๋์ ๋๋ ์ฝ๋๋ง ๊ฐ์ ธ๋ค ์ฌ์ฉํ๋ฉด ๋๋ค
์น๋ธ๋ผ์ฐ์ ๊ฐ WAS์๊ฒ Servlet request
-> WAS๋ HttpServletRequest ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ ์ฅ
์๋ต์ ๋ณด๋ผ ๋ ์ฌ์ฉํ๊ธฐ ์ํด HttpServletResponse ๊ฐ์ฒด ์์ฑ
-> Servlet์๊ฒ ๋ ๊ฐ์ฒด ์ ๋ฌ
- httpํ๋กํ ์ฝ์ request์ ๋ณด๋ฅผ ์๋ธ๋ฆฟ์๊ฒ ์ ๋ฌํ๊ธฐ ์ํด ์ฌ์ฉ
requestURL ๊ฐ http://localhost:8080/log-demo ์ด๋ ๊ฒ ๋ฐ์ requestURL ๊ฐ์ myLogger์ ์ ์ฅํด๋๋ค.
myLogger๋ HTTP ์์ฒญ ๋น ๊ฐ๊ฐ ๊ตฌ๋ถ๋๋ฏ๋ก ๋ค๋ฅธ HTTP ์์ฒญ ๋๋ฌธ์ ๊ฐ์ด ์์ด๋ ๊ฑฑ์ ์ ํ์ง ์์๋ ๋๋ค.
myLogger.log("controller test");
logDemoService.logic("testId");
return "OK";
์ปจํธ๋กค๋ฌ์์ controller test๋ผ๋ ๋ก๊ทธ๋ฅผ ๋จ๊ธด๋ค.
LogDemoService
@Service
@RequiredArgsConstructor
public class LogDemoService {
private final MyLogger myLogger;
public void logic(String id) {
myLogger.log("service id = " + id);
}
}
๋น์ฆ๋์ค ๋ก์ง์ด ์๋ ์๋น์ค ๊ณ์ธต์์๋ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํด๋ณด์.
๊ฒฐ๊ณผ
์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ ์ํค๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
๋ฉ์์ง ๋ง์ง๋ง์ ์ฑ๊ธํค์ด๋ผ๋ ๋จ์ด๊ฐ ๋์ค๊ณ ...
์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ์์ ์ ์ฑ๊ธํค ๋น์ ์์ฑํด์ ์ฃผ์ ์ด ๊ฐ๋ฅํ์ง๋ง,
request ์ค์ฝํ ๋น์ ์์ง ์์ฑ๋์ง ์๋๋ค. ์ด ๋น์ ์ค์ ๊ณ ๊ฐ์ ์์ฒญ์ด ์์ผ ์์ฑํ ์ ์๋ค!
myLogger ๋ request ์ค์ฝํ ๋น์ด๋ค . ๊ณ ๊ฐ ์์ฒญ์ ์์ง ๋ค์ด์ค์ง ์์๋ค . ์์ฑ์กฐ์ฐจ ํ์ง ์์๋ค .
์ค์ฝํ์ Provider
private final ObjectProvider<MyLogger> myLoggerProvider;
ObjectProvider๋ฅผ ์ฌ์ฉ
MyLogger myLogger = myLoggerProvider.getObject();
๊ฒฐ๊ณผ
๋๋์ด ์ ์๋ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ObjectProvider.getObject() ๋ฅผ LogDemoController , LogDemoService ์์
๊ฐ๊ฐ ํ๋ฒ์ฉ ๋ฐ๋ก ํธ์ถํด๋ ๊ฐ์ HTTP ์์ฒญ์ด๋ฉด ๊ฐ์ ์คํ๋ง ๋น์ด ๋ฐํ๋๋ค!