[기술 면접] 2. AOP가 무엇인가요?

AOP

저번 시간엔 Spring을 왜 사용하는 지에 대해 알아보았습니다. 이번 시간엔 Spring Boot가 지원하는 AOP에 대해 알아보겠습니다. 자주 등장하는 질문은 아니지만, 한 번쯤 등장하는 개념이니 짚고 넘어가는 것을 권해드립니다.

image 60



Q: AOP가 무엇인가요?

Aspect Oriented Programming으로, 핵심 관심 사항(core concern)과 공통 관심 사항(cross-cutting concern)을 분리하여 모듈화합니다.

  • 핵심 관심 사항으로는 적용하고자 하는 비즈니스 로직이라 할 수 있으며,
  • 공통 관심 사항DB 연결, 로깅, 파일 입출력 등을 예로 들 수 있습니다.



Q: AOP의 주요 구성 요소를 말해보세요

  1. Aspect : 관심사를 모듈화한 것.(주로 부가 기능)
  2. Target : Aspect를 적용한 곳(클래서, 메서드 등)
  3. Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적 부가기능을 담은 구현체
  4. JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점, 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용 가능.
  5. PointCut : JointPoint의 상세한 스펙을 정의한 것. A란 메서드의 진입 시점에 호출할 것과 같이 더욱 구체적으로 Advice가 실행될 지점 설정.



Q: AOP와 OOP(Object-Oriented Programming)의 차이점은 무엇인가요?

AOP와 OOP의 주요 차이점은 접근 방식에 있습니다. OOP는 주요 비즈니스 로직을 객체 단위로 모델링하여 캡슐화, 상속, 다형성, 그리고 추상화를 기반으로 개발하는 방식입니다. 반면 AOP는 공통 관심사를 별도의 모듈로 분리하여 주요 로직과 독립적으로 구현하고, 필요한 지점에서 모듈을 조합하여 적용하는 방식입니다.



Q: Spring에서 AOP를 어떻게 구현하나요?

주로 프록시 기반 AOP를 사용합니다. Spring은 프록시를 이용하여 Aspect를 주요 비즈니스 로직에 적용하고, 이를 위해 어드바이스(Advice)를 작성하여 관심사를 구현하고, 포인트컷(PointCut)을 이용하여 어떤 JoinPoint에서 Advice를 적용할지 선택합니다.

추가로, Spring은 runtime 시 프록시를 생성하여 Aspect를 주요 로직에 끼워넣어줍니다.



Q: AOP를 사용하면 어떤 장점이 있나요?

  1. 코드의 재사용성과 유지보수성이 향상됩니다.
  2. 공통 관심사를 한 곳에서 관리하여 애플리케이션 전체에 걸쳐 일관성 있는 기능을 제공할 수 있습니다.
  3. 주요 비즈니스 로직과 관심사를 분리하여 가독성이 좋은 코드를 작성할 수 있습니다.
  4. 개발자가 핵심 비즈니스 로직에 집중할 수 있게 해줍니다.



Q: AOP의 단점은 무엇인가요?

  1. 잘못된 사용으로 코드가 복잡해질 수 있습니다.
  2. 프록시 기반 AOP는 runtime 시 프록시를 생성하는데, 이 것은 오버헤드를 유발할 수 있습니다.
    + Spring은 이를 최소화하기 위해 CGLIB과 JDK 다이나믹 프록시를 지원합니다.
  • CGLIBJDK Dynamic Proxy는 스프링 프레임워크에서 AOP를 구현하는 데 사용되는 두 가지 프록시 생성 기술입니다.
    • CGLIB(CodeGen Library): CGLIB는 스프링 AOP에서 프록시를 생성하는 라이브러리 중 하나입니다. CGLIB는 바이트 코드 레벨에서 프록시를 생성하므로 클래스 기반의 프록시를 생성할 수 있습니다. 클래스를 상속받아 프록시 객체를 생성하는 방식이기 때문에 인터페이스를 구현하지 않는 클래스의 메서드도 프록시 대상이 될 수 있습니다. 그러나 final 클래스나 final 메서드는 프록시가 생성되지 않습니다.
    • JDK Dynamic Proxy: JDK Dynamic Proxy는 자바 리플렉션을 사용하여 인터페이스 기반의 프록시를 생성하는 기술입니다. JDK Dynamic Proxy는 자바의 java.lang.reflect 패키지에서 제공하는 기능을 이용하여 프록시 객체를 생성합니다. 따라서 인터페이스를 구현한 클래스의 메서드만 프록시 대상이 됩니다. 클래스 기반의 프록시를 생성하지 않기 때문에 CGLIB에 비해 프록시 객체의 생성 속도가 느릴 수 있지만, 인터페이스를 기반으로 한 프록시를 생성할 때 유용합니다.



마치며

AOP에 대해 알아보았습니다. Spring은 AOP를 지원하는 프레임워크 중 하나이기 때문에 관련 질문으로 나올 수 있으며, 상대적으로 적지만 실제로 사용되고 있는 패턴이니 알아두는 것이 좋을 것 같습니다.

다음 시간에는, Spring의 @Transactional 어노테이션에 대해 알아보겠습니다.

AOP

Leave a Comment