본문 바로가기
스프링과 JPA 기반 웹 어플리케이션 개발/5부 모임

65. 모임 수정

by Backchus 2020. 5. 4.

모임 수정 뷰

 

모임 수정 로직

  • 모집 방법은 수정할 수 없다.
  • 모집 인원은 확정된 참가 신청 수 보다는 커야 한다. 예) 5명의 참가 신청을 확정 상태로 변경했다면, 모임을 수정할 때 모집 인원 수가 5보다는 커야 한다. 3으로 줄이면 안된다.
  • 최대한 모임 개설하기 화면의 코드를 재사용한다.
  • 모집 인원을 늘린 선착순 모임의 경우에, 자동으로 추가 인원의 참가 신청을 확정 상태로 변경해야 한다. (나중에 할 일)

 

모임 수정 뷰 요청을 처리하는 핸들러 작성

package me.weekbelt.studyolle.event;

@Controller
@RequestMapping("/study/{path}")
@RequiredArgsConstructor
public class EventController {

    // .........
    
    @GetMapping("/events/{id}/edit")
    public String updateEventForm(@CurrentAccount Account account, @PathVariable String path,
                                  @PathVariable Long id, Model model) {
        Study study = studyService.getStudyToUpdate(account, path);
        Event event = eventService.findEventById(id);

        model.addAttribute("account", account);
        model.addAttribute("study", study);
        model.addAttribute("event", event);
        model.addAttribute(modelMapper.map(event, EventForm.class));
        return "event/update-form";
    }
}

 

모임 수정 뷰(event/update-form.html) 작성

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments.html :: head"></head>
<body class="bg-light">
<nav th:replace="fragments.html :: main-nav"></nav>
<div th:replace="fragments.html :: study-banner"></div>
<div class="container">
    <div th:replace="fragments.html :: event-form (mode='edit', action='/study/' + ${study.path}
        + '/events/' + ${event.id} + '/edit')"></div>
    <div th:replace="fragments.html :: footer"></div>
</div>
<script th:replace="fragments.html :: form-validation"></script>
<script th:replace="fragments.html :: editor-script"></script>
</body>
</html>

 

모임 수정 요청 처리 핸들러 작성

package me.weekbelt.studyolle.event;

@Controller
@RequestMapping("/study/{path}")
@RequiredArgsConstructor
public class EventController {

    // ........
    
    @PostMapping("/events/{id}/edit")
    public String updateEventSubmit(@CurrentAccount Account account, @PathVariable String path,
                                    @PathVariable Long id, @Valid EventForm eventForm,
                                    Errors errors, Model model) {
        Study study = studyService.getStudyToUpdate(account, path);
        Event event = eventService.findEventById(id);
        // 화면에 EventType 창이 없어도 서버에 요청이 가능하기 때문에 이것을 방지하기 위해
        eventForm.setEventType(event.getEventType());

        eventValidator.validateUpdateForm(eventForm, event, errors);

        if (errors.hasErrors()) {
            model.addAttribute("account", account);
            model.addAttribute("study", study);
            model.addAttribute("event", event);
            return "event/update-form";
        }


        eventService.updateEvent(event, eventForm);
        return "redirect:/study/" + study.getEncodedPath() + "/events/" + event.getId();
    }
}

 

수정하는 모집인원이 현재 참가자 수 보다 많아야 하기때문에 그것을 검증하는 로직을 EventValidator에 validateUpdateForm메소드로 추가한다.

package me.weekbelt.studyolle.event.validator;

@Component
public class EventValidator implements Validator {

    // .....

    public void validateUpdateForm(EventForm eventForm, Event event, Errors errors) {
        if (eventForm.getLimitOfEnrollments() < event.getNumberOfAcceptedEnrollments()) {
            errors.rejectValue("limitOfEnrollments", "wrong.value", "확인된 참가 신청보다 모집 인원 수가 커야 합니다.");
        }
    }
}

 

Event엔티티에 참가신청자의 갯수를 확인하는 getNumberOfAcceptedEnrollments메소드를 추가

package me.weekbelt.studyolle.domain;

// .....

public class Event {

    // .......
    
    public long getNumberOfAcceptedEnrollments() {
        return this.enrollments.stream().filter(Enrollment::isAccepted).count();
    }
}

 

모임 수정을 처리하는 메소드 작성

package me.weekbelt.studyolle.event;

@Service
@Transactional
@RequiredArgsConstructor
public class EventService {

    // .......
    
    private final ModelMapper modelMapper;

    // .......

    public void updateEvent(Event event, EventForm eventForm) {
        modelMapper.map(eventForm, event);
        // TODO 모집 인원을 늘린 선착순 모임의 경우에, 자동으로 추가 인원의 참가 신청을 확정 상태로 변경해야 한다. (나중에 할 일)
    }
}

 

 

참고: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-JPA-%EC%9B%B9%EC%95%B1#

 

스프링과 JPA 기반 웹 애플리케이션 개발 - 인프런

이 강좌에서 여러분은 실제로 운영 중인 서비스를 스프링, JPA 그리고 타임리프를 비롯한 여러 자바 기반의 여러 오픈 소스 기술을 사용하여 웹 애플리케이션을 개발하는 과정을 학습할 수 있습니다. 이 강좌를 충분히 학습한다면 여러분 만의 웹 서비스를 만들거나 취직에 도움이 될만한 포트폴리오를 만들 수 있을 겁니다. 중급이상 웹 개발 프레임워크 및 라이브러리 Java Spring Spring Boot Spring Data JPA Thymeleaf 온라인 강의

www.inflearn.com

 

'스프링과 JPA 기반 웹 어플리케이션 개발 > 5부 모임' 카테고리의 다른 글

67. 모임 참가 신청 및 취소  (0) 2020.05.06
66. 모임 취소  (0) 2020.05.04
64. 모임 목록 조회  (0) 2020.05.04
63. 모임 조회  (0) 2020.05.04
62. 모임 만들기 폼 서브밋  (0) 2020.05.04