RestApi 만들기 - 201코드 생성하기 (1)

반응형
반응형

나는 배달API를 restAPI로 만들어 볼려고 한다.
내용은 스프링 기반 REST API 개발 에서 공부한 내용을 참조해서 만들었다.

원래는 restAPI에 대한 정의를 말하고 시작해야 되지만 
아직은 설명하기는 어려운 것 같다,
일반적인 api보다 상태를 자유롭게 바꿀 수 있다는 건 확실하다.

아무튼 api를 만들기위해서는 dto가 필요하다.
그러니까 자바빈같은게  필요하다는 뜻이다.

간단하게 

@Builder
@Setter @Getter
public class Delivery {
    private int id;
    private String item;
    private String user;
    private LocalDateTime deliveryTime;
    private DeliveryStatus status;
}

이렇게 작성했다.

이제 테스트 코드를 작성해보자.

나는 mockMVC를 사용해야된다.
mockMVC는 웹으로 직접적으로 통신하지 않고, 가상으로 웹으로 호출이 잘 되었지 테스트하는 방법이다.
(mock이 가짜라고 하지만 프록시도 가짜고 그래서 가짜라는 말이 싫다.)

@WebMvcTest
class DeliveryTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void create_Delivery() throws Exception {
        mockMvc.perform(post("/api/delivery"))
               .andExpect(status().isCreated());
    }
}

테스트 코드는 이렇게 자성하였다.
포스트 방식으로 보내고, url이 들어오면 생성하라는 뜻이다.

하지만 이건404에러가 발생된다.

왜냐하면 컨트롤러를 만들지 않았기 때문이다.

그러면 컨트롤러를 만들어보자.

@Controller
public class DeliveryController {
    
    @PostMapping("/api/delivery")
    public ResponseEntity createDelivery() {
        
        return ResponseEntity.created().build();
    }
}

ResponseEntity는 응답엔티티를 결정하는 행위라 생각이 든다.
근데 created를 하기 위해서는 uri가 필요하다.

uri를 만들어보자.


원래는

URI uri = URI.create("/api/delivery");

이렇게 만들어야 되지만... 이렇게 만들게 되면 문제점이
uri가 변경이 된다면 저 uri를 수정해되는 불상사가 발생될 수 있다.(아닐 가능성이 더 크지만...ㅎㅎ)

spring hateoaus를 사용하면 링크를 쉽게 만들 수 있다.

 URI createUri = linkTo(DeliveryController.class).slash("{id}").toUri();

위 코드는 위에서 작성된 uri와 같은 결과를 보여준다.

근데 내가 기대한 uri랑 다른 정보가 나왔다.
왜냐하면 나는 클래스에 정의된 매핑값을 가져왔기 때문이다.
이걸 메소드로 바꿔줘야 된다.

URI createUri = linkTo(methodOn(DeliveryController.class).createDelivery()).slash("{id}").toUri();

이제 delivery정보를 넘겨서 그안에 정보들을 넣어보자.
근데 문제가 발생했다.

메소드가 파라미터가 필요하기 때문에 파라미터를 넣어줘야 했다. 
여기서 2가지 방법이 존재한다.

저곳에 null을 넣던지,
아니면, 클래스에 정의 하던지 결정해야된다.

나는 클래스에 정의하는 방식이 좋을 것 같다고 생각한다.

그래서 변경하고 다시 생행해주었더니,

이런에러가 발생하였다.

구글의 힘을 빌린 결과 이건 500에러와 관련이 있다고 한다.
그렇다는건 값이 적절하게 들어가지 않았기 때문인가?
확인 결과,
내가 만든 dto에 문제가 있었다.
빌더로 만들게 되면 모든 정보를 넣어야 된다.

하지만 이것을 이용하기 위해서는 빈 생성자도 필요하다.
그러면 @NoArgsConstructor만 추가하면 될까?

하지만 이렇게 만들게 되면 더이상 모든 정보를 넣지 않기 때문에 빌더의 역할은 없어진다.
그래서

@Builder
@Setter @Getter
@NoArgsConstructor
@AllArgsConstructor
public class Delivery {

정상적으로 나왔다.

원래 header에도 값을 추가하는게 좋지만, 그냥 간단하기 위해 이렇게 했다.ㅎ;

반응형

댓글

Designed by JB FACTORY