좋은 객체 지향 설계의 5가지 원칙(SOLID)

Tuji·2023년 4월 25일
0

Spring

목록 보기
1/2

이번 포스팅에선 실무에서 Spring을 기반으로 API 확장성과 유지보수를 확보하기 위해 객체 지향 설계의 원칙을 정리해보고자 한다. 객체지향 프로그래밍의 특성과 장점을 살려 프로그램의 구조를 어떻게 설계해야하는지에 대해 이야기할것이다.



1. SRP 단일 책임 원칙

"한 클래스는 하나의 책임만 가져야 한다."

⦁ 클라이언트 객체는 직접 구현 객체를 생성하고, 연결하고, 실행하는 다양한 책임을 가지고 있음.
⦁ SRP 단일 책임 원칙을 따르면서 관심사를 분리함.
⦁ 구현 객체를 생성하고 연결하는 책임은 AppConfig가 담당.
⦁ 클라이언트 객체는 실행하는 책임만 담당.



2. OCP

"소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다."

⦁ 다형성을 사용하고 클라이언트가 DIP를 지킨다.
⦁ 어플리케이션의 사용 영역과 구성 영역으로 나누어야 한다.
⦁ 소프트웨어 요소를 새롭게 확장해도 사용 영역의 변경은 닫혀 있어야 한다.



3. LSP 리스코프 치환 원칙

⦁ 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
⦁ 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야 한다는 것, 다형성을 지원하기 위한 원칙, 인터페이스를 구현한 구현체는 믿고 사용하려면, 이 원칙이 필요하다.
⦁ 단순히 컴파일에 성공하는 것을 넘어서는 이야기
⦁ 예) 자동차 인터페이스의 엑셀은 앞으로 가라는 기능, 뒤로 가게 구현하면 LSP 위반, 느리더라도 앞 으로 가야함.



4. ISP 인터페이스 분리 원칙

⦁ 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
⦁ 자동차 인터페이스 -> 운전 인터페이스, 정비 인터페이스로 분리
⦁ 사용자 클라이언트 -> 운전자 클라이언트, 정비사 클라이언트로 분리
⦁ 분리하면 정비 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않음.
⦁ 인터페이스가 명확해지고, 대체 가능성이 높아진다.



5. DIP 의존관계 역전 원칙

"프로그래머는 '추상화에 의존해야지, 구체화에 의존하면 안된다.' 의존성 주입은 이 원칙을 따르는 방법중 하나다."

⦁ 쉽게 이야기해서 구현 클래스에 의존하지 말고, 인터페이스에 의존하라는 뜻이다.
⦁ 역할(Role)에 의존하게 해야 한다는 것과 같다. 객체 세상도 클라이언트가 인터페이스에 의존해야 유연하게 구현체를 변경할 수 있다.
⦁ 구현체에 의존하게 되면 변경이 어려워지고 협업시 코드가 충돌이 빈번히 발생하게 된다.





정리

최근 김영한 강사님의 객체지향프로그래밍 핵심원리 강의를 수강하면서 '역할과 기능'의 분리의 중요성을 다시한번 되새기게 되었다. 실무에서 프로젝트 구조를 설계하는 것은 구현보다 중요한 단계라고 생각한다.
그럼 어떻게 구조를 설계할 것인가? 해당 포스팅은 이를 실현하는데 필요한 원칙들을 기술한 것이다.
협업 구성원들이 프로젝트를 진행하며 위 내용을 준수한다면 '역할과 기능'의 분리는 실현되고 프로젝트의 유지보수, 확장성에 대한 편리함은 보장될 것이다.
프로젝트 규모가 커지고 투입되는 인원들이 많아질 수록 객체지향프로그램의 이러한 장점은 더욱 돋보일 것이라 생각된다.

profile
BackEnd & DevOps

0개의 댓글