본문 바로가기
Spring

[spring] 객체지향 설계의 5가지 원칙 with spring (SOLID)

by devjh 2021. 2. 22.
반응형

객체지향 설계의 5대 원칙이란 SRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), ISP(인터페이스 분리 원칙), DIP(의존 역전 원칙)을 칭하며 각각의 앞자를 따서 SOILD 원칙이라고 부릅니다.

 

1. SRP 단일 책임 원칙(single responsibility principle)

  • 하나의 클래스는 하나의 책임만 가져야 한다.
  • 변경이 있을때 파급효과가 적으면 다일책임 원칙을 잘 따른것이다.(ex 객체의 생성과 사용을 분리)
  • 응집도가 높고 결합도가 낮게 설계하라는 기본 원칙이다.
  • 스프링에서는 객체의 생성을 IOC 컨테이너에서 주입받아 사용하여 구현객체를 생성하는 책임을 IOC 컨테이너에게 위임한다.

 

 

2. OCP 개방-폐쇄 원칙(Open/closed principle)

  • 소프트웨어의 구성요소(컴포넌트, 클래스, 모듈, 함수)는 확장에는 열려있고, 변경에는 닫혀있어야 한다
  • 다형성을 활용하여 인터페이스를 구현한 새로운 클래스를 만들어 새로운 기능을 만들어야 한다.
  • ServiceImpl, JpaRepositoryImpl 등으로 구현체를 만들어 인터페이스에 끼워 쓰는건 OCP를 지키기 위함이다.
  • DB 접근방식이 Mybatis로 변경되어도 MybatisRepositryImpl등으로 구현체를 변경시켜 사용이 가능해진다.
  • Mybatis로 소프트웨어의 요소를 확장하여도 Repository와 Bean 영역만 바꿔줘도 되므로
  • 실제 사용영역인 Service단의 변경은 닫혀있다.

 

 

3. LSP 리스코프 치환 원칙(Liskov substitution principle)

  • 다형성에서 하위클래스는 인터페이스 규약을 다 지켜야 한다는 원칙이다.
  • 단순히 인터페이스를 하위클래스에서 구현하여 컴파일 에러를 피하라는 것이 아니라
  • 부모의 동작 규약을 지키라는 것이다.
  • (save라는 동작을 할 시 디비연동을 어떤방식으로 하던지 insert into 쿼리를 실행해야한다.)
  • (delete 쿼리를 실행하도록 해도 컴파일에는 문제가 없으나 LSP 리스코프 치환 원칙을 위배한 것)

 

 

4. ISP 인터페이스 분리 원칙(interface segregation principle)

  • 범용 인터페이스 하나보다는 대체가능성을 생각해 필수기능이 잘 구현된 인터페이스 여러개를 설계하라
  • 인터페이스가 명확해지고 대체 가능성이 높아진다.

 

 

5. DIP 의존관계 역전 원칙(Dependency inversion principle)

  • 구현 클래스에 의존하지 말고 인터페이스에 의존하라는 뜻
  • 변화하기 쉬운 구현객체에 의존하게 되면 추후 변경 및 유지보수가 힘들어진다.
  • 서비스단에서 레파지토리의 인터페이스에만 의존하게된다면(생성과 주입은 IOC 컨테이너에서)
  • 스프링을 통해 DIP 원칙을 지킬 수 있다.
반응형

댓글