[SpringBoot] 쇼핑몰 프로젝트 : 파일 업로드(MultipartFile)
현재 진행중인 쇼핑몰 프로젝트에서 글쓰기와 게시판 기능을 맡게 되었고, 간단한 CRUD를 구현하기로 하였다.
그 중 PostMapping으로 <form> 태그를 통해 데이터를 전송하기로 고안했다.
우선 UploadFile을 하나 더 추가하고 Post에서 조인하는 방식으로 협의하였다.
UploadFile 속 name이 두 개가 들어가는데 파일을 저장할 때 들어가는 위치와 이름을 변환하여 넣는 파일 이름이다.
이렇게 하고 form 태그를 구현하면 다 될 줄 알았으나 문제가 생겼었다.
thymeleaf의 문법을 사용하여서 다음과 같이 작성하였다.
Object는 GetMapping에서 글을 작성할 페이지에다가 model에 Attribute 값을 붙여서 new Post() 엔티티를 생성하였다.
그런데 여기서 field에 post에 있는 photo, contents 필드를 생각하여 알맞게 넣었는데도 parsing 오류가 났었다.
(An error happened during template parsing...)
Lombok으로 Getter, Setter를 불러 올 수 있었는데 어떤 게 문제지 고민을 했었고, 다른 필드 없이 contents랑 UploadFile만 고려했기 때문에 그런가? 생각이 들었다. (지금 생각하면 uploadFile로 해야하는데 photo로 맘대로 지정하고 필드 이름을 photo로 지정했는데 왜 안되지? 해서 오류가 난 듯 하다. )
참고했던 thymeleaf 사용법은 아래와 같다.
https://frontbackend.com/thymeleaf/working-with-forms-in-thymeleaf
Working with Forms in Thymeleaf
1. Introduction In this article, we are going to show how to create HTML Forms in Thymeleaf with all necessary implementation on the backend side to h...
frontbackend.com
그래서 결국 postForm이라는 클래스를 생성하여서 @Getter @Setter를 붙여준 후 전송하는 방식으로 했고 잘 전송이 되었다.
데이터가 잘 넘어갔는지 궁금했고 Spring에서 제공하는 Logger를 통해 콘솔에 찍어 보았다.
public - () {
logger.info(post.getContents());
logger.info(String.valueOf(post.getPhoto()));
// ... PostForm 전송된 코드를 새 Post 에 넣는 코드
}
결과적으로 잘 넘어온 것을 확인할 수 있었다.
이제 넘어온 MultipartFile을 UploadFile 엔티티에 맞게 Name과 Path를 지정해서 넣어야 한다.
(이 코드는 팀원이 김영한님 MVC 강의를 보고 작성해서 변환할 수 있도록 한 걸 끌어다 썼다 ㅎㅎ..)
간략하게 말하자면 업로드한 Multipart 이미지에서 OriginalFileName을 가져와서 CreateStoreFileName 메소드 안 파라메터로 넣어준 뒤에 UploadFile 객체를 생성해서 setter를 해주면 된다.
이렇게 저장한 파일은 request를 통해 얻어둔 경로에서 main/webapp 폴더 지정 경로에 자동으로 path가 생성이 되며,
transferTo를 통해 랜덤으로 생성된 이름으로 파일이 저장이 된다.
여기서 문제가 발생하였다. 자꾸 ServletContext가 잡을 때 webapp을 잡는게 아니라 C 드라이브에 있는 톰캣 폴더에서 랜덤으로 생성한 폴더를 찾는 것이다.
지정한 폴더를 찾을 수 없다는 오류만 계속 나왔다. 삽질만 계속 하다가 결국 코드 하나씩 뜯어보면서 각 코드가 어떠한 역할을 하는지 뒤지기 시작했다.
request.getServletContext() : 구동되는 서버의 절대경로를 구하는 메소드라 한다.
검색을 해보니까 webapp이 main 하위 폴더에 있다면 충분히 잡을 수 있다고 하는데 이유는 알 수가 없다. 아마 실제 파일은 D://에 있고 구동되는 Tomcat은 C://tomcat 하위 폴더에 있어서 그런가 ? 생각이 들었다. (아닐 수도 있음.)
나중에 배포할 때는 몰라도 지금은 점검을 해야하므로 request에서 path를 가져오는 것 말고 파일 경로를 강제로 고정시켰더니 path를 찾을 수 없다는 500 에러는 없어졌다.
테스트를 해보고 DBeaver를 확인했는데 알맞게 들어갔다.
이제 UPLOADFILE_ID를 조인해서 리스트에 이미지를 가져와서 띄우면 되는데 이건 일단 내일 오전에 해보려고 한다. ㅠ
더불어서 지금 세션이 구현이 안되어 있어서 소비자 ID를 못넣었다. 이것도 추가적으로 공부 좀 해야할 듯 싶다.
일단 그래도 이 오류는 해결해서 다행인거 같다.