이번에는 강의를 듣기전에 먼저 작성하기로 해보자. 이벤트 수정의 경우는 1. 수정이 정상적으로 실행이 되었을때 : 200 2. 수정이 잘못된 경우 - 비어있는 객체가 들어있을 경우. - 잘못된 객체가 들어올 경우.. - 권한이 없는 사람이 접근했을 경우 - 페이지가 존재하지 않는 경우 이렇게 들 수 있는데... 솔직히 2-3은 지금당장은 하지 못할 것 같다. 왜냐하면 유저를 고려하지 않았기 때문이다. 테스트 코드를 작성해보자. @Test void update_event() throws Exception { Delivery delivery = generateEvent(100); DeliveryDto deliveryDto = modelMapper.map(delivery, DeliveryDto.class); ..
곧 회사일이 바빠진다고 한다. 바빠지기 전에 열심히 공부 하자! 간단하게 테스트 부터 작성해보자. @Test public void create_event() throws Exception { Delivery delivery = generateEvent(100); this.mockMvc.perform(get("/api/delivery/{id}",delivery.getId())) .andDo(print()) .andExpect(status().isOk()) .andExpect(jsonPath("id").exists()) .andExpect(jsonPath("_links.self").exists()) .andExpect(jsonPath("_links.profile").exists()); } 이것을 실행하면 어..
먼저 테스트 코드부터 작성하자. @Test void eventQuery() { IntStream.range(0, 30) .forEach(this::generateEvent); } private void generateEvent(int index) { Delivery delivery = Delivery.builder() .item("Delivery" + index) .user("klom") .build(); deliveryRepository.save(delivery); } 이렇게 작성하면 나는 0번부터 30번까지의 이벤트를 생성하는 로직이다. 그러면 생각해야 될것이 이제 이것들을 테스트를 해야 된다. 최종 코드는 다음과 같다. @Test void eventQuery() throws Exception { I..
* 여기서 인덱스란? 메인 페이지를 뜻합니다. 메인페이지를 위한 테스트 코드를 작성하자. @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) @AutoConfigureMockMvc @AutoConfigureRestDocs @Import(RestDocsConfiguration.class) @ActiveProfiles("test") public class IndexControllerTest { @Autowired private MockMvc mockMvc; @Test void index() throws Exception { mockMvc.perform(get("/delivery")) .andDo(print()) .andExpect(sta..
람다는 왜 만들어졌을까? 람다를 사용하게 되면 굉장히 코드가 단순해진다는 것을 느낄 수 있다. 런타임시에는 익명 함수로 사용하든 람다식으로 고쳐서 사용하든 상관없다는 뜻이 된다. 최대한 간결하게 만들어서 실수를 방지 하는것이 좋지 않을까? 예를 들어, Hello hello = new Hello() { @Override public void write(String writer) { System.out.println(writer); } }; 다음과 같은 익명 함수가 존재한다고 해보자. 이것을 람다로 사용하게 된다면, Hello hello = writer -> { System.out.println(writer); }; 단, 한줄로 코드가 변경되었다. 여기서 의문인것이 어노테이션, enum,제네릭과 달리 이전 ..
이제 문서를 빌드해보자. 그전에 pom.xml에 다음을 작성하자. org.asciidoctor asciidoctor-maven-plugin 1.5.8 generate-docs prepare-package process-asciidoc html book org.springframework.restdocs spring-restdocs-asciidoctor ${spring-restdocs.version} maven-resources-plugin 2.7 copy-resources prepare-package copy-resources ${project.build.outputDirectory}/static/docs ${project.build.directory}/generated-docs 만약에 버전이 맞지 않는..
오랜만에 작성하는것 같다. 아무튼 다시 작성하게 되어서 기쁘다.! restAPI docs를 만들기 위해서는 org.springframework.restdocs spring-restdocs-mockmvc test 이 의존성을 추가해줘야 한다. RestApi 만들기 - spring-rest-docs (5) 자 드디어 rest-docs를 적용할때가 왔다. Spring REST Docs Document RESTful services by combining hand-written documentation with auto-generated snippets produced with Spring MVC Test. docs.spring.io.. b-programmer.tistory.com 이글에서 spring-rest..
모듈(module)은 역사적으로 프로그래밍이라는 관점에서는 기본적으로 본체에 대한 독립된 하위 단위라는 필연적인 개념의 큰 틀을 따르고 있지만 본체와 모듈 간에 가지고 있었던 문제들을 해결해 나가는 과정에서 발전하였다. 모듈에 가장 큰 영향을 미쳤던 클래스 그리고 라이브러리가 향상됨에 따라 점차 발전하였다. 이러한 지속 가능성은 이것의 가장 큰 장점 중 하나이다. 초기에는 분리된 독립성의 모듈로 도입되었으나 점차로 객체화, 캡슐화, 모듈화 프로그래밍 기법 등 여러 기능들이 추가되면서 점차적으로 영역이 나뉘어가고 있다. 그러나 이로 인하여 모듈성을 제대로 반영하지 못하고 있다는 비난을 받을 수도 있다. 한편 이러한 비난은 모듈 시스템, 모듈 프로그래밍이 갖는 현재의 한계를 인식하고 보다 안정적으로 발전하기..
제네릭은 왜 사용할까? 제네릭은 JDK1.5부터 새롭게 등장했다. 그러면 제네릭이 도입되면서 어떤것이 바뀌었는지 고민해보자. 제네릭을 사용하면 타입 안정성이 증가하고, 타입체크와 형 변환을 생략할 수 있어서 코드가 간결해 진다고 한다. 과연 사실일까? 제네릭을 사용하는 대표적인 클래스로는 List가 있다. List list = new ArrayList(); 이 리스트는 어떠한 값이든 저장할 수 있다. List list = new ArrayList(); list.add(2); list.add("Hello"); list.add(100L); list.add(1.5); int, string, long, double다양한 타입이 들어왔다. 이것을 출력해보자. for (Object object : list) { S..
자 드디어 rest-docs를 적용할때가 왔다. Spring REST Docs Document RESTful services by combining hand-written documentation with auto-generated snippets produced with Spring MVC Test. docs.spring.io 원래 private MockMvc mockMvc; @Autowired private WebApplicationContext context; @Before public void setUp() { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context) .apply(documentationConfiguration(this.re..
HATEOAS란 무엇일까? Hypermedia as the Engine of Application State의 약자로 요청에 대한 응답값에 사용자가 사이트를 네비게이션 할 수 있는 링크들을 만들어 포함시킬 수 있도록 해주는 라이브러리라고 한다. 이러한 기능을 스프링에서 제공하고 있다. 그래서 스프링 헤이티오스 그럼 헤이티오스는 어떤 것을 해줄까? 크게 2가지 부분으로 나눌 수 있다. 첫 번째는 링크를 만들 수 있는 기능을 제공한다. 링크 만드는 방법 : linkTo(DeliveryController.class).slash(newDelivery.getId()).toUri(); 링크를 만드는 방법은 이것말고도 많은데, 대표적으로 linkTo로 만드는 방법이 존재한다. lonkTo로 uri를 만들 수 있게 되..
만약에 검색 조건을 잘못 입력한 경우는 어떻게 될까? 최대한 간단하게 작성해봤다. 만약에, 주문 날짜가 배달 완료 날짜보다 늦은 경우라면 어떻게 해야할까? 솔직히 말이 되지 않는다. 이럴때는 어떻게 처리를 해야할까? @Test void badRequest() throws Exception { DeliveryDto delivery = DeliveryDto.builder() .item("book") .user("klom") .deliveryTime(LocalDateTime.now().plusDays(10)) .deliveryEndTime(LocalDateTime.now()) .itemPrice(0) .build(); mockMvc.perform(post("/api/delivery/") .accept(Medi..