섹션 1. 생애 최초 API 만들기

섹션 1. 생애 최초 API 만들기

목표

  1. 스프링 프로젝트를 설정해 시작하고 실행

  2. 서버란 무엇인지, 네트워크와 HTTP, API는 무엇인지, JSON은 무엇인지 등 서버 개발에 필요한 다양한 개념을 이해

  3. 스프링 부트를 이용해 간단한 GET API, POST API를 만들 수 있음

스프링 프로젝트 설정하고 시작하기

https://start.spring.io/로 들어가서 세팅 후 프로젝트 시작하기
1. group : 프로젝트 그룹
2. artifact : 최종 결과물 이름
3. name : 프로젝트 이름
4. description : 프로젝트 설명
5. package name : 패키지 이름
6. dependencies : 의존성 설정

@SpringBootApplication과 서버

src 폴더의 LibraryAppApplication 의 코드는 다음과 같다.

package com.group.libraryapp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class LibraryAppApplication {

  public static void main(String[] args) {
    SpringApplication.run(LibraryAppApplication.class, args);
  }

}

여기서 @SpringBootApplication는 자바 문법인 어노테이션이라는 코드다.
이 코드는 어떤 역할을 할까?
스프링에 필요한 설정들을 자동으로 해주는 역할을 한다. 이로 인해 서버가 실행할 수 있게 된다. 이 외에도 다양한 어노테이션이 있다.

서버란 무엇일까? 제공해준다는 의미의 serve와 해주는 사람을 의미하는 er을 붙여서 server라고 부른다. 즉 기능을 제공하는 것을 의미한다.
어떠한 기능을 제공하는 프로그램과 이 프로그램을 실행시키고 있는 것을 서버라고 한다.

요청이 있어야만 기능을 제공이 가능하다. 컴퓨터에게는 어떻게 요청을 할까?

네트워크란 무엇일까?

서버라는 컴퓨터에게 요청하기 위해서는 인터넷, 네트워크를 통해서 요청을 하게 된다. 컴퓨터에는 각각 고유 주소인 IP가 있다. 또한 포트라는 여러 프로그램 중 한 프로그램을 특정시키는 주소가 있다. 이러한 것들을 이용해서 인터넷을 통해 데이터를 컴퓨터끼리 주고 받을 수 있다. 이러한 숫자로 이루어진 것들을 완전하게 외우고 사용하기에는 불편함이 커서 도메인 네임이라는 것이 등장했다. 외우기 어려운 숫자 대신, 사람들이 외우기 쉬운 '이름'을 넣어서 Domain Name System인 DNS를 사용한다.

HTTP와 API

데이터를 주고받기 위한 표준이 존재한다. 이 네트워크상의 표준을 HTTP라고 한다. 당연히 지켜야할 규칙이 있다.

GET /portion@color=red&count=2
Host : spring.com:3000

GET이란 HTTP 요청을 받는 컴퓨터에게 요청하는 행위를 의미한다. HTTP Method 중 하나인 Get 요청을 보내는 것이다.
Host : spring.com:3000 은 HTTP 요청을 받는 컴퓨터와 프로그램 정보를 의미한다.
/portion 부분은 HTTP 요청을 받는 컴퓨터에게 원하는 자원이다. Path라고 부른다. ?는 구분기호다.
@color=red&count=2 부분은 원하는 정보의 디테일한 요소들이다.
query라고 부른다.

행위와 자원은 HTTP 요청을 보내기 전에 미리 약속을 해야한다.
정해진 문법 아래서 GET, POST 등으로 수행하게 된다.

URL이란 Uniform Resource Locator이다.
http://spring.com:3000/portion?color=red&count=2 같은 주소창을 의미한다. 사용하고 있는 프로토콜인 http와 도메인 이름, path와 쿼리 등으로 이루어져 있다.
이런 요청을 통해 응답이 나온다.
200, 300 등과 같이 다양한 상태 코드로 이루어져 있으며 매우 다양하다. 응답에는 또한 추가 정보를 바디에 담을 수 있다.

이런 클라이언트-서버 구조를 통해 HTTP를 주고 받으며 기능을 동작하는데 이처럼 정해진 약속을 해서 특정 기능을 수행하는 것을 API라고 한다.

GET API 개발하고 테스트하기

숫자를 2개 보내고 그들의 덧셈 결과를 반환하는 API를 만들어보자.

  1. HTTP Method -> GET

  2. HTTP Path -> /add

  3. 쿼리 -> int num1, num2

  4. API의 반환 결과 -> num1 + num2

@RestController
public class CalculatorController {

  @GetMapping("/add") // GET /add
  public int addTwoNumbers(@RequestParam int number1, @RequestParam int number2) {
  	return number1 + number2
  }

@RestController을 통해 컨트롤러의 진입 지점이라는 것을 알려준다.
주어진 Class를 Controller로 등록하는 과정이다.

Get Method인 함수를 HTTP path가 /add인 API로 지정했다.
GET /add?number1=10&number2=20처럼 같은 쿼리의 값이 들어온다.

http://localhost:8080/add?number1=10&number2=20

포스트맨에서 다음과 같은 요청을 보내자 30이라는 리턴 값이 나왔다. 성공했다는 의미의 200 OK가 나왔다.
현재는 num1, num2만 있지만 나중에 파라미터가 많아지면 @RequestParam을 사용하는 것은 비추천한다. 이를 위해 객체를 생성해서 받도록 해보자.
DTO를 생성하자. DTO란 데이터 전달 객체를 의미한다.

public class CalculatorAddRequest {

  private final int number1;
  private final int number2;

  public CalculatorAddRequest(int number1, int number2) {
    this.number1 = number1;
    this.number2 = number2;
  }

  public int getNumber1() {
    return number1;
  }

  public int getNumber2() {
    return number2;
  }

}

이렇게 클래스를 새로 만들어서 처리할 수도 있다.
이 경우는 컨트롤러의 코드도 이 함수를 이용하게 해줘야한다.

  @GetMapping("/add") // GET /add
  public int addTwoNumbers(CalculatorAddRequest request) {
    return request.getNumber1() + request.getNumber2();
  }

POST API 개발하고 테스트하기

POST에서는 Body로 데이터를 JSON 형태로 받는다. JSON이란 JavaScript Object Notation의 약자다. 객체 표기법으로 무언가를 표기하기 위한 문법이다. keyvalue로 표기한다.

  1. HTTP Method -> POST

  2. HTTP Path -> /multiply

  3. HTTP Body (JSON) -> { }

  4. API 반환 결과 -> 곱셉의 값

  @PostMapping("/multiply")
  public int multiplyTwonumbers(int number1, int number2) {
    return number1 * number2;
  }
  @PostMapping("/multiply") // POST /multiply
  public int multiplyTwoNumbers(@RequestBody CalculatorMultiplyRequest request) {
    return request.getNumber1() * request.getNumber2();
  }
  
}

DTO도 생성해줘서 클래스를 통해 받게 해주었다. @RequestBody라는 어노테이션이 있어야 json을 객체로 변환시킬 수 있다.

{
    "number1" : 10,
    "number2" : 20
}

이렇게 json을 입력해서 body에 실어주니 200이라는 곱셈의 값이 반환되었다.

유저 생성 API 개발 및 테스트

도서관리 애플리케이션의 요구사항

사용자

  1. 도서관의 사용자를 등록할 수 있다.

  2. 도서관 사용자의 목록을 볼 수 있다.

  3. 도서관 사용자 이름을 업데이트 할 수 있다.

  4. 도서관 사용자를 삭제할 수 있다.

  1. 도서관에 책을 등록 및 삭제할 수 있다.

  2. 사용자가 책을 빌릴 수 있다. 단, 다른 사람이 그 책을 이미 빌렸다면 빌릴 수 없다.

  3. 사용자가 책을 반납할 수 있다.

이를 위해 가장 먼저 API를 설계해야 한다.

1. 도서관의 사용자를 등록할 수 있다.
-> HTTP Method를 POST로 설정하고 Path를 /user, Body를 JSON을 이용한다. JSON은 name과 age를 담는다.

2. 도서관 사용자의 목록을 볼 수 있다.
-> HTTP Method를 GET으로 설정하고 Path를 /user을 통해 결과를 반환해서 객체를 보여준다.

package com.group.libraryapp.controller.user;

import com.group.libraryapp.dto.user.request.UserCreateRequest;
import com.group.libraryapp.dto.user.request.UserUpdateRequest;
import com.group.libraryapp.dto.user.response.UserResponse;
import com.group.libraryapp.service.user.UserServiceV1;
import com.group.libraryapp.service.user.UserServiceV2;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class UserController {

  private final UserServiceV2 userService;

  public UserController(UserServiceV2 userService) {
    this.userService = userService;
  }

  @PostMapping("/user") // POST /user
  public void saveUser(@RequestBody UserCreateRequest request) {
    userService.saveUser(request);
  }

  @GetMapping("/user")
  public List<UserResponse> getUsers() {
    return userService.getUsers();
  }
}

 이번주 회고

: 어느 정도 알았다고 생각한 부분이라 가볍게 들었지만 부족한 점이 많아서 혼자 생각하는 시간이 많았다. 뒤의 JPA 부분이나 컨테이너 부분 쪽으로 가면 더 어려워지니 기초를 튼튼히 해야겠다는 생각을 했다.

댓글을 작성해보세요.

채널톡 아이콘