[포스코x코딩온] 웹개발자 풀스택 과정 18주차 | SpringAPI, RestAPI, DTO, VO

구준희·2023년 10월 31일
0

[포스코x코딩온]교육

목록 보기
40/40
post-thumbnail
post-custom-banner

API란?

API는 Application Programming Interface라는 용어로써, 어떠한 응용프로그램에서 데이터를 주고 받기 위한 방법을 의미한다. 어떤 특정 사이트에서 특정 데이터를 공유할 경우 어떠한 방식으로 정보를 요청해야 하는지, 그리고 어떠한 데이터를 제공받을 수 있는지데 대한 규격들을 API라고 한다.

API는 사용하는 방법과, 용도에 따라 오픈API와, 비공개 API 정보가 있다. 오픈 API는 말 그대로 누구나 쉽게 접근하여 정보를 공유하기 위해 만들어진 규격이며, 비공개 API는 권한이 있는 일부 사용자들에게만 정보를 제공하기 위해 만들어진 규격이라고 생각하면 된다.

인터페이스란?

인터페이스(interface)는 말 그대로 어떤 기계간의 장치끼리 정보를 교환하기 위한 수단이나, 방법을 의미한다. 예를 들어 우리가 집에서 TV를 켜기 위해서 리모콘을 들고 TV에 리모콘 전원 버튼을 누름으로써 TV가 켜지게 된다.

즉, 사전에 TV와 통신을 하기 위해서 리모콘에서는 TV에 정의된 규격에 의해 어떤 신호를 보낼 수 있도록 만들어진 장치이며, 이러한 신호를 주고받기 위한 방법을 인터페이스라고 한다.

대표적인 인터페이스로는 마우스, 키보드, 터치패드 등이 있다.

REST란

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 구성요소

REST는 다음과 같은 3가지로 구성되어 있다.

  1. 자원(Resource) : HTTP URI
  2. 자원에 대한 행위(Verb) : HTTP Method
  3. 자원에 대한 행위의 내용(Representations) : HTTP Message Pay Load

REST의 특징

  1. server-Client : 서버-클라이언트 구조
  2. Stateless : 무상태
  3. Cacheable : 캐시 처리 가능
  4. Layered System : 계층화
  5. Uniform Interface : 인터페이스 일관성

REST의 장단점

장점

  • HTTP 프로토콜의 인프라를 그대로 사용하므로 REST API 사용을 위한 별도의 인프라를 구축할 필요가 없다.
  • HTTP 프로토콜의 표준을 최대한 활용하여 여러 추가적인 장점을 함께 가져갈 수 있게 해준다.
  • HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용 가능하다.
  • Hypermedia API의 기본을 충실히 지키면서 범용성을 보장한다.
  • REST API 메시지가 의도하는 바를 명확하게 나타내므로 의도하는 바를 쉽게 파악할 수 있다.
  • 여러가지 서비스 디자인에서 생길 수 있는 문제를 최소화 한다.
  • 서버와 클라이언트의 역할을 명확하게 분리한다.

단점

  • 표준 자체가 존재하지 않아 정의가 필요하다.
  • HTTP Method 형태가 제한적이다.
  • 브라우저를 통해 테스트할 일이 많은 서비스라면 쉽게 고칠 수 있는 URL보다 Header 정보의 값을 처리해야하므로 전문성이 요구된다.
  • 구형 브라우저에서 호환이 되지 않아 지원해주지 못하는 동작이 많다. (ex. 익스플로러)

REST API

REST API란 REST의 원리를 따르는 API를 의미한다. 하지만 REST API를 올바르게 설계하기 위해서는 지켜야하는 몇가지 규칙이 있으며 그 규칙들은 다음과 같다.

REST API 규칙

  1. URI는 동사보다는 명사를, 대문자보다는 소문자를 사용해야 한다.
  2. 마지막에 슬래시(/)를 포함하지 않는다.
  3. 언더바 대신에 하이픈을 사용한다.
  4. 파일확장자는 URI에 포함하지 않는다.
  5. 계층관계를 나타날 때는 슬래시 구분자를 사용해야 한다.
  6. 전달하고자 하는 자원의 명사를 사용하되, 컨트롤 자원을 의미하는 경우 예외적으로 동사를 허용한다.
  7. URI에 작성되는 영어를 복수형으로 작성한다.

RESTful이란?

RESTful이란 REST의 원리를 따르는 시스템을 의미한다. 하지만 REST를 사용했다 하여 모두가 RESTful한 것은 아니다.

REST API의 설계 규칙을 올바르게 지킨 시스템을 RESTful하다고 말할 수 있으며 모든 CRUD 기능을 POST로 처리하는 API 혹은 URI 규칙을 올바르게 지키지 않은 API는 REST API의 설계 규칙을 올바르게 지키지 못한 시스템들은 REST API를 사용하였지만 RESTful 하지 못한 시스템이라고 할 수 있다.

DTO vs VO

DTO(Data Transfer Object)란?

계층간 데이터 교환을 하기 위해 사용되는 객체로, 로직을 가지지 않는 순수한 데이터 객체이다.

따라서 일반적으로 DTO는 순수한 객체로써 속성과 그 속성에 접근하기 위한 getter, setter 메소드만 가진 클래스이다.

DB에서 꺼낸 데이터를 저장하는 Entity를 가지고 만드는 일종의 Wrapper라고 볼 수 있는데, Entity를 Controller와 같은 클라이언트단과 직접 마주하는 계층에 직접 전달하는 대신 DTO를 사용해 데이터를 교환한다.

VO(Value Object)란?

값 오브젝트로써 값을 위해 쓰인다. Read-only의 특징을 가진다.
다만 DTO와의 차이는, DTO는 데이터 계층간 교환(Transfer)하는데 의미가 있고, VO는 읽기만 가능한 read-only 속성을 가진 객체로써 데이터 그 자체에 의미를 두고 있다는 점이다.

즉, VO는 setter가 없다.

차이점

DTOVO
목적계층간 데이터 전달값 자체 표현
동등성필드값이 같아도 같은 객체x필드값이 같으면 같은 객체
가변성setter 존재시 가변
setter비 존재시 불가변
불변
로직getter/setter외의 로직이 필요하지 않음getter/setter외의 로직이 있어도 무방함

API(Get, Post)

GET

1. GET 방식

GET Method의 URL을 받을 때는 Controller에서 @GetMapping(url)을 이용해야 한다.

@GetMapping(url주소)
public String 함수이름(){
	return 템플릿 파일 명;
}

2. ?key=value

?key=value 형태로 url이 넘어올 때 Controller에서 @RequestParam을 이용해서 받는다.

@GetMapping(url주소)
public String 함수이름(@RequestParam(value="key") String Key){
	return 템플릿 파일명;
}

기본값으로 required = true를 갖기 때문에 ?키값=(여기서는 name)을 필수로 보내줘야 된다.

3. ~/{value}

~/{value} 형태로 url이 넘어올 때 Controller에서 @PathVariable을 이용해서 받는다.

@GetMapping(url주소/{value})
public String 함수이름(@PathVariable String value){
	return 템플릿 파일명;
}

이때, value라는 변수에 url로 넘어온 값이 담긴다.

만약, 이름을 다르게 설정하고 싶으면?

@PathVariable의 값에 변수가 담기게 된다.

POST

POST방식

POST Method 의 URL을 받을 때는 Controller에서 @PostMapping(url)을 이용해야 한다.

@PostMapping(url주소)
public String 함수이름(){
	return 템플릿 파일명;
}

@ResponseBody

@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"라는 문자열을 반환한다.

DTO 이용하기

문법

@GetMapping(url) 또는 @PostMapping(url)
@ResponseBody
public 반환타입 변수명(@ModelAttribute 클래스이름 변수명){
	return 반환할 값;
}

@ModelAttribute

  • html 폼 데이터를 컨트롤러로 전달할 때 객체에 매핑해주는 디폴트 어노테이션
  • 만약에 @ModelAttribue를 적지 않고 실행한다면 자동으로 @ModelAttribute로 실행해준다.
  • 얘를 이용하면 객체의 setter 함수를 이용해 값을 넣어준다.

틀린예시

@GetMapping(url)
@ResponseBody
public String dtoResponse(@RequestBody userDTO user){
	String msg = user.getName() + user.getAge();
    return msg;
}

위처럼 Get 방식으로 전달하고 @Requestbody로 받으면 오류가 난다.

@RequestBody는 요청의 본문에 있는 데이터를 받아서 객체에 매핑하는데 이 데이터의 형식이 json 또는 xml일 때만 실행이 가능하다.

그러기에 요청을 받을 때 일반폼으로 받을지 json형태로 받을지 결정하고 데이터를 받아야 한다.

Axios를 이용한 데이터 전송

@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. 일반 폼 전송시

  • RequestParam : Get과 Body 둘다 가능
  • ParamVariable : Get만 가능

2. DTO 이용 - 일반폼 전송

  • Get 전송 : O
  • Post 전송 : RequestBody가 있으면 O , 없으면 X

3. VO 이용 - 일반폼 전송

  • Get 전송 : Null
  • Post 전송 : RequestBody가 있으면 실패, 없으면 Null

axios 이용

1. DTO

  • Get 요청 : O
  • Get DTO : O
  • Post 요청 : 실패
  • Post DTO : RequestBody가 있으면 O 없으면 Null

2. VO

  • Get 요청 : O
  • Get VO : Null
  • Post 요청 : 실패
  • Post VO : RequestBody가 있으면 가능 없으면 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

profile
꾸준히합니다.
post-custom-banner

0개의 댓글