첫 번째 기능은 의존성 주입(Dependency Injection)으로, 약어로 DI, 의존성 주입은 '의존하는 부분을 외부에서 주입하는 것'을 의미함
두 번째 기능은 관점 지향 프로그래밍(Aspect Oriented Programming)으로 약어는 AOP
공통 처리 등의 '횡단적 관심사'를 추출하고 프로그램의 여러 곳에서 호출할 수 있게 설정함으로써 개발자는 실현해야 할 기능인 '중심적 관심사'에만 집중해서 작성하면 되는 구조
(칼럼) AOP의 개념
회식에 비유하자면 '먹고 마시는 것'을 '중심적 관심사'라고 한다면 '가게의 선정이나 인원 수 조정'을 '횡단점 관심사'라고 표현한다. 누구나 가능하면 '먹고 마시는 것'만 하고 싶어 하지만 그 외의 작업도 누군가는 해야 하는데, 그 일을 편안하게 해주는 역할을 하는 것이 AOP이다.
'사용하는 객체'를 A 클래스라고 하고 '사용되는 객체'를 B라고 정의함
A 클래스에서 B 클래스를 사용하려면 B 클래스의 인스턴스를 생성하고 메서드를 사용 B 클래스에서 구현했던 메서드를 변경하면 A 클래스에서도 메서드를 변경해야함 이 관계를 'A 클래스는 B 클래스에 의존한다' 표현
'사용하는 객체' 클래스에서 '사용되는 객체' 클래스의 타입을 직접 지정해 버리면 '사용되는 객체' 클래스를 변경할 경우 이를 이용하고 있는 곳을 모두 수정해야 한다. 한두 군데면 문제가 없을 수 있지만 수정한 부분이 늘어나면 실수가 발생할 위험이 높아진다.
의존성 주입은 '의존하는 부분을 외부에서 주입하는 것'
인스턴스를 생성하는 데 new 키워드를 사용했지만 인스턴스 생성과 같은 작업을 프레임워크에 맡길 수 있고 그 역을 하는 것이 DI 컨테이너 입니다. 스프링 프레임 워크는 임의로 구현한 클래스를 인스턴스로 만들어주는 기능을 제공
애플리케이션을 만들 때는 레이러로 나누는 것이 좋다. 레이어(layer)란 '층'의 의미로, 계층 구조로 되어있는 각 층을 뜻함. 복잡한 전체 내용을 한 번에 정리해 이해하지 말고 계층화 하여 계층별로 대상의 의미를 이해하는 것
레이어 | 개요 |
---|---|
애플리케이션 레이어 (Application Layer) | 클라이언트와의 데이터 입출력을 제어하는 레이어 |
도메인 레이어 (Domain Layer) | 애플리케이션의 중심의 되는 레이어로서 업무 처리를 수행하는 레이어 |
인프라스트럭처 레이어 (Infrastructure Layer) | 데이터베이스에 대한 데이터 영속성(Persistence Context) 등을 담당하는 레이어 |
어노테이션 | 개요 |
---|---|
@COntroller | 애플레이케이션 레이어의 컨트롤러에 부여 |
@Service | 도메인 레이어의 업무 처리에 부여 |
@Repository | 인프라 레이어의 데이터베이스 액세스 처리에 부여 |
@Component | @Controller, @Service, @Repository의 용돟 이외의 인스턴스 생성 대상 클래스에 부여 |
커스텀 어노테이션을 만들 때는 java.lang.Annotation 인터페이스를 상속하고 만듭니다. 또한 커스텀 어노테이션을 정의할 때는 전용 자바 파일을 생성할 필요가 있습니다.
데이터베이스 액세스 처리에는 예외 발생 시 처리하는 내용이 반드시 포함되어야 합니다. 예외 처리를 하지 않으면 프로그램이 중지되고 자바의 경우 예외 처리를 프로그램에 포함하지 않으면 컴파일에 실패합니다.
다수의 데이터베이스 액세스 처리 코드를 작성하다 보면 예외 처리의 내용은 항상 동일하지만, 예외 처리는 필수이므로 항상 작성해야함.
구현하고 싶은 프로그램은 데이터베이스의 액세스 처리이며 예외 처리는 구현하고 싶은 프로그램에 부수적인 내용임.
용어 | 내용 |
---|---|
어드바이스(Advice) | 횡단적 관심사의 구현(메서드) 로그 출력 및 트랜잭션 제어 등 |
애스펙트(Aspect) | 어드바이스를 정리한 것(클래스) |
조인포인트(JoinPoint) | 어드바이스를 중심적인 관심사에 적용하는 타이밍. 메서드 실행 전, 메서드 실행 후 등 실행되는 타이밍 |
포인트컷(Pointcut) | 어드바이스를 삽입할 수 있는 위치, 메서드 이름이 get으로 시작할 때만 처리 하는 조건을 정의 |
인터셉트(Interceptor) | 처라의 제어를 인터셉트하기 위한 구조 또는 프로그램. 스프링 프레임워크에서는 인터셉트라는 메커니즘으로 어드바이스를 중심 관심사에 추가한 것 처럼 보이게함. |
타깃(Target) | 어드바이스가 도입되는 대상을 의미 |
어드바이스 | 내용 | 어노테이션 |
---|---|---|
BeforeAdvice | 중심적 관심사가 실행되기 '이전'에 횡단적 관심사를 실행 | @Before |
After Returning Advice | 중심적 관심사가 '정상적으로 종료된 후' 에 횡단적 관심사를 실행 | @AfterReturning |
After Throwing Advice | 중심적 관심사로 부터 '예외가 던져진 후'로 횡단적 관심사를 실행 | @AfterThrowing |
After Advice | 중심적 관심사 '실행 후'에 횡단적 관심사를 실행 | @After |
Around Advice | 중앙적 관심사 호출 전 후에 해당하는 횡단적 관심사를 실행 | @Around |
직접 어드바이스를 만든는 경우 패키지, 클래스, 메서드 등 어드바이스를 삽입 대상을 조건으로 지정할 수 있습니다. 지정하는 조건 방법에는 포인트컷 식을 사용
와일드카드 | 내용 |
---|---|
*(애스터리스크) | 임의의 문자열을 나타내고, 패키지를 나타낼 때는 임의의 패키지르 한 계층을 나탬. 메서드의 인수에서는 한 개의 인수를 나타내는 반환값으로도 이용 가능 |
..(점 두 개) | 패키지를 나타내는 경우 0개 이상의 패키지를 나타냄. 메서드의 안수를 표현하는 경우에는 0개 이상의 임의의 인수를 나타냄 |
+(플러스) | 클래스명 뒤에 기술해 클래스와 그 서브클래스 및 구현 클래스 모두를 나타냄. |
구현 예 | 내용 |
---|---|
exectuin( com.example.service.DemoService. (..) | DemoService 클래스의 메서드에 어드바이스를 적용함 |
exectuin( com.example.service.DemoService.select (..) | DemoService 클래스의 select로 시작하는 메서드에 어드바이스를 적용 |
exectuin(String com.example.service.DemoService.* (..) | DemoService 클래스의 반환값이 String 타입인 메서드에 어드바이스를 적용 |
스프링 부트에서 프로젝트를 시작할 때 통합 개발 환경(IDE)에 의존하지 않는 프로젝트를 만드는 방법을 원한다면 Spring Initializr에서 프로젝트를 만들고 사용 중인 통합 개발 환경에서 해당 프로젝트르 가져와서 사용.
IDE는 통합 개발 환경으로, 코딩을 편리하게 할 수 있는 기능이 포함된 환경.