본문 바로가기

프로그래밍 고찰/질문과 답변

[질문과 답변] 프록시 패턴이 뭐예요? / Spring 어노테이션과 Python 데코레이터

매번 카톡으로만 답해주기 아까워서 정리하는 컨텐츠

140% 뇌피셜 (뇌피셜 주도개발)

 

[백후배] 프록시패턴좀 알려줘요
[백후배] 봐도 이해가 안되네

프록시쓰면 프록시 패턴임

[백후배] 왜 굳이
[백후배] 저런짓을해요

AOP때 쓴다고 나오네

[백후배] 근데 aop구현에 쓰는데
[백후배] aop랑 연관성이 이해가 안가요

원래꺼 기능 냅두고
샤바샤바 하고싶잖아

[백후배] 하 ㅠ

데코레이터 패턴은 뭔지아냐

[백후배] 아뇨 ㅠ

안히
AOP가 머여
관점지향프로그래밍이자너
이건 존나 거창하게 AOP 라고 지어놨는데
사실 OOP 나 FP 처럼
뭐 있는게 아니라

방법론이여

[백후배] 그쵸
[백후배] 그 예시를 그거 봤거든
[백후배] 메소드 처음 끝 시간 기록해서 메소드별 실행시간 알고싶은데
[백후배] 모든 메소드에
[백후배] 넣을 순 없으니까

ㅇㅇ
그러면

[백후배] 어노테이션으로 뚝딱하면
[백후배] 만드는건 알겠는데

아니
어노테이션은
지금 안중요하고

[백후배] 제말이 그거죠
[백후배] 내부 돌아가는걸
[백후배] 모르겠어요 ㅜ

어노테이션은뭔데

[백후배] 걍 주석이죠

어노테이션이
어케 걍 주석이냐
그럼 주석을 달지 ㅜ

암튼 AOP하면
함수 앞뒤로
로그 남기는
기능을 추가하고 싶어
그럼

Log( 시작)
원하는거
Log(끝)


일케 코딩할꺼 아냐

[백후배] 그렇죠

그럼 원하는게
계속 바뀌는거니까
Log는 고정이고
원하는걸 파라미터로 받는다고 치자
그럼 함수로

 

WithLog( 원하는거)
{
Log(시작)
원하는거
Log(끝)
}


일케짜겟지?

[백후배] 그쵸

근데 OOP는
객체단위로 움직여야되니까
저렇게 코딩을 안하고
원하는게 꽥 Quack 이라는 함수라고 치면

프록시꽥 : IQuack
{
	IQuack "원래 원하는거 하는객채"
	void Quack ()
	{
	Log();
	"원래 원하는거 하는객채".Quack();
	Log();
	}
}

ㅇㅋ?

[백후배] 하
[백후배] 저게 프록시 클래스?

ㅇㅇ
원래라면

IQuack "원래 원하는거 하는객채" = "원래 원하는거 하는 클래스";
"원래 원하는거 하는객채".Quack();

했는데
로그 남기고 싶으면

IQuack 프록시 : 프록시 클래스 ; 프록시.Quack


하면 너는 이부분만 바꾸고,
함수호출하는데서는 어차피 인터페이스라
IQuack 에 있는 Quack 을 호출하는거니가
호출부분은 전혀 건들일 필요가없지
저 클래스 생성하는 부분만 바꿔주면
ㅇㅋ?

[백후배] ㅇㅎ
[백후배] 다형성이네

ㅇㅇ 이렇게
원래꺼 그대로 기능돌면서 + 알파하면
프록시인거고
원래꺼 기능에 기능을 추가하면 데코레이터 패턴임

[백후배] +알파랑
[백후배] 기능추가랑
[백후배] 같은거 아닌가요

하나하나 따지면 다르긴한데 걍 말장난임
예를들어서 로그다? 그럼
원래꺼 기능은 Fix로 고대로자너 그럼 알파고 프록시고
+50 해주는 함수에 내가 기능을 데코레이터 해서
+50 * 2 해주는걸로 감쌋다?
그럼 데코레이터임

그래서 저 Spring AOP 구현할 때처럼 파이썬에서도 어노테이션마냥 위에 @ 붙이거든?
그거 명칭이 데코레이터임

[백후배] 넹
[백후배] 파이썬에선 데코레이터라 부르는데
[백후배] 저번에 또 찾아보니까
[백후배] 엄연히 다르다고 하더라구요

걍 완전 다른거임
어노테이션은 메타정보를 주는거고
데코레이터는 진짜 데코레이터 해주는거임
어노테이션은 메타 정보를 주니까 그 메타정보에 따라서
컴파일 하기전에 니가 커스터마이징 하는거고
문법적으로 그 기능해주는게 없으니까,
메타정보주면 알아서 메타정보 분석해서 기능만드는건 프로그래밍 해야되는건데,
스프링 내부에 그걸 구현해둔거고

파이썬 데코레이터는 언어 차원에서 데코레이터를 구현되어있는거임

[백후배] 잘하시긴하네
[백후배] ㄹㅇ

728x90