[JPA] 첨부파일 업로드 경로(resources/static/img) 직접 지정하고 테스트하기

김정연·2024년 2월 16일
post-thumbnail

🤓 디스코드에는 프로필을 등록할 수 있는데, 이미지 저장하는 코드를 작성하고 실행해보니.. 이미지의 저장 위치가 심각하게 이상한 곳으로 가있었다.....

static의 위치 ?

내가 알던 루트 위치는 resources/static/img 이다. 즉 "static/img/user" 이런 위치로 경로를 정해주면 알아서 static에 폴더가 생기는 것이 나의 계획인데 ㅠㅠ 폴더는 이상한 곳에 혼자 생겼다..
수정 전 코드이다.

 public void addProfile(List<MultipartFile> files, Long user_id) {
	        List<String> profile = files.stream().map(file -> {
	            String original = file.getOriginalFilename();
	            // 상대경로
	            String relativePath = "img/user/" + user_id + "/" + original;
	            // 절대경로
	            String absolutePath = "static/" + relativePath;

	            try {
	                Path directoryPath = Paths.get("static/img/user/" + user_id);
	                Files.createDirectories(directoryPath);
	                Path filePath = Paths.get(absolutePath);
	                Files.write(filePath, file.getBytes());
	                User user = userRepository.findById(user_id)
	                        .orElseThrow(() -> new IllegalArgumentException("ID에 해당하는 사용자를 찾을 수 없습니다: " + user_id));
                            
	               ... 생략 

나는 데이터베이스에 저장될 상대경로와 실제로 이미지가 저장될 절대경로로 따로 나누어 코드를 작성했다. 여기서 실제 폴더가 만들어지는 부분은 Path directoryPath = Paths.get("static/img/user/" + user_id); 이 부분인데 지금처럼 작성하고 코드를 실행할 경우 폴더의 위치가 매우 이상하게 생긴다.

트리 구조를 보면 resources와는 별도로 static 폴더가 생성되어 버린다. 그래서 찾아보니 두가지의 방법이 있어 시도해봤다.

첫번째

application.properties 에 직접 classpath값을 주는 것이다.

spring.mvc.static-path-pattern=/static/**
spring.web.resources.static-locations=classpath:/static/

나는 저장이지만 이렇게 하면 static의 위치를 부를 수 있다고 해서 적용해봤다. 하지만 실패!

두번째

현재 나의 경로에 classpath:를 추가하여 시도해보기

Path directoryPath = Paths.get("classpath:static/img/user/" + user_id);

classpath라고 명시적으로 알려줄 수 있다고 하여 시도했지만 참혹하게 실패했다.
classpath:static이라는 폴더가 생겨버렸다.

드디어 성공

마지막 방법은 폴더의 경로를 하나하나 직접 알려주는 방법이다!

Path directoryPath = Paths.get("src", "main", "resources","static", "img", "user", String.valueOf(user_id));

코드를 보면 src/main/resources/static/img/user라고 정확한 경로가 적혀있다.
이렇게 하나하나 알려줘본 후 코드를 실행해보니 내가 원하는 대로 이미지가 저장되었다.

postman 415 오류

첨부파일 테스트를 할 때는 form-data로 테스트를 하는데 415 오류가 발생했다.
자바에서 콘솔창에는 처음 보는 오류가 써있었다.

Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content-Type 'application/octet-stream' is not supported]

자세히보면 content-type을 지원하지 않는 다는 것이였는데 octet-stream이 문제인 것 같아 직접 타입을 작성했다.

이렇게 작성했더니 이미지가 등록이 잘 되었다. 나이스!

profile
백엔드 개발자

0개의 댓글