본문 바로가기
spring boot

스프링 웹 개발 기초

by hyodev 2024. 5. 23.

정적 컨텐츠

hello-static.html

<!DOCTYPE html>

<html lang="ko">

<head>
<meta charset="UTF-8">
<title>정적 컨텐츠</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>

<body>정적 컨텐츠입니다.</body>

</html>

  • http://localhost:8080/hello-static.html 를 검색하면 그대로 나온다.
  • 웹 브라우저에서 http://localhost:8080/hello-static.html를 검색하면 내장 톰켓 서버에서 요청을 받고 스프링으로 넘긴다. 스프링의 컨트롤러에서 hello-static을 찾아보고 (컨트롤러 우선순위) 없으면 resources 폴더 내부에 있는 static/hello-static.html을 찾아 웹 브라우저에 반환한다.

아파치 톰켓(Apache Tomcat)

  • 웹 애플리케이션 서버이다. 웹 서버와 연동하여 실행할 수 있는 자바 환경을 제공하며 JSP, 자바서블릿(자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램)이 실행할 수 있는 환경을 제공한다.

MVC와 템플릿 엔진

MVC: model, view, controller를 이용한 설계 방식

model) 소프트웨어 내에서 테이터

view) 사용자에게 보이는 화면

controller) model과 view의 상호작용을 관리

  • mvc의 경우 뷰와 모델이 정확히 분리되지만, 컨트롤러가 뷰의 구성에 관여하여 독립성이 다소 떨어진다.
  • 이를 해결하기 위해 컨트롤러의 뷰 기능은 모두 뷰가 맡고 presenter가 모델과 뷰 사이의 인터페이스 역할을 하도록 한다(MVP)
package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

    @GetMapping("hello")
    public String hello(Model model){
        model.addAttribute("data","hello!!");
        return "hello";
    }

    @GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model) {
        model.addAttribute("name", name);
        return "hello-template";
    }

    @GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name) {
        return "hello" + name;
    }

    @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name){
        Hello hello = new Hello();
        hello.setName(name);
        return hello;
    }

    static class Hello {
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

템플릿 엔진을 사용하면 뷰를 편하게 구성할 수 있다. 컨트롤러에서 반환값으로 문자를 반환하면 뷰 리졸버(viewResolver)가 화면을 찾아서 처리한다. 이 때, 템플릿 엔진이 동작하여 동적으로 HTML을 생성하게 된다.

  • ‘model’ 객체 사용
model.addAttribute("data", "hello!!");
model.addAttribute("name", name);

model 객체는 컨트롤러에서 뷰로 데이터를 전달하는 역할

  • ‘@ResponseBody’없이 문자열 반환
public String hello(Model model)
public String helloMvc(@RequestParam("name") String name, Model model)

메서드가 ‘@ResponseBody’없이 문자열 반환 경우, 해당 문자열은 뷰의 이름으로 간주된다. 이는 반환된 문자열이 템플릿 엔진을 통해 렌더링될 뷰의 이름임을 의미한다.

hello-template.html

 

<body><p th:text="'hello ' + ${name}">abcdefg!</p></body>

</html>

서버를 타면 abcdefg! 부분이 <hello + ${name}>으로 바뀐다.

@GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model) {
        model.addAttribute("name", name);
        return "hello-template";
    }

name 값을 정해야 함

MVC 과정

  1. 웹 브라우저에서 localhost8080/hello-mvc를 넘기면 톰켓 서버를 거친다.
  2. 톰켓 서버에서 hello-mvc를 확인 후 스프링에 보내고 helloController에 hello-mvc 메서드가 매핑됨을 보고 hello-mvc 메서드를 호출한다.
  3. return 할 때 model의 key는 name, value는 spring!이라 지정한다.
  4. hello-template에 반영이 되고 viewResolver가 view를 찾고 템플릿 엔진을 연결시킨다.
  5. viewResolver가 templates 폴더에서 hello-template return의 이름과 똑같은 html을 찾아 thymeleaf 템플릿 엔진이 처리한다.

API

@GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name){
        Hello hello = new Hello();
        hello.setName(name);
        return hello;
    }

    static class Hello {
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
  • @ResoponseBody를 사용하면 viewResolver를 사용하지 않는다. (json 방식)
  • get set을 사용할 때는 public 을 사용한다. (JAVA Bean 표준방식)

API 과정

  1. localhost8080/hello-api 를 넘기면 톰켓 서버를 거친다.
  2. 톰켓 서버가 스프링으로 보낸다.
  3. @ResponseBody가 있을 경우 데이터를 그대로 넘기려고 한다.
  4. 하지만 위 코드와 같은 hello는 객체 데이터이므로 JSON방식으로 http 응답에 반환하려고 한다.
  5. HttpMessageConverter가 동작하고 반환값이 객체이므로 JsonConverter가 동작하여 Json으로 바꾼다.

'spring boot' 카테고리의 다른 글

springboot_JPA_프로젝트 환경설정  (0) 2024.09.17
객체 지향 원리  (0) 2024.07.28
프로젝트 생성  (0) 2024.07.23
스프링 개념  (1) 2024.07.20
회원관리  (0) 2024.07.04