Spring MVC 기초

최혜미·2023년 5월 30일

Backend

목록 보기
3/8

<hello2 프로젝트>

https://github.com/ghrltjdtprbs/Backend

[pom.xml파일 수정]

<dependency>
	<groupId>jstl</groupId>
	<artifactId>jstl</artifactId>
	<version>1.2</version>
</dependency>
<dependency>
	<groupId>org.apache.tomcat.embed</groupId>
	<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
  • pom.xml 파일은 maven의 설정파일

  • 위 항목들은 다음과 같은 라이브러리를 프로젝트에 포함시키기 위함임

    (위 설정에 의해 maven이 이 라이브러리를 자동으로 다운로드해 프로젝트에 설치해준다.)

  • jstl : jstl확장태그를 사용하기 위해 필요한 라이브러리이다.

[tomcat-embed-jasper]

JSP파일을 servlet으로 변환하는 컴파일러

스프링 부트 앱에 내장된 톰캣 서버에는 tomcat-embed-jasper이 내장되어있지 않다.

만약 이것이 없으면 JSP파일이 실행되지 않고 웹브라우저에서 다운로드된다. 톰캣은 servlet만 실행하고 다른 파일들은 웹브라우저로 그대로 전송하기 때문이다.

  • 스프링부트에는 톰캣서버(servlet container)가 내장되어있다

  • sevlet container : servlet을 실행하는 서버

(만약 JSP파일을 톰캣서버에서 실행하고 싶다면 tomcat-embed-jasper을 통해 JSP파일을 servlet으로 변환해야함)

[FirstController]

컨트롤러(.java) : 실행할 뷰 이름 리턴

뷰(.jsp) : html태그 출력(우리가 보는 화면)

+DTO클래스 : 제품(product)의 이름, 가격 데이터를 넣어서 전달하기 위한 클래스(파라미터로 전달, 리턴값으로 전달)

[FirstController.java]


package net.skhu.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import net.skhu.dto.Product; //DTO클래스를 사용하기 위해
@RestController // RestController은 데이터 전달 역할, 아닌경우 JSON형태로 전환
@RequestMapping("first")
public class FirstController {

    @RequestMapping("test1") // url -> first/test1
    public String test1() {
        return "안녕하세요"; // 리턴값이 문자열이므로 웹브라우저에 그대로 전송
    }
...

    @RequestMapping("test4")
    public Product[] test4() {
        return new Product[] {  // Product(DTO) 클래스 호출, 리턴값이 배열이므로 JSON형태로 전환해 전송. 자바 객체일 경우에도 동일
            new Product("맥주", 2000),
            new Product("우유", 1500)
        };
    }
}
  • 컨트롤러 클래스 : 웹브라우저의 URL요청을 받아 웹서버에서 실행되는 클래스(요청한 URL에 해당하는 컨트롤러의 액션메소드가 자동호출 )

  • 액션메소드 : URL에 해당하는 액션메소드 자동호출

[@RestController]

  • 리턴값이 "데이터"이다.

  • restcontroller가 리턴하는 것이 string문자열일 경우 웹브라우저에 그대로 전송

  • restcontroller가 리턴하는 것이 배열이나 자바객체일 경우 JSON형태로 변환되어 웹브라우저에 전송된다([]가 있거나 문자열에 "" 붙을경우)

[@Controller]

  • 리턴값이 "뷰(view)이름"

  • 뷰이름을 리턴한 후 해당 뷰를 실행한다. 뷰의 실행결과 출력이 웹브라우저에 전송된다.

  1. 웹 브라우저가 서버에 요청(HTTTP Request)전달.

    +요청 대상을 가리키는 URL이 들어있음

    ex) http://localhost:8088/first/test3

  2. 요청을 Spring Web MVC엔진이 받음

    +요청된 컨트롤러 액션메소드를 찾아 호출

    ex)test3액션 메소드를 찾아 호출

  3. FirstController의 test3 액션 메소드는 Java객체 리턴

    ex)Product객체 리턴

  4. 리턴된 Java객체는 Spring Web MVC엔진에 의해서 JSON형태의 문자열로 변환

  5. JSON형태의 문자열이 웹브라우저에 전송

    +HTTP Request에 대한 HTTP Response

  6. 웹 서버로부터 전송된 JSON형태의 문자열이 웹브라우저에 표시

  • 웹브라우저 : 웹서버와 쌍방향 통신하는 HTML문서나 파일에 연동하고 출력할 응용 소프트웨어(크롬,사파리 등)

  • 웹서버 : 웹브라우저로부터 HTTP요청 받음. 필요한 정보를 반환해줌

  • 소프트웨어에서의 서버 : 웹브라우저에게 HTTP요청을 받고 HTMP문서 등의 정보를 반환하는 컴퓨터 프로그램

  • 하드웨어에서이 서버 : 위에 언급한 기능을 제공하는 컴퓨터 프로그램

[웹 사이트 VS 웹 페이지]

웹페이지 : 텍스트 ,이미지 등으로 형성된 온라인 페이지. 해당페이지로 연결되는 특정 URL제공

ex)https://github.com/ghrltjdtprbs

웹사이트 : 웹페이지들이 모여 하나의 웹사이트 형성

​ex) https://github.com

[view]

웹브라우저의 요청(HTTP Request)에 대한 응답(HTTP Response)

대부분 html로 이루어짐(위치 설정은 application.properties에서 가능)


[SecondController]

[뷰파일]

http://localhost:8088/second/test2

${product.name}

-> test2.jsp파일에 전달된 데이터(모델 에트리뷰트) 중에 이름이 product객체인 getName() 메소드 호출하고 리턴값으 출력한다.​

${product.unitCost}

->product 객체의 getUnitCost()호출하고 리턴값을 출력한다.

[SecondController.java]


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import net.skhu.dto.Product; // dto클래스에서 데이터 받음

@Controller // 뷰이름 리턴
@RequestMapping("second")
public class SecondController {

    @RequestMapping("test1")
    public String test1(Model model) {
        model.addAttribute("message", "안녕하세요");
        return "second/test1";
    }
    @RequestMapping("test2")
    public String test2(Model model) {
        Product product = new Product("맥주", 2000); //Product에 전달(생성자)
        model.addAttribute("product", product); //model attribute값을 product 객체로 받음
        return "second/test2";
    }
}

[SecondController 실행절차]

  1. 웹브라우저가 웹 서버에 HTTP Request전달

  2. 요청을 Spring Web MVC가 받고 URL에 일치하는 컨트롤러 액션메소드를 찾아 호출한다.

  3. 컨트롤러 액션메소드는 데이터를 모델 객테에 넣는다

  4. 컨트롤러 액션메소드가 뷰 이름을 리턴한다

  5. 뷰실행 -> 뷰는 Model 객체에서 데이터 꺼내서 출력, html태그들 출력

  6. 뷰가 출력한 html 태그들이 웹브라우저에 전송된다. (HTTP Response)

  7. 전송받은 html태그들이 웹브라우저에 출력된다.

[HomeController.java]

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HomeController {

    @RequestMapping("/")
    public String index() {
        return "home/index";
    }
}

[context path]

  • (Run/Run As/Spring Boot App) 절차로 실행 : context path가 ":/"
  • (Run/Run on Server) 절차로 실행 : "/프로젝트이름" 가 context path

    ->따로 설치한 tomcat 서버가 없어서 이 방법은 사용안할 예정 _

0개의 댓글