본문 바로가기

BackEnd/Spring

[코드로 배우는 스프링 웹 프로젝트] ch16 REST 방식으로 전환 2(JSON, XML, 객체 반환, ResponseEntity)

728x90
반응형

https://bobo12.tistory.com/314

 

(2) 객체의 반환

   ▷ JSON, XML을 이용함

 

◎ src/main/java/org.codehows.domain → SampleVO 클래스 생성

package org.codehows.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class SampleVO {
	private Integer mno;
	private String firstName;
	private String lastName;
}


비어 있는 생성자를 만들기 위한 @NoArgsConstructor, 모든 속성을 사용하는 생성자를 위한 @AllArgsConstructor

 

src/main/java/org.codehows.controller → SampleController 클래스 수정

   ▷ SampleVO를 리턴하는 메소드 설계

...(생략)...

@GetMapping(value = "/getSample", 
		produces = {MediaType.APPLICATION_JSON_UTF8_VALUE,
				MediaType.APPLICATION_XML_VALUE })
public SampleVO getSample() {
	
	return new SampleVO(112, "스타", "로드");
}

...(생략)...


getSample()은 XML과 JSON 방식의 데이터를 생성할 수 있도록 작성 됨

▷ http://localhost:8080/sample/getSample

위 주소를 입력하면 아래와 같은 결과가 출력됩니다.


 http://localhost:8080/sample/getSample.json

위 주소를 입력하면 아래와 같은 결과가 출력됩니다.


@GetMapping이나 @RequestMapping의 produces 속성은 반드시 지정해야 하는 것은 아니라 생략하는 것도 가능



◎ 코드 추가

...(생략)...
	@GetMapping(value = "/getSample2")
	public SampleVO getSample2() {
		
		return new SampleVO(113, "로켓", "라쿤");
	}
...(생략)...


http://localhost:8080/sample/getSample2.json

위 주소를 입력하면 아래와 같은 결과가 출력됩니다.

 

 

(3) 컬렉션 타입의 객체 반환

   ▷ 경우에 따라 여러 데이터를 한 번에 전송하기 위해 배열이나 리스트, 맵 타입의 객체 전송

 

 src/main/java/org.codehows.controller → SampleController 클래스 수정

...(생략)...
	@GetMapping(value = "/getList")
	public List<SampleVO> getList() {
		
		return IntStream.range(1, 10).mapToObj(i -> new SampleVO(i, i + "First", i + " Last"))
				.collect(Collectors.toList());
	}
...(생략)...


getList()는 내부적으로 1부터 10미만까지 루프를 처리하면서 SampleVO 객체를 만들어서 List<SampleVO>로 만듬


◎ http://localhost:8080/sample/getList 로 주소 입력시 출력 화면



 http://localhost:8080/sample/getList.json 로 주소 입력시 출력 화면


◎ 클래스 수정

...(생략)...
	@GetMapping(value = "/getMap")
	public Map<String, SampleVO> getMap() {
		
		Map<String, SampleVO> map = new HashMap<>();
		map.put("First", new SampleVO(111,"그루트","주니어"));
		
		return map;
	}
...(생략)...


▷ http://localhost:8080/sample/getMap

위의 주소로 입력시 아래의 결과가 나타납니다.



 http://localhost:8080/sample/getMap.json

위의 주소로 입력시 아래의 결과가 나타납니다.

 

▷ Map을 이용하는 경우에는 '키(key)'에 속하는 데이터는 XML로 변환되는 경우에 태그에 이름이 되기 때문에 문자열 지정

 

 

(4) ResponseEntity 타입

   ▷ REST 방식으로 호출하는 경우 화면 자체가 아니라 데이터 자체를 전송하는 방식

       데이터를 요청 한 쪽에서 정상적인 데이터인지 비정상적인 데이터인지 구분할 수 있는 방법 제공

   ▷ ResponseEntity는 데이터와 함께 HTTP 헤더의 상태 메시지 등을 같이 전달하는 용도로 사용

   ▷ HTTP의 상태 코드와 에러 메시지 등을 함께 데이터를 전달할 수 있으므로 받는 입장에서 확실하게 결과를 알 수 있음

 

 src/main/java/org.codehows.controller → SampleController 클래스 수정

...(생략)...
	@GetMapping(value = "/check", params = {"height", "weight"})
	public ResponseEntity<SampleVO> check(Double height, Double weight) {
		SampleVO vo = new SampleVO(0, "" + height, "" + weight);
		
		ResponseEntity<SampleVO> result = null;
		
		if(height < 150) {
			result = ResponseEntity.status(HttpStatus.BAD_GATEWAY).body(vo);
		} else {
			result = ResponseEntity.status(HttpStatus.OK).body(vo);			
		}
		
		return result;
	}
...(생략)...​

 

check()는 반드시 'height'와 'weight'를 파라미터로 전달 받고 만일 'height' 값이 150보다 작다면 502(bad gateway)
상태 코드와 데이터를 전송하고, 그렇지 않다면 200(ok) 코드와 데이터를 전송합니다.

http://localhost:8080/sample/check.json?height=140&weight=60

위의 주소로 입력시 아래의 결과가 나타납니다.

 

새로운 클래스를 통해 변수들을 불러오고 SampleController 클래스를 생성해 화면에 원하는 값들이 출력할 수 있도록 만들었습니다.

 

아직까지는 이전에 사용했던 방식과 크게 차이가 없는 것 같네요!

 

많은 분들의 피드백은 언제나 환영합니다!  많은 댓글 부탁드려요~~

 

 

 

728x90
반응형