본문 바로가기

Spring Boot(스프링 부트)

Spring Boot(스프링 부트) > 스프링 웹 개발(정적 컨텐츠, MVC와 템플릿 엔진, API)

스프링에서 웹 개발을 할 수 있는 방법은 크게 3가지가 있다.

 

1. 정적 컨텐츠

2. MVC와 템플릿 엔진

3. API

 

이 3가지 방식 중 정적 컨텐츠 제외하고 실무에서 나머지 2, 3번이 많이 쓰인다고 한다!

 

1. 정적 컨텐츠

 

정적 컨텐츠는 html 파일을 그대로 읽어와 웹에 뿌려주는 컨텐츠이다.

예시 방법은 다음과 같다.

 

hello-spring(프로젝트 이름) -> src -> main -> 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>

 

그런 후 build를 해주게 되면

http://localhost:8080/hello-static.html 를 주소 창에 검색하게 되면 위에 코드로 작성한 html 파일이 그대로 띄워지게 된다.

 

만약 매핑이 된 hello-static 관련 컨트롤러가 있으면 그것이 우선순위로 접근하게 되고, 없는 경우에 html 파일을 그대로 가져와서 읽는 것이라고 한다.

hello-spring -> src -> main -> java -> hello.hellospring -> controller -> HelloController 에서 코드로 @GetMapping()을 해주면 그것이 우선순위 첫 번째가 되는 것 같다.(이것이 나머지 방식인 거 같다)

 

실행 결과이다.

정적 컨텐츠

 

 

 

2. MVC와 템플릿 엔진

 

MVC는 Model View Controller의 약자이다.

가장 많이 하는 방식으로, html을 서버에서 프로그래밍을 해서(동적으로 바꿔서) 웹에 뿌려지는 템플릿 엔진 방식이다.

hello-spring -> src -> main -> java -> hello.hellospring -> controller -> HelloController에 들어가 다음 코드를 넣어준다.

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

http://localhost:8080/hello-mvc 에서 "name"의 키를 name으로 바꿔주는데, hello-template에서 반영하라는 말인 거 같다.

 

그러면 hello-template를 만들어야 하는데, 

hello-spring(프로젝트 이름) -> src -> main -> resources -> static 에서 hello-template.html 파일을 작성하고 내용을 다음과 같이 채워준다

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

강의에서 내가 첫 번째 스프링부트 포스팅에서 추측했던 th에 대해서 설명해주셨던 내용을 짚어주었다.

직접경로로 들어가면 껍데기로 보이게된다. 그리고 템플릿 엔진으로 접속하게 되면 th에 있는 내용을 출력하게 하는 것이다.

그리고 빌드 후 실행하게 되면...

기대와 다르게 오류가 나는 화면

이렇게 에러 페이지가 뜨게 된다.

그 이유는 키(name) 값이 지정이 안 되었기 때문인데 이는 주소 창에서 설정이 가능하다.

localhost:8080/hello-mvc?name=spring!!!!!!를 주소 창에 입력하게 되면 정상적으로

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

 

정상적으로 뜨는 것을 확인할 수 있다.

템플릿 엔진을 통해 html이 변환되어 웹을 보여주는 원리라고 할 수 있다.

 

 

3. API

API는 JSON이라는 데이터 포맷으로 client에게 데이터를 전달하는 방식이다.

 

hello-spring -> src -> main -> java -> hello.hellospring -> controller -> HelloController에서 다음 코드를 작성한다.

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

 

여기서 ResponseBody는 return 값을 직접 html 값으로 넣는다 라는 뜻으로 이해할 수 있다.

 

그렇게 되면

hello-string

언뜻 보기에 템플릿 엔진과 같은데? 라고 생각할 수 있지만

API 방식으로는 html 파일을 작성하지 않았다.

return 값 그대로 html 파일을 작성한 것이라고 생각하면 된다.

 

다음 코드도 작성해보자

@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;
   }
}

 

이것은 Hello라는 클래스를 만들고 name을 설정하고 불러오는 setName(), getName() 함수를 작성하였다.

그리고 객체를 만들어 name을 설정하고 그 객체의 값을 넘겨주었다.

 

그렇게 되면

localhost:8080/hello-api

위와 같은 화면이 뜨게 된다.

 

객체가 반환이 되었을 때 JSON 방식으로 데이터를 만들어서 html 화면을 띄워주겠다 라는 규칙이 있는 듯하다.

 

실무에서 api 객체 내용을 바꾸지 않고 이 방식 그대로 쓴다고 한다.

 

 

다양한 방법으로 웹 페이지를 작성해 보았다.

다양한 방법들이 있지만 api를 사용해서 html 값을 리턴하거나 객체를 리턴하는게 사용하기에 편리해 보였다.

앞으로 더 열심히 공부해야겠다!