본문 바로가기

Spring

[Spring] 웹 개발 방식

스프링 웹 개발 기초

웹을 개발하는 3가지 방법

 

정적 컨텐츠

  • 정적 컨텐츠는 파일을 그대로 그냥 고객한테 웹브라우저로 전달해주는 방식

MVC와 템플릿 엔진

  • 서버에서 변형을 해서 HTML을 바꿔서 내려주는 방식

API

  • JSON 데이터 구조 포멧으로 클라이언트에게 데이터를 전달하는 방식
  • 서버끼리 데이터들을 통신할 때 

 

정적 컨텐츠

[resources/static/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>

 

http://localhost:8080/hello-static.html

 

static content 정적 컨텐츠 입니다.

 

  1. 웹브라우저에 http://localhost:8080/hello-static.html을 친다.
  2. 내장 Tomcat 서버가 이 요청을 받고, 스프링 컨테이너에 넘기게 된다.
  3. 먼저 컨트롤러(우선순위 ↑) 쪽에서 hello-static이 있는지 확인을 한다.
  4. resources 안에 hello-static.html을 찾는다.
  5. 다시 역순으로 웹브라우저에 반환을 해준다.

 

MVC와 템플릿 엔진

 

MVC: Model, View, Controller

Controller

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;

@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";
    }
}

 

View

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p th:text="'hello ' + ${name}">hello empty</p>
</body>
</html>

 

http://localhost:8080/hello-mvc

 

 

이대로 실행하면 파라미터로 넘긴 값이 없다고 에러가 발생하게 됩니다.

WARN 20012 --- [hello-spring] [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'name' for method parameter type String is not present]

 

  • required 가 기본으로 true 이기 때문에 기본으로 값을 넘겨야 한다.
  • 파라미터 값 없이 해당 메서드를 호출하고 싶다면 required = false 로 설정해준다.
@GetMapping("hello-mvc")
    public String helloMvc(@RequestParam(value = "name", required = false) String name, Model model) { // @RequestParam 외부에서 파라미터 받기
        model.addAttribute("name", name);
        return "hello-template";
    }

 

 

http://localhost:8080/hello-mvc?name=spring!

  • http get 방식에서 ?(물음표) &(and) &(and) 같은 방식으로 파라미터를 넘겨줄 수 있다.

 

실행 과정

1. @GetMapping("hello-mvc")
        public String helloMvc(@RequestParam("name") String name, Model model) { 
            model.addAttribute("name", name);
            return "hello-template";
        }
    
2. @GetMapping("hello-mvc")
        public String helloMvc(@RequestParam("name") String name = spring!, Model model) { 
            model.addAttribute("name", spring!);
            return "hello-template";
        }
  • Controller 에서 name은 spring! 으로 바뀌고 model 에 담긴다.
  • hello-template 으로 반환된다.
  • ${name} 이 model 의 key 값을 꺼내고 spring! 으로 치환된다.

 

 

 

API

@ResponseBody 문자 반환

@GetMapping("hello-string")
@ResponseBody
    public String helloString(@RequestParam("name") String name) {
        return "hello " + name;
    }
  • @ResponsBody 의 Body는 body 태그를 얘기하는 것이 아닌 http Body부에 이 데이터를 직접 넣어주겠다는 뜻
  • HTML(View) 필요 없이 문자가 그대로 내려 간다.

http://localhost:8080/hello-string?name=ssambbong

 

 

위에 경우는 잘 쓰지 않는 방식이지만 문자 같은 것이 아니라 데이터를 줘봐 라고 하면 말이 달라집니다.

이런 이유 때문에 API 방식을 많이 쓰고 있습니다.

 

@ResponseBody 객체 반환

@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;
	
    // JavaBean 표준방식(Getter/Setter) or 프로퍼티 접근 방식
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
  • HelloController 안에 새로운 클래스를 만들고 멤버 변수와 메서드를 작성해주었다.
  • helloApi 메서드가 실행되면 Hello 객체를 만들고 파라미터로 받은 name의 값을 지정한다.
  • 객체 값을 리턴하였다.

 

http://localhost:8080/hello-api?name=ssambbong!

  • 이것은 JSON 이라는 방식이다.
  • Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷이다.
  • 웹 어플리케이션에서 데이터를 전송할 때 일반적으로 사용힌다.
  • 현재 트렌드는 xml 방식보다 json 방식으로 넘어왔다.

@ResponseBody 사용 원리

@ResponseBody 사용

  • HTTP의 BODY에 문자 내용을 직접 반환
  • viewResolver 대신 HttpMessageConveter 가 동작
  • 기본 문자처리: StringHttpMessageConverter 가 처리
  • 기본 객체처리: MappingJackson2HttpMessageConverter 가 처리
  • byte 처리 등등 여러 HttpMessageConverter가 기본으로 등록되어 있다.

 

 

정리

  • 정적 컨텐츠: 파일을 있는 그대로 내려준다.
  • MVC와 템플릿 엔진 : 템플릿 엔진을 이용해서 렌더링된 파일을 내려준다.
  • API 방식: 객체 반환이 된다면 JSON 형식으로 변환해서 내려준다.

'Spring' 카테고리의 다른 글

[Spring] 객체 지향 설계 SOLID 원칙  (0) 2024.06.10
[Spring] AOP  (0) 2024.06.10
[Spring] 스프링 DB 접근 기술  (0) 2024.06.10
[Spring] spring-boot-devtools  (0) 2024.06.09
[Spring] 정적 페이지, 템플릿 엔진 동작  (1) 2024.03.28