[프로젝트] 다중 파일 처리, DB 저장 issue 해결

박연주·2022년 7월 10일
0

다중 파일을 받아와서 저장하기

전체과정

    예약폼     ->       프론트      ->   예약 컨트롤러    ->     서비스   ->  	DB저장
  controller     createEventForm     controller          service   	  repository
createRequestDto

List<MultipartFile>    files     List<MultipartFile>   List<String>   EventImage
files											      eventImageUrls  

files로 받아옴 -> List<MultipartFile> files -> RequestDto에 저장


# EventCreateRequestDto

@Data
public class EventCreateRequestDto {
    private String eventName;
    private EventCategory eventCategory;
    private String eventStartDate;
    private String eventEndDate;
    private String eventInfo;
    private Integer eventPrice;
    private List<MultipartFile> files;  // 프론트에서 받아서 저장
    private Long cafeNumber;
}
# EventController

	// 이벤트 예약 폼
    @Secured("ROLE_NORMAL")
    @GetMapping("/events/registration")
    public String createEventForm(User loginUser, Model model, @RequestParam Long cafeId) {

        if (loginUser != null) {
            model.addAttribute("userNick", loginUser.getUserNickname());
            model.addAttribute("userId", loginUser.getId());
            model.addAttribute("cafeId", cafeId);
        }
        model.addAttribute("eventCreateRequestDto", new EventCreateRequestDto());
        return "event/createEventForm";
    }

    // 이벤트 예약
    @PostMapping("/events")
    public String createEvent(User loginUser, @Validated @ModelAttribute EventCreateRequestDto requestDto, BindingResult result) {

        eventService.saveEvent(requestDto, loginUser);    // saveEvent

        if (result.hasErrors()) {
            return "event/createEventForm";
        } else {
            return "redirect:/events";
        }
    }
# EventService

// 이벤트 예약
    @Transactional
    public void saveEvent(EventCreateRequestDto requestDto, User securityUser) {

        User user = userRepository.getById(securityUser.getId());

        Cafe cafe = cafeRepository.findById(requestDto.getCafeNumber()).orElseThrow(
                () -> new NullPointerException("해당 카페가 존재하지 않습니다.")
        );

        Event event = new Event(requestDto);
        event.addCafe(cafe);
        event.addUser(user);

        List<MultipartFile> files = requestDto.getFiles();
        List<String> eventImageUrls = s3Service.upload(files, "eventImage");

        // 이벤트 이미지 생성
        MultipartFile file;
        String eventImageUrl;

        for (int i = 0; i < files.size(); i++) {
            file = files.get(i);
            eventImageUrl = eventImageUrls.get(i);
            EventImage eventImage = new EventImage(file.getOriginalFilename(), eventImageUrl);
            event.addEventImage(eventImage);
        }
        eventRepository.save(event);
    }

DB 저장 issue

Github issue

문제

  • S3에서 받아온 URL로 객체 생성은 되지만 EventImage가 DB에 저장이 되지 않는 문제

해결 방안

  • eventImage를 event의 하위 엔티티로 처리하는 cascade 을 달아주지 않아서 DB에 들어가지 않음
  • cascade = CascadeType.ALL 를 달아주면 연관관계대로 DB에 저장됨.


<처리 예시>
# Event.java

@OneToMany(mappedBy = "event", cascade = CascadeType.ALL)
private List<EventImage> eventImages = new ArrayList<>();

profile
하루에 한 개념씩

0개의 댓글