Spring-API

snowball moon·2023년 9월 30일
0

Spring-입문

목록 보기
7/14
post-thumbnail

정적 컨텐츠, MVC 외에도 API를 쓰는 방식이 있는데
정적 컨텐츠를 제외하고 두 가지만 기억하면 된다.
HTML로 내릴 것인지 API 방식으로 데이터를 바로 내릴 것인지

Controller 추가

controller/HelloController에서 controller를 추가해준다.

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

여기서 제일 중요한 것은 @ResponseBody의 의미이다.
@ResponseBody를 살펴보기 전에 HTTP통신에 대해서 먼저 살펴보자
_
HTTP(HyperTest Transfer Protocol)통신은 브라우저와 서버가 통신하기 위한 여러 프로토콜 가운데 한 종류로 웹 브라우저와 웹 서버 사이에 HTML문서를 주고 받는데 사용되는 통신 프로토콜이다.
HTTP통신 방식은 기본적으로 '요청과 응답(request,response)'로 이루어져 있는데 클라이언트가 요청(HttpRequest)을 서버로 보내면 서버는 클라이언트에게 응답(HttpResponse)하는 구조이다.

HttpRequest: start line/headers/body로 나뉨
HttpResponse: status line/headers/body로 나뉨

여기서 주목할 부분은 body인데 클라이언트와 서버 간의 HTTP 통신에서 요청과 응답을 보낼 때 데이터를 담는 공간이 바로 'body'이다.

requestBody: 요청 본문
responseBody: 응답 본문

본문에 담기는 데이터 형식은 대표적으로 JSON형식이 있다.

Spring에서는 @RequestBody @ResponseBody 어노테이션을 명시하고 MessageConverter를 통해서 데이터 변환 과정을 거친다.

클라이언트 서버에 JSON 형식인 requestBody로 요청 데이터를 전송하면 Java에서 해당 JASON 형식의 데이터를 받기 위해서는 Java Object로 변환하는 과정이 필요하다.
다시 서버에서 클라이언트로 응답 데이터인 responseBody를 보낼 때에도 Java Object를 JSON이나 xml 형식으로 변환해야 하는데 이 역할을 어노테이션이 처리해준다.
_

문자 방식

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

@responseBody는 응답 바디부에 데이터를 직접 넣어주겠다는 의미로 String name을 넣으면 "hello spring"이라고 바뀔 것이다.
이렇게 문자가 요청한 클라이언트에 그대로 내려간다.

템플릿 엔진과의 차이점은 View가 없고 문자가 그대로 내려간다는 것이다.

http://localhost:8080/hello-string?name=spring

확인해보자

소스 페이지를 보면

HTML 코드는 없고 적은 문자 그대로 들어왔다.
이렇게 데이터를 그대로 내려주는 방식이다.

데이터 방식

데이터를 넘겨주는 방식이 중요하다. 데이터를 넘겨줄 때 API 방식을 많이 사용하기 때문이다.

controller/HelloController에서

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

(Getter Setter를 만들어 주고 꺼낼 때는 getName,넣을 때는 getSetName을 사용한다.)

이런 식으로 사용하는 것을 API 방식이라고 한다.

http://localhost:8080/hello-api?name=spring


JSON 형식으로 나온다.

여기서 JSON은 JavaScript Object Notation의 약자로 자바 스크립트 객체 표기법인데 데이터를 쉽게 저장하고 교환하기 위한 텍스트 기반으 데이터 교환 표준이다.
JSON 데이터는 이름과 값의 쌍=>key:value 형식으로 구성되었고 중괄호{}로 둘러 쌓여있다.
JSON 데이터는 쉼표 ,로 나열한다.

최근 Spring에서는 JSON 형식으로 반환하는 것이 기본이고 default로 되어 있기 때문에 JSON 방식을 쓰면 된다.

static class Hello{
       private String name;

       public String getName() {
           return name;
       }

       public void setName(String name) {
           this.name = name;
       }
   }

private는 외부에서 바로 꺼내지 못하기 때문에 라이브러리나 메소드를 통해서 접근하게 된다.
이 때 Getter, Setter를 사용하는데 JavaBean 표준 방식이라고 한다.

JavaBean은 JSP에서 객체를 가져오기 위한 기법ㅇ로 데이터 전달 오브젝트 파일 DTO라고도 한다.
JavaBean은 JSP 페이지의 로직 부분을 분리해서 코드를 재사용하여 프로그램의 효율을 높여준다.
JavaBean은 설계 규약이 있는데 멤버 변수 마다 Getter, Setter 메서드가 존재해야 하고 get 메서드는 매개변수가 존재하지 않아야 하며 set 메서드는 반드시 하나 이상의 매개변수가 존재해야 한다.
멤버 변수의 접근제어자는 private이고 각 Getter, Setter 메서드와 클래스의 접근제어자는 public으로 정의해야 한다.
프로퍼티 방식이라고도 한다.

업로드중..

웹브라우저에 먼저 localhost8080과 hello-api를 치면 톰켄 서버에서 hello-api가 왔다고 스프링에 던져준다.
스프링에서는 responseBody라는 어노테이션을 보고 HTTP의 응답에 그대로 데이터를 넣은 것이 되겠구나 하고 동작한다.
문자의 경우에는 문자 값을 HTTP 응답에 바로 넣어주는데 객체의 경우에는 default가 JSON 방식으로 데이터를 만들어서 HTTP 응답에 반환하는 것이다.
responseBody가 있으면 HttpMessageConverter가 동작을 하는데 단순 문자면 stringConverter가 동작하고 객체면 jsonConverter가 기본으로 동작한다.
그 다음 JSON으로 바꾼 것을 웹브라우저나 서버에 보낸다.

@ResponseBody 를 사용
-HTTP의 BODY에 문자 내용을 직접 반환
-viewResolver 대신에 HttpMessageConverter 가 동작
-기본 문자처리: StringHttpMessageConverter
-기본 객체처리:MappingJackson2HttpMessageConverter
-byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음

References

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8
개발자를 위한 웹 기술
https://developer.mozilla.org/ko/docs/Web/HTTP/Messages
https://developer.mozilla.org/ko/docs/Web/HTTP/Overview

0개의 댓글