Spring 1-2. 스프링 웹 개발 기초

JG's Development Blog·2023년 1월 25일
0

Spring

목록 보기
2/10

웹 개발 종류

  • 정적 컨텐츠
    서버의 동작 없이 그대로 파일을 그대로 출력
  • MVC와 템플릿 엔진
    jhp, php등의 템플릿 엔진을 통해 html을 변형하여 출력
    요새 개발 트렌드
  • API
    안드로이드 또는 아이폰 등을 개발할 때에 html이 아닌 json 데이터 구조 포맷으로 개발함
    또는 html 전달이 필요없는 서버끼리의 통신 간에 사용

정적 컨텐츠 개발

https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-static-content

  • 스프링 부트 사이트에서는 정적 컨텐츠 개발 방법을 다음과 같이 안내하고 있다.
  • src - main - resources - 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>

  • 정적 컨텐츠 작동 구조
  1. 웹 브라우저가 톰켓 서버에게 요청한다.
  2. 톰켓 서버에서 hello-static 관련 컨트롤러가 있는지 스프링 컨테이너에게 신호를 보낸다 -> 컨트롤러가 우선순위가 더 높다.
  3. 관련 컨트롤러가 없으므로 resources: static에서 해당 파일을 찾는다.
  4. 그대로 반환한다.

MVC와 템플릿 엔진 개발

  • MVC : Model, View, Controller

  • 옛날에는 view에 모든 프로그래밍을 설계한 model1 방식이지만 지금은 MVC와 같은 model2 방식으로 개발한다.

  • 분야를 분리하여 유지, 보수에 더 용이하게 하기 위함이다.
    -> view는 프론트(보이는 것), model과 controller는 백(내부)

  • thymeleaf의 장점 : 서버 구동 없이 html을 주소창에 입력하면 바로 볼 수 있다.(view 영역)

  • controller 파일의 hellocontroller 파일에 다음을 추가한다.

@GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model){
        model.addAttribute("name",name);
        return "hello-template";
    }
  • resource - templates 파일에 hello-template.html을 생성하고 다음 내용을 작성한다.
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
  • 이때 이 템플릿은 서버 구동 없이 확인가능

  • copy path - absolute path 로 주소창을 붙여넣기

  • 여기서 loalhost:8080/hello-mvc로 접속하면 에러페이지가 뜬다.

  • 이유는 name을 받아오는데 required 값이 기본적으로 true로 설정되어 있어서 주소창에 추가로 ?name=spring!을 넣어주어야한다.

  • MVC, 템플릿 엔진 작동 구조

  1. 웹 브라우저가 톰켓 서버에게 요청한다.
  2. 톰켓 서버에서 hello-static 관련 컨트롤러가 있는지 스프링 컨테이너에게 신호를 보낸다
  3. 관련 컨트롤러가 있으므로 그 컨트롤러를 따라간다.
  4. return은 hello-template이고 model에는 spring!이라는 값이 들어있는 name이 담겨 전송된다.
  5. 스프링은 viewResolver를 통해 템플릿으로 넘긴다.
  6. model에 담긴 값에 따라 변환 후 웹 브라우저로 넘긴다.

API 엔진 개발

  • controller 에 다음 코드 추가
@GetMapping("hello-spring")
    @ResponseBody // http 의 body 부분에 아래 데이터를 직접 넣겠다는 의미, ※ html의 body 아님
    public String helloString(@RequestParam("name") String name){
        return "hello "+name;
  • view 없이 바로 변환된 값이 전송된다.

  • 결과는 MVC, 템플릿 방식과 같지만 소스 부분이 다르다.

  • MVC, 템플릿 방식 소스

  • API 방식 소스


  • 위 예시는 MVC와의 차이를 보여주기 위한 코드일 뿐이다.
  • 컨트롤러에 아래의 코드를 추가한다.
@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;
        }
    }

  • 실행하면 위와 같이 데이터 형식으로 나오는데 이것은 json형식이다.
    (json : key와 value로 이루어진 데이터 구조)

=> @ResponseBody를 사용하고 객체를 반환하면 json형식으로 반환하게 된다.

  • API 작동 구조(@ResponseBody)

  1. 웹 브라우저가 톰켓 서버에게 요청한다.
  2. 톰켓 서버에서 hello-static 관련 컨트롤러가 있는지 스프링 컨테이너에게 신호를 보낸다
  3. 관련 컨트롤러가 있으므로 그 컨트롤러를 따라간다.
  4. @ResponseBody에 의해 HttpMessageConverter로 넘어간다.
  5. 객체이므로 JsonConverter로 인해 json형식으로 변환된다.
    (※ 현재 spring은 객체가 들어오면 json으로 바꾸는 것이 default이다.)
  6. 웹브라우저로 보내진다.

※ 기본 객체처리 라이브러리 : MappingJackson2HttpMessageConverter


강의 사이트
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8

profile
왕왕왕초보

0개의 댓글