-
(스프링 기본) 4 - 좋은 객체 지향 설계 5가지(SOLID)개발/Spring 2024. 10. 2. 22:50
■ SOLID란?
: 클린 코드로 유명한 로버트 마틴이 말한 좋은 객체 지향 설계의 5가지 원칙
1. SRP(Single responsibility principle) 단일 책임 원칙
- 한 클래스는 하나의 책임만 가져야 한다.
- 중요한 기준은 변경으로, 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것
ex) UI 변경, 객체의 생성과 사용을 분리
2. OCP(Open/closed principle) 개방-폐쇄 원칙
- 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 함
- 다형성을 활용
- 역할과 구현의 분리
ex1) 자동차 종류를 k3, 아반떼로 늘려도 자동차라는 역할은 바뀌지 않아 운전자는 차를 움직일 수 있음
ex2) 연극의 로미오라는 역할은 다른 사람으로 바뀌어도 계속 사용 가능
=> 즉 클라이언트의 변경 없이 새로운 개체를 만들어 낼 수 있음
그러나 OCP 개방-폐쇄 원칙에는 문제점이 있다.
public class MemberService { //private MemberRepository memberRepository = new MemoryMemberRepository(); private MemberRepository memberRepository = new JdbcMemberRepository(); }
다음 코드와 같이 MemberService 클라이언트가 오른쪽 구현 클래스를 직접 선택하고 있다.
분명 다형성을 사용했지만 OCP 즉, 클라이언트 변경이 필요하다.
따라서 객체를 생성하고, 연관관계를 맺어주는 별도의 조립, 설정자가 필요하다.
3. LSP(Liskov substitution principle) 리스코프 치환 원칙
- 인터페이스 규약을 맞춰야 한다.
ex) 자동차 엑셀을 누르면 앞으로 가야한다. 뒤로 가게 구현하면 이는 LSP 를 위반한 것
4. ISP(Interface segregation principle) 인터페이스 분리 원칙
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다
- 자동차 인터페이스 -> 운전 인터페이스, 정비 인터페이스 분리
- 사용자 클라이언트 -> 운전자 클라이언트 정비사 클라이언트로 분리
- 분리하면 정비 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않는다.
- 인테페이스가 명확해지고, 대체 가능성이 높아진다.
5. DIP(Dependency inversion principle) 의존관계 역전 원칙
- 추상화에 의존해야지, 구체화에 의존하면 안된다 -> 의존성 주입은 이를 따르는 방법 중 하나이다.
- 쉽게 이야기하면 구현 클래스에 의존하지 말고, 인터페이스(역할)에 의존하라는 뜻
ex1) k3에 대해서 아는 것보다 자동차 역할을 아는 것이 중요하다.
ex2) 원빈이라는 배우보다 로미오라는 역할(대본)이 중요하다.
원빈이라는 배우에 집중한다면 다른 배우로 교체되었을 때 적응하지 못한다.
- 객체 세상도 클라이언트 인터페이스에 의존해야 유연하게 구현체 변경이 가능하다.
- 구현체 의존하게 되면 변경이 어려워진다.
public class MemberService { //private MemberRepository memberRepository = new MemoryMemberRepository(); private MemberRepository memberRepository = new JdbcMemberRepository(); }
지금 이 코드에서 MemberService 는 클라이언트 인터페이스도 의존하지만, MemoryMemberRepository 도 의존한다.
여기서의 의존은 해당 코드에 대해서 "안다" 라는 뜻이다.
즉, MemberRepository 와 MemoryMemberRepository 둘 다 아는 것이다.
MemberService 클라이언트가 구현클래스를 직접 선택한다.
이는 구체화에 의존하면 안된다는 DIP 를 위반한 것이다.
■ 정리
- 객체 지향의 핵심은 다형성
- 다형성 만으로는 쉽게 부품을 갈아 끼우듯이 개발할 수 없다.
- 다형성 만으로는 구현 객체를 변경할 때 클라이언트 코드도 함께 변경된다.
- 다형성 만으로 OCP, DIP 를 지킬 수 없다.
- 무언가 더 필요하다.
'개발 > Spring' 카테고리의 다른 글
(스프링 기본) 6 - spring 으로 전환하기 (0) 2024.10.07 (스프링 기본) 5 - 객체 지향 설계와 스프링 (2) 2024.10.02 (스프링 입문) 3 - 회원 관리 예제 : 백엔드 개발 (비즈니스 요구사항 정리 + 회원 도메인과 리포지토리 만들기 + 회원 리포지토리 테스트 케이스 작성 + 회원 서비스 개발 + 회원 서비스 테스트) (0) 2023.07.30 (스프링 입문) 2 - 스프링 웹 개발 기초 (정적 컨텐츠 + MVC와 템플릿 엔진 + API) (0) 2023.07.29 (스프링 입문) 1 - 프로젝트 환경설정(프로젝트 생성 + 라이브러리 살펴보기 + View 환경설정 + 빌드하고 실행하기) (0) 2023.07.29