-

[스프링부트 Step6] - API란? 본문

백엔드 기술 정리/스프링 부트

[스프링부트 Step6] - API란?

흣차 2021. 12. 23. 00:55
728x90
반응형

이번 시간엔 스프링 웹 개발에서 이야기 하는 API방식에 대해 다뤄보겠습니다.

이전에 봤던 MVC방식에서 봤던 VIEW를 찾아서 템플릿 엔진을 통해서 화면을 렌더링해서 HTML을 브라우저에 넘겨주는 방법이 있고 그 다음에 API를 쓰는 방식이 있습니다.

결론적으로 정적컨텐츠를 제외하면 2가지만 기억하시면 되겠습니다.

하나는 HTML로 내리던지, 아니면 API방식으로 데이터를 내리는지로 구분할 수 있겠습니다.

자 직접 보면서 이해해보겠습니다.

예전처럼 Controller에 다음과 같이 입력해보겠습니다.

여전히 GetMapping에 들어갈 내용은 메서드와 동일해야하며 -로 구분한 부분의 뒤는 대문자로 입력해주셔야 합니다.

그리고 RequestParam은 저번 시간에도 설명했듯이 RequestParameter의 준 말입니다. 

따라서 요청하는 파라미터가 name이고 String 타입이다 이렇게 이해할 수 있습니다.

그럼 적 처음 보는 ResponseBody는 무엇일까요? 

HTML에 두는 Body라고 생각할 수 있지만 그렇지 않습니다.

HTTP에서 Header와 Body부분이 있는데, "Body부분에 이 데이터를 직접 넣어주겠다!" 이런 의미입니다.

하지만 실전에선 잘 쓰이지 않는다고 하니 이런게 있다라고 알아두시면 좋겠습니다.

controller에서 짠 return hello부분을 HTML로 인식해서 name에 ggg를 직접 넣고 그것이 같이 실행되어 helloggg가 된 모습입니다.

결국 사용자가 주소창에 입력한 값에 따라 출력되는 값도 달라진다는 것을 알 수 있습니다.

꽤나 불편하고 동적이지 않습니다. 깔끔하게 응답을 처리하는 방법에 대해 알아봅시다.

제목처럼 API방식을 이용해볼 것입니다. 다음과 같이 입력해봅니다.

그리고 서버를 킨 뒤 http://localhost:8080/hello-api?name=ggg 라고 입력하고 들어갑니다.

그랬더니 아까와 생긴 모습이 조금 다르네요?

이것은 JSON방식이라고도 부릅니다.

JSON은 KEY-VALUE로 이루어진 구조로서 굉장히 단순한 구조입니다.

따라서 우리가 Hello메서드를 짤 때 key는 name이 되겠고 value는 ggg가 되어서 출력을 한 것입니다.

과거에는 XML방식으로 출력문을 다루었습니다.

그러나 XML은 무겁고, 태그를 열고 닫는 행위가 2번씩 이루어지기 때문에 요즘은 JSON을 주로 사용하는 추세입니다.

또한 스프링도 기본적으로 ResponseBody라고 어노테이션을 걸어놓으면 JSON으로 반환하게끔 설정되어 있습니다.

그리고

이렇게 getName, setName 메서드를 사용하는걸 오버라이딩이라고 합니다.

alt + Insert 를 누르시면 밑에 Getter and Setter라고 뜨실거에요.

그럼 자동으로 get, set메서드가 생성되는데요.

이것을 자바 Bean 규약이라고 합니다.

이렇게 해두면 String name은 Private이니까 외부에서 못꺼내고 이 name을 쓰기 위해서는 메서드를 통해서만 접근할 수 있게됩니다. 이 메서드는 public으로 열면 데이터는 private이고 메서드는 public이 되어 더욱더 객체지향적이겠지요.

또한 이런 방식을 Property 접근 방식이라고도 부르니까 알고 계시면 좋겠습니다.

 

자 그럼 지금까지 했던 이번에 배운 ResponseBody에 대해 다시 정리를 해보겠습니다.

웹브라우저에서 먼저 localhost:8080/hello-api 라고 치면, 톰캣 내장 서버에서 Hello-api가 왔으니 스프링에 던집니다.

스프링 입장에선 이걸 자세히 보니 @ResponseBody가 있잖아요?

저번에 소개해드린 템플릿 방식의 경우처럼 ResponseBody가 없으면 뷰리졸버한테 던져서 자기에게 맞는 템플릿을 돌렸었는데, 리스폰스바디가 있으면 HTTP에 이 데이터를 그대로 넘기도록 던집니다.

위 방식처럼 만약 문자를 넘긴다면 입력하는 데이터에 따라 곧이 곧대로 그 데이터가 전달되어서 출력이 됩니다.

근데 아래에서 보여주었던 Getter, Setter방식으로 구문을 짜서 객체를 전달한다면 스프링 입장에선 기본 Default방식이 JSON방식으로 데이터를 만들어서 HTTP에 반환하겠다는 것이 기본 정책입니다.

이후 객체를 보고 HttpMessageConverter라는 것이 동작을 합니다.

기존에는 뷰리졸버가 동작을 했듯이 @ResponseBody가 있으면 이 친구가 동작을 합니다.

그리고 전달되는 데이터가 단순 문자라면 StringConverter가 동작을 하고 객체라면 JsonConverter가 기본으로 동작합니다.

우리가 넘겨준 것은 객체였으므로 Json으로 바뀐 형태로 웹 브라우저에 보냅니다.

그래서 라이브러리의 형태를 알고싶으시다면, MappingJackson2HttpMessageConverter라는 이름을 가지고 있으니 한 번 찾아보시면 좋겠습니다.

아! 그리고 문자처리 라이브러리는 StringHttpMessageConverter인데 스프링에 기본적으로 탑재가 되어있다고 보시면 되겠습니다.

JSON외에도 구글이 만들어낸 GSON이라고도 있는데 실무에선 거의다 JSON을 쓰는 추세입니다.

또한 따로 바꾸지 않고 JSON을 계속 사용할 것으로 예상이 됩니다.

 

그럼 쓰임새를 어떻게 구분지을 수 있을까요?

정적 컨텐츠는 파일을 그대로 내려주는 것입니다.

그리고 MVC와 템플릿 엔진을 MVC로 쪼개서 View를 템플릿 엔진으로 HTML으로 프로그래밍해서 렌더링이 된 HTML을 고객에게 전달해주는 것이 템플릿 엔진 방식이고

API방식은 객체를 반환하여 JSON 방식으로 바꾸어서 데이터만을 전달할 때 사용됩니다.

감사합니다.

728x90
반응형
Comments