inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Spring MVC Phần 2 - Kỹ thuật vận dụng phát triển Web Backend

Thực hiện tải lên và tải xuống tệp qua ví dụ cụ thể

강사님 파일 업로드시 실제 DB에서 테이블을 만들려고 합니다.

620

Jong Hee Park

18 câu hỏi đã được viết

1

제가 JPA때 배운 내용을 되돌아보면

강의대로 테이블을 구성하면 에러가 나잖아요?

 

private Long id;

private String itemName;

private UploadFile attachFile;

 

 private List<UploadFile> imageFiles;

 

이런 경우 데이터베이스 테이블을 어떻게 만들어야 되나요?

 

 

MVC spring

Câu trả lời 2

0

Jong Hee Park

@Entity

@Getter @Setter

public class Item {

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)  // strategy=GenerationType.IDENTITY 시퀀스를 자기만의 시퀀스를 사용한다는 말.

@Column(name = "item_id")

private Long id;

private String itemName;

@JsonIgnore

@OneToMany(mappedBy = "item")

private List<Image> images = new ArrayList<>();

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)  // OneToOne은 접근을 많이 하는 쪽에 FK를 설정한다.

@JoinColumn(name = "file_id")  // FK를 delivery_id로 설정.

private File file;

/**

* SELECT * FROM item i JOIN `file` f ON i.file_id = f.file_id;

   SELECT * FROM item i JOIN image img ON i.item_id = img.item_id;

*/

}

 

 

@Entity

@Getter @Setter

public class Image extends UploadFile {

 

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)

@Column(name = "image_id")

private Long id;

private String uploadFileName;

private String storeFileName;

@ManyToOne(fetch = FetchType.LAZY)

@JoinColumn(name = "item_id")

private Item item;

public Image(String uploadFileName, String storeFileName) {

super(uploadFileName, storeFileName);

}

    

}

 

@Entity

@Getter @Setter

public class File extends UploadFile {

 

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)

@Column(name = "file_id")

private Long id;

private String uploadFileName;

private String storeFileName;

@JsonIgnore // 양방향 연관관계에서는 한쪽을 @JsonIgnore 꼭 달아줘야 한다.

@OneToOne(mappedBy = "file", fetch = FetchType.LAZY)

private Item item;

public File(String uploadFileName, String storeFileName) {

super(uploadFileName, storeFileName);

}

}

 

이렇게 3개로 나눴는데요

 

하이디sql에서 조인해서 가지고 오게하면 잘 가지고 옵니다. 근데 여기서 궁금한점이

Image나 File이나 둘다 UploadFile 클래스를 상속 받았는데요. 

 

public File(String uploadFileName, String storeFileName) {

super(uploadFileName, storeFileName);

}

이렇게 적어주면 상위 부모클래스로 공통으로 사용할 수 있게 하는건가요? 뭔가 이상하긴 한데 ... ㅠㅠ 

0

OMG

JPA 사용시 상속 관련하여JPA기본편 - 고급매핑 챕터를 참고해주세요.

 

0

Jong Hee Park

일단 jpa 사용안하고 mybatis로 파일 1개만 저장되게 구성해놨습니다. 실제로 저장도 제대로 되고 데이터 베이스에 경로도 잘 저장되는데 이미지 다중 저장처럼 여러개는 강의 다 듣고 고민해봐야겠습니다. ㅠㅠ

0

OMG

안녕하세요. Jong Hee Park님, 공식 서포터즈 OMG입니다.

JPA를 사용한다고 한다면, 

image 엔티티(id, 파일명, 파일저장경로)를 새로 만들어서 item 엔티티와 1:N[1=ITEM, N=IMAGES] 단방향 연관관계(추후 필요시 양방향으로 전환)로 설계할 것 같습니다.


감사합니다.

0

Jong Hee Park

JPA를 사용 안한다면 join으로 엮어줘야 하나요?

0

OMG

네 맞습니다.

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

0

42

1

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

0

52

2

MessageSourceTest 코드

0

47

1

인터셉터 에러 설정

0

48

1

resolveArgument()메서드 질문

0

56

1

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

0

54

2

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

2

133

3

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

0

90

3

pdf 오타 문의

0

57

1

ItemUpdateForm 검증 관련 질문입니다.

0

48

1

22page 링크 주소 변경

0

59

2

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

0

53

1

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

0

80

2

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

0

85

2

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

0

65

1

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

0

142

3

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

0

63

1

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

0

102

2

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

0

81

1

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

0

118

2

ApiExceptionController 질문드립니다.

0

64

1

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

0

66

1

MemberRepository 필드의 fianl 선언 유무

0

85

2

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

0

58

1