CS log

[스프링 입문] 스프링 웹 개발 기초 본문

Spring & Spring Boot

[스프링 입문] 스프링 웹 개발 기초

sj.cath 2024. 9. 22. 15:15

1. 정적 컨텐츠

1. 정적 컨텐츠 : 파일을 그대로 고객에게 전달

2. mvc & template engine : 서버에서 변형 후 html 바꿔서 전달

3. api : 안드로이드, ios 클라이언트가 의뢰할 경우 json이라는 포맷으로 전달

  • 서버끼리 통신할 때
  • 화면은 클라이언트가 그릴 때

https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/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

 

정적 컨텐츠를 빌드해보자!

로 빌드하면 아래와 같은 화면

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

컨트롤러를 찾는 것이 1순위 ➡️ 안되면 resources : static/hello-static.html 을 찾아서 return

 

2. MVC와 템플릿 엔진

mvc = model, view, controller

새로운 controller를 생성한다.

그리고 이를 받을 hello-template.html을 아래와 같이 생성한다.

그러나 오류가 뜨는데 그 이유는

 

2024-09-13T16:43:24.788+09:00  WARN 78333 --- [hello-spring] [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'name' for method parameter type String is not present]

파라미터 값(name)이 없기 때문

 

cmd + P 단축키

default 값이 true이기 때문에

name=spring 이라고 값을 입력해주면 정상 작동한다.

 

원리는 다음과 같다!

controller에서 name 부분이 spring으로 바뀌게 됨 -> html의 ${name} 부분도 spring으로 바뀌게 된다.

 

Error

controller를 작성하는 순간부터 mvc 를 작성하는 것이기 때문에

hello-template.html을 resources/templates 에 생성해주어야 한다 ... 위에 조금 틀렸었다 ~~

 

3. API

1) string으로 받기

아래와 같은 코드를 HelloController.java 를 실행하고 페이지 소스를 보면

@GetMapping("hello-string")
    @ResponseBody // http에서 header부와 body부에
    public String helloString(@RequestParam("name") String name){
        return "hello" + name; // 이 내용을 직접 넣어주겠다 ex.hello spring
    }

 

html tag가 없다. 무식하게 그냥 name을 주소에 넣은 것

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

 

2) API로 받기

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

java vim 표준 방식 & property 접근 방식 : private이어서 접근하지 못하는 name을 get & set한다. (public으로 열어둠)

 

다음과 같이 json 방식으로 출력이 되었다.

더보기

json이란? key-value 방식

@ResponseBody 동작 원리

@ResponseBody가 없으면 viewResolver에게 나한테 맞는 template을 던져줘 라고 요청하지만,

있으므로 Http~에 값(객체)을 그대로 넣음

객체를 넣으면? json 방식으로 데이터를 만들어서 http 응답에 반환을 한다.

더보기

jackson2? 객체를 json으로 바꿔주는 라이브러리

 

4. 정리

파일을 그대로 내려준다? 정적 컨텐츠

template engine을 mvc 방식으로 쪼개서 html을 프로그래밍 후 랜더링하면? template engine 방식

객체 반환 json 형식으로, http에 값을 넣어서 바로 반환? api 방식