본문 바로가기

Spring

[Spring] Spring Framework란?(1)

Spring Framework란?


스프링 프레임워크(Spring Framework)란 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크로써, 간단히 스프링(Spring)이라고도 합니다. 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공합니다.

스프링 프레임 워크는 엔터프라이즈급 애플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션입니다.

엔터프라이즈급 개발이란 뜻대로만 풀이하면 기업을 대상으로 하는 개발이라는 뜻입니다. 즉, 대규모 데이터 처리와 트랜잭션이 동시에 여러 사용자로부터 행해지는 큰 규모의 환경을 엔터프라이즈 환경이라 일컫습니다.

 

스프링 프레임워크는 경량 컨테이너로 자바 객체를 담고 직접 관리합니다. 객체의 생성 및 소멸 그리고 라이프 사이클을 관리하며 언제든 스프링 컨테이너로부터 필요한 객체를 가져와 사용할 수 있습니다.

이는 스프링이 IOC기반의 프레임워크임을 의미합니다.

 

 

 

Spring Framework의 특징


위의 삼각형은 스프링의 삼각형입니다.

위의 그림에서 POJO는 스프링에서 사용하는 핵심 개념들에 둘러 싸인 모습입니다. 이는 POJO라는 것을 IoC/DI, AOP, PSA를 통해서 달성할 수 있다는 것을 의미합니다.

 

위의 특징을 하나씩 보도록 하겠습니다.

 

POJO(Plan Old Java Object)


POJO(Plan Old Java Object)는 그대로 해석하면 오래된 방식의 간단한 자바 오브젝트로써, java EE 등의 중량 프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 "무거운" 객체를 만들게 된 것에 반발해서 사용하게 된 용어입니다.

스프링 프레임워크 이전에는 원하는 엔터프라이즈 기술이 있다면 그 기술을 직접적으로 사용하는 객체를 설계했습니다. 그리고 이러한 개발 방식이 만연하고 있었습니다. 특정 기술과 환경에 종속되어 의존하게 된 자바 코드는 가독성이 떨어져 유지보수에 어려움이 생겼습니다. 또한, 특정 기술의 클래스를 상속받거나, 직접 의존하게 되어 확장성이 매우 떨어지는 단점이 있었습니다. 이는 자바가 객체지향 설계의 장점을 잃어버렸다 할 수 있습니다.

 

그래서 POJO라는 개념이 등장했습니다. 본래 자바의 장점을 살리는 '오래된' 방식의 '순수한' 자바 객체 말입니다.

다시 말해, POJO는 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트를 말합니다.

 

POJO 프로그래밍이 필요한 이유

  • 특정 환경이나 기술에 종속적이지 않으면서 재사용이 가능하고, 확장 가능한 유연한 코드를 작성할 수 있습니다.
  • 저수준 레벨의 기술과 환경에 종속적인 코드를 제거함으로써 코드의 가독성이 올라갑니다.
  • 특정 기술이나 환경에 종속적이지 않기 때문에 테스트 역시 단순해집니다.
  • 객체지향적인 설계를 제한 없이 적용할 수 있습니다.

 

POJO와 Spring Framework의 관계

스프링은 POJO 프로그래밍을 지향하는 프레임워크입니다.

스프링은 POJO 프로그래밍 코드를 달성하기 위해 세 가지 기술을 지원하고 있습니다.

그 세 가지 기술은 위의 그림에서 POJO를 감싸고 있는 IOC/DI, AOP, PSA입니다.

 

IoC(Inversion of Control)


스프링 프레임워크는 IoC기반입니다. 그렇다면 IoC란 무엇일까요?

IoC(Inversion of Control)는 그대로 풀이하자면 제어의 역전입니다. 그렇다면 제어의 역전은 무엇일까요?

 

일반적으로 지금까지 프로그램은 객체 결정 및 생성 -> 의존성 객체 생성 -> 객체 내의 메서드를 호출하는 작업을 반복하였습니다. 이는 각 객체들이 프로그램의 흐름을 결정하고 각 객체를 구성하는 작업에 직접적으로 관여한 것입니다.

즉, 모든 작업을 사용자가 제어하는 구조인 것입니다.

 

하지만 IoC에서는 이 흐름의 구조가 다릅니다. IoC에서의 객체는 자기가 사용할 객체를 선택하거나 생성하지 않습니다. 또한 자신이 어디서 만들어지고 어떻게 사용되는지 또한 모릅니다. 자신의 모든 권한을 다른 대상에게 위임함으로써 제어권한을 위임받은 특별한 객체에 의해 결정되고 만들어집니다.

즉, 제어의 흐름을 사용자가 컨트롤하지 않고 위임한 특별한 객체에 모든 것을 맡기는 것입니다.

 

IoC란 기존 사용자가 모든 작업을 제어하던 것을 특별한 객체에 모든 것을 위임하여 객체의 생성부터 생명주기 등 모든 객체에 대한 제어권이 넘어간 것을 IoC, 제어의 역전이라고 합니다.

 

IoC를 이해하기 위해 샘플 코드 및 그림을 통해 알아보도록 합시다.

 

Java 콘솔 애플리케이션의 일반적인 제어권

public class Example {
	public static void main(String[] args){
    	System.out.println("Hello IoC");
    }
}

//출력 결과
Hello IoC

위의 예제 코드를 실행하려면 main() 메서드가 있어야 합니다.

그리고 main() 메서드는 아래와 같이 동작합니다.

  1. main() 메서드 호출
  2. System 클래스를 통해서 static 멤버 변수인 out의 println()을 호출

이렇듯 개발자가 작성한 코드를 순차적으로 실행하는 게 애플리케이션의 일반적인 제어 흐름입니다. (개발자가 제어의 흐름을 결정하였습니다.)

 

Java 웹 애플리케이션에서 IoC가 적용하는 예

 

 

위 그림은 서블릿 기반의 애플리케이션을 웹에서 실행하기 위한 서블릿 컨테이너의 모습입니다.

Java 콘솔 애플리케이션의 경우 main() 메서드가 종료되면 애플리케이션의 실행이 종료됩니다.

하지만 웹에서 동작하는 애플리케이션의 경우 클라이언트가 외부에서 접속해서 사용하는 서비스이기 때문에 main() 메서드가 종료되지 않아야 할 것입니다.

 

그런데 서블릿 컨테이너에는 서블릿 사양(Specification)에 맞게 작성된 서블릿 클래스만 존재하지 별도의 main() 메서드가 존재하지 않습니다.

 

main() 메서드처럼 애플리케이션이 시작되는 지점을 엔트리 포인트(Entry point)라고도 부릅니다.

서블릿 컨테이너의 경우, 클라이언트의 요청이 들어올 때마다 서블릿 컨테이너 내의 컨테이너 로직(service() 메서드)이 직접 실행시켜 주기 때문에 main() 메서드가 필요 없습니다.

이 경우에는 서블릿 컨테이너가 서블릿을 제어하고 있기 때문에 애플리케이션의 주도권은 서블릿 컨테이너에 있습니다.

바로 서블릿과 웹 애플리케이션 간에 Ioc(제어의 역전)의 개념이 적용되어 있는 것입니다.

 

그렇다면 Spring에는 이 IoC의 개념이 어떻게 적용되어 있을까요?

답은 바로 DI(Dependency Injection)입니다.

 

다음 글에서 계속..

 


reference


https://khj93.tistory.com/entry/Spring-Spring-Framework%EB%9E%80-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%ED%95%B5%EC%8B%AC-%EC%A0%95%EB%A6%AC

https://velog.io/@matcha_/Spring-Spring-Framework%EB%9E%80

https://yoo11052.tistory.com/133

https://mangkyu.tistory.com/150

 

 

 

'Spring' 카테고리의 다른 글

[Spring] Spring 환경 구성  (0) 2023.03.31
[Spring] Spring Framework란?(4)  (0) 2023.03.30
[Spring] Spring Framework란?(3)  (0) 2023.03.29
[Spring] Spring Framework란?(2)  (0) 2023.03.29
[Spring] Framework란?  (0) 2023.03.27