반응형
11.11. 레이어 분리 - 1 ~ 12. 12. 레이어 분리 - 2
==> 서비스 만들기( 복잡한 로직 처리: django view 역할 ), menu , item 만들기했음.
Layer Architecture 에 대해서 이야기 했던 지난시간.. (domain layer, ui layer, application layer)
우리는 ui layer (controller -> interfaces), domain layer(user, restaurant->domain) 을 배우고 직접 구현까지 했었다.
이번 시간에 application layer 에 대해 학습하고 구현해볼까 한다.-> 서비스 -> 복잡한 로직을 처리해준다.
menu., item
package kr.co.fastcampus.eatgo.domain;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.*;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Transient;
@Entity
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MenuItem {
@Id
@GeneratedValue
private Long id;
@Setter
private Long restaurantId;
private String name;
@Transient
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
private boolean destroy;
}
package kr.co.fastcampus.eatgo.application;
import kr.co.fastcampus.eatgo.domain.MenuItem;
import kr.co.fastcampus.eatgo.domain.MenuItemRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.util.List;
@Service
@Transactional
public class MenuItemService {
private MenuItemRepository menuItemRepository;
@Autowired
public MenuItemService(MenuItemRepository menuItemRepository) {
this.menuItemRepository = menuItemRepository;
}
public List<MenuItem> getMenuItems(Long restaurantId) {
return menuItemRepository.findAllByRestaurantId(restaurantId);
}
public void bulkUpdate(Long restaurantId, List<MenuItem> menuItems) {
for (MenuItem menuItem : menuItems) {
update(restaurantId, menuItem);
}
}
private void update(Long restaurantId, MenuItem menuItem) {
if (menuItem.isDestroy()) {
menuItemRepository.deleteById(menuItem.getId());
return;
}
menuItem.setRestaurantId(restaurantId);
menuItemRepository.save(menuItem);
}
}
아직까지 tdd 가 엄청난걸 모르겠는게 컴파일시간이 배로들것 같다..
어려운 이야기
서비스는
@Service 라는 어노테이션을 지정해주면, 스프링이 알아서 관리 해준다.
@Before: 모든 테스트 전에 실행하기
package kr.co.fastcampus.eatgo.interfaces;
import kr.co.fastcampus.eatgo.application.MenuItemService;
import kr.co.fastcampus.eatgo.domain.MenuItem;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import java.util.ArrayList;
import java.util.List;
import static org.hamcrest.core.StringContains.containsString;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.verify;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest(MenuItemController.class)
public class MenuItemControllerTests {
@Autowired
private MockMvc mvc;
@MockBean
private MenuItemService menuItemService;
@Test
public void list() throws Exception {
List<MenuItem> menuItems = new ArrayList<>();
menuItems.add(MenuItem.builder().name("Kimchi").build());
given(menuItemService.getMenuItems(1L)).willReturn(menuItems);
mvc.perform(get("/restaurants/1/menuitems"))
.andExpect(status().isOk())
.andExpect(content().string(containsString("Kimchi")));
}
@Test
public void bulkUpdate() throws Exception {
mvc.perform(patch("/restaurants/12/menuitems")
.contentType(MediaType.APPLICATION_JSON)
.content("[]"))
.andExpect(status().isOk());
verify(menuItemService).bulkUpdate(eq(12L), any());
}
}
자바 인강이 듣고 싶다면 =>https://bit.ly/3ilMbIO
반응형
'스프링, 자바' 카테고리의 다른 글
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 48회차 미션 (0) | 2020.09.26 |
---|---|
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 47회차 미션 (0) | 2020.09.25 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 45회차 미션 (0) | 2020.09.23 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 44회차 미션 (0) | 2020.09.22 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 43회차 미션 (0) | 2020.09.21 |