Spring 프레임워크는 엔터프라이즈 급 애플리케이션 개발을 위해 광범위하게 사용되는 자바 플랫폼입니다. 여기 Spring의 핵심 3요소, 즉 IoC(Inversion of Control), AOP(Aspect-Oriented Programming), 그리고 PSA(Portable Service Abstraction)에 대해 설명합니다.:
IoC는 객체의 생성과 관리를 애플리케이션 코드에서 분리하여 컨테이너가 처리하도록 하는 디자인 패턴입니다. 이를 통해 코드의 결합도를 낮추고 유연성과 확장성을 향상시킬 수 있습니다.
Bean Factory: Bean 설정 및 라이프 사이클 관리
ApplicationContext: Bean Factory를 확장하여 메시지 소스 처리, 이벤트 전파 등 추가 기능 제공
Spring IoC Container
객체를 생성하고 관리하고 책임지고 의존성을 관리해주는 컨테이너
- IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리함
- POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가짐
- 비즈니스 로직에 집중
- 객체 생성 코드가 없으므로 TDD 용이
Spring Bean
Bean은 IoC 컨테이너가 관리하는 객체
DI, Dependency Injection : 의존성 주입
각 클래스간의 의존관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결
주석 기반 설정: Java 클래스에 주석을 추가하여 bean 구성
POJO
POJO(Plain Old Java Object)란?
주로 특정 자바 모델이나 기능, 프레임워크를 따르지 않는 Java Object를 지칭하며,
대표적으로 Java Bean 객체가 있음
ex) getter / setter
AOP는 관심사의 분리(SoC, Separation of Concerns)를 향상시키기 위한 프로그래밍 패러다임입니다. 이를 통해 횡단 관심사(cross-cutting concerns)를 분리하여 코드의 모듈성을 높일 수 있습니다.
Target Object :
부가 기능을 부여할 대상
Aspect:
횡단 관심사를 정의하는 클래스.
즉, 부가될 기능을 정의한 Advice와 어드바이스를 어디에 적용할지 결정하는 Pointcut을 함께 가짐.
Join point:
프로그램 실행 중에 aspect가 적용되는 지점
Pointcut:
join point를 정의하는 표현식
Advice:
aspect의 코드 조각으로, 실제로 수행되는 작업
@AspectJ 기반 AOP: Java 클래스에 주석을 추가하여 AOP 구성
Spring은 런타임 시점에 프록시 객체를 생성하여 공통 기능 삽입하여 사용한다.
PSA는 로우-레벨의 API를 추상화하여 포터블하게 만드는 것으로, 개발자가 특정 기술이나 메서드에 종속되지 않도록 합니다.
Transaction Management: 추상화를 통한 트랜잭션 관리
Messaging: 다양한 메시징 시스템에 대한 추상화
Data Access: JDBC, ORM 등 데이터 액세스 기술에 대한 추상화
@Transactional: 트랜잭션 관리를 위한 주석
JdbcTemplate: JDBC 작업을 추상화하기 위한 템플릿
MessagingTemplate: 메시징 작업을 추상화하기 위한 템플릿
다른 여러 모듈을 사용함에 있어서 별도의 추상화 레이어 제공 (slf4j)
추상화 계층을 사용해 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공하는 것
Spring Web MVC, Spring Transaction, Spring Cache 등
스프링은 원래 Tomcat 기반으로 돌아가는데, dependency에서 web을 webflux로 바꾸고 다시 실행해보면 Netty 기반으로 돌아간다. 스프링의 PSA 덕분에 코드를 거의 바꾸지 않고도 톰캣이 아닌 완전히 다른 기술로 실행이 가능하다는 의미한다.
Spring의 이러한 3요소는 개발자들이 더 효율적이고 유지 보수가 쉬운 애플리케이션을 개발할 수 있도록 돕습니다. IoC는 객체 관리를 단순화하고, AOP는 코드의 모듈성을 향상시키며, PSA는 서비스 추상화를 통해 포터블한 코드를 작성할 수 있게 합니다.