GW LABS

Spring의 기본 개념 총정리: DI, IoC, AOP 완벽 가이드 본문

Programming/Java

Spring의 기본 개념 총정리: DI, IoC, AOP 완벽 가이드

GeonWoo Kim 2025. 8. 12. 13:33

Spring의 기본 개념 총정리: DI, IoC, AOP 완벽 가이드

서론

Spring Framework는 자바 기반 애플리케이션 개발에서 표준처럼 사용되는 강력한 프레임워크입니다.
대규모 엔터프라이즈 애플리케이션부터 소규모 프로젝트까지, Spring은 DI(Dependency Injection), IoC(Inversion of Control), AOP(Aspect Oriented Programming)와 같은 핵심 개념을 기반으로 유연하고 유지보수성 높은 애플리케이션을 만들 수 있게 돕습니다.

이번 포스팅에서는 Spring의 세 가지 핵심 개념을 정확하게 이해하고, 간단한 예제 코드로 구현 방법을 살펴보겠습니다.


1. IoC (Inversion of Control) - 제어의 역전

IoC는 객체의 생성과 의존성 관리를 개발자가 아닌 컨테이너가 담당하는 설계 원칙입니다.
기존에는 객체가 직접 의존 객체를 생성했지만, Spring에서는 컨테이너가 대신 객체를 주입합니다.

IoC 예시

// 전통적인 방식
public class UserService {
    private UserRepository userRepository = new UserRepository();
}

// IoC 적용 (Spring 관리)
@Component
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

💡 핵심 포인트: 객체 생성 책임이 개발자에서 Spring 컨테이너로 넘어감.

2. DI (Dependency Injection) - 의존성 주입

DI는 IoC의 한 형태로, 필요한 객체를 외부에서 주입받는 방식입니다.
Spring에서는 생성자 주입, 세터 주입, 필드 주입 방식이 있습니다.
그중 생성자 주입이 가장 권장됩니다.

DI 예시 (생성자 주입)

@Service
public class OrderService {
    private final PaymentService paymentService;

    @Autowired
    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }

    public void processOrder() {
        paymentService.pay();
    }
}

DI 장점

  • 결합도 감소: 구현체 변경 시 최소 수정
  • 테스트 용이성: Mock 객체 주입 가능
  • 유연한 구조: 환경에 따라 의존성 교체 가능

3. AOP (Aspect Oriented Programming) - 관점 지향 프로그래밍

AOP는 공통 관심사(로깅, 보안, 트랜잭션 등)를 핵심 비즈니스 로직과 분리하는 방법입니다.
이를 통해 코드 중복을 줄이고 유지보수성을 높일 수 있습니다.

AOP 예시 (로깅)

@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.gwlabs.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("[LOG] 메서드 실행 전: " + joinPoint.getSignature());
    }

    @After("execution(* com.gwlabs.service.*.*(..))")
    public void logAfter(JoinPoint joinPoint) {
        System.out.println("[LOG] 메서드 실행 후: " + joinPoint.getSignature());
    }
}

AOP 적용 시 장점

  • 중복 코드 제거: 로깅, 보안, 예외 처리 등 공통 기능 모듈화
  • 유지보수성 향상: 변경 사항을 한 곳에서 관리
  • 가독성 향상: 핵심 로직과 부가 기능이 분리

결론

Spring의 IoC, DI, AOP는 유연한 구조와 낮은 결합도, 높은 유지보수성을 제공하는 핵심 개념입니다.
이 세 가지를 이해하고 적용하면, 복잡한 애플리케이션에서도 코드 품질과 개발 생산성을 극대화할 수 있습니다.

핵심 가치: "Spring의 핵심 개념을 이해하면, 유지보수성과 확장성이 뛰어난 애플리케이션 아키텍처를 설계할 수 있습니다."

Comments