본문으로 바로가기

[Spring] 스프링 기반 REST API 개발 - 1

category Spring 2021. 8. 3. 17:14

https://www.inflearn.com/course/spring_rest-api

 

스프링 기반 REST API 개발 - 인프런 | 강의

다양한 스프링 기술을 사용하여 Self-Descriptive Message와 HATEOAS(Hypermedia as the engine of application state)를 만족하는 REST API를 개발하는 강의입니다., 스프링 기반 REST API 개발 이 강좌에...

www.inflearn.com

 

ㅁ 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