https://www.inflearn.com/course/spring_rest-api
ㅁ REST API 및 프로젝트 소개
ㅇ REST API
- REST : REpresentational State Transfer
- Uniform Interface를 만족해야함
> self-descriptive messages : 메시지 스스로 설명이 가능해야함
> HATEOAS (Hypermedia As The Engine Of Application State) : 하이퍼미디어(링크)를 통해 애플리케이션 상태 변화가 가능해야하며 이 링크는 동적으로 바뀔 수 있다.
ㅇ 이벤트 도메인 구현
- command + shift + t : intellij 테스트 생성 혹은 테스트로 이동
- option + ctrl + o : intellij import 최적화 ( 필요없는것 삭제, 필요한것 추가 )
- option + command + v : intellij 변수 리팩토리 가능
- lombok 으로 @build 해서 객체 생성시
> 해당 객체는 생성자가 default 객체로 생성됨
> @AllArgsConstructor @NoArgsConstructor 추가
- @EqualsAndHashCode(of = "id") : 객체 간의 연관관계가 있을 경우, 전체 변수를 비교할때 stack overflow 가 날 수 있으므로 of를 통해 id만 비교하게 함, 객체변수를 두는건 추천하지 않음
> 엔티티에 @Data 도 권장하지 않음 ( @Data가 @EqualsAndHashCode 포함하여 위와 같이 데이터 비교시, 모든 property 비교 )
- lombok 애노테이션은 커스터마이징 애노테이션 (메타 애노테이션) 으로 작동하지 않음 : 줄일 수 없다.
ㅁ 이벤트 생성 API 개발
ㅇ 이벤트 API 테스트 클래스 생성
- @WebMvcTest가 단위테스트 개념은 아님
- HAL : Hypertext Application Language
> .accept(MediaTypes.HAL_JSON) : header에 aplication/hal+json 으로 accept 설정 됨
> status().isCretaed() : 201 response
- @Enumerated(EnumType.String) 권장 : 기본은 Integer
> 순서가 바뀌면 달라질 수 있음
- @WebMvcTest 에서는 Repository 주입이 안된다.
> Mockito를 사용하여 mock객체를 만들고 빈으로 등록해줌, 그리고 기능도 mocking 함
>> Mockito.when(eventRepository.save(event)).thenReturn(event);
ㅇ 입력값 제한하기 & 입력값 이외에 에러 발생
- eventDto(DTO) -> event (Entity) 만들기 위해서는 ModelMapper로 설정
> DTO를 통해 필터링 되어야할 값 (계산이 아닌 입력값) 들을 받아서, entity로 전환한다.
> DTO에 없는 값들은 걸러진다.
- json -> 객체 : deserialization
객체 -> json : serialization
> spring.jackson.deserialization.fail-on-unknown-properties=true
를 통해 요청된 json 값을 객체로 converting 할때 오류를 발생시킨다. (400 에러- badrequest)
- @Valid + @NotNull, NotEmpty, NotNull => BindingResult 로 에러 처리
- @interface로 설명 애노테이션 생성
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface TestDescription {
String value();
}
- 주석 생성 /** 하고 엔터
ㅇ Bad Request 응답 본문 만들기
- ResponseEntity.badReuqest().body(errors) 가 안됨 .body(event) 는 가능. 왜?
> 객체를 json으로 변경하는 serializer가 등록되어있는데, event는 bean 객체 표준에 맞는 객체
>> errors 의 경우 그렇지 않음
>> ErrorSerializer 생성
>> @JsonComponent 로 등록 => objectmapper가 쓰게됨
- trim 후, isEmtpy 확인 => 자바 11 와서 isBlank() 만 하면 됨
- 파라미터 입력하여 테스트 하고 싶을 때 (Junit 5)
>> @ParameterizedTest ( 이건 @Test 와 같이 쓰지말것 ), @MethodSource 사용
@ParameterizedTest
@MethodSource("paramForTestOffline")
public void testOffline(String location, boolean isOffline){
// Given
Event event = Event.builder()
.location(location)
.build();
// When
event.update();
// Then
assertTrue(event.isOffline() == isOffline);
}
private static Stream<Arguments> paramForTestOffline() { // argument source method
return Stream.of(
Arguments.of("강남", true),
Arguments.of(null, false),
Arguments.of(" ", false)
);
}
'Spring' 카테고리의 다른 글
[Spring] 스프링 기반 REST API 개발 - 3 (0) | 2021.08.06 |
---|---|
[Spring] 스프링 기반 REST API 개발 - 2 (0) | 2021.08.03 |
[Spring] 스프링 웹 MVC - 3 (0) | 2021.08.02 |
[Spring] 스프링 웹 MVC - 2 (0) | 2021.07.28 |
[Spring] 스프링 웹 MVC - 1 (0) | 2021.07.27 |