Spring Framework
자바 EE 어플리케이션을 빌드할 수 있는 오픈소스 경량 프레임워크
스프링 프레임워크는 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 spring이라고도 불린다.
(동적인 웹 사이트를 개발하기 위한 여러가지 서비스를 제공하고 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준 프레임워크의 기반 기술로서 쓰이고 있다.)
- 📌엔터프라이즈용 JAVA 애플리케이션 개발을 편하게 할 수 있게 해주는 Spring
: 스프링이 등장하기 이전에는 비즈니스 로직을 구현하기 우해 기술 자체에 대한 공부를 추가적으로 해야만 했다. 비즈니스 로직을 구현하는 기술 자체가 복잡하고 어려웠기 때문이다.
이전 기술에 비해 사용 방법이 상대적으로 덜 복잡한 스프링의 등장으로 개발 초기에 기본적인 설정과 적용시킬 기술들만 잘 선택 해 준다면, 기술보다는 애플리케이션의 로직 자체에 더 집중하여 비즈니스 로직을 구현할 수 있다.
- 오픈 소스
: 모든 사용자에게 무료로 열러있는 오픈소스로 필요하다면 스프링 코드 일부를 수정하여 사용하여도 무관하다. 이처럼 여러 사람이 프로젝트의 코드를 사용해봄으로써 다양한 검증 과정을 거칠 수 있다.
- 경량급
: 스프링이 등장하기 이전에는 EJB(Enterprise Java Bean)라는 기술이 주로 사용되었는데 불필요하게 복잡한 코드를 작성해야만 했다. 코드의 복잡성과 불필요한 코드를 걷어낼지 고민하여 탄생한 결과가 스프링이다
기존에 스프링 대신 사용하던 기술들과 비교하여 스프링을 사용했을 때에 개발자가 작성할 코드가 상대적으로 단순하다는 것을 표현(수십개의 세부 모듈 및 수십만줄의 방대한 코드로 이루어진 프레임워크임에도 불구하고 경량급이라는 수식어를 붙이는 이유)
기존 기술을 사용할 때 불가피하게 작성해야만 했던 불필요한 코드를 제거하여 코드의 복잡성을 낮출 수 있다
애플리케이션 프레임워크
프레임워크 : 어떠한 목적을 쉽게 달성할 수 있도록 해당 목적과 관련된 코드의 뼈대를 미리 만들어둔 것(특정 업무 분야 혹은 하나의 기술에 집중한다 특화된 목적을 편리하게 성할 수 있게 하기 위해 만들어지는 것)
애플리케이션 프레임워크 : 특정 업무 분야 및 특정 기술이 아니라 애플리케이션 개발에 필요한 모든 과정에 집중 즉, 애플리케이션을 개발하는데 있어 필요한 모든 업무 분야 및 모든 기술과 관련된 코드들의 뼈대 제공
특징
POJO 프로그래밍 지향
- Java 및 Java의 스펙에 정의된 기술만 사용하는 것(순수 JAVA만을 통해 생성한 객체를 의미) 외부 기술이나 규약의 변화에 얽매이지 않아 유연하게 변화와 확장에 대처할 수 있고, 객체지향 설계를 제한없이 적용할 수 있어 코드가 단순해지고 테스트와 디버깅이 쉬워진다
- 예로 Getter, Setter민 존재하는 객체
- 외부 모듈(라이브러리를 import하여 사용)에 직접적으로 의존하고 있는 경우, 이 객체가 사용하고 있는 기술이 Deprecated되거나 개선된 신기술이 등장하면 해당 기술을 사용하고 있는 모든 객체들의 코드를 변경해야하는 상황이 발생한다.
POJO 프로그래밍을 위해 스프링이 지원하는 기술
아래 사진 코드와 함께 봐주세요
- DI(Dependency Injection) : 의존성 주입
- 의존 객체를 특정 클래스에서 직접 생성하는 것이 아니라 외부로부터 주입해주는 것을 의미
- 개발자가 Spring 프레임워크에 의존성을 주입하면서 객체 간 결합을 느슨하게 하여 코드의 재사용성 증가, 단위 테스트가 용이해 집니다.
- IoC(Invesion of Control) : 제어의 역전
- 컨트롤의 제어권이 개발자가 아닌 프레임워크가 대신해서 해주는 것 (Servlet이나 Bean 같은 코드를 프레임 워크가 대신 수행)
- AOP(Aspect Oriented Programming) : 관점지향 프로그래밍
- 애플리케이션 전반에 걸쳐 공통적으로 적용되는 코드들을 비즈니스 로직으로부터 분리해내는 것
- 코드 중복 문제를 해결하기 위해서 공통 관심 사항과 핵심 관심 사항을 분리하는 등의
애플리케이션 전반에 걸쳐 적용되는 공통 기능을 비즈니스 로직으로부터 분리해내는 것
- PSA(Protable Service Abstraction) : 일관된 서비스 추상화
- 특정 기술과 관련된 서비스들을 추상화하여 일관된 방식으로 사용할 수 있도록 제공하는 것
- JDBC를 통해 스프링이 데이터베이스를 변경할 수 있는 인터페이스를 제공한다
이처럼 JDBC처럼 특정 기술과 관련된 서비스를 추상화하여 일관된 방식으로 사용할 수 있도록 한 것을 PSA라고 한다.
📌개발자가 아닌 스프링이 A가 사용할 객체를 생성하여 의존 관계를 맺어주는 것을 IoC(Inversion of Control, 제어의 역전)라고 하며,
그 과정에서 C를 A의 생성자를 통해 주입해주는 것을 DI(Dependency Injection, 의존성 주입)라고 합니다.
Spring Boot
- Spring + Boot(strap) 기존 스프링 프레임워크 위에 구축
독립 실행형, 프로덕션 등급, 스프링 기반 어플리케이션을 쉽게 만들 수 있다.
스프링 프레임워크를 사용하기 위한 설정의 많은 부분을 자동화하여 개발자가 편하게 스프링을 활용할 수 있도록 돕는다.
- Spring-REST API 개발에 주로 사용되는 스프링 기반 프레임워크
환경설명이 복잡한 spring을 위해 나온것이 스프링 부트이다.
스프링 부트는 단독적이고, 상용화 수준의 스프링 기반 애플리케이션을 단지 실행만 해도 될 정도록 쉽게 만들 수 있도록 나온 것
스프링부트는 스프링을 사용하기 위한 설정의 많은 부분은 자동화하여 사용자가 편하게 활용할 수 있도록 돕고, 스프링 부트 starter 디펜던시만 추가해주면 바로 API를 정의하고 서버를 실행할 수 있다.
Spring Boot starter
특정 목적을 달성하기 위한 의존성 그룹
npm처럼 간편하게 디펜던시를 제공해주는데,
예를 들어 JPA를 사용하는 경우 prom.xml(Maven), build.gradle(Gradle)에
spring-boot-starter-data-jpa
를 추가하면 springboot가 필요한 라이브러리를 자동주입해준다.
Spring vs SpringBoot 차이점
-
Spring
- 종속성 주입(dependency의 호환되는 라이브러리 버전을 맞춰줘야 한다.)
하나의 버전을 올리는 경우 다른 dependency에 영향을 미쳐 버전관리에 어려움이 있다
- XML 설정 요함
- 어노테이션 및 빈 등록 등의 configuration 설정을 모두 해줘야한다
- war파일을 Web Application Server에 담아 설정을 통해 배포
-
SpringBoot
- springboot 내부에 Tomcat이 내장되어 있어서 (Embed Tomcat 사용)
따로 Tomcat을 설치하거나 매번 버전 관리를 하지 않아도 된다
- spring starter를 통한 dependency 라이브러리 버전 자동화(자동 구성)
- XML 설정을 하지 않아도 된다
- Spring Actuaor를 이용한 애플리케이션의 모니터링과 관리 제공
- 내장 WAS를 가지고 있기 때문에 jar file을 이용해 자바 옵션만으로 손쉽게 배포 가능
- configuration을 pplication.properties파일이나 application.yml파일에 설정
- @SpringBootApplication을 통해 외부 라이브러리, 내장 톰캣 서버 등이 실행
- @ComponentScan : controller, service, repository, component 자동 Bean 등록
- @EnableAutoConfiguration : @ComponentScan 이후 사전에 정의한 라이브러리 Bean 등록
정리
- Spring Framework는 기존에 EJB를 대신해 자바 애플리케이션을 더 쉽게 만들 수 있게 해 준다
- 스프링은 POJO 프로그래밍을 지향하는 특징을 가지며 그를 위해 IoC/DI, AOP, PSA를 지원한다.
- Spring Boot Framework는 Spring Framework보다 개발자가 개발에만 집중할 수 있도록 도와주는 프레임워크이다.
참고