본 포스팅은 백기선님의 스프링 기반 REST API 개발 강좌를 수강하며 정리한 글입니다.
Application Programming Interface
그럼 Rest라는건 뭐냐!
REpresentational State Transfer
- 로이필딩 박사의 논문에서 따옴
➡️ 어떻게 하면 인턴넷 상의 서로 다른 시스템 간 독립적인 변화를 보장할 것인지에 대한 논문
✅ 사실 오늘날 REST API는 대부분 REST API라고 보기 어렵다.
위의 모든 아키텍처 스타일을 따라야 하는데
특히 Uniform Interface를 따르지 않기 때문
Uniform Interface을 구성하는 4가지 요소 중에서도
특히나 self-descrive messages와 HATEOAS를 따르지 만족하지 않음
(다른 아키텍처는 사실 http만 사용해도 쉽게 달성할 수 있음)
구성 요소
✅ self-descrive messages
메시지 스스로 메시지에 대한 설명이 가능해야 함!
→ 서버가 변해서 메시지가 변해도 클라이언트는 그 메시지를 보고 해석이 가능
→ 확장 가능한 커뮤니케이션
✅ HATEOAS
하이퍼미디어(링크)를 통해 애플리케이션 상태 변화가 가능!
→ 링크 정보를 동적으로 바꿀 수 있음
앞으로 실습할 Event REST API 정보
(상세 내용은 강의자료)
이벤트 등록, 조회 및 수정 API
GET /api/events
POST /api/events
GET /api/events/{id}
PUT /api/events/{id}
강사님이 만들어주신 Event REST API를
포스트맨과 restlet을 활용해서 테스트해보면 됨.
그냥 말그대롤 프로젝트 만들기임
만들면 됨
난 맨날 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
이벤트 생성 시 입력받아야 하는 값들