인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

소리쨩님의 프로필 이미지
소리쨩

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

예제로 구현하는 파일 업로드, 다운로드

item과 itemform을 따로 만든 이유,,

작성

·

427

1

item은 UploadFile이라 <MultipartFile>인 itemForm을 만드셨다고 하셨는데 이해가 잘 가지 않아서요,,

제가 생각하기엔 item.java에 같이 만들어도 되는게 아닐까 해서요ㅠㅠ 잘 몰라서,,

그리고 controller 패키지에 ItemForm.java 파일을 만드신 이유가 있나요??

답변 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 패키지에 묶어둔 것으로 보시면 됩니다.

감사합니다.

소리쨩님의 프로필 이미지
소리쨩

작성한 질문수

질문하기