스프링부트 자바 기초 되새기기
IoC, DI, AOP
스프링을 제대로 이해하려면 프레임워크의 중심 개념인 IoC, DI, AOP를 알아야 한다.
이 세 가지는 스프링의 모든 동작 원리를 설명한다.
IoC(Inversion of Control)는 객체 생성과 관리의 제어권을 개발자가 아닌 스프링이 가진다는 개념이다.
일반적인 자바에서는 객체를 new로 생성하지만, 스프링에서는 컨테이너가 대신 생성하고 관리한다.
객체의 생명주기를 프레임워크에 맡김으로써 코드 간 결합도가 낮아지고 유지보수가 쉬워진다.
DI(Dependency Injection)는 IoC를 구현하는 방법이다.
객체가 직접 의존 대상을 만들지 않고, 외부에서 주입받는 구조를 말한다.
@Service
public class OrderService {
private final PaymentService paymentService;
@Autowired
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}
구현체가 바뀌어도 `OrderService`는 수정할 필요가 없으며, 이는 유연성과 테스트 용이성을 크게 높여준다.
AOP(Aspect Oriented Programming)는 공통 관심사를 분리하는 개념이다.
로그, 보안, 트랜잭션처럼 여러 모듈에서 반복되는 기능을 핵심 로직에서 분리해 관리한다.
예를 들어 서비스 실행 전후에 로그를 남기고 싶을 때 AOP를 활용하면 모든 서비스 코드에 로그를 직접 작성할 필요가 없다.
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service..*(..))")
public void beforeServiceMethod(JoinPoint joinPoint) {
System.out.println("메서드 실행 전: " + joinPoint.getSignature());
}
}
덕분에 핵심 로직과 부가 로직이 분리되어 유지보수가 쉬워진다.
결국 IoC로 객체 생성을 제어하고, DI로 의존성을 주입하며, AOP로 공통 기능을 분리하는 이 세 가지 개념이 스프링의 핵심이다.
개발자는 비즈니스 로직에 집중하고, 스프링은 구조적 복잡성을 대신 관리한다.
다시 돌아보면 스프링은 단순히 자동화된 프레임워크가 아니라 객체 간의 관계를 설계하고 관리하는 시스템이라는 걸 알 수 있다.