[스프링 핵심원리] 객체지향 설계와 스프링 - SOLID

김우경·2021년 1월 12일
0

Spring Framework

목록 보기
11/12

김영한님의 스프링 핵심 원리 - 기본편을 보고 공부한 내용입니다.

좋은 객체 지향 설계의 5가지 (SOLID)

SRP 단일 책임 원칙

  • 정의 : 한 클래스는 하나의 책임만
  • 변경이 있을때 파급 효과가 작은 경우 SRP를 잘 따랐다고 할 수 있다.
  • 책임의 범위를 적절하게 잘 조절해야함

OCP 개방-폐쇄 원칙

  • 정의 : 확장에는 열려있고, 변경에는 닫혀있어야

  • 다형성의 활용
    → 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능 구현

    e.g. MemoryMemberRepository → JdbcMemberRepository

문제점

  • 이전 강의 예제에서,
    MemberService 클라이언트가 MemoryMemberRepository를 사용할 것인지, JdbcMemberRepository를 사용할 것인지 직접 선택한다.

→ 구현 객체를 변경하려면 클라이언트 코드를 변경해야함
OCP가 깨짐

해결 방법

객체 생성, 연관관계를 맺어주는 별도의 조립, 설정자가 필요
→ 스프링 컨테이너의 역할

LSP 리스코프 치환 원칙

  • 정의 : 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
  • 인터페이스에 대한 구현체를 구현할때 인터페이스의 규약을 전부 지켜야
    → 기능적으로 보장해줘야한다.

e.g. 자동차의 악셀을 뒤로 가게 구현하면 LSP 위반

ISP 인터페이스 분리 원칙

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

e.g. 자동차 인터페이스 → 운전 인터페이스, 정비 인터페이스
사용자 인터페이스 → 운전자 인터페이스, 정비사 인터페이스

  • 인터페이스가 명확, 대체 가능성 향상

DIP 의존관계 역전 원칙

  • 정의 : 추상화에 의존해야지 구체화에 의존하면 안된다.
    → 클라이언트 코드가 구현 클래스를 바라보는 것이 아닌 인터페이스를 바라보도록!

  • 역활에 의존하게 한다는 뜻과 같음
    인터페이스에 의존해야 유연한 변경이 가능

e.g. MemberServiceMemoryRepository도 의존하지만, MemoryMemberRepository도 의존함

→ MemoryService가 구현 클래스를 선택
→ DIP 위반 !!

→ 다형성만으로는 OCP, DIP를 지킬 수 없다

객체지향 설계와 스프링

스프링은 DI로 OCP, DIP를 가능하게 지원

→ 클라이언트 코드 변경없이 기능 확장 가능

정리

  • 모든 설계에서 역할구현을 분리

  • 좋은 객체 지향 설계 : 언제든지 유연하게 변경할 수 있도록 만들기

  • 이상적으로는 모든 설계에 인터페이스 부여

    : 어떤 db를 사용할지 정해지지 않은 경우

    → 인터페이스의 도입에는 추상화 비용이 발생 : 개발자 코드를 한번 더 열어봐야

    → 기능 확장의 가능성이 없으면 일단 구체 클래스를 사용하고, 향후에 리팩토링해서 인터페이스 도입도 가능

출처

김영한님의 스프링 핵심 원리 - 기본편을 보고 공부한 내용입니다.

profile
Hongik CE

0개의 댓글