๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒท Spring/Spring MVC_1

[Spring] ๊น€์˜ํ•œ ์Šคํ”„๋ง MVC_ ์„น์…˜3. ์„œ๋ธ”๋ฆฟ

by ._.sori 2025. 6. 26.

 

<์ถœ์ฒ˜ ์ธํ”„๋Ÿฐ>



์„น์…˜ 2์—์„œ ์„œ๋ธ”๋ฆฟ์— ๊ด€ํ•œ ๊ฐœ๋…์„ ๋ฐฐ์› ๊ณ  ์„น์…˜ 3์—์„œ๋Š” ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”์ง€๋ฅผ ์•Œ์•„๋ณด์•˜๋‹ค. ์„œ๋ธ”๋ฆฟ์— ๊ด€๋ จํ•œ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ถ€ํ„ฐ ๊ณผ๊ฑฐ์— ๊ฐœ๋ฐœ์ž๋“ค์ด HTTP ์š”์ฒญ์„ ์–ด๋–ป๊ฒŒ ๋ฐ›์•„์„œ ์–ด๋–ป๊ฒŒ ์‘๋‹ต์„ ๋‚ด๋ ธ๋Š”์ง€์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์„ ๋ฐฐ์› ๋‹ค. ํ˜„์žฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ์•„๋‹ˆ์ง€๋งŒ SpringMVC๋กœ ๋“ค์–ด๊ฐ€๊ธฐ์ „ ๊ณผ๊ฑฐ์— ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ–ˆ๋Š”์ง€๋ฅผ ๋ฐฐ์›€์œผ๋กœ์จ SpringMVC์— ๋Œ€ํ•œ ์ดํ•ด๋„๋ฅผ ๋†’์ด๋Š”๋ฐ ๋„์›€์ด ๋  ๊ฐ•์˜์˜€๋‹ค.

 

 

โ˜˜๏ธ 

์ž˜๋ชป๋œ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค 


 

โœ”๏ธ  ์„œ๋ธ”๋ฆฟ ๋“ฑ๋กํ•˜๊ธฐ

  • ์„œ๋ธ”๋ฆฟ์€ ํ†ฐ์บฃ ์„œ๋ฒ„๋ฅผ ๋‚ด์žฅํ•˜๊ณ  ์žˆ์–ด, ๋ณ„๋„์˜ ์„ค์น˜ ์—†์ด ์„œ๋ธ”๋ฆฟ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

โ–บ  ServletApplication.class

@ServletComponentScan

: ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์„œ๋ธ”๋ฆฟ์„ ์ง์ ‘ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•œ๋‹ค.

@ServletComponentScan
@SpringBootApplication
public class ServletApplication {
     public static void main(String[] args) {
         SpringApplication.run(ServletApplication.class, args);
     }
}



โ–บ  HelloServlet.class

@WebServlet

: ์„œ๋ธ”๋ฆฟ ํด๋ž˜์Šค๋ฅผ ์‹๋ณ„ํ•˜๊ณ , URL ๋งคํ•‘ ๋ฐ ๊ธฐํƒ€ ์„ค์ •์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
name์— ์ด๋ฆ„์„ ์ง€์ •ํ•จ์œผ๋กœ์„œ, ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ(Tomcat)๊ฐ€ ์„œ๋ธ”๋ฆฟ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ์ ์ง€ ์•Š์•„๋„ ์ž‘๋™ํ•˜๋Š”๋ฐ ๋ฌธ์ œ๋Š” ์—†๋‹ค. ๋‚ด๋ถ€์—์„œ ์ž๋™์œผ๋กœ ํด๋ž˜์Šค ์ด๋ฆ„์„ name์— ์ง€์ •ํ•œ๋‹ค. urlPatterns์€ ๋งคํ•‘ํ•  URL์„ ์ ๋Š”๋‹ค. ์ด ์ฝ”๋“œ์—๋Š” /hello๊ฐ€ ์ ํ˜€์ ธ์žˆ๋Š”๋ฐ, /hello ๊ฒฝ๋กœ๊ฐ€ ์˜ค๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

ํ˜„์žฌ๋Š” GernericServlet์˜ ์ž์‹ ํด๋ž˜์Šค์ธ HttpServlet์„ ์ƒ์†ํ•˜๋Š”๋ฐ, ์˜ˆ์ „์—๋Š” GernericServlet์„ ์ƒ์†ํ–ˆ๋‹ค. GernericServlet์€ service ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹จ์ˆœํžˆ ์‹คํ–‰๋˜๊ธฐ์— HTTP ํ†ต์‹ ๊ณผ ๊ด€๋ จ๋œ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋ณต์žกํ–ˆ๋‹ค HttpServlet์€ HTTP ์š”์ฒญ์— ๋”ฐ๋ผ service ๋ฉ”์†Œ๋“œ์˜ ์‹คํ–‰์ด 8๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„๋ฉฐ ์ด ๊ฐ•์˜์—์„œ๋Š” GET, POST ๋ฐฉ์‹์„ ๋ฐฐ์šธ ๊ฒƒ์ด๋‹ค.

 

 

service( )

: ์‘๋‹ต์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๊ตฌํ˜„ํ•˜๋ฉฐ, Servlet์ด ์ˆ˜์‹ ํ•œ ๋ชจ๋“  request์— ๋Œ€ํ•ด service ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. 

 

getParameter( )

: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „์†กํ•œ HTTP ์š”์ฒญ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

 

setContentType( )

: ์„œ๋ธ”๋ฆฟ์—์„œ ์ง์ ‘ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.

 

setCharacterEncoding( )

: ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ( ) ๋ฐฉ์‹์œผ๋กœ ์ธ์ฝ”๋”ฉํ•œ๋‹ค.

 

getWriter( ).writer( )

: HTTPServletResponse ๊ฐ์ฒด์—์„œ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ(Writer)๋ฅผ ์–ป์–ด์˜ค๋Š” ๋ฉ”์„œ๋“œ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ๋ฌธ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // super.service(request, response);

        System.out.println("HelloServlet.service");
        System.out.println("request = " + request);
        System.out.println("response = " + response);

        String username = request.getParameter("username"); 
        System.out.println("username = " + username);

        response.setContentType("text/plain");
        response.setCharacterEncoding("utf-8");
        response.getWriter().write("hello " + username);
    }
localhost:8080/hello๋กœ ๋“ค์–ด๊ฐ€๋ฉด ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ๋งŒ๋“ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„์— ๋งŒ๋“  ๋ฉ”์‹œ์ง€๋ฅผ ๋˜์ง„๋‹ค. 1)request์™€ reponse์— ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด๋“ค์ด ์ฐํ˜€์„œ ์ฝ˜์†”์ฐฝ์— ์ถœ๋ ฅ๋œ๋‹ค.

์ฟผ๋ฆฌํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ? ๋’ค์— ์˜ค๋Š” ๊ฒƒ์ด๋‹ค.(์˜ˆ์‹œ๋กœ http://localhost:8080/hello?username=sori) ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ด์ฃผ๋Š” ๊ฒƒ์„ getParameter๊ฐ€ ํ•˜๋Š” ์—ญํ• ์ด๋‹ค. getParameter๋Š” ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊บผ๋‚ด์˜ค๋Š”๋ฐ ๊บผ๋‚ด์˜จ ๊ฒƒ์„ username์— ๋„ฃ์–ด ์ถœ๋ ฅํ•œ๋‹ค.

2)๊ฐ„๋‹จํ•˜๊ฒŒ response.๋กœ ์‘๋‹ต๋ฉ”์‹œ์ง€๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž. setContentType("text/plain")์€ ์‘๋‹ต ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹จ์ˆœ ๋ฌธ์ž๋ผ๋Š” ๊ฒƒ์ด๊ณ , setCharacterEncoding("utf-8")์€ ๋ฌธ์ž ์ธ์ฝ”๋”ฉ์„ utf-8๋กœ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์—”์ฝ”๋”ฉ์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ํ•œ๊ตญ์–ด๋ฅผ ์ œ๋Œ€๋กœ ์ง€์›ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋‘ ์ •๋ณด๋Š” HTTP ์‘๋‹ต ํ—ค๋”์— ๋‹ด๊ฒจ์ ธ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „๋‹ฌ๋œ๋‹ค. getWriter().write("hello " + username);์˜ write๋Š” http ์‘๋‹ต ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

์ •๋ฆฌํ•ด๋ณด๋ฉด println์€ ๋‚ด ์ฝ˜์†”(์„œ๋ฒ„)์—์„œ๋งŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ๊ทธ๊ฐ€ ๋œ๋‹ค. response ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ž‘์„ฑํ•œ ํƒ€์ž…๊ณผ ์—”์ฝ”๋”ฉ ๊ทธ๋ฆฌ๊ณ  write๋กœ ์ž‘์„ฑํ•œ ๋ณธ๋ฌธ ์ •๋ณด๋Š” ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก๋˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ ํ™”๋ฉด์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

 

1) request์™€ response์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด ์ถœ๋ ฅ ๊ฒฐ๊ณผ

 

2) response.๋กœ ์‘๋‹ต๋ฉ”์‹œ์ง€ ๋งŒ๋“ค์–ด ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ณด๋‚ธ ๊ฒฐ๊ณผ

 

 

Q. protected void service๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋ฉด super.service(request, response) ์ฝ”๋“œ๊ฐ€ ๊ฐ™์ด ์˜ค๋Š”๋ฐ ์ด ์ฝ”๋“œ๋ฅผ ๋†”๋‘๋ฉด ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ?

A. super๋Š” ๋ถ€๋ชจํด๋ž˜์Šค์˜ service( ) ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ํ•˜๊ณ , ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ service( ) ๋ฉ”์„œ๋“œ์—๋Š” HTTP ์š”์ฒญ ๋ฐฉ์‹์— ๋”ฐ๋ผ doGet(), doPost() ๋“ฑ์ด ์žˆ๋‹ค. ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ํ•œ ๋ฒˆ ์‹คํ–‰๋˜๊ณ , ๊ทธ ๋‹ค์Œ ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ์‹คํ–‰๋œ๋‹ค. ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ ๋กœ์ง์ด ์‹คํ–‰๋ ํ…Œ๋‹ˆ ๊ฒฐ๊ตญ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ์™€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด๋ž€, ๋˜‘๊ฐ™์€ ์ฝ”๋“œ์™€ ๋˜‘๊ฐ™์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ƒˆ๋กœ ์ •์˜ํ•˜์—ฌ ์ž‘์„ฑํ•œ ๊ฒƒ์„ ๋งํ•œ๋‹ค.

 

 

 

 


 

 

 

โœ”๏ธ  HttpServletRequest

  • HttpServletRequest๋Š” ์„œ๋ธ”๋ฆฟ์ด ํŒŒ์‹ฑํ•œ HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ HttpServletRequest ๊ฐ์ฒด์— ๋‹ด์•„์„œ ์ œ๊ณตํ•œ๋‹ค.
  • ์ด๋ฒˆ์—๋Š” request ๊ฐ์ฒด์— ๋‹ด๊ฒจ์žˆ๋Š” ์ •๋ณด๋“ค์„ ๋ฌด์—‡์ด ์žˆ๋Š”์ง€ ์ถœ๋ ฅํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.

 

โ–บ  RequestHeaderServlet.class

  • start-line ์ •๋ณด
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        printStartLine(request);
        printHeaders(request);
        printHeaderUtils(request);
        printEtc(request);
    }
private static void printStartLine(HttpServletRequest request) {
        System.out.println("request.getMethod() = " + request.getMethod());
        System.out.println("request.getProtocol() = " + request.getProtocol());
        System.out.println("request.getScheme() = " + request.getScheme());
        System.out.println("request.getRequestURL() = " + request.getRequestURL());
        System.out.println("request.getRequestURI() = " + request.getRequestURI());
        System.out.println("request.getQueryString() = " + request.getQueryString());
        System.out.println("request.isSecure() = " + request.isSecure());
    }
์„œ๋ธ”๋ฆฟ์ด service(HttpServletRequest request, HttpServletResponse response) ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค. ์ด๋•Œ request์™€ response ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋„˜๊ฒจ์ฃผ๋Š”๋ฐ, request์—๋Š” HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ๊ณ , response์—๋Š” ์„œ๋ฒ„๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ค„ ์‘๋‹ต ๋‚ด์šฉ์„ ๋งŒ๋“œ๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

service ๋‚ด์— printStartLine(request)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, printStartLine์—์„œ ํ•„์š”๋กœํ•˜๋Š” HTTP ์š”์ฒญ์˜ ์ •๋ณด๋ฅผ ์ฝ๊ณ , request ๊ฐ์ฒด ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•œ ํ›„ ์ฝ˜์†”์— ์ถœ๋ ฅํ•œ๋‹ค.

printStartLine์ด ํ•„์š”๋กœํ•˜๋Š” ์ •๋ณด๋ฅผ ์‚ดํŽด๋ณด์ž. getMethod๋Š” GET์ธ์ง€ POST ๊ฐ™์€ HTTP ๋ฉ”์„œ๋“œ๋ช…์ด๊ณ  getProtocol์€ ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „, getScheme์€ http ๋˜๋Š” https, getRequestURL์€ ์ „์ฒด ์š”์ฒญ URL, getRequestURI๋Š” URI ๊ฒฝ๋กœ, getQueryString์€ ?๋’ค์— ์˜ค๋Š” ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ, isSecure์€ https ์š”์ฒญ์ธ์ง€ ์•„๋‹Œ์ง€ ๋Œ€ํ•œ ์‘๋‹ต์„ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณด๋ฉด ๋ธŒ๋ผ์šฐ์ €์— ์š”์ฒญ์ด ์˜ค๊ณ  ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ service( )๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๊ทธ๋Ÿผ service( )๋‚ด์— ์žˆ๋Š” printStartLine(request)๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ์ถœ๋ ฅํ•˜๋ผ๋Š” ๊ฒƒ๋“ค์˜ ์ •๋ณด๋ฅผ ๋ฐ›์•„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

  • ํ—ค๋” ์ •๋ณด ์ „์ฒด ๋ณด๊ธฐ

Enumeration

: ์—ด๊ฑฐํ˜•์œผ๋กœ ๊ด€๋ จ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผํ•œ๋‹ค.

 

hasMoreElements( )

: ๋‹ค์Œ ๋‚ด์šฉ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

 

nextElement( )

: ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

 

getHeaderNames( )

: ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

 

getHeader( )

: ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

private void printHeaders(HttpServletRequest request) {
        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            System.out.println(headerName + ": " + request.getHeader(headerName));
       }
}
Enumeration ์ธํ„ฐํŽ˜์ด์Šค์˜ hasMoreElements( )๋Š” ์ง‘ํ•ฉ์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋” ์žˆ๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. request๋กœ ๋ฐ›์•„์˜จ headerNames์— ๊ฐ์ฒด๊ฐ€ ํ•˜๋‚˜๋„ ์—†์„ ๋•Œ๊นŒ์ง€ while๋ฌธ์ด ๋ฐ˜๋ณตํ•œ๋‹ค. headerNames๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด nextElement๋กœ ๊ฐ’์„ ๊ฐ€์ ธ์™€ headerName์— ๋ฐ›๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  headerName์„ ์ถœ๋ ฅํ•˜๊ณ  ์‹ค์ œ ๊ฐ’์€ getHeader๋ฅผ ํ†ตํ•ด ์ถœ๋ ฅํ•œ๋‹ค.

request.getHeaderNames( )๋Š” HTTP ์š”์ฒญ์˜ ํ—ค๋” ์ด๋ฆ„๋“ค์„ Enumeration<String> ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ๋ชจ๋“  ํ—ค๋”์˜ ์ด๋ฆ„(key)๋งŒ ์ง‘ํ•ฉ์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. ์˜ˆ๋กœ host, user-agent ๋“ฑ์ด ์žˆ๋‹ค. getHeader๋Š” ํ•ด๋‹น ํ—ค๋”์˜ ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” ์‹ค์ œ ํ—ค๋” ๊ฐ’(value)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋งŒ์•ฝ headerName์— host๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค๋ฉด request.getHeader(headerName)์—๋Š” localhost:8080 ๊ฐ’์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

 

 

asIterator

: ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋ฉฐ, iterator ์ธํ„ฐํŽ˜์ด์Šคํ˜•์œผ๋กœ ๋ฐ”๊ฟ”์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

forEachRemaining

: Iterator์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด์„œ ์ง€์ •๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

private void printHeaders(HttpServletRequest request) {
        request.getHeaderNames().asIterator()
                        .forEachRemaining(headerName -> System.out.println(headerName + ": " + request.getHeader(headerName)));
}
getHeaderNames๋Š” Enumeration<String>์œผ๋กœ ๋ฐ˜ํ™˜ํƒ€์ž…์ด ์ง€์ •๋˜์–ด์žˆ๋‹ค. ๊ทธ๊ฑธ asIterator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Iterator๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค. ํƒ€์ž…์ด ๋ฐ”๋€ ํ—ค๋”์˜ ์ด๋ฆ„(key)๋“ค์„ forEachRemaining์„ ํ†ตํ•ด ๋ชจ๋“  ์š”์†Œ์— ๋ฐฉ๋ฌธํ•˜์—ฌ ์ง€์ •๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ง€์ •๋œ ์ž‘์—…์€ headerName์„ ๋„˜๊ฒจ headerName์— ํ—ค๋”์˜ ์ด๋ฆ„์„ ์ถœ๋ ฅ์‹œํ‚ค๊ณ , request.getHeader(headerName)์œผ๋กœ ํ—ค๋” ์ด๋ฆ„์˜ ๊ฐ’์„ ์ถœ๋ ฅ์‹œํ‚จ๋‹ค.

 

 

  • ํ—ค๋” ํŽธ๋ฆฌํ•œ ์กฐํšŒ

getCookies

: ๋ชจ๋“  ์ฟ ํ‚ค๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

 

getName

: ์ฟ ํ‚ค์˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜จ๋‹ค.

 

getValue

: ์ฟ ํ‚ค์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

    private void printHeaderUtils(HttpServletRequest request) {  
        System.out.println("[cookie ํŽธ์˜ ์กฐํšŒ]");
        
        if (request.getCookies() != null) {
            for (Cookie cookie : request.getCookies()) {
                System.out.println(cookie.getName() + ": " + cookie.getValue());
             }   
        }
    }
request.getCookies๋กœ ์ฟ ํ‚ค๋ฅผ ๋ฐ›๊ณ  ๊ทธ ๊ฐ’์ด null์ด ์•„๋‹ˆ๋ฉด for-each๋ฌธ์„ ์ง„ํ–‰ํ•œ๋‹ค. for-each๋ฌธ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฟ ํ‚ค๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋‚˜์”ฉ getName์„ ํ†ตํ•ด ์ฟ ํ‚ค์˜ ์ด๋ฆ„(key)๋ฅผ ์ถ”์ถœํ•˜๊ณ , getValue๋ฅผ ํ†ตํ•ด ์ฟ ํ‚ค์˜ ์‹ค์ œ ๊ฐ’์„ ์ถ”์ถœํ•œ๋‹ค.

 

 

getLocales

: ๋ชจ๋“  ์„ ํ˜ธ ์–ธ์–ด ๋ชฉ๋ก์„ ์šฐ์„ ์ˆœ์œ„ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

getLocale

: ๊ฐ€์žฅ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ ์–ธ์–ด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

private void printHeaderUtils(HttpServletRequest request) {
    System.out.println("[Accept-Language ํŽธ์˜ ์กฐํšŒ]");
    
    request.getLocales().asIterator()
            .forEachRemaining(locale -> System.out.println("locale = " + locale));
    System.out.println("request.getLocale() = " + request.getLocale());
}
์–ด๋–ค ์–ธ์–ด๋ฅผ ์„ ํ˜ธํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. request.getLocales๋Š” ๋ชจ๋“  ์„ ํ˜ธ ์–ธ์–ด ๋ชฉ๋ก์„ Enumeration์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  asIterator์„ ํ†ตํ•ด iterator๋กœ ๋ฐ”๊พผ๋‹ค. ๊ทธ ํ›„ request.getLocale๋กœ ๊ฐ€์žฅ ์šฐ์„ ์œผ๋กœ ์„ ํ˜ธํ•˜๋Š” ์–ธ์–ด๋“ค์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด ์ถœ๋ ฅํ•œ๋‹ค.

 

 

 


 

 

 

โœ”๏ธ  HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ - GET ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ

  • HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด๋ณด์ž.
  • GET - ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ, POST - HTML Form, HTTP message body ๋ฐฉ์‹ ์ค‘ GET ๋ฐฉ์‹์„ ์•Œ์•„๋ณด์ž.

 

  • ์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ
http://localhost:8080/request-param?username=hello&age=20
๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์—†์ด, ์ฃผ์†Œ์ฐฝ์„ ํ†ตํ•ด ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ?๋ฅผ ์‹œ์ž‘์œผ๋กœ ๋ณด๋‚ด๋ฉฐ, ์ถ”๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” &๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.

 

 

getParameterNames

: ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ์ค‘ ์ด๋ฆ„๋งŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

getParameter

: ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์˜ ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest requset, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("[์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ] - start"); 
        requset.getParameterNames().asIterator()
                        . forEachRemaining(paramName -> System.out.println(paramName + "=" + requset.getParameter(paramName)));      
        System.out.println("[์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ] - end");
        System.out.println();
     }
}
์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ request.getParameterNames๋กœ ๊ฐ€์ ธ์˜จ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„์„ Iterator ํƒ€์ž…์œผ๋กœ ๋ฐ”๊พผ ํ›„, ์ด๋ฆ„ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ์ถœ๋ ฅํ•œ ํ›„ request.getParameter๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

  • ๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ
String username = requset.getParameter("username");
System.out.println("username = " + username);
๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์›ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ์•Œ๊ธฐ ์œ„ํ•ด request.getParameter์— ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„์„ ๋„ฃ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ด๋ฆ„์˜ ๊ฐ’์„ username์œผ๋กœ ๋ฐ›์•„ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

 

 

  • ์ด๋ฆ„์ด ๊ฐ™์€ ๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ

getParameterValues

: ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์˜ ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด ์—ฌ๋Ÿฌ๊ฐœ์ผ๋•Œ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

http://localhost:8080/request-param?username=hello&age=20&username=kim
 String[] usernames = requset.getParameterValues("username");
        for (String name : usernames) {
            System.out.println("username: " + name);
        }
username์— ๋‹ค๋ฅธ ๊ฐ’ ๋‘ ๊ฐœ์ธ hello์™€ kim์„ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋„ฃ์—ˆ๋‹ค. getParameterVaues๋กœ username์— ํ•ด๋‹นํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ’์„ ๋ฐฐ์—ด๋กœ usernames๊ฐ€ ๋ฐ›๋Š”๋‹ค. usernames์˜ ๊ฐ’๋“ค์„ for๋ฌธ์œผ๋กœ name์— ๋„ฃ์–ด username์— ์–ด๋–ค ๊ฐ’๋“ค์ด ์žˆ๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ getParameter๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ฒซ๋ฒˆ์งธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋‹ˆ ๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฒฝ์šฐ getParameterValues๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฑธ ์•Œ์•„๋‘์ž.

 

 

์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ ๊ฒฐ๊ณผ

 

๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ ๊ฒฐ๊ณผ

 

 

 

 


 

 

 

โœ”๏ธ  HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ - POST HTML Form

  • GET - ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ, POST - HTML Form, HTTP message body ๋ฐฉ์‹ ์ค‘ POST ๋ฐฉ์‹์„ ์•Œ์•„๋ณด์ž.
  • ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— username=hello&age=20(key=value๋กœ) ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

 

 

 

<form action="/request-param" method="post">
    username: <input type="text" name="username" />
    age: <input type="text" name="age" />
    <button type="submit">์ „์†ก</button>
</form>
username๊ณผ age์— sori์™€ 20์ด๋ž€ ๊ฐ’์„ ์ ์–ด post ๋ฐฉ์‹์œผ๋กœ ๋ณด๋ƒˆ๋‹ค. post ๋ฐฉ์‹์œผ๋กœ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด form์˜ method์— post๋ผ๊ณ  ์ ์–ด๋’€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด form์„ post ๋ฐฉ์‹์œผ๋กœ ๋ณด๋‚ธ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. post ๋ฐฉ์‹์œผ๋กœ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๋Š” ์–ด๋””์— ๋„์ฐฉํ• ๊นŒ? ๋ฐ”๋กœ ์•ž action์— ๊ฒฝ๋กœ๋ฅผ ์ ์–ด๋’€๋‹ค. /request-param์œผ๋กœ ์ ์—ˆ์œผ๋‹ˆ ๋ฐ์ดํ„ฐ๋Š” ์ด ๊ฒฝ๋กœ๋ฅผ ๋ฐ›๋Š” ๊ณณ์— ๋„์ฐฉํ•˜๊ณ  ๊ฑฐ๊ธฐ์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹๋Œ€๋กœ ํ–‰ํ•ด์งˆ ๊ฒƒ์ด๋‹ค.

POST์˜ HTML Form์„ ์ „์†กํ•˜๋ฉด ์š”์ฒญ URL๊ณผ content-type: application/x-www-form-urlencoded, ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— username=hello&age=20์œผ๋กœ HTTP ๋ฉ”์‹œ์ง€๋ฅผ ๋งŒ๋“ ๋‹ค. ์—ฌ๊ธฐ์„œ application/x-www-form-urlencoded ํ˜•์‹์€ GET์—์„œ ์‚ดํŽด๋ณธ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹๊ณผ ๊ฐ™์•„์„œ ํ€ด๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„  ๋‘ ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์žˆ์ง€๋งŒ, ์„œ๋ฒ„์˜ ์ž…์žฅ์—์„œ ๋‘˜์˜ ํ˜•์‹์ด ๊ฐ™์œผ๋ฏ€๋กœ request.getParameter๋กœ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ๋ฌผ๋ก  content-type์€ GET ๋ฐฉ์‹์—๋Š” ์—†๋‹ค. ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. POST ๋ฐฉ์‹์€ ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ์–ด๋–ค ํƒ€์ž…์œผ๋กœ ๋ณด๋‚ผ ๊ฑด์ง€ ๋ช…์‹œํ•ด์•ผํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 

 


 

 

 

โœ”๏ธ  HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ - API ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” - JSON

  • ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋‹ด์•„์„œ ์š”์ฒญํ•˜๋Š” ๋ฐฉ์‹๋„ ์žˆ์ง€๋งŒ ์ฃผ๋กœ JSON ํ˜•์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • JSON ํ˜•์‹์„ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•œ๋‹ค.

 

  • ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ
@Getter
@Setter
public class HelloData {
    private String username;
    private int age;
}
lombok์ด ์ง€์›ํ•ด์ฃผ๋Š” Getter, Setter ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. Getter, Setter์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด, private ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ๊บผ๋‚ด๋Š” ๋ฉ”์„œ๋“œ๋ฅผ Getter๋ผ๊ณ  ํ•˜๊ณ  private ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” Setter๋ผ๊ณ  ํ•œ๋‹ค.

 

 

  • JSON ํ˜•์‹์œผ๋กœ ๋ณด๋‚ด์˜จ ๋ฐ์ดํ„ฐ ๋ณด๋‚ด๊ธฐ
content-type:application/json
messageBody={"username" : "hello", "age" : 20}
content-type์„ json์œผ๋กœ ์„ ํƒํ•œ ํ›„ body์— ๋‚ด์šฉ์„ ์‹ค์–ด์„œ ๋ณด๋‚ธ๋‹ค.

 

 

  • JSON ํ˜•์‹์œผ๋กœ ๋ณด๋‚ด์˜จ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ

ObjectMapper

์ง๋ ฌํ™”์™€ ์—ญ์ง๋ ฌํ™”๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

   private ObjectMapper objectMapper = new ObjectMapper();
ObjectMapper์€ ์ž๋ฐ”์—์„œ JSON์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋Œ€ํ‘œ์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Jackson์˜ ํด๋ž˜์Šค์ด๋‹ค. ObjectMapper์„ ์ด์šฉํ•˜์—ฌ JSON ๋ฌธ์ž์—ด์„ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™”ํ•˜๋Š” ์—ญ์ง๋ ฌํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ทธ ๋ฐ˜๋Œ€์ธ ์ง๋ ฌํ™” ๋“ฑ์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ JSON ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Spring์—์„œ๋Š” Jackson์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

getInputStream

: HTTP body์˜ ๋‚ด์šฉ์„ byte stream์œผ๋กœ ๋ฐ›๋Š”๋‹ค.

 

StreamUtils

: ์ŠคํŠธ๋ฆผ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ์ด๋‹ค.

 

copyToString

: inputStream์œผ๋กœ ๋“ค์–ด์˜จ ๋‚ด์šฉ์„  String์œผ๋กœ ๋ณต์‚ฌํ•œ๋‹ค.

 ServletInputStream inputStream = request.getInputStream();
 String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
HTTP body์˜ ๋‚ด์šฉ์„ byte stream์œผ๋กœ ๋ฐ›์•„ ์ด byte stream์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์ฆ‰, body์— ๋‹ด๊ธด JSON ๋‚ด์šฉ์„ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“  ๊ฒƒ์ด๋‹ค.

 

 

readValue

: Json ํŒŒ์ผ์„ java์˜ object๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
Json ๋ฌธ์ž์—ด์„ HelloData ๊ฐ์ฒด๋กœ ํŒŒ์‹ฑํ•ด์„œ ๋ณ€ํ™˜ํ•œ๋‹ค. HelloData ํด๋ž˜์Šค์—๋Š” @Getter, @Setter๊ฐ€ ์žˆ์—ˆ๋‹ค. Jackson์€ ์ด getter/setter ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ JSON์˜ username,age ๊ฐ’์„ ๊ฐ๊ฐ HelloData์˜ ํ•„๋“œ์— ๋„ฃ์–ด์ค€๋‹ค.

ํŒŒ์‹ฑ์— ๋Œ€ํ•ด ๊ฐ„๋žตํ•˜๊ฒŒ ์ ์–ด๋ณด์ž๋ฉด, ๋‹จ์ˆœํ•œ ํ…์ŠคํŠธ ๋ฌธ์ž์—ด์„ ์˜๋ฏธ ์žˆ๋Š” ๊ตฌ์กฐ์ธ ์ฆ‰, ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค.

 

 

 


 

 

 

โœ”๏ธ  HttpServletResponse - ๋‹จ์ˆœ ํ…์ŠคํŠธ

  • ๋ฐฉ๊ธˆ์€ ์š”์ฒญ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ๋ฐฐ์› ๋‹ค.
  • ์ด๋ฒˆ์—๋Š” ์‘๋‹ต์— ๋Œ€ํ•ด์„œ ๋ฐฐ์šธ ๊ฒƒ์ด๋‹ค.
  • ์‘๋‹ต ๋ฐ์ดํ„ฐ๋กœ ๋‹จ์ˆœ ํ…์ŠคํŠธ ์‘๋‹ต, HTML ์‘๋‹ต, HTTP API - MessageBody JSON ์‘๋‹ต์ด ์žˆ๊ณ  ๊ทธ ์ค‘ ๋‹จ์ˆœ ํ…์ŠคํŠธ ์‘๋‹ต์„ ์‚ดํŽด๋ณด์ž.

 

@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
/response-header URL๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ResponseHeaderServlet์ด ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ด๋‹ค. ์œ„์˜ ์ฝ”๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ํ• ๊ฑด์ง€, ์–ด๋–ค ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ๊ฑด์ง€์— ๋Œ€ํ•ด ๋ฐฐ์› ๋‹ค๋ฉด, ์ง€๊ธˆ์€ ์‘๋‹ต์„ ๋ธŒ๋ผ์šฐ์ €์— ์–ด๋–ป๊ฒŒ ๋ณด๋‚ผ๊ฑด์ง€์— ๋Œ€ํ•ด ์ค‘์ ์„ ๋‘˜ ๊ฒƒ์ด๋‹ค.

 

 

setStatus

: ์‘๋‹ต์ฝ”๋“œ๋ฅผ ์ง€์ •ํ•œ๋‹ค.

 

setHeader

: ํ—ค๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‘๋‹ตํ•œ๋‹ค.

response.setStatus(HttpServletResponse.SC_OK);

response.setHeader("Content-Type","text/plain;charset=utf-8");
response.setHeader("Cache-Control","no-cache, no-store, must-revalidate");
response.setHeader("Pragma","no-cache");
response.setHeader("my-header", "hello");

PrintWriter writer = response.getWriter();
writer.println("ok");

content(response);
cookie(response);
redirect(response);
setStatus์—์„œ HTTP ์‘๋‹ต์˜ ์ƒํƒœ์ฝ”๋“œ๋ฅผ SC_OK๋กœ ๋ช…์‹œํ–ˆ๋‹ค. SC_OK๋Š” 200์„ ์˜๋ฏธํ•˜๋ฉฐ ์„ฑ๊ณต์„ ๋œปํ•œ๋‹ค. 200์ด๋ผ๊ณ  ์ ์–ด๋„ ๋ฌด๊ด€ํ•˜์ง€๋งŒ ๋งค์ง๋„˜๋ฒ„๊ฐ€ ์•„๋‹Œ ์˜๋ฏธ์žˆ๋Š” ๊ฐ’์„ ๋„ฃ๋Š”๊ฒŒ ๋” ์•ˆ์ •์ ์ด๋‹ค.

setHeader๋Š” ํ—ค๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‘๋‹ตํ•˜๋„๋ก ํ•ด์ค€๋‹ค. Content-Type์€ ์ผ๋ฐ˜ ํ…์ŠคํŠธ์— utf-8์„ ์จ์„œ ์ธ์ฝ”๋”ฉ์„ ํ•œ๋‹ค๊ณ  ์ ์—ˆ๋‹ค. Cache-Control์€ ์บ์‹œ๋ฅผ ์™„์ „ํžˆ ๋ฌดํšจํ™”ํ•˜๋„๋ก ํ–ˆ๋‹ค. ์บ์‹œ๋ฅผ ์ ˆ๋Œ€ ์ €์žฅํ•˜์ง€๋„ ๋ง๊ณ , ์“ฐ์ง€๋„ ๋ชปํ•˜๊ฒŒ ์ง€์ •ํ•œ ๊ฒƒ์ด๋‹ค. Pragma์— no-cache๋ฅผ ์ ์–ด ๊ณผ๊ฑฐ ๋ฒ„์ „๊นŒ์ง€ ์บ์‹œ๋ฅผ ์—†์•ด๋‹ค. my-header๋Š” hello๋ผ๋Š” ์ž„์˜์˜ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๋‹ค.

writer.println("ok")๋Š” ์‘๋‹ต ๋ฐ”๋””์— ok ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ์ ์—ˆ๋‹ค.

๋งจ ์•„๋ž˜ ์„ธ์ค„์€ service ๋ฉ”์„œ๋“œ ์™ธ๋ถ€์— ์ ์€ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ ์–ด๋‘” ๊ฒƒ์ด๋‹ค.

 

  • content
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
setHeader์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋” ํŽธ๋ฆฌํ•œ ๋ฐฉ์‹์„ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค. ContentType์€ ์ผ๋ฐ˜์ ์ธ ํ…์ŠคํŠธ๊ณ  ์ธ์ฝ”๋”ฉ์€ utf-8์ด๋‹ค.

 

  • cookie
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600);
response.addCookie(cookie);
myCookie ์ด๋ฆ„์ธ cookie๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ๊ฐ’์€ good์ด๋‹ค. setMaxAge๋Š” ์œ ํšจ๊ธฐ๊ฐ„์„ ๋œปํ•œ๋‹ค. ์œ ํšจ๊ธฐ๊ฐ„์€ 600์ดˆ์ด๋‹ค. addCookie๋กœ ์‘๋‹ตํ—ค๋”์— ์ฟ ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

 

  • redirect
response.sendRedirect("/basic/hello-form.html");
์‘๋‹ต์„ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋กœ ์ „ํ™˜ํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ /basic/hello-form.html๋กœ ์ด๋™ํ•˜๋„๋ก ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด /response-header๋กœ ๊ฒฝ๋กœ๋ฅผ ๋“ค์–ด๊ฐ€๋„ /basic/hello-form.html๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ์‘๋‹ต๋ฒˆํ˜ธ 302์™€ ํ•จ๊ป˜ ์ด๋™ํ•œ๋‹ค. 302๊ฐ€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ๋œปํ•œ๋‹ค.

 

 

 


 

 

 

โœ”๏ธ  HttpServletResponse - HTML

  • ์ด๋ฒˆ์—๋Š” HTML ์‘๋‹ต์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค.

 

response.setContentType("text/html");

PrintWriter writer = response.getWriter();
writer.println("<html>");
writer.println("<body>");
writer.println("<div> ์•ˆ๋…•? </div>");
writer.println("</body>");
writer.println("</html>");
ContentType์„ text/html์ด๋ผ๊ณ  ์ง€์ •ํ–ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ์‘๋‹ต ๋ฐ”๋””๋ฅผ html ๋ฌธ์„œ๋กœ ์ธ์‹ํ•˜๊ณ  <html>, <body>, <div> ๋“ฑ์„ ํŒŒ์‹ฑํ•˜์—ฌ ์›นํŽ˜์ด์ง€ ํ˜•ํƒœ๋กœ ๊ทธ๋ ค์ค„ ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ํ‘œํ˜„ํ•˜๋Š” ๊ณผ์ •์„ ๋ Œ๋”๋ง์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ ์›น๋ธŒ๋ผ์šฐ์ €์— ์ œ๋Œ€๋กœ ๋ Œ๋”๋ง ๋˜์—ˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 


 

 

 

โœ”๏ธ  HttpServletResponse - API JSON

  • ์ด๋ฒˆ์—๋Š” API JSON ์‘๋‹ต์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค.

 

response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
ContentType์„ application/json์œผ๋กœ ์ง€์ •ํ•ด, HTTP ์‘๋‹ต์„ Json์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ–ˆ๋‹ค. 

 

HelloData helloData = new HelloData();
helloData.setUsername("kim");
helloData.setAge(20);
๋ธŒ๋ผ์šฐ์ €๋กœ ๋ณด๋‚ด๋ ค๋Š” ๋‚ด์šฉ์ด๊ณ , ์ด ๋‚ด์šฉ์„ json ํ˜•ํƒœ๋กœ ๋ฐ”๊ฟ€ ๊ฒƒ์ด๋‹ค. Json ์š”์ฒญ ํŒŒํŠธ์—์„œ HelloData ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ณ€์ˆ˜๋ฅผ ๊บผ๋‚ด๊ณ  ์ดˆ๊ธฐํ™”ํ•˜๋Š” Getter, Setter๋ฅผ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์—ˆ๋‹ค. kim๊ณผ 20์ด๋ผ๋Š” ๊ฐ’์„ Username๊ณผ Age ๋ณ€์ˆ˜์— ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ค€๋‹ค.

 

Q. HelloData๋Š” Getter, Setter ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ณ„์† JSON์„ ์‚ฌ์šฉํ•  ๋•Œ HelloData ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ–ˆ๋‹ค. Getter, Setter๋Š” private ๋ณ€์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋ฐฐ์› ๋Š”๋ฐ JSON๊ณผ ์–ด๋–ค ๊ด€๊ณ„์ด๊ธธ๋ž˜ HelloData์˜ Getter,Setter๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”๊ฑธ๊นŒ?

A. Json์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ ObjectMapper๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ObjectMapper ๊ฐ™์€ Json ๋ณ€ํ™˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ž๋ฐ” ๊ฐ์ฒด์˜ ํ•„๋“œ์— ์ ‘๊ทผํ•ด์„œ ๊ฐ’์„ ์ฝ๊ณ  ์“ฐ๋Š” ๊ณผ์ •์ด ์žˆ๋‹ค. ์ด๋•Œ ์ด ๊ณผ์ •์—์„œ getter, setter ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

 

 

 

writeValueAsString

: ๋ฐ์ดํ„ฐ๋ฅผ Json ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

String result = objectMapper.writeValueAsString(helloData);
response.getWriter().write(result);
setter๋กœ ๊ฐ์ฒด์˜ ๊ฐ’์„ kim๊ณผ 20์œผ๋กœ ์ดˆ๊ธฐํ™”ํ–ˆ๋‹ค. writeValueAsString์œผ๋กœ helloData์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์„ getter ๋ฐ›์•„์˜ฌ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋ธŒ๋ผ์šฐ์ €์— Json ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ธ๋‹ค.

 

 


 

 

์•„๋ž˜์— ์ถœ์ฒ˜๋ฅผ ๋‚จ๊ฒจ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.
๋ธ”๋กœ๊ทธ์—” ์ œ๊ฐ€ ์ตœ๋Œ€ํ•œ ์ดํ•ดํ•œ ๋‚ด์šฉ๊นŒ์ง€๋งŒ ์ ๋Š”๊ฑฐ๋ผ
์ถœ์ฒ˜์— ๋“ค์–ด๊ฐ€์‹œ๋ฉด ๋” ๋งŽ์€ ๋‚ด์šฉ์ด ์žˆ์–ด ๊ณต๋ถ€ํ•˜์‹œ๋Š”๋ฐ ๋„์›€๋˜์‹ค๊ฒ๋‹ˆ๋‹ค.

 

๐Ÿชฝ

ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”

 


 

- Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

[Java] Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ Object๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

Java Object -> JSON ๋ฌธ์ž์—ด Java Object -> JSON ํŒŒ์ผ Map -> JSON ๋ฌธ์ž์—ด List -> JSON ๋ฌธ์ž์—ด ๋ฐฐ์—ด -> JSON ๋ฌธ์ž์—ด Java Object๋ฅผ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ Jackson ObjectMapper ์˜ ๋‹ค์Œ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

hianna.tistory.com

 

- Spring

 

Overview (Spring Framework 6.2.8 API)

Support for registering the need for reflection, resources, java serialization and proxies at runtime. Annotation support for the Application Context, including JSR-250 "common" annotations, component-scanning, and Java-based metadata for creating Spring-m

docs.spring.io

 

 

- ObjectMapper

 

[Spring] ObjectMapper์˜ ๋™์ž‘ ๋ฐฉ์‹๊ณผ SpringBoot๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ถ”๊ฐ€ ๊ธฐ๋Šฅ๋“ค

์ด๋ฒˆ์—๋Š” Spring์—์„œ ์‚ฌ์šฉ๋˜๋Š” ObjectMapper์˜ ๋™์ž‘ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.   1. ObjectMapper๋ฅผ ์ด์šฉํ•œ ์ง๋ ฌํ™”(Serialize)[ ObjectMapper์˜ ์ง๋ ฌํ™”(Serialize) ๋™์ž‘ ๋ฐฉ์‹ ]ObjectMapper๋Š” ๋ฆฌํ”Œ๋ ‰์…˜์„

mangkyu.tistory.com

 

 

 

- ์„œ๋ธ”๋ฆฟ ๋ผ์ดํ”„ ์‚ฌ์ดํด

 

[JSP/Servlet] ์„œ๋ธ”๋ฆฟ ๋ผ์ดํ”„ ์‚ฌ์ดํด - init(), service(), doGet(), destroy()

โ–  ๋“ค์–ด๊ฐ€๊ธฐ - ๋‡Œ๋ฅผ ์ž๊ทนํ•˜๋Š” JSP&Servlet (๊น€์œค๋ช…/ํ•œ๋น›๋ฏธ๋””์–ด). ์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•˜๋Š” ๋ธ”๋กœ๊ทธ โ–  ๋ชฉ์ฐจ 1. ์„œ๋ธ”๋ฆฟ ๋ผ์ดํ”„ ์‚ฌ์ดํด 2. ์„œ๋ธ”๋ฆฟ ๋ผ์ดํ”„ ์‚ฌ์ดํด ์˜ˆ์ œ 3. ์„œ๋ธ”๋ฆฟ ํด๋ž˜์Šค์˜ init ๋ฉ”์„œ๋“œ์™€ destroy

skyfox83.tistory.com

 

 

- Iterator์™€ Enumeration

 

[์ž๋ฐ”/java]Iterator ์™€ Enumeration ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ํŽธ.

Iterator์™€ Enumeration ์ปฌ๋ ‰์…˜(collection) ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํ™˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํด๋ž˜์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” size()๋ฅผ ์‚ฌ์šฉํ•ด์„œ for๋ฌธ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ์ˆœํ™˜

tiboy.tistory.com

 

 

- HttpServletRequest ๊ฐ์ฒด

 

3.4 HttpServletRequest ๊ฐ์ฒด - 3.4.2 HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€์˜ ํ—ค๋” ์ถœ๋ ฅ

3.4.2 HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€์˜ ํ—ค๋” ์ถœ๋ ฅ HTTP ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•ด์„œ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ ๋ฉ”์‹œ์ง€๊ฐ€ ...

blog.naver.com

 

 

- foreachremaining

 

asiterator().foreachremaining() ์ด๋ž€?

`Iterator` ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `forEachRemaining()` ๋ฉ”์„œ

lcoding.tistory.com

 

 

- Wirter

 

[Servlet&JSP] PrintWriter out = response.getWriter(); ์˜ ๋™์ž‘ ์›๋ฆฌ

ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ Servlet์œผ๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์š”์ฒญ(Request)์„ ํŒŒ์•…ํ•œ ํ›„ ์‘๋‹ต(Response)์„ ์ „๋‹ฌํ•œ๋‹ค. Servlet์œผ๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ํ…์ŠคํŠธ(HTML) ํ˜•ํƒœ๋กœ ์‘๋‹ต์„ ๋ณด๋‚ด๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์‘๋‹ต์œผ๋กœ ๋‚ด๋ณด๋‚ผ ์ถœ

charliecharlie.tistory.com