참조한 강의 : 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
아래의 간단한 예제를 통해서 자바에서 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
'Spring' 카테고리의 다른 글
Intellij 에 Spring Framework 설정하기 (0) | 2021.03.14 |
---|---|
Spring REST - REST Controller (0) | 2021.03.11 |
Spring Security - User Registration (0) | 2021.03.07 |
Spring Security - User Roles (0) | 2021.03.06 |
Spring Security - CSRF (Cross Site Request Forgery) (0) | 2021.03.06 |