3 분 소요


1. 스프링 웹 개발 방법

웹을 개발하는 3가지 방법이 존재한다.

개발 방법 설명
정적 컨텐츠 HTML, CSS, JavaScript 파일과 같은 고정된 컨텐츠를 제공하는 방식이다. 서버에서 파일을 클라이언트에게 그대로 전달하며, 데이터나 페이지 내용이 변경되지 않는 경우에 주로 사용한다.
간단히 파일을 그대로 내려주는 방식
MVC와 템플릿 엔진 서버에서 프로그래밍을 통해 HTML을 동적으로 바꿔서 내려주는 것을 말한다. 그렇게 하기위해 MVC(Model-View-Controller) 방식의 패턴으로 개발하는 경우가 많다.

- Model: 데이터와 비즈니스 로직을 처리
- View: 사용자에게 데이터를 표시하는 역할
- Controller: 사용자 입력을 처리하고 모델과 뷰를 업데이트

즉, 템플릿 엔진은 미리 정의된 템플릿 파일과 데이터 소스를 결합하여 HTML, XML, 또는 다른 문서 형식을 생성한다.
API XML이나 JSON과 같은 데이터 구조 포맷으로 클라이언트에 데이터를 전달하는 방식을 말한다. (서버끼리 통신할 때 등)


1. 정적 컨텐츠

스프링 부트 정적 컨텐츠 기능은 [여기↗] 에서 자세히 확인할 수 있다.


resources/static/hello-static.html을 만들어보자.

그 후, 아래 코드를 실행하고 http://localhost:8080/hello-static.html로 접속하기!

<!DOCTYPE html>
<html>
  <head>
    <title>static content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  </head>
  <body>
    정적 컨텐츠 입니다.
  </body>
</html>

즉, 정적 컨텐츠는 서버에서 파일을 클라이언트에게 그대로 전달하는 것을 볼 수 있다.


정적 컨텐츠 동작 방식



2. MVC와 템플릿 엔진📌

MVC는 Model, View, Controller가 분리 되어있는 방법이다.

관심사 분리를 위해 View는 화면을 그리는데 집중, Model와 Controller는 비즈니스 로직과 관련되어 있도록 한다.


Controller

controller > HelloController

package hello.hello_project.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;

@Controller
public class HelloController {

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

    // MVC 방식
    @GetMapping("hello-mvc")
    // 윈도우 파라미터 옵션 단축키(Ctrl + p)
    public String helloMvc(@RequestParam(name = "name") String name, Model model){
        model.addAttribute("name",name);
        return "hello-template";
    }
}


View

resources > templates > hello-template.html

  • 타임리프(thymeleaf)는 뷰 템플릿 엔진으로 컨트롤러가 전달하는 데이터를 이용하여 동적으로 화면을 구성할 수 있게 해준다.
<html xmlns:th="http://www.thymeleaf.org">
  <body>
    /* $표시 : modle 키 값 name으로 치환*/
    <p th:text="'hello ' + ${name}">hello! empty</p>
  </body>
</html>


MVC 동작 방식

  • http://localhost:8080/hello-mvc?name=Spring 라고 접속했을 때 컨트롤러에서 name = Spring이 model에 담기게 되고, 템플릿에서 model이 키 값이 name인 것을 꺼내서 치환



3. API

정적 컨텐츠를 제외하면 사실 두 가지로 볼 수 있다.

  • 서버에서 View를 찾아서 템플릿 엔진을 통해 화면을 렌더링해서 html을 웹브라우저에 내려주는 방법이 있고 (= MVC와 템플릿 엔진),
  • 데이터를 (일반적으로 JSON 형태로) 바로 내리는 방법이 있다. (= API)

@ResponseBody에 문자를 반환하는 예시

@Controller
public class HelloController {
    // 문자를 반환
    @GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name){
        return "hello " + name;
    }
}
  • @ResponseBody 를 사용하면 템플릿 엔진과 다르게 뷰 리졸버( viewResolver )를 사용하지 않는다.
  • 대신에 HTTP의 BODY에 문자 내용을 직접 반환한다.(HTML BODY TAG를 말하는 것이 아님)


http://localhost:8080/hello-string?name=String!!!로 실행


@ResponseBody가 객체를 반환하는 예시 -> 데이터 전달하고 싶을 때 사용

package hello.hello_project.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-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;
        }
    }
}

@ResponseBody 를 사용하고, 객체를 반환하면 객체가 JSON으로 변환된다.


http://localhost:8080/hello-api?name=spring로 실행


@ResponseBody 사용 원리

  • 스프링은 이전과 같이 hello-api라는 Controller를 찾는다.
  • 이때 Controller에 @ResponseBody 태그가 붙어있으면 MVC 방식에서의 viewResolver가 아닌 HttpMessageConverter가 동작한다.
    • Controller에서 반환하는 값이 string이라면 StringHttpMessageConverter가 작동하여 string을 바로 처리하고,
    • 객체가 반환되면 MappingJackson2HttpMessageConverter가 작동해 객체를 JSON방식으로 변환한다.
    • JSON으로 만들어진 객체는 바로 웹 브라우저에 key-value 쌍으로 반환된다.


getter, setter란?

  • getter와 setter는 클래스의 필드(변수)에 대한 접근을 제어하기 위해 사용되는 메서드이다. -> 객체 지향 프로그래밍 캡슐화 가능
  • 단축키(windows)⭐: (Alt+Insert)에 들어가 Getter and Setter 클릭
메서드 설명
Getter 클래스의 필드 값을 반환하는 메서드
Setter 클래스의 필드 값을 설정하는 메서드


getter, setter 예제

public class Person {
    private String name;
    private int age;

    // Getter for name
    public String getName() {
        return name;
    }

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

    // Getter for age
    public int getAge() {
        return age;
    }

    // Setter for age
    public void setAge(int age) {
        this.age = age;
    }
}


카테고리:

업데이트:

댓글남기기