spring 웹 개발 기초

OneTwoThree·2023년 6월 17일
0

개요

웹 개발의 3가지 방법

  • 정적 컨텐츠 : 서버에서 하는 것 없이 파일을 그대로 웹브라우저에 내려줌
  • MVC와 템플릿 엔진 : HTML을 서버에서 프로그래밍 해서 동적으로 바꿔서 내려주는 것 - 정적 컨텐츠와 달리 서버에서 HTML을 변형해서 내려줌
  • API : JSON 데이터 포맷으로 클라이언트한테 데이터 전달. VUE.JS랑 리액트 등과 함께 사용. 또는 서버끼리 통신할 때.

정적 컨텐츠

  • 스프링부트에서는 static 폴더 아래에 아무 정적 컨텐츠를 만들고 /파일명 으로 접속하면 해당 컨텐츠를 그대로 보여줌
  • 정적 파일을 그대로 반환함. 어떤 프로그래밍을 할 수는 없음. 정적 컨텐츠를 제공하는 기능
  • 클라이언트의 url에 대한 요청은 먼저 내장 tomcat 서버가 받아서 스프링한테 넘김
  • 컨트롤러가 우선순위를 가짐. 즉 먼저 hello-static 으로 받는 컨트롤러가 있는지 찾아봄
  • 컨트롤러에 없기 때문에 resources:static/ 에서 hello-static 을 찾아서 반환해줌

MVC와 템플릿 엔진

  • MVC : model, view, controller
  • view : 화면을 그리는 일만
  • controller : 비즈니스 로직과 관련된
  • model : 화면에 필요한 것들을 받아서 view에 넘겨줌

Controller

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

    }
  • @RequestParam으로 파라미터 받기
  • 모델에 키, 값으로 등록하기

View

<html xmlns:th="http://www.thymeleaf.org">
<body> <p th:text="'hello ' + ${name}">hello! empty</p> </body>
</html>
  • p 태그의 th 속성값이 p 태그의 컨텐츠를 서버가 돌아가면 대체함
  • 서버 안돌리고 파일만 올려서 보면 hello! empty가 보임

  • 이 상태에서 http://localhost:8080/hello-mvc 로 접속하면 에러 페이지가 뜬다
  • WARN 의 내용을 보면 파라미터가 필요한데 전달해주지 않았기 때문
  • http://localhost:8080/hello-mvc?name=바보 이런 식으로 get 파라미터를 전달해줘야 함

동작방식

  • 클라이언트 요청 -> 내장 톰캣 서버
  • 내장 톰캣 서버 -> 스프링 : 컨트롤러에 매핑 된 것 확인
  • 컨트롤러가 뷰리졸버에게 리턴값과 모델 값 넘김
  • 뷰 리졸버는 화면과 관련된 일을 해결해줌
  • 뷰 리졸버가 thymeleaf 템플릿 엔진에게 처리해달라고 넘김
  • 템플릿 엔진이 렌더링 해서 변환을 한 html을 웹 브라우저에게 반환함

API

Controller

//API
    @GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name){
        return "hello"+name;
    }
  • ResponseBody의 내용 : 응답 body에 return값을 직접 넣어주겠다
  • view가 따로 있는게 아니고 문자 자체가 넘어감

객체 리턴

   // static 클래스
    static class Hello{
        String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    // api 방식으로 Hello 객체 리턴
    @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name){
        Hello hello = new Hello();
        hello.setName(name);
        return hello;
    }
  • 객체를 리턴하기 위해 static 클래스를 하나 만들고 컨트롤러 메소드의 반환형을 객체로 함
  • json 방식으로 객체를 리턴함 (key, value 형태)
  • 과거에는 xml 방식도 사용 했지만 최근에는 거의 json으로 통일됨

동작방식

  • 브라우저 -> 내장 톰캣 서버 -> 스프링 컨트롤러
  • @ResponseBody 어노테이션이 붙어있음
  • 안붙어있으면 : 뷰 리졸버한테 위임
  • 붙어있으면 : 그대로 데이터를 넘김
  • HttpMessageConverter가 동작해서 단순 문자열이면 StringConverter가, 객체면 JsonConverter가 동작함
  • JsonConverter가 객체를 json으로 바꿔서 반환함

0개의 댓글