객체 지향 설계와 스프링

나나·2021년 5월 3일
0

스프링 핵심 원리

목록 보기
1/1

스프링 핵심 원리 를 듣고 정리하는 글

스프링의 핵심

스프링은 자바 언어 기반의 프레임워크로, 자바 언어의 가장 큰 특징은 객체 지향이다. 스프링은 객체 지향 언어가 가진 가장 강력한 특징을 살려내는 프레임 워크이다. 즉, 좋은 객체 지향 어플리케이션을 개발할 수 있도록 도와주는 프레임워크라고 할 수 있다.

좋은 객체 지향 프로그래밍

객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들어 준다.

객체 지향의 특징
1. 추상화

  • 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 것
  1. 캡슐화
  2. 상속
  • 기존에 존재하는 클래스로부터 데이터와 코드를 이어받고, 필요한 기능을 추가할 수 있는 것
  1. 다형성
  • 여러 가지 형태를 가질 수 있는 능력

다형성의 실세계 비유

역할과 구현으로 세상을 구분
역할 -> 인터페이스 / 를 구현한 것 -> class

운전자와 자동차

자동차가 바뀌어도 운전자는 영향을 받지 않음
운전자(client)에 영향을 주지 않고 새로운 기능을 추가할 수 있다. 운전자는 운전하는 방법만 알면 됨

공연 무대

배우는 대체 할 수 있어야 한다 -> 대본만 보고 역할을 수행할 수 있다. 즉, 변경 가능한 유연성이 생긴다.


역할과 구현을 분리

역할구현으로 구분하면 단순해지고, 유연해지며 변경도 편리해진다.
1. 클라이언트는 대상의 역할만 알면 된다.
2. 클라이언트는 구현 대상의 내부 구조를 알 필요가 없다.
3. 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.
4. 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.

새롭게 무언가가 나타나도 클라이언트는 전혀 영향을 받지 않는다.
다형성으로 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경할 수 있다.

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

클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.


스프링과 객체 지향

스프링은 다형성을 편리하게 쓸 수 있도록 제공하는 프레임워크
제어의 역전(Inversion of Control), 의존성 주입(Dependency Injection)는 다형성을 활용하여 역할과 구현을 편리하게 다룰 수 있도록 지원


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

  1. SRP (단일책임의 원칙: Single Responsibility Principle)
    작성된 클래스는 하나의 기능만 가지며 클래스가 제공하는 모든 서비스는 그 하나의 책임(변화의 축: axis of change)을 수행하는 데 집중되어 있어야 한다

하나의 책임이라는 것은 모호하다. 중요한 기준은 변경으로, 변경이 있을 때 파급 효과가 적으면 단일 책임의 원칙을 잘 따른 것이다.

  1. OCP (개방폐쇄의 원칙: Open Close Principle)💥
    소프트웨어의 구성요소(컴포넌트, 클래스, 모듈, 함수)는 확장에는 열려있고, 변경에는 닫혀있어야 한다.

"확장에는 열려 있고, 변경에는 닫혀 있다" -> 확장 = 구현 / 변경 = 인터페이스 자체의 변화가 적다.

  1. LSP (리스코브 치환의 원칙: The Liskov Substitution Principle)
    서브 타입은 언제나 기반 타입으로 교체할 수 있어야 한다. 즉, 서브 타입은 언제나 기반 타입과 호환될 수 있어야 한다.

근본적인 기능이 보장되어야 한다.

  1. ISP (인터페이스 분리의 원칙: Interface Segregation Principle)
    한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.
  1. DIP (의존성역전의 원칙: Dependency Inversion Principle)💥
    구조적 디자인에서 발생하던 하위 레벨 모듈의 변경이 상위 레벨 모듈의 변경을 요구하는 위계관계를 끊는 의미의 역전 원칙이다.

"프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다."라는 원칙을 따르는 방법 중 하나. 구현 클래스가 아닌 인터페이스에 의존하라는 것. 구현체에 의존하게 되면 변경이 어려움


객체 지향 설계와 스프링

다형성만으로는 OCP, DIP를 지킬 수 없다.
Spring Container가 이를 도와준다. 클라이언트 코드의 변경 없이 기능을 확장할 수 있다.

profile
I can end suffering! 일단해,,🤨😬

0개의 댓글