on
스프링 핵심원리 기본 - 스프링이란
스프링 핵심원리 기본 - 스프링이란
강의 소개
인프런 김영한 스프링 완전 정복 시리즈 중 '스프링 핵심 원리 - 기본 편'정리입니다.
자세한 내용을 수강하고 싶으시다면 김영한님 강의 수강을 적극 추천합니다.
1. 스프링이란?
스프링이라는 단어는 문맥에 따라 다르게 사용된다.
1) 스프링 DI 컨테이너 기술 2) 스프링 프레임워크 3) 스프링 생태계 등
스프링 프레임워크
스프링의 가장 핵심 기술 (스프링 DI 컨테이너, AOP, 이벤트, 기타)
웹 기술 (스프링 MVC, 스프링 WebFlux)
데이터 접근 기술: 트랜젝션, JDBC, ORM 지원, XML 지원
스프링 부트
스프링의 많은 기능들을 편리하게 사용할 수 있도록 도와준다.
최근에는 기본으로 사용한다.
톰캣 같은 웹 서버를 내장한다.(별도 설치 X) 지금은 스프링 부트로 빌드, 서버 띄우는 것까지 자체적으로 해준다.
(이전에는 빌드 -> 톰캣서버 별도 설치 -> 톰캣 서버의 특정 위치에다가 빌드된 스프링을 넣어 번거로웠다)
쉬운 빌드가 가능하도록 starter 종속성을 제공한다.
(AOP 스타터, DATA JPA 스터터 등등을 깔아야 했던 과거와 달리, 현재는 한 개만 설정하면 나머지 starter 라이브러리도 구성할 수 있도록 편리해졌다)
그밖에
스프링 데이터, 스프링 세션, 스프링 시큐리티, 스프링 Rest Docs, 스프링 배치, 스프링 클라우드
2. 스프링의 핵심 컨셉
스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있도록 도와주는 프레임워크
(스프링은 자바 언어의 핵심인 객체 지향을 강력히 살려낸다)
3. 좋은 객체 지향 프로그래밍
객체지향의 특징
추상화
캡슐화
상속
다형성
객체 지향 프로그래밍
컴퓨터 프로그램을 여러 개의 독립된 단위인 '객체'들의 모임으로 파악하는 것이다.
각각의 객체는 메시지를 주고받으며 데이터를 처리할 수 있다.
장점은 유연하고 변경이 용이하다는 것이다. 궁극의 유연하고 변경이 용이하는 것은 바로 '다형성'을 나타낸다.
다형성(Polymorphism)
역할과 구현으로 세상을 구분하는 것이다.
예를 들어 운전자가 자동차 중 아반떼에만 의존하고 있다면 테슬라, K7을 운전하지 못할 것이다.
하지만 운전자가 자동차 역할에만 의존하게 된다면? 차종이 여러 번 바뀌어도 계속 운전할 수 있다.
여기서 운전자는 클라이언트를, 자동차 역할은 인터페이스를, 아반떼 등의 차종은 인터페이스의 구현을 의미한다.
운전자(클라이언트)가 자동차 역할(인터페이스)에 의존하는 경우 장점은 아래와 같다.
클라이언트가 자동차의 내부구조를 몰라도 된다
구현이 내부적으로 바뀌더라도 클라이언트에게 전혀 영향이 없다
차종이 바뀌어도 상관없이 운전할 수 있다.
즉, 클라이언트에게 영향 주지 않고 자동차는 새로운 기능을 제공할 수 있는 것이다.
그래서 역할과 구현으로 구분하면 클라이언트는 대상의 역할(인터페이스)만 알면 된다.
객체 설계 시 역할(인터페이스)을 먼저 부여 후, 그 역할을 수행하는 구현 객체를 만들어야 하는 것이다.
다형성의 본질
인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다.
객체는 독립적일 수 없다. 객체의 핵심은 협력이다.
클라이언트 변경 없이, 서버의 구현 기능을 유연히 변경할 수 있다.
스프링과 객체 지향
스프링의 제어의 역전(IoC), 의존관계 주입(DI)은 다형성을 활용하여 역할, 구현을 다룰 수 있게 한다.
스프링을 사용하면 구현을 편리하게 바꿀 수 있다.
SOLID 원칙
객체지향의 핵심은 다형성이지만,
다형성 만으로는 SOLID 원칙 중에서 OCP(개방-폐쇄 원칙), DIP(의존 역전 원칙)를 지킬 수 없다.
2021.12.29 - [교육, 학습/인프런_김영한] - 스프링 핵심원리 기본 - 객체 지향을 위한 SOLID원칙
스프링은 가능하다(스프링의 등장)
그런데 스프링이 다형성, OCP, DIP 원칙을 지킬 수 있게 해 준다!
DI(의존성 주입), DI 컨테이너를 사용한다면.
즉, 클라이언트 코드의 변경 없이 기능 확장이 가능하다.
from http://structuring.tistory.com/106 by ccl(A) rewrite - 2021-12-29 23:01:39