2022년 9월 5일 월요일
@ 강한 태풍이 오고 있는 날씨지만, 공부에는 전혀 문제가
없기에 집중력을 잃지 않는 하루로 보내자,
곧 추석 연휴도 다가오기에 더욱 아낌없이 쏟아내고
쉴 때, 마냥 편하진 않겠지만, 조금이라도 떳떳하게
휴식을 취할 수 있도록 뭐라도 더 해보자.
[수업 순서]
[리플렉션]
- 컴파일 된 자바 코드에 역으로 클래스를 불러 메소드 및
필드 정보를 구해오는 방법으로 반사, 투영이라는 의미를
가진다, 리플렉션은 JVM에서 실행되는 애플리케이션의
런타임 동작을 검사하거나 수정할 수 있는 기능이 필요한 경우
사용한다, 스프링 프레임워크, 마이바티스, 하이버네이트 등의
라이브러리에서 사용한다. Reflection을 사용해서
스프링에서는 런타임 시 개발자가 등록한 빈을
애플리케이션 내에서 사용할 수 있게 하는 것이다.
[리플렉션 주의 사항]
(reflection은 강력한 도구이지만 무분별하게 사용하면 안됨.)
1. 오버헤드 발생 : 성능 저하를 발생 시킬 수 있기 때문에
성능에 민감한 애플리케이션에서는 사용하지 않는다.
2. 캡슐화 저해 : private로 설정한 member에 접근 가능하기
때문에 코드 기능이 저하되며 여러가지 문제를 발생 시킴.
ex)
[프록시]
- 실제 Target의 기능을 수행하면서 기능을 확장시키거나
추가하는 실제 객체를 의미한다, 프록시는 대상의 요청을
가로채 기능을 확장시킬 목적으로 사용하며,
refliction 기능을 이용해서 구현도 가능하다.
[프록시 생성 방법]
1. JDK Dynamic Proxy
- AspectJ에서 사용하는 프록시 생성은 1번 방식이다,
이 방식은 리블렉션을 이용해서 proxy 클래스를
동적으로 생성해주는 방식
- 타겟의 "인터페이스"를 기준으로 proxy를 생성
- 사용자의 요청이 타겟을 바라보고 실행될 수 있도록
타겟 자체에 대한 코드 수정이 아닌 리플렉션을 이용한
방식으로, 타겟의 위임 코드를 InvocationHandler를
이용하여 작성한다, 하지만 사용자가 타겟에 대한 정보를
잘못 주입하는 경우가 발생할 수 있기 때문에 내부적으로
주입된 타겟에 대한 검증 코드를 거친 후 invokerk 동작함.
- CGLib
- 2번 방식은 동적으로 Proxy를 생성하지만 바이트코드를
조작하여 프록시를 생성해주는 방식이다,
인터페이스 뿐만 아니라 타겟의 클래스가 인터페이스를
구현하지 않아도 프록시를 생성한다.
두 방식의 차이점은 성능 차이인데, invoke시 성능이
차이가 나게 된다, CGLib (Code Geneator Library)의
경우에는 처음 메소드가 호출된 당시 동적으로 타겟 클래스의
바이트코드를 조작하게 되고, 그 이후 호출 시부터는 변경 된
코드를 재사용한다, 따라서 매번 검증 코드를 거치는
1번 방식보다는 빠르다, 또한 리플렉션에 의한 것이 아닌
바이트 코드를 조작하는 방식이기 때문에 성능 면에서 우수함,
- CGLIb 방식에는 다른 단점이 있었으나 스프링 4.3,
스프링부트 1.3 이후부터 해당 부분이 개선되어
기본 core 패키지에 포함되게 되었고, 스프링에서 기본적으로
사용하는 프록시 방식이 CGLib 방식이 되었다.
[스프링 WEB]
※ 점점 더 중요한 내용들이 나오고 있다,
태풍으로 인해 스터디는 못하고 집에 얼른 귀가해서
노트북에 스프링web 개발환경 셋팅과 수업 영상 시청과
자바 추상클래스, 인터페이스, 기본클래스 부분도
정리하며 공부를 해야겠다, 화이팅!