3-1 스프링 프레임 워크의 핵심기능

스프링 프레임워크는 애플리케이션 전체에 이 두 가지 기능을 제공함으로써 생산성/유지보수성이 높은 애플리케이션구축을 가능하게 합니다. 이번 장에서는 핵심이 되는 두가지 기능의 개요를 설명합니다.

3-1-1 의존성 주입

의존성 주입은 '의존하는 부분을 외부에서 주입하는것을 말합니다.

 

3-1-2 관점 지향 프로그래밍

AOP에서는 프로그램이 다음 두 가지 요소로 구성된다.

  • 중심적 관심사 : 실현해야 할 기능을 나타내는 프로그램
  • 횡단적 관심사 : 품질이나 유지보수등의 관점에서 반드시 필요한 기능을 나타내는 프로그램(예외처리, 로그정보화면,데이터베이스의 트랙잭션 제어)

 

3-2 DI 컨테이너 알아보기

의존성의 실현을 돕는 프레임워크입니다. 

3-2-1 의존성

A 클래스에서 B클래스를 사용하려면 new 키워드를 이용해 B클래스의 인스턴스를 생성하고 B클래스의 메서드를 사용하게 됩니다. 이때 B 클래스에서 구현했던 메서드를 변경하면 그 영향으로 A 클래스에서도 해당 메서드를 변경해야합니다. 이런 관계를 'A클래스는 B클래스에 의존한다'라고 합니다.

  • 클래스 의존(구현 의존)
  • 인터페이스 의존

3-2-2 클래스 의존

  • A클래스에서 new키워드를 사용하여 B클래스의 인스턴스를 생성합니다.
  • 인스턴스에서 methodX 메서드를 호출합니다.

A 클래스

// A 클래스
xxx() {
B b = new B(); // 인스턴스 생성(참초취득)
b.methodX();   // 메서도 호출(이용)
}

B클래스

// B클래스
methodX() {
...
}

 

설계가 변경돼서 '사용되는 객체'를 새롭게 생성된 C 클래스로 변경하고 methodY 메서드를 호출하도록 변경해야 합니다.

C클래스

// C 클래스
methodY() {
...
}

변경된 A클래스

// 변경된 A클래스
xxx() {
C c = new c(); // 인스턴스 생성(참초취득)
c.methodY();   // 메서도 호출(이용)
}

 

이처럼 '사용하는 객체'클래스에서 '사용되는'객체 클래스의 타입을 직접 지정해 버리면 '사용되는 객체'  클래스를 변경할 경우 이를 이용하고 있는 곳을 모두 수정해야 합니다. 한두 군데라면 문제가 없겠지만 수정한 부분이 늘어나면 실수가 발생할 위험이 높아질것입니다. 

3-2-3 인터페이스 의존

I 인터페이스가 있고 그것을 구현한 '사용되는 객체'인 B 클래스가 있습니다. '사용되는 객체'인 A클래스에서 B클래스의 methodX 메서드를 호출합니다. 

// A 클래스
xxx() {
I i = new B(); // 인스턴스 생성(참초취득)
i.methodX();   // 메서도 호출(이용)
}
// I인터페이스
methodX();
// B클래스 implements I
methodX() {
...
}

또 설계 변경이 발생해서 '사용되는 객체' 클래스를 변경하게 되었습니다.  (B -> C)

// A 클래스
xxx() {
I i = new C(); // 변경된 클래스
i.methodX();   
}

 

// C클래스 implements I
methodX() {
...
}
  • 인터페이스는 참조를 받는 유형으로 사용할 수 있으므로 이름을 변경하지 않아도됩니다. 
  • 인터페이스가 선언된 메서드를 이용하면 클래스가 바뀌어도 메서드명을 변경하지 않아도 됩니다. 

3-2-6 다섯 가지 규칙

  1. 인터페이스를 이용하여 의존성을 만든다.
  2. 인스턴스를 명시적으로 생성하지 않는다.
  3. 어노테이션을 클래스에 부여한다.
  4. 스프링 프레임워크에서 인스턴스를 생성한다.
  5. 인스턴스를 이용하고 싶은 곳에 어노테이션을 부여한다.

3-3 어노테이션 역할 알아보기

어노테이션에 대한 이해를 돕기 위해 우선 몇가지 간단한 설명을 하겠습니다. 

3-3-1 어노테이션을 세 가지 항목으로 설명

어노테이션을 사용하여 외부 소프트웨어에 필요한 처리 내용을 전달한다.

소스 파일   외부 소프트웨어
@Override 시그니처를 체크 자바 컴파일러
@Author 도움말 문서 생성 JavaDoc
@Component 인스턴스 생성 스프링 프레임워크
@NotEmpty 입력란 체크 Validator
@Test 테스트 실행 JUnit

 

레이어별 인스턴스 생성 어노테이션 설명(주요처리)

어노테이션 개요
@Controller 애플리케이션 레이어의 컨트롤러 부여
@Service 도메인 레이어의 업무 처리에 부여
@Repository 인프라 레이어의 데이터베이스 액세스 처리에 부여

 

 

3-4 AOP(관점 지향 프로그래밍)의 기초 지식

데이터베이스 액세스 처리 프로그램을 예로 들어 설명하겠습니다.

3-4-1 AOP 예제

데이터베이스 액세스 처리에는 예외 발생 시 처리하는 내용이 반드시 포함되어야 합니다. 예외 처리를 하지 않으면 프로그램이 중지되고 자바의 경우 예외 처리를 프로그램에 포함하지 않으면 컴파일에 실패합니다. 

스프링 프레임워크에서 제공하는 AOP 기능을 활용하여 '중심적 관심사'와 '횡단적 관심사'를 분리하여 프로그램을 쉽게 만들 수 있습니다. 

용어 내용
어드바이스(Adivice) 횡단적 관심사의 구현.로그출력 및 트랜잭션 제어 등입니다.
애스팩트(Aspect) 어드바이스를 정리한것(클래스)입니다.
조인포인트(JoinPoint) 어드바이스를 중심적인 관심사에 적용하는 타이밍. 메서드(생성자) 실행 전, 메서드(생성자) 실행 후 등 실행되는 타이밍입니다.
포인트컷(Pointcut) 어드바이스를 삽입할수 있는 위치. 예를들어, 메서드이름이 get으로 시작할 때만 처리하는 조건을 정의할 수 있습니다.
인터셉터(Interceptor) 처리의 제어를 인터셉트하기 위한 구조 또는 프로그램입니다. 스프링 프레임워크에서는 인터셉트라는 매커니즘으로 어드바이스를 중심 관심사에 추가한것처럼 보이게 합니다.
타킷(Target) 어드바이스가 도입되는 대상을 말합니다.

AOP의 주요 사항을 다음에 정리했습니다. 

  • AOP에서는 프로그램을 2개의 요소인 중심적 관심사와 횡단적 관심사로 구성되어 있다고 생각합니다.
  • 중심적 관심사란 구현해야 할 기능을 나타내는 비즈니스 로직을 말합니다.
  • 횡단적 관심사란 본질적인 기능은 아니지만 품질이나 유지보수 등의 관점에서 꼭 필요한 기능을 나타내는 프로그램을 말합니다.
  • AOP에서는 횡단적 관심사를 분리함으로써 기존 코드를 수정하지 않아도 프로그램 중에 특정 기능(공통 처리)을 추가할 수 있습니다. 
  • 스프링 프레임워크는 다양한 공통 기능을 AOP에서 제공합니다.