좋은 객체 지향 설계 5가지 원칙 정리
- SRP : 단일 책임 원칙(Single responsibility principle)
- 한 클래스는 하나의 책임만 가져야한다.
- 변경이 있을때 파급 효과가 적으면 단일 책임원칙을 잘따른것
- OCP : 개방-폐쇄 원칙(Open/closed principle) *중요!
- 소프트웨어 요소는 확장에는 열려 있으나, 변경에는 닫혀있어야한다.
- 인터페이스를 구현한 새로운 클래스를 하나 만들어 새로운 기능을 구현(다형성)
- LSP : 리스코프 치환 원칙(Liskov substitution principle)
- ISP : 인터페이스 분리 원칙(Interface segregation principle)
- 각기능에 맞는 인터페이스 분리
- 인터페이스가 명확해지고, 대체 가능성이 높아진다.
- DIP : 의존관계 역전 원칙(Dependency inversion principle) *중요!
- 역할에 의존하여야한다
- interface만 알아야지 그 외 구현까지는 관계를 인지하지 않아도된다.
- 역할과 구현을 철저히 분리, 추상화에 의존해야하지 구체화에 의존하면안된다.
- ex) MemberService 클래스에서 MemberRepository m = new MemoryMemberRepository(); DIP위반
ex)
ex) DIP 준수시 private DiscountPolicy discountPolicy;
- 인터페이스에만의존시 Test 시 discountPolicy => Null PointerException 발생
ex) 생성자 주입으로 역할과 구현 분리!!
※ 기존 개인프로젝트 및 팀프로젝트는 내가 생각한대로 만들었기 때문에 구현체를 변경하는 일이없었다.
현재 Spring 강의에서는 회원(VIP)에 대해 변경사항(1000원 할인 또는 10%할인)이 발생한다는 가정으로 만들었다.
이경우 생성자 주입이 아주용이하게 사용이된다.
기존사용방식
- @Autowired
- @RequiredArgsConstructor