프로젝트/게시판 프로젝트

RestController에서 클라이언트에게 어떤 값을 반환해야 할까?

Junuuu 2022. 5. 5. 03:41
반응형

Spring Boot를 활용하여 REST API를 만들던 도중 클라이언트에게 값을 반환하는 방법은 어떤 것들이 존재하며 어떤 값을 반환해야 할지 정리하면 좋을 것 같아 해보려고 합니다.

 

우선 반환하는 방법들에는 어떤것들이 존재할까요?

1. String반환(단순 문자열)

@RestController
public class testController{

	@RequestMapping("/test")
	public String test1(){
		return "test";
	}

}

문자열 데이터는 기본적으로 text/html 타입을 처리됩니다.

"test"라는 메시지가 HTTP ResponseBody에 직접 쓰이게 됩니다.

 

2. 객체 반환

@RestController
public class testController{
    
	@RequestMapping("/test")
	public Member test1(){    	
		Member member = new Member("김준우",26);
		return member;
	}

}

MessageConveter를 통해 application/json 형태로 반환됩니다.

{"name" : "김준우" , "age" : 26}

 

3. 객체 리스트 반환

@RestController
public class testController{
    
	@RequestMapping("/test")
	public List<Member> test1(){    	
		List<Member> list = new ArrayList<>();
        
		Member member1 = new Member("김준우",26);
		Member member2 = new Member("Dummy", 30);
        
		list.add(member1);
		list.add(member2);
        
		return list;
	}

}

[{"name" : "김준우" , "age" : 26} , {"name" : "Dummy" , "age" : 30}]

 

4. Map 반환

@RestController
public class testController{
    
	@RequestMapping("/test")
	public Map<String,Member> test1(){    	
		Map<String, Member> map = new HashMap<>();
        
		Member member1 = new Member("김준우",26);
		Member member2 = new Member("Dummy", 30);
        
		map.put("1", member1);
		map.put("2", member2);        		
        
		return map;
	}

}

{ "1" : {"name" : "김준우" , "age" : 26} , "2" : {"name" : "Dummy" , "age" : 30} }

 

5. ResponseEntity 반환

RestController는 별도의 View를 제공하지 않는 형태로 서비스를 실행합니다.

ResponseEntity는 개발자가 직접 결과 데이터와 HTTP 상태 코드를 직접 제어할 수 있는 클래스로 개발자는 404나 500 ERROR와 같은 HTTP 상태 코드를 전송하고 싶은 데이터와 함께 전송할 수 있기 때문에 좀 더 세밀한 제어를 할 수 있습니다.

@RestController
public class testController{
    
	@RequestMapping("/test")
	public ResponseEntity<Member> test1(){    			
        
		Member member1 = new Member("김준우",26);		        		        
		return new ResponseEntity<Member>(member1, HttpStatus.OK);
	}

}

 

또한 여기에는 다음과 같이 사용자 지정 상태 코드, 헤더 및 본문을 제공할 수 있습니다.

@RestController
public class testController{
    
	@RequestMapping("/test")
	public ResponseEntity<Member> test1(){    			
		MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
		Member member1 = new Member("김준우",26);		        		        
		headers.add("test", "hello world!!!!");
		return new ResponseEntity<Member>(member1, headers, HttpStatus.OK);
	}

}

반환값

Status : 200 OK

test : hello world!!!!
Content-Type : application/json;charset=UTF-8

...


{
    "name": "김준우",
    "age": "26"    
}

 

 

6. @ResponseStatus 어노테이션 활용

반환되어야 하는 상태 코드 및 이유 메시지로 메서드 또는 예외 클래스를 표시할 수 있습니다.

@RestController
public class testController{
    
	@ResponseStatus(value = "HttpStatus.OK")
	@RequestMapping("/test")
	public Member test1(){		
		Member member = new Member("김준우",26);		        		        		
		return member;
	}

}

가독성이 조금 좋아 보이는 것 같습니다.

하지만 커스텀 Header 정의도 불가능하며 ResponseEntity클래스처럼 유연하지 않습니다.

value를 설정하지 않으면 default는 500입니다.

보통 Exception에 많이 활용됩니다.

공통점

HTTP 응답 데이터(body)에 값이 쓰여서 클라이언트에게 전달됩니다.

 

 

원리

@ResponseBody의 역할

HttpMessageConverter를 통해서 응답 값을 자동으로 json으로 직렬화 한 뒤 응답해주는 역할을 수행합니다.

 

 

 

 

출처

https://wondongho.tistory.com/76

 

[SpringFramework] RESTful방식의 @RestController 와 @ResponseBody란?

몇달전 본인은 프로젝를 진행하면서  클래스를 하나를 Controller로 두고, Controller클래스 내에 view return하는 메소드, RESTful방식으로 return 하는 메소드를 짬뽕해서 사용했다. 결과적으로 이런방

wondongho.tistory.com

https://kkangdda.tistory.com/39

 

RESTful(4) - @RestController 사용하기 (단순문자열, 객체타입, List타입, Map타입)

@RestController → @Responsebody없이도 처리됨 (생략) @Controller와는 다르게 @RestController는 리턴값에 자동으로 @ResponseBody를 붙게되어 HTTP 응답데이터(body)에 자바 객체가 매핑되어 전달 된다고 한다..

kkangdda.tistory.com

https://programmertoday.com/spring-responseentity-responsebody-resonsestatus/

 

Spring ResponseEntity, ResponseBody, ResonseStatus - ProgrammerToday

Spring ResponseEntity represents an HTTP response, including headers, body, and status. While @ResponseBody returns the value with response body.

programmertoday.com