Super Kawaii Cute Cat Kaoani [스프링 입문] 2. 스프링 웹개발 기초

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

2024. 1. 20. 05:47
728x90
SMALL

📌 정적 컨텐츠 (static content)

파일을 그대로 web browser에 내려주는 방식
스프링 부트는 정적 컨텐츠 기능을 자동으로 제공해준다

resources/static/** 아래의 파일과 매핑된다

 

🔶 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. 스프링은 controller에 hello-static이 있는지 탐색
  3. controller에 없는 경우, resources/static/hello-static.html 탐색
  4. resources에 존재할 경우 client에 반환

 

 

 

📌 MVC와 템플릿 엔진

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

MVC(Model-View-Controller) : model, 템플릿 엔진 화면(view), controller

  • view : 화면을 그리는데 집중
  • model, controller : 비지니스 로직과 관련있으며 내부적인 일을 처리하는 데 집중

템플릿 엔진 : HTML을 server에서 프로그래밍해서 동적으로 바꿔서 내려주는 방식

➡ 과거 JSP, PHP

템플릿엔진을 model, view, controller 방식으로 쪼갠 후 view를 템플릿 엔진으로 HTML을 프로그래밍하여 렌더링하고
렌더링 된 html을 client에게 전달

 

 

🔶 java/hello/hellospring/controller/HelloController

@GetMapping("hello-mvc") 
    public String helloMvc(@RequestParam("name") String name, Model model) {
        model.addAttribute("name", name);
        return "hello-template";
    }
}

 

 

🔶 hello-templates.html

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

</html>

 

  • RequestParam의 required 기본값이 true이므로 웹브라우저에서 열 때 name이 존재해야한다.
    ➡ localhost:8080/hello-mvc?name=spring!

 

  • ?HTTP get 방식
    required=false로 설정하면 name 없어도 가능

 

thymeleaf template의 장점 ❗

 

HTML 파일을 server없이 바로 열 수 있다

<p th:text="'hello ' + ${name}">hello! empty</p>

 

템플릿 엔진으로 동작할 경우(server 사용): th:text에 해당하는 문자로 치환
템플릿 엔진으로 동작하지 않는 경우(server 사용x) : 사이의 문자(hello! empty)가 출력됨

 

📎 단축키
command + p : parameter 정보

 

✔ 원리

1) 웹 브라우저에서 localhost:8080/hello-mvc?name=spring! 검색
2) 내장 톰캣 서버가 스프링 컨테이너에 전달함
3) helloController에 mapping 되어 있다고 해당 메소드 호출
4) 반환해줄 때 이름을 hello-template으로 반환하며, 모델에 key = "name", value = "spring!"을 넘겨준다
5) viewResolver(화면과 관련된 해결자) : view를 찾아주고 템플릿 엔진을 연결시켜준다
viewResolvertemplates/hello-template.html을 찾아서 Thymeleaf 템플릿 엔진에게 처리를 요청한다
6) 템플릿 엔진이 렌더링해서 변환된 HTML을 웹 브라우저에 넘겨준다

 

반응형

 

 

📌 API

  •  MVC가 HTML을 내리는 방식이라면 API는 data를 내리는 방식
  •  JSON이라는 데이터 포맷으로 client에게 데이터를 전달해줌
  •  API로 데이터만 내려주면 화면을 client가 알아서 그려야하며, server 끼리의 통신에도 사용

 

🔶 java/hello/hellospring/controller/HelloController

@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
    return "hello " + name;
}
  • ResponseBody : HTTP의 body 부에 리턴 값을 직접 넣어주겠다는 뜻 (HTML에 나오는 body랑 다른 것임)
  • MVC와 다른 점 : hello + (name) 문자가 client로 view 없이 그대로 내려감

 

✔ MVC 소스코드

<html>
<body>
	<p>hello spring!</p>
</body>

 

✔ API

hello spring!

 

 

🔶 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
    } 
}

 

JSON 방식(key : value 구조)

 

✔ 과거에는 XML 방식도 주로 쓰였다

  • HTML 태그가 XML 방식
  • XML 방식은 태그를 두 번 써야하고 무겁다
  • JSON은 단순하다 (요즘 이 방식으로 통일)

 

✔  @ResponseBody 사용 원리

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

 

✔ @ResponseBody 사용

  • HTTP의 Body에 문자 내용을 직접 반환
  • viewReslover 대신 HttpMessageConverter가 동작
  • 기본 문자 처리 : StringHttpMessageConverter
  • 기본 객체 처리 : MappingJackson2HttpMessageConverter
  • byte 처리 등 여러 HttpMessageConverter가 기본으로 등록되어 있음

cf)
Client의 Http Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter가 선택됨
-> 하지만 요즘은 거의 JSON 사용

 

 

 

 

 

 

 

이 글은 <김영한_스프링 입문>을 수강하고 참고하여 작성한 글입니다

 

 

 

 

 

 

 


PREV

 

[스프링 입문] 1. 프로젝트 환경설정

📌 프로젝트 생성 방법 스프링 부트 스타터 사이트를 통해서 프로젝트 설정 Project : Gradle - Groovy Language : Java Spring Boot : 3.x.x -> 버전 옆에 SNAPSHOT OR M2 등이 써있는 것은 정식 버전이 아니다 -> 버전

nyeroni.tistory.com

 

NEXT

 

 

[스프링 입문] 3. 회원 관리 예제 - 백엔드 개발

📌 비지니스 요구사항 정리 데이터 : 회원ID, 이름 기능 : 회원 등록, 조회 아직 데이터 저장소가 선정되지 않았다는 가상의 시나리오 1. 일반적인 웹 애플리케이션 계층 구조 🔷 컨트롤러 : 웹 MV

nyeroni.tistory.com

 

728x90
LIST

BELATED ARTICLES

more