<스프링입문>02. 스프링 웹 개발 기초

박서연·2023년 3월 23일
0

Spring

목록 보기
2/10

📌 요약

웹 개발 방식

🔗 정적 컨텐츠

파일을 그대로 web browser에 내려주는 방식

🔗 MVC와 템플릿 엔진

가장 많이 사용하는 방식으로 server에서 HTML을 변형해 view로 내려주는 방식

  • MVC(Model-View-Controller): model, template engine 화면(view), controller
  • 템플릿 엔진: HTML을 server에서 프로그래밍해서 동적으로 바꿔서 내려주는 방식, ex.과거 JSP, PHP

🔗 API

JSON 이라는 데이터 포맷으로 client에게 데이터 전달

  • API로 데이터만 내려주면 화면은 client가 알아서 그려야 하며 server 사이의 통신에도 사용

📌 정적 컨텐츠

  • 스프링 부트는 정적 컨텐츠 기능 자동으로 제공

1. 코드 작성

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>

2. 실행

localhost:8080/hello-static.html

3. 원리

  1. 웹브라우저에서 localhost:8080/hello-static.html이 내장 톰캣 서버에 요청
  2. 톰캣이 스프링 컨테이너에 전달
    ㄴ 스프링은 controller에 hello-static이 있는지 탐색
  3. controller에 없을 경우, resources/static/hello-static.html 탐색
  4. resources에 존재할 경우 client에 반환

📌 MVC와 템플릿 엔진

  • MVC: Model, View, Controller
    model과 controller: business logic과 관련, 내부적인 일 처리에 집중
    view: 화면 그림
    -템플릿 엔진을 모델,뷰,컨트롤러 방식으로 쪼개서 뷰를 템플릿 엔진으로 HTML을 프로그래밍하여 rendering, rendering된 HTML을 client에게 전달

1. 코드 작성

  • java/hello.hellospring/controller/HelloController에 코드 추가
@GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model) {
        model.addAttribute("name", name);
        return "hello-template";
    }

2. 실행

RequestParam의 required 기본값이 true이므로 웹브라우저에서 열 때 name이 존재해야함
=> localhost:8080/hello-mvc?name=spring!
이 때 ?는 HTTP get 방식
ㄴ required=false로 설정하면 name 없어도 됨

3. 원리

  1. 웹브라우저에서 localhost:8080/hello-mvc?name=spring! 검색
  2. 내장 톰캣 서버에서 스프링 컨테이너로 전달
  3. 스프링 helloController에 hello-mvc에 mapping 되어있음
    ㄴmodel에 담겨 name이 모두 spring!으로 변함
    ㄴreturn으로 hello-template 넘김
  4. vierResolver가 view를 찾아주고 template engine 연결
    ㄴ templates/hello-template.html 찾고 thymeleaf 템플릿 엔진에 처리해달라고 넘김
  5. thymeleaf 템플릿 엔진이 rendering해 변환된 HTML을 웹브라우저로 넘김
  • 출력된 웹브라우저 가서 우클릭 후 페이지 소스 보기 누르면 변환된 내용이 넘어간 것을 알 수 있음
    => view를 찾아서 template engine을 통해 화면 rendering해 HTML을 browser에 넘기는 방식

*thymeleaf template의 장점은 html 파일을 작성한 후 server 없이 바로 열 수 있음. template engine으로 동작하지 않을 경우

사이의 문자 출력되고, template engine으로 동작하면 th:text에 해당하는 문자로 치환.
사이의 문자 나옴
EX. template engine으로 동작하지 않을 경우(server 사용하지 않음) hello empty 출력, 동작할 경우(server 사용) hello (name) 출력

<p th:text="'hello '+ ${name}">hello empty</p>
  • 단축키
    ctrl+p : parameter 정보 보기

📌 API_#1

  • MVC는 HTML을 내리는 방식, API는 data를 내리는 방식
  • 일반적인 API방식은 객체를 반환하는것으로 HttpMessageConverter를 통해 JSON으로 바꿔 반환(view 없이 바로 HTTP response에 값 넣어 반환)

1. 코드 작성

-java/hello.hellospring/controller/HelloController에 코드 추가

@GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name) {
        return "hello " + name;
    }

2. 실행

localhost:8080/hello-string?name=spring!

  • @ResponseBody는 HTML body가 아니라 HTTP의 body부를 직접 넣을 것을 의미

  • MVC와 다른 점은 hello + (name) 문자가 client로 view 없이 그대로 내려간다는 것
    1) MVC

    2) API

📌 API_#2

  • 문자가 아닌 data 달라고 할 경우

1. 코드 작성

-java/hello.hellospring/controller/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;
    }
}
  • public Hello => 객체 Hello 생성
  • 꺼낼 때는 getName() 넣을 때는 setName()

2. 실행

localhost:8080/hello-api?name=spring!


위 사진은 JSON 방식: key-value로 이루어진 구조

  • 사실 HTML 태그가 XML 방식. ex.


    XML 방식은 태그를 두번 써야하고 무거움, 반면에 JSON은 단순. 따라서 요즘 JSON 방식으로 통일됨

3. @ResponseBody 사용 원리

  1. 웹브라우저에서 localhost:8080/hello-api?name=spring! 검색
  2. 내장 톰캣 서버에서 스프링 컨테이너로 전달
  3. helloController에서 hello-api 찾음
    ㄴ @ResponseBody를 보고 HTTP 응답에 그대로 data 넘겨야겠다고 생각
    ㄴreturn 값이 객체면 기본값은 data를 JSON 방식으로 만들어서 HTTP 응답에 반환하겠다고 생각
  4. HttpMessageConverter가 동작
    ㄴ기존에는 viewResolver가 동작했지만 @ResponseBody가 있을 경우 HttpMessageConverter 동작
    (return 값이 문자일 경우 StringConverter, 객체일 경우 JsonConverter 동작)
    ㄴ객체가 return 되었으므로 JsonConverter가 동작하면서 객체를 JSON 스타일로 바꿈
  5. 바꾼 결과를 HTTP body에 실어 보내어 웹브라우저에 {name:spring!}넘김
static class Hello {
	private String name;

    public String getName() {
        return name;
    }

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

*위코드사용 alt+insert => getter, setter 생성
getter와 setter는 Javabean 표준 방식(=property 접근방식)
name은 private이라 외부에서 바로 못 꺼냄. 라이브러리에서 쓰거나 사용할 때 getName, setName 등의 메소드를 이용해 사용

*@ResponseBody사용
-HTTP의 BODY에 문자내용 직접 반환
-viewResolver 대신 HttpMessageConverter 동작
-기본문자처리: StringHttpMessageConverter(JSON형식으로 바꿔줌)
-기본객체처리: MappingJackson2HttpMessageConverter(JSON형식으로 바꿔줌)
-byte 처리 등 여러 HttpMessageConverter가 기본으로 존재

*참고
client의 HTTP Accept 해더와 서버의 컨트롤러 반환 타입 정보를 조합해서 HttpMessageConverter가 선택되지만, 요즘은 거의 JSON

0개의 댓글