Spring

Spring REST - Overview

728x90

참조한 강의 : www.udemy.com/course/spring-hibernate-tutorial/

 

 

 

- REST

REST 는 REpresentational State Transfer 의 약자로, 웹 상에 존재하는 모든 리소스들에 대해서 고유한 URI 를 부여해서 활용하는 방법을 말한다.

 

* REST 의 구성요소로는 아래와 같은 3가지가 있다

 

1) Resource (자원, URI)

: 웹 상에 존재하는 모든 리소스들은 각자마다 고유한 ID 를 가지고 있고, 각 ID 값은 서버에 저장되며, 클라이언트는 이 자원들을 필요로 할때, HTTP Method 를 이용해서 각 리소스들을 요청한다

예를들면, url 보다보면은 이런것들이 있다.

~student/1/profile

~student/2/edit-profile

 

학생 1, 2 각각에 대한 url 이 다르고 각자 부여받은 ID 가 다르다. 

 

2) Verb (행위, method)

: 클라이언트가 각 자원에 대한 URI 를 가지고 각 자원을 요청하려면 HTTP Method 를 써야 하며

이에 해당하는 Method 로는 GET, POST, DELETE, PUT 등이 있다.

 

3) Representation (표현)

: 서버가 클라이언트에게 보내는 자원의 데이터 형태를 말한다

XML, JSON, RSS 등 여러가지가 존재하는데, 현대의 많은 웹 사이트들은 거의 대부분이 JSON 을 사용한다.

 

 

* HTTP Method

: HTTP Method 는 아래와 같이 대표적으로 4개가 있다 

1) Create : POST (자원 생성)

2) Read : GET (자원 조회)

3) Update : PUT (자원 정보 업데이트)

4) Delete : DELETE (자원 삭제)

 

 

* REST 의 특징

1) Server - Client 구조를 띈다.

 

2) Stateless 

: HTTP 기반의 시스템이므로 당연히 REST 도 stateless 이다

 

3) Cacheable

: 웹 표준 HTTP 프로토콜을 사용하므로, 웹 에서 사용하는 기존의 인프라를 그대로 활용 가능

 

4) 계층화

: 비지니스 로직만을 수행하는 부분, Security 를 담당하는 부분, 서버 로드밸런싱을 담당하는 부분 등 웹 서비스의 구현을 위한 여러가지 계층으로 나눠서 관리가 가능하다

 

5) 일관성 있는 인터페이스

: URI 로 지정한 각 자원들에 대한 조작을 통일하기 때문에, HTTP 표준만 따르면 플랫폼에 무관하게 사용가능하다

(웹에서 쓰던 시스템을 모바일로 그대로 가져올 수 있는 이유가 바로 이런 이유다)

 

 

* REST 를 사용하는 경우

: 현대의 모든 웹 사이트들은 REST 기반인 경우가 거의 대부분이며 필수적이다.

예를들어서, 날씨 정보를 나타내는 앱을 만들고 싶다고 하면, 날씨 데이터를 가져와야하는데, 보통 이런 정보들은 일반 개인이 만들어내기는 힘들고, 기상청이나 openweathermap.org 같은 사이트에서 API 를 따와서 정보를 얻어낸다.

이런 외부 데이터베이스에 접근해서 데이터를 얻고자하는 경우, REST 를 사용하는 것은 필수적 절차이다.

 

REST 가 갖는 장점 중 하나는 어떤 프로그래밍 언어나 플랫폼에 종속적이지가 않다

JAVA 를 쓰든, C# 을 쓰든, JS 를 쓰든 뭘 쓰든간에 동일한 정보를 얻어올 수 있고, 이를 활용할 수 있다.

 

 

 

- Spring 과 Jackson

DataBinding 이라는 용어가 있다.

앞에서 말했듯, 현대의 웹 서비스에서 가장많이 쓰이는 데이터 포맷은 JSON 이라 했다.

근데 이 JSON 은 어떤 프로그래밍 언어에 종속되지는 않지만, JSON 값을 그대로 자바에 이식할 수는 없다.

자바가 이해할 수 있도록 클래스로 바꿔줘야한다.

JSON 을 POJO 로 바꾸는 그런 작업을 DataBinding 이라 부르는데,

이 DataBinding 을 수월하게 해주는 라이브러리가 자바에서는 Jackson 이라 부른다

 

Jackson github : github.com/FasterXML/jackson-databind

 

FasterXML/jackson-databind

General data-binding package for Jackson (2.x): works on streaming API (core) implementation(s) - FasterXML/jackson-databind

github.com

아래의 간단한 예제를 통해서 자바에서 JSON 파일을 어떻게 하면 읽어들일 수 있는지 이해해보자

 

먼저 maven 기반의 프로젝트를 하나 만든다

 

아래는 프로젝트 구조이다

 

pom.xml 에 jackson 에 대한 의존성을 주입해준다

 

- pom.xml

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.2</version>
</dependency>
cs

 

아래는 샘플로 넣어둔 json 파일 내용이다.

 

- sample-full.json

{
    "id"14,
    "firstName""Mario",
    "lastName""Rossi",
    "active"true,
    "address": {
        "street""100 Main St",
        "city""Philadelphia",
        "state""Pennsylvania",
        "zip""19103",
        "country""USA"
    },
    "languages" : ["Java""C#""Python""Javascript"],
    "company":"Acme Inc."
}
cs

 

Jackson 이 JSON 파일을 읽어들이고 자바에게 전달해줄때는

그냥 읽는게 아니라 getter 와 setter 를 이용해서 읽어들인다.

또 그 반대의 경우도 마찬가지다 (POJO 에서 JSON 으로)

 

그래서 POJO 클래스를 선언할때 필드뿐 아니라 반드시 getter 와 setter 를 명시해야한다.

 

필드 이름은 JSON 의 key 값을 기반으로 선언한다

예를들어 위에서 "id": 14 의 경우

 

POJO 클래스에서 private int id; 이런식으로 선언해줘야한다 (반드시 JSON 의 key 값과 필드명이 일치해야함)

 

그리고 위 처럼 JSON 안에 JSON 이 포함된 경우라면, 별도의 POJO 파일로 만드는게 좋다

address 라는 또 다른 JSON 값이 들어갔으므로, 

Student.java, Address.java 라는 두개의 POJO 파일로 만들어 준다

 

그리고 languages 같은 배열 값의 경우 필드명 선언시에 배열 타입으로 선언해야함에 유의한다.

 

- Student.java

@JsonIgnoreProperties(ignoreUnknown=true)
public class Student {
    
    private int id;
    
    private String firstName;
    
    private String lastName;
    
    private boolean active;
    
    private Address address;
    
    private String[] languages;
    
    // getter, setter, constructor 생략
}
cs

위에서 설명하지 않은 어노테이션인 @JsonIgnoreProperties(ignoreUnknown=true)

라는 어노테이션을 사용했는데,

 

이는, 위의 sample-full.json 에 보면은 이 Student.java 에 선언하지 않은 필드가 하나 있다.

"company":"Acme Inc." 값에 대해서 선언해주지 않았는데

이것처럼 어떤 JSON 내부에서 무시하고 싶은 값이 있으면 @JsonIgnoreProperties(ignoreUnknown=true) 를 써주면된다.

(이 어노테이션을 명시하지 않으면 jackson 이 인식하지 못한 값이 존재한다고 오류를 낸다)

 

 

- Address.java

public class Address {
    
    private String street;
    
    private String city;
    
    private String state;
    
    private String zip;
    
    private String country;
}
cs

 

마지막으로 메인 함수 부분에서는 jackson 이 제공하는 ObjectMapper 라는 클래스가 있다.

이 클래스를 이용하면, JSON 값을 읽어서 POJO 로 변환할 수도 있고 혹은 그 역도 가능하다.

 

- Driver.java

public class Driver {
    public static void main(String[] args) {
        try {
            
            ObjectMapper mapper = new ObjectMapper();
            
            Student student = mapper.readValue(new File("data/sample-full.json"), Student.class);
            
            System.out.println("First name : " + student.getFirstName());
            
            System.out.println("Last name : " + student.getLastName());
            
            System.out.println("Address : " + student.getAddress());
            
            System.out.println("--------- languages -------- ");
            String[] languages = student.getLanguages();
            
            for (String language : languages) {
                System.out.println("language : " + language);
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
cs

 

- 결과화면

 

 

여기까지 기본적인 REST 에 대한 개념과 Spring 에서 JSON 데이터를 어떻게 읽어들이는지 알아봤다.

 

다음은 REST Controller 에 대해서 알아본다.

 

 

 

 

 

 

 

- References)

1. What is REST ? : medium.com/@hckcksrl/rest%EB%9E%80-c602c3324196

2. Jackson Tutorial : www.baeldung.com/jackson

 

 

 

728x90