본문 바로가기
스프링과 JPA 기반 웹 어플리케이션 개발/4부 스터디

56. 스터디 설정 - 경로 및 이름 수정

by Backchus 2020. 4. 28.

 

스터디 설정 - 상태 변경 게시글에서 화면은 미리 구현 했으므로 스터디 경로와 스터디이름 수정 로직만 처리하면된다.

스터디 경로/이름 수정요청을 처리하는 핸들러 작성

package me.weekbelt.studyolle.study;

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

    // .............

    @PostMapping("/study/path")
    public String updateStudyPath(@CurrentAccount Account account, @PathVariable String path,
                                  @RequestParam 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";
    }

    @PostMapping("/study/title")
    public String updateStudyTitle(@CurrentAccount Account account, @PathVariable String path,
                                   @RequestParam String newTitle, Model model,
                                   RedirectAttributes attributes) {

        Study study = studyService.getStudyToUpdateStatus(account, path);
        if (!studyService.isValidTitle(newTitle)) {
            model.addAttribute(account);
            model.addAttribute(study);
            model.addAttribute("studyTitleError", "스터디 이름을 다시 입력하세요.");
            return "study/settings/study";
        }

        studyService.updateStudyTitle(study, newTitle);
        attributes.addFlashAttribute("message", "스터디 이름을 수정했습니다.");
        return "redirect:/study/" + getPath(path) + "/settings/study";
    }
}

 

Controller에서 객체가 아닌 단일 타입으로 값을 받아온 경우 Validator를 못쓰기 때문에 업데이트하는 경로가 유효한지 확인하는 isValidPath메소드와 업데이트하는 스터디명이 유효한지 확인하는 isValideTitle메소드 구현

package me.weekbelt.studyolle.study;

@RequiredArgsConstructor
@Transactional
@Service
public class StudyService {
    
    // ....

    public boolean isValidPath(String newPath) {
        if (!newPath.matches(VALID_PATH_PATTERN)){
            return false;
        }

        return !studyRepository.existsByPath(newPath);
    }

    public boolean isValidTitle(String newTitle) {
        return newTitle.length() <= 50;
    }
}

 

 

StudyForm에 올바른 경로인지 체크하는 정규식 VALID_PATH_PATTERN 작성

package me.weekbelt.studyolle.study.form;

@Data
public class StudyForm {

    public static final String VALID_PATH_PATTERN = "^[ㄱ-ㅎ가-힣a-z0-9_-]{2,20}$";

    // .......
    
}

 

 

경로 / 스터디 이름 수정을 처리하는 updateStudyPath, updateStudyTitle메소드 작성

package me.weekbelt.studyolle.study;


@RequiredArgsConstructor
@Transactional
@Service
public class StudyService {

    // .....

    public void updateStudyPath(Study study, String newPath) {
        study.setPath(newPath);
    }
    
    // ......

    public void updateStudyTitle(Study study, String newTitle) {
        study.setTitle(newTitle);
    }
}

 

참고: 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