[Spring] 좋은 객체 지향 설계의 5가지 원칙

Youngkwon Kim·2022년 6월 27일
1

spring

목록 보기
1/3
post-thumbnail

SOLID principles

The SOLID Principles are five principles of Object-Oriented class design.
They are a set of rules and best practices to follow while designing a class structure.

요약하자면 SOLID는 훌륭한 객체 지향 설계를 위해 중요한 5가지 원칙.


1. SRP (single responsibility principle)

한 클래스는 하나의 책임만 가져야 한다는 단일 책임 원칙

객체 지향에서 클래스를 도입하고 객체를 생성함이, 결국 SRP를 위한 것이 아닐까 생각한다.


2. OCP (open/closed principle)

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

확장은 가능해야 하지만, 변경할 수는 없다라..
처음 읽는다면 와닿지 않는 표현이라고 생각한다.
다음 예시를 보면 쉽게 이해할 수 있다.

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

MemoryMemberRepository와 JdbcMemberRepository 모두 MemberRepository 인터페이스를 구현하여 객체지향의 다형성을 준수하였다.
하지만 다형성만으로는 기능의 확장에 있어서 변경을 피할 수 없었다.


3. LSP (Liskov substitution principle)

컴파일 레벨의 규약이 아닌, 일반적인 규약

예를 들어 총의 방아쇠를 당겼을 때, 총알이 뒤로 날아가도록 컴파일 문제 없이 구현할 수는 있다.
하지만 이러한 구현은 LSP를 위반한 것이며, 설령 총알의 속도가 느릴지라도 앞으로 날아가도록 구현해야 한다.


4. ISP (interface segregation principle)

특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다

인터페이스를 범용적으로 두지 말고, 최대한 작은 단위로 쪼개라는 것으로 이해하였다.


5. DIP (dependency inversion principle)

구체화에 의존하지 말고 추상화에 의존하라

다시 말해서 구현 클래스에 의존하지 말고 인터페이스에 의존하라는 뜻이다.
2번의 OCP (open / closed principle)를 설명하며 사용했던 예제 코드를 다시 가져오겠다.

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

위의 코드는 OCP를 위반하는 동시에 DIP까지 위반하는 코드이다.
DIP는 구현 클래스에 의존하지 말고 인터페이스에 의존하라는 원칙이라고 언급했었다.
하지만 위의 코드 좌변에서는 MemberRepository라는 인터페이스에 올바르게 의존하는 반면, 우변에서는 구현 클래스에 의존하고 있다.


정리하며..

객체 지향 설계의 5가지 원칙인 SOLID에 대해 알아보았다.
OOP의 4가지 특징 중 핵심인 다형성 만으로는 SOLID 원칙을 지킬 수 없다는 것을, 구체적으로 OCP와 DIP를 준수할 수 없다는 결론을 얻었다.
하지만 스프링의 DI (Dependency Injection) 의존관계 주입과 DI 컨테이너를 통해 다형성 + OCP, DIP를 가능하도록 할 수 있다.

0개의 댓글