본문 바로가기

Spring

Spring- 객체 지향의 SOLID 원칙

5개 원칙

- SRP : 단일 책임 원칙
한 클래스는 하나의 책임만 가져야한다.
변경시 파급효과가 적으면 단일 책임 원칙을 잘 따른 것

- OCP : 개방 폐쇄 원칙
기존 코드를 변경하지 않는 것.
다형성을 활용해 확장에는 열려있으나 변경에는 닫혀있도록한다.
다형성만 가지고는 OCP 원칙을 지킬수 없다.
객체를 생성하고 연관관계를 맺어주는 별도의 조립, 설정자가 필요

- LSP : 리스코프 치환 원칙
인터페이스의 규약이 존재한다면 하위 클래스는 무조건 그 규약을 지켜야함.
예를 들어 엑셀을 밟으면 앞으로 간다라고 했으면, 하위 클래스에선 무조건 이를 
따라야한다. 
엑셀 밟으면 뒤로가는 식으로 구현하면 안된다는 말. 
컴파일 되고 안되고의 문제가 아닌 구현을 하는데 있어서 
기존의 원칙을 위반해서는 안된다는 것.

-ISP : 인터페이스 분리 원칙
특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다.
인터페이스가 분리될수록 유지,보수에 유리하고 인터페이스가 명확해짐.

-DIP : 의존관계 역전 원칙

추상화에 의존해야지, 구체화에 의존해서는 안된다.
구현 클래스에 의존하지 말고, 인터페이스에 의존해야한다.

public class MemberService{
    MemberRepository memberRepository = new MemoryMemberRepository();
}

MemberService는 MemberRepository와 MemoryMemberRepository에 의존

 

문제점

  다형성만 가지고는 OCP와 DIP를 지킬수 없다.

 

결론

  모든 설계에 있어서 역할과 구현을 분리하자. 즉, 다시말해 이상적으로는 모든 클래스에 있어서 인터페이스를 구현하는 것이다.

 하지만 인터페이스를 남발하게 되면 추상화 비용이 증가하게된다. 나중에 코드를 보거나 하는 상황에서, 구체적으로 해당 인터페이스의 메소드가 무슨역할을 하는지 따로 구체화된 코드를 따로 찾아 봐야하기 때문에 너무 남발하는 것도 바람직하진 못하다.

 그렇기에 만일 기능을 확장할 일이 없다면 구체화된 클래스를 사용하고, 확장 가능성이 있는 경우 인터페이스를 적극적으로 사용하는 것이 바람직하다.