-
유지보수가 용이하도록 아키텍처 구성하기개발/Spring Boot 2024. 5. 24. 10:35
여러 게시판을 만들어야 하는 프로젝트를 진행하면서, 유지보수가 용이한 구성에 대해 고민하게 되었다.
여러 게시판을 효과적으로 관리하고 향후 발생할 수 있는 문제들을 최소화하기 위해
어떤 방법을 사용했는지 블로그에 공유하겠다.
모든 게시판 엔티티의 공통 부모 클래스인 추상 Board 클래스를 정의하여, 모든 Board Entity가 이 추상클래스를 상속받도록 했다. Board를 굳이 추상 클래스로 정의한 이유는 Board 자체를 인스턴스화할 수 없도록 하기 위해서이다.
Board들을 위와 같이 구성함으로써 제네릭을 사용해 Repository 코드를 아래와 같이 단순화할 수 있었다.
public interface BoardRepository<T extends Board> extends JpaRepository<T, Long> { }
BoardService에서 코드를 단순화하기 위해 BoardRequest와 BoardResponse도 아래와 같은 구조로 구성했다.
이렇게 구성하면 BoardService에서 업캐스팅을 사용할 수 있어 코드를 단순화할 수 있다.
이해를 돕기 위해 BoardService의 코드 일부를 첨부한다.
@Transactional public CommonResponseDto saveBoard(BoardRequestDto boardRequestDto) { Board savedBoard = boardRepository.save(boardRequestDto.createBoard()); return new CommonResponseDto(savedBoard.getId() + " Board has been successfully saved."); }
만약 위와 같이 코드를 구성하지 않았더라면 IntroBoardService, FaqBoardService, PhotoBoardService.. 미래에 추가될 서비스까지 걸쳐 중복된 로직이 구현되어야 했을 것이다.
하지만 독립적으로 존재해야하는 일부 공통 Method가 있을 수 있는데 (대표적으로 findAll) 이것은 AdditionalBoardService를 정의해 줌으로써 해결했다.
public interface AdditionalBoardService { List<BoardResponseDto> findBoardList(String topic); }
이렇게 아키텍처를 구성했을 때 다음과 같은 장점을 얻을 수 있었다.
유지보수 용이
모든 게시판 타입의 공통 로직을 BoardService에 집중시켜 공통된 기능을 한 곳에서 관리할 수 있다. 이를 통해 코드 중복을 줄이고 유지보수를 쉽게 할 수 있다.
확장성
새로운 게시판 타입이 추가될 경우 기존 코드를 최소한으로 수정하면서 확장할 수 있다. AdditionalBoardService 인터페이스를 구현한 새로운 서비스 클래스를 추가하면 되므로, 기존 BoardService나 Controller 코드에 영향을 주지 않는다.
유연성
AdditionalBoardService 인터페이스를 사용하여 각 서비스 클래스가 동일한 findAll를 구현하도록 강제함으로써, 다양한 게시판 타입에 대해 일관된 방식으로 접근할 수 있다.
마지막으로 정리
따라서 위와 같이 프로젝트를 구성하면 아래와 같은 간단 절차를 걸쳐 새로운 게시판을 생성할 수 있게 된다.
- 추상 클래스 Board를 상속 받는 새로운 Board를 만든다
- BoardResponse, BoardRequest를 상속받는 BoardDto를 만든다.
- BoardService를 주입 받는 RestController 클래스를 만든다.
- (만약) 추가적인 기능이 필요하다면 AdditionalService 인터페이스를 구현하는 새로운 BoardService를 만들고 새로 만든 RestController에 AdditionalSerivce를 주입시킨다.
3단계에서 4단계 과정만 거치면 새로운 게시판을 만들 수 있게 되었다.
'개발 > Spring Boot' 카테고리의 다른 글
Redis Cache를 통해 이미지 조회 성능 개선하기 (0) 2024.05.24 이미지 압축, 해제 성능 개선하기 - Snappy 도입을 통하여 (0) 2024.05.24 아키텍처 개선에 대한 고민 (1) 2024.05.23 Spring Boot 3.X 에 Swagger3를 추가하기 (0) 2023.07.16 Swagger에 대해 (0) 2023.07.16