Spring
- 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플케이션 프레임워크
- IoC/DI, AOP와 PSA(Portable Service Abstraction)
- 비침투적인 기술은 기술의 적용 사실이 코드에 직접 반영되지 않는다는 특징
- 스프링을 이용하면 기술적인 복잡함과 비즈니스 로직을 다루는 코드를 깔끔하게 분리
IoC
- 제어 흐름의 개념을 꺼꾸로 뒤집는 것
- 제어의 역전에서는 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지 않음, 생성하지도 않음
- 자신도 어떻게 만들어서지고 어디서 사용되는지 알 수 없음
- 모든 제어 권한을 자신이 아닌 다른 대상에게 위임하기 때문
DI
- 오브젝트 레퍼런스를 외부로부터 제공받고 이를 통해서 여타 오프젝트와 다이내믹하게 의존관계가 만들어지는 것이 핵심
POJO
- Plain Old Java Object
- 마틴 파울러가 2000년에 컨퍼런스 발표를 준비하다가 만든 용어
- EJB처럼 복잡하고 제한이 많은 기술을 사용하는 것보다는 자바의 단순한 오브젝트를 이용해서 애플리케이션의 비즈니스 로직을 구현하는 편이 낫다고 생각
- 자바의 단순한 오브젝트를 사용하길 꺼리던 이유가 EJB와 같은 그럴싸한 이름이 없기 때문 그래서 POJO라는 이름을 부여
- POJO 조건
- 특정 규약에 종송되지 않는다.
- 특정 환경에 종속되지 않는다.
포터블 서비스 추상화 (PAS)
- 환경과 세부 기술의 변화에 관계없이 일관된 방식으로 기술에 접근 할 수 있게 해주는 PSA
Dispatcher Servlet

AOP
- Aspect
- 어드바이스와 포인트컷을 합친 것
- 두 가지 정보가 합쳐지면 애스펙트가 무엇을 언제 어떻게 할지, 즉 애스펙트에 필요한 모든 정보가 정의
- @Aspect 어노테이션으로 어노테이션이있는 경우 클래스 선언은 Spring에서 aspect로 인식
- Weaving
- 타깃 객체에 애스펙트를 적용해서 새로운 프록시 객체를 생성하는 절차
- 컴파일시간
- 클래스로드시간
- 실행시간
- 타깃 객체에 애스펙트를 적용해서 새로운 프록시 객체를 생성하는 절차
- Join point
- 어드바이스를 적용할 수 있는 곳을 조인포인트
- 애플리케이션 실행에 애스펙트를 끼워 넣을 수 있는 지점
- Target object
- Advice
- Before advice
- 어드바이스 대상 메서드가 호출되기 전에 어드바이스 기능을 수행
- After retunning advice
- 어드바이스 대상 메서드가 성공적으로 완료된 후에 어드바이스 기능을 수행
- After throwing advice
- 어드바이스 대상 메서드가 예외를 던진 후에 어드바이스 기능을 수행
- After (finally) advice
- 결과에 상관없이 어드바이스 대상 메서드가 완료된 후에 어드바이스 기능을 수행
- Around advice
- 어드바이스가 어드바이스 대상 메서드를 감싸서 어드바이스 대상 메서드 호출 전과 후에 몇 가지 기능을 제공
- Before advice
- Pointcut
- 애스펙트가 어드바이스할 조인포인트의 영역을 좁히는 일을 함
- 어드바이스는 애스펙트가 무엇을 언제 할지를 정의한다면, 포인트컷은 어디서 할지를 정의
- 각 포인트컷은 어드바이스가 위빙돼야 하는 하나 이상의 조인포인트를 정의
- Introduction
- 기존 클래스에 코드 변경 없이도 새 메소드나 멤버 변수를 추가하는 기능
AOP proxy
- JDK 동적 Proxy
- 기본적인 Proxy
- 인터페이스가 필요 함
- CGLIB Proxy
- 서브 클래싱을 통해 Proxy 생성
- 인터페이스가 필요 없음
Bean Scope
- Singleton
- 각 Spring IoC 컨테이너에 대한 단일 객체 인스턴스에 단일 Bean 정의 범위를 지정
- Prototype
- 임의의 수의 오브젝트 인스턴스로 단일 Bean 정의 범위를 지정
- Request
- 단일 빈 정의의 범위를 단일 HTTP 요청의 수명 주기로 지정
- 각 HTTP 요청에는 단일 빈 정의 뒤에서 생성 된 빈 인스턴스
- 웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효
- Session
- 단일 Bean 정의의 범위를 HTTP 세션의 라이프 사이클로 지정
- 웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효
- Application
- 단일 빈 정의의 범위를 ServletContext의 수명 주기로 지정
- 웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효합니다.
- Websocket
- WebSocket의 라이프 사이클에 대한 단일 Bean 정의 범위를 지정
- 웹 인식 Spring ApplicationContext의 컨텍스트에서만 유효
Transaction Propagation
- Required
- 현재 트랜잭션을 지원하고 존재하지 않는 경우 새 트랜잭션을 만듬
- 동일한 이름의 EJB 트랜잭션 속성과 유사
- 트랜잭션 주석의 기본 설정
- Supports
- 현재 트랜잭션을 지원하고, 존재하지 않으면 비 트랜잭션으로 실행
- 동일한 이름의 EJB 트랜잭션 속성과 유사
- 트랜잭션 동기화를 사용하는 트랜잭션 관리자의 경우 SUPPORTS는 동기화가 적용될 트랜잭션 범위를 정의하므로 트랜잭션이없는 것과 약간 다름
- 결과적으로 동일한 리소스 (JDBC 연결, Hibernate 세션 등)가 지정된 전체 범위에 대해 공유, 이는 트랜잭션 관리자의 실제 동기화 구성에 따라 다름
- Mandatory
- 현재 트랜잭션을 지원하고, 존재하지 않으면 예외를 발생
- 동일한 이름의 EJB 트랜잭션 속성과 유사
- RequiredNew
- 새 트랜잭션을 만들고 현재 트랜잭션이 있으면 일시 중단
- 동일한 이름의 EJB 트랜잭션 속성과 유사
- 실제 거래 일시 중단은 모든 거래 관리자에게 즉시 적용되지는 않음
- 특히 JtaTransactionManager에 적용되며, javax.transaction.TransactionManager를 사용할 수 있어야함 (표준 Java EE에서 서버에 따라 다름)
- Not Supported
- 비 트랜잭션 방식으로 실행하고 현재 트랜잭션이있는 경우 일시 중단
- 동일한 이름의 EJB 트랜잭션 속성과 유사
- 실제 거래 일시 중단은 모든 거래 관리자에게 즉시 적용되지는 않음
- JtaTransactionManager에 적용되며, javax.transaction.TransactionManager를 사용할 수 있어야함 (표준 Java EE에서 서버에 따라 다름)
- Never
- 비 트랜잭션 방식으로 실행하고 트랜잭션이있는 경우 예외를 발생
- 동일한 이름의 EJB 트랜잭션 속성과 유사합니다.
- Nested
- 현재 트랜잭션이 있으면 중첩 트랜잭션 내에서 실행하고 그렇지 않으면 REQUIRED처럼 동작.
- EJB에는 유사한 기능이 없음
- 중첩 된 트랜잭션의 실제 생성은 특정 트랜잭션 관리자에서만 작동
- 기본적으로 이것은 JDBC DataSourceTransactionManager에만 적용
- 일부 JTA 공급자는 중첩 된 트랜잭션도 지원할 수 있습니다.