Programming/Spring

REST API 요청/응답 과정, 구현

Boxya 2025. 5. 23. 23:48

[KT] AIVLE SCHOOL 39일차

 

REST API 요청/응답 과정

  • 클라이언트는 HTTP 요청을 통해 서버에 데이터를 보내고, 서버는 그에 대한 응답을 반환
  • REST API는 응답 데이터로 JSON 타입의 데이터를 클라이언트에게 전송
  • 클라이언트 -> 서버 : 요청 HTTP 메시지(Request)
    • HTTP 요청 메세지는 시작 라인[요청 라인](start-line), 헤더(header), 본문(body)으로 구성
    • 요청 라인: HTTP Request Message의 시작 라인
      • HTTP Method : 요청의 의도를 담고 있는 HTTP Method (GET,POST,DELETE 등)를 포함
      • Request target : HTTP Request가 전송되는 목표 주소
      • HTTP version : 버전에 따라 메세지 구조가 다를 수 있기 때문에 버전을 명시
    • 헤더(Header) : 해당 request에 대한 추가 정보를 담고 있는 부분
      • Host : 요청하려는 서버 호스트 이름과 포트번호를 포함
      • User-agent : 클라이언트 프로그램 정보 를 포함
        • 서버는 클라이언트 프로그램에 맞는 최적의 데이터를 보낼 수 있음
      • Authorization : 인증 토큰을 서버로 보낼 때 쓰임
      • Cookie : 쿠키 값이 key-value 값으로 표현됨
    • 본문(Body) : HTTP request가 전송하는 데이터를 담고 있는 부분으로 전송하는 데이터가 없다면 Body 부분은 비어 있음
  • 서버 -> 클라이언트 : 응답 HTTP 메시지(Response)
    • HTTP 응답 메세지 또한 시작 라인[상태 라인](start-line), 헤더(header), 본문(body)으로 구성되어 있음
    • 상태 라인 : HTTP Response Message의 시작 라인
      • HTTP version : 서버가 사용하는 HTTP 프로토콜의 버전을 나타냄
      • Status Code : 서버가 클라이언트에게 보내는 세 자리 숫자로, 요청의 성공, 실패. 리다이렉션 등의 상태를 나타냄
      • Status Text : 상태 코드에 대한 간단한 설명으로, 사람이 읽을 수 있는 형태
        • 200 → “OK” / 404 → “Not Found”
    • 헤더(Header) : 응답에 대한 추가 정보를 담고 있음
      • Server : 웹 서버의 종류를 나타냄
      • Location : 301, 302 상태 코드일 때만 볼 수 있는 헤더로 서버의 응답이 다른 곳에 있다고 알려주며 해당 위치를 지정
    • 본문(Body) : HTTP Request 메세지의 Body와 동일하며, 전송하는 데이터가 없다면 Body 부분은 비어 있음

  • 이러한 요청 및 응답 과정은 RESTful API를 통해 클라이언트와 서버 간의 효율적인 통신을 할 수 있음
    • 클라이언트가 기기에 구애받지 않고 서버의 자원을 이용할 수 있음
    • 서버가 클라이언트의 요청에 체계적으로 대응할 수 있어서 서버 프로그램의 재사용성과 확장성이 좋아짐

REST API 구현

  • 도서 관리 API
    • 도서관에서 책을 관리하는 API를 설계
    • 도서 목록에 도서를 추가 (CREATE)
    • 도서의 정보를 변경하거나 조회(UPDATE - PUT / READ)
    • 도서를 대여 또는 반납 (UPDATE - PATCH)
    • 도서를 삭제시켜 더 이상 대여를 할 수 없도록 함(DELETE)
    • API를 테스트 할 수 있는 테스트 코드도 생성 (TEST)
  • 추가한 종속성
    • Lombok → Getter / Setter / toString 등의 메소드를 어노테이션으로 쉽게 선언해 사용할 수 있다.
    • Spring Boot DevTools → 어플리케이션 개발을 위한 자동화 된 리로드와 추가 개발 도구를 제공한다.
    • Spring Web → Sping 기반의 웹 어플리케이션을 쉽게 구축할 수 있는 기능을 제공한다.
    • Spring Data JPA → 데이터 액세스 계층을 간소화하고, JPA를 사용하여 데이터베이스를 다루는 기능을 제공한다.
    • H2 Database → 내장형 인메모리 데이터베이스로, 경량화 된 데이터베이스를 개발 및 테스트 목적으로 사용할 수 있다.
  • Entity 설계
    • @Entity 어노테이션을 클래스 레벨에 선언해 해당 클래스가 엔티티임을 나타냄
    • @Data 어노테이션은 Lombok 라이브러리에서 제공하며, getter, setter, equals, hashCode, toString 등 메소드를 자동으로 생성
    • @Id 어노테이션은 bookId 필드가 DB 테이블의 기본 키임을 나타냄
      • @GeneratedValue 어노테이션은 기본 키의 값을 자동으로 생성하도록 지정
      • strategy = GenerationType.IDENTITY는 DB가 기본 키를 자동으로 생성하도록 지시
    • @Column 어노테이션은 해당 필드가 DB 테이블의 열임을 나타냄
      • nullable = false는 해당 필드가 null 값을 허용하지 않음을 나타냄
      • bookName은 비워둘 수 없음
    • @Enumerated 어노테이션은 bookStatus 타입이 열거형임을 나타냄
      • BookStatus는 BORROWED와 AVAILABLE 두 가지 상태를 가진 열거형
    • 기본 키를 id로 하는 title, subTitle, author, publisher, status를 필드를 가진 엔티티를 생성
  • DTO(Data Transfer Object)
    • 계층 간 데이터 교환을 하기 위해 사용하는 객체
    • 로직을 갖지 않는 순수한 데이터 객체로 getter / setter만 가진 클래스
    • DTO는 클라이언트에서 서버 쪽으로 전송하는 요청 데이터를 전달 받을 때, 서버에서 클라이언트 쪽으로 전송하는
      응답 데이터를 전송하기 위한 용도로 사용
    • DTO가 필요한 이유
      • 클라이언트의 요청 데이터 수가 늘어나면 @RequestParam()의 개수는 계속 늘어남
      • DTO 클래스는 요청 데이터를 하나의 객체로 전달 받는 역할 (그룹화 된 데이터 전송)
      • 도메인 객체와의 분리라는 목적이 존재
      • 요청과 응답으로 DTO를 사용하면?
        • 각각의 DTO 클래스가 데이터를 전송하는 클래스로서의 역할을 명확히 가질 수 있게 되고, 하나의 클래스가 하나의 역할을 해야 한다는 객체지향의 핵심과도 부합
      • 화면에 필요한 데이터를 선별할 수 있음
        • DTO를 별도로 만들어, 화면에서 요구하는 필요 데이터만 응답 데이터로 보낼 수 있음
      • 순환참조를 예방할 수 있음
        • 양방향 관계에서, 엔티티를 응답(response)으로 리턴하게 되면?
          • 엔티티가 참조하고 있는 객체가 로딩되며, 로딩된 객체는 또 다시 본인이 참조하고 있는 객체를 호출
          • ⇒ 순환 참조(무한루프)에 빠지게 됨
        • 응답 DTO를 사용한다면 해당 문제를 해결할 수 있음
      • DTO에서 validation이 가능
        • DTO에 validation을 정의한다면 유효성 검사를 통해 잘못된 값을 전달 받았을 때 걸러낼 수 있음
  • PUT과 PATCH의 차이점
    • 데이터를 수정하는 경우 PUT Method와 PATCH Method를 사용
    • PUT
      • 수정할 전체 필드가 포함된 데이터를 전송해야 함
        • 누락된 필드는 null값으로 업데이트 됨
        • JPA를 사용하는 경우 @Entity 클래스 레벨에 @DynamicUpdate를 사용하면 변경된 데이터의 칼럼만 업데이트가 가능
    • PATCH
      • 수정할 데이터만 전달할 수 있음
    • PUT은 리소스의 전체 업데이트에 적합한 반면, PATCH는 리소스의 부분적인 업데이트에 적합
  • Mapper
    • DTO와 엔티티 간의 매핑을 담당하는 클래스
    • DTO 객체를 엔티티 객체로 변환하거나 엔티티 객체를 DTO 객체로 변환하는 메서드를 제공
  • Mapstruct
    • Java 기반의 매퍼 라이브러리 중 하나로, 컴파일 타임에 매퍼 구현체를 생성해주는 코드 생성기
    • 매퍼 인터페이스를 정의하고, 해당 인터페이스의 메서드를 호출하여 객체 간의 매핑을 수행할 수 있음
    • Mapper 어노테이션을 사용하면 Mapstruct가 자동으로 구현체를 만들어줌
    • 매핑 처리하지 않을 요소는 ignore 속성을 주면 됨
    • 컬렉션끼리 매핑할 수도 있음
    • 컬렉션 내의 객체들은 순서대로 1:1 매핑됨
    • @AfterMapping은 매핑 작업이 완료된 후 실행되는 메서드나 작업을 의미
      • 즉, 데이터베이스의 데이터를 Java 객체로 변환한 후 그 객체에서 추가적인 작업을 수행해야 할 때 사용하는 어노테이션
  • Repository
    • 리파지토리(repository)는 소프트웨어 개발에서 데이터 액세스 계층을 관리하기 위해 사용되는 디자인 패턴
    • @Repository : Spring에서 해당 클래스가 데이터 액세스 계층의 구성 요소로 사용됨을 나타냄
      • @Repository 어노테이션이 지정된 클래스는 Spring의 컴포넌트 스캔에 의해 빈(Bean)으로 등록됨
    • JpaRepository<Book, Long>: Book 엔티티에 대한 JpaRepository를 정의
      • JpaRepository는 제네릭으로 Library와 Long을 받는다. 즉, Library는 엔티티(@Entity)를, Long은 해당 엔티티의 기본 키(@Id)의 데이터 타입
    • JpaRepository는 자동으로 CRUD(Create, Read, Update, Delete) 기능을 제공
      • save, findById, delete 등의 메소드를 사용하여 데이터베이스에 쉽게 접근하고 조작할 수 있음
  • H2 데이터베이스
    • H2 DB는 자바 기반의 오픈소스 관계형 데이터베이스 관리 시스템(RDBMS)
    • 서버(Server) 모드와 임베디드(Embedded) 모드의 인메모리 DB 기능을 지원
    • 브라우저 기반의 콘솔모드를 이용할 수 있으며, 별도의 설치과정이 없고 용량도 2MB(압축버전) 이하로 저용량임
    • DB 자체가 매우 가볍기 때문에 빠르고, JDBC API 또한 지원
    • SQL 문법은 다른 DBMS들과 마찬가지로 표준 SQL의 대부분이 지원됨
    • 이러한 장점들 때문에 어플리케이션 개발 단계의 테스트 DB로서 많이 이용됨

'Programming > Spring' 카테고리의 다른 글

@Transactional  (0) 2025.05.23
Service Layer  (0) 2025.05.23
REST / REST API  (1) 2025.05.23
JPA(Java Persistence API)  (0) 2025.05.23
Spring Data JPA  (2) 2025.05.22