이미지 등록

jungnoeun·2023년 2월 9일
0

kiri

목록 보기
9/13

추가

  • ImageController의 @RequestParam에 required=false를 붙여야 할듯?

이미지 관련 코드 작성하면서

참고

https://green-joo.tistory.com/2




test 작성 하면서 에러...

현재, 이미지 등록 테스트 코드를 작성하면서 400 에러가 발생하였다.
작성한 테스트 코드는 아래와 같다.

@Import({TestConfig.class})//, S3MockConfig.class})
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
@Transactional
class ImageControllerTest {

    static {
        System.setProperty("com.amazonaws.sdk.disableEc2Metadata", "true");
    }

    @Autowired
    private WebApplicationContext ctx;
    private ObjectMapper objectMapper = new ObjectMapper();
    private MockMvc mockMvc;
    @Autowired private ImageRepository imageRepository;
    @Autowired private PostRepository postRepository;
    @Autowired private MemberRepository memberRepository;
    @Autowired private PostService postService;
    @Autowired private ImageService imageService;
    @Autowired private ImageController imageController;

//    @Autowired private S3Mock s3Mock;

    @BeforeEach
    public void setup() {
        mockMvc = MockMvcBuilders.webAppContextSetup(ctx)
                .addFilters(new CharacterEncodingFilter("UTF-8", true))  // 한글 깨짐 처리
//                .apply(SecurityMockMvcConfigurers.springSecurity())
                .build();
    }



    @AfterEach
    void afterEach() {
        imageRepository.deleteAll();
        postRepository.deleteAll();
        memberRepository.deleteAll();
//        s3Mock.stop();
    }


    @WithAccount("creamyyyy")
    @DisplayName("이미지 등록 테스트")
    @Test
    public void createImageTest() throws Exception {
        //given

        String filename = "testImage"; // 파일 명
        String contentType = "png"; // 파일 타입
        String filePath = "C:\\Users\\user\\OneDrive\\사진" + File.separator + filename + "." + contentType; // 파일 경로
        FileInputStream fileInputStream = new FileInputStream(filePath);

        MockMultipartFile image1 = new MockMultipartFile(
                filename,
                filename + "." + contentType,
                "image/png",
                filename.getBytes());


        //when
        //then
        this.mockMvc.perform(
                        MockMvcRequestBuilders // MockMvcRequestBuilders 를 안쓰면 get 함수를 인식 못함
                                .multipart("/api/posts/image") // 넣어준 컨트롤러의 Http Method 와 URL 을 지정
                                .file(image1)
//                                .contentType(MediaType.MULTIPART_FORM_DATA)
//                                .accept(MediaType.APPLICATION_JSON)
//                                .characterEncoding("UTF-8")
                )
                .andExpect(status().isOk())
                .andDo(print());
    }

}

에러 로그는 다음과 같다.
Required request part 'files' is not present
request 코드:

response 코드:

구글링을 하면서 나와 같은 문제를 만난 사람을 발견했다.
참고 링크: https://github.com/spring-projects/spring-framework/issues/26265
https://github.com/spring-projects/spring-framework/issues/26166
https://github.com/spring-projects/spring-framework/issues/26324

https://stackoverflow.com/questions/21800726/using-spring-mvc-test-to-unit-test-multipart-post-request

이 에러는 MockMultipartFile 을 생성하면서 넣어야 하는 첫번째 매개변수 값인 name 값을 컨트롤러에서 받는 파라미터인 @RequestPart(value = "files") List<MultipartFile> multipartFiles의 files라는 이름과 맞춰주지 않았기 때문에 발생하였다.

하지만 또 이어서 다른 에러가 발생하였다.

java.nio.file.AccessDeniedException: D:\workspace_intellij_forKiri\Kiri\server\kiri\temp\7e1e0609-bc01-4fe4-b3d8-e1f3c9307e1cfiles.png

바로 imageService에서 multipartFile을 File 로 변환하는 과정에서 발생한 것이다.
multipartFile.transferTo(file); // 에러 발생 코드 부분
이역시 나와 같은 에러가 발생한 상황을 발견할 수 있었다.
참고 링크: https://deonggi.tistory.com/123

하지만 Path를 이용한 절대경로에서도 에러는 발생하였고,
Postman을 이용해서 이미지의 업로드와 삭제를 실행해본 결과, 실행이 잘 되는 것을 확인할 수 있었다.
하지만 Controller Test code에서는 여전히 다음과 같은 에러가 발생하였다.

구글링을 해도 원하는 결과는 쉽게 찾아지지 않았고, 해당 디렉토리가 존재하지 않아서 발생하는 에러라고 생각했다.
하지만 해당 폴더를 보니 해당 폴더가 이미 만들어져 있는 것을 확인할 수 있었다.

정말 어떤 이유로 실행이 되지 않는 것일까?
업로드중..




참고 >

https://gaemi606.tistory.com/entry/JUnit5-multipartformdata-%EC%A0%84%EC%86%A1-%ED%85%8C%EC%8A%A4%ED%8A%B8-MockMultipartFile
https://jhkimmm.tistory.com/31
https://wedul.site/704
https://europani.github.io/aws/2022/03/03/004-spring-s3.html
https://velog.io/@hyemco/TIL-AWS-Spring-boot-S3%EB%A1%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%97%85%EB%A1%9C%EB%93%9C#%EA%B5%AC%ED%98%84-%ED%99%95%EC%9D%B8---postman

profile
개발자

0개의 댓글