Category/Spring

[Spring] RestController

developer__Y 2024. 1. 3. 14:02
REST(Representational State Transfer)

 

하나의 URI는 하나의 고유한 리소스(Resource)를 대표하도록 설계된다는 개념에 HTTP 전송방식을 결합하여 원하는 작업을 지정하는 방식이다.

즉, REST는 자원 기반 구조설계의 중심에 Resource가 있고, HTTP Method를 통해 해당 자원을 처리하도록 설계된 아키텍쳐이다.

 

 

주요 어노테이션

 

  • @RestController : 메소드의 리턴타입으로 사용자가 정의한 클래스 타입을 사용할 수 있고,이를 JSON이나 XML으로 자동으로 변환해준다.
  • ResponseBody : 일반적인 View로 전달되는게 아니라, 데이터 자체(XML,JSON)를 전송하기위한 용도.
  • RequestBody : JSON 데이터를 원하는 타입으로 바인딩 처리

 

Jackson 라이브러리

 

REST방식을 사용하기위해서는, Java 객체를 JSON으로 변환할수있는 라이브러리가 필요하다.

 

 

다음 3개의 Dependency를 추가해준다.

 

RestController 를 사용하여 다양한 객체를 받기

 

기존의 @Controller은 view를 반환한다. 그러므로 @Controller를 통해서 데이터를 반환하고싶을때는 @ResponseBody를 같이 사용했었다.

그러나 RestFul 방식으로 클라이언트와 서버간 통신을 할때에는, view가 아닌 주로 json 방식의 데이터를 주고받는다.

그렇기에 @RestController를 사용한다. RestController은 view를 반환하지않고 서버에서 처리된 데이터를 JSON,XML 방식으로 변환하여 클라이언트에게 보낸다.

@RestController 은 @Controller + @ResponseBody와 같다.

 

우선, 간단하게 값들을 담을 VO 객체를 생성해준다.

 

객체를 JSON,XML 형태로 출력 

 

 

다음의 RestController의 getSample() 메소드는 매핑된 url로 요청이 들어오면, 단순히 새로운 SampleVO 객체를 만들어 생성해준다. 

@Controller였다면, getSample.jsp 라는 View를 찾아가기때문에, HTTP 오류가 나지만, @RestController은 해당 객체를

XML 또는 JSON 으로 변환시켜 그대로 출력한다. 

GetMapping의 produces = ~를 통해 JSON 형식으로 변환할수있다.

List, Map 객체를 Json,XML 형태로 출력

 

 

List 객체는 스트림과 람다식을 사용하여 List의 원소에 저장되어있는 객체들을 꺼내 Json,XML 형식으로 출력할 수 있다.

 

RestController과 Ajax를 활용하여 클라이언트와 서버간 비동기 방식으로 Json 형식의 데이터 주고받기

 

위의 예제를 통하여 다양한 형식의 데이터들을 RestController를 통해 클라이언트로부터 주고받는 것을 확인할수있었다.

이를 활용하여 클라이언트에서 Ajax 를 사용하여 비동기 방식으로 서버에 어떠한 데이터를 Json형식으로 전송하면, 서버단에서 RestController를 통해 비즈니스요구사항에 맞는 처리(DB조회,수정등)를 한뒤, 다시 클라이언트로 보내 View에 출력하는 실습을 해보았다.

 

우선, 클라이언트로 부터 받을 데이터들을 가지고있는 VO 객체를 하나 만든다.

 

TicketVO Class

다음의 TicketVO 객체는 tno,owner,grade 라는 필드(데이터)를 가지고있다. 일반적으로 클라이언트로 부터 데이터를 담아 요청을 받을때, 그 양이 1~2개라면 @RequestParam과 같은 어노테이션을 사용하여 단일변수로 받아서 처리할수 있을것이다. 그러나 대부분의 경우 많은 양의 데이터들이 특정한 객체를 기준으로 묶여지고, 이렇게 뭉탱이로 왔다갔다 하는 경우들이 많기 때문에 이러한 객체를 사용하여 데이터를 주고받고, 이를 VO또는 DTO 라고한다.

 

 

 

다음은 클라이언트쪽에서의 Ajax를 사용한 비동기방식의 요청이다.

var member={ } 라는 객체를 통해 서버로 보낼 값들을 넣었는데, 이는 사용자가 <input>을 통해 직접 입력할수도있고,

다양한 방식으로 사용자가 원하는 데이터를 입력받을수 있다.

값을 넣은 member 변수를 서버로 보낼때, Json 방식으로 변환하기위해 JSON.stringify() 라는 메소드를 사용했다.

그리고 통신이 성공했을때, success: function(data){ } 안에

jquery를 사용하여 <table>을 만들고, 그 안에 서버로 부터 받아온 값을 넣어서 웹 페이지상에 보이도록하였다.

위의 방식은 일반적으로 JSP에서 서버로 부터 받아온 값들을 스크립틀릿등을 활용하여 HTML 화면을 만드는 방식을

jquery를 이용해 html 코드들을 화면에 뿌린것과 같다.

 

RestController

그리고, RestController에서 /ticket 경로로 받은 요청에서, @RequestBody를 통해 클라이언트로 부터 받았던 json 형식의 데이터를 TicketVO 객체에 담아 각종 사용자의 요구사항에 맞는 처리들을 한뒤, return 해주면 클라이언트에서

비동기 방식으로 응답을 받을수 있다.