[Spring] 스프링 핵심 원리 - 객체지향

gnoesnooj·2021년 11월 28일
0

인프런 김영한님의 스프링 핵심 원리를 듣고 공부한 것을 정리한 글입니다.


(1) 스프링 ?

스프링은 기존 EJB 기반으로 개발하던 개발자들에게 EJB의 겨울이 지나가고 Spring, 봄이 왔다 라는 의미로 이름이 붙여졌다고 한다.
EJB 컨테이너를 대체하였으며, 현재는 사실상 표준 기술로 자리잡았다.

스프링이란 ?

-> 스프링 DI 컨테이너 , 스프링 프레임워크, 스프링과 스프링부트 모두 포함한 스프링 환경 자체 모두 스프링이라고 말할 수 있다.
-> 스프링은 다음과 같은 기술들을 제공한다.

  • 스프링 DI 컨테이너, AOP, 이벤트
  • 스프링 MVC, 스프링 WebFlux
  • 데이터 접근 기술 : 트랜잭션, JDBC, ORM 지원, XML 지원
  • 캐시, 이메일, 원격접근, 스케줄링
  • 테스트 (스프링 기반 통합, 단위 테스트 지원)
  • 코틀린, 그루비 언어 지원

스프링 부트란?

-> 스프링 프레임워크를 사용하는 데에 있어 보다 편리하고 쉽게 사용할 수 있도록 도와주는 도구로, 최근에는 대부분 기본적으로 같이 사용한다.
-> 스프링부트는 스프링을 도와주고 쉽게 사용하기 위한 기능을 제공하므로 스프링 없이 별도로 사용하는 것은 불가능하다.

  • Tomcat 과 같은 웹서버를 내장으로 가지고 있어서 별도로 웹 서버 설치를 안해도 됨.
  • starter 종속성 제공을 통해서 빌드를 손쉽게 도와준다 (이전에는 라이브러리 하나하나 다 가져와줘야 했는데 이젠 하나 가져오면 알아서 연관된 라이브러리를 다 가져와준다.)
  • 스프링 + 서드파티 라이브러리 자동 구성 (라이브러리끼리 서로 호환이 가능한 버전으로 자동으로 관리해준다.)
  • 메트릭, 상태확인, 외부구성과 같은 프로덕션 준비 기능 제공 : 모니터링같은 기능 제공
  • 디폴트, 메뉴얼 등을 통해 간결하게 설정을 하도록 도와준다

(2) 스프링을 왜 만들었을까 ?

스프링의 핵심 -> 자바 언어 기반의 프레임워크
자바? -> 객체지향 언어
즉, 스프링은 객체지향 언어의 특징 중 가장 강력한 특징들을 살려내는 프레임 워크이다.
기존 스프링이 없을 때에는 이런 저런 원칙을 지키고, 라이브러리, db, 웹서버 등 전부다 일일이 연결하여 가져다 사용해야해서 개발 이외에 드는 시간과 비용에 매우 컸음. 이러한 배경 속에 스프링이 탄생하게 되었다.

그렇다면 좋은 객체지향 프로그래밍은 뭘까 ?

  • 객체지향의 특징 : 캡슐화, 상속, 추상화, 다형성
  • 객체지향은 역할과 책임을 가진 객체가 서로 메세지를 주고받으며 협력하는 것이다.
  • 객체지향 프로그래밍은 프로그램을 유연하고 변경을 용이하게 해주기 때문에 대규모 소프트웨어 개발에 많이 사용된다.

?? 유연하고 변경을 용이하게 해준다 ??

-> 레고 블럭을 조립하듯이, 컴퓨터 부품을 갈아 끼우듯이 컴포넌트를 쉽고 유연하게 변경하면서 개발하는 것이 가능하게 해준다. -> 이 특징이 다형성이다.
-> 객체지향의 가장 큰 중심이자 특징이 바로 다형성이다.

(3) 다형성이 왜 중요할까 ?

다형성을 이해하기 위한 객체지향에 대한 접근

  • 객체지향에 맞게 역할과 구현을 통해서 어느 정도 구분하여 실세계에 비유해서 이해해본다.

(1) 운전자 - 자동차 관계

  • 운전자는 K3타다가 아반떼를 타도 운전을 할 수 있다. 자동차가 바뀌어도 운전자에게는 영향을 주지 않는다. -> 운전자는 자동차 역할에 대해서만 알고 있으면 된다.
  • 운전자는 자동차 내부 구조를 몰라도 된다.
  • 구현이 바뀌어도 (자동차가 바뀌어도) 역할이 그대로라면 (자동차 역할을 알고만 있다면) 클라이언트 (운전자)에게는 영향을 주지 않는다.
  • 이러한 특징을 바탕으로 새로운 자동차가 나와도 무한으로 자동차 인터페이스를 통해서 확장이 가능하고, 이것들은 운전자에게는 아무런 영향을 끼치지 않는다.

(2) 로미오 - 줄리엣 관계

  • 모든 역할은 대체 가능하다.
  • 로미오와 줄리엣을 누가 해도 상관이 없다.
  • 로미오는 줄리엣 역할을 누가해도 영향이 없고, 줄리엣 역시 동일하다.
  • 로미오는 줄리엣 역할이 바뀌어도 상관없고, 줄리엣 역시 동일하다.

=> 모두 다형성 덕분

(3) 정리

  • 클라이언트는 대상(의존하고자 하는 인터페이스)의 역할만 알면 된다
  • 클라이언트는 구현 대상의 내부구조를 몰라도 된다.
  • 클라이언트는 구현 대상 내부구조가 변경되어도 영향을 받지 않는다.
  • 안정적인 인터페이스 개발이 중요하다. -> 인터페이스를 잘못 정한다면, 인터페이스를 구현하는 모든 구현체에게 영향이 가고, 해당 인터페이스에 의존하는 객체 역시 영향을 받기 때문이다.(+ 해당 기능을 확장할 가능성이 없다면 구현체를 두고, 나중에 필요 시 인터페이스를 리팩토링을 통해 넣어줘도 하나의 방법이다.)

스프링과 객체지향

  • 스프링은 다형성을 극대화하여 이용하도록 도와준다.
  • DI, IoC 모두 다형성을 통해서 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
  • 앞서 말했듯 레고 블럭 조립, 컴퓨터 부품 조립처럼 구현을 편리하게 변경할 수 있다.

객체지향 개발 - SOLID

SOLID >> https://velog.io/@gnoesnooj/JAVA-SOLID

느낀 점

여태까지 여러 자바 관련 책들을 읽으면서 객체지향 관련 지식을 쌓으려고 노력했지만, 완벽히 이해되지 않았고 잘 모르는데 알고있다고 생각한 것도 많았던 것 같다. 머릿 속에 두서없이 흩뿌려져 있던 것들을 정리하게 되는 계기가 되었던 것 같다.

profile
누구나 믿을 수 있는 개발자가 되자 !

0개의 댓글