[스프링 입문] 3일차 - 스프링 웹 개발 기초 (정적컨텐츠, MVC와 템플릿 엔진, API)

tdddt·2024년 2월 7일
0

스프링 입문

목록 보기
3/13

스프링 웹 개발 기초

  • 정적 컨텐츠 : HTML 파일을 그대로 웹 브라우저에 전달.
  • MVC와 템플릿 엔진 : 서버에서 HTML을 동적으로 바꿔서 전달. 파일 하나에 작성하는 방식(JSP,PHP)이 아니라 컨트롤러, 모델, 템플릿엔진(화면)으로 구분하는 모델뷰컨트롤러(MVC)방식이며, 요즘에는 이 방식을 주로 사용함.
  • API : 객체를 JSON이라는 데이터 구조 포맷으로 전환해 데이터 전달. 서버끼리 통신할 때도 사용함.

정적 컨텐츠

스프링부트는 정적 컨텐츠 기능을 자동으로 제공.
기본적으로 /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>

실행

localhost:8080/hello-static.html
(파일확장자 포함 파일명까지 적어야 함)

동작 과정

1) localhost:8080/hello-static.html

2) 톰캣 : hello-static이 입력되었다고 스프링한테 알려줌

3) 스프링 : 컨트롤러 쪽에서 hello-static 관련 컨트롤러가 있는지 찾아 봄

4) 컨트롤러가 없으므로, resources/static/hello-static.html 파일을 찾아 바로 반환



MVC와 템플릿 엔진

MVC : Model, View, Controller

💡 View와 Controller를 나눠 작성하는 방식

  • View : 화면을 그리는데 모든 역량을 집중.
  • Controller: 로직과 관련, 내부적인 걸 처리하는데 집중.
  • Model : 화면에 필요한 데이터를 담아가지고 화면에 전달.

과거에는 Controller와 View를 따로 분리하지 않고, View에 모든 걸 다 하는 Model1 방식으로 많이 개발했으나, 요새 개발 트렌드는 MVC방식.

실습 코드

main/java/hello.hellospring.controller/HelloController.class > helloMvc 메소드 추가

  • @RequestParam : 외부 파라미터 전달받음
@Controller
 public class HelloController {
     @GetMapping("hello-mvc")
     public String helloMvc(@RequestParam("name") String name, Model model) {
         model.addAttribute("name", name);
         return "hello-template";
     }
}

resources/templates/hello-template.html

  • +)Thymeleaf의 장점 : HTML을 그대로 쓰고 서버없이 그 파일을 열어봐도 껍데기를 볼 수 있음. 템플릿 엔진으로 동작하면 p태그 안에 적은 것들이 th문법으로 치환됨.
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>

실행

❗️Error

localhost:8080/hello-mvc

  • 오류 코드 : org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'name' for method parameter type String is not present
  • @RequestParam(value = "name", required=false) 로 설정하면 값을 넘기지 않아도 되지만, 디폴트가 required=true이기 때문에 지금은 값을 반드시 넘겨줘야 하는 상황

💡 해결방법

HTTP GET 방식으로 ?를 사용해 파라미터를 넘겨준다.

localhost:8080/hello-mvc?name=spring

동작 과정

1) localhost:8080/hello-mvc?name=spring

2) 톰캣 : hello-mvc이 입력되었다고 스프링한테 알려줌

3) 스프링 : helloController에 매핑되어 있으므로 메소드를 호출하고, 리턴 템플릿과 모델을 넘김

4) viewResolver : template를 찾고, Thymeleaf 템플릿 엔진에게 처리 요청

5) Thymeleaf 템플릿 엔진 : 렌더링을 해서 변환을 한 HTML을 웹브라우저에 반환 (정적일 때는 변환 x)




API

💡 과거에는 XML방식(HTML태그 사용)을 많이 썼는데 최근에는 거의 JSON 방식으로 통일. 스프링도 @ResponseBody+객체 반환 시, JSON으로 치환하도록 디폴트 세팅되어있음.

실습 코드

main/java/hello.hellospring.controller/HelloController.class > helloString 메소드 추가

  • @ResponseBody : viewResolver를 사용하지 않고, http 통신 프로토콜 중 바디부에 return값을 직접 반환. return 값(데이터 자체가)이 요청한 클라이언트에 그대로 내려감.
@Controller
 public class HelloController {
     @GetMapping("hello-string")
     @ResponseBody
     public String helloString(@RequestParam("name") String name) {
         return "hello " + name;
     }
}

main/java/hello.hellospring.controller/HelloController.class > 객체 생성을 위해 static 클래스 Hello 생성 및 helloApi 추가

  • Hello 클래스 추가 및 helloApi에 객체 생성
  • JavaBean 규약 : Getter / Setter(JavaBeen표준방식, property접근방식), private 변수에 직접 접근하지 않고, Getter와 Setter 메소드를 활용해서 접근함.
  • cmd + N : Getter and Setter 생성
  • cmd + shift + enter : 자동 줄바꿈 및 ; 처리
@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;
		} 
	}
}

실행

localhost:8080/hello-api?name=spring

동작과정

1) localhost:8080/hello-api?name=spring

2) 톰캣 : hello-api가 입력되었다고 스프링한테 알려줌

3) 스프링 : helloController에서 hello-api 메소드를 찾음. 메소드에 @responseBody가 없으면 viewResolver한테, 있으면 HTTP응답에 데이터를 넣어 동작. 문자가 아니고 객체라면 JSON방식으로 데이터를 만들어서 응답에 반환하는 게 기본 정책.

@ResponseBody : HTTP의 BODY에 문자 내용을 직접 반환, ㄴviewResolver 대신에 HttpMessageConverter 가 동작

4) HttpMessageConverter 동작 : 단순 문자라면 StringConverter가, 객체라면 JsonConverter(객체를 JSON으로 바꿔주는 유명한 라이브러리 : Jackson(스프링에서 기본적으로 탑재), Gson(구글) 등)가 동작.

HttpMessageConverter

  • 기본 문자처리: StringHttpMessageConverter
  • 기본 객체처리: MappingJackson2HttpMessageConverter
  • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있고, 실무에서도 거의 손대지 않고 기본 세팅으로 사용

마무리 정리

💡 정적 컨텐츠를 제외하면, 서버-클라이언트 전달 방식은 크게 2가지 :

  • MVC : HTML로 전달, MVC로 나눠서 작성
  • API : 객체 반환, 데이터로 전달

0개의 댓글