본문 바로가기
Spring

스프링 웹 개발 기초

by 토니짱 2022. 9. 25.

정적 컨텐츠

서버에서 어떠한 작업 없이 파일을 그냥 내려주는 것

웹브라우저에서 localhost:8080/hello-static.html라고 요청이 왔다.

톰캣 서버가 이러한 요청이 왔다고 스프링에게 전달한다.

스프링은 컨테이너에 hello-static이라는 컨트롤러가 있는지 찾아본다. (컨트롤러에 우선순위가 있음)

없으면 resources안에 요청파일을 찾아서 반환한다.

 

MVC와 템플릿 엔진

html을 서버에서 무언가를 동적으로 바꿔서 내려주기 위해 MVC 패턴으로 개발하는 것을 뜻함.

Model, View, Controller

@Controller
public class HelloController {
	@GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model){
    	model.addAttribute("name",name);
     	return "hello-template";
    }
}
<html xmlns:th="http://www.thymeleaf.org"> 
<body>
<p th:text="'hello ' + ${name}">hello! empty</p> 
</body>
</html>

웹 브라우저가 /hello-mvc를 던지면 내장 톰캣 서버가 스프링에 던진다.

스프링은 hello-mvc가 매핑된 컨트롤러의 메서드로 연결한다.

메서드 로직에 따라 넘어온 name은 모델에 담겨 hello-template를 리턴한다.

뷰를 찾아서 템플릿을 연결해주는 viewResolver가 리턴한 문자열과 같은 이름의 파일을 찾아서 넘겨준다.

thymeleaf 템플릿 엔진은 html로 변환하여 웹 브라우저에 반환한다.

 

API

  • json이라는 데이터 포맷으로 클라이언트에게 전달하는 것
  • 데이터를 내려주면 프론트에서 알아서 보여준다.

ResponseBody

@Controller
public class HelloController {
  @GetMapping("hello-string")
  @ResponseBody  //응답부 바디에 직접 넣어준다.
  public String helloString(@RequestParam("name") String name) {
    return "hello " + name;
  }
}

http에서 response의 body영역에 직접 리턴값을 넣어주겠다는 의미이다.

view 없이 리턴 값 그대로 돌려준다.

 

JSON으로 반환

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

위처럼 getter,setter 방식으로 만들어서 private인 name에 바로 접근하지 않고 public 메서드로 접근하는 것을 '자바 빈 표준 방식' 혹은 '프로퍼티 접근 방식'이라고 한다.

웹브라우저에서 요청이 들어오면 톰캣이 스프링에 던진다.

-> 스프링은 hello-api라는 컨트롤러를 찾는다.

-> 찾은 컨트롤러에 @ResponseBody라는 애너테이션이 붙어있다.

->@ResponseBody가 없으면 원래 viewResolver에게 던지는데 이제는 http response를 그대로 넘긴다.

->근데 넘길 값이 String이 아니라 Hello라는 객체이니 json방식으로 만들기 위해 HttpMessageConverter가 동작한다.

(단순 String이라면 StringConverter , json이라면 JsonConverter가 동장)

->{"name":"tony"}처럼 객체로 반환한다.

 

 

정리

HttpMessageConverter 

StringHttpMessageConverter : 기본 문자 처리

MappingJackson2HttpMessageConverter : 기본 객체 처리, json으로 반환해주는 라이브러리

어떤 컨버터가 선택될지는 클라이언트의 HTTP Accept 헤더와 서버 컨트롤러의 반환 타입 정보를 조합하여 선택한다.

 

@ResponseBody

http의 body에 문자 내용을 직접 반환한다.

반응형

'Spring' 카테고리의 다른 글

@Component와 @Configuration  (0) 2022.09.25
스프링 빈과 의존 관계  (2) 2022.09.25
사용중인 포트 죽이기  (1) 2022.09.24
Spring과 Spring Boot  (0) 2022.09.02
좋은 객체 지향 설계의 5가지 원칙(SOLID)  (0) 2022.08.24