Back-end/Spring

Spring 개념 간단 정리

_SIHA_ 2022. 2. 5. 17:45

✅  왜 Spring을 사용하는가?

 

스프링은 객체지향 언어의 다형성을 극대화해서 이용할 수 있게 도와준다. 

 

  • 자바 언어 기반의 프레임워크

객체지향언어가 가진 강력한 특징을 살리는 프레임워크(추상화, 캡슐화, 상속, 다형성 등)

유연하고 변경이 용이한 점. 부품을 갈아끼우듯, 컴포넌트를 쉽고 유연하게 변경하면서 개발 가능(다형성)

 

 

  • 다형성의 중요성 

ex) 역할 vs 구현

<1>자동차를 바꿀때마다 면허를 다시 따는 것이 아니듯, 어떤 자동차를 구매하더라도 운전자는 무한히 운전이 가능

<2>공연 무대에서, 각 역할에는 배우 대체가 언제든 가능하다. 

<3>키보드, 마우스 등의 인터페이스 

 

이러한 특징은 변경이 편리하고 유연하다는 특징을 지닌다. 

클라이언트는 대상의 역할만 알면 된다. 

클라이언트는 내부 구조를 몰라도 된다. 구조가 변경되어도, 대상이 바뀌어도 영향을 받지 않는다.

 

즉,

역할 = 인터페이스

구현 = 인터페이스를 구현한 클래스, 구현 객체

 

여기서 역할(인터페이스)이 구현보다 중요하다는 점을 명심할 것! 

 

 

  • 자바 언어의 다형성의 장점

 

- 자바 기본 문법인 오버라이딩

- 오버라이딩 된 메서드 실행

- 다형성으로 인터페이스를 구현한 객체를 실행시점에 유연하게 변경 가능

- 클래스 상속 관계도 다형성, 오버라이딩 적용 가능 

 

 

 

✅  좋은 객체 지향 설계 (SOLID) 를 위한 Spring의 사용

 

 

 

클린코드로 유명한 로버트 마틴이 정리한 5가지 원칙

 

  • SRP : 단일 책임 원칙(single responsibility principle)

한 클래스는 하나의 책임만 가져야 함

(하나의 책임 - 문맥과 상황에 따라 다름, 크거나 작을 수 있음. 매우 모호)

중요 기준은 변경

변경이 있을 때 파급효과가 적으면 단일 책임원칙을 따른 것.

 

 

 

  • OCP : 개방-폐쇄 원칙(Open/closed principle)

소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀있어야 한다. (이게 무슨말일까?)

 

>> 다형성을 활용한 것 << 

인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현하면 된다.  (역할과 구현을 분리)

 

 

 

  • LSP : 리스코프 치환 원칙(Liskov subsititution principle)

프로그램의 정확성을 깨뜨리지 않으면서 하위타입의 인스턴스로 바꿀 수 있어야 한다.

ex) 자동차 인터페이스의 엑셀 = 앞으로 가는 것. 

뒤로가도록 구현하면 LSP 위반이 된다. 천천히 가더라도 앞으로 가도록 구현해야함 

 

 

 

  • ISP : 인터페이스 분리 원칙(Interface segregation principle)

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

각 인터페이스가 변해도 클라이언트에 영향을 주지 않는다. 

인터페이스가 명확해지고 대체 가능성이 높아진다. 

 

 

 

  • DIP : 의존관계 역전 원칙(Dependency inversion principle)

추상화에 의존해야지, 구체화에 의존하면 안된다. 

'역할'에 의존해야한다는 것! 

즉, 구현 클래스에 의존하는 것이 아니라, 인터페이스에 의존해야한다는 의미이다. 

ex) 공연에서 배우의 역할에 의존해야지, 배우 자체에 의존해서는 안된다는 의미. 언제든 배우는 대체될 수 있다고 생각해야함 

 

 

 

 

✅  OCP / DIP 원칙을 만족시키기 위한 Spring의 역할

 

 

다형성을 사용했지만 OCP와 DIP원칙을 지킬 수 없는 경우가 있다.

객체를 생성하고 연관관계를 맺어주는 별도의 조립, 설정자가 필요하다. 

 

 

이를 해결해주는 것이 스프링의 역할!

 

  • DI (의존관계, 의존성 주입)과 DI 컨테이너를 제공함으로서 다형성과 OCP, DIP를 가능케 함 
  • 또한 클라이언트 코드의 변경없이 확장이 가능
  • 부품을 교체하듯 쉽게 개발할 수 있다. 

 

 

 

출처 : 인프런 <스프링 핵심 원리 - 기본편> https://inf.run/9yMN