본문 바로가기
99. 기타

스프링(Spring) 공부

by 김덕환 2016. 12. 15.
반응형

1. 스프링이란?


스프링(Spring)은 워낙 방대한 기능을 제공하고 있어서 스프링이 뭐라고 딱 꼬집어 정의 하기는 힘들다. 흔히 스프링이라고 하면 스프링 프레임워크를 말하는데, 스프링 프레임워크의 주요 특징으로는 다음과 같은 것들이 있다. 


- 의존 주입(Dependency Injection : ID) 지원

- AOP(Aspect-Oriented Programming) 지원

- MVC 웹 프레임워크 제공

- JDBC, JPA 연동 기술 및 선언적 트랜잭션 처리 등 DB 연동 지원


이 외에도 스케줄링, 메시지 연동(JMS), 이메일 발송, 테스트 지원 등 자바 기반의 어플리케이션을 개발하는데 필요한 다양한 기능을 제공하고 있다. 


실제로 스프링 프레임워크를 이용해서 웹 어플리케이션을 개발할 때에는 스프링 프레임워크만 단독으로 사용하기보다는 여러 스프링 관련 프로젝트와 함께 사용하는 경우가 많다. 현재 스프링을 주도적으로 개발하고 있는 피보탈(Pivotal))은 스프링 프레임워크뿐만 아니라 어플리케이션 개발에 필요한 다양한 프로젝트를 진행하고 있다. 이들 프로젝트 중 자주 사용되는 것은 다음과 같다. 


- 스프링 데이터 : 적응 양의 코드로 데이터 연동을 처리할 수 있도록 도와주는 프레임워크이다. JPA, 몽고DB, 레디스 등 다양한 저장소 기술을 지원한다. 

- 스프링 시큐리티 : 인증/인가와 관련된 프레임워크로서 웹 접근 제어, 객체 접근 제어, DB/오픈ID/JDAP 등 다양한 인증 방식, 암호화 기능을 제공한다. 

- 스프링 배치 : 로깅/추적,, 작업통계, 실페 처리 등 배치 처리에 필요한 기본 기능과 웹 기반 관리 화면을 제공한다. 


이 외에도 스프링 인테그레이션, 스프링 하둡, 스프링 소셜 등 다양한 프로젝트가 존재한다.



2. AOP


AOP는 Aspect Oriented Programming의 약자로, 여러 객체에 공통으로 적용할 수 있는 기능을 구분함으로써 재사용성을 높여주는 프로그래밍 기법이다. AOP는 핵심 기능과 공통 기능의 구현을 분리함으로써 핵심 기능을 구현한 코드의 수정 없이 공통 기능을 적용할 수 있게 만들어 준다. 


AOP의 기본 개념은 핵심 기능에 공통 기능을 삽입하는 것이다. 즉, 핵심 기능의 코드를 수정하지 않으면서 공통 기능의 구현을 추가하는 것이 AOP이다. 핵심 기능에 공통 기능을 삽입하기 위한 방법에는 크게 다음의 세 가지가 있다. 


- 컴파일 시점에 코드에 공통 기능을 추가하는 방법

- 클래스 로딩 시점에 바이트 코드에 공통 기능을 추가하는 방법

- 런타임에 프록시 객체를 생성해서 공통 기능을 추가하는 방법


첫 번째 방법은 AOP 개발 도구가 소스 코드를 컴파일하기 전에 공통 구현 코드를 삽입하는 방식으로 동작하며, 두 번째 방법은 클래스를 로딩할 때 바이트 코드에 공통 기능을 클래스에 삽입하는 방식으로 동작한다. 이 두가지는 스프링 AOP에서는 지원하지 않으며, Aspect와 같이 AOP를 위한 전용 도구를 사용해서 적용할 수 있다. 


스프링이 제공하는 AOP 방식은 프록시를 이용하는 세 번째 방식이다. 스프링이 두 번째 방식을 일부 지원하고 있지만, 널리 사용되는 방법은 프록시를 이용하는 세 번째 방식이다. 프록시를 이용하는 방식은 중간에 프록시 객체를 생성한다. 그리고 실제 객체 기능을 실행하기 전/후에 공통 기능을 호출한다. 


스프링 AOP는 프록시 객체를 자동으로 만들어 준다. 따라서 상위 타입의 인터페이스를 상속받은 프록시 클래스를 직접 구현할 필요가 없다. 단지 공통 기능을 구현한 클래스만 알맞게 구현하면 된다. AOP에서 사용하는 용어들은 다음과 같다.


- Joinpoint : Advice를 적용 가능한 지점을 의미한다. 메서드 호출, 필드 값 변경 등이 Jointpoint에 해당한다. 스프링은 프록시를 이용해서 AOP를 구현하기 때문에 메서드 호출에 대한 Jointpoint만 지원한다. 

- Pointcut : Joinpoint의 부분 집합으로 실제로 Advice가 적용되는 Joinpoint를 나타낸다. 스프링에서는 정규 표현식이나 AspectJ의 문법을 이용하여 Pointcut을 정의할 수 있다. 

- Advice : 언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의하고 있다. 예를 들어, '메서드를 호출하기 전'(언제)에 '트랜잭션 시작'(공통 기능) 기능을 적용한다는 것을 정의하고 있다. 

- Weaving : Advice를 핵심 로직 코드에 적용하는 것을 weaving이라고 한다. 

- Aspect : 여러 객체에 공통으로 적용되는 기능을 Aspect라고 한다. 트랜잭션이나 보안 등이 Aspect의 좋은 예이다. 


스프링은 프록시를 이용해서 메서드 호출 시점에 Aspect를 적용하기 떄문에 구현 가능한 Advice의 종류는 다음과 같다. 


- Before Advice : 대상 객체의 메서드 호출 전에 공통 기능을 실행한다. 

- After Returing Advice : 대상 객체의 메서드가 입셉션 없이 실행된 이후에 공통 기능을 실행한다. 

- Agter Throwing Advice : 대상 객체의 메서드를 실행하는 도중 익셉션이 발생한 경우에 공통 기능을 실행한다. 

- After Advice : 대상 객체의 메서드를 실행하는 도중에 익셉션이 발생했는지의 여부에 상관없이 메서드 실행 후 공통 기능을 실행한다. (try-catch-finally의 finally 블록과 비슷하다.)

- Around Advice : 대상 객체의 메서드 실행 전, 후 또는 익셉션 발생 시점에 공통 기능을 실행하는데 사용된다. 


이들 AOP 중에서 널리 사용되는 것음 Around Advice인데, 그 이유는 대상 객체의 메서드를 실행하기 전/후, 익셉션 발생 시점 등 다양한 시점에 원하는 기능을 삽입할 수 있기 때문이다. 이런 이유로 캐시 기능, 성능 모니터링 기능과 같은 Aspect를 구현할 때에는 Around Advice를 주로 이용하게 된다. 

반응형