twocowsong

@RestController @Controller 본문

IT/SpringBoot

@RestController @Controller

WsCode 2022. 1. 24. 21:50
@Slf4j
@Controller
public class Test1Controller {
	
	@GetMapping("/main")
	public String init() {
		return "/index";
	}
	
}

단순 컨트롤러입니다. @Controller로 해당 클래스를 등록해야지 Url을 맵핑이 원할하게 작동됩니다.

그렇지만 우리는 일반 컨트롤러와 API컨트롤러를 분리하여 작업하기도 합니다.

 

일반 컨트롤러와 API컨트롤러의 가장 큰차이점은 리턴 방식이 다르다는것!

 

HTML 화면이 리턴된 상황

 

일반컨트롤러는 viewresolver에 의해 html페이지가 리턴되어버립니다.

 

 

@Slf4j
@RestController
public class Test1Controller {

	@GetMapping("/main")
	public String init() {
		return "/index";
	}

}

 

하지만 restController는 문자열 자체를 내린다거나 객체로 리턴을하게되면 json방식으로 데이터를 내려줍니다.

 

문자열 /index가 리턴된 상황

 

@RestController를 자세하게 보면 아래와 같습니다.

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

인터페이스로 구현된 RestController.

@Controller, @ResponseBody를 같이 사용하여 RestController를 구현하고있습니다.

@ResponseBody는 메소드에서도 사용이가능하며 아래와같이 일반 Controller에서 메소드마다 @ResponseBody를 사용하여 문자열 자체를 내릴수있습니다.

 

@Slf4j
@Controller
public class Test1Controller {

	@GetMapping("/main")
	@ResponseBody
	public String init() {
		return "/index";
	}

}

@ResponseBody를 사용한 상황

@RestController는 @Controller + @ResponseBody 이다 라고 생각해주시면됩니다.

 


여담 )

@Slf4j
@Controller
public class Test1Controller {

	@GetMapping("/main")
	@ResponseBody
	public Dto init() {
		Dto dto = new Dto();
		dto.setValue1("A");
		dto.setValue2("B");
		return dto;
	}

}

객체를 생성해서 내리면 아래와같이 스프링이 알아서 JSON으로 잘포장해줍니다.. 참편하죠?

'IT > SpringBoot' 카테고리의 다른 글

Spring Boot AOP  (0) 2022.03.22
Environment  (0) 2022.02.02
@Scheduled  (0) 2022.01.23
Redirect, forward, RedirectAttributes  (0) 2022.01.23
@ModelAttribute, @PathVariable, @RequestBody  (0) 2022.01.18