웹/Spring

간단한 MVC 패턴과 API 만들기

Themion 2022. 3. 10. 22:20

Spring에서 데이터를 전송할 수 있는 방법은

  1. 정적 컨텐츠
  2. MVC 패턴
  3. API

이렇게 세 종류가 있다. 이 때 정적 컨텐츠는 정적인, 즉 어떤 경우에도 변하지 않는 데이터를 전송하므로 잘 사용되지 않는다. 나머지 두 방법, 즉 MVC 패턴과 API를 이용해 데이터를 전송하는 방법은 아래와 같다.

  • 공통 부분

데이터를 전송하는 코드는 src/main/java/에 있는 패키지 아래에 있는 하위 패키지 controller에 존재해야 한다. url의 매개변수로 입력받은 사람의 성과 이름을 그대로 전송하는 코드를 만들 때, 해당 기능을 가진 객체는 다음과 같은 형식을 갖는다.

// src/main/java/{package}/controller/ControllerDemo.js

package com.example.demo.controller;

import com.example.demo.domain.Person;

import org.springframework.stereotype.Controller;

@Controller
public class ControllerDemo {
    // MVC 패턴 방식으로 데이터를 전송하는 메소드
    public String mvcDemo(...) { ... }
    
    // API 방식으로 데이터를 전송하는 메소드
    public Person apiDemo(...) { ... }
}

 

  • MVC 패턴

MVC 패턴 방식으로 데이터를 전송하기 위해선, 우선 src/main/resources/templates/에 템플릿 엔진을 이용한 파일을 만들어 데이터를 전송할 형식 또한 지정해주어야 한다. 또, 데이터를 전송하는 코드에는 MVC 형식으로 데이터를 전송하는 메소드를 작성해야 한다. 이 메소드는 반드시 인자로 Model타입 변수를 받고, Model 클래스의 메소드 addAttribute를 이용해 model에 데이터를 적재해야 하며, 반환값으로는 템플릿 엔진을 이용한 파일의 이름을 가져야 한다. 이 예제에서는 템플릿 엔진으로 Thymeleaf를 이용하도록 하겠다.

// src/main/java/{package}/controller/ControllerDemo.js

package com.example.demo.controller;

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

@Controller
public class ControllerDemo {
    @GetMapping("mvc_demo")
    public String mvcDemo(
        @RequestParam("first") String first, 
        @RequestParam("last") String last,
        Model model
    ) {
        model.addAttribute("first", first);
        model.addAttribute("last", last);
        return "mvc_demo";
    }
}
<!-- src/main/resources/templates/mvc_demo.html -->

<html xmlns:th="http://www.thymeleaf.org">
  <body>
    <p th:text="${first} + ' ' + ${last}">placeholder</p>  
  </body>
</html>

위 코드를 입력한 뒤 URL에 경로로 mvc_demo(@GetMapping의 인자)를, 매개변수로 함수의 인자를 입력한다면 아래와 같은 페이지를 얻게 된다.

템플릿 엔진을 사용한 파일이 html로 변환되어 전송되었다.

 

  • API

API 방식으로 데이터를 전송하기 위해선, 전송할 데이터를 묶은 클래스와 해당 클래스 타입 객체를 만들어야 한다.

// src/main/java/{package}/domain/Person.js

package com.example.demo.domain;

public class Person {
    private String first, last;
    private Long id;

    public Person() {}
    public Person(String first, String last) {
        this.first = first;
        this.last = last;
    }

    public String getFirst() { return first; }
    public String getLast() { return last; }
    public Long getId() { return id; }
    public void setFirst(String first) { this.first = first; }
    public void setLast(String last) { this.last = last; }
    public void setId(Long id) { this.id = id; }
}
// src/main/java/{package}/controller/ControllerDemo.js

package com.example.demo.controller;

import com.example.demo.domain.Person;

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

@Controller
public class ControllerDemo {
    static class Person {

    @GetMapping("api_demo")
    @ResponseBody
    public Person apiDemo(
        @RequestParam("first") String first, 
        @RequestParam("last") String last
    ) {
        return new Person(first, last);
    }
}

위 코드를 입력한 뒤 URL에 경로로 api_demo(@GetMapping의 인자)를, 매개변수로 함수의 인자를 입력한다면 아래와 같은 페이지를 얻게 된다.

전송한 데이터가 JSON 형태로 변환되었다.

' > Spring' 카테고리의 다른 글

JUnit / AssertJ를 이용하여 테스트하기  (0) 2022.03.17
Repository / Service / Controller  (0) 2022.03.17
Container와 Bean  (0) 2022.03.15
프로젝트 build하기  (0) 2022.03.10
VS Code에서 Spring 프로젝트 생성 및 실행  (0) 2022.03.10