작성
·
427
답변 1
7
안녕하세요. 소리쨩님, 공식 서포터즈 OMG입니다.
우리가 화면단에서 <input type="file"> 을 선택 할 때 서버단에서 받아오는 File은 ItemForm에 저장되어 서버로 넘어옵니다(ItemController)
@PostMapping("/items/new")
public String saveItem(@ModelAttribute ItemForm form, RedirectAttributes redirectAttributes) throws IOException {
import org.springframework.web.multipart.MultipartFile;
@Data
public class ItemForm {
private MultipartFile attachFile;
}
실제 파일은 MultipartFile에 해당한다고 보시면 됩니다. import문을 보시면 spring에서 지원하죠?
스프링의 Controller로 해당 파일의 정보를 넘기지만, 이제 화면단에서 받아온 이 정보를 DB에 저장할 때는 파일 자체를 저장하는게 아닌 파일의 이름, 경로 등의 문자열을 저장합니다.
@Data
public class Item {
private UploadFile attachFile;
}
@Data
public class UploadFile {
private String uploadFileName;
private String storeFileName;
public UploadFile(String uploadFileName, String storeFileName) {
this.uploadFileName = uploadFileName;
this.storeFileName = storeFileName;
}
}
받아온 파일을 통으로 저장하는게 아닌, 파일의 이름 정보만 저장하기 위해 ItemForm과 Item을 분리해서 구분지어 놓았다라고 생각하시면 될 것 같습니다.
@PostMapping("/items/new")
public String saveItem(@ModelAttribute ItemForm form, RedirectAttributes redirectAttributes) throws IOException {
UploadFile attachFile = fileStore.storeFile(form.getAttachFile());
List<UploadFile> storeImageFiles = fileStore.storeFiles(form.getImageFiles());
//데이터베이스에 저장
Item item = new Item();
item.setItemName(form.getItemName());
item.setAttachFile(attachFile);
item.setImageFiles(storeImageFiles);
itemRepository.save(item);
[ItemForm으로 받아왔지만, DB에 저장할 때는 Item으로 저장하는 코드]
그리고 controller 패키지에 ItemForm.java 파일을 만드신 이유가 있나요??
이 부분도 Item 클래스가 domain 패키지에 있고, ItemForm 클래스가 controller 패키지에 있는 이유와 일맥상통하는데요, ItemForm은 화면단에서의 폼 데이터와 매칭이되는 클래스이고 Controller로 전달되는 용도이기 때문에,
Item은 실제 DB에 저장되기 위한 목적을 가진 클래스 이기 때문에 ItemRepository와 함께 domain 패키지에 묶어둔 것으로 보시면 됩니다.
감사합니다.