제육's 휘발성 코딩
반응형

스프링 웹 개발 기초

프로젝트 생성

image

https://start.spring.io/ 에서 프로젝트를 GENERATE하고 IDE에서 임포트하자.

라이브러리

Gradle은 의존관계가 있는 라이브러리를 함께 다운로드 한다.

스프링 부트 라이브러리

  • spring-boot-starter-web
    • spring-boot-starter-tomcat
    • spring-webmvc
  • springboot-starter-thymeleaf
  • spring-boot-starter(공통) : 스프링 부트 , 스프링 코어, 로깅 기능

 

웹 개발에는 크게 정적 컨텐츠, MVC와 템플릿 엔진, API 세 가지로 나눌 수 있다.

스프링 부트는 static/index.html 을 올려두면 Welcome page 기능을 제공한다.

정적 컨텐츠

image

HTML 파일을 있는 그대로 사용자에게 보여주는 방식이다. 스프링 컨테이너에서 요청에 대한 정보를 컨트롤러에서 찾고 없으면 static/요청파일을 찾아서 반환해준다.

MVC와 템플릿 엔진

image

현재 가장 많이 개발하는 방식으로 JSP, PHP와 같은 HTML을 동적으로 변경해서 사용자에게 보여주는 방식이다.

타임리프를 템플릿 엔진을 사용하여 테스트 해보자.

 

package hello.hellospring;

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-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model) {
        model.addAttribute("name", name);
        return "hello-template";
    }
}
  • @RequestParam 은 URL 요청 파라미터에 대한 정보를 받아온다. @RequestParam 을 사용하면 http://localhost:8080/hello-mvc?name=spring 다음과 같이 쿼리스트링에 해당 파라미터명이 있어야만한다. 만약 없을 수도 있는 경우 @RequestParam(value = "name", required = false) String name를 사용하자.
  • Model은 forward 방식처럼 데이터를 담아서 화면단에 보내는 방식이다. 즉 name이라는 키로 name값을 담아서 다음 화면에 전달한다.
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
  • 타임리프를 통해 컨트롤러에게 전달받은 데이터를 화면에 보여주자.

API

image

JSON과 같은 데이터 포맷을 전달하는 방식이다. 클라이언트에게 데이터만 전달해서 뷰는 클라이언트측(뷰, 리액트 등)에서 만들 거나 서버 간 통신을 할 때 사용한다.

@ResponseBody 문자 반환

package hello.hellospring;

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;
    }
}
  • @ResponseBody를 사용하면 뷰 리졸버를 사용하지 않고 HTTP Body에 문자 내용을 직접 반환한다. 즉, 뷰를 반환하는 것이 아닌 데이터를 반환한다고 생각하면 된다.
package hello.hellospring;

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-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으로 자동 변환된다.

 

image

  • 객체를 반환하면 자동으로 JSON 형식으로 변환된 것을 확인해볼 수 있다. @ResponseBody를 사용하면 스프링 컨테이너가 뷰리졸버를 통해 뷰를 반환하는 것이 아닌 HttpMessageConverter를 통해 데이터를 자동으로 반환해서 전달해준다. JSON으로 변환되는 과정은 MappingJackson2HttpMessageConverter를 통해 변환된다. 이 외에도 여러 데이터들이 기본으로 등록되어 있다.

본 포스팅은 인프런 - 김영한님의 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술" 편을 보고 정리하였습니다.

반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^