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

jy9922·2022년 8월 4일
0

Spring

목록 보기
2/34
post-thumbnail

✔ 스프링 웹 개발 기초

스프링 부트가 제공하는 기능들

✅ 정적 컨텐츠

✅ MVC와 템플릿 엔진

  • HTML을 동적으로 바꾸는 것을 템플릿 엔진이라 한다.
  • JSP나 PHP 등이 템플릿 엔진에 해당된다.
  • Model View Controller (MVC)
    정적 컨텐츠 VS MVC와 템플릿 엔진
  • 정적 컨텐츠는 파일을 그대로 웹 브라우저에게 전달해주는 것
  • MVC와 templete 엔진은 서버에서 변형을 해서 HTML을 바꾸어서 웹 브라우저에게 전달해주는 것

✅ API

  • JSON 데이터 포맷으로 client한테 데이터를 전달해주는 방식이다.

✔ 정적 컨텐츠

  • Spring Boot는 클래스 경로 또는 서블릿 컨텍스트 루드에 있는 /static(또는 /public, /resources 또는 /META-INF/resources) 디렉터리의 정적 콘텐츠를 제공한다.
    • ResourceHttpRequestHandler를 사용하여 고유한 WebMvcConfigurer를 추가
    • addResourceHandlers 메서드를 재정의하여 해당 동작을 수정
  • 개발자가 작성한 코드가 그대로 반환되는 것을 확인할 수 있다.

정적 컨텐츠 이미지

  • 웹 브라우저에서 localhost:8080/hello_static.html 을 요청
  • 스프링은 먼저 컨트롤러에서 hello_static이 있는지 탐색
    ( 컨트롤러에서 우선순위를 가진다는 의미 )
  • 관련 컨트롤러가 없다는 것을 확인하고 내부에 있는 resource 안의 hello_static 탐색
  • 반환

✔ MVC와 템플릿 엔진

MVC ( Model View Controller )

/*HelloController*/
 @GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model){
        model.addAttribute("name", name);
        return "hello-templete";
    }
<!--hello-templete-->
<body>
  <p th:text="'hello ' + ${name}">hello! empty</p>
  <!--${ } 표시는 모델에서 값을 가져온다는 의미-->
</body>

코드 동작 방식

  • URL이 넘어가면, HelloController의 String name이 jjy로 바뀌고, addAttribute의 name 또한 jjy로 바뀐다.
  • model에 담기고, hello-templete으로 이동한다.
  • hello-templete에서 ${name}을 통해 키 값이 name인 것의 값을 꺼내 치환해서 hello jjy 출력하게 된다.

MVC, Templete 엔진 이미지

✔ API

/* helloController */
@GetMapping("hello-string")
    @ResponseBody // http 통신 프로토콜의 body 부분 (html의 <body> X)
                  // 해당 body 부분에 직접 데이터를 넣어주겠다는 의미
    public String helloString(@RequestParam("name") String name){
        return "hello " + name; // "hello spring" 문자열이 요청한 클라이언트에 그대로 넘어감
                               // mvc가 viewResolver를 거쳐서 가는 것과는 다르게 동작함 (view X)
    }

페이지 소스 보기로 확인했을 때, html 코드 없이 문자열이 그대로 반환된것을 확인할 수 있다.

  • API는 템플릿 엔진과 다르게 view를 거치지 않고, 데이터를 그대로 반환해준다.

API 코드2

@GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name) {
        Hello hello = new Hello();
        hello.setName(name);
        return hello;
    }
    
    public class Hello{
        private String name;
        
        // ctrl + N 눌러서 getter/setter 생성
        // getter/setter은 Java Bean 규약
        // name 필드는 private이기 때문에 외부에서 직접적으로 접근이 어렵다
        // getter/setter을 통해서 접근을 할 수 있다
        // property 접근 방식이라고 하기도 한다
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }

JSON 방식으로 데이터가 오게 된다.

  • JSON은 KEY, VALUE로 이루어진 데이터 구조
  • 과거에는 XML 방식으로 데이터를 주고 받았지만 요즘에는 JSON이 대세!
  • ResponseBody는 JSON으로 기본으로 세팅되어 있음

API 이미지 (ResponseBody 사용 원리)

  • 웹 브라우저에서 localhost:8080/hello-api를 친다.
  • 내장 톰켓 서버에서 해당 url을 스프링에게 던진다.
  • hello-api가 있는 것을 확인하면서, ResponseBody라는 annotation이 붙은 것을 확인하다.

    🔸 JAVA의 Annotation
    코드 사이에 주석처럼 쓰여서 특별한 의미, 기능을 수행하도록 하는 기술

  • HTTP 응답에 받은 데이터를 그대로 옮겨놓는 방식으로 동작한다.
    HTTP의 BODY에 문자 내용을 직접 반환해준다.

    🔸 ResponseBody가 없다면
    Spring은 templete 방식처럼 viewResolver에 해당 데이터를 던진다.

  • viewResolver 대신에 HttpMessageConverter가 동작한다.
  • Hello 객체가 반환 → Json 스타일로 바꾼다.
    • 반환 받은 데이터가 문자라면?
      • 기본 문자처리 : StringHttpMessageConverter가 동작
    • 반환 받은 데이터가 객체라면?
      • 기본 객체처리 :MappingJackson2HttpMessageConverter가 동작
    • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
  • Json 스타일로 바꾼 데이터를 요청한 client에 반환해준다.

0개의 댓글