SRP(Single responsibility principle): 단일 책임 원칙
한 클래스는 하나의 책임만 가져야 함.
중요한 기준은 변경
→ 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것
ex) 변경 했을 때, 하나의 클래스나 하나의 지점만 고치게 되는 경우
→ 즉, 세세하게 기능 별로 나눠야함. (책임의 범위를 적절하게 조절)
OCP(Open/closed principle): 개방-폐쇄 원칙 (중요)
소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 함.
→ 다형성 (인터페이스를 구현한 새로운 클래스를 하나 만들어 새로운 기능을 구현하는 확장은 열려 있으나, 인터페이스의 변경은 닫혀 있어야 함.)
코드 문제점
public class MemberService {
// private MemberRepository memberRepository = new MemoryMemberRepository();
private MemberRepository memberRepository = new JdbcMemberRepository();
}
→ 분명 다형성은 사용했으나, 서비스 코드를 변경해야 되는 상황 (OCP 원칙을 지키지 못함) (DIP를 위반했기에 생긴 문제)
→ 즉, 다형성만으로는 OCP와 DIP를 지킬 수 없음
→ 객체를 생성하고, 연관관계를 맺어주는 별도의 조립, 설정자 필요
→ 즉, 이 문제를 해결하기 위해 스프링 컨테이너가 필요 (의존성 주입, IoC 컨테이너 필요)
LSP(Liskov substitution principle): 리스코프 치환 원칙
ISP(Interface segregation principle): 인터페이스 분리 원칙
인터페이스는 역할에 맞게 여러 개로 분리하는 것이 좋음. (특정 클라이언트를 위한 인터페이스 여러 개)
인터페이스가 명확해지고, 대체 가능성이 높아짐.
ex) 자동차 인터페이스 → 운전 인터페이스, 정비 인터페이스로 분리
ex) 사용자 클라이언트 → 운전자 클라이언트, 정비사 클라이언트로 분리
정비 인터페이스가 변해도 운전자 클라이언트에 영향 주지 않음**.**
DIP(Dependency inversion principle): 의존관계 역전 원칙 (중요)
추상화에 의존해야함 / 구체화에 의존하면 안됨
→ 구현 클래스에 의존하지 말고, 인터페이스에 의존하라
public class MemberService {
// private MemberRepository memberRepository = new MemoryMemberRepository();
private MemberRepository memberRepository = new JdbcMemberRepository();
}
→ DIP 위반 (MemberService는 MemberRepository에만 의존하도록 설계했어야 함)