본문 바로가기

SpringBoot

[Spring Boot] 스프링 웹 개발 방법 3가지

 

 

스프링 웹 개발하는 방법은 크게 3가지가 있다. 

 

1. 정적 컨텐츠 

html 파일을 가공없이 웹 브라우저에 그대로 전달해서 실행하는 것. 

resource/static 폴더에 저장하여 사용한다. 

 

예시

<!DOCTYPE HTML>
<html>
<head>
  <title>Hello</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 예시!
</body>
</html>

resources/static/hello-static.html

위치에 간단한 정적 컨텐츠 예시 파일을 만들어줬다. 

 

웹 브라우저에 해당 파일로 접근하게되면,

코드에 적어둔 그대로 화면에 출력되는 것을 확인 할 수 있다. 

 

#정적 컨텐츠의 동작 원리 

정적 컨텐츠의 동작 원리

웹 브라우저에 정적 컨텐츠 주소로 접근하게 되면, 내장 톰켓 서버가 요청을 받아 스프링 컨테이너에 넘기게 된다.

그 다음 스프링 컨테이너에 해당 파일과 관련된 컨트롤러가 있는지 찾는다. 

만약 해당 컨트롤러가 존재하지 않는다면 resources의 static 폴더에서 해당 정적 컨텐츠를 찾고,

파일이 존재한다면 정적 컨텐츠의 html파일을 찾아서 반환 한다.  

 

2. MVC(Model View Controller)와 템플릿 엔진

요즘 많이 개발하는 방식이다!

 

MVC(Model View Controller)

- MVC란 Model View Controller의 약자로 하나의 애플리케이션을 세 가지 역할로 구분한 개발 방법론이다.  

 

각 컴포넌트의 역할

Model : 비즈니스 로직 및 내부적인 것을 통제하고 처리하기 위한 역할

View :  무엇을 보여줄 것 인지 화면을 그리는데 집중하는 역할 

Controller : Model과 View 사이에 있는 컴포넌트로 Model과 View를 제어하는 역할

                   Model이 데이터를 어떻게 처리할지 알려주는 역할 

 

 

MVC 패턴의 장점

비즈니스 로직과 프리젠테이션 로직이 분리되어있어, 디자이너와 개발자들이 각자의 영역에 집중할 수 있다. 

 

템플릿 엔진

- 지정된 템플릿 양식과 데이터가 합쳐져 HTML 문서를 출력하는 소프트웨어 또는 소프트웨어 컴포넌트 

- html같은 것을 서버에서 프로그래밍해서 html을동적으로 바꿔서 서버에 전달해서 실행하는것.

 

# MVC와 템플릿 엔진 예시 

Controller

Controller에서 외부에서 파리미터 값(name)을 받아 View(hello-template.html)에 넘길 수 있게 하였다.

파라미터를 받아오기 위해 @RequestRaram을 사용하였다. @RequestRaram(실제 값을 표시)

 

Veiw

resources/templates/hello-template.html

이렇게 까지만하고 웹 브라우저에 다시 실행해보자

 

그럼 이렇게 오류 페이지가 뜬다.

콘솔창에 에러 로그를 확인해 보자!

2022-12-21 02:01:36.770  WARN 6480 --- [nio-8080-exec-9] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'name' for method parameter type String is not present]

이유는 파라미터 값이 없어 받아오지 못하였기 때문이다.

 

RequestParam 값이 null일때 예외처리하는 방법
required 옵션 사용
required = true (default가 true)
required = false라면 값을 안넘겨도 됌 (spring이 해당 argument를 무시한다는 의미)

 

* 웹브라우저에서의 ?는 http의 get방식으로 파라미터 값을 넘긴다는 의미 

 

웹 브라우저에 param이라는 값을 넘겨보았더니 hello param이라고 값이 잘 들어왔다!

 

#MVC와 템플릿 엔진의 동작원리 

MVC와 템플릿 엔진의 동작원리

웹 브라우저에서 해당 주소로 접근하면 내장 톰켓 서버를 거치게된다. 내장 톰켓 서버는 스프링 컨테이너에게 hello-mvc의 정보를 주게된다.

스프링 컨테이너는 hello-mvc에 관한 메소드가 담긴 Controller를 찾게되고, 해당 Controller를 찾게되면 매핑되어있는 메소드를 호출 시켜준다.

이때 model에 담겨있는 파라미터 값을 확인하여 spring에 넘겨준다.

그러면 spring은 viewResolver에게 값을 넘겨주고,

viewResolver가 templates에 return의 string name 값인 hello-template을 값을 찾아서 Thymeleaf 템플릿 엔진에게 화면을 처리해달라고 부탁한다. 

그러면 Thymeleaf 템플릿 엔진이 렌더링을하여 웹 브라우저에 반환을 한다. (동적일 때만 렌더링을 한다. 정적은 렌더링 하지 않고 바로 표시)

 

 

 

3. API

 

정적 컨텐츠만 제외하면 딱 2가지만 기억하면 됌

1) html로 서버에 내리기 
2) API 방식으로 데이터를 바로 내리기 

 

#API 방식 예제

첫 번째, 문자로 하는 방식(String 방식)

Controller

@ResponseBody

@ResponseBody를 사용하였기 때문에 뷰 리졸버를 사용하지 않는다. 

대신에 HTTP의 body부에 직접 데이터를 넣어주겠다.라는 의미

(return "hello"+name; <- 이 부분)

* 여기서 body는 HTML <body/> 태그가 아니라 HTTP 구조에서 헤더(header)와 본문(Body)을 의미한다. 

 

 

웹 브라우저에 실행해보자!

 

페이지 소스를 보면 HTML 태그가 하나도 없고,

Controller에서 적은 데이터를 그대로 내려주는 것을 확인 할 수 있다. 

 

두 번째, 객체 반환 방식

데이터를 넘겨줘야하는 상황 때문에 API방식을 사용한다. 

 

Controller

static 클래스로 만들면 클래스 안에서 이 클래스를 다시 사용가능함 (자바 문법)

 

웹브라우저에 실행해 보자!

소스보기를 해보면 JSON 방식({"Key":"Value"})으로 출력되는걸 확인해볼 수 있다. 

@ResponsBody를 사용하고, 객체를 반환하면 객체가 JSON으로 변환된다. 

 

+ 예전에는 xml방식도 많이 썼지만, 요즘에는 모두 JSON으로 반환하는 추세!

 

#API(@ResponseBody) 동작원리 

웹 브라우저에서 해당 주소로 접근하면 내장 톰켓 서버를 거치고, 톰켓은 이 정보를 스프링 컨테이너에 전달한다. 스프링은 해당 주소와 관련된 메소드를 찾는다.
해당 메소드를 찾았으나 사진과 같이 @ResponseBody가 사용된 것을 보면 HTTP 응답에 이 데이터를 그대로 보낸다.(문자일 때는 여기서 끝) 하지만 객체일 경우 default값인 JSON방식으로 데이터를 만들어서 HTTP응답에 반환한다. 
(@ResponseBody가 사용되지 않았다면 뷰 리졸버에게 보내진다.)

@ResponseBody가 있으면 ViewResolver가 아닌 HttpMessageConvert가 동작한다. 
기본 문자처리 : StringConverter
기본 객체처리 : MappingJackson2HttpMessageConverter
처리가 끝나면 요청한 데이터를 웹 브라우저에 다시 전달한다.