inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

458

소리쨩

작성한 질문수 6

1

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

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

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

MVC spring

답변 1

7

OMG

안녕하세요. 소리쨩님, 공식 서포터즈 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 패키지에 묶어둔 것으로 보시면 됩니다.

감사합니다.

이미지 업로드와 db 트랜잭션 묶는법

0

56

1

Could not resolve org.springframework.boot:spring-boot-starter-validation:2.4.4

0

72

2

MessageSourceTest 코드

0

56

1

인터셉터 에러 설정

0

57

1

resolveArgument()메서드 질문

0

64

1

43강 검증1 에서 실패 로직 관련 질문있습니다.

0

70

2

타임리프 3.X 버전 rendering, serializer 에러 해결 방법

2

140

3

스프링 빈에 등록이 안되는거 같은데 어떻게 하면 좋을까요?ㅠㅠ

0

103

3

pdf 오타 문의

0

61

1

ItemUpdateForm 검증 관련 질문입니다.

0

56

1

22page 링크 주소 변경

0

61

2

특정 데이터와 파일을 함께 저장 시, 테이블 구조 질문

0

56

1

섹션3번 수업에 대한 질문입니다.

0

89

2

@Autowired 보다 더 좋은 방법이 어떤 걸까요?

0

91

2

타입컨버터 가 람다랑 비슷해 보이는데 저의 생각이 맞는지?.

0

72

1

자바스크립트 인라인에서 객체 직렬화 시 오류가 납니다

0

148

3

스프링부트 - 오류페이지2 에서 500.html 에서 쓰인 객체 질문

0

69

1

톰캣 에러 페이지가 안보입니다.

0

113

2

apiEceptionController에서 센드 에러 호출하면 안되는지?

0

85

1

세션 타임아웃시 쿠키 삭제 방법이 없나요?

0

129

2

ApiExceptionController 질문드립니다.

0

68

1

셀렉박스 챕터에서 option value에 ==배송 방식 선택== 이것을 넣은 이유가 궁금함, 이렇게 구상해도 되는지?

0

68

1

MemberRepository 필드의 fianl 선언 유무

0

89

2

혹시 index.html 에서는 fragment 사용이 안되는건가요

0

62

1