Spring MVC 프레임워크는 특히 웹 어플리케이션과 REST API의 빌드 과정을 simplify하기 위해 만들어졌다.
이번 포스팅에서는 Spring MVC의 프레임워크의 기본적인 사용법을 익히기 위해 @Controller, @RequestMapping, @ResponseBody와 같은 어노테이션을 익혀보겠다.
"/say-hello"라는 url로 들어가면, 화면에 "Hello, what are you learning today?"와 같은 메세지가 뜨도록 하는 간단한 실습을 해보았다. (참고로 localhost:8080/say-hello url에서 실습을 했다)
사진에서도 알 수 있듯이 Spring MVC에서 제공하는 어노테이션 중 하나인 @RequestMapping은 web requests랑 method를 mapping시켜주는 어노테이션이다. 즉 특정 url 경로에 해당하는 Http request가 들어왔을 때, 해당 메서드가 실행되게끔 한다.
public class SayHelloController {
// url : "say-hello" => return : "Hello, what are you learning today?"
@RequestMapping("/say-hello")
public String retriveString() {
String str = "hello, what are you learning today?";
return str;
}
}
하지만 위 코드의 실행결과,
404에러가 떴다. 페이지를 찾을 수 없다는 것이다.
위 에러의 문제 원인을 생각해보자.
Spring프레임워크는 기본적으로 해당 클래스가 Spring Bean임을 알려줘야, 스프링이 해당 객체를 관리해줘서, /say-Hello의 페이지를 찾을 수 있게 된다.
Spring MVC프레임워크를 쓰기 전 Spring을 쓸 때는, 스프링 객체로 지정할 때 @Component 어노테이션을 구분없이 썼다.
하지만 이번에는 특별히 웹 request를 처리하는, 웹 UI 관련 component인 @Controller를 사용했다.
web controller인 @Controller 정의를 통해 알게 된 사실을 정리해보자.
@Controller
public class SayHelloController {
// url : "say-hello" => return : "Hello, what are you learning today?"
@RequestMapping("/say-hello")
public String retriveString() {
String str = "hello, what are you learning today?";
return str;
}
}
@Controller를 붙인 코드 수정 결과,
또 에러가 났다.. 🙃
두 번째 문제의 원인을 이해하려면, Spring MVC의 작동원리를 먼저 이해해야 한다.
Spring MVC는 @Controller의 메서드가 문자열을 리턴한다면, 문자열을 직접 반환하는 것이 아니라, 해당 문자열의 이름으로 된 view를 검색한다. (뷰의 개념은 해당 시리즈의 세 번째 포스팅에서 정리한다.)
하지만 이번 포스팅의 목적은 뷰를 만들어, @Component클래스 메서드의 리턴값인 뷰를 찾는 게 아니다. 메서드의 리턴값인 문자열 그 자체를 브라우저에 띄우고 싶다. 이때 쓰는 어노테이션이 @ResponseBody 어노테이션이다.
@ResponseBody 어노테이션은 이름에서도 알 수 있듯이, 메서드의 리턴값을 web의 response body부분에 bind시킨다.
즉, 클라이언트가 '/say-hello' url에 접속하면,
서버에서는
@Controller
public class SayHelloController {
// url : "say-hello" => return : "Hello, what are you learning today?"
@RequestMapping("/say-hello")
@ResponseBody
public String retriveString() {
String str = "hello, what are you learning today?";
return str;
}
}
그 결과,
성공이다!
@RequestMapping - 해당 어노테이션을 통해 특정 url과 특정 메서드를 매핑시켰음을 알려준다. 특정 url경로에 해당하는 요청(request)가 들어왔을 때, 해당 메소드가 실행되게끔 지정한다.
@Controller - 세부화된 @Component로, 스프링에게 하여금 해당 클래스를 관리하라고 알려주되(classpath 검색 시 찾을 수 있게끔), 특히 웹 요청 관련된 사항에 잘 쓸 수 있게끔
@ResponseBody - 메서드가 리턴한 값 자체를 웹 브라우저에 리턴하는 어노테이션. Spring MVC에서 컨트롤러 메서드가 반환하는 값 자체를, 직접 HTTP response 본문(body)에 설정하도록 지정. 즉, 해당 어노테이션이 사용된 메서드가 반환하는 값은 뷰를 거치지 않고 직접 클라이언트로 전송됨. 이처럼, 뷰를 통하지 않고, 직접 데이터로 클라이언트를 전송할 때 사용한다!
이 시리즈는 Udemy 강의의 내용을 정리한 것입니다.
https://www.udemy.com/course/spring-boot-and-spring-framework-korean/