0. 들어가며


Spring의 DI, Lombok, Spring Data JPA 같은 기능들은 Java에서 제공하는 여러 코드 조작 기술을 활용해 구현된다. 이 글에서는 그 기반 기술들을 네 가지 축으로 나누어 정리한다.

  1. 바이트 코드 조작
  2. 리플렉션
  3. 다이나믹 프록시
  4. 애노테이션 프로세서

1. 바이트코드 조작 (Bytecode Manipulation)


스프링을 쓰다보면 @Transactional 을 붙였더니 트랜잭션이 생기거나, @Entity를 붙였더니 Hibernate가 내부적으로 무언가를 해주는 경우가 있다. 이러한 기능들은 자바의 여러 코드 조작 기술 위에서 작동하는데 그 중에서도 강력한 기술이 바이트코드 조작이다.

바이트코드는 JVM이 실행하는 .class 파일의 내용인데, 이걸 클래스가 로딩될 때, 또는 프로그램이 이미 실행된 후에도 변경할 수 있다. 즉, 소스 코드를 건드리지 않고도 프로그램의 동작을 수정할 수 있다.

근데 코드에 그냥 쓰면 되지 왜 굳이 바이트코드를 조작해야하는지 궁금할 수 있다. 대표적인 이유는 다음과 같다.

  1. 공통 기능 (로깅, 트랜잭션)을 자동으로 삽입하기 위해
  2. 프레임워크 내부에서 개발자 편의를 높이기 위해