뚜룽

[Spring] 인프런 스프링 입문 정리 (4) / API 본문

Spring

[Spring] 인프런 스프링 입문 정리 (4) / API

ddooroong 2023. 10. 9. 02:44

목차

  1. API란?
  2. Json이란?
  3. @ResponseBody

 

 

1. API 란?

 

API는 Application Programming Interface(애플리케이션 프로그램 인터페이스)의 약자이다.  

API의 맥락에서 애플리케이션이라는 단어는 고유한 기능을 가진 모든 소프트웨어를 나타냅니다. 
인터페이스는 두 애플리케이션 간의 서비스 계약이라고 할 수 있습니다. 이 계약은 요청과 응답을 사용하여 
두 애플리케이션이 서로 통신하는 방법을 정의합니다. 

(출처: https://aws.amazon.com/ko/what-is/api/ )
API는 컴퓨터나 애플리케이션의 상호 통신 방식을 설명하게끔 정의된 규칙의 모음입니다. 
API는 애플리케이션과 웹 서버의 사이에서 중간 계층의 역할을 하면서 시스템 간 데이터 전송을 처리합니다. 

(출처: https://www.ibm.com/kr-ko/topics/api )

위의 두 개의 인용문을 요약하면, 애플리케이션끼리 데이터를 주고 받을 때 어떤 데이터를 가지고 어떻게 통신할지를 정하는 일종의 규약이라고 볼 수 있다.  API는 데이터를 주로 Json이나 xml 형태로 주고받는다. 최근에는 Json이 많이 사용된다.  오늘 배운 API에서도 Json에 대한 언급이 많았다. 

 

2. Json이란?

 

2.1 Json

Json은 JavaScript Object Notation의 약자로, 자바스크립트의 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반 형식이다. 자바스크립트가 아니더라도 여러가지 환경에서 json 형식이 사용되고 있다. 

Json은 아래와 같이 key와 value로 이루어진 문자열이다.  

{ "name" : "ddooroong" }

json을 다룰 때 사용하는 용어이다. 

  • 문자열 -> 객체 : 파싱(Parsing)
  • 객체 -> 문자열 : 문자열화 (Stringification)

2.2 Json 을 사용하는 이유

  1. 임시 데이터를 저장하기에 적합하다.
    • 웹사이트에서 사용자가 생성한 데이터는 임시 데이터이다. 이를 저장하기에 key와 value로 이루어진 경량의 문자 기반 데이터인 json은 모든 프로그래밍 언어에 사용될 수 있기 때문에 유용하다.
  2. 복잡한 데이터를 간소화할 수 있다. 
    • Json은 사람이 읽기 쉬운 형태로 작성되었고, 소프트웨어에서 json 데이터를 생성하거나 파싱하기 쉽기 때문에 네트워크에서 데이터를 교환할 때 주로 사용된다.

(출처: https://www.oracle.com/kr/database/what-is-json/)

 

3. @ResponseBody

 

앞서 브라우저에서 데이터를 받아서 처리할 때 model에 key와 value를 담아서 처리했었다. 이 경우 model에 저장한 데이터는 view로 전달되어 브라우저에 html 파일을 랜더링하게 되었다. 

그러나 만약 별도의 페이지는 필요하지 않고, 데이터만 받고 싶다면 어떻게 해야할까? 아래의 코드를 살펴보자

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

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

}

이번엔 @ResposeBody 어노테이션이 붙었다. 이때의 Body는 html의 <body>태그가 아니다. 이때의 body는 데이터 통신과 관련된 개념이다. 웹이나 네트워크에서 데이터를 다른 계층으로 보낼 때, 데이터 바디에 각 프로토콜에 맞는 헤더를 붙여서 데이터를 전달한다. 그런데 @ResponseBody 어노테이션이 붙게 되면 헤더를 붙이지 않고 오로지 body에 해당하는 데이터만 달랑 보내겠다는 의미이다. 

 즉, 코드에서 name이라는 매개변수를 받게 되면 브라우저에 'hello 어쩌구'라고 뜨는 것은 기존과 동일하지만, html 문서가 아니라는 점이 중요한 포인트이다. 정말 말 그대로 문자열 hello 어쩌구 가 그대로 전달된 것!

이번에는 객체 자체를 반환하는 코드도 살펴보자.

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
	static class Hello {
        private String name;

        public String getName() {
            return name;
        }

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

    @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name) {
        Hello hello = new Hello();
        hello.setName(name);
        return hello;
    }
  
}

여기서는 HelloController 클래스 안에 또다른 Hello 클래스를 선언했다. 그리고 /hello-api로 요청이 들어오면 helloApi 메소드를 실행한다. 
브라우저에서 /hello-api?name=고양이 라고 전달하면, 이번엔 hello 객체의 인스턴스를 하나 생성하고 setter로 name이라는 값을 저장한 뒤 객체 hello 자체를 반환하고 있다. 

이렇게 되면 name이라는 값에 '고양이'가 들어있음을 나타내줘야 하는데, 이때 json 데이터를 사용한다. 

{ "key" : "value"} 형태로 json 데이터가 잘 넘어온 것을 확인할 수 있다. 별도의 view를 반환하지 않기 때문에 model도 사용되지 않는다는 점이 포인트이다.