Post

WAS, Servlet, Filter, Interceptor

WAS ๐ŸŸฐ WEB โž• ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ

WAS ๋‚ด๋ถ€์— ๋””์ŠคํŒจ์น˜ ์„œ๋ธ”๋ฆฟ ๋‚ด๋ถ€๋™์ž‘์ด ์ผ์–ด๋‚˜๊ณ  ์ด ์•ˆ์— ์Šคํ”„๋ง์ด ๋˜ ์žˆ์Œ
๋”ฐ๋ผ์„œ ์Šคํ”„๋ง์„ ๊ฐœ๋ฐœํ•  ๋–„ ์šฐ๋ฆฌ๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์˜ ์ผ๋ถ€๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

โœ… WAS

WAS: Web Application Server
client ์š”์ฒญ์„ ๋ฐ›์•„ ์˜๋ฏธ ์žˆ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ์„œ๋ฒ„

โœ”๏ธ WAS์˜ web์„œ๋ฒ„๊ฐ€ ํ•˜๋Š” ์—ญํ• 

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-01-08 แ„‹แ…ฉแ„’แ…ฎ 2 21 35

  • ์ •์ ์ธ ํŒŒ์ผ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌ(ํ•ญ์ƒ ๊ฐ™์€ input, output์ด ๋‚˜์˜ค๋Š” ๊ฒƒ๋“ค, ์ด๋ฏธ์ง€, ์˜์ƒ ๋“ฑ)
  • ๋™์ ์ธ ์š”์ฒญ์€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋กœ ์œ„์ž„

โœ… ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ(๐ŸŸฐ ์›น ์ปจํ…Œ์ด๋„ˆ)

๋Œ€ํ‘œ์ ์ธ ๊ตฌํ˜„์ฒด: tomcat

  1. ํ”„๋กœํ† ์ฝœ ์š”์ฒญ/์‘๋‹ต ์ฒ˜๋ฆฌ
  2. ์“ฐ๋ ˆ๋“œ ํ’€ ๊ด€๋ฆฌ
  3. ์Šคํ”„๋ง ์ง€์› ๋Ÿฐํƒ€์ž„ ์ปดํฌ๋„ŒํŠธ

โ˜‘๏ธ Servlet

Servlet: ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ & ์„œ๋ฒ„์—์„œ ๋™์ ์ธ ์›น ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ฃผ์ฒด

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-01-08 แ„‹แ…ฉแ„’แ…ฎ 2 27 46

โœ”๏ธ Protocol ๊ด€๋ จ Servlet

WAS๋Š” HTTP๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ ์ง€์›

โœ”๏ธ Server framework ๊ด€๋ จ Servlet

WAS๋Š” ์Šคํ”„๋ง๊ณผ ๊ทธ ์™ธ ๋‹ค์–‘ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์›
์Šคํ”„๋ง โžก๏ธ ๋””์ŠคํŒจ์น˜ ์„ธ๋ธŒ๋ ›์ด ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

โœ… ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์™€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ

แ„แ…ฉแ„ƒแ…ตแ†ผแ„€แ…ฉแ†ผแ„Žแ…ขแ†จ-15

โœ”๏ธ ์„œ๋ฒ„ ์†Œ์ผ“

์„œ๋ฒ„๋Š” ๋ฌด์กฐ๊ฑด ์„œ๋ฒ„ ์†Œ์ผ“์„ ์—ด์–ด๋‘๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—ฐ๋‹ค.
ํฌํŠธ ์—ด์–ด์„œ ์„œ๋ฒ„์—์„œ ์ฃผ๊ณ ๋ฐ›์„ ์ค€๋น„

โœ”๏ธ ์ž…์ถœ๋ ฅ stream

stream์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ ์ฃผ๊ณ ๋ฐ›๊ธฐ

โœ”๏ธ ์“ฐ๋ ˆ๋“œ ํ’€

์“ฐ๋ ˆ๋“œ ํ’€๋„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋‘”๋‹ค.
๋ฏธ๋ฆฌ ์“ฐ๋ ˆ๋“œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์ƒ์„ฑํ•ด ๋‘” pool
๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋”ฉ ์‹œ์ž‘ํ•˜๋ฉด ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘” ๊ฐ์ฒด๋ฅผ ์ฃผ๋ฉฐ โ€œ์ด๊ฑฐ ์จ!โ€ ํ•œ๋‹ค.
์‚ฌ์šฉ ํ›„ ์“ฐ๋ ˆ๋“œ ํ’€์— ๋ฐ˜ํ™˜

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-01-08 แ„‹แ…ฉแ„’แ…ฎ 2 44 31

  1. WAS(๐ŸŸฐtomcat)์ด ์ผœ์ง„๋‹ค.
  2. ์„œ๋ฒ„ ์†Œ์ผ“ OPEN(port 8080)
  3. thread pool ๋งŒ๋“ค์–ด ๋†“๋Š”๋‹ค.
  4. Web browser์—์„œ ์„œ๋ฒ„ ์†Œ์ผ“์ด ์—ด๋ฆฐ ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  HTTP GET API์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
  5. ์ด ์š”์ฒญ์„ Web์ด ๊ฐ€์žฅ ๋จผ์ € ๋งŒ๋‚˜๋Š”๋ฐ, ์ž์‹ ์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ •์ ์ธ ๊ฒƒ์ด๋ฉด ์ฒ˜๋ฆฌ, ์ฒ˜๋ฆฌ ๋ชปํ•˜๋ฉด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋„˜๊ธด๋‹ค.
  6. thread pool์—์„œ thread๋ฅผ ํ• ๋‹น๋ฐ›๋Š”๋‹ค.
  7. ์ž…์ถœ๋ ฅ stream์„ ์—ฐ๋‹ค.
    ๐Ÿ‘๐Ÿป ๋ฐ์ดํ„ฐ ์ฃผ๊ณ ๋ฐ›์„ ์ค€๋น„ ์™„๋ฃŒ
  8. ์†Œ์ผ“ ํ†ตํ•ด์„œ ์ •๋ณด ๋ฐ›์Œ
  9. ์ •๋ณด๊ฐ€ HTTP Protocol๋กœ ์™”์œผ๋ฉด Protocol ๊ด€๋ จ ์„œ๋ธ”๋ › ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ฒ˜๋ฆฌ
  10. ์–ด๋–ค ํ”„๋ ˆ์ž„์›Œํฌ ์“ฐ๋Š”์ง€์— ๋”ฐ๋ผ server framework ์„œ๋ธ”๋ ›์—์„œ ์ฒ˜๋ฆฌ
  11. HTTP method, URI๋ณด๊ณ  ํ•ด๋‹นํ•˜๋Š” controller์— ๋งคํ•‘๋˜์–ด ์ฒ˜๋ฆฌ
    ๐Ÿ‘๐Ÿป ๋ฐ์ดํ„ฐ ๋ฐ›๊ธฐ ๋
  12. ๋ฐ์ดํ„ฐ ๋ณด๋‚ผ๋•Œ๋Š” ๋ฐ˜๋Œ€.
  13. controller๊ฐ€ ๋ณด๋‚ธ๋‹ค.
  14. HTTP์—์„œ ์†Œ์ผ“์œผ๋กœ ๊ฐ€์„œ ๋ฐ์ดํ„ฐ ๋ณด๋‚ด๊ณ 
  15. ์‚ฌ์šฉํ•œ thread๋ฐ˜ํ™˜

โœ… ๋””์ŠคํŒจ์น˜ ์„œ๋ธ”๋ ›์˜ ๋‚ด๋ถ€ ๋™์ž‘ ํ๋ฆ„

HTTP method, URI๋ณด๊ณ  ์ปจํŠธ๋กค๋Ÿฌ ์ •ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ,
์ปจํŠธ๋กค๋Ÿฌ๋งˆ๋‹ค ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-01-08 แ„‹แ…ฉแ„’แ…ฎ 2 59 44

โœ”๏ธ SSR controller โžก๏ธ @Controller

แ„แ…ฉแ„ƒแ…ตแ†ผแ„€แ…ฉแ†ผแ„Žแ…ขแ†จ-17

โœ”๏ธ CSR controller

แ„แ…ฉแ„ƒแ…ตแ†ผแ„€แ…ฉแ†ผแ„Žแ…ขแ†จ-18

โœ… Spring MVC Pattern โžก๏ธ @RestController

Model View Controller

๋””์ŠคํŒจ์น˜ ์„œ๋ธ”๋ ›: ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ํŒจํ„ด์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.
๊ฐ๊ฐ์˜ ์—ญํ• ์„ ๊ฐ์ฒด์—๊ฒŒ ๋งคํ•‘ํ•˜์—ฌ(์ฃผ์–ด์„œ) ์ˆ˜ํ–‰
ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ํŒจํ„ด์ธ ์ด์œ ๋Š” ์–ด๋–ค ์š”์ฒญ์ด ์™€๋„ ์•ž์—์„œ servlet์ด ๋งคํ•‘์„ ํ†ตํ•ด ๊ด€๋ฆฌํ•œ๋‹ค.

โœ… WAS๋Š” HTTP์š”์ฒญ ์‹œ, Servelt Request/Response๋ฅผ ๋งŒ๋“ ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-01-19 แ„‹แ…ฉแ„’แ…ฎ 12 42 51

โ˜‘๏ธ HTTP Servelt Request

  • ์š”์ฒญ ์ •๋ณด๋ฅผ ์„œ๋ธ”๋ฆฟ์—๊ฒŒ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด
  • ํ—ค๋”/URL/๋ฉ”์†Œ๋“œ ๋“ฑ์„ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค.
  • Body Stream(input)์„ ์ฝ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋‹ค.
  • ๊ธฐ์กด์— @RequestParam์œผ๋กœ ๋ฐ›๋˜ Input๊ฐ’์„ HTTP Servelt Request์œผ๋กœ ๋Œ€์‹  ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

    ๐Ÿ’ก ์›๋ž˜๋Š” HttpServletRequestํ•ด์„œ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์ธ๋ฐ @RequestParam๊ฐ€ ์ผ์„ ํ•ด ์ค€ ๊ฒƒ์ด๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Chap109Controller {
    private final ItemService itemService;

//@RequestParam
//    @GetMapping("/items-prices")
//    public List<Item> findItemByPrices(@RequestParam("max") Integer maxValue){ //โญ๏ธ@RequestParam
//        List<Item> items=  itemService.findItemEntitiesByPriceLessThanEqualOrderByPriceAsc(maxValue);
//        return items;
//    }

    //HttpServletRequest
    @GetMapping("/items-prices")
    public List<Item> findItemByPrices(HttpServletRequest httpServletRequest){
        Integer maxValue= Integer.valueOf(httpServletRequest.getParameter("max"));
        List<Item> items=  itemService.findItemEntitiesByPriceLessThanEqualOrderByPriceAsc(maxValue);
        return items;
    }
}

โ˜‘๏ธ HTTP Servelt Response

  • ์š”์ฒญ์„ ๋ณด๋‚ธ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์„ ๋ณด๋‚ด๋Š” ๊ฐ์ฒด
  • ํ•ด๋‹น ์„œ๋ธ”๋ฆฟ์„ ํ†ตํ•ด ์‘๋‹ต output์„ ์ „์†กํ•œ๋‹ค.
  • ๊ธฐ์กด์— @RestController๋กœ output๋‚ด๋ณด๋‚ด๋˜ ์ž‘์—…์„ HTTP Servelt Response๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๐Ÿ’ก ๊ธฐ์กด @PathVariable์€ ์‚ฌ์‹ค HTTP Servelt Response์˜ getOutputStream()๋กœ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋˜ ๊ฒƒ์ด๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
//    @DeleteMapping("/items/{id}")
//    public String deleteItemById(@PathVariable String id) {
//        itemService.deleteItem(id);
//        return "Object with id =" + id + "has been deleted";
//    }

    @DeleteMapping("/items/{id}")
    public void deleteItemById(@PathVariable String id, HttpServletResponse httpServletResponse) throws IOException {
        itemService.deleteItem(id);
        httpServletResponse.getOutputStream().println("Object with id =" + id + "has been deleted");
    }

โž• Servelt Container์•ˆ์˜ Web Filter

IMG_3155

ํ—ˆ์šฉ๋˜์ง€ ์•Š์€ ์š”์ฒญ, ์‘๋‹ต์ด ์˜ค๋ฉด filter๊ฐ€ ๊ฑธ๋Ÿฌ์ฃผ๊ฑฐ๋‚˜
๊ธฐ๋ก์„ ๋‚จ๊ธฐ๋Š” filter๋„ ์žˆ๊ณ 
์–ธ์–ด๊ฐ€ ๋‹ฌ๋ผ ๊นจ์ง„์ฑ„๋กœ ์˜ค๋ฉด filter๊ฐ€ encoding ์ฒ˜๋ฆฌํ•ด์ฃผ๊ฑฐ๋‚˜ ๋“ฑ๋“ฑ์˜ ์—ญํ• ์„ ํ•œ๋‹ค.

Spring Container ๋ฐ–์— ์žˆ์Œ
๋”ฐ๋ผ์„œ Spring์˜ ์ž์›์€ ์•„๋‹ˆ๋‹ค. โŒ
โœ”๏ธ doFilter()๋ฉ”์†Œ๋“œ๋กœ ์‘๋‹ต/์š”์ฒญ ๋™์ž‘์„ ํ•œ๋‹ค.
Request/Response ๊ฐ์ฒด์— ๊ด€์—ฌํ•œ๋‹ค. โญ•๏ธ
๊ทธ๋ž˜์„œ Request/Response ๋ฐ›์€ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž„.

๐Ÿ’ก Filter ๊ธฐ๋Šฅ

  • ์ด๋ฏธ์ง€/๋ฐ์ดํ„ฐ ์••์ถœ ๋ฐ ๋ฌธ์ž์—ด ์ธ์ฝ”๋”ฉ
  • ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•œ ๋กœ๊น…
  • ๊ณตํ†ต ๋ณด์•ˆ ๋ฐ ์ธ์ฆ/์ธ๊ฐ€
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•œ ๋กœ๊น… ๋‚จ๊ธฐ๋Š” filter
@Component
@Slf4j
public class LoggingFilter extends OncePerRequestFilter { //๋‚˜๋งŒ์˜ filter์„ ๋งŒ๋“ค๋ž˜
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String method= request.getMethod();
        String uri= request.getRequestURI();
        log.info("์š”์ฒญ์ด ๋“ค์–ด์™”์Šต๋‹ˆ๋‹ค. "+ method + uri); //โญ๏ธcontroller์— ์ด ์ฝ”๋“œ๋ฅผ ์“ฐ์ง€ ์•Š๊ณ  filter์— ํ•œ ๋ฒˆ์— ์“ด๋‹ค.
        filterChain.doFilter(request, response);
        //๊ธฐ์กด ์žˆ๋˜ filter chain์— ๋‚ด filter๋„ ๋ผ์›Œ์ฃผ๋ผ
        //โญ๏ธdoFilter์•ž์— ์“ฐ๋ฉด ๋“ค์–ด์˜ฌ ๋•Œ Filter, ๋’ค์— ์“ฐ๋ฉด ๋‚˜๊ฐˆ ๋•Œ Filter
        log.info(method + uri + response.getStatus()+ "response");
    }
}

โž• Spring Container์•ˆ์˜ Interceptor

๊ธฐ๋ณธ์ ์œผ๋กœ filter์ด๋ž‘ ๋น„์Šทํ•˜๊ฒŒ ๊ฑธ๋Ÿฌ์ฃผ๊ฑฐ๋‚˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ด์ฃผ๋Š”๋ฐ
filter๋ž‘ ๋‹ค๋ฅธ ์ ์€ Spring Container์•ˆ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
Interceptor์€ Spring Container์˜ ์ž์›์ด๋‹ค. โญ•๏ธ
โœ”๏ธ ์š”์ฒญ : preHandler()
โœ”๏ธ ์‘๋‹ต: postHandler() ๋ฉ”์†Œ๋“œ๋กœ
Request/Response ๊ฐ์ฒด์— ๊ด€์—ฌํ•˜์ง€ ์•Š๋Š”๋‹ค. โŒ
Request/Response ๊ฐ์ฒด์— ๊ด€์—ฌํ•˜๊ณ  ์‹ถ์œผ๋ฉด filter๋กœ ํ•˜์„ธ์š”โ€ฆ

โญ๏ธ ์ˆœ์„œ

IMG_3156

filter โžก๏ธ controller โžก๏ธ (๋“ค์–ด์˜ค๊ธฐ ๋) โžก๏ธ ๊ฒฐ๊ณผ โžก๏ธ (๋‚˜๊ฐ€๊ธฐ) โžก๏ธ controller โžก๏ธ interceptor โžก๏ธ filter

๐Ÿ’ก Interceptor ๊ธฐ๋Šฅ

  • API ํ˜ธ์ถœ ์‹œ๊ฐ„ ๋กœ๊น…
  • ์„น์…˜ ๋ฐ ์ฟ ํ‚ค ์ฒดํฌ
  • ์„ธ๋ถ€์ ์ธ ๋ณด์•ˆ ๋ฐ ์ธ์ฆ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//API ํ˜ธ์ถœ ์‹œ๊ฐ„ ๋กœ๊น…ํ•˜๋Š” Interceptor
@Component
@Slf4j
public class RequestTimeLoggingInterceptor implements HandlerInterceptor {
    //controller ์š”์ฒญ ์ „
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        long startTime= System.currentTimeMillis(); //ํ˜„์žฌ ์‹œ๊ฐ„
        request.setAttribute("request start time" , startTime);
        return true;
    }
    //controller ์š”์ฒญ ๋๋‚œ ํ›„

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        long startTime= (Long) request.getAttribute("request start time");
        long endTime= System.currentTimeMillis();
        long executeTime= endTime - startTime;

        log.info("{} {} executed in {} ms", request.getMethod(), request.getRequestURI(), executeTime);
    }
}
//Interceptor์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด configํ•„์š”ํ•˜๋‹ค.
@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {
    private final RequestTimeLoggingInterceptor requestTimeLoggingInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(requestTimeLoggingInterceptor);
    }
}
This post is licensed under CC BY 4.0 by the author.