레스토랑 예약 사이트 1 - 레스토랑 관리(관리자) 레스토랑 생성

3. 레스토랑 추가하기

레스토랑 생성 요청을 처리하기 위한 control 추가

Http 메소드들 중에서 post메소드를 사용해 새로운 레스토랑을 추가하는 요청을 처리할 것이고, /restaurnt경로로 요청이 들어올 경우 request body에 들어가 있는 데이터를 가져와 새로운 레스토랑을 생성한다.

@PostMapping("/restaurants")
public ResponseEntity<?> create(@RequestBody Restaurant resource) throws URISyntaxException {
String name = resource.getName();
String address = resource.getAddress();

Restaurant restaurant = Restaurant.builder()
.name(name)
.address(address)
.build();
restaurantService.addRestaurant(restaurant);

URI location = new URI("/restaurants/" + restaurant.getId());
return ResponseEntity.created(location).body("{}");
}

요청에 대한 레스토랑 생성 테스트 코드 작성

POJO를 JSON형태로 변환하기 위해 Jackson라이브러리의 ObjectMapper를 사용할 것이다.
ObjectMapper를 통해 Restaurant객체를 JSON String 형태로 변환해 request body에 넣어 /restaurants경로로 post요청을 한다.

@Autowired
private ObjectMapper objectMapper;

@Test
public void 새로운_레스토랑_저장하기() throws Exception {
String BobZip = "BobZip";
String Seoul = "Seoul";

Restaurant restaurant = Restaurant.builder()
.categoryId(1L)
.name(BobZip)
.address(Seoul)
.build();

// POJO를 JSON형태로 변환해준다.
String content = objectMapper.writeValueAsString(restaurant);

ResultActions resultActions = mockMvc.perform(post("/restaurants")
.content(content)
.contentType(MediaType.APPLICATION_JSON));

resultActions
.andExpect(status().isCreated())
.andDo(print());

}

새로운 레스토랑을 생성하는 요청을 한 후 레스토랑의 정보를 가져오는 요청을 해 해당 정보가 제대로 생성 됐는지 확인한다.

@Test
public void 새로운_레스토랑_저장_및_조회하기() throws Exception {
String BobZip = "BobZip";
String Seoul = "Seoul";

Restaurant restaurant = Restaurant.builder()
.categoryId(1L)
.name(BobZip)
.address(Seoul)
.build();

String content = objectMapper.writeValueAsString(restaurant);

ResultActions postResultActions = mockMvc.perform(post("/restaurants")
.content(content)
.contentType(MediaType.APPLICATION_JSON));

postResultActions
.andExpect(status().isCreated())
.andDo(print());


List<Restaurant> restaurants = new ArrayList<>();
restaurants.add(restaurant);
given(restaurantService.getRestaurants()).willReturn(restaurants);

ResultActions getResultActions = mockMvc.perform(get("/restaurants"));

getResultActions
.andExpect(status().isOk())
.andExpect(jsonPath("$[0].name").value(BobZip))
.andExpect(jsonPath("$[0].address").value(Seoul))
.andDo(print());
}

레스토랑 정보를 저장하는 Service 메소드 추가

@Service
@RequiredArgsConstructor
public class RestaurantService {
private final RestaurantRepository restaurantRepository;

// 전달받은 Restaurant정보를 저장하기 위한 서비스
public Restaurant addRestaurant(Restaurant restaurant) {
restaurantRepository.save(restaurant);
return restaurant;
}

public List<Restaurant> getRestaurants() {
List<Restaurant> restaurants = restaurantRepository.findAll();
return restaurants;
}

public Restaurant getRestaurant(Long id) {
Restaurant restaurant = restaurantRepository.findById(id)
.orElseThrow(() -> new RestaurantNotFoundException(id));

return restaurant;
}
}

레스토랑을 추가하는 테스트 코드 추가

@Test
public void 레스토랑_추가하기() {
given(restaurantRepository.save(any())).will(invocation -> {
Restaurant restaurant = invocation.getArgument(0);
restaurant.setId(1234L);
return restaurant;
});

Restaurant restaurant = Restaurant.builder()
.name("BeRyong")
.address("Busan")
.build();

Restaurant created = restaurantService.addRestaurant(restaurant);

assertThat(created.getId()).isEqualTo(1234L);
}
Share