5 - 1. API를 작성하는 다양한 방법[Spring Boot]

JuJaeng2·2023년 12월 3일

이번에 4가지 HTTP 메서드(GET, POST, PUT, DELETE) 간단하게 작성해 보면서 각각의 특징과 차이점에 대해 알아보고 외부의 요청을 받아 응답하는 기능을 구현해서 컨트롤러가 어떻게 구성되는지 안ㄹ아보도록 할 것이다.

✅ GET API

GET API란?

  • 웹 애플리케이션 서버에서 값을 가져올 때 사용하는 API

GET API 만들기

프로젝트 파일은 이전에 사용하던 것을 그대로 사용했다.

controller패키지에 ApiController를 만들어준다.

컨트롤러에 @RestController, @RequestMapping어노테이션을 붙여준다.

@RequestMapping

  • 내부에 선언되는 메서드 에서 사용할 공통 URL을 설정한다.
  • 별다른 설정 없이 선언하면 HTTP의 모든 요청을 받지만 GET형식의 요청만 받기 위해서는 어노테이션에 별도 설정이 필요하다.
    • EX ) @RequestMapping(value = "/hello", method = RequestMethod.GET)

위와 같이 getHello 메서드를 만들어 주고 value, method 값을 준다. 이렇게 되면 getHello 메서드는 GET요청을 받는 메서드가 되고 "localhost:8080/api/v1/hello" 를 통해서 요청이 들어온다.
❗️4.3버전 이후 @RequestMapping 어노테이션은 사용되지 않고 각 HTTP 메서드에 맞는 어노테이션을 사용한다.

  • @GetMapping
  • @POSTMapping
  • @DELETEMapping
  • @PUTMapping

웹 브라우저에 주소를 입력하면 위와 같이 화면이 출력되는것을 알 수 있다. 이제부터는 Postman을 사용해서 결과값을 받아보도록 하겠다.

변수 받기

웹 통신의 기본 목적은 데이터를 주고받는 것이기 때문에 대부분 매개변수를 받는다.
<매개변수를 받는 방법>
1. URL자체에 값을 담아 요청하는 방법(@PathVariable 사용)
2. URI에서 '?'를 사용해서 쿼리형식으로 값을 전달하는 방법(@RequestParam 사용)
3. 1, 2의 방법으로 전달된 값을 DTO 객체를 사용하여 값을 받아오는 방법

1. URL자체에 값을 담아 요청

URL에 값을 담아 전달되는 요청을 처리하는 방법

@PathVariable을 사용하여 매개변수와 그 값을 연결해준다. 이때 @GetMapping 어노테이션에 지정된 변수(variable)와 @PathVariable에 지정된 변수면이 동일해야한다.

❗️변수명이 다를 경우

이름을 동일하게 맞추기 어렵다면 @PathVariable 뒤에 괄호를 열어 @GetMapping 어노터에션의 변수명을 지정하면 된다.

2. 쿼리형식으로 값 전달

URI에 '?'를 사용해서 쿼리 형식으로 값을 전달한다. '?'를 기준으로 '키=값'형태로 구성된 요청을 전송하는 방법이다. @RequestParam을 사용해서 쿼리 값과 매핑하면 된다. 이때도 마찬가지로 키의 이름과 변수명이 동일해야 매핑이된다.

❗️변수명이 다를 경우

@PathVariable에서 처럼 value요소를 매핑해도 되고 Map객체를 사용해도 된다.

❗️ < URL과 URI의 차이점>
URL : 웹주소를 의미하며, 리소스가 어디에 있는지 알려주기 위한 경로
URI : 특정 리소스를 식별할 수 있는 식별자를 의미

3. DTO를 사용해서 값 받아오기

DTO(Data Transfer Object)

  • 다른 레이어 간의 데이터 교환에 활용
  • 각 클래스 및 인터페이스를 호출하면서 전달하는 매개변수로 사용되는 데이터 객체
  • 데이터를 교환하는 용도로만 사용하는 객체이기 때문에 별도의 로직이 포함되지 않는다.
  • 데이터 전송을 위해 사용되는 데이터 컨테이너

com.springboot.bookstudy하단에 dto 패키지를 생성하고 MemberDto를 만들어 주었다.

DTO클래스에는 전달하고자 하는 필드 객체를 선언하고 getter/setter 메서드를 구현한다. 이 메서드를 통해 객제에 담긴 통해 넣거나 가져올 수 있다.
DTO 클래스에 선언된 필드는 컨트롤러를 통해 받은 키와 매핑된다.
예를들어 쿼리 파라미터로 'name=홍길동' 이라는 값이 들어오면 DTO에 있는 name과 매핑이 되는것이다.
받아야 할 파라미터가 많을 경우 이처럼 DTO객체를 활용하여 코드의 가독성을 높일 수 있다.

❗️toString()은 왜 오버라이딩 했을까?❗️
이유는 오버라이딩해서 객체의 내용을 쉽게 확인하기 위해서 이다.
Object클래스에는 기본적인 toString 메서드가 있지만, 이 메서드는 객체의 클래스 이름과 해시코드를 반환하기 때문에 내용을 확인할 수 없다.

컨트롤러는 위와 같이 수정해주면 된다.

오버라이딩을 해서 toString() 구현했을 때

오버라이딩을 하지 않고 기본 제공되는 toString() 사용했을 때


✅ POST API

POST API란?

  • 데이터베이스 등의 저장소에 리소스를 저장할 때 사용되는 API

POST API 만들기

  • POST API에서는 저장하고자 하는 리소스나 값을 HTTP body에 담아 서버에 전달한다.
  • 그래서 URI가 GET API에 비해 간단한다.

POST형식의 요청을 처리하기 때문에 @PostMapping 어노테이션을 사용한다.
이때 요청주소는 "localhost:8080/api/v1/post"가 된다.

변수 받기

<매개변수를 받는 방법>

  • HTTP body로 값을 전달하기 때문에 @RequestBody를 사용해서 값을 받는다.
    Body영역에 작성되는 값은 JSON(JavaScript Object Notation)형식으로 전송된다. 이 형식으로 값을 주고받는다.
    참고로 GET형식에서 처럼 URL 자체에 값을 담아 요청해서 @PathVariable을사용하여 값을 받는 방법도 기능적으로는 가능은 하지만 POST 형식이 body에 값을 받는다는 특징이 있어 사용하지 않는것.

POST형식으로 보내기 때문에 형식을 POST로 설정하고 요청주소를 입력한 다음 Body 전달할 값을 JSON 형식으로 입력해준다.

주의할점은 Headers부분에서 Content-Type을 application/json으로 설정해 줘야한다. 우리가 보내는 데이터가 JSON형식으로 보내지기 때문에 기본으로 설정되어 있는 text/plain으로 보내면 에러가 발생한다.
그러면 아래와 같이 값을 받을 수 있다.

이번에는 Map객체를 사용하여 값을 받았지만 GET API에서 DTO를 사용한것 처럼 동일하게 사용할 수 있다.

❗️내용이 길어져서 나머지 PUT, DELETE는 다음 포스팅에서 이어가도록 하겠다.

profile
다 잘하고 싶은 개발자

0개의 댓글