TIL(Today I Learned)

12월 30일(토)

공부한 내용을 제 언어로 빠르게 정리한 내용이라서 잘못된 내용이 있을 수 있습니다.

인프런: 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술(김영한님 강의)

스프링 웹 개발 기초

정적 컨텐츠

  • 스프링의 데이터 전달은 3가지 방식이 있음
    • 정적 컨텐츠는 파일을 웹브라우저에게 보내는 방식
    • MVC와 템플릿 엔진은 JSP, PHP 같이 HTML 파일을 동적으로 만들어서 보내는 방식
    • API는 JSON 데이터 포맷으로 데이터를 전달하는 방식
      • 서버끼리 통신할때는 API 방식 사용
  • 정적 컨텐츠 방식

MVC와 템플릿 엔진

  • MVC: Model, View, Controller
  • 예전에는 뷰에 모든걸 다 구현함: Model 1 방식
  • 관심사 분리, 뷰는 화면 그리는 것만 집중
  • 비지니스 로직 등은 컨트롤러가 담당
  • 예시 코드

      @Controller
      public class HelloController {
        
          @GetMapping("hello-mvc")
          public String helloMvc(@RequestParam("name") String name, Model model) {
              model.addAttribute("name", name);
              return "hello-template";
          }
      }
    
    • 동작 방식
      • 웹 브라우저가 localhost:8080/hello-mvc?name=spring 로 요청→ 내장 톰켓 서버가 요청을 스프링 컨테이너로 보내면 hello-mvc로 매핑된 HelloController의 메서드를 호출하면 모델과 템플릿을 스프링한테 넘겨줌
      • 스프링은 ViewResolver에게 hello-template이라는 HTML을 찾아서 Thymeleaf 템플릿 엔진에게 전달하면, 템플릿 엔진이 렌더링해 준 HTML을 클라이언트에게 전달

API

@GetMapping("hello-spring")
@ResponseBody // HTTP 응답 메세지 바디에 반한된 데이터를 포함시킨다는 의미
public String helloSpring(@RequestParam("name") String name) {
    return "hello" + name;
}
@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;
		
		// getter setter
    public String getName() { 
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • InteliiJ 단축키
    • cmd + shift + enter 문장 완성해서 다음줄로 넘어감
    • ctrl + enter : getter / setter 생성
  • JSON은 Key, Value 로 이루어진 구조
    • xml은 무겁고 테그 열고 닫고 불편해서 요즘은 xml 안쓰고 JSON으로 통일되었음
    • 그래서 spring도 기본이 JSON 반환하도록 세팅되어있음
    • xml 전달하고 싶으면 따로 세팅해서 전달할 수도 있음
  • Getter/Setter 는 JavaBean 표준 방식
    • private 프로퍼티 접근하게 하기 위한 메서드
  • @ResponseBody 사용 원리
    • 웹 브라우저가 localhost:8080/hello-api로 요청→ 내장 톰켓 서버가 요청을 스프링 컨테이너로 보내면 hello-api로 매핑된 HelloController의 메서드를 호출하며, 메서드에 @ResponseBody가 붙어있으면 HTTP 메세지의 바디에 포함됨.
    • 메서드가 반환한 내용을 변환하기 위해 HttpMessageConverter가 동작(ViewResolver 대신에): 단순 문자면 String Converter(StringHttpMessageConverter), 객체면 JsonConverter(MappingJaskson2HttpMessageConverter) 가 작동
    • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어있음
    • 참고: 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter가 선택됨.