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

58. 스터디 참여 및 탈퇴

by Backchus 2020. 4. 28.

시작하기전에 StudySettingsController에 있는 경로를 인코딩해주는 메소드를 Study엔티티에 옮겼다.

package me.weekbelt.studyolle.domain;

// ......

public class Study {

    // .......
    
    public String getEncodedPath() {
        return URLEncoder.encode(this.path, StandardCharsets.UTF_8);
    }
}

 

StudySettingsController에 있는 getPath(path)를 study.getEncodedPath()로 수정 한다.

 

이미 UI는 구현이 되어있으므로 서버단에만 코드를작성하면 된다.

스터디 참여/탈퇴 요청을 처리하는 핸들러 작성

package me.weekbelt.studyolle.study;

@RequiredArgsConstructor
@Controller
public class StudyController {

    // .........
    
    private final StudyRepository studyRepository;

    // .........

    @GetMapping("/study/{path}/join")
    public String joinStudy(@CurrentAccount Account account, @PathVariable String path) {
        Study study = studyRepository.findStudyWithMembersByPath(path);
        studyService.addMember(study, account);
        return "redirect:/study/" + study.getEncodedPath() + "/members";
    }

    @GetMapping("/study/{path}/leave")
    public String leaveStudy(@CurrentAccount Account account, @PathVariable String path) {
        Study study = studyRepository.findStudyWithMembersByPath(path);
        studyService.removeMember(study, account);
        return "redirect:/study/" + study.getEncodedPath() + "/members";
    }
}

 

StudyRepository에 findStudyWithMemberByPath() 메소드 작성

package me.weekbelt.studyolle.study;

@Transactional(readOnly = true)
public interface StudyRepository extends JpaRepository<Study, Long> {

    // ......
    
    @EntityGraph(value = "Study.withMembers", type = EntityGraph.EntityGraphType.FETCH)
    Study findStudyWithMembersByPath(String path);
}

 

Study 엔티티에 네임드쿼리 적용

package me.weekbelt.studyolle.domain;

// ....

@NamedEntityGraph(name = "Study.withMembers", attributeNodes = {
        @NamedAttributeNode("members")
})

public class Study {

    // ..........
}

 

스터디 참여/탈퇴 요청을 처리하는 메소드 작성

package me.weekbelt.studyolle.study;

@RequiredArgsConstructor
@Transactional
@Service
public class StudyService {

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

    public void addMember(Study study, Account account) {
        study.addMember(account);
    }

    public void removeMember(Study study, Account account) {
        study.removeMember(account);
    }
}

 

Study 엔티티에 addMember(), removeMember() 작성

package me.weekbelt.studyolle.domain;

public class Study {

    // .......
    
    private int memberCount;

    // .........

    public void addMember(Account account) {
        this.getMembers().add(account);
        this.memberCount++;
    }

    public void removeMember(Account account) {
        this.getMembers().remove(account);
        this.memberCount--;
    }
}

 

 

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