개발자

레이어드 아키텍처의 추상화에 대한 질문입니다

2023년 06월 09일조회 578

뉴비 개발자, 레이어드 아키텍처의 추상화에 대해 약간의 질문이 있습니다. Repository 클래스와 application layer 클래스들의 추상화를 왜 하는가에 대해 가르침을 받고 싶습니다. 우리가 현재 추상화하는 이유가 기존 기능으로부터 추가적인 고객의 요구를 수정에 닫혀있는 채로 관리하기 위함이라면, infrastructure layer의 repository 클래스들과 application layer의 추상화는 해당 이유에 적합한 이유인가? 에 대한 의문을 갖게 되었습니다. 의존성 역전 법칙을 말그대로 따라간다면 추상화를 하는 것이 맞지만, 의존성 역전 법칙 자체가 의존성 관계를 뒤집어 수정의 가능성을 역전한다의 의미인데 인터페이스와 구현체 비율의 가능성이 1:1일 확률이 매우 높은 상황에서 수정의 가능성을 뒤집는다는 것 자체가 약간 이론에 놀아나는 느낌? 이게 진짜 역전되있는 것이 맞는가? 하는 그런 생각이 들었습니다. 그래서 repository 클래스들를 추상화 할거면 application layer도 추상화 하는 것이 이론상 맞고, application layer를 추상화하지 않을거면 repository 클래스도 추상화하지 않는 것이 내가 이해한대로면 맞다. 로 결정하게 되었습니다. 추상화가 테스트때문이라면 요즘 모킹 라이브러리 잘되어있는데, 라이브러리에 대한 의존성을 제거하기 위해 그런가? 라는 생각도 조금 들었습니다. 제가 나아가고 있는 논리의 방향이 맞는지가 의심스럽고 조심스럽습니다. 선배 동기분들의 가르침을 받고 싶습니다. 읽어주셔서 감사합니다.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 2

인기 답변

이양일님의 프로필 사진

안녕하세요! 꽤나 심도 깊은 질문을 해주셔서 조심스럽게 저의 의견을 남겨봅니다. 의존성 역전 원칙의 가장 큰 목적은 변동성이 큰 구현체로부터의 영향을 없애기위한 목적이 크죠. 그리고 이 목적이 빛을 발하려면 말씀하신 것처럼 추상화와 구현체의 관계가 1:1 이 아닌 1:N 으로 구현체가 존재하고 이를 활용할 수 있어야 합니다. 개인적인 생각으로 운영하는 서비스의 규모나 사업의 방향성 혹은 요구사항에 따라 질문자님의 생각처럼 추상화를 두는것이 의미가 없을수도 있습니다. 하지만 계속 그런 상황이 유지될 거라는 보장은 없습니다. 서비스의 규모가 갑작스럽게 커져 개선이 필요하거나 사업의 방향성으로 다양한 요구사항이 생길 경우 케이스에 따라 Business Layer 와 Persistence Layer 에 추상화를 도입해야할 수도 있습니다. 저의 경우 하나의 소스코드로 글로벌 인스턴스 환경을 운영하는 케이스에서 활용했던 경험이 있는데요, 각 나라의 환경별로 서비스 요구사항이 조금씩 다르고 연동해야할 외부 시스템이나 Database 종류 및 구성, 스키마가 다른 부분들이 생겨 Business Layer 와 Persistence Layer 의 클래스를 추상화로 정의하고 각 환경별로 구현체를 다르게 가져가야 했습니다. Business Layer 를 추상화하지 않을거면 Repository Class 도 추상화를 하지 않는다는것도 상황에 따라 달라질 수 있습니다. Mybatis 를 쓰다가 JPA 혹은 캐시를 도입하는등의 Repository 관련 기술 스택 변경을 시도할 때 기존 기능에 대한 이슈가 없는지를 보기 위해 이전 기술 스택과 신규 기술 스택을 병행해서 운영해볼 경우 비지니스 로직에 대한 변경은 없기 때문에 Business Layer 의 추상화는 필요 없지만 Repository Class 의 추상화는 필요하게 됩니다. 결론을 맺자면, 상황에 따라 추상화를 하는 것이 도움이 될수도 의미가 없을수도 있습니다. 하지만 그 상황이란게 질문자님의 생각처럼 추상화와 구현체가 1:1로 구현되는 상황만 유지될거라는 보장은 없기 때문에 미리 추상화를 해두면 그러한 상황이 닥쳤을때 좀더 유연하게 대처가 가능하다라고 말씀드리고 싶습니다. 하지만 무조건 추상화를 해야하냐 라고 물으신다면 그건 취사선택이라 생각됩니다. 팀 혹은 회사의 판단하에 그럴일이 없을것 같아 나중에 추상화가 필요한 상황이 생겼을때 하자 라고 하면 그때 해도 되는것이고 혹시 모르니 미리 해두자고 결론이 나면 추상화를 미리 해도 된다 생각합니다. 제 의견은 여기까지 입니다. 나름 열심히 정리해봤는데 질문에 맞게 잘 설명했는지 모르겠네요^^;; 부디 저의 작은 의견이 조금이나마 도움이 되시길 바라겠습니다.

김준형님의 프로필 사진

김준형

작성자

애즈위메이크 백엔드 개발자2023년 06월 10일

답변 너무 감사드립니다. 아직 경험이 미천한 상태에서, 많은 분들의 코드가 applcation layer와 repository 클래스를 추상화하는 것을 보았습니다. 이를 이해하기 위해 공부를 해보았지만 저 스스로는 추상화의 이유를 완전히 납득하기엔 조금 어려웠던 것 같습니다. 하지만 답변 덕에 이제는 저 추상화들의 이유를 상대방에게 제시할 수 있는 상태가 된 것 같습니다. 감사합니다!

밴쿠버리안님의 프로필 사진

추상화 하실 필요없습니다. 경험상 하지 않는게 가독성 및 유지보수가 훨씬 용이합니다. 추상화는 중복코드 제거를 주 목적으로 하시되, 다만 중복되는 부분의 변경이 많거나 코드 리딩시 파일들을 자주 이동해야 하는 경우는 지양하시는게 좋겠습니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!