옌의 로그

[Spring] 스프링 입문 | 2. 스프링 웹 개발 기초 본문

스터디/스프링

[Spring] 스프링 입문 | 2. 스프링 웹 개발 기초

dev-yen 2023. 6. 15. 01:45

https://inf.run/8u6a

 

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확인해주세

www.inflearn.com

(본 게시글은 인프런 스프링 입문 강의에 의해 작성되었습니다.)

 

스프링 웹 개발 기초

정적 컨텐츠

  • Welcome Page를 만들었던 것 처럼 서버에서 무언가 하는 것 없이 파일을 웹 브라우저에 그대로 내려주는 것을 뜻함
    (파일 자체를 client에게 그대로 전달)

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>

 

정적 컨텐츠 이미지

  1. 웹 브라우저에서 도메인(localhost:8080/hello-static.html)을 입력
  2. 내장 톰캣 서버가 해당 내용을 받고 스프링 컨테이너에 넘김
  3. 스프링은 먼저 컨트롤러 쪽에서 hello-static 관련 컨트롤러를 찾음
  4. 컨트롤러가 없기 때문에 static 쪽에서 정적 리소스를 찾아간다

 

MVC와 템플릿 엔진

  • MVC : Model, View, Controller
  • 템플릿 엔진 : 동적으로 웹 페이지나 문서를 생성하기 위해 사용되는 도구나 소프트웨어. 템플릿 엔진은 정적인 템플릿과 동적인 데이터를 결합하여 최종 출력물을 생성한다
  • html을 그냥 전달하는게 아닌.. 서버에서 프로그래밍해서 내리는 것을 템플릿 엔진이라 한다. 이것을 하기 위해 MVC 모델을 사용한다
  • 과거에는 Controller랑 View가 나누어져 있지 않았음. View에서 모든 걸 다 했다
  • 요즘엔 MVC 방식을 많이 사용
    • View > 화면을 띄우는데 모든 역량을 집중
    • Controller > 비즈니스 로직가 관련된 작업

Controller

@Controller
public class HelloController {
    @GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model) {
        // 외부에서 파라미터 입력을 받아오기
        model.addAttribute("name", name);
        return "hello-template";
    } // 뷰라는 템플릿이 있는 방식
}

View

resources/templates/hello-template.html

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

http://localhost:8080/hello-mvc?name=yeeun 

 

MVC, 템플릿 엔진 이미지

  1. 내장 톰캣 서버가 도메인을 스프링에 던짐
  2. 스프링은 helloController를 호출
  3. helloController는 model에 get 쿼리 파라미터를 받아 return 시키는데, 이 때 viewResolver에 넘긴다
  4. viewResolver는 모델의 값을 hello-template.html에 렌더링 시켜서 반환한다 
    1. viewResolver는 웹 애플리케이션에서 사용되는 뷰를 식별하고 선택하는 기능을 제공하는 클래스나 구성요소이다
    2. 주로 웹 애플리케이션의 컨트롤러에서 생성된 모델 데이터를 특정 뷰와 연결하여 최종적인 출력 결과를 생성하는 역할을 수행한다

 

API

  • json 포맷을 활용해 데이터를 전달. 과거엔 xml을 많이 썼다
  • API의 경우 보통 서버끼리 통신할 때 사용한다. (서버끼리 html파일을 주고받을 필욘 없으니까!)

 

@ResponseBody 문자변환

@Controller
public class HelloController {
    @GetMapping("hello-string")
    @ResponseBody // http  응답 body 부분에 이 데이터를 직접 넣겠다는 의미
    public String helloString(@RequestParam("name") String name) {
        return "hello " + name;
    } // 그냥 냅다 데이터를 내려주는 방식
}
  • @ResponseBody를 사용하면 뷰 리졸버(viewResolver)를 사용하지 않는다
  • 대신 HTTP의 response body 부분에 문자 내용을 직접 반환한다

 

@ResponseBody 객체 반환

@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;
        } 
    }
}
// 자바 빈 표준방식 : 게터, 세터
// 프로퍼티 접근 방식
  • @ResponseBody를 사용하고, 객체를 반환하면 객체가 JSON으로 변환된다

 

@ResponseBody 사용 원리

  1. @ResponseBody를 사용시
  2. HTTP의 BODY에 문자 내용을 직접 반환
  3. viewResolver 대신에 HttpMessageConverter가 동작
  4. 이게 문자야 객체야? 판단 후 변환
    1. 기본 문자처리 : StringHttpMessageConverter
    2. 기본 객체처리 : MappingJackson2HttpMessageConverter
  5. byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있다

(참고: 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter가 선택된다)

Comments