๐ Spring/Spring REST API
์ค๊ฐ ์๋ต... POST ์์ฒญ์ผ๋ก ๋ณด๋ด๋ฉด,, POST http://localhost:8080/boards/1/pockets requestBody : { "title" : "pocket title" } ์๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ๋์ถฉ ๋ณด๋๊น, PocketController์ addPocket ๋ฉ์๋์ linkTo๋ฅผ ์คํํ๋ค๊ฐ ์๋ฌ๊ฐ ๋ ๊ฒ๊ฐ๋ค. boardId๊ฐ์ ํ์ฅํ๊ธฐ ์ํ ๋ณ์๊ฐ์ด ์ถฉ๋ถํ์ง ์๋ค..? ๋ผ๊ณ ๋จ๋๋ฐ ๋ญ ๋ง์ด์ง.. @PostMapping public ResponseEntity addPocket(@PathVariable Long boardId, @RequestBody PocketDto pocketDto) throws NotFoundException { System.out.println("boar..
๐ Spring/Spring REST API
๋น์ฆ๋์ค ๋ก์ง ์ ์ฉ ๋๋์ง ์๋ต ๋ฉ์์ง ํ์ธ offline ๊ณผ free ๊ฐ ํ์ธ ๋น์ฆ๋์ค ๋ก์ง ์ผ๋จ offline์ location์ ๊ฐ์ด ๋ค์ด์์ผ๋ฉด ์คํ๋ผ์ธ์ด๊ณ , ๊ฐ์ด ์์ผ๋ฉด ์จ๋ผ์ธ์ผ๋ก ์งํ์ด ๋๋ค. free๊ฐ์ basePrice์, MaxPrice๊ฐ ๋ ๋ค 0์ผ๋ , free ์ด๋ค. Event.class ๋๋ฉ์ธ ํด๋์ค์๋ค๊ฐ ๋น์ฆ๋์ค ๋ก์ง์ ์ ์ฉ์์ผ์ค๋ค. public void update() { this.free = (basePrice == 0) && (maxPrice == 0); this.offline = location != null; } EventTests.class @Test public void testOffine() { // Given Event event = Event.builder() ...
๐ Spring/Spring REST API
์ด๋ฒ์ ํ ๊ฒ์ Bad Request ์๋ต ๋ณธ๋ฌธ ๋ง๋ค๊ธฐ ์ด๋ค. EventController ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด, @PostMapping public ResponseEntity createEvent(@RequestBody @Valid EventDto eventDto, Errors errors) { //@Valid ์ค๋ฅ๊ฐ ๋๋ค๋ฉด, ์์กด์ฑ ์ถ๊ฐ : spring-boot-starter-validation ์ ํด์ค๋ค. if (errors.hasErrors()) { return ResponseEntity.badRequest().build(); } eventValidator.validate(eventDto, errors); if (errors.hasErrors()) { return ResponseEntity.badReq..
๐ Spring/Spring REST API
@Valid ์ BindingResult (๋๋ Errors) BindingResult ๋ ํญ์ @Valid ๋ฐ๋ก ๋ค์ ์ธ์๋ก ์ฌ์ฉํด์ผ ํจ (์คํ๋ง MVC) @NotNull, @NotEmpty, @Min, @Max ... ์ฌ์ฉํด์ ์
๋ ฅ๊ฐ ๋ฐ์ธ๋ฉ ํ ๋ ์๋ฌ ํ์ธ์ด ๊ฐ๋ฅํ๋ค ๋๋ฉ์ธ Validator ๋ง๋ค๊ธฐ Validator ์ธํฐํ์ด์ค ์์ด ๋ง๋ค์ด๋ ์๊ด์๋ค. @Component public class EventValidator { public void validate(EventDto eventDto, Errors errors) { if (eventDto.getBasePrice() > eventDto.getMaxPrice() && eventDto.getMaxPrice() != 0) { errors.reject..
๐ Spring/Spring REST API
ํ
์คํธ ํ ๊ฒ ์
๋ ฅ๊ฐ์ผ๋ก ๋๊ฐ id๋ eventStatus, offline, free ์ด๋ฐ ๋ฐ์ดํฐ๊น์ง ๊ฐ์ด ์ฃผ๋ฉด? Bad_Request ๋ฐ์ (์ด๋ฒ ํ
์คํธ!) vs ๋ฐ๊ธฐ๋ก ํ ๊ฐ ์ด์ธ๋ ๋ฌด์ ํต์ฌ ์ฝ๋ ObjectMapper ์ปค์คํฐ๋ง์ด์ง spring.jackson.deserialization.fail-on-unknown-properties = true // deserialization : ์ญ์ง๋ ฌํ(JSON -> ๊ฐ์ฒด) ๋ฅผ ํ๋๋ฐ, unknown-properties๊ฐ ์์ผ๋ฉด -> fail-on ์คํจ๋ฅผ ๋์ง๋ค.application.properties spring.jackson.deserialization.fail-on-unknown-properties=true #์ deserialization์ด๋๋ฉด, (Js..
๐ Spring/Spring REST API
ํ
์คํธ ํ ๊ฒ ์
๋ ฅ๊ฐ์ผ๋ก ๋๊ฐ id๋ eventStatus, offline, free ์ด๋ฐ ๋ฐ์ดํฐ๊น์ง ๊ฐ์ด ์ฃผ๋ฉด? Bad_Request ๋ก ์๋ต vs ๋ฐ๊ธฐ๋ก ํ ๊ฐ ์ด์ธ๋ ๋ฌด์! (์ด๋ฒ ํ
์คํธ ๋ฐฉ๋ฒ) ์
๋ ฅ๊ฐ ์ ํ id ๋๋ ์
๋ ฅ ๋ฐ์ ๋ฐ์ดํฐ๋ก ๊ณ์ฐํด์ผ ํ๋ ๊ฐ๋ค์ ์
๋ ฅ ๋ฐ์ง ์์์ผ ํ๋ค. EventDTO ์ ์ฉ DTO -> ๋๋ฉ์ธ ๊ฐ์ฒด๋ก ๊ฐ ๋ณต์ฌ ModelMapper ์์กด์ฑ ์ถ๊ฐ org.modelmapper modelmapper 2.3.1 ๋น์ผ๋ก ๋ฑ๋ก @Configuration ์๋์ @Bean public ModelMapper modelMapper(){ return new ModelMapper(); }ํตํฉ ํ
์คํธ๋ก ์ ํ @WebMvcTest ๋นผ๊ณ ๋ค์ ์ ๋
ธํ
์ด์
์ถ๊ฐ @SpringBootTest @Aut..