Srping

Spring

  • 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플케이션 프레임워크
  • IoC/DI, AOP와 PSA(Portable Service Abstraction)
  • 비침투적인 기술은 기술의 적용 사실이 코드에 직접 반영되지 않는다는 특징
  • 스프링을 이용하면 기술적인 복잡함과 비즈니스 로직을 다루는 코드를 깔끔하게 분리

IoC

  • 제어 흐름의 개념을 꺼꾸로 뒤집는 것
  • 제어의 역전에서는 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지 않음, 생성하지도 않음
  • 자신도 어떻게 만들어서지고 어디서 사용되는지 알 수 없음
  • 모든 제어 권한을 자신이 아닌 다른 대상에게 위임하기 때문

DI

  • 오브젝트 레퍼런스를 외부로부터 제공받고 이를 통해서 여타 오프젝트와 다이내믹하게 의존관계가 만들어지는 것이 핵심

POJO

  • Plain Old Java Object
  • 마틴 파울러가 2000년에 컨퍼런스 발표를 준비하다가 만든 용어
  • EJB처럼 복잡하고 제한이 많은 기술을 사용하는 것보다는 자바의 단순한 오브젝트를 이용해서 애플리케이션의 비즈니스 로직을 구현하는 편이 낫다고 생각
  • 자바의 단순한 오브젝트를 사용하길 꺼리던 이유가 EJB와 같은 그럴싸한 이름이 없기 때문 그래서 POJO라는 이름을 부여
  • POJO 조건
    • 특정 규약에 종송되지 않는다.
    • 특정 환경에 종속되지 않는다.

포터블 서비스 추상화 (PAS)

  • 환경과 세부 기술의 변화에 관계없이 일관된 방식으로 기술에 접근 할 수 있게 해주는 PSA

Dispatcher Servlet

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
      • 어드바이스가 어드바이스 대상 메서드를 감싸서 어드바이스 대상 메서드 호출 전과 후에 몇 가지 기능을 제공
  • 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 공급자는 중첩 된 트랜잭션도 지원할 수 있습니다.