[Spring] Spring MVC 컨트롤러 메서드 : 왜, @RequestMapping, @Controller, @Responsebody를 쓰는지?

민지·2024년 1월 14일
0
post-custom-banner

Spring MVC 컨트롤러의 기본

Spring MVC 프레임워크는 특히 어플리케이션과 REST API의 빌드 과정을 simplify하기 위해 만들어졌다.

이번 포스팅에서는 Spring MVC의 프레임워크의 기본적인 사용법을 익히기 위해 @Controller, @RequestMapping, @ResponseBody와 같은 어노테이션을 익혀보겠다.

배운 내용

  • web request와 method를 mapping하는 @RequestMapping
  • 특히 웹 request 관련으로, @Component의 specialization ver : @Controller
  • Http response body에 메서드의 리턴값을 bound시키는, @ResponseBody

실습 과정

"/say-hello"라는 url로 들어가면, 화면에 "Hello, what are you learning today?"와 같은 메세지가 뜨도록 하는 간단한 실습을 해보았다. (참고로 localhost:8080/say-hello url에서 실습을 했다)

@RequestMapping을 왜 쓸까?


사진에서도 알 수 있듯이 Spring MVC에서 제공하는 어노테이션 중 하나인 @RequestMappingweb 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에러가 떴다. 페이지를 찾을 수 없다는 것이다.

첫번째 문제 원인과 @Controller

위 에러의 문제 원인을 생각해보자.
Spring프레임워크는 기본적으로 해당 클래스가 Spring Bean임을 알려줘야, 스프링이 해당 객체를 관리해줘서, /say-Hello의 페이지를 찾을 수 있게 된다.

Spring MVC프레임워크를 쓰기 전 Spring을 쓸 때는, 스프링 객체로 지정할 때 @Component 어노테이션을 구분없이 썼다.
하지만 이번에는 특별히 웹 request를 처리하는, 웹 UI 관련 component인 @Controller를 사용했다.

web controller인 @Controller 정의를 통해 알게 된 사실을 정리해보자.

  • @Component의 specialization버전 : Spring이 classpath scanning을 할 때 해당 클래스를 찾을 수 있도록, component 등록을 했다.
  • 특히 웹 요청을 처리할 때 쓰인다.
@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를 붙인 코드 수정 결과,

또 에러가 났다.. 🙃

두 번째 문제 원인과 @ResponseBody (부제 : Spring MVC의 작동원리)

Spring MVC 작동원리

두 번째 문제의 원인을 이해하려면, Spring MVC의 작동원리를 먼저 이해해야 한다.

Spring MVC는 @Controller의 메서드가 문자열을 리턴한다면, 문자열을 직접 반환하는 것이 아니라, 해당 문자열의 이름으로 된 view를 검색한다. (뷰의 개념은 해당 시리즈의 세 번째 포스팅에서 정리한다.)

하지만 이번 포스팅의 목적은 뷰를 만들어, @Component클래스 메서드의 리턴값인 뷰를 찾는 게 아니다. 메서드의 리턴값인 문자열 그 자체를 브라우저에 띄우고 싶다. 이때 쓰는 어노테이션이 @ResponseBody 어노테이션이다.

@ResponseBody 어노테이션은 이름에서도 알 수 있듯이, 메서드의 리턴값을 web의 response body부분에 bind시킨다.

@RequestMapping - @Controller - @ResponseBody 흐름 정리

즉, 클라이언트가 '/say-hello' url에 접속하면,

  • Http request가 웹 서버에 보내지며
  • @RequestMapping에 의해 '/say-hello' url과 결합된 메서드가 실행된다.

서버에서는

  • 웹 서버에서는 Spring MVC가 @Controller로 관리할 인스턴스를 detect하고,
  • @ResponseBody를 통해 메서드의 리턴값인 문자열을 web의 Http responsebody에 붙여준다.
  • 그러면, 브라우저 화면에서는 http response body의 문자열 그 자체가 화면에 보여지게 된다.

최종 코드 및 결과

@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/

profile
배운 내용을 바로바로 기록하자!
post-custom-banner

0개의 댓글