삽질블로그

스프링 기초 본문

자바스프링

스프링 기초

삽질블로그 2022. 9. 19. 16:46

스프링은 크게 세 가지로 구분된다.

1. 정적 컨텐츠

2. 스프링 MVC와 템플릿 엔진

3. API

 

1. 정적 컨텐츠란

쉽게말해서 정적인 페이지를 보여준다.

그냥 정보성 페이지를 전달하기 위해 만들 때 사용하는 것 같다.

프론트 코드 작성은 스프링 프로젝트 안의 resources/static/   의 경로에서 한다.

정적컨텐츠는 관련 컨트롤러가 없기 때문에 요청이 들어온다면

스프링에서 바로 웹 브라우저로 페이지를 응답해준다.

 

2.  스프링 MVC와 템플릿 엔진이란(model, view, controller)

모델과 뷰 컨트롤러를 각각 분리해서 사용을 한다.

Controller에선 @Controller 어노테이션을 사용해줘야 한다.

@Controller 어노테이션은 해당 클래스를 컨테이너에 Bean으로 등록해주며 Controller로 사용된다는 것을 알려준다.

 

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

GetMapping을 통해 localhost:8080/hello-mvc 요청이 들어오면 아래 함수를 실행해준다고 생각하면 된다.

@RequestParam 어노테이션을 통해 외부에서 파라미터를 받으며, Model을 통해 model 객체를 만든다.(스프링에서 만들어줌)

model.addAttribute을 통해 key value 형식을 만들어준다.

model.addAttribute("name", name); 에서 "name"이 key, name이 value값이다.

Controller에서 "hello-template"를 리턴 시키면 스프링에서 viewResolver가 동작을 하는데,

viewResolver는 view를 찾아주고 템플릿 엔진을 연결시켜주는 역할을 한다.

따라서 viewResolver가 template/hello-template.html 파일을 찾아서 렌더링을 한 다음 변환을 해서 웹 브라우저로 넘긴다.

 

정적 컨텐츠와의 차이점은 변환에서 있다.

정적 컨텐츠는 말 그대로 화면을 보여주기만 하기 때문에 변환해서 보여주지 않지만

템플릿 엔진을 통한다면 viewResolver가 파일을 찾아서 렌더링을 한 다음 변환을 해서 웹 브라우저로 넘긴다.

 

3. API

마지막으로 API를 살펴보자

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

스프링에서 API를 사용하기 위해서는 @ResponseBody를 통해 데이터(Json 형식)를 전달하는 방식을 사용한다.

@GetMapping 밑에 @ResponseBody 어노테이션을 사용하기도 하지만,

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

찾아보니 @RestController(@Controller + @ResponseBody)로 묶어서 사용해도 된다고 한다.

위 코드는 스트링을 반환하는데, API에선 주로 데이터를 전달하기 때문에 스트링 값은 잘 사용하지 않고,

밑에 코드와 같이 데이터를 묶어서 전달한다고 한다.

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

API는

HTTP의 BODY에 문자 내용을 직접 반환

viewResolver 대신에 HttpMessageConverter 가 동작

기본 문자처리: StringHttpMessageConverter

기본 객체처리: MappingJackson2HttpMessageConverter

byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음

이런 특징들이 있다.

 

내가 정리하면서 느끼기에 템플릿 엔진과의 눈에 띄는 차이점은 viewResolver가 아닌  HttpMessageConverter를 사용하는 것 같다.

Jackson은 객체를 Json데이터로 변환해주는 대표적인 라이브러리이다.

구글에서 만든 Gson도 있다.

 

참고자료 : 인프런 - 스프링 입문 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

 

※ 틀리거나 이상한 부분이 있으면 댓글 달아주시면 감사하겠습니다. 

Comments