Java/Spring

@ResponseBody

무르뇌 2022. 11. 3. 18:03

@ResponseBody는 HTTP body 부분의 데이터, 즉 JSON으로 넘어온 객체의 데이터라던지, 아니면 직접 페이지로 출력할 수 있다.

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

결과

 

다음은 객체로 넘어온 데이터를 반환한다.

 @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name) {
    	Hello hello = new Hello();
    	hello.setName(name);
    	return hello;
    }
    
    @Getter @Setter
    static class Hello{
    	private String name;
    }

결과는 다음과 같다.

 

위 출력물과 아래 출력물의 다른 점은 Responsebody의 동작 차이이다.

 

위 첫번째 코드에서의 ResponseBody의 경우 return 부분에 "hello " + name을 반환했다. 메소드의 반환 타입도 String이다.

 

이렇게 반환 타입이 String일 경우 ResponseBody는 StringConverter로 동작하여 문자열 '그대로' 반환하게 되는 것이다.

 

두번째의 경우는 위와 다르다. 메소드 반환 타입 자체가 클래스(클래스도 타입이다)로 주어졌다.

 

아래 이너 클래스 Hello 클래스가 static으로 선언돼있음을 확인하자.

 

이렇게 Hello 타입의 hello 객체를 생성해주고 setter를 사용하여 @RequestParam으로 "name"의 값을 Hello 객체의 name에 던져주면 생성된 hello 객체의 name은 url의 name="데이터값"으로 할당된다.

 

이후 return 으로 객체를 반환하게 되면?

 

이럴 경우엔 ResponseBody는 JsonConverter로써 동작하게 된다. 두번째 코드의 결과를 보듯이 JSON으로 변환되어 결과가 나온 것을 확인할 수 있다.

 

중요한건 ResponseBody는 http body 부분의 내용을 갖고 온다는 점을 잊지 말자.