공기밥 프로젝트 4 (@Transactional을 활용한 데이터 입력, MultipartHttpServletRequest 테스트 하는 법)

Jay_u·2023년 7월 28일
0

공기밥 프로젝트

목록 보기
4/5

@Transactional을 활용한 데이터 입력

각각의 input을 채우고 등록하기 버튼을 누르면
Ajax를 통해 데이터를 입력한다.

일단 컨트롤러에서 정상적으로 log가 찍히는 것을 확인했다.

트랜잭션 처리는 비지니스 로직을 담당하는 서비스 쪽에서 처리해야 한다.

@Transactional(rollbackFor = Exception.class)

예외가 발생하면 롤백한다는 뜻이다.
다만 문제는 모든 예외가 롤백 대상이므로 특정 예외를 제외 시키고 싶다면 rollbackFor에 포함시키지 않으면 된다.

일단 엔티티를 활용해 form 데이터를 받지 않고
getParameter로 모든 값을 변수에 넣었다. 그리고 생성자를 통해 Place와 VisitHistory 객체를 만들어서 데이터를 생성했다.
이 과정에서 예외가 발생하면 롤백된다.

fileManger를 통해 MultipartFile의 크기와 파일이름, 경로를 통해 파일을 해당 폴더 밑에 생성해준다.
나 같은 경우 System.getPropery("user.dir") 로 해당 프로젝트의 루트경로를 가져와
src > main > resources > static > img > restaurant 라는 폴더 밑으로 파일을 넣어주기로 했다.

기존 파일명에서 확장자명을 뽑아내서 timestamp를 통해 만든 새로운 파일명에 붙여서 DB에 넣어준다.

MultipartHttpServletRequest 컨트롤러 테스트 하는 법

이렇게 만든 서비스 클래스는 어떻게 테스트할 수 있을까?


    @Test
    @DisplayName("음식점 처음 등록 테스트")
    void registerPlaceFirstTest() throws Exception {
        MockMultipartFile file = new MockMultipartFile("fileName", "image.jpg", MediaType.IMAGE_JPEG_VALUE, "010101".getBytes());
        mockMvc.perform(MockMvcRequestBuilders.multipart("/admin/registerRestaurant")
                        .file(file)
                        .param("selectedCity", "11")
                        .param("selectedDistrict", "110")
                        .param("restaurantName", "테스트 음식점명")
                        .param("visitDay", "20230707")
                        .param("visitorsNum", "3")
                        .param("spendMoney", "30,000")
                        .param("latitude", "23.23")
                        .param("longitude", "17.17"))
                .andExpect(MockMvcResultMatchers.status().is2xxSuccessful())
                .andExpect(result -> {
                    String response = result.getResponse().getContentAsString();
                    if(response.equals("0")) {
                        throw new AssertionError("테스트 실패 - 응답 값이 0 이면 데이터 입력 실패");
                    }
                });
    }

MockMultipartFile을 활용해 가상의 파일을 만들어준다.
MockMvc는 Http의 요청을 가상으로 생성하는 것으로 나의 경우 Post로 넘겨준 값들을 컨트롤러 -> 서비스 -> Repository 까지의 통합 테스트를 진행하기 위해서 사용하게 되었다.

아무튼 만든 파일을 mockMvc .file() 을 활용해서 넣어주고
.param을 통해 input의 name 즉, 파라미터명과 그에 해당하는 테스트 값을 넣어서 보냈다.

이렇게 진행해서 .andExpect를 통해 200 번대 상태가 나타나는지 또한 json 값으로 0을 받으면 실패한 것이기 때문에 0이 아닌 다른 값(visithistory의 id 값)을 받는지 테스트 해보았다.

profile
정확한 정보를 전달할려고 노력합니다.

2개의 댓글

comment-user-thumbnail
2023년 7월 28일

개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.

1개의 답글