웹 페이지를 개발할 때, 정적 컨텐츠가 아니라면,
MVC 방식에서 View를 찾아, 템플릿 엔진을 통해 화면을 렌더링하는 방식
or
API 방식으로 data를 바로 내리는가.
두가지로 웹페이지를 렌더링할 수 있다.
먼저, API를 어떻게 사용하는지 알아보자
@GetMapping("check-resp")
@ResponseBody
public String doApi(@RequestParam(value = "data") String string){
return "hello "+ string;
}
여기서 ResponseBody의 의미는
http 통신 프로토콜 body 부분에 해당 내용 ("hello "+spring)을 직접 넣어 전송한다.
실행 url 주소 : http://localhost:8080/check-resp?data=3
API가 필요한 이유는 바로 JSON 형식의 데이터가 필요하기 때문이다.
JSON 형식의 data를 어떻게 만드는지 보자.
@Controller
public class coupon_check {
@GetMapping("check-api")
@ResponseBody
public checkAPI api(@RequestParam("data") String string){
checkAPI api = new checkAPI();
api.setName(string);
return api;
}
static class checkAPI{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
static 변수란?
1. static이 붙은 변수는 Class Loader에 의해서 메모리에 올라갈 때 자동적으로 할당되므로, 인스턴스를 굳이 생성하지 않아도 된다.
2. 인스턴스들이 공통적인 값을 유지하고자 할때 해당 변수에 static을 붙인다.
3. static이 붙은 메소드 혹은 변수는 인스턴스 변수를 사용할 수 없다. 사용하고자 한다면, 해당 변수 또한 static으로 선언되어야만 한다.
4. 메소드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.(메소드 호출시간 감소)
인스턴스 변수와 관련된 메소드 - static 안붙임 <인스턴스 메소드>
인스턴스 변수와 관련된 메소드 - static 붙임 <클래스 메소드>
지금과 같이 중첩 클래스를 사용하는 상황을 가정하자.
static이 아닌 멤버 클래스의 인스턴스는 바깥 클래스의 인스턴스와 암묵적으로 연결이 되어있지만, static인 멤버 클래스(checkAPI)의 인스턴스는 객체 내부가 아닌 별도의 static 공간에 생성되므로, 연결이 안되어있다. 따라서 객체 생성을 하지 않아도 사용이 가능함.
private 변수란?
private 변수는 외부에서 못꺼낸다. 따라서 외부에서 해당 변수를 설정하기 위해서 getter setter함수를 따로 정의한다는 사실을 다시 한번 상기하자.
Coupon_check 클래스 내에서
checkAPI 라는 static 클래스를 만들어, 같은 클래스 내에서 checkAPI 접근이 가능하게 하고, 해당 클래스를 생성한후, 클래스를 반환하면 다음과 같이 렌더링 된다.
URL : http://localhost:8080/check-api?data=3
이는 JSON 구조이다.
스프링에서 default는 ResponseBody 어노테이션과 함께, 객체를 반환하면, JSON 형태가 된다.
템플릿 엔진 작동원리와 마찬가지로 비슷하게 작동한다.
내부 Tomcat서버에서 스프링에게 해당 URL 정보를 건네준다.
그러면 Controller에서 먼저 해당 URL 정보를 찾는다.
그 때, ResponseBody의 Annotation을 보고 해당 작업을 진행한다.
(template engine에서는 view Resolver로 해당 작업을 넘긴다.)
ResponseBody를 만나면, Http 프로토콜에 body부분에 그대로 해당 정보를 넘겨야 한다.
만약 String을 반환했다면, (첫 번째 코드 예시) 그대로 body부분에 실어서 전송하면 되겠지만,
객체를 반환했을 때에는 스프링 내부에서 알아서 JSON방식으로 바꿔서 body에 실어 보낸다.
이 때에는 HttpMessageConverter가 해당 작업을 진행한다.
HttpMessageConverter는 문자면 String Converter가, 객체면 JsonConverter 가 작동한다.
(by Jackson = 객체를 JSON으로 바꿔줌)
한줄 요약 : 자바 객체를 HTTP요청의 바디내용으로 매핑하여 클라이언트로 전송
XML로 받고 싶으면, 해당 라이브러리를 추가시키면 된다. Accept 헤더와 Controller 반환 타입을 이용하여 받고 싶은 형태를 정할 수 있다.
해당 어노테이션이 붙은 파라미터에는 http요청의 본문(body)가 그대로 전송된다.
일반적인 GET/POST의 요청 파라미터라면 @RequestBody를 사용할 일은 없지만,
xml이나 json기반의 메시지를 사용하는 요청의 경우에 이 방법이 유용하다.
HTTP 요청의 바디내용을 통째로 자바객체로 변환해서 매핑된 메소드 파라미터로 전달해준다.
한줄 요약 : 클라이언트에서 서버로 필요한 데이터를 요청하기 위해 JSON 데이터를 요청 본문에 담아서 서버로 보내면, 서버에서는 @RequestBody 어노테이션을 사용하여 HTTP 요청 본문에 담긴 값들을 자바객체로 변환시켜, 객체에 저장한다.
참고 블로그 : https://cheershennah.tistory.com/179