CODE SQUAD/회고록

[TIL] 일일 회고 2022/04/14 ~ 4/17

샤아이인 2022. 4. 17.

오늘 한 일

1. 백기선의 REST API 강좌 수강하기

rest api를 조금더 깊이있게 공부하기위 해서 지난주부터 듣기 시작한 강의를 72% 까지 들었다.

강의에서 핵심적인 부분이 한번에 이해되지 않아 2번 반복하여 들었더니 명확하게 이해가 된 것 같다.

실질적인 적용을 해보고 싶어 지난 2주동안 개발해오던 todo list 팀 프로젝트에 개인적으로 적용해보면서 연습하였다.

 

REST API를 깊이있게 공부하면서 다음 2가지에 대하여 깊이있게 이해하게 되었다.

1) self-descriptive한 message를 만들 수 있게 되었으며

2) HATEAOS를 지키는 API를 구현할 수 있게 되었다.

 

Spring이 진짜 여러모로 지원을 많이 해줘서 너무 좋다!

다음은 예시로 만들어본 event에 대한 Test 이다.

@Test
@DisplayName("정상적으로 이벤트 생성하는 테스트")
public void createEvent() throws Exception {
    EventDto event = EventDto.builder()
            .name("Spring")
            .description("REST API Development with Spring")
            .beginEnrollmentDateTime(LocalDateTime.of(2018, 11, 23, 14, 21))
            .closeEnrollmentDateTime(LocalDateTime.of(2018, 11, 24, 14, 21))
            .beginEventDateTime(LocalDateTime.of(2018, 11, 25, 14, 21))
            .endEventDateTime(LocalDateTime.of(2018, 11, 26, 14, 21))
            .basePrice(100)
            .maxPrice(200)
            .limitOfEnrollment(100)
            .location("강남역 D2 스타텁 팩토리")
            .build();

    mockMvc.perform(post("/api/events/")
                    .contentType(MediaType.APPLICATION_JSON)
                    .accept(MediaTypes.HAL_JSON)
                    .content(objectMapper.writeValueAsString(event)))
            .andDo(print())
            .andExpect(status().isCreated())
            .andExpect(jsonPath("id").exists())
            .andExpect(header().exists(HttpHeaders.LOCATION))
            .andExpect(header().string(HttpHeaders.CONTENT_TYPE, MediaTypes.HAL_JSON_VALUE))
            .andExpect(jsonPath("free").value(false))
            .andExpect(jsonPath("offline").value(true))
            .andExpect(jsonPath("eventStatus").value(EventStatus.DRAFT.name()))
            .andExpect(jsonPath("_links.self").exists())
            .andExpect(jsonPath("_links.query-events").exists())
            .andExpect(jsonPath("_links.update-events").exists())
            .andDo(document("create-event",
                    links(
                            linkWithRel("self").description("link to self"),
                            linkWithRel("query-events").description("link to query events"),
                            linkWithRel("update-events").description("link to update an existing event"),
                            linkWithRel("profile").description("link to update an existing event")
                    ),
                    requestHeaders(
                            headerWithName(HttpHeaders.ACCEPT).description("accept header"),
                            headerWithName(HttpHeaders.CONTENT_TYPE).description("content type")
                    ),
                    requestFields(
                            fieldWithPath("name").description("name of new event"),
                            fieldWithPath("description").description("description of new event"),
                            fieldWithPath("beginEnrollmentDateTime").description("beginEnrollmentDateTime of new event"),
                            fieldWithPath("closeEnrollmentDateTime").description("closeEnrollmentDateTime of new event"),
                            fieldWithPath("beginEventDateTime").description("beginEventDateTime of new event"),
                            fieldWithPath("endEventDateTime").description("endEventDateTime of new event"),
                            fieldWithPath("location").description("location of new event"),
                            fieldWithPath("basePrice").description("basePrice of new event"),
                            fieldWithPath("maxPrice").description("maxPrice of new event"),
                            fieldWithPath("limitOfEnrollment").description("limitOfEnrollment of new event")
                    ),
                    responseHeaders(
                            headerWithName(HttpHeaders.LOCATION).description("Location header"),
                            headerWithName(HttpHeaders.CONTENT_TYPE).description("Content type")
                    ),
                    responseFields(
                            fieldWithPath("id").description("id of new event"),
                            fieldWithPath("name").description("name of new event"),
                            fieldWithPath("description").description("description of new event"),
                            fieldWithPath("beginEnrollmentDateTime").description("beginEnrollmentDateTime of new event"),
                            fieldWithPath("closeEnrollmentDateTime").description("closeEnrollmentDateTime of new event"),
                            fieldWithPath("beginEventDateTime").description("beginEventDateTime of new event"),
                            fieldWithPath("endEventDateTime").description("endEventDateTime of new event"),
                            fieldWithPath("location").description("location of new event"),
                            fieldWithPath("basePrice").description("basePrice of new event"),
                            fieldWithPath("maxPrice").description("maxPrice of new event"),
                            fieldWithPath("limitOfEnrollment").description("limitOfEnrollment of new event"),
                            fieldWithPath("free").description("it tells is this event free or not?"),
                            fieldWithPath("offline").description("it tells is this event offline or online?"),
                            fieldWithPath("eventStatus").description("event status"),
                            fieldWithPath("_links.self.href").description("link to self"),
                            fieldWithPath("_links.query-events.href").description("link to query event list"),
                            fieldWithPath("_links.update-events.href").description("link to update"),
                            fieldWithPath("_links.profile.href").description("link to profile")
                    )
            ))
    ;
}

남은 4개의 프로젝트 또한 배웠던 기반 지식을 토대로 계속 적용하면서 응용해야겠다

 

2. 그런 REST API로 괜찮은가?

네이버의 D2에서 17년도에 했었던 컨퍼런스 영상인데, 진짜 내용이 좋다.

무엇보다 설명을 진짜 잘해주셔서 REST 자체에 대한 이해도가 한층 높아졌다.

 

영상을 보면서 기억하고싶은 점들을 다음과 같이 정리하였다.

 

[REST API] 그런 REST API로 괜찮은가?

naver D2 에서 발표를 보고 정리한 글 입니다. 문제될시 삭제하도록 하겠습니다! 다음 영상에 대한 정리를 간략하게 나마 해보았습니다! 1. 글을 쓰게 된 이유 그동안 REST에 대하여 명확하게 인식하

blogshine.tistory.com

 

3. 2차 PR 리뷰 정리하기

https://blogshine.tistory.com/366

 

[Review] 2022/04/10 2차 PR

1. 코드 리뷰 " data-ke-type="html"> <>HTML 삽입 미리보기할 수 없는 소스 1. 기존 순서와 겹치는 경우 순서가 겹치는 경우 해당 1번이 뒤로 밀리고, 그 사이에 삽입 되도록 하였다. 원래의 순서 1번은 2번

blogshine.tistory.com

이번 과제는 나의 팀원이 거의 독주를 하시는 2주였기 때문에... 내가 PR을 받는 느낌이 없었다.

코드를 그분이 거의 혼자 다 짜신거라... 최대한 리뷰해주신점의 의도라도 메모하려 노력하였다.

 

👍  Good

REST의 개념에 대하여 조금 명확하게 알게 되었다.

핵심은 self-descrive messages 과 HATEOAS 이다!!

또한 직접적으로 Spring에 적용하면서 그 활용법에 대하여 알게 되었다.

 

2주간 고통스러웠던 팀원과의 협업이 끝났다!! 말이 협업이지.. 혼자서 자기 맘대로만 하시는 분과 같이 공부하는것이 얼마나 힘든지 알게되는 2주였다....

 

👎 Bad

REST API 공부하느라 알고리즘 문제풀이를 7일동안 한문제 풀었다....

다음주에는 최소 4문제 이상은 풀자...

'CODE SQUAD > 회고록' 카테고리의 다른 글

[TIL] 일일 회고 2022/04/26  (0) 2022.04.26
[TIL] 일일 회고 2022/04/17 ~ 4/22  (0) 2022.04.22
[TIL] 일일 회고 2022/04/11 ~ 4/13  (0) 2022.04.13
[TIL] 일일 회고 2022/04/06 ~ 4/09  (0) 2022.04.10
[TIL] 일일 회고 2022/04/05  (0) 2022.04.05

댓글