로드타임 위버를 활용하는 기능

@Configurable 지원

  • 로 등록한 DI 애스펙트가 동작하도록 AspectJ 로드타임 위버 기능을 대신해준다.

트랜잭션 AOP의 모드를 AspectJ로 설정

  • 로 트랜잭션 AOP의 모드를 AspectJ로 설정할 때도 로드타임 위버가 필요하다.

JPA에서 필요로 하는 로드타임 위버 사용

  • 평범한 POJO로 만든 도메인 오브젝트에 지연된 로딩이나 변경항목 감시, 그룹조회, JOIN을 이용한 로딩 및 최적화 기능을 적용하려면 POJO 클래스의 바이트코드를 조작해야 한다.
  • 각 JPA는 구현 제품마다 전용 로드타임 위버를 제공한다.

발생할 수 있는 문제점 :

  • AspectJ와 JPA의 로드타임위버를 모두 적용할 경우 문제 발생
  • JVM의 자바에이전트 옵션은 한 번에 한가지만 적용할 수 있다.
  • 자바에이전트는 JVM레벨에 적용된다. => JVM을 통해 로드되는 모든 클래스를 조사하고 클래스 바이트코드 조작 대상으로 삼기 때문에 서버에 적용하기 부담스럽다.
  • 이 때 스프링이 제공하는 로드타임 위버를 이용해 문제를 해결할 수 있다.

스프링 로드타임 위버

  • JPA와 AspectJ를 위한 로드타임 위버 기능을 대신해준다.
  • JVM레벨의 자바에이전트를 대체할 수 있는 로드타임 위버 적용 방법을 자동으로 찾아준다.
  • 스프링의 로드타임 위버는 자바에이전트 방식에 종속적이지 않다.
  • 주요 WAS는 클래스 로더 레벨에 로드타임 위빙 기능을 적용할 수 있는 방법을 제공한다.
  • 클래스 로더를 사용하면 JVM 레벨에 적용되는 자바 에이전트처럼 서버의 모든 클래스에 다 적용되지 않고, 특정 애플리케이션 모듈에만 적용 가능하다.
  • 스프링은 자동으로 다음 로드타임 위버 구현 방법 중 하나를 적용한다

Was 전용 로드타임 위버

  • 애플리케이션 서버가 WebLogic, OC4J, GlassFish, JBossAS 중 하나라면 각 서버에서 제공하는 특별한 클래스 로더를 이용하는 전용 로드타임 위버를 설정해준다.
  • JVM에 자바에이전트를 설정할 필요가 없다.

JVM 자바에이전트

  • 위 네가지 WAS 환경이 아니라면, 스프링이 제공하는 자바에이전트가 설정되어있는지 확인한다.
  • 스프링 자바에이전트가 등록되어 있으면, 이를 활용하는 로드타임 위버를 적용한다.

관례를 따르는 클래스로더

  • 위 모든 방법이 적용 불가능한 경우 리플렉션을 이용해 클래스 로더에 로드타임 위버 기능을 추가할 수 있는 메소드를 갖고있는지 확인한다.
  • 스프링은 특별히 톰캣을 위해 이 관례를 따르는 전용 클래스 로더를 제공해준다.
<Context path="/springapp" docBase=".../springapp">
	<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
</Context>
  • 는 기본적으로 이 순서에 따라 로드타임 위버 구현 방법을 찾고, 가장 먼저 발견된 방식을 적용한다.

oksusutea's blog

꾸준히 기록하려고 만든 블로그