[AOP, IoC/DI, PSA](Spring Triangle) 기술을 바탕으로 POJO(Plain Old Java Object)를 지향하는 경량의 오픈소스 프레임워크
제어의 역전, 객체의 생성부터 생명주기 관리까지 모두 컨테이너가 하게 되므로 제어권이 컨테이너로 넘어는것이 제어권의 흐름이 바뀌었다고 하여서 IoC라고 함
객체를 직접 생성하는 것이 아닌 외부에서 생성 후 주입하는 방식
1.객체 내부에서 다른 객체를 생성하는 것은 결합이 강하다
A 객체에서 B 객체를 직접 생성하면 후에 B 대신 C 객체로 교체 시 A 객체도 같이 교체해야 함
public class A{ private B b; public A(){ b = new B(); } }
2.외부에서 생성하고 주입하면 결합이 느슨하다
public class A{
@Autowired
private B b;
}
public class A{
private B b;
@Autowired
public void SetB(B b){
this.b = b;
}
}
@Required
를 이용하여 의존성이 필요한 Setter를 만들 수 있다.public class A{
private final B b; // final 선언 가능
@Autowired // Spring 4.3 이상 버전부터 생성자가 하나일 경우 생략 가능
public A(B b){
this.b = b;
}
}
Spring IoC 컨테이너가 관리하는 자바 객체들을 빈(Bean)이라고 함
ApplicationContext.getBean()
으로 얻을 수 있는 객체는 빈임
- Component Scanning
- 직접 등록(XML 또는 자바 설정 파일)
@Autowired
또는@Inject
- ApplicationContext에서
getBean()
으로 직접 사용
Bean 등록방법
@Component Annotation을 사용하여 Bean에 등록
@Repository
@Service
@Controller
@Configuration
XML과 자바 설정 파일이 있지만 주로 자바 설정 파일로 작성
@Configuration public class SampleConfiguration{ @Bean public SampleController sampleController(){ return new SampleController; } }
@Configuration
붙인다.@Bean
을 사용해서 직접 빈을 정의함SampleController()
에서 리턴되는 객체가 IoC 컨테이너 안에 빈으로 등록됨@Component
를 안붙여도 됨@Configuration
Annotation도 @Component
를 사용하기 때문에 @ComponentScan
의 대상이 되고 빈 설정파일을 읽을 때 정의한 빈들이 IoC 컨테이너에 등록됨XML 설정하는 경우
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<bean id="dog" class="com.study.Dog">
<property name="petName" value="retriver"></property>
</bean>
<bean id="cat" class="com.study.Cat">
<property name="petName" value="munchkin"></property>
</bean>
<bean id="petOwner" class="com.study.PetOwner" scope="singleton">
<constructor-arg name="animal" ref="dog"></constructor-arg>
</bean>
</beans>
1. 싱글톤(Singleton)
싱글톤(Singleton)
으로 생성Single Beans Cache
에 저장되어 요청과 참조가 있으면 캐시에 저장된 객체를 반환HTTP request
생명 주기 내에서 하나의 객체만 존재HTTP request
는 각각의 객체를 가진다.ApplicationContext
안에서만 유효함HTTP session
생명 주기 내에서 하나의 객체만 존재ApplicationContext
안에서만 유효함Global HTTP session
생명 주기 내에서 하나의 객체만 존재portlet context
에서 사용되는 경우만 유효함ApplicationContext
안에서만 유효함ServletContext
생명 주기 내에서 하나의 객체만 존재ApplicationContext
안에서만 유효함WebSocket
생명 주기 내에서 하나의 객체만 존재ApplicationContext
안에서만 유효함Bean 사용방법
@Autowired
Annotation으로 빈을 사용
@Autowired // 생성자 사용
public OwnerController(OwnerRepository clinicService){
this.owners = clinicService;
}
ApplicationContext에서 getBean() 직접 사용
public class SampleControllerTest{
@Autowired
ApplicationContext applicationContext;
@Test
public void testDI(){
SampleController bean = applicationContext.getBean(SampleController.class);
// bean.~~~; 사용
}
}
관점 지향 프로그래밍, 여러 객체에 공통으로 적용할 수 있는 기능(=부가 기능)을 구분하여 분리해서 재사용성을 높이는 프로그래밍 기법
- JoinPoint:
Advice
가 적용될 위치, 타겟 객체가 구현한 인터페이스의 모든 메소드는 JoinPoint가 될 수 있다.- PointCut:
Advice
를 적용할 타겟의 메소드를 선별하는 정규표현식, JoinPoint의 상세한 스펙 정의, 표현식은execution
으로 시작하고 메소드의Signature
를 비교하는 방법 이용- Advice: AOP에서 실제 실행 되는 코드, 타겟에 제공할 실질적 부가기능을 담고 있는 모듈
- Target: 핵심 기능을 담고 있는 모듈, 타겟은 부가기능을 부여할 대상(클래스 또는 메소드 등)
- Aspect: AOP의 기본 모듈,
Aspect = Advice+PointCut
, 싱글톤 형태의 객체로 존재- Advisor: Spring AOP에서만 사용되는 용어,
Advisor = Advice+PointCut
- Weaving:
PointCut
에 의해 결정된Target
의JoinPoint
에 부가기능을 삽입하는 과정, AOP가 핵심 기능에 영향을 주지 않으면서 필요한 부가기능을 추가할 수 있도록 해주는 핵심적인 처리과정
Target
객체에 대한 프록시를 만들어 제공Target
을 감싸는 프록시는 Runtime시 생성됨Advice
를 Target
객체에 적용하면서 생성되는 객체Target
객체에 대한 호출을 가로챈 다음 Advice
의 부가기능 로직을 수행하고 난 후에 Target
의 핵심 기능 로직을 호출함(Before Advice)Target
의 핵심 기능 로직을 호출한 후에 부가 기능을 호출할 수도 있음(After Advice)JoinPoint
만 지원함Target
)의 메소드가 호출되는 Runtime 시점에서만 부가 기능(Advice
)을 적용할 수 있다.
- Before Advice: 대상 객체의 메소드 호출 전에 공통 기능을 실행
- After Returining Advice: 대상 객체의 메소드가 Exception 없이 실행된 이후에 공통 기능을 실행
- After Throwing Advice: 대상 객체의 메소드를 실행하는 도중 Exception이 발생한 경우에 공통 기능을 실행
- After Advice: 대상 객체의 메소드를 실행하는 도중에 Exception 발생 여부와 상관없이 메소드 실행 후 공통 기능을 실행
- Around Advice: 대상 객체의 메소드 실행 전, 후 또는 Exception 발생 시점에 공통 기능 실행 (주로 사용)
추상화 계층을 사용하여 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해 주는 것을 서비스 추상화(Service Abstraction)라고 함. 서비스 추상화로 제공되는 기술을 다른 기술 스택으로 간편하게 바꿀 수 있는 확장성을 가지고 있는 것이 PSA(Portable Service Abstraction)
일반 클래스에 @Controller
를 사용하면 request를 mapping 할 수 있는 컨트롤러 역할을 수행하는 클래스가 됨. 해당 클래스에서 @GetMapping
, @PostMapping
Annotation을 사용하여 mapping할 수 있다.
doGet()
, doPost()
를 구현하는 작업을 하지 않고) Spring MVC를 이용하여 간편하게 개발할 수 있다.@Controller
, @RequestMapping
Annotation과 뒷단의 여러가지 복잡한 인터페이스들을 기반으로하여 기존 코드를 거의 변경하지 않고 웹 기술 스택을 간편하게 바꿀 수 있게 함low level로 Transaction 처리를 하려면 setAutoCommit()
과 commit()
, rollback()
을 명시적으로 호출해야 한다. 그러나 Spring이 제공하는 @Transaction
Annotation을 사용하면 단순히 메소드에 Annotation을 붙여줌으로써 트랜잭션 처리가 이루어진다.
Cache도 마찬가지로 JCacheManager, ConcurrentMapCacheManager, EhCacheCacheManager와 같은 여러가지 구현체를 사용할 수 있다.
@Cacheable
Annotation을 붙여줌으로써 구현체를 크게 신경쓰지 않아도 필요에 따라 바꿔 쓸 수 있다.Spring은 이렇게 특정 기술에 직접적 영향을 받지 않게끔 객체를 POJO 기반으로 한번씩 더 추상화한 Layer를 갖고 있으며 이를 통해 일관성있는 서비스 추상화를 만들어낸다.
- POJO(Plain Old Java Object): 오래된 방식의 간단한 자바 오브젝트
- 특정 기술에 종속되어 동작하는 것이 아닌 순수한 자바 객체
- 객체지향적인 원리에 충실하면서 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트
- Java EE 등 중량 프레임워크들에 사용되는 프레임워크에 종속된 무거운 객체에 반발해서 사용하게된 용어