TIL.54

hyunki__ss·2022년 9월 5일
0

2022년 9월 5일 월요일

@ 강한 태풍이 오고 있는 날씨지만, 공부에는 전혀 문제가
없기에 집중력을 잃지 않는 하루로 보내자,
곧 추석 연휴도 다가오기에 더욱 아낌없이 쏟아내고
쉴 때, 마냥 편하진 않겠지만, 조금이라도 떳떳하게
휴식을 취할 수 있도록 뭐라도 더 해보자.

[수업 순서]

  • 스프링 AOP
  • 스프링 WEB

[리플렉션]

  • 컴파일 된 자바 코드에 역으로 클래스를 불러 메소드 및
    필드 정보를 구해오는 방법으로 반사, 투영이라는 의미를
    가진다, 리플렉션은 JVM에서 실행되는 애플리케이션의
    런타임 동작을 검사하거나 수정할 수 있는 기능이 필요한 경우
    사용한다, 스프링 프레임워크, 마이바티스, 하이버네이트 등의
    라이브러리에서 사용한다. Reflection을 사용해서
    스프링에서는 런타임 시 개발자가 등록한 빈을
    애플리케이션 내에서 사용할 수 있게 하는 것이다.

[리플렉션 주의 사항]
(reflection은 강력한 도구이지만 무분별하게 사용하면 안됨.)
1. 오버헤드 발생 : 성능 저하를 발생 시킬 수 있기 때문에
성능에 민감한 애플리케이션에서는 사용하지 않는다.
2. 캡슐화 저해 : private로 설정한 member에 접근 가능하기
때문에 코드 기능이 저하되며 여러가지 문제를 발생 시킴.

ex)



[프록시]

  • 실제 Target의 기능을 수행하면서 기능을 확장시키거나
    추가하는 실제 객체를 의미한다, 프록시는 대상의 요청을
    가로채 기능을 확장시킬 목적으로 사용하며,
    refliction 기능을 이용해서 구현도 가능하다.

[프록시 생성 방법]
1. JDK Dynamic Proxy

  • AspectJ에서 사용하는 프록시 생성은 1번 방식이다,
    이 방식은 리블렉션을 이용해서 proxy 클래스를
    동적으로 생성해주는 방식
  • 타겟의 "인터페이스"를 기준으로 proxy를 생성
  • 사용자의 요청이 타겟을 바라보고 실행될 수 있도록
    타겟 자체에 대한 코드 수정이 아닌 리플렉션을 이용한
    방식으로, 타겟의 위임 코드를 InvocationHandler를
    이용하여 작성한다, 하지만 사용자가 타겟에 대한 정보를
    잘못 주입하는 경우가 발생할 수 있기 때문에 내부적으로
    주입된 타겟에 대한 검증 코드를 거친 후 invokerk 동작함.
  1. CGLib
  • 2번 방식은 동적으로 Proxy를 생성하지만 바이트코드를
    조작하여 프록시를 생성해주는 방식이다,
    인터페이스 뿐만 아니라 타겟의 클래스가 인터페이스를
    구현하지 않아도 프록시를 생성한다.
    두 방식의 차이점은 성능 차이인데, invoke시 성능이
    차이가 나게 된다, CGLib (Code Geneator Library)의
    경우에는 처음 메소드가 호출된 당시 동적으로 타겟 클래스의
    바이트코드를 조작하게 되고, 그 이후 호출 시부터는 변경 된
    코드를 재사용한다, 따라서 매번 검증 코드를 거치는
    1번 방식보다는 빠르다, 또한 리플렉션에 의한 것이 아닌
    바이트 코드를 조작하는 방식이기 때문에 성능 면에서 우수함,
  • CGLIb 방식에는 다른 단점이 있었으나 스프링 4.3,
    스프링부트 1.3 이후부터 해당 부분이 개선되어
    기본 core 패키지에 포함되게 되었고, 스프링에서 기본적으로
    사용하는 프록시 방식이 CGLib 방식이 되었다.

[스프링 WEB]

※ 점점 더 중요한 내용들이 나오고 있다,
태풍으로 인해 스터디는 못하고 집에 얼른 귀가해서
노트북에 스프링web 개발환경 셋팅과 수업 영상 시청과
자바 추상클래스, 인터페이스, 기본클래스 부분도
정리하며 공부를 해야겠다, 화이팅!

profile
야구선수 출신 개발자

0개의 댓글