스터디가 처음 만들어지면 드래프트 상태이다. 이것을 변경할 수 있는기능을 해보자!
StudyService.java
public void close(Study study) {
study.close();
}
클래스를 컨트롤러에서 바로 호출 안하고 왜 서비스 계층에서 감싸서 호출할까? -> 꼭 알아야 함! 😎😎 도메인만 컨트롤러에서 호출해서는 안된다. 객체 상태를 변경하는 것이기 때문에 트랜잭션 안에서 하고, 트랜잭션이 끝날 때 커밋되도록 해서 DB에 반영시켜야 한다.
Study.java
public void publish() {
if (!this.closed && !this.published) {
this.published = true;
this.publishedDateTime = LocalDateTime.now();
} else {
throw new RuntimeException("스터디를 공개할 수 없는 상태입니다. 스터디를 이미 공개했거나 종료했습니다.");
}
}
published 를 할 수 있는 상황이 아닌데 publish 를 하라고 하면 예외를 던진다.
-> 왜?! 우리는 스터디 상태에 맞춰서 적절하게 뷰를 변경했다. 하지만 악의적인 사용자가 post 요청을 보낼 수도 있다. 이건 요청이 잘못한 것!
⭐getStudyToUpdateStatus⭐
스터디의 상태를 변경할 때 가져와야 할 데이터가 정말 여러분이 필요한 만큼 기져온 것인가.. 고민해봐야 한다. 매니저만 가져오면 잘한 것~
StudyRepository.java
@EntityGraph(value = "Study.withManagers", type = EntityGraph.EntityGraphType.FETCH)
Study findStudyWithManagersByPath(String path);
필요한 데이터인 매니저만 가져오도록 엔티티 그래프를 설정했다.
Study.java
@NamedEntityGraph(name = "Study.withZonesAndManagers", attributeNodes = {
@NamedAttributeNode("zones"),
@NamedAttributeNode("managers")})
그리고 Study.java에다가 @NamedEntityGraph 그래프를 설정했다. (managers만 가져오도록)
출처 : 인프런 백기선님의 스프링과 JPA 기반 웹 애플리케이션 개발