Spring 관련 포스팅 목록
Spring Framework vs Spring MVC
Spring MVC vs 스프링 부트(Spring Boot)
Spring Framework란 무었일까? (부제 : 프레임워크 와 라이브러리)
스프링이란?
흔히 스프링이라 부르지만 "스프링 프레임워크(Spring Framework)"라고 하는 것이 정확한 표현입니다.
Spring Framework를 한마디로 표현하면 Java 기반의 웹 애플리케이션 개발을 위한 오픈소스 경량급 애플리케이션 프레임워크 라고 할수 있습니다.
- Open Source : 소프트웨어(S/w) 혹은 하드웨어의(H/W) 제작자의 권리를 지키면서 원시 코드를 누구나 열람할 수 있도록 한 소프트웨어, 오픈 소스 라이선스에 준하는 모든 통칭을 일컫는다. (소스가 공개되어 여러 개발자가 플랫폼을 함께 개발, 구축, 보완해 나가는 시스템. )
프레임워크(Framework)는 무었일까?
프레임워크는 뼈대나 기반 구조를 뜻하고, 제어의 역전(IoC) 개념이 적용된 대표적인 기술입니다.
소프트웨어에서의 프레임워크는 '소프트웨어의 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합' 이라 할 수 있으며, 완성된 어플리케이션이 아닌 프로그래머가 완성시키는 작업을 해야합니다.
프레임 워크를 이해하기 위해선 라이브러리 라는 개념도 함께 짚고 넘어가야 합니다
라이브러리는 단순 활용가능한 도구들의 집합을 말합니다. 즉, 개발자가 만든 클래스에서 호출하여 사용, 클래스들의 나열로 필요한 클래스를 불러서 사용하는 방식을 취하고 있습니다.
라이브러리는 특정 정의된 클래스를 호출하여 사용한다는 것은 이해가 가지만, 프레임워크는 제어의 역전 개념을 모르고 있다면 이해하기가 쉽지 않습니다. 순전히 뼈대나 기반 구조라고 생각하면 더더욱 이게 무엇인가 싶죠.
프레임워크와 라이브러리의 차이는 애플리케이션의 흐름을 누가 쥐고 있느냐입니다.
프레임워크는 전체적인 흐름을 스스로가 쥐고 있으며 사용자는 그 안에서 필요한 코드를 짜 넣지만, 라이브러리는 사용자가 전체적인 흐름을 만들며 라이브러리를 가져다 쓰는 것이라고 할 수 있습니다. 다시 말해, 라이브러리는 라이브러리를 가져다가 사용하고 호출하는 측에 전적으로 주도성이 있으며 프레임워크는 그 틀안에 이미 제어 흐름에 대한 주도성이 있다는 것입니다.
- 라이브러리와 프레임워크 :
내가 무언가를 가져다가 쓴다는 느낌이 든다면 그것을 라이브러리를 사용하는 것이고(내가 갑),
내가 무언가의 틀 안에서 작업한다는 느낌이 든다면 프레임워크입니다.(프레임워크가 갑)
애플리케이션 프레임워크는 무었일까?
일반적으로 라이브러리나 프레임워크는 특정 업무 분야나 한 가지 기술에 특화된 목표를 가지고 만들어집니다. 예를 들면 웹 계층을 MVC 구조로 손쉽게 만들 수 있게 한다거나, 포맷과 출력장치를 유연하게 변경할 수 있는 애플리케이션 로그 기능을 제공하는 것이 있죠. 그래서 프레임워크는 애플리케이션의 특정 계층에서 주로 동작하는 한가지 기술 분야에 집중됩니다.
이와 달리, 애플리케이션 프레임워크는 특정 계층이나, 기술, 업무 분야에 국한되지 않고 애츨리케이션의 전 영역을 포괄하는 범용적인 프레임워크를 말합니다. 즉, 애플리케이션 프레임워크는 애플리케이션 개발의 전 과정을 빠르고 편리하며 효율적으로 진행하는데 일차적인 목표를 두는 프레임워크입니다.
스프링 프레임워크의 특징
(1) 경량 컨테이너
경량 컨테이너로서 자바 객체를 직접 관리합니다. 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있습니다.
(2) POJO 기반의 구성
POJO는 Plain Old Java Object로, 평범한 자바 객체를 말합니다. 이 단어는 마틴 파울러가 2000년에 컨퍼런스 발표를 준비하다가 만들어낸 용어인데, 단순히 발표 중의 "간단한 자바 오브젝트를 사용하는데요~"라고 하는 것보다 "POJO 방식의 기술을 사용하는데요~"라고 하면 왠지 세련되고 첨단 기술을 쓰는 것처럼 느껴진다는 심리를 이용하여 만들어진 것이라고 합니다. 그래서 우리가 자바에서 개발하는 지극히 평범한 객체를 POJO라고 합니다.
다만, POJO는 특정 규약과 특정 환경에 종속되어서는 안 되고 객체지향 설계를 잘 지켜야한다는 조건이 있습니다.
(3) DI를 통한 객체 간의 관계 구성
스프링은 그 자체가 구조를 설계할 수 있어서 개발자가 부품을 만들어 조립하는 형태의 개발이 가능합니다. 이렇게 조립된 코드의 최종 호출은 개발자가 결정하는 것이 아니라 스프링 프레임워크 내부에서 이루어지는데, 이것을 제어의 역행(IoC)라고 합니다.
- 제어의 역행 (IoC) : Inversion of Control 애플리케이션의 느슨한 결합을 도모. 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어 필요에 따라 스프링에서 사용자의 코드를 호출한다.
의존성 주입(DI)은 제어의 역행이 일어나는 것을 전제로 하여 스프링 내부의 객체들간의 관계를 만들어줄 때 사용합니다. 의존성 주입은 말 그대로 특정 객체가 필요로 하는 객체를 외부에서 결정하여 연결시키는 것을 말합니다.
- 의존성 주입(DI) : 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
(4) AOP 지원
AOP(Aspect Oriented Programming)는 관점 지향 프로그래밍을 뜻합니다.
대부분의 시스템에서 비즈니스 로직은 아니지만 보안, 로그, 트랜잭션과 같이 반드시 처리가 필요한 부분을 횡단 관심사라고 합니다. 스프링에서는 이러한 관심사를 비즈니스 로직과 분리하여 중복된 코드를 줄이고 개발자가 비즈니스 로직에 집중하도록 만들어 줍니다.
- 관점지향 프로그래밍(AOP : Aspect-Oriented Programming) : 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.
(5) WAS에 독립적인 개발 환경
과거의 EJB가 동작하려면 고가의 느리고 무거운 자바 서버(WAS)가 필요했습니다. 그에 반해 스프링은 가장 단순한 서버환경인 톰캣(Tomcat)이나 제티(Jetty)에서도 완벽하게 동작합니다. 단순한 개발툴과 기본적인 개발환경으로도 엔터프라이즈 개발에서 필요로 하는 주요한 기능을 갖춘 애플리케이션을 개발하기에 충분한 것이죠.
(6) 트랜잭션 관리
데이터베이스를 연동하여 사용할 때 반드시 신경써야하는 부분은 하나의 업무가 여러 작업으로 이루어지는 경우에 대한 트랜잭션 처리입니다. 트랜잭션 처리는 상황에 따라 코드를 이용하여 적용해줘야 하는데 이는 개발자에게 상당히 피곤한 작업입니다.
스프링에서는 이러한 트랜잭션 처리는 애노테이션이나 XML로 설정할 수 있도록 지원해줍니다. 이로 인하여 개발자가 매번 상황에 따라 코드를 작성해줘야 하는 번거로움이 줄어들게 되었습니다.
- 설정파일(xml, java, property 등)을 이용한 선언적인 방식 및 프로그래밍을 통한 방식을 모두 지원
(7) 편리한 MVC 구조
웹 프로그램밍 개발 시 거의 표준적인 방식인 "Spring MVC"라 불리는 모델-뷰-컨트롤러(MVC) 패턴을 사용한다.
DispatcherServlet이 Controller 역할을 담당하여 각종 요청을 적절한 서비스에 분산시켜주며 이를 각 서비스들이 처리를 하여 결과를 생성하고 그 결과는 다양한 형식의 View 서비스들로 화면에 표시될 수 있다.
(8) PSA (Portable Service Abstraction, 일관된 서비스 추상화)
PSA란 환경의 변화와 관계없이 일관된 방식의 기술로의 접근 환경을 제공하는 추상화 구조를 말합니다.
이는 POJO 원칙을 철저히 따른 Spring의 기능으로 Spring에서 동작할 수 있는Library들은
POJO원칙을 지키게끔 PSA형태의 추상화가 되어있음을 의미합니다.
"잘 만든 인터페이스 하나가 열 클래스 부럽지 않다"
PSA = 잘 만든 인터페이스
PSA가 적용된 코드라면 나의 코드가 바뀌지 않고, 다른 기술로 간편하게 바꿀 수 있도록 확장성이 좋고,
기술에 특화되어 있지 않는 코드를 의미합니다.
Spring은 Spring Web MVC, Spring Transaction, Spring Cache 등의 다양한 PSA를 제공합니다.
정리
- 스프링은 엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스 경량급 애플리케이션 프레임워크다.
- 스프링은 POJO 프로그래밍을 지향하는 특징을 가지며, 그를 위해 IoC/DI, AOP, PSA를 지원한다.
- IoC는 객체 간의 의존 관계를 개발자가 아닌 스프링이 맺어주는 것을 의미한다.
- DI는 의존 객체를 특정 클래스에서 직접 생성하는 것이 아니라, 외부로부터 주입해주는 것을 의미한다.
- AOP는 애플리케이션 전반에 걸쳐 공통적으로 적용되는 코드들을 비즈니스 로직으로부터 분리해내는 것을 의미한다.
- PSA는 특정 기술과 관련된 서비스들을 추상화하여 일관된 방식으로 사용할 수 있도록 한 것을 의미한다.
모든 Spring 모듈의 핵심에는 의존성 주입 이나 제어의역행 이 있습니다. 이를통해 소스변경을 최소화 하며 프로그램을 제어할 수 있습니다.
왜 이것이 중요할까요? DI 나 IOC 를 적절히 사용하면, 우리는 느슨하게 결합된 애플리케이션들을 개발할 수 있기 때문입니다.
• 반복(Boilerplate code) 코드 나 중복코드를 줄임
• 디커플링(Decoupling)을 높이고 단위 테스트성을 증가시킨다.
또한, 느슨하게 결합된 애플리케이션들은 단위테스를 하기 쉽습니다.
의존성 주입(DI) : 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
제어의 역행 (IoC) : Inversion of Control 애플리케이션의 느슨한 결합을 도모. 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어 필요에 따라 스프링에서 사용자의 코드를 호출한다.
디커플링(Decoupling) : 모듈사이의 연결고리를 인터페이스로 구성하여 두 모듈의 의존성을 줄여(결합도를 낮춰) 개발및 유지보수가 용이하도록 하는것 즉, 모듈 사이를 인터페이스로만 연결하고 구현체(객체)를 분리하는 것입니다. 객체들간의 결합도가 높은 프로그램의 경우, 구성요소중 하나를 수정하게 되면 그와 연결된 모든 구성요소를 새로 수정하여야 하지만 인터페이스 설계가 잘된 경우에는 수정하고자 하는 요소만 수정하면 됩니다.
연관된 글 :
참고:
https://dev-coco.tistory.com/83
https://m.blog.naver.com/sthwin/221271008423
https://freestrokes.tistory.com/79
'개발 > Spring' 카테고리의 다른 글
[Spring] QueryDSL (0) | 2023.02.20 |
---|---|
[Spring] Spring Boot (0) | 2023.02.10 |
[Spring] Spring Framework vs Spring MVC (0) | 2022.12.26 |
[Spring] Spring MVC vs 스프링 부트(Spring Boot) (0) | 2022.12.26 |
[Spring] Spring MVC vs Struts2 (0) | 2022.12.26 |