[Spring Framework] HttpServletRequest - HTTP ๋ฉ”์‹œ์ง€ ๊ฐ’ ๋‹ด๊ธฐ๋Š” ๊ณผ์ • (์š”์ฒญ)

2025. 6. 27. 16:34ยท๐Ÿ› ๏ธBackend/๐ŸŒณSpring
  • SpringBoot ๋‚ด์žฅ ์„œ๋ฒ„๋Š” Tomcat์ด๋ฉฐ, ํ•ด๋‹น Tomcat์€ WAS๋กœ ๋ถˆ๋ฆฌ๋ฉฐ, ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฏธ๋“ค์›จ์–ด๋กœ ๋ถˆ๋ฆฐ๋‹ค.
  • Tomcat์€ HttpServletRequest ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค.
  • ์ฆ‰, ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด HttpServletRequest ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์— ์š”์ฒญ์˜ ๋Œ€ํ•œ ๊ฐ’์ด ๋‹ด๊ธฐ๊ฒŒ ๋œ๋‹ค.

โœ… 1. HttpServletRequest [ interface ]

package jakarta.servlet.http;

public interface HttpServletRequest extends ServletRequest {
    // ... ์—ฌ๋Ÿฌ HTTP ๊ด€๋ จ ๋ฉ”์„œ๋“œ๋“ค์ด ์ถ”์ƒ๋ฉ”์„œ๋“œ๋กœ ์ •์˜๋˜์–ด ์žˆ์Œ.
}
  • ์ž๋ฐ”์˜ ํ‘œ์ค€ API ์ธ Servlet API ์˜ ์ผ๋ถ€์ด๋‹ค. ์ฆ‰, ์ž๋ฐ” ํ‘œ์ค€ API ์ธ ๊ฒƒ์ด๋‹ค.
  • ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ๋ถ€ํ„ฐ HTTP ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ๊ฐ’์„ ๋‹ด์•„์„œ ์„œ๋ฒ„ ์ชฝ ์ฝ”๋“œ๋กœ ์ „๋‹ฌํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • ํ•ต์‹ฌ์€ ์š”์ฒญ ๋ฉ”์„œ๋“œ, ์š”์ฒญ URL, ์ฟผ๋ฆฌ์ŠคํŠธ๋ง, ์š”์ฒญ ํ—ค๋”, ์š”์ฒญ ๋ณธ๋ฌธ(Body), ์ฟ ํ‚ค ๋“ฑ HTTP ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ๊ฒƒ์„ ๋ช…์„ธ๋ฅผ ํ•ด๋‘” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ์ฆ‰, ๊ตฌํ˜„์„ ํ†ตํ•ด ํ•ด๋‹น ๊ตฌํ˜„ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋‹ด์•„์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

โœ… 2. ServletRequest [ interface ]

public interface ServletRequest {
    // ์š”์ฒญ ๋ณธ๋ฌธ์„ ๋‹ด๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ ๋“ฑ HttpServletRequest์— ์ƒ์† ํ•  ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ์Œ
    ServletInputStream getInputStream() throws IOException;
}
  • ์œ„์˜ HttpServletRequest ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ƒ์†์„ ๋ฐ›๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
  • ํ•ด๋‹น getInputStream() ๋ฉ”์„œ๋“œ ๋ถ€๋ถ„์„ ํ†ตํ•ด ์š”์ฒญ ๋ณธ๋ฌธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ์˜ฌ ์ˆ˜ ์žˆ์Œ.
  • HttpServletRequest ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋ชป๋ณธ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๊ธฐ์„œ ๋ณผ ์ˆ˜ ์žˆ์Œ. ( ์—ฌ๊ธฐ๋„ ํ™•์ธ์„ ํ•ด์•ผ ์œ ์šฉํ•จ )
  • ์™œ๋ƒํ•˜๋ฉด HttpServletRequest ๊ฐ€ ๊ฒฐ๊ตญ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์† ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โœ… 3. Request [ instance - org.apache.catalina.connector.Request ]

public class Request implements HttpServletRequest {
    //...
}
  • ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค์ž„.
  • ์š”์ฒญ ๋ฉ”์„œ๋“œ, URI, ์ฟผ๋ฆฌ์ŠคํŠธ๋ง, ํ”„๋กœํ† ์ฝœ, ํ—ค๋”, ๋ฐ”๋””, ์ฟ ํ‚ค, ์„ธ์…˜, ์ธ์ฆ ์ •๋ณด ๋“ฑ ๋‹ค ๊ฐ€์ง€๊ณ  ์žˆ์Œ.
  • ์ฆ‰, HTTP ์š”์ฒญ ์ „์ฒด๊ฐ€ ์ด ๊ฐ์ฒด์— ๋กœ์šฐํ•˜๊ฒŒ ์ €์žฅ์ด ๋˜์–ด์žˆ์Œ.
  • ๋ชจ๋“  HTTP ์š”์ฒญ ์ฆ‰, ํด๋ผ์ด์–ธํŠธ์˜ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ด์Šˆ๊ฐ€ ์žˆ์Œ.
  • ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ReuqestFacade ํด๋ž˜์Šค๋ฅผ ๊ฐ์‹ธ์„œ ํ•ด๋‹น ReuqestFacade ํด๋ž˜์Šค๋งŒ ์ด์šฉ์„ ํ•˜๊ฒŒ ๋จ.

โœ… 4. RequestFacade [ instance - org.apache.catalina.connector ]

public class RequestFacade implements HttpServletRequest {
    protected Request request = null;

    public RequestFacade(Request request) {
        this.request = request;
    }
    
    // ...
}
  • Request ํด๋ž˜์Šค๋ฅผ ๊ฐ์‹ผ ์™ธ๋ถ€ ๋…ธ์ถœ์šฉ ํด๋ž˜์Šค์ด๋‹ค.
  • Request ํด๋ž˜์Šค๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋‹ค ๊ฐ€์ง€๊ณ  ์žˆ์–ด, ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ณด์•ˆ์ƒ ์ด์Šˆ๊ฐ€ ๋จ.
  • ๊ทธ๋ž˜์„œ ํ•ด๋‹น RequestFacade ํด๋ž˜์Šค๋กœ ๊ฐ์‹ธ์„œ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋‚˜ ๋ฉ”์„œ๋“œ์— ์ง์ ‘ ์ ‘๊ทผ์„ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ์ œํ•œ๋œ ๋ฉ”์„œ๋“œ๋งŒ ๋…ธ์ถœ์„ํ•จ.
  • ์ฆ‰, ์ตœ์ข…์ ์œผ๋กœ ์ด์šฉ์„ ํ•˜๊ฒŒ ๋˜๋Š” ํด๋ž˜์Šค๋Š” HttpServletRequest์˜ ๊ตฌํ˜„์ฒด์ธ RequestFacade ํด๋ž˜์Šค์ด๋‹ค.

โœ… 5. ์‹ค์ œ ๋™์ž‘ ์›๋ฆฌ

public class Request implements HttpServletRequest {
    // ๋‚ด๋ถ€์ ์œผ๋กœ RequestFacade ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ
    public HttpServletRequest getRequest() {
        if (this.facade == null) {
            this.facade = new RequestFacade(this);
        }

        if (this.applicationRequest == null) {
            this.applicationRequest = this.facade;
        }

        return this.applicationRequest;
    }
}
  • ๋‚ด๋ถ€์ ์œผ๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด Request ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋‹ด๋Š”๋‹ค.
  • ์ดํ›„, ํ•ด๋‹น getRequest() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ RequestFacade ์— Request ๊ฐ’์„ ๋‹ด์•„ ๋ฆฌํ„ด์„ ํ•ด์คŒ.
  • ์ตœ์ข…์ ์œผ๋กœ HttpServletRequest ํƒ€์ž…์œผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์œผ๋กœ ๋„˜์–ด์˜ค๊ฒŒ ๋จ.

โœ… 6. Tomcat ๊ทธ ์™ธ ์„œ๋ฒ„๋“ค

  • SpringBoot ์—๋Š” ๋””ํดํŠธ๋กœ ๋‚ด์žฅ ๋œ WAS ๊ฐ€ Tomcat์ด์ง€๋งŒ, ๋‹ค๋ฅธ ์„œ๋ฒ„(๋ฏธ๋“ค์›จ์–ด) ์ฆ‰, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ.
  • ์ข…๋ฅ˜๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ Tomcat, Jetty, Undertow ์ด๋ ‡๊ฒŒ ์žˆ์Œ.
  • ํ•ด๋‹น ์„œ๋ฒ„๋“ค์€ ๋ชจ๋‘ HttpServletRequest ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณต์„ ํ•˜๊ณ  ์žˆ์Œ.

(1) Tomcat ๋‚ด์žฅ ์„œ๋ฒ„ ์‚ฌ์šฉ ์‹œ

  • org.apache.catalina.connector.Request ํด๋ž˜์Šค๊ฐ€ HttpServletRequest ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๊ฐ’์„ ๋‹ด๊ฒŒ ๋จ.
  • ๋‚ด๋ถ€์ ์œผ๋กœ RequestFacade ๊ฐ€ ๊ฐ์‹ธ์„œ ์™ธ๋ถ€(์‚ฌ์šฉ์ž ์ฝ”๋“œ)๋กœ ์ „๋‹ฌ์ด ๋จ.

(2) Jetty ๋‚ด์žฅ ์„œ๋ฒ„ ์‚ฌ์šฉ ์‹œ

  • org.eclipse.jetty.server.Request ํด๋ž˜์Šค๊ฐ€ HttpServletRequest ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๊ฐ’์„ ๋‹ด๊ฒŒ ๋จ.

(3) Undertow ๋‚ด์žฅ ์„œ๋ฒ„ ์‚ฌ์šฉ ์‹œ

  • io.undertow.servlet.spec.HttpServletRequestImpl ํด๋ž˜์Šค๊ฐ€ HttpServletRequest ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๊ฐ’์„ ๋‹ด๊ฒŒ ๋จ.

โœ… 7. ์ •๋ฆฌ

  • ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ œ์ผ ์ฒ˜์Œ HttpServletRequest ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š” Request์— ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ’์ด ๋‹ด๊น€.
  • ์ดํ›„ ํ•ด๋‹น Request ํด๋ž˜์Šค์—๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋‚˜ ๋ฉ”์„œ๋“œ์— ์ง์ ‘ ์ ‘๊ทผ์„ ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰์•„๋‘ 
  • ๋ฐ”๋กœ RequestFacade ํด๋ž˜์Šค๋กœ ๊ฐ์‹ธ์„œ ์ง์ ‘ ์ ‘๊ทผ์„ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ์ œํ•œ๋œ ๋ฉ”์„œ๋“œ๋งŒ ๋…ธ์ถœ์„ ํ•ด์„œ ๋ง‰์•„๋‘ .

'๐Ÿ› ๏ธBackend > ๐ŸŒณSpring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring WebSocket] ์Šคํ”„๋ง์—์„œ ์›น ์†Œ์ผ“ ๋™์ž‘  (0) 2025.07.19
[Spring Framework] Servlet API, HttpServlet, DispatcherServlet, Tomcat ์•Œ์•„๋ณด๊ธฐ  (0) 2025.06.28
[Spring Framework] @RestController & @Controller ์ฐจ์ด  (0) 2025.05.12
[Spring Framework] DispatcherServle  (0) 2025.05.12
[Spring Security] UsernamePasswordAuthenticationFilter  (0) 2025.05.07
'๐Ÿ› ๏ธBackend/๐ŸŒณSpring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Spring WebSocket] ์Šคํ”„๋ง์—์„œ ์›น ์†Œ์ผ“ ๋™์ž‘
  • [Spring Framework] Servlet API, HttpServlet, DispatcherServlet, Tomcat ์•Œ์•„๋ณด๊ธฐ
  • [Spring Framework] @RestController & @Controller ์ฐจ์ด
  • [Spring Framework] DispatcherServle
junbin2
junbin2
java.lang.NullPointerException
  • junbin2
    bin's Development Diary
    junbin2
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ์ „์ฒด๋ณด๊ธฐ (167)
      • ๐ŸŽ“๋ฐฉ์†กํ†ต์‹ ๋Œ€ํ•™๊ต (33)
        • โš™๏ธ์ปดํ“จํ„ฐ์˜ ์ดํ•ด (11)
        • ๐Ÿ’ป์ปดํ“จํ„ฐ๊ณผํ•™ ๊ฐœ๋ก  (3)
        • ๐Ÿ”ข์ž๋ฃŒ๊ตฌ์กฐ (4)
        • ๐ŸŒ์œ ๋น„์ฟผํ„ฐ์Šค ์ปดํ“จํŒ… (11)
        • ๐Ÿ›๏ธ์„ธ๊ณ„์˜์ •์น˜์™€๊ฒฝ์ œ (3)
        • ๐Ÿ–ฅ๏ธ์ปดํ“จํ„ฐ๊ณผํ•™๊ณผ (1)
      • ๐Ÿ› ๏ธBackend (58)
        • ๐Ÿ“š๋ฐฑ์—”๋“œ ๊ณต๋ถ€ (4)
        • โ˜•Java (23)
        • ๐ŸŒณSpring (13)
        • โš™๏ธC (2)
        • โšกPython (13)
        • JavaScript (1)
        • ๐Ÿ›ข๏ธDatabase (0)
        • Algorithm Problem Solving (2)
      • ๐ŸŒ Network (7)
        • ๐Ÿ“œHTTP (7)
      • ๐Ÿš€DevOps (1)
      • โ›บ์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ (64)
      • ์ •๋ณด (2)
      • ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ธ€ (2)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • GitHub
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์œ ๋น„์ฟผํ„ฐ์Šค ์ปดํ“จํŒ…๊ฐœ๋ก 
    ์ž๋ฃŒ๊ตฌ์กฐ
    ๋ฐฉ์†ก๋Œ€
    ๋ฐฐ์—ด
    ๋ฐฉํ†ต๋Œ€
    Java
    ํด๋ผ์šฐ๋“œ
    Python
    ํŒŒ์ด์ฌ
    ๋ฐฉ์†กํ†ต์‹ ๋Œ€ํ•™๊ต
    ์œ ๋น„์ฟผํ„ฐ์Šค ์ปดํ“จํŒ…
    spring
    ์ž…์ถœ๋ ฅ
    ์ปดํŒŒ์ผ๋Ÿฌ
    ์ž๋ฐ”
    ์Šคํ”„๋ง
    ์œ ๋น„์ฟผํ„ฐ์Šค
    ์ปดํ“จํ„ฐ์˜ ์ดํ•ด
    Spring Framework
    ์šด์˜์ฒด์ œ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.1
junbin2
[Spring Framework] HttpServletRequest - HTTP ๋ฉ”์‹œ์ง€ ๊ฐ’ ๋‹ด๊ธฐ๋Š” ๊ณผ์ • (์š”์ฒญ)
์ƒ๋‹จ์œผ๋กœ

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