레스토랑 예약 사이트 1 - 레스토랑 관리(관리자) 모든 레스토랑 가져오기

패스트 캠퍼스에서 레스토량 예약 사이트 만드는 Toy project를 진행 했다. 해당 프로젝트를 진행하면서 배울 수 있었던 것은 TDD, 스프링부트를 이용한 Rest-Api작성 Multi-Module을 이용한 프로젝트 진행을 배울 수 있었다. 강의 내용들을 블로그 포스팅을 통해 다시 되집어 보려고 한다.

관리자 페이지

  1. 모든 Restaurant정보 가져오기
  2. 특정 Restaurant정보 가져오기
  3. Restaurant 추가하기
  4. Restaurant정보 수정하기

1. 모든 레스토랑에 대한 정보를 가져오기

Restaurant Controller 생성

레스토랑을 예약하기 위해서 예약할 수 있는 레스토랑 목록을 알아야 한다. /restaurant로 접근하면 모든 레스토랑의 정보를 가져올 수 있도록 한다.

RestaurantRepository 로부터 바로 데이터를 가져와 사용자에게 넘겨줘도 되지만, Service 계층을 넣어 데이터를 처리하는 로직과 사용자에게 View를 보여주는 control로직을 분리하도록 한다.

@RestController
@RequiredArgsConstructor
public class RestaurantController {
private final RestaurantService restaurantService;

@GetMapping("/restaurants")
public List<Restaurant> list() {
List<Restaurant> restaurants = restaurantService.getRestaurants();
return restaurants;
}
}

요청에 대한 테스트 코드 작성

@WebMvcTest(RestaurantController.class)
@AutoConfigureMockMvc
class RestaurantControllerTest {

@Autowired
MockMvc mockMvc;

@Test
public void list를_확인한다() throws Exception{
ResultActions resultActions = mockMvc.perform(get("/restaurant"));

resultActions
.andExpect(status().isOk())
.andDo(print());
}
}

Restaurant Service 생성

@Service
@RequiredArgsConstructor
public class RestaurantService {

private final RestaurantRepository restaurantRepository;

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

Service 계층에 대한 Test코드 작성

class RestaurantServiceTest {

@Autowired
private MockMvc mockMvc;

@InjectMocks
private RestaurantService restaurantService;

@Mock
private RestaurantRepository restaurantRepository;

@Mock
private MenuItemRepository menuItemRepository;

@Mock
private ReviewRepository reviewRepository;

@BeforeEach
public void setUp() {
MockitoAnnotations.openMocks(this);

mockRestaurantRepository();
mockMenuItemRepository();
mockReviewRepository();

}

private void mockRestaurantRepository() {
List<Restaurant> restaurants = new ArrayList<>();
Restaurant restaurant = Restaurant.builder()
.id(1004L)
.address("Seoul")
.categoryId(1L)
.name("Bob zip")
.build();
restaurants.add(restaurant);

// address와 category를 사용해 검색한다.
given(restaurantRepository
.findAllByAddressContainingAndCategoryId("Seoul", 1L))
.willReturn(restaurants);

given(restaurantRepository.findById(1004L))
.willReturn(Optional.of(restaurant));
}

private void mockMenuItemRepository() {
List<MenuItem> menuItems = new ArrayList<>();
menuItems.add((MenuItem.builder()
.name("Kimchi")
.build()));

given(menuItemRepository.findAllByRestaurantId(1004L)).willReturn(menuItems);
}

private void mockReviewRepository() {
List<Review> reviews = new ArrayList<>();
reviews.add(Review.builder()
.name("BeRyong")
.score(1)
.description("Bad")
.build());

given(reviewRepository.findAllByRestaurantId(1004L)).willReturn(reviews);
}


@Test @DisplayName("모든 레스토랑을 가져온다.")
public void list() {
String region = "Seoul";
Long categoryId = 1L;

List<Restaurant> restaurants = restaurantService.getRestaurants(region, categoryId);
Restaurant restaurant = restaurants.get(0);
assertThat(restaurant.getId()).isEqualTo(1004L);
}
}
Share