[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 26. ์›น ์Šค์ฝ”ํ”„

2023. 2. 10. 16:40ยทSpring/Spring ๊ธฐ๋ณธ

 

์›น ์Šค์ฝ”ํ”„

 

์›น ์Šค์ฝ”ํ”„๋Š” ์›น ํ™˜๊ฒฝ์—์„œ๋งŒ ๋™์ž‘ํ•œ๋‹ค.

 

์›น ์Šค์ฝ”ํ”„๋Š” ํ”„๋กœํ† ํƒ€์ž…๊ณผ ๋‹ค๋ฅด๊ฒŒ ์Šคํ”„๋ง์ด ํ•ด๋‹น ์Šค์ฝ”ํ”„์˜ ์ข…๋ฃŒ์‹œ์ ๊นŒ์ง€ ๊ด€๋ฆฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ข…๋ฃŒ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

 

 

 

์›น ์Šค์ฝ”ํ”„ ์ข…๋ฅ˜

 

request: HTTP ์š”์ฒญ ํ•˜๋‚˜๊ฐ€ ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐˆ ๋•Œ ๊นŒ์ง€ ์œ ์ง€๋˜๋Š” ์Šค์ฝ”ํ”„

 

๊ฐ๊ฐ์˜ HTTP ์š”์ฒญ๋งˆ๋‹ค ๋ณ„๋„์˜ ๋นˆ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ๊ด€๋ฆฌ๋œ๋‹ค.

 


session: HTTP Session๊ณผ ๋™์ผํ•œ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” ์Šค์ฝ”ํ”„


application: ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ( ServletContext )์™€ ๋™์ผํ•œ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” ์Šค์ฝ”ํ”„

 

websocket: ์›น ์†Œ์ผ“๊ณผ ๋™์ผํ•œ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” ์Šค์ฝ”ํ”„

 

 

HTTP request ์š”์ฒญ ๋‹น ๊ฐ๊ฐ ํ• ๋‹น๋˜๋Š” request ์Šค์ฝ”ํ”„

 

request: HTTP ์š”์ฒญ ํ•˜๋‚˜๊ฐ€ ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐˆ ๋•Œ ๊นŒ์ง€ ์œ ์ง€๋˜๋Š” ์Šค์ฝ”ํ”„

 

๊ฐ๊ฐ์˜ HTTP ์š”์ฒญ๋งˆ๋‹ค ๋ณ„๋„์˜ ๋นˆ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ๊ด€๋ฆฌ๋œ๋‹ค.

 

 

๋™์‹œ์— ์—ฌ๋Ÿฌ HTTP ์š”์ฒญ์ด ์˜ค๋ฉด ์ •ํ™•ํžˆ ์–ด๋–ค ์š”์ฒญ์ด ๋‚จ๊ธด ๋กœ๊ทธ์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

 

์ด๋Ÿด๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ๋”ฑ ์ข‹์€๊ฒƒ์ด ๋ฐ”๋กœ request ์Šค์ฝ”ํ”„์ด๋‹ค.

 

 

 

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();

 

 

 

๊ฒฐ๊ณผ

 

์›น ๋ธŒ๋ผ์šฐ์ €์—&nbsp; http://localhost:8080/log-demo&nbsp; ๋ฅผ ์ž…๋ ฅ

 

 

๋“œ๋””์–ด ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

ObjectProvider.getObject() ๋ฅผ LogDemoController , LogDemoService ์—์„œ

 

๊ฐ๊ฐ ํ•œ๋ฒˆ์”ฉ ๋”ฐ๋กœ ํ˜ธ์ถœํ•ด๋„ ๊ฐ™์€ HTTP ์š”์ฒญ์ด๋ฉด ๊ฐ™์€ ์Šคํ”„๋ง ๋นˆ์ด ๋ฐ˜ํ™˜๋œ๋‹ค!

 

 

 

 

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์Šคํ”„๋ง ์ž…๋ฌธ์ž๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์Šคํ”„๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ™•์‹คํžˆ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ...

www.inflearn.com

 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'Spring > Spring ๊ธฐ๋ณธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 27. ์Šค์ฝ”ํ”„์™€ ํ”„๋ก์‹œ  (0) 2023.02.10
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 25. ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„ / Provider  (0) 2023.02.09
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 24. ๋นˆ ์Šค์ฝ”ํ”„  (0) 2023.02.09
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 23. ๋นˆ ์ƒ๋ช…์ฃผ๊ธฐ ์ฝœ๋ฐฑ  (0) 2023.02.08
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 22. ์กฐํšŒํ•œ ๋นˆ์ด ๋ชจ๋‘ ํ•„์š”ํ•  ๋•Œ / List, Map  (0) 2023.02.07
'Spring/Spring ๊ธฐ๋ณธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 27. ์Šค์ฝ”ํ”„์™€ ํ”„๋ก์‹œ
  • [์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 25. ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„ / Provider
  • [์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 24. ๋นˆ ์Šค์ฝ”ํ”„
  • [์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 23. ๋นˆ ์ƒ๋ช…์ฃผ๊ธฐ ์ฝœ๋ฐฑ
hello_u
hello_u
  • hello_u
    ๐Ÿ˜œ
    hello_u
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๐Ÿ˜œ (345)
      • Hardware (2)
        • BMC (2)
      • Spring (109)
        • Spring ์ž…๋ฌธ (20)
        • Spring ๊ธฐ๋ณธ (27)
        • Spring MVC (18)
        • Spring DB (22)
        • Spring JPA ๊ธฐ๋ณธ (16)
        • Spring JPA ํ™œ์šฉ (6)
      • Develop (27)
        • DB (8)
        • JAVA (4)
        • Web (2)
        • Python (7)
        • OSS (2)
        • Git (2)
        • API (2)
      • Algorithm (155)
        • CodeUp ๊ธฐ์ดˆ (44)
        • ํŒŒ์ด์ฌ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (64)
        • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (4)
        • SWEA (30)
        • Softeer (10)
        • BOJ (2)
      • CS (9)
        • ์ปดํ“จํ„ฐ์ผ๋ฐ˜ (3)
        • ์šด์˜์ฒด์ œ (3)
        • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (0)
        • ์ •๋ณดํ†ต์‹  (1)
        • ์ž๋ฃŒ๊ตฌ์กฐ (1)
        • ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ (1)
        • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (0)
        • ์ตœ์‹  ๋””์ง€ํ„ธ, ์ผ๋ฐ˜์ƒ์‹ (0)
      • ์ž๊ฒฉ์ฆ (41)
        • ์ •๋ณด๋ณด์•ˆ๊ธฐ์‚ฌ (9)
        • ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ (22)
        • ๋ฆฌ๋ˆ…์Šค๋งˆ์Šคํ„ฐ 1๊ธ‰ (3)
        • SQLD (7)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
hello_u
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 26. ์›น ์Šค์ฝ”ํ”„
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”