ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유지보수가 용이하도록 아키텍처 구성하기
    개발/Spring Boot 2024. 5. 24. 10:35

    여러 게시판을 만들어야 하는 프로젝트를 진행하면서, 유지보수가 용이한 구성에 대해 고민하게 되었다.

    여러 게시판을 효과적으로 관리하고 향후 발생할 수 있는 문제들을 최소화하기 위해

    어떤 방법을 사용했는지 블로그에 공유하겠다.

    Board Entity의 다이어그램

    모든 게시판 엔티티의 공통 부모 클래스인 추상 Board 클래스를 정의하여, 모든 Board Entity가 이 추상클래스를 상속받도록 했다. Board를 굳이 추상 클래스로 정의한 이유는 Board 자체를 인스턴스화할 수 없도록 하기 위해서이다. 

     

    Board들을 위와 같이 구성함으로써 제네릭을 사용해 Repository 코드를 아래와 같이 단순화할 수 있었다.

    public interface BoardRepository<T extends Board> extends JpaRepository<T, Long> {
    }

     

    BoardService에서 코드를 단순화하기 위해 BoardRequest와 BoardResponse도 아래와 같은 구조로 구성했다.

    Board RequestDto의 다이어그램
    BoardResponseDto의 다이어그램

    이렇게 구성하면 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를 구현하도록 강제함으로써, 다양한 게시판 타입에 대해 일관된 방식으로 접근할 수 있다.

     

    마지막으로 정리

    따라서 위와 같이 프로젝트를 구성하면 아래와 같은 간단 절차를 걸쳐 새로운 게시판을 생성할 수 있게 된다.

    1. 추상 클래스 Board를 상속 받는 새로운 Board를 만든다
    2. BoardResponse, BoardRequest를 상속받는 BoardDto를 만든다.
    3. BoardService를 주입 받는 RestController 클래스를 만든다.
    4. (만약) 추가적인 기능이 필요하다면 AdditionalService 인터페이스를 구현하는 새로운 BoardService를 만들고 새로 만든 RestController에 AdditionalSerivce를 주입시킨다.

    3단계에서 4단계 과정만 거치면 새로운 게시판을 만들 수 있게 되었다.

     

    댓글

Designed by Tistory.