API는 Application Programming Interface라는 용어로써, 어떠한 응용프로그램에서 데이터를 주고 받기 위한 방법을 의미한다. 어떤 특정 사이트에서 특정 데이터를 공유할 경우 어떠한 방식으로 정보를 요청해야 하는지, 그리고 어떠한 데이터를 제공받을 수 있는지데 대한 규격들을 API라고 한다.
API는 사용하는 방법과, 용도에 따라 오픈API와, 비공개 API 정보가 있다. 오픈 API는 말 그대로 누구나 쉽게 접근하여 정보를 공유하기 위해 만들어진 규격이며, 비공개 API는 권한이 있는 일부 사용자들에게만 정보를 제공하기 위해 만들어진 규격이라고 생각하면 된다.
인터페이스(interface)는 말 그대로 어떤 기계간의 장치끼리 정보를 교환하기 위한 수단이나, 방법을 의미한다. 예를 들어 우리가 집에서 TV를 켜기 위해서 리모콘을 들고 TV에 리모콘 전원 버튼을 누름으로써 TV가 켜지게 된다.
즉, 사전에 TV와 통신을 하기 위해서 리모콘에서는 TV에 정의된 규격에 의해 어떤 신호를 보낼 수 있도록 만들어진 장치이며, 이러한 신호를 주고받기 위한 방법을 인터페이스라고 한다.
대표적인 인터페이스로는 마우스, 키보드, 터치패드 등이 있다.
Representational State Transfer의 약자로 자원을 이름으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미한다.
즉 REST란
HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고, HTTP Method(POST, GET, PUT, DELETE, PATCH 등)를 통해 해당 자원(URI)에 대한 CRUD Operation을 적용하는 것을 의미한다.
CRUD Operation이란
CRUD는 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말로 REST에서의 CRUD Operation 동작 예시는 다음과 같다.
작업 | 설명 |
---|---|
Create | 데이터 생성(POST) |
Read | 데이터 조회(GET) |
Update | 데이터 수정(PUT, PATCH) |
Delete | 데이터 삭제(DELETE) |
REST는 다음과 같은 3가지로 구성되어 있다.
REST API란 REST의 원리를 따르는 API를 의미한다. 하지만 REST API를 올바르게 설계하기 위해서는 지켜야하는 몇가지 규칙이 있으며 그 규칙들은 다음과 같다.
/
)를 포함하지 않는다.RESTful이란 REST의 원리를 따르는 시스템을 의미한다. 하지만 REST를 사용했다 하여 모두가 RESTful한 것은 아니다.
REST API의 설계 규칙을 올바르게 지킨 시스템을 RESTful하다고 말할 수 있으며 모든 CRUD 기능을 POST로 처리하는 API 혹은 URI 규칙을 올바르게 지키지 않은 API는 REST API의 설계 규칙을 올바르게 지키지 못한 시스템들은 REST API를 사용하였지만 RESTful 하지 못한 시스템이라고 할 수 있다.
계층간 데이터 교환을 하기 위해 사용되는 객체로, 로직을 가지지 않는 순수한 데이터 객체이다.
따라서 일반적으로 DTO는 순수한 객체로써 속성과 그 속성에 접근하기 위한 getter
, setter
메소드만 가진 클래스이다.
DB에서 꺼낸 데이터를 저장하는 Entity를 가지고 만드는 일종의 Wrapper라고 볼 수 있는데, Entity를 Controller와 같은 클라이언트단과 직접 마주하는 계층에 직접 전달하는 대신 DTO를 사용해 데이터를 교환한다.
값 오브젝트로써 값을 위해 쓰인다. Read-only
의 특징을 가진다.
다만 DTO와의 차이는, DTO는 데이터 계층간 교환(Transfer)하는데 의미가 있고, VO는 읽기만 가능한 read-only 속성을 가진 객체로써 데이터 그 자체에 의미를 두고 있다는 점이다.
즉, VO는 setter
가 없다.
DTO | VO | |
---|---|---|
목적 | 계층간 데이터 전달 | 값 자체 표현 |
동등성 | 필드값이 같아도 같은 객체x | 필드값이 같으면 같은 객체 |
가변성 | setter 존재시 가변 setter비 존재시 불가변 | 불변 |
로직 | getter/setter외의 로직이 필요하지 않음 | getter/setter외의 로직이 있어도 무방함 |
GET Method의 URL을 받을 때는 Controller에서 @GetMapping(url)
을 이용해야 한다.
@GetMapping(url주소)
public String 함수이름(){
return 템플릿 파일 명;
}
?key=value
형태로 url이 넘어올 때 Controller에서 @RequestParam
을 이용해서 받는다.
@GetMapping(url주소)
public String 함수이름(@RequestParam(value="key") String Key){
return 템플릿 파일명;
}
기본값으로 required = true
를 갖기 때문에 ?키값=
(여기서는 name)을 필수로 보내줘야 된다.
~/{value}
형태로 url이 넘어올 때 Controller에서 @PathVariable
을 이용해서 받는다.
@GetMapping(url주소/{value})
public String 함수이름(@PathVariable String value){
return 템플릿 파일명;
}
이때, value라는 변수에 url로 넘어온 값이 담긴다.
만약, 이름을 다르게 설정하고 싶으면?
@PathVariable
의 값에 변수가 담기게 된다.
POST Method 의 URL을 받을 때는 Controller에서 @PostMapping(url)
을 이용해야 한다.
@PostMapping(url주소)
public String 함수이름(){
return 템플릿 파일명;
}
@ResponseBody
: 전달받은 body 데이터를 json 형태의 객체로 만들어준다.
@PostMapping("/post/response")
@ResponseBody
public String postResponse(@RequestParam(required = false) String name, Model model){
model.addAttribute("name", name);
return "response";
@ResponseBody
를 사용하지 않았을 때는 response
라는 template view를 불러오지만 사용했을 때는 그냥 "response"라는 문자열을 반환한다.
@GetMapping(url) 또는 @PostMapping(url)
@ResponseBody
public 반환타입 변수명(@ModelAttribute 클래스이름 변수명){
return 반환할 값;
}
@ModelAttribute
@ModelAttribue
를 적지 않고 실행한다면 자동으로 @ModelAttribute
로 실행해준다.@GetMapping(url)
@ResponseBody
public String dtoResponse(@RequestBody userDTO user){
String msg = user.getName() + user.getAge();
return msg;
}
위처럼 Get 방식으로 전달하고 @Requestbody
로 받으면 오류가 난다.
@RequestBody
는 요청의 본문에 있는 데이터를 받아서 객체에 매핑하는데 이 데이터의 형식이 json
또는 xml
일 때만 실행이 가능하다.
그러기에 요청을 받을 때 일반폼
으로 받을지 json
형태로 받을지 결정하고 데이터를 받아야 한다.
@GetMapping(url)
@ResponseBody
public 반환타입 변수명(@RequestParam ...){
return 반환값;
}
axios get요청일 때 @RequestParam
으로 값을 받을 수 있다. (= 함수가 있는 객체)
post 요청일 때는 @RequestParam
으로 값을 받을 수 없다. 객체로 받거나 @RequestBody
로 받는다.
@RequestBody
: View에서 Controller로 값을 전달할 때 HTTP Body 안에 JSON을 VO에 매핑시켜주는 스프링 어노테이션
//예시
@PostMapping(url)
@ResponseBody
public String axiosResponse(@RequestBody User user){
String msg = "이름 : " + user.getName() + "나이 : " + user.getAge();
return msg;
}
1. 일반 폼 전송시
2. DTO 이용 - 일반폼 전송
O
O
, 없으면 X
3. VO 이용 - 일반폼 전송
Null
실패
, 없으면 Null
1. DTO
O
O
실패
O
없으면 Null
2. VO
O
Null
실패
가능
없으면 Null
참고
https://steemit.com/kr/@yahweh87/it-api
https://khj93.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-REST-API%EB%9E%80-REST-RESTful%EC%9D%B4%EB%9E%80