📖
Kyu9's Repo
  • Library of mameil
  • 이슈 경험
    • 20230220_트랜잭션
    • 20230306_캐싱이슈
    • 20230722_테스트코드에서 @Transactional
    • 20230807_deadlock
  • 인턴 스터디
    • Gradle
    • Stream, Optional, 람다식
    • JVM의 메모리 구조, Garbage Collector
    • RESTful API
    • Microservice Architecture
    • HTTP
    • 웹서버란 무엇인가
    • Git Branch
    • TDD
    • Redis을 이용한 캐시
    • Thymeleaf
    • 정리가 필요한 자료들
    • SpringBoot Management
    • 테스크 코드 분할
  • 동아리 스터디
    • 기본 SQL 공부
      • SQL의 기본 개념
      • SELECT 문장을 이용하여 원하는 데이터 출력하기
        • 집합 연산자 사용하기
        • where절에 비교 연산자를 사용해보기
        • SELECT_EX
        • 산술 연산자 사용해보기
      • 단일 행 함수 사용
        • lower/upper 함수 사용하기
        • length함수 사용하기
        • concat함수 사용
        • substr/mid/substring 함수 사용
        • instr함수 사용하기
        • lpad/rpad 함수 사용하기
        • trim/ltrim/rtrim 함수 사용하기
        • replace 함수 사용하기
        • round 함수 사용하기
        • truncate 함수 사용하기
        • mod함수 사용하기
        • ceil함수 사용하기
        • floor함수 사용하기
        • power 함수 사용하기
        • Date fn(날짜 함수)
        • 형 변환 함수
        • 일반함수란
    • a-ha 실습
    • 혼자서 만들어본 게시판
    • AWS 강의
  • 학교 나머지 공부 자료
    • 웹프레임워크(Spring)
      • Spring이란?
      • Webframework1-1
      • Webframework1-2
      • SpringBoot의 특징
      • SpringBoot 생성 방법
      • Spring Data JPA
      • SpringBoot Security
      • SpringBoot HATEOAS
  • 공부 자료들
  • WS 온라인 자바 스터디
    • Week1(JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.)
    • Week2(자바 데이터 타입, 변수 그리고 배열)
    • Week3(연산자)
    • Week4(제어문)
    • Week5(클래스)
    • Week6(상속)
    • Week7(패키지)
    • Week8(인터페이스)
    • Week9(예외처리)
    • Week10(멀티쓰레드 프로그래밍)
    • Week11(Enum)
    • Week12(Annotation)
    • Week13(I/O)
    • Week14(Generic)
    • Week15(람다식)
  • 백준문제
    • 입출력과 사칙연산
      • We love kriii(10718)
      • 고양이(10171)
      • 개(10172)
      • A+B(1000)
      • A-B(1001)
      • AxB(10998)
      • A/B(1008)
      • 사칙연산(10869)
      • 나머지(10430)
      • 곱셈(2588)
    • for문
      • 구구단(2739)
      • A+B - 3(10950)
      • 합(8393)
      • 빠른 A+B(15552)
      • N 찍기(2741)
      • 기찍 N(2742)
      • A+B - 7(11021)
      • A+B - 8(11022)
      • 별 찍기 - 1(2438)
      • 별 찍기 - 2(2439)
      • X보다 작은 수(10871)
    • if문
      • 두 수 비교하기(1330)
      • 시험 성적(9498)
      • 윤년(2753)
      • 사분면 고르기(14681)
      • 알람 시계(2884)
      • 오븐 시계(2525)
      • 주사위 세개(2480)
      • 영수증(25304)
    • While문
      • A+B - 5(10952)
      • A+B - 4(10951)
      • 더하기 사이클(1110)
    • 1차원 배열
      • 최소, 최대(10818)
      • 최댓값(2562)
      • 숫자의 개수(2577)
      • 나머지(3052)
      • 평균(1546)
      • OX퀴즈(8958)
      • 평균은 넘겠지(4344)
    • 함수
      • 정수N개의 합(15596)
      • 셀프 넘버(4673)
      • 한수(1065)
    • 문자열
      • 아스키코드(11654)
      • 숫자의 합(11720)
      • 알파벳 찾기(10809)
      • 문자열 반복(2675)
      • 단어 공부(1157)
      • 단어의 개수(1152)
      • 상수(2908)
      • 다이얼(5622)
      • 크로아티아 알파벳(2941)
      • 그룹 단어 체커(1316)
    • 기본수학-1
      • 손익분기점(1712)
      • 벌집(2292)
      • 분수찾기(1193)
      • 달팽이는 올라가고 싶다(2869)
      • ACM 호텔(10250)
      • 부녀회장이 될테야(2775)
      • 설탕 배달(2839)
      • 큰 수 A+B(10757)
      • Fly me to the Alpha Centauri(1011)
    • 기본수학-2
      • 소수 찾기(1978)
      • 소수(2581)
      • 소인수분해(11653)
      • 소수 구하기(1929)
      • 베르트와 공존(4948)
    • 재귀
      • 하노이 탑 이동 순서(11729)
      • 피보나치 수 5(10870)
      • 별 찍기(2447)
    • 브루트 포스
      • 블랙잭(2798)
      • 분해합(2231)
      • 덩치(7568)
      • 체스판 다시 칠하기(1018)
      • 영화감독 슘(1436)
    • 집합과 맵
      • 숫자 카드(10815)
      • 문자열 집합(14425)
      • 숫자 카드2(10816)
      • 듣보잡(1764)
      • 대칭 차집합(1269)
      • 서로 다른 부분 문자열 갯수(11478)
    • 정렬
      • 수 정렬하기(2750)
      • 수 정렬하기 2(2751)
      • 수 정렬하기 3(10989)
      • 통계학(2108)
      • 소트인사이드(1427)
      • 좌표 정렬하기(11650)
      • 좌표 정렬하기2(11651)
      • 단어 정렬(1181)
      • 나이순 정렬(10814)
      • 커트라인(25305)
      • 좌표압축(18870)
    • 백트래킹
      • N과 M - 1(15649)
      • N과 M - 2(15650)
      • N과 M - 3(15651)
      • N과 M - 4(15652)
      • N-Queen(9663)
      • 스도쿠(2580)
      • 연산자 끼워넣기(14888)
      • 스타트와 링크(14889)
    • 이분 탐색
      • 수 찾기(1920)
    • 동적계획법
      • 피보나치 함수(1003)
      • 신나는 함수 실행(9184)
      • 01타일(1904)
      • 파도반 수열(9461)
      • RGB거리(1149)
      • 정수 삼각형(1932)
      • 계단 오르기(2579)
      • 1로 만들기(1463)
      • 쉬운 계단 수(10844)
      • 포도주 시식(2156)
      • 가장 긴 증가하는 부분 수열(11053)
      • 가장 긴 바이토닉 부분 수열(11504)
      • 전깃줄(2565)
      • LCS(9251)
      • 연속합(1912)
      • 평범한 배낭(12865)
      • 더하기(9095)
    • DFS와 BFS
      • 미로탐색(2178)
      • 바이러스(2606)
      • DFS와 BFS(1260)
      • 단지번호붙이기(2667)
      • 전쟁 - 전투(1303)
      • 숨바꼭질(1697)
      • 데스 나이트(16948)
      • 나이트의 이동(7562)
      • 녹색 옷 입은 애가 젤다지?(4485)
      • 음식물 피하기(1743)
      • A->B (16953)
      • 숨바꼭질 3(13549)
      • 숨바꼭질 2(12851)
    • 구현
      • 치즈(2636)
  • 프로그래머스 문제
    • SQL
      • Animal Table - Oracle
      • Animal Table - MySQL
      • Animal Table2 - Oracle
      • Animal Table 3,4 - Oracle
    • Lv1
      • 두 개 뽑아서 더하기
      • 제일 작은 수 제거하기
      • 문자열 내 p와 y의 개수
      • 예산
      • 자릿수 더하기
      • 두 정수 사이의 합
      • 같은 숫자는 싫어
      • 가운데 글자 가져오기
      • 수박수박수박수박수박수?
      • 나누어 떨어지는 숫자 배열
      • 2016년
      • 폰캣몬
      • 서울에서 김서방 찾기
      • 문자열을 정수로 바꾸기
      • 소수 만들기
      • 문자열 다루기 기본
      • 소수 찾기(에라토스테네스의 체)
      • 숫자 문자열과 영단어
      • 이상한 문자 만들기
      • 없는 숫자 더하기
      • 문자열 내림차순으로 배치하기
      • 문자열 내 마음대로 정렬하기
      • 약수의 개수와 덧셈
      • 콜라츠 추측
      • 자연수 뒤집어 배열로 만들기
      • 신규 아이디 추천
      • 비밀지도
      • 크레인 인형뽑기 게임
      • 실패율
      • 로또의 최고 순위와 최저 순위
      • 키패드 누르기
      • 정수 내림차순으로 배치하기
    • Lv2
      • 행렬의 곱셈
      • 영어 끝말잇기
      • 영어 끝말잇기
      • N개의 최소 공배수
      • 피보나치 수
      • 124 나라의 숫자
      • 짝지어 제거하기
      • 프린터
      • 다음 큰 숫자
      • 최댓값과 최솟값
      • 최소값 만들기
      • 숫자의 표현
      • JadenCase 문자열 만들기
      • 오픈채팅방
      • 영어 끝말잇기
      • 멀쩡한 사각형
      • 올바른 괄호
      • 위장
      • 기능개발
      • 더 맵게
      • 스킬트리
    • 완전탐색
      • 모의고사(Lv1)
      • 카펫(Lv2)
      • 소수 찾기(Lv2)
    • 정렬(Sorting)
      • K번째 수(Lv1)
      • 가장 큰 수(Lv2)
      • H-Index(Lv2)
    • 해시(Hash)
      • 완주하지 못한 선수(Lv1)
      • 전화번호 목록(Lv2)
    • 탐욕법(Greedy)
      • 체육복(Lv1)
      • 큰 수 만들기(Lv2)
      • 구명보트(Lv2)
    • 동적계획법(DP)
      • 정수 삼각형(Lv3)
    • 깊이/너비 우선 탐색(DFS/BFS)
      • 타겟 넘버(Lv2)
      • 네트워크(Lv3)
      • 단어 변환(Lv3)
  • 스프링부트 책
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
  • JPA 책
    • 프로젝트 세팅 및 기본설정
    • 영속성 관리 개념
    • 엔티티 매핑
      • 실습 예제
    • 연관관계 매핑 기초
      • 실습 예제
    • 다양한 연관관계 매핑
      • 다대일, 일대다 관계
      • 일대일, 다대다 관계
      • 실습 예제
    • 고급 매핑
      • 상속 관계 매핑
      • @MappedSuperclass
      • 복합 키와 식별 관계 매핑
      • 조인 테이블
    • 프록시와 연관관계 관리
      • 프록시
      • 즉시 로딩과 지연 로딩
      • 영속성 전이, 고아 객체
    • 값 타입
      • 임베디드 타입
      • 값 타입과 불변 객체
      • 값 타입의 비교, 컬렉션
    • 객체지향 쿼리 언어
      • JPQL part1
      • JPQL part2
      • JPQL part3
      • QueryDSL
      • NativeSQL
      • 객체지향 쿼리 심화
    • 응용 애플리케이션
      • 엔티티 설정
    • 스프링 데이터 JPA
      • 공통 인터페이스
  • Kotlin In Action
    • 코틀린의 특징
    • 코틀린의 기초
    • 함수 정의와 호출
    • 클래스, 객체, 인터페이스
    • 람다 방식
    • 코틀린 타입 시스템
    • 연산자 오버로딩과 기타 관례
    • 고차함수
    • 제네릭스
    • 애노테이션과 리플렉션
    • 코루틴
  • Oracle
    • Oracle 기본
    • Oracle 심화
  • SQL_연습
    • Revising the Select Query
    • Basic Select
    • Advanced Select
    • Basic Select 2
  • SQL 첫걸음(책)
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
    • Day 18
    • Day 19
    • Day 20
    • Day 21
    • Day 22
    • Day 23
    • Day 24
    • Day 25
    • Day 26
    • Day 27
    • Day 28
    • Day 29
    • Day 30
  • 더 자바 코드를 조작하는 다양한 방법
    • JVM 이해하기
    • 바이트코드 조작
    • 리플렉션
    • 다이나믹 프록시
    • 애노테이션 프로세서
  • 더 자바, 애플리케이션을 테스트하는 다양한 방법
    • JUnit5
    • Mockito
    • 도커와 테스트
    • 성능, 운영이슈, 아키텍처 테스트
  • 이펙티브 자바
    • item1 - 생성자 대신 정적 팩토리 메소드를 고려하라
    • item2 - 생성자에 매개변수가 많다면 빌더를 고려하라
    • item3 - 생성자나 열거타입으로 싱글턴임을 보증하라
    • item4 - 인스턴스화를 막기 위해선 private 생성자를 사용하라
    • item5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
    • item6 - 불필요한 객체 생성을 피하라
    • item7 - 다 쓴 객체 참조를 해제하라
    • item8 - finalizer와 cleaner 사용을 피하라
    • item9 - try-finally 보다 try-with-resources을 사용하라
    • item10 - equals는 일반 규약을 지켜 재정의하라
    • item11 - equals을 재정의하려면 hashCode도 재정의하라
    • item12 - toString을 항상 재정의하라
    • item13 - clone 재정의는 주의해서 진행하라
    • item14 - Comparable을 구현할지 고민하라
  • Elastic Search
    • 강의 Summary
    • Elastic Summary 개념 정리
    • Elastic Summary 적용 정리
  • 토비의 스프링 강의
    • 스프링부트 살펴보기
    • 독립 실행형 서블릿 애플리케이션
  • k8s
    • minikube 설치
    • jenkins 추가
  • Article
    • Choosing the Right MessageBroker
Powered by GitBook
On this page
  • 프록시란?
  • 다이나믹 프록시란?
  • 정리

Was this helpful?

  1. 더 자바 코드를 조작하는 다양한 방법

다이나믹 프록시

프록시란?

본인이 알고 있는 프록시란 IP 주소를 우회하는 IP 우회용 프록시 애플리케이션을 통하게되면 본인이 사용하고 있는 IP 주소가 아닌 다른 IP로 설정해서 웹에 접속하는 방식이다 즉, 웹페이지에서는 내가 진짜 내가 사용하는 IP 주소가 아닌, 프록시를 통해서 받거나 설정한 IP로 접속하는 것으로 보이는 것이다

이러한 개념인데 프록시 패턴이라고 하면 위의 개념과 비슷하다 프록시 패턴은 실제로 접근하려는 코드를 직접적으로 접근하지 않고 프록시 코드를 통해서 수정하거나 새로운 부가기능을 추가하는 방식이다

구현된 방식은 이러하다 설명하기 전, 우선 실제 접근하려고 하는 부분을 실객체라고 하겠다 프록시와 실객체와 서로 공유하는 인터페이스가 존재하고 해당 인터페이스 타입으로 프록시를 사용자가 사용하는 방식이다 물론 가운데에서 인터페이스가 존재하고 있기 때문에 -> 사용자는 직접 실객체에 대한 접근이 불가능하기 때문에 기존 객체의 함수를 수정하거나 부가기능을 추가하는 것들이 불가능하다 그래서 실객체에는 진짜 기본적인 기능만 들어가 있는 상태에, 그 실객체를 프록시로 빼서 부가적인 기능을 붙힐 때 이러한 패턴이 사용되기 좋다

만약에 사용하게 되면 단점은 실객체가 많아지는 순간, 그 많은 실객체의 수 만큼 프록시클래스를 하나하나 만들어줘야 하고, 반복되는 코드들을 다시 똑같이 구현해야하는 단점이 존재

다이나믹 프록시란?

다이나믹 프록시라는 것은, 위에서 프록시의 단점이였던 실객체가 많아지면 많아질수록, 일일이 만들어줘야하는 그런 고생을 없애기 위한 방식이다 실제 프록시 코드를 컴파일 시점에 만드는 방식이 아닌, 런타임 시점에 클래스 또는 인스턴스를 만드는 기술이다

생성하는 방법은 Proxy.newProxyInstance()이라는 함수를 사용해서 생성한다 첫 번째 인자로는 프록시로 만들고 싶은 클래스로더를, 그리고 두 번째 인자로는 해당 프록시가 어떤 인터페이스 타입의 프록시이냐를 표시하는 값을 넣어준다 그리고 마지막 인자로는 InvocationHandler 라고 해당 프록시가 호출되었을 때 어떠한 일을 할 것인지에 대한 설명 하고 실객체는 여기 내부에서 가지고 있어야한다 이렇게 newProxyInstance()를 이용하면 Object 객체를 생성하기 때문에 타입캐스팅을 사용해주어야함 하지만 유의해야하는 점은 클래스를 가지고는 만들 수 없다는 점이다 -> 자바를 기준으로는 항상 인터페이스만 만들 수 있다는 점을 기억하자

MyService service = Proxy.newProxyInstance(MyService.class.getClassLoader(), new Class[]{MyService.class}, 
    new InvocationHandler(){
        MyService myService = new MyService();
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
            return null;
        }
    });

사용자체는 이렇게 하지만 사실 invocationHandler는 생각보다 그렇게 유연하지 않다 단순하게 한 두개의 기능을 넣는다고하면 위에 코드를 만든 거 처럼 하면 되지만 계속 작성해야하면 끝도없이 늘어난다 그.래.서 스프링에서는 이러한 단점을 뜯어고쳐서 만들어둔게 있고, 그것을 보고 스프링 AOP라고 한다 스프링 AOP에는 프록시패턴을 인터페이스단위로 만들어두었다. 그래서 스프링 AOP를 프록시기반의 AOP라고 부르는 것이다

위에서 나왔던 클래스가 인터페이스를 가지고 있지 않는경우에는 프록시를 사용하지 못하냐? 그건 아니다 크게는 2가지의 라이브러리를 사용해서 만드는 것이 가능함 -> CGlib, ByteBuddy CGlib같은 경우에는 Enhancer.create(클래스.class, handler)로 해서 만들고 해당 handler는 MethodInterceptor를 통해서 위에서 만들었던 InvocationHandler를 통해서 생성하는 것이 가능하다 ByteBuddy는 new ByteBuddy().subClass(클래스.class).make().load(클래스.class.getClassLoader()).getLoaded()을 사용하게 되면 프록시 클래스가 튀어나오게 된다 그리고 리플렉션 코드에서 했던 방식으로 튀어나온 프록시 클래스에 대한 인스턴스를 생성해준다 이렇게 만들고 어떻게 원하는 작업을 넣을 것이냐 위의 생성하는 메서드체이닝 내부의 make() 메소드 전에 method()이라는 메소드를 넣어줘서 어떤 메소드에서 어떤 작업을 수정할 것이다를 표현 그리고 그 뒤에서는 intercept()이라는 메소드를 통해서 어떠한 작업을 할것인지등등을 넣어준다 그리고 InvocationHandler 같은 경우도 여기에서 구현한다

생성해서 사용하는 것은 대충 이런방식으로 사용하게 되는데, 필요하면 찾아서 쓰면 된다 하지만 문제는 모든 클래스에서 사용할 수 있는 것은 아니다 이렇게 서브 클래스를 만드는 방법의 단점은 우선 상속을 사용하지 못하는 경우에는 프록시를 만들 수 없다는 점이다 CGlib, ByteBuddy 두 가지 방법 모두 상속을 통해서 구현하는 방식이기 떄문에 private이 붙어있는 케이스이던가, final이 붙어있는 케이스는 사용할 수 없다는 단점이 있다 애초에 상속을 하게되면 하위클래스에서는 항상 부모 생성자를 호출하기 때문에 private이나 final이 붙어있으면 서브클래스를 생성할 수 없다 그렇다고 항상 클래스를 생성하면서 public하게 생성할 수는 없기 때문에 왠만하면 프록시를 사용하기 위해서는 인터페이스를 사용하자.. 그리고 애초에 프록시를 생성하는 케이스는 복잡하게 구현되있기 때문에 왠만하면 인터페이스를 가지고 있을 예정이기 때문에 잘 구현하자

정리

다이나믹 프록시의 기법은 런타임에 인터페이스 또는 클래스의 프록시 인스턴스 또는 클래스를 만들어서 사용하는 프로그래밍 기법이다

사용처는 다양하게 구현되어 있는데, 우리가 아는 것들은 크게 스프링 JPA, 그리고 Mockito, 스프링 AOP, 그리고 하이버네이트의 lazy initialization 등에서 크게 다이나믹 프록시를 사용해서 구현이 되어있다 원리를 이해하고 있으면 해당 라이브러리들을 파악하는데 이해하기 쉬울 것이라고 생각한다

Previous리플렉션Next애노테이션 프로세서

Last updated 3 years ago

Was this helpful?