Hi yoahn 개발블로그

[Spring] #2 스프링 웹 개발 기초 본문

Framework & Library/springboot

[Spring] #2 스프링 웹 개발 기초

hi._.0seon 2021. 1. 20. 14:35
반응형

1. 정적 컨텐츠

- 파일을 웹브라우저에 그냥 그대로 전달

- 스프링 부트 -> 정적 컨텐츠 기능 자동으로 제공

docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-spring-mvc-static-content

 

Spring Boot Features

Graceful shutdown is supported with all four embedded web servers (Jetty, Reactor Netty, Tomcat, and Undertow) and with both reactive and Servlet-based web applications. It occurs as part of closing the application context and is performed in the earliest

docs.spring.io

기본 설정으로 SpringBoot는 /static 폴더에서 정적 컨텐츠를 찾아 제공

- static 폴더 안에 정적 컨텐츠 넣은 후, localhost:8080/hello-static.html 로 접근 가능

(url/{파일명})

정적 컨텐츠 이미지

1. 웹 브라우저에서 localhost:8080/hello-static.html 요청

2. 내장 톰캣 서버가 요청 받음 -> Spring 한테 넘김

3. 관련된 컨트롤러가 있는지 확인

4. 없으면 내부 resources/static/hello-static.html 찾아서 반환

2. MVC 와 템플릿 엔진

템플릿 엔진: html을 서버에서 프로그래밍해서 동적으로 바꿔서 줌

MVC: model-view-controller

model, controller : 비즈니스 로직, 내부 처리에 집중

view : 보여지는 것에 집중

 

HelloController.java

@Controller
public class HelloController {

    @GetMapping("hello")
    public String hello(Model model) {...}

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

@RequestParam("name") String name

- 외부에서 파라미터 받을 때 사용

- 외부에서 이름을 url 파라미터로 바꿈

 

Model model

- model에 담아서 넘겨줌 -> View 에서 렌더링할 때 사용

 

hello-template.html

<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>

템플릿 엔진 -> html 을 동적으로 바꿔줌

 

-> 이 상태에서 localhost:8080/hello-mvc 로 접근하면 Warn

> 파라미터를 넘겨주지 않아서! <

1. @RequestParam(value = "name", required = false) 로 바꾸거나

2. localhost:8080/hello-mvc?name=spring!!! 로 url 접근

  - 컨트롤러에 name 이 spring!!! 값으로 전달됨

 

1. url 요청

2. 톰캣 서버 -> 스프링으로 전달

3. 컨트롤러 확인 -> 호출 : return: hello-template, model(name:spring)

4. viewResolver  -> templates/hello-template.html 찾아서 템플릿 엔진한테 처리하라고 넘김

뷰를 찾아주고 템플릿 엔진 연결

5. 엔진이 렌더링 해서 변환 후 웹브라우저에 반환

3. API

json 이라는 데이터 구조 포맷으로 데이터를 클라이언트에 전달

HelloController.java

@Controller
public class HelloController {

    @GetMapping("hello")
    public String hello(Model model) {...}

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

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

@ResponseBody

- HTTP 프로토콜 = 헤더 + 바디

- HTTP 바디부분에 return (data) 를 직접 넣어 주겠다는 의미  (문자 내용을 직접 반환)

- @ResponseBody를 사용하면 viewResolver를 사용하지 않음

 

 

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

 -> hello spring 만 쓰여있는 화면 출력

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

http://localhost:8080/hello-api?name=spring  접근

```

{"name":"spring"}

```

@ResponseBody를 사용하고 + 객체를 반환하면 객체가 JSON으로 반환됨

 

Ctrl + enter || Command + N

Getter & Setter

= 자바 빈 표준 방식 = 프로퍼티 접근 방식

@ResponseBody 가 있는 경우

-> HTTP 바디에 이 데이터(return)를 그대로 넘김  (ViewResolver 대신 HttpMessageConverter 가 동작 (StringHttpMessageConverter: 문자 처리, MappingJackson2HttpMessageConverter: 객체 처리))

  -> 데이터가 객체인 경우

      - default: JSON 방식으로 만들어서 반환

 

ref. inflearn 스프링 입문

 

 

반응형
Comments