Post

05 Spring 삼각형

05 Spring 삼각형

1.스프링 삼각형

요소풀네임핵심 개념역할/효과
IoCInversion of Control객체 생성 및 의존성 제어를 컨테이너가 담당 (DI 기반)코드 결합도 감소, 테스트 용이
AOPAspect-Oriented Programming핵심 로직과 횡단 관심사(트랜잭션, 로깅 등) 분리중복 제거, 유지보수성 향상
PSAPortable Service Abstraction다양한 기술(JDBC, JPA, JMS 등) 추상화 

1. IOC

1. IOC

  • “제어의 역전”이라는 뜻으로, 객체의 생성과 의존성 관리에 대한 제어권이 개발자가 아닌 프레임워크(컨테이너)로 넘어가는 개념
  • 의존성 주입(DI, Dependency Injection): IoC를 구현하는 대표적인 방식. 생성자 주입, 세터 주입, 필드 주입 등.
  • 느슨한 결합(Loose Coupling): 객체 간 의존성을 코드 레벨이 아닌 설정/컨테이너에 위임 → 재사용성과 확장성 증가.
  • 객체 생명주기 관리: 생성, 초기화, 소멸까지 컨테이너가 관리.

2. IOC vs DI

구분IoCDI
개념제어 권한을 컨테이너가 가짐의존성(필요 객체)을 외부에서 주입
범위더 넓음 (DI, AOP, 이벤트 등 포함)IoC 구현 기법 중 하나
초점“누가 제어하나?”“어떻게 의존성을 주입하나?”
스프링에서IoC 컨테이너 = ApplicationContext/BeanFactory주입 기법 = @Autowired, @Resource, XML 등

3. 패턴 변화(DI)

1
2
3
4
   // 기존 패턴
   public class OrderService {
     private OrderRepository orderRepository = new OrderRepository(); // 직접 new
   }
  • 개발자가 직접 객체를 생성 (new)
  • 필요한 의존 객체도 직접 주입
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
       // 변화한 패턴
       @Component
       public class OrderService {
     private final OrderRepository orderRepository;
    
     @Autowired
     public OrderService(OrderRepository orderRepository) { // 컨테이너가 주입
         this.orderRepository = orderRepository;
     }
      }
    
  • 스프링 컨테이너가 객체(Bean)를 생성
  • 컨테이너가 의존성을 찾아 자동으로 주입
  • 개발자는 컨테이너에서 객체를 꺼내 쓰기만 함

4. IOC 관련 용어

용어정의IoC와의 관계
IoC (Inversion of Control)객체 생성과 제어의 권한을 프레임워크/컨테이너에 위임하는 개념스프링의 근본 설계 원칙
DI (Dependency Injection)객체가 의존하는 다른 객체를 외부에서 주입받는 방식IoC를 구현하는 대표적인 메커니즘
DL (Dependency Lookup)컨테이너에서 필요한 객체를 직접 조회해서 가져오는 방식IoC의 다른 구현 방법 (예: ApplicationContext.getBean())
Bean스프링 IoC 컨테이너가 관리하는 객체IoC의 대상
BeanFactory가장 기본적인 IoC 컨테이너 인터페이스Bean의 생성·관리 기능 담당
ApplicationContextBeanFactory를 확장한 IoC 컨테이너DI, AOP, 이벤트, 메시지 리소스 관리까지 포함
ContainerBeanFactory나 ApplicationContext 같은 IoC 구현체IoC를 실질적으로 수행하는 주체
Configuration MetadataXML, Java Config, Annotation 등으로 작성된 Bean 정의 정보컨테이너가 객체 생성 규칙을 알 수 있게 함
Lifecycle (Bean Lifecycle)Bean의 생성 → 의존성 주입 → 초기화 → 사용 → 소멸 과정IoC 컨테이너가 책임지고 관리

5. note

  • 개발에서의 변화
    • 기존 방식에서는 객체가 의존 대상을 직접 생성해야 하므로, 구체적인 클래스에 대해 정확히 알고 있어야함.
    • 하지만 의존성 주입(DI)을 적용하면 객체는 구체 클래스가 아니라 인터페이스만 의존하게 되고, 실제 구현체는 외부에서 주입되므로 인터페이스 규격만 맞으면 정상적으로 동작
  • bean을 만드는 작업과 주입하는 과정을 분리하고, 상황에 따라서 유동적으로 빈을 주입해서 사용가능함.

2. AOP

1. AOP

  • 핵심 로직과 공통 관심사(Cross-Cutting Concern)를 분리하는 프로그래밍 기법
    • 핵심 로직(Core Business Logic): 실제 애플리케이션이 수행하는 기능
    • 횡단 관심사(Cross-Cutting Concern): 로깅, 트랜잭션, 보안, 성능 측정 등 여러 곳에서 반복되는 코드

2. AOP 관련용어

용어정의
Aspect횡단 관심사를 모아놓은 모듈 (예: 로깅, 트랜잭션)
Join PointAspect가 적용될 수 있는 지점 (메서드 실행, 예외 발생 등)
AdviceJoin Point에 실제로 적용되는 코드 (Before, After, Around 등)
PointcutAdvice가 적용될 Join Point를 선택하는 조건
WeavingAspect를 실제 코드에 적용하는 과정 (컴파일, 클래스 로딩, 런타임 시 가능)

3. 사용방법

1
2
3
4
5
6
7
8
9
@Aspect // 등록
@Component // bean
public class LoggingAspect {
    @Before("execution(* com.example.service.OrderService.placeOrder(..))") // 클래스 작업전에
    public void logBefore() { // 요거를 호출
        System.out.println("주문 처리 전 로깅...");
    }
}

3. PSA

1. PSA

  • 스프링이 제공하는 기술 추상화 계층을 의미 / 개발자가 생성한건 해당없음.
  • 스프링이 다양한 기술(JDBC, JMS, JPA, 트랜잭션 등)에 일관된 API를 제공하여,
  • 개발자가 특정 기술에 종속되지 않고 코드를 작성할 수 있도록 해주는 개념

2. 주요 용어

특징설명
추상화기술 구현체를 몰라도 공통 API 사용 가능
일관성여러 기술을 동일한 방식으로 다룸
이식성기술 교체 시 코드 수정 최소화
유지보수 용이공통 API 기반으로 관리

3. PSA 범위

  • PSA 범위
    • JDBC, JPA, JMS, 트랜잭션, 메시지, 스케줄링 등 스프링이 추상화한 공통 API
    • 예: JdbcTemplate, PlatformTransactionManager, JmsTemplate, JpaTransactionManager 등
  • 포함되지 않는 것
    • Service, Controller, Utility Bean 등 비즈니스 로직 또는 애플리케이션 단위 객체
    • PSA는 “비즈니스 로직이 아니라, 기술 추상화”에 초점
  • PSA의 역할
    • 기술 구현체에 독립적인 API 제공
    • 개발자가 핵심 로직을 작성할 때 구체 기술(JDBC, JPA, JMS 등) 변경에 무관하게 코드를 유지할 수 있도록 지원
This post is licensed under CC BY 4.0 by the author.