자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크
동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공한다.
JAVA의 웹 프레임워크로 JAVA 언어를 기반으로 사용한다.
JAVA로 다양한 어플리케이션을 만들기 위한 프로그래밍 틀이라 할 수 있다.
JAVA의 활용도가 높아지면서, JAVA를 이용한 기술이 JSP, Mybatis, JPA 등의 기술이 생겨났다.
Spring은 다른 사람의 코드를 참조하기 쉽고 편리한 구조로, 앞서 말한 기술들을 더 쉽게 사용해주는 오픈소스 프레임워크이다.
스프링은 POJO를 기반으로 AOP, PSA, IoC/DI 특징을 가진다
하나의 뼈대 역할을 하는 클래스들의 모음.
프레임워크는 어떠한 목적을 달성하기 위해, 복잡하게 얽혀 있는 문제를 쉽게 해결하기 위한
약속이자 도구이며, 소프트웨어 개발에 하나의 뼈대 역할을 한다.
프레임워크는 자주 쓰일 만한 기능들을 한데 모아 놓은 유틸(클래스)들의 모음이다.
의자를 만든다고 가정할 때 의자를 만드는 망치 나 못 같은 개념이다.
DI(Dependency Injection)란 스프링이 다른 프레임워크와 차별화되어 제공하는 의존 관계 주입 기능으로,
객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입시켜주는 방식
DI(의존성 주입)를 통해서 모듈 간의 결합도가 낮아지고 유연성이 높아진다.
1) 첫번째 방법은 A객체가 B와 C객체를 New 생성자를 통해서 직접 생성하는 방법이고,
2) 두번째 방법은 외부에서 생성된 객체를 setter()를 통해 사용하는 방법이다.
이러한 두번째 방식이 의존성 주입의 예시인데,
A 객체에서 B, C객체를 사용(의존)할 때 A 객체에서 직접 생성하는 것이 아니라 외부(IOC컨테이너)에서 생성된 B, C객체를 조립(주입)시켜 setter 혹은 생성자를 통해 사용하는 방식이다.
IoC(Inversion of Control)란 "제어의 역전" 이라는 의미로,
말 그대로 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다.
간단히 말해 "제어의 흐름을 바꾼다"라는 의미
기존에는 다음과 순서로 객체가 만들어지고 실행되었다.
1)객체 생성
2)의존성 객체 생성 & 클래스 내부에서 생성
3)의존성 객체 메소드 호출
하지만, 스프링에서는 다음과 같은 순서로 객체가 만들어지고 실행된다.
1) 객체 생성
2) 의존성 객체 주입
스스로가 만드는 것이 아니라 제어권을 스프링에게 위임하여 스프링이 만들어 놓은 객체를 주입한다.
3) 의존성 객체 메소드 호출
스프링이 모든 의존성 객체를 스프링이 실행될 때 다 만들어주고 필요한곳에 주입시켜 줌으로써
Bean들은 싱글턴 패턴의 특징을 가지며, 제어의 흐름을 사용자가 컨트롤 하는 것이 아니라 스프링에게 맡겨 작업을 처리하게 된다.
Spring의 핵심 개념 중 하나인 DI가 애플리케이션 모듈들 간의 결합도를 낮춘다면,
AOP(Aspect-Oriented Programming)는 핵심 로직과 부가 기능을 분리하여 애플리케이션 전체에 걸쳐 사용되는 부가 기능을 모듈화하여 재사용할 수 있도록 지원하는 것
Aspect-Oriented Programming이란 단어를 번역하면 관점(관심) 지향 프로그래밍이 된다.
(프로젝트 구조를 바라보는 관점을 바꿔보자는 의미임)
AOP : 인프라 혹은 부가기능의 모듈화
대표적인 예 : 모니터링 및 로깅, 동기화, 오류 검사 및 처리, 성능 최적화(캐싱) 등
각각의 모듈들의 주 목적 외에 필요한 부가적인 기능들
간단하게 한 줄로 AOP를 정리해보자면, AOP는 공통된 기능을 재사용하는 기법입니다.
OOP에선 공통된 기능을 재사용하는 방법으로 상속이나 위임을 사용합니다.
하지만 전체 애플리케이션에서 여기저기 사용되는 부가기능들은 상속이나 위임으로 처리하기에는 깔끔한 모듈화가 어렵습니다.
그래서 등장한 것이 AOP입니다.
PSA (Portable Service Abstraction)
우리는 Spring의 AOP가 Proxy 패턴을 발전시켜 만들어졌다는 것을 이전 포스팅들을 통해서 알게되었다. 그리고 FactoryBean을 통해 Proxy가 Bean이 생성될때 자동으로 생성 되는 것 또한 알게 되었다.
여기에 우리가 간과하고 있던 사실이 있다. @Transactional 어노테이션을 선언하는 것 만으로 별도의 코드 추가 없이 트랜잭션 서비스를 사용할 수 있다는 사실이다.
그리고 내부적으로 트랜잭션 코드가 추상화되어 숨겨져 있는 것이다.
이렇게 추상화 계층을 사용하여 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는 것이 서비스 추상화(Service Abstraction)입니다.
그리고 아시다시피 DB에 접근하는 방법은 여러가지가 있습니다. 기본적으로 Jdbc를 통해 접근(DatasourceTransactionManager)할 수 있으며 ORM을 이용하고자 한다면 JPA(JpaTransactionManager)를 통해서 접근할 수도 있습니다. 신기하게도 어떠한 경우라도 @Transactional 어노테이션을 이용하면 트랜잭션을 유지하는 기능을 추가할 수 있습니다.
이렇게 하나의 추상화로 여러 서비스를 묶어둔 것을 Spring에서 Portable Service Abstraction이라고 합니다.