항해99/개발일지

20220208 개발일지

paran21 2022. 2. 8. 23:37

코드잇에서 cs 듣던 부분을 모두 들었다.

강의가 세세하지는 않지만 큰 흐름을 잡기에 좋은 것 같다.

다른 강의들도 조금씩 들어야겠다.

 

JAVA랑 Spring 공부하려고 산 책을 스캔했다.

세세하게는 못봐도 항해하면서 1회독 하는걸 목표로 해야겠다.

 

Service부분을 추가적으로 리팩토링했다.

처음에는 혼자 리팩토링하는게 어려웠지만 매개변수와 return값만 잘 지정하고 나면 크게 어렵지 않았다.

 

security 권한 부여는 @Secured를 사용했다.

그런데 프론트를 구현해놓지 않아서 ARC로는 테스트가 한계가 있었다.

기존에 테스트 코드도 기능들이 추가되면서 수정이 필요한 상황이었다.

 

처음에는 기존에 있는 코드에서 수정을 하려고 했는데, security 부분이 들어가서 쉽지 않았다.

controller를 테스트하는 mvcTest를 이용하면 @WithMockUser를 사용해서 기능이 동작하는지 간단하게 테스트할 수 있을 것 같았다.

맞는 어노테이션을 달고 메소드 구현하는게 쉽지는 않았지만 Restaurant만 우선 구현하고 잘 실행되는 걸 확인했다.

security도 WebSecurityConfig에 api로 달기가 애매해서 Admin, User 모두 @Secured로 처리했다.

@RequiredArgsConstructor
@RestController
public class RestaurantController {

    private final RestaurantService restaurantService;

    //음식점 등록
    @Secured(UserRoleEnum.Authority.ADMIN)
    @PostMapping("/restaurant/register")
    public Restaurant postRestaurant(@RequestBody RestaurantDto restaurantDto) {
        return restaurantService.addRestaurant(restaurantDto);
    }

    //배달 가능한 음식점 조회(3 이내)
    @Secured(UserRoleEnum.Authority.USER)
    @GetMapping("/restaurants")
    public List<Restaurant> getRestaurantList(@RequestParam Long x, @RequestParam Long y) {
        return restaurantService.getRestaurantList(x, y);
    }

}

그리고 WebSecurityConfig에는 로그인 부분(모두 허용) / 그 외(로그인) 으로 설정했다.

http.authorizeRequests()
        // 회원 관리 처리 API 전부를 login 없이 허용
        .antMatchers("/user/**").permitAll()
        //.anyRequest().permitAll()
        .anyRequest().authenticated()

mvcTest코드는 우선 Restaurant만 등록(Admin, User), 조회(Admin, User)로 테스트했다.

각각 상황을 다 설정하니 코드가 길어져서 controller별로 클래스를 만들어도 될 것 같다.

@WebMvcTest(value = RestaurantController.class)
public class UserMvcTest {
    @Autowired
    private MockMvc mvc;

    @Autowired
    private ObjectMapper objectMapper;

    @MockBean
    UserService userService;

    @MockBean
    RestaurantService restaurantService;

    @MockBean
    FoodService foodService;

    @MockBean
    OrderService orderService;

    @Nested
    @DisplayName("음식점 등록")
    class Restaurant {

        @Test
        @WithMockUser(roles = "ADMIN")
        @DisplayName("신규 음식점 등록_ADMIN")
        void test1() throws Exception {

            // given
            String name = "일식집";
            Long minOrderPrice = 10000L;
            Long deliveryFee = 2000L;
            Long x = 3L;
            Long y = 4L;
            RestaurantDto restaurantDto = new RestaurantDto(
                    name, minOrderPrice, deliveryFee, x, y
            );

            String postInfo = objectMapper.writeValueAsString(restaurantDto);

            // when - then
            mvc.perform(post("/restaurant/register")
                            .content(postInfo)
                            .contentType(MediaType.APPLICATION_JSON)
                            .accept(MediaType.APPLICATION_JSON)
                    )
                    .andExpect(status().isOk())
                    .andDo(print());

        }

        @Test
        @WithMockUser(roles = "USER")
        @DisplayName("신규 음식점 등록_USER_403")
        void test2() throws Exception {

            // given
            String name = "일식집";
            Long minOrderPrice = 10000L;
            Long deliveryFee = 2000L;
            Long x = 3L;
            Long y = 4L;
            RestaurantDto restaurantDto = new RestaurantDto(
                    name, minOrderPrice, deliveryFee, x, y
            );

            String postInfo = objectMapper.writeValueAsString(restaurantDto);

            // when - then
            mvc.perform(post("/restaurant/register")
                            .content(postInfo)
                            .contentType(MediaType.APPLICATION_JSON)
                            .accept(MediaType.APPLICATION_JSON)
                    )
                    .andExpect(status().isForbidden())
                    .andDo(print());
        }

        @Test
        @WithMockUser(roles = "ADMIN")
        @DisplayName("신규 음식점 등록_ADMIN")
        void test3() throws Exception {
            mvc.perform(get("/restaurants")
                            .param("x","3").param("y","4"))
                    .andExpect(status().isForbidden())
                    .andDo(print());
        }

        @Test
        @WithMockUser(roles = "USER")
        @DisplayName("신규 음식점 등록_USER")
        void test4() throws Exception {
            mvc.perform(get("/restaurants")
                            .param("x","3").param("y","4"))
                    .andExpect(status().isOk())
                    .andDo(print());
        }
    }

}

내일은 test부분 마저 수정하고 Spring, Java공부도 해야될 것 같다.