Spring MVC-1 TIL (2)

YulHee Kimยท2021๋…„ 9์›” 5์ผ
0

Spring MVC

๋ชฉ๋ก ๋ณด๊ธฐ
2/11
post-thumbnail

[์ฐธ๊ณ  ๊ฐ•์˜] ๊น€์˜ํ•œ๋‹˜์˜ ์Šคํ”„๋ง MVC 1ํŽธ - ๋ฐฑ์—”๋“œ ์›น ๊ฐœ๋ฐœ ํ•ต์‹ฌ ๊ธฐ์ˆ 

๐Ÿ’ก ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ดํ•ด

์ •์  ๋ฆฌ์†Œ์Šค

  • ๊ณ ์ •๋œ HTML ํŒŒ์ผ, CSS, JS, ์ด๋ฏธ์ง€, ์˜์ƒ ๋“ฑ์„ ์ œ๊ณต
  • ์ฃผ๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €

โœ๏ธ HTML ํŽ˜์ด์ง€

  • ๋™์ ์œผ๋กœ ํ•„์š”ํ•œ HTML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์„œ ์ „๋‹ฌ
  • ์›น ๋ธŒ๋ผ์šฐ์ €: HTML ํ•ด์„

โœ๏ธ HTTP API

  • HTML์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ
  • ์ฃผ๋กœ JSON ํ˜•์‹ ์‚ฌ์šฉ
  • ๋‹ค์–‘ํ•œ ์‹œ์Šคํ…œ์—์„œ ํ˜ธ์ถœ
  • ๋ฐ์ดํ„ฐ๋งŒ ์ฃผ๊ณ  ๋ฐ›์Œ, UIํ™”๋ฉด์ด ํ•„์š”ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณ„๋„ ์ฒ˜๋ฆฌ
  • ์•ฑ, ์›น ํด๋ผ์ด์–ธํŠธ, ์„œ๋ฒ„ to ์„œ๋ฒ„

๋‹ค์–‘ํ•œ ์‹œ์Šคํ…œ ์—ฐ๋™

  • ์ฃผ๋กœ JSON ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ ํ†ต์‹ 
  • UI ํด๋ผ์ด์–ธํŠธ ์ ‘์ 
    (์•ฑ ํด๋ผ์ด์–ธํŠธ, ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ HTTP APIํ˜ธ์ถœ, React, Vue.js ๊ฐ™์€ ์›น ํด๋ผ์ด์–ธํŠธ)
  • ์„œ๋ฒ„ to ์„œ๋ฒ„
    (๊ธฐ์—…๊ฐ„ ๋ฐ์ดํ„ฐ ํ†ต์‹ )

โœ๏ธ SSR, CSR

SSR - ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง

  • HTML ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ์„œ๋ฒ„์—์„œ ๋งŒ๋“ค์–ด์„œ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ „๋‹ฌ
  • ์ฃผ๋กœ ์ •์ ์ธ ํ™”๋ฉด์— ์‚ฌ์šฉ
  • ๊ด€๋ จ๊ธฐ์ˆ : JSP, ํƒ€์ž„๋ฆฌํ”„ -> ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž

CSR - ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง

  • HTML ๊ฒฐ๊ณผ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•ด์„œ ์ ์šฉ
  • ์ฃผ๋กœ ๋™์ ์ธ ํ™”๋ฉด์— ์‚ฌ์šฉ, ์›น ํ™˜๊ฒฝ์„ ๋งˆ์น˜ ์•ฑ ์ฒ˜๋Ÿผ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋ถ€๋ถ„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ
  • ์˜ˆ) ๊ตฌ๊ธ€ ์ง€๋„, Gmail, ๊ตฌ๊ธ€ ์บ˜๋ฆฐ๋”
  • ๊ด€๋ จ๊ธฐ์ˆ : React, Vue.js -> ์›น ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

React,Vue.js๋ฅผ CSR+SSR ๋™์‹œ์— ์ง€์›ํ•˜๋Š” ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋„ ์žˆ์Œ
SSR์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ™”๋ฉด ์ผ๋ถ€๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

โœ๏ธ ์ž๋ฐ” ๋ทฐ ํ…œํ”Œ๋ฆฟ ์—ญ์‚ฌ

HTML์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ƒ์„ฑํ•˜๋Š” ๋ทฐ ๊ธฐ๋Šฅ

  • JSP(์†๋„ ๋Š๋ฆผ, ๊ธฐ๋Šฅ ๋ถ€์กฑ)
  • ํ”„๋ฆฌ๋งˆ์ปค, ๋ฒจ๋กœ์‹œํ‹ฐ (์†๋„ ๋ฌธ์ œ ํ•ด๊ฒฐ, ๋‹ค์–‘ํ•˜ ใ„ด๊ธฐ๋Šฅ)
  • ํƒ€์ž„๋ฆฌํ”„
    • ๋‚ด์ถ”๋Ÿด ํ…œํ”Œ๋ฆฟ: HTML์˜ ๋ชจ์–‘์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ทฐ ํ…œํ”Œ๋ฆฟ ์ ์šฉ ๊ฐ€๋Šฅ
    • ์Šคํ”„๋ง MVC์™€ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ํ†ตํ•ฉ
    • ์ตœ์„ ์˜ ์„ ํƒ, ์„ฑ๋Šฅ์€ ํ”„๋ฆฌ๋งˆ์ปค, ๋ฒจ๋กœ์‹œํ‹ฐ๊ฐ€ ๋” ๋น ๋ฆ„

๐Ÿ’ก ์„œ๋ธ”๋ฆฟ

์„œ๋ธ”๋ฆฟ ํ™˜๊ฒฝ ๊ตฌ์„ฑ

@ServletComponentScan ์ถ”๊ฐ€

@ServletComponentScan //์„œ๋ธ”๋ฆฟ ์ž๋™ ๋“ฑ๋ก 
@SpringBootApplication
public class ServletApplication {

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

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

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {

      @Override
      protected void service(HttpServletRequest request, HttpServletResponse
  response)
              throws ServletException, IOException {
              
          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);
     } 
}
 
  • @WebServlet ์„œ๋ธ”๋ฆฟ ์• ๋…ธํ…Œ์ด์…˜
    • name: ์„œ๋ธ”๋ฆฟ ์ด๋ฆ„
    • urlPatterns: URL ๋งคํ•‘

HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€ ๋กœ๊ทธ๋กœ ํ™•์ธํ•˜๊ธฐ

application.properties
logging.level.org.apache.coyote.http11=debug

โœ๏ธ HttpServletRequest

HttpServletRequest ์—ญํ• 

์„œ๋ธ”๋ฆฟ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœ์ž ๋Œ€์‹ ์— HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ํŒŒ์‹ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ HttpServletRequest ๊ฐ์ฒด์— ๋‹ด์•„์„œ ์ œ๊ณตํ•œ๋‹ค.

HttpServletRequest๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

POST /save HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
  
username=kim&age=20

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

HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•

  • GET : ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ
    • /url?username=hello&age=20
    • ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์—†์ด, URL์˜ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์„œ ์ „๋‹ฌ
    • ์˜ˆ) ๊ฒ€์ƒ‰, ํ•„ํ„ฐ, ํŽ˜์ด์ง•๋“ฑ์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹
  • POST : HTML Form
    • content-type : application/x-www-form-urlencoded
    • ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹์œผ๋กœ ์ „๋‹ฌ
      username=hello&age=20
    • ์˜ˆ) ํšŒ์› ๊ฐ€์ž…, ์ƒํ’ˆ ์ฃผ๋ฌธ, HTML Form ์‚ฌ์šฉ
  • HTTP message body์— ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋‹ด์•„์„œ ์š”์ฒญ
    • HTTP API์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ, JSON, XML, TEXT
  • ๋ฐ์ดํ„ฐ ํ˜•์‹์€ ์ฃผ๋กœ JSON ์‚ฌ์šฉ
    • POST, PUT, PATCH

โœ๏ธ GET ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ

๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์—†์ด, URL์˜ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด๋ณด๊ฒ ๋‹ค
์˜ˆ) ๊ฒ€์ƒ‰, ํ•„ํ„ฐ, ํŽ˜์ด์ง•๋“ฑ์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹

URL์— ?๋ฅผ ์‹œ์ž‘์œผ๋กœ ์ฟผ๋ฆฌํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ถ”๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” &๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.

์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ ๋ฉ”์„œ๋“œ

String username = request.getParameter("username"); 
//๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ 
Enumeration<String> parameterNames = request.getParameterNames(); 
//ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๋“ค ๋ชจ๋‘ ์กฐํšŒ
Map<String, String[]> parameterMap = request.getParameterMap(); 
//ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ Map ์œผ๋กœ ์กฐํšŒ
String[] usernames = request.getParameterValues("username"); 
//๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ

๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ ๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ

username=hello&username=kim ๊ณผ ๊ฐ™์ด ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์€ ํ•˜๋‚˜์ธ๋ฐ ๊ฐ’์ด ์ค‘๋ณต์ผ ๊ฒฝ์šฐ์—” request.getParameterValues()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
request.getParameter()๋Š” ํ•˜๋‚˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์— ๋Œ€ํ•ด์„œ ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

โœ๏ธ POST HTML Form

ํŠน์ง•

  • content-type : application/x-www-form-urlencoded
  • ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
    username-hello&age=20

์„œ๋ฒ„ ์ž…์žฅ์—์„œ๋Š” GET ์ฟผ๋ฆฌํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹๊ณผ POST Form ํ˜•์‹์ด ๋™์ผํ•˜๋ฏ€๋กœ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด๋œ๋‹ค.

์ฐธ๊ณ )
GET URL ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ๋Š” HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— content-type์ด ์—†๋‹ค.
POST HTML Form ํ˜•์‹์€ HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์„œ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ํ˜•์‹์ธ์ง€ content-type์„ ๊ผญ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํผ์œผ๋กœ ์ „์†กํ•˜๋Š” ํ˜•์‹์„ pplication/x-www-form-urlencoded ๋ผ ํ•œ๋‹ค.

๊ฐ•์˜์— ๋” ์†๋„๋ฅผ ๋‚ด์•ผ๊ฒ ๋‹น...!!!

profile
๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€