이 글은 인프런에서 김영한 님의 "스프링 핵심원리 - 기본편"을 수강 후 공부한 내용을 정리한 게시글입니다. 부족한 부분이 있다면 언제든 지적 부탁드립니다.
일반적으로 스프링은 좁은 의미의 Spring Framework를 일컫는다. 그러나 넓은 의미에서의 스프링은 Spring 생태계를 의미한다. 스프링 생태계는 다음과 같이 다양한 프로젝트들을 포함하고 있다.
프로젝트 | 설명 |
---|---|
Spring Data | Data 연동을 위한 API를 제공, RDBMS와 NoSQL과 연동을 적은양의 코드로 처리 가능 |
Spring Cloud | 마이크로 서비스 기반의 아키텍처에서 사용되는 모든 검증된 패턴을 구현 |
Spring Security | 인증과 허가에 대한 기반 프레임워크를 제공하여 보안을 간단한 설정과 코드로 구현 가능 |
Spring Batch | 데이터 처리, 흐름제어, 실패 제처리 등 배치 처리 App이 필요로 하는 기능을 제공 |
Spring Integration | 시스템 간 연동을 위한 메시징 프레임워크를 제공 |
Spring Social | 소셜 네트워크 연동을 위한 기능을 제공 |
Spring Session | 사용자의 세션 정보를 관리하기 위한 API 및 구현을 제공 |
Spring Rest Docs | RESTful 서비스를 자동 문서화 기능 제공 |
Spring HATEOAS | Spring MVC로 작업할때 HATEOAS(일명 헤이티오스) 원칙을 따르는 REST 표현을 쉽게 생성할 수 있도록 API 기능 제공 |
Spring Framework | Java 기반 어플리케이션 개발을 지원하는 오픈소스 어플리케이션 프레임워크 |
Spring Boot | 기본적인 설정과 보일러 플레이트 코드(여러 곳에서 재사용 되는 코드) 작성을 최소화하고, 자동 설정과 컨벤션을 통해 개발자들이 빠르고 편리하게 어플리케이션을 개발할수 있도록 지원하는 도구 |
Java 기반 어플리케이션 개발을 지원하는 오픈소스 어플리케이션 프레임워크
서블릿의 생명 주기를 관리하는 서블릿 컨테이너와 비슷하게 bean의 생성과 관리를 해주는 컨테이너 역할을 한다.
데이터베이스, XML 또는 Messaging을 포함한 다양한 형태의 데이터에 접근하기 용이하도록 하는 모듈의 모음이다.
Web Application을 빌드할 때 사용하는 컴포넌트로, 자체 MVC 프레임워크인
Spring MVC
를 제공한다.
기본적인 설정과 보일러 플레이트 코드(여러 곳에서 재사용 되는 코드) 작성을 최소화하고, 자동 설정과 컨벤션을 통해 개발자들이 빠르고 편리하게 어플리케이션을 개발할수 있도록 지원하는 도구
객체 지향 프로그래밍은 프로그램을 유연하고 변경에 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.
그렇다면 유연하고 변경에 용이한 소프트웨어
는 무슨 의미일까? 컴포넌트를 부품 갈아 끼우듯이 변경이 쉽다는 의미이다.
부품을 갈아 끼워도 잘 돌아가게 설계를 하기 위해서는 객체를 설계할 때 역할(인터페이스)과 구현(클래스, 객체)을 명확히 분리 해야하며 설계시 역할(인터페이스)를 먼저 부여하고, 그 역할을 수행하는 구현 객체를 만들어야한다.
그렇게 객체 지향 관점으로 잘 설계된 프로그램은 클라이언트에 영향을 주지 않고 서버의 구현 기능을 유연하게 변경할 수 있다.
그렇기 때문에 객체 지향 프로그래밍에서 다형성이 가장 중요하다.
이러한 다형성을 극대화해서 이용할 수 있도록 도와준 프레임워크가 스프링이며
스프링의 제어의 역전, 의존관계 주입은 다형성을 활용하여 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
스프링은 자바 언어 기반의 프레임워크로
객체 지향 언어
가 가진 강력한 특징을 살려낼 수 있는 프레임워크.
클린코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리
하나의 클래스는 하나의 책임만 가져야한다.
소프트웨어 요소는 변경에는 열려 있으나, 변경에는 닫혀 있어야 한다.
부모 객체를 호출하는 동작에서 자식 객체가 부모 객체를 완전히 대체 할 수 있다.
목적과 관심이 각기 다른 클라이언트가 있다면 인터페이스를 통해 적절하게 분리해야 한다.
고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되며, 저수준 모듈이 고수준 모듈에 의존해야 한다.
DI(Dependency Injection): 의존관계, 의존성 주입
, DI 컨테이너 제공
과 같은 스프링의 기술로 다형성 + 개방-폐쇄 원칙, 의존관계 역전 원칙을 지킬 수 있다.