[REST API] 1. REST API 및 프로젝트 소개

두두·2023년 11월 7일
0

RESTful API

목록 보기
1/2

본 포스팅은 백기선님의 스프링 기반 REST API 개발 강좌를 수강하며 정리한 글입니다.


REST API

API란?

Application Programming Interface

  • 코딩할 때 만드는 인터페이스, 예를 들면 자바의 인터페이스도 일종의 API라고 볼 수 있음!
  • 우리가 다룰 API는 웹으로 접근할 수 있는 웹 API!

REST

그럼 Rest라는건 뭐냐!

REpresentational State Transfer

  • 로이필딩 박사의 논문에서 따옴
    ➡️ 어떻게 하면 인턴넷 상의 서로 다른 시스템 간 독립적인 변화를 보장할 것인지에 대한 논문
  • 인터넷 상의 시스템 간의 상호 운용성(interoperability)을 제공하는 방법중 하나
  • 시스템 제각각의 독립적인 진화를 보장하기 위한 방법

REST 아키텍쳐

  • Client-Server
  • Stateless
  • Cache
  • Uniform Interface
  • Layered System
  • Code-On Demand (optional)

✅ 사실 오늘날 REST API는 대부분 REST API라고 보기 어렵다.
위의 모든 아키텍처 스타일을 따라야 하는데
특히 Uniform Interface를 따르지 않기 때문
Uniform Interface을 구성하는 4가지 요소 중에서도
특히나 self-descrive messages와 HATEOAS를 따르지 만족하지 않음
(다른 아키텍처는 사실 http만 사용해도 쉽게 달성할 수 있음)

Uniform Interface

구성 요소

  • Identification of resources
  • manipulation of resources through represenations
  • self-descrive messages
  • HATEOAS(hypermedia as the engine of application state)

self-descrive messages
메시지 스스로 메시지에 대한 설명이 가능해야 함!
→ 서버가 변해서 메시지가 변해도 클라이언트는 그 메시지를 보고 해석이 가능
→ 확장 가능한 커뮤니케이션


HATEOAS
하이퍼미디어(링크)를 통해 애플리케이션 상태 변화가 가능!
→ 링크 정보를 동적으로 바꿀 수 있음



Event REST API

앞으로 실습할 Event REST API 정보
(상세 내용은 강의자료)

이벤트 등록, 조회 및 수정 API

GET /api/events

  • 이벤트 목록 조회 REST API (로그인 안 한 상태)
  • 이벤트 목록 조회 REST API (로그인 한 상태)

POST /api/events

  • 이벤트생성

GET /api/events/{id}

  • 이벤트 하나 조회

PUT /api/events/{id}

  • 이벤트수정



Postman & Restlet

강사님이 만들어주신 Event REST API를
포스트맨과 restlet을 활용해서 테스트해보면 됨.



Project 만들기

그냥 말그대롤 프로젝트 만들기임
만들면 됨

난 맨날 gradle 썼는데
강사님 maven 쓰심

오히려 좋아
다 배워보자고



이벤트 도메인 구현

빌더 쓰면 좋은 점

  • 내가 입력하는 값이 뭔지 알 수 있음
  • 예시)
    뭐에 대한 문자열인지 알기 쉽고
    코딩하기도 쉬움
    @Test
    public void builder(){
        Event event = Event.builder()
                .name("Inflearn Spring REST API")
                .description("REST API developement with Spring")
                .build();
        assertThat(event).isNotNull();
    }

그치만
✅ 자바 빈 스펙도 준수해야 함
디폴트 생성자로도, 세터 게터 사용해서도 만들 수 있어야 함
빌더를 추가하면 기본 생성자 생성 안됨.
모든 파라미터를 가진게 생성되고 그것도 디폴트 생성자로 생성됨
즉, 퍼블릭이 아님.

💻 현재 Event.java

@Builder
@EqualsAndHashCode(of = "id")
public class Event {
    private String name;
    private String description;
    private LocalDateTime beginEnrollmentDateTime;
    private LocalDateTime closeEnrollmentDateTime;
    private LocalDateTime beginEventDateTime;
    private LocalDateTime endEventDateTime;
    private String location; // (optional) 이게 없으면 온라인 모임 private int basePrice; // (optional)
    private int maxPrice; // (optional)
    private int limitOfEnrollment;

    //추가 필드
    private Integer id; //식별자
    private boolean offline;
    private boolean free;
    private EventStatus eventStatus = EventStatus.DRAFT;

}

이런 경우에는 추가로
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
➡️ 기본 생성자와 모든 아규먼트를 가진 생성자 둘 다 생성

@EqualsAndHashCode(of = "id")
➡️ Equals랑 HashCode 구현할 때 모든 필드를 다 사용
하지만 엔티티간 연관관계가 있을 떄, 서로 상호참조하는 관계가 되어버리면,
Equals랑 HashCode를 구현한 코드 안에서 스택 오버 플로우 발생 가능
➡️ 강사님은 주로 id 값만 비교해서 쓰도록 한다~
여기에 연관관계에 해당하는 것만 피해라!


💻 어노테이션 붙인 Event.java

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@EqualsAndHashCode(of = "id")
public class Event {
    private String name;
    private String description;
    private LocalDateTime beginEnrollmentDateTime;
    private LocalDateTime closeEnrollmentDateTime;
    private LocalDateTime beginEventDateTime;
    private LocalDateTime endEventDateTime;
    private String location; // (optional) 이게 없으면 온라인 모임 private int basePrice; // (optional)
    private int maxPrice; // (optional)
    private int limitOfEnrollment;

    //추가 필드
    private Integer id; //식별자
    private boolean offline;
    private boolean free;
    private EventStatus eventStatus = EventStatus.DRAFT;

}

✅ 메타 어노테이션 - 스프링에는 메타 어노테이션 기능이 있지만 롬복은 안됨;;

Data 어노테이션 쓰지 않는 이유
롬복에서 데이터라는 어노테이션 제공
-> 이콜스와 해시코드 같이 구현해줌
근데 그러면 모든 프로퍼티를 다 써서 구현하기 때문에
엔티티에 데이터를 쓰면 상호참조 때문에 스택오버플로우 발생 가능함

리펙토링 단축키
커멘드 알트 V



이벤트 비즈니스 로직

입력 값

이벤트 생성 시 입력받아야 하는 값들

  • 이벤트 이름
  • 이벤트 설명
  • 등록 시작 시간
  • 등록 종료 일시
  • 이벤트 시작시간
  • 이벤트 종료시간
  • 위치 (없으면 온라인)
  • 등록비
    • 등록 순서에 따라 비용이 다름 (자세한건 수업자료)

결과 값

  • 이벤트 id (식별자)
  • 이벤트 이름
  • 위에서 입력한 값들
  • eventStatus
    ➡️ 기본적으로는 draft : 본인에게만 보이는 상태
    publish : 사람들이 이 이벤트를 볼 수 있음
    enrollment : 등록 가능
    다른 것들도 있지만 이 강의에서 더 쓰지는 않을 것
  • 오프라인
  • 유무료 여부
  • 여러 링크
    • profile (for self descriptive message)
    • self
    • publish
      등등



profile
멋쟁이가 될테야

0개의 댓글

관련 채용 정보