함께 성장하는 기록장

꾸준한 기록이 모여 도서관이 될 수 있도록

Spring

Spring이란?

H-jinny 2024. 9. 2. 17:58

Spring(스프링)으로 웹 개발은 해봤지만 막상 스프링을 정의하자니 어려움이 있었다. 무언가를 사용하는 것도 좋지만, 사용 원리에 대해서 아는 것도 중요하다. 그래서 이번 시간에 스프링이 무엇인지 정리해보려고 한다.

 

스프링 공식 페이지  (https://spring.io/)

 

 

 

Spring의 정의

스프링이란 무엇일까?

스프링을 보통 다음처럼 정의한다.

자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크

 

정의를 하나씩 뜯어보자면,

 

자바 엔터프라이즈 개발을 편하게 해주는

  > EJB 복잡함을 다른 방식으로 접근하여, 엔터프라이즈 개발에서 필요한 기술적 요구를 충족하면서도 개발을 복잡하지 않게 한다.

 

EJB(Enterprise Java Bean)

Java EE(Enterprise Edition)의 개발을 단순화하기 위해 발표한 스펙. 스프링 이전의 엔터프라이즈 개발을 위한 자바 기술로, 비즈니스 로직에 집중하게 하고자 했지만 기술 복잡도 증가한 문제(기술적인 제약조건과 요구사항의 증가, 비즈니스 로직의 복잡함 증가)가 있었다.

 

오픈소스

  > 아파치 라이선스 2.0을 따르는, 소스가 모두에게 공개되어 자유롭게 사용할 수 있다.(물론 저작권은 있음)

 

경량급

  > 단순한 개발툴과 기본적인 개발환경으로도 엔터프라이즈 개발에 필요한 주요 기능을 구현할 수 있다. 프레임워크와 서버 환경에 의존적인 부분을 제거하여 빠르고 간편하게 작성하게 해준다.

 

애플리케이션 프레임워크 

  > 특정 계층이나 기술에 국한되지 않고 애플리케이션 개발의 전 과정을 아우르는 범용적인 프레임워크이다.

 

이렇게 정의를 설명할 수 있다.

 

 

 

Spring의 특징

위의 스프링의 정의에서 EJB의 기술 복잡도 증가하는 문제가 있다고 했었다. 그와 달리 스프링은 자바의 객체지향 언어로서의 장점을 살려 비즈니스 로직의 복잡함을 해결하려고 했다.

 

그러면 어떤 방식이 되었던 걸까? 스프링의 핵심 특징을 살펴보면 다음과 같다.

 

1. DI(Dependency Injection, 의존성 주입)

  외부에서 객체를 주입받아 사용하는 방식

 

스프링에서는 스프링 컨테이너에 있는 빈을 주입하는 방식으로 객체를 관리한다. IoC와 함께 스프링의 기반이 된다.

스프링은 자바의 기본으로 돌아가 객체지향 설계가 가능하도록 했다. 이것이 잘 적용될 수 있는 구조를 위해, 유연하게 확장할 수 있는 오브젝트를 설계하다 보면 자연스럽게 적용되는 프로그래밍 기법이다.

 

 

2. IoC(Inversioin of Control, 제어의 역전)

  객체의 생성과 관리를 개발자 대신 프레임워크가 하는 방식

 

자바를 통해 객체가 필요한 경우 다음처럼 클래스에서 직접 new 키워드를 통해 객체를 생성했었다.

pulic class A {
	b = new B();
 }

 

 

하지만 스프링은 다음처럼 생성하지 않고 외부에서 받아온 객체를 b에 할당한다.

public class A {
	private B b;
}

 

 

이런 방식으로 스프링 컨테이너가 객체를 관리, 제공한다. 즉, 제어권이 개발자가 아닌 스프링에 있어 제어의 역전이라 부른다.

 

빈과 스프링 컨테이너

빈(Bean)은 스프링 컨테이너가 생성하고 관리하는 객체로, XML 파일이나 애너테이션을 통해 등록한다. 이렇게 등록된 빈의 생성되고 소멸되기까지의 생명주기를 스프링 컨테이너에서 관리한다.

 

 

3. AOP(Aspect Object Programming, 관점 지향 프로그래밍)

  프로그래밍을 핵심 관점과 부가 관점으로 나누어 관심 기준으로 모듈화하는 방식

 

예를 들어 계좌 이체와 고객 관리에서 공통으로 쓰이는 로깅, 트랜잭션 같은 중복되는 코드를 분리하는 것이다.

즉, 공통으로 적용할 수 있는 기능을 구분하여 변경과 확장, 재사용성에 용이해진다.

 

 

4. PSA(Portable Service Abstraction, 이식 가능한 서비스 추상화)

  어느 기술이든 일관된 방식으로 처리하는 것

 

스프링에서 제공하는 다양한 기술들을 추상화하여 개발자가 쉽게 사용하는 인터페이스를 의미한다. 클라이언트의 매핑과 클래스, 메서드의 매핑을 위한 애너테이션이 있다.

예를 들어 데이터베이스에 접근하기 위한 JPA, MyBatis, JDBC 같은 기술 중 어떤 기술을 사용하더라도 일관된 방식으로 데이터베이스에 접근하도록 인터페이스를 지원한다. WAS를 톰캣이 아닌 언더토우, 네티와 같은 다른 곳에서 실행해도 기존 코드를 사용하는 경우도 있다.

 

 

그래서 스프링 프레임워크는 IoC/DI를 통해 객체 간의 의존 관계를 설정하고, AOP를 통해 핵심 관점과 부가 로직을 분리해 개발하며, PSA를 통해 추상화된 다양한 서비스들을 일관된 방식으로 사용하게 된다.

그리고 이들은 애플리케이션을 POJO로 개발할 수 있게 해주는 기능 기술(enabling technology)이다.

 

 

 

POJO(Plain Old Java Object)

스프링의 특징과 목표는 분리됐지만 반드시 필요한 엔터프라이즈 서비스 기술을 POJO 방식으로 개발된 애플리케이션 핵심 로직을 담은 코드에 제공한다는 것이다.

스프링의 핵심 개념

 

POJO란?

스프링의 가볍다는 특징처럼, 간단한 오브젝트를 사용한다는 의미이다. 즉 이름 그대로 단순한 자바 오브젝트(Plain Old Java Object)를 의미한다. 이게 무슨 말인고 했지만, POJO라고 불릴 수 있는 데에 조건이 필요하다.

 

1. 특정 규약(Contract)에 종속되지 않는다.

 

2. 특정 환경에 종속되지 않는다.

 

즉 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트가 POJO이다. 이러한 POJO에 애플리케이션의 핵심 로직과 기능을 담아 설계하고 개발하는 방법이 POJO 프로그래밍이다.

스프링 애플리케이션은 POJO를 이용해서 만든 애플리케이션 코드와, POJO가 어떻게 관계를 맺고 동작하는지 정의해놓은 설계정보로 구분된다. 스프링의 특징인 DI는 유연하게 확장 가능한 오브젝트를 만들어두고 그 관계를 외부에서 다이나믹하게 설정하도록 한다. 이런 DI의 개념을 애플리케이션 전반에 적용하는 것이 스프링 프로그래밍 모델이다.

 

 

 

스프링은 엔터프라이즈 기술보다는 객체지향적인 설계와 개발의 원리에 좀 더 집중할 수 있도록 한다. 하지만 어떻게 효과적으로 사용할지, 그리고 자바 언어와 JVM 플랫폼, JDK API 사용을 어떻게 할 것인지 등은 개발자의 몫이다.

정리하다보니 나는 스프링을 잘 쓰고 있나 싶은 생각이들었다. 다시 기본을 생각하는 

 

 

 

좀 더 역사적이고 재미있는 포스팅에서 많이 참고했다. 철학적 접근의 좋은 글이라 종종 다시 읽어보고자 한다.

 

[스프링] 스프링이란 무엇인가?

스프링은 기본적으로 IoC와 DI를 위한 컨테이너로서 동작하지만 그렇다고 "스프링은 단지 IoC/DI 프레임워크다"라고는 말할 수 없습니다. 스프링은 단순히 IoC/DI를 편하게 적용하도록 돕는 단계를

12bme.tistory.com

 

 

 

참고

스프링 부트 3 시작할 때 알아야 하는 것 - 습엔드 - 골든래빗 (goldenrabbit.co.kr)

 

 

 

 

오타, 지적 감사합니다 :)

'Spring' 카테고리의 다른 글

Spring MVC 구조와 레이어드 아키텍처  (0) 2024.07.09
Spring Security 알아보기 - 개념, 과정  (0) 2024.07.04
Maven vs Gradle  (0) 2024.07.04