왜 개발자는 코드 구조를 나누고 의존성을 고려해야할까?

0307kwon·2021년 4월 10일
8

프론트엔드 지식

목록 보기
2/2
post-thumbnail

@ 코드를 적절히 나눈 분류를 레이어 라고 하겠습니다.
예를 들어 controller 3개, model 5개는 2개의 레이어 입니다.

@ 'A 레이어를 알고 있다' 는 A 레이어에 대한 참조를 가지고 있다는 것입니다.

@ 참고한 글도 있지만 스스로 고민해본 것이 대부분이라 틀린 내용이 있을 수 있습니다. (피드백 부탁드려요!)

🙄 글을 쓴 계기

내가 공부하고 있는 우아한 테크코스에서 다른 크루들의 코드를 보다가 문득 이런 생각이 들었다.

레이어를 어떤 기준으로 나누어야하지?
레이어를 추가적으로 나누어야하는 시점은 언제일까?
의존성은 어느정도까지 허용되는 것이며 그 이유는 뭘까?

이런 생각이 꼬리를 물며 결국에는 다음과 같은 질문에 이르게 되었다.

'레이어는 왜 나누어야 하지?'

👀 왜 레이어를 나누어야할까

사실 이 질문의 본질은 다음과 같다.

어떻게 코드의 복잡도를 줄일 수 있을까?

그럼 코드의 복잡도는 왜 줄여야 할까?

이 질문에 대해 스스로 답하기 위해
하나의 파일에 모든 기능에 대한 코드가 담겨있다고 생각해보자.
그렇다면 다음과 같은 단점들이 보일 것이다.

  1. 각 부분이 어떤 기능을 수행하는 코드인지 알기 어렵고, 찾기도 어렵다.
  2. 모든 코드가 한 곳에 있으므로 큰 그림이 보이지 않아 재사용성을 고려한 함수를 만들기 어렵다.
    => 사람은 주어진 환경에서 편한 방식대로 코드를 짜려는 경향이 있으므로 일단 돌아가기만 하는 코드를 짜게 될 것이다.
  3. 값을 변경하는 부분이 산재되어 있어 어떤 값이 어디서 변했는지 알기 어렵고, 의도하지 않은 변경으로 문제가 생길 수 있다.

따라서 기능과 특징을 고려해 레이어를 나눠 복잡도를 낮춰야 한다

😵 그럼 레이어 간 의존성은 왜 중요할까

의존성이 높다는 것의 의미

다음 2가지 정도를 의미한다.

  1. 값을 받아오기 위해 알고있는 다른 레이어가 많다.

  2. 어떤 레이어의 값을 변경할 수 있는 다른 레이어가 너무 많다.

의존성이 중요한 이유

예를 들어 A 레이어가 있다고 가정해보자.
A 레이어는 B,C,D 레이어를 통해 값을 받아오고,
B,C,D 레이어는 모두 A 레이어에 접근해 값을 변경한다.

그렇다면 무슨 문제가 생길까?

  1. 하나의 레이어가 너무 많은 동작의 책임을 진다.
    A 레이어는 B,C,D 레이어에 접근하여 값을 가져오기 때문에
    너무 많은 동작을 하게 된다. (복잡도 증가)

ex)
MVC의 Controller는 Model과 View, 2가지 레이어를 아는 것만으로도
만능 객체로 불린다.

  1. A 레이어의 값을 변경할 수 있는 레이어가 너무 많기 때문에 어디서 변경되었는지 알기 어렵고, 의도하지 않은 변경으로 문제가 생길 수 있다.

따라서 의존성을 낮추는 작업은 코드의 동작을 좀 더 예측하기 쉽고 단순하게 만드는 작업이다.

🙋‍♂️ 의존성을 최소화 하기 위한 방법은?

의존성을 최소화 하기 위해서는
레이어 간 참조를 최소화 하고
일관적인 참조 방법을 정의해야한다.

의존성을 최소화하는 패턴을 만드는 법

  1. 기능, 특징을 고려해 적절한 레이어(분류)로 나누기
  2. 각 레이어 사이의 일관된 의존성을 정의하기
    ex) controller는 view와 model만 알고 있어야 한다.
    model은 controller나 view에 대해서 몰라야 한다.
  3. 하나의 레이어가 3개 이상의 다른 레이어를 알아야 한다면 다른 구조를 생각해보자.(코드 복잡도를 줄이기 위함)
  4. 2개 이상의 레이어가 하나의 레이어에 접근해 값을 변경하지 않도록 한다.
  5. 값은 외부에서 변경이 불가능하도록 한다.

setter를 통해 해당 레이어가 변경을 감지하고
일관되게 처리할 수 있도록 만든다.

ex) MVVM에서 viewModel은 값의 변경을 감지하고 view에게 통보한다.

🎯 결론

  1. 레이어를 나누는 것은 코드의 복잡도를 줄이기 위함이다.
  2. 레이어를 나누는 것에 특별한 기준이 있는 것은 아니다.
  3. 의존성을 줄이는 것은 코드를 좀 더 예측하기 쉽도록 하기 위함이다.
  4. 의존성을 최소화하기 위해서 일관성레이어 간 참조 최소화에 대해서 고민해보자

참고

MVVM 웹페이지 구현 repo
bsidesoft - MV* 에 대해서
bsidesoft - MVVM구현

profile
프론트 개발자를 꿈꾸는 학생입니다.

관심 있을 만한 포스트

0개의 댓글