프론트엔드 개발자(FE)를 위한 SOLID 원칙
SOLID 원칙
- 단일 책임 원칙 (SRP, Single Responsibility Principle)
- 개방 폐쇄 원칙 (OCP, Open-Closed Principle)
- 리스코프 치환 법칙 (LSP, Liskov Substitution Principle)
- 인터페이스 분리 법칙 (ISP, Interface Segregation Principle)
- 의존성 역전 법칙 (DIP, Dependency Inversion Principle)
서비스의 고도화, 사용자의 니즈 변화 등 다양한 변수에 의해 소프트웨어 또한 지속적인 업데이트가 필요하다. 좋은 설계에 근간을 둔 좋은 소프트웨어는 이런 변화에 유연하게 대처할 수 있는 소프트웨어이다.
이런 소프트웨어의 구현을 위해서는 새로운 요구사항이나 변경사항에 영향을 받는 범위가 적도록 하여 유연성과 확장성을 갖추고 있어야 한다.
SOLID 객체 지향 원칙을 지향 함으로써 코드 확장에 유리하고 유지 보수가 용이하며 불필요한 복잡도를 제거하여 개발 생산성이 높아진 코드를 작성할 수 있을 것이다.
단일 책임 원칙
단일 책임 원칙은 약간 모호한 부분이 없지 않아 주관에 의존적인 원칙이다. 흔히 ‘한 가지 동작, 한 가지 기능만 수행해야 한다.’ 고 생각할 수 있다. 하지만 코드가 너무 잘게 쪼개진다면 전체적인 로직을 한 눈에 파악하기 어렵고 코드 네비게이션에도 상당한 공수가 들어가기 때문에 올바른 방법이라고 보기 어렵다.
"하나의 모듈은 하나의 오직 하나의 액터에 대해서만 책임져야 한다." - 로버트 C.마틴(클린코드)
여기서 모듈을 하나의 컴포넌트, 액터를 사용자 혹은 이해관계자 집단이라고 생각할 수 있다. 이 문장을 곱씹어보고 다양한 예시를 접한다면 단일 책임 원칙을 위한 본인의 기준을 세우는데 도움이 될 것이다.
쉽게 말해 컴포넌트의 목적을 달성하기 위해 필요한, 연관된 기능만 갖추도록 컴포넌트를 구현하면 된다.
개방 폐쇄 원칙
한 마디로 확장에는 열리고 수정에는 닫힌 그러한 코드를 의미하는데, 풀어 말하면 기능이 추가되었을 때 손 쉽게 코드 확장을 구현할 수 있고 확장에 따른 객체의 수정을 최소화하는 것을 뜻한다.
다형성을 가능하게 해주는 원칙으로 추상화 사용을 통한 관계를 권장한다고도 이해할 수 있다.
개방 폐쇄 원칙에 따라 코드를 구현하는 대표적인 방법으로는 애플의 Compositional Layout 패턴이 존재하는데, 이 문서와 참조된 카카오 엔터테인먼트 기술 블로그, 임성묵(steve) 님의 글에 있는 예시가 좋은 자료가 될 것이다.
리스코프 치환 원칙
코드는 항상 작성하며 의도 했던대로 예상가능하게 동작해야 한다. 상위 클래스 타입으로 객체를 선언하여 하위 클래스에서 인스턴스를 받으면 해당 인스턴스에서 부모 메서드를 사용해도 의도 했던 동작이 수행되어야 한다.
예를 들어, 에러를 처리하는 컴포넌트가 존재할 때 특정 컴포넌트와 함께 사용하기 위해 인자를 변환해야하는 작업이 선행되어야 한다고 할 때, 기존의 코드에 인자를 변환하는 코드를 추가하면 해당 컴포넌트를 사용하는 다른 코드에서 의도하지 않았던 동작을 유발하여 에러가 발생할 수 있다. (이 역시 참조된 블로그 글 들에서 더 좋은 예시들이 있다.)
인터페이스 단일 책임 원칙
단일 책임 원칙이 클래스의 단일책임 원칙을 의미한다면 인터페이스 단일 책임 원칙은 인터페이스 역시 단일 책임 원칙을 가져야 함을 의미한다. 즉, 컴포넌트가 꼭 필요한 인터페이스만 전달 받음으로써 불필요한 복잡성을 제거할 수 있다.
의존성 역전 원칙
저수준의 모듈이 고수준의 모듈에 의존해야함을 의미하며, 리액트를 이용할 때 컴포넌트 의존성을 역전 시키는 유용한 것 중 대표적인 것으로 children 이 있다. (이 역시 예시 코드는 참조된 블로그를 참고..)
→ 이 2가지 원칙은 각기 다른 컴포넌트 2가지를 조합할 때 무척 유용하다.
💡 참조
- “프론트엔드와 SOLID 원칙”, 카카오 엔터테인먼트, 임성묵(steve)
- 객체 지향 설계의 5가지 원칙, S.O.L.I.D
- [OOP] 객체지향 프로그래밍의 5가지 설계 원칙, 실무 코드로 살펴보는 SOLID, 망나니 개발자