바이트코드 조작

jacoco

이 플러그인을 통해서 코드의 커버리지를 파악하는 것이 가능하다 코드의 커버리지란, 해당 코드가 테스트 코드를 통해서 얼마나 테스트 되었는가를 판단해주는 수치이다

사용방법 jacoco를 gradle이든 maven이든에 추가를 한 뒤, 빌드하게 되면 내부 파일에 jacoco라는 패키지가 생기게 되고 해당 내부에 있는 index.html을 통해서 커버리지의 수치 파악, 테스트의 진행정도 등을 한꺼번에 확인하는 것이 가능하다 추가적으로 빌드하는데 있어서 COVEREDRATIO라는 속성에 값을 줌으로써 어느 정도 수치를 기준으로 빌드실패를 뱉는 것도 가능

중요한건 이거다 -> 테스트 커버리지를 어떻게 확인하는 걸까?? 논문이 있다네요... 하지만 간단 요약을 해보면 바이트 코드를 읽어서, 코드 커버리지를 읽어야하는 부분들의 갯수를 모두 카운팅한다 그리고 코드가 실행될 때 얼마나 지나갔는지 카운팅한다 그리고 지나가고 안지나간곳을 계산해서 수치를 표시해주는 방식이다

바이트코드를 통한 마술

바이트코드를 조작하는 방식은 ASM, Javassist, ByteBuddy 이렇게 유명한게 3가지 있는 것 같다 하지만 안타깝게도 ASM과 Javassit는 디자인패턴에 대해서도 충분한 이해가 필요하기도 하면서 바이트코드에 대한 지식또한 요함 그나마 ByteBuddy가 함수에 대한 이해를 거친 이후에는 사용하기 그나마 편하다고 하셨다

ByteBuddy를 통해서 바이트코드를 조작해두면, 미리 작성해둔 자바 코드를 클래스의 동작 이외에도 바이트코드 레벨의 조작을 행해서 자바 레벨 이외에서 동작을 넣어주는 것이 가능하다는 점! 신기하다.......

바이트코드를 조작함으로써의 활용성 프로그램을 분석하는데 사용하는 것이 가능하다 코드에서 버그를 찾는 것이 가능하고, 코드의 복잡도를 개성하는 것이 가능하다 클래스 파일을 생성하는 것도 가능하기 때문에 특정 조건에만 api를 사용할 수 있도록 조작하거나 프록시에 접근하거나 컴파일러에 접근하는 것이 가능

스프링에서 애노테이션을 통해서 각 서비스나 컨트롤러나 엔티티등 이러한 빈들을 찾는 방식은 컴포넌트 스캔 방식이다 여기서 스프링이 사용하는 컴포넌트 스캔은 바이트코드를 통해서 찾게 되는데, ASM 방식을 통해서 찾게 된다

이렇게 개념에 대해서 알아두면 필요할 때 가져다 사용할 수 있기 때문에 알고만있자

Last updated

Was this helpful?