IoC / DI: 제어의 역전 / 의존관계 주입
스프링에서 IoC(Inversion of Control)/DI(Dependency Injection)는 객체지향 개발 방식에서 객체 간의 결합도를 낮추고 유연한 코드를 작성하기 위한 핵심적인 기술 중 하나입니다.
일반적으로 객체를 생성하고 사용하는 방식은 개발자가 코드 안에서 직접 객체를 생성하고 의존성을 설정합니다. 하지만 스프링에서는 이러한 제어권을 개발자가 아닌 스프링 컨테이너가 가져오는데, 이를 IoC(Inversion of Control, 제어의 역전)이라고 합니다. 즉, 개발자가 객체를 생성하고 의존성을 설정하는 것이 아니라, 스프링 컨테이너가 객체를 생성하고 의존성을 설정합니다.
DI(Dependency Injection)는 스프링에서 IoC를 구현하는 방식 중 하나로, 객체가 사용하는 의존성을 객체 외부에서 설정하는 것을 의미합니다. 스프링에서는 의존성을 설정하는 방법으로 다양한 방식을 제공합니다. 주로 생성자 주입(Constructor Injection), setter 주입(Setter Injection), 필드 주입(Field Injection) 등이 사용됩니다.
이를 통해 스프링에서는 개발자가 의존성을 직접 설정하는 것이 아니라, 스프링 컨테이너가 객체의 의존성을 설정하므로, 유연하고 확장 가능한 코드를 작성할 수 있습니다. 또한, 객체 간의 결합도가 낮아져서 테스트와 유지보수가 쉬워지는 장점이 있습니다.
AOP: 관점 지향 프로그래밍
스프링 AOP (Aspect-Oriented Programming)는 객체 지향 프로그래밍에서의 관심사의 분리를 위한 프로그래밍 패러다임입니다. AOP를 이용해서, 객체의 핵심 비즈니스 로직과 공통 기능을 분리하여 개발할 수 있도록 지원합니다.
AOP는 주로 로깅, 트랜잭션 처리, 보안 등의 부가적인 기능을 추가하기 위해 사용됩니다.
스프링 AOP를 활용하면, 코드의 재사용성과 유지보수성을 높일 수 있습니다. 특히, 트랜잭션 처리나 보안과 같은 부가적인 기능을 별도의 모듈로 분리하여 관리할 수 있습니다.
AOP 용어
- Advice
- AOP는 핵심 비즈니스 로직을 수행하는 객체를 대상으로 하는 것이 아니라, 그 객체의 주변에서 실행되는 공통 기능(로깅, 보안, 트랜잭션 관리 등)을 대상으로 합니다. 이러한 공통 기능을 '어드바이스(Advice)'라고 하며, 이러한 어드바이스를 핵심 비즈니스 로직과 분리하여 작성할 수 있습니다.
- Advice는 타겟의 메소드 호출 전, 후, 예외 발생 시점에 수행될 수 있습니다.
- Target
AOP에서는 핵심 비즈니스 로직을 수행하는 객체를 '타깃(Target)'이라합니다. - Advisor
- 공통 기능을 수행하는 객체를 '어드바이저(Advisor)'라고 합니다.
- Advisor는 Advice와 Pointcut으로 구성되며, Pointcut은 어떤 메서드가 언제 실행될지 결정합니다.
AOP에서는 어드바이스와 타겟 사이의 관계를 횡단 관심사(cross-cutting concern)라고 합니다. 이러한 관심사를 분리하여 구현하면, 코드의 가독성과 유지보수성을 높일 수 있습니다.
AOP 적용 기법
- 스프링 AOP: 스프링 + 다이내믹 프록시
프록시 패턴을 사용하여 AOP를 구현합니다. 스프링은 자체적으로 프록시를 생성하며, 타겟 객체와 어드바이스를 연결합니다. - AspectJ
자바 언어 자체에 AOP 기능을 추가하는 것으로, 스프링이 아닌 AspectJ 컴파일러를 사용합니다.
스프링이 만들어서 제공하는 AOP 기능을 그대로 가져다 사용합니다.
스프링이 직접 제공하는 대표적인 AOP는 바로 트랜잭션입니다. 그리고 트랜잭션만큼 아니지만 특정 아키텍처를 선택했을 때 사용할 수 있도록 준비된 AOP 기능이 하나 더 있습니다. 바로 @Configurable 어노테이션을 이용해서 도메인 오브젝트에 DI를 자동적용해주는 AOP 기능입니다. 도메인 오브젝트를 전용 계층에 두고 접근하는 아키텍처 방식을 따를 때 반드시 필요합니다. 프록시 AOP면 충분한 트랜잭션과 달리, @Configurable을 위해서는 AspectJ를 이용한 AOP가 반드시 필요합니다.
위 두 가지는 스프링이 미리 준비해서 제공해주는 대표적인 AOP 기능입니다. 이는 간단한 설정을 추가하는 것만으로 쉽게 적용할 수 있기 때문에 AOP에 대한 지식이나 경험이 많지 않더라도 간단히 이용 가능합니다.
AOP에 자세한 설명은 다음 링크 참고!!
https://yeo-computerclass.tistory.com/249
PSA: Portable Service Abstraction
PSA는 Portable Service Abstraction의 약어로, 서비스 추상화라는 뜻입니다. 구체적인 기술과 환경에 종속되지 않도록 유연한 추상 계층을 두는 방법이며, 이를 통해 환경이나 서버, 특정 기술에 종속되지 않고 이식성과 재사용성이 뛰어난 어플리케이션을 만들 수 있습니다. 즉 환경과 세부 기술의 변화에 관계없이 일관된 방식으로 기술에 접근 할 수 있게 해주는 PSA입니다.
Spring PSA는 Spring Framework가 제공하는 여러 가지 기술들을 사용하는 애플리케이션 개발자들이 해당 기술들을 사용하면서 다른 프레임워크나 라이브러리를 함께 사용할 경우, 코드의 이식성과 재사용성을 높이기 위해 필요합니다.
Spring PSA는 서비스 추상화를 통해 개발자가 서비스 기술을 변경하더라도 소스 코드를 수정하지 않고, 동일한 인터페이스를 사용할 수 있도록 합니다. 예를 들어, 데이터베이스를 사용할 때 JDBC, JPA, MyBatis 등 다양한 기술이 있습니다. Spring PSA를 사용하면 이러한 기술을 통합적으로 사용할 수 있도록 DataSource, JdbcTemplate, EntityManager 등의 추상화된 인터페이스를 제공합니다.
서비스 추상화를 위해 필요한 기술은 DI입니다. 결국 DI 응용 방법의 한 가지이므로 DI를 적극 활용해서 개발한다면 서비스 추상화는 자연스럽게 만들어 쓸 수 있습니다.
'Spring Framework' 카테고리의 다른 글
Spring IoC 컨테이너 계층구조 및 구성(웹 어플리케이션) (0) | 2022.08.20 |
---|---|
Spring 스프링 컨테이너(IoC 컨테이너)와 빈(Bean) (0) | 2022.08.20 |
Spring 스프링이란? ( + POJO ) (0) | 2022.08.17 |
Spring 스프링(Spring) 설치하기 (feat. Eclipse) (0) | 2022.07.27 |
Spring AOP(Aspect Oriented Programming) (+AOP 실습) (0) | 2022.07.26 |