[트러블 슈팅] 스프링 순환 참조(spring circular reference) 해결하기
위 문제를 해결할 수 있는 또다른 방법을 알게되어 글을 작성해보려 한다.
1️⃣ 퍼사드 패턴이란 ?
퍼사드 패턴(Facade Pattern)은 구조 패턴(Structural Pattern)의 한 종류로써, 복잡한 서브 클래스들의 공통적인 기능을 정의하는 상위 수준의 인터페이스를 제공하는 패턴이다.
이게 뭔소리냐고요?
세탁기를 예로 들어보겠습니다.
세탁기를 돌리면 세탁 -> 헹굼 -> 탈수가 한번에 이루어집니다.
이 때 세탁, 헹굼, 탈수 버튼을 각각 따로 누르나요 ? 아니죠
시작 버튼을 누르면 알아서 세탁 -> 헹굼 -> 탈수가 이루어지죠. 이것이 퍼사드 패턴입니다 !
시작 버튼을 누르면 알아서 다음 서비스가 실행되는 것처럼, 퍼사드 패턴이란 복잡한 서브 시스템들을 인터페이스로 감싸서 사용하기 쉽게 만들어주는 것 입니다.
다시 한번 정리해보자면
여러 Sub System의 기능을 하나의 Facade Object로 묶고, Client는 해당 Facade Object를 사용하는 것 입니다.
2️⃣ 프로젝트에 적용하기
FacadeService.java
@Service
@RequiredArgsConstructor
public class FacadeService {
private final StoryService storyService;
private final CommentService commentService;
private final HeartService heartService;
private final AuthService authService;
// commentService
public List<CommentResponse> findComments(Story story, Member member) {
return commentService.findComments(story, member);
}
// heartService
public boolean hasHeart(Member member, Story story) {
return heartService.hasHeart(member, story);
}
// commentService
@Transactional
public void removeComment(UUID id) {
commentService.removeComment(id);
}
// authService && storyService
@Transactional(readOnly = true)
public FindStoryResponse findStory(UUID storyId) {
Story story = loadStoryEntity(storyId);
Member member = authService.getLoginUser();
List<CommentResponse> comments = findComments(story, member);
boolean isLiked = hasHeart(member, story);
return storyService.findStory(story, comments, isLiked);
}
.
.
.
}
위와 같이 storyService, authService, commentService, heartService 의 다양한 Sub System들을 감싸고 있는 FacadeService를 만들어 Facade Pattern 을 도입해보았습니다.
📌 장단점
순환 참조도 생기지 않고 (Sub System 간의 결합도가 낮아짐), 해당 메서드의 의미를 명확하게 파악할 수 있다 (코드가 보다 직관적 !)는 장점이 있는 것 같습니다.
단점이라함은 FacadeService가 비대해질 수 있다는 것입니다 .. !
🔗 참고
https://leeheefull.tistory.com/13
https://velog.io/@bagt/Design-Pattern-Facade-Pattern-%ED%8D%BC%EC%82%AC%EB%93%9C-%ED%8C%A8%ED%84%B4
'Server > Spring boot' 카테고리의 다른 글
[트러블 슈팅] 스프링 순환 참조(spring circular reference) 해결하기 (0) | 2023.07.15 |
---|---|
[Spring boot] 이미지를 포함하는 글 작성 API 설계 방식 (1) | 2023.07.09 |
[Spring boot] Google 로그인 유저 정보 가져오기 (0) | 2023.05.02 |
[Spring boot] security + Oauth2로 구글 로그인 구현하기 (1) | 2023.05.01 |
[Spring boot] security + Oauth2로 구글 로그인 구현하기 - OAuth 서비스 등록 (0) | 2023.04.29 |