스터디 설정 - 경로 및 이름 수정, 삭제, 참여 및 탈퇴

Yuri Lee·2020년 11월 20일
0

경로 및 이름 수정

스터디 경로

form에서 들어오는 데이터를 검증할 때 지금까지는 Validator 만들고 initBinder에 등록했는데, 다른 방법을 사용할 수도 있다.

study/study.html

                    <form class="col-sm-12 needs-validation" th:action="@{'/study/' + ${study.path} + '/settings/study/path'}"
                          method="post" novalidate>
                        <div class="alert alert-warning" role="alert">
                            스터디 경로를 수정하면 이전에 사용하던 경로로 스터디에 접근할 수 없으니 주의하세요. <br/>
                        </div>
                        <div class="form-group">
                            <input id="path" type="text" name="newPath" th:value="${study.path}" class="form-control"
                                   placeholder="예) study-path" aria-describedby="pathHelp" required>
                            <small id="pathHelp" class="form-text text-muted">
                                공백없이 문자, 숫자, 대시(-)와 언더바(_)만 3자 이상 20자 이내로 입력하세요. 스터디 홈 주소에 사용합니다. 예) /study/<b>study-path</b>
                            </small>
                            <small class="invalid-feedback">스터디 경로를 입력하세요.</small>
                            <small class="form-text text-danger" th:if="${studyPathError}" th:text="${studyPathError}">Path Error</small>
                        </div>
                        <div class="form-group">
                            <button class="btn btn-outline-warning" type="submit" aria-describedby="submitHelp">경로 수정</button>
                        </div>
                    </form>

StudySettingsController.java

    @PostMapping("/study/path")
    public String updateStudyPath(@CurrentAccount Account account, @PathVariable String path, String newPath,
                                  Model model, RedirectAttributes attributes) {
        Study study = studyService.getStudyToUpdateStatus(account, path);
        if (!studyService.isValidPath(newPath)) {
            model.addAttribute(account);
            model.addAttribute(study);
            model.addAttribute("studyPathError", "해당 스터디 경로는 사용할 수 없습니다. 다른 값을 입력하세요.");
            return "study/settings/study";
        }

        studyService.updateStudyPath(study, newPath);
        attributes.addFlashAttribute("message", "스터디 경로를 수정했습니다.");
        return "redirect:/study/" + getPath(newPath) + "/settings/study";
    }

데이터를 @RequestParam newPath 으로 바로 받았다. 사실 @RequestParam 는 생략이 가능하다. 모델 에트리뷰트처럼! form에서 넘어오는 데이터를 form data에 주지 않고 그냥 input에다가 name을 주고 newPath로 받아왔다. 그리고 th:field 대신에 th:value를 사용 🙌

스터디 이름

스터디 이름은 중복 체크를 하지 않음

Point

  • form을 처리하는 방식을 약간 다르게 함.
  • 이번에는 model로 attribute로 받지 않고 requestparam

지금까지와 동일함

  • 가장 적절한 쿼리 사용하기 (스터디 정보 수정에 필요한 만큼만 데이터 가져오기)

삭제

삭제 가능한 경우와 삭제 불가능한 경우

  • ui가 달라짐

데이터를 삭제하기 전에 고민할 것

  • 정말로 삭제할 것인가
  • 아니면 삭제 했다고 마킹을 해둘 것인가 (Soft Delete)
  • 이 서비스에서는 스터디(+연관) 데이터를 실제로 삭제 합니다.
  • Soft Delete와 비슷한 역할을 할 수 있는 스터디 종료 (closed) 개념이 있기 때문에 이 서비스에서의 “삭제”는 정말로 데이터를 삭제 한다.

참여 및 탈퇴

왜 StudySettingsControlller.java 에 위치시키지 않고 StudyController.java 에다가 만들었을까?

@Controller
@RequestMapping("/study/{path}/settings")
@RequiredArgsConstructor
public class StudySettingsController {
	...
}
  • StudySettingsController.java 에 RequestMapping이 /study/{path}/settings 로 기본값을 셋팅해주고 있기 때문에 StudyController.java에 controller를 만들었다.

  • form ui 때문에 postMapping을 사용하면 이상하게 보여서 일단 getMapping을 사용하였음.

  • StudySettingsController 와 StudyController 가 모두 Study의 getEncodedPath 를 통해 가져오도록
    변경


출처 : 인프런 백기선님의 스프링과 JPA 기반 웹 애플리케이션 개발

profile
Step by step goes a long way ✨

0개의 댓글