시작하기전에 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 기반 웹 어플리케이션 개발 > 4부 스터디' 카테고리의 다른 글
57. 스터디 설정 - 삭제 (0) | 2020.04.28 |
---|---|
56. 스터디 설정 - 경로 및 이름 수정 (0) | 2020.04.28 |
55. 스터디 설정 - 상태변경 (0) | 2020.04.24 |
54. 스터디 설정 - 태그/지역 (0) | 2020.04.24 |
53. 스터디 설정 - 배너 (0) | 2020.04.24 |