전체 글 57

[컴퓨터 네트워크] TCP와 UDP

한양대학교 이석복 교수님 강의를 들으며 작성했습니다. TCP(Protocol)신뢰성 있고 순서가 보장flow control(receiver의 속도에 맞춰 데이터 보냄)congestion control(sender slow down sending rate when network congested)HTTP(Web), FTP(file transfer), Telnet(remote login), SMTP(email)UDP(Protocol)신뢰성 없음connectionlessstreaming media, teleconferencing, DNS, Internet telephony* 패킷은 비트 단위Packet switching VS Circuit switching1Mbps/s linkeach user: 100 kb..

[SPRING 고급] 프록시와 내부 호출, 프록시 기술 한계

프록시와 내부 호출-문제스프링은 프록시 방식의 AOP를 사용한다. 따라서 AOP를 적용하려면 항상 프록시를 통해서 대상 객체(target)을 호출해야 한다. 이렇게 해야 프록시에서 먼저 어드바이스를 호출하고 이후에 대상 객체를 호출한다.만약 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고 어드바이스도 호출되지 않는다.대상 객체의 내부에서 메서드 호출이 발생하면 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 발생한다. AOP proxy는 target.external()을 호출한다. 그런데 여기서 문제는 callServiceV0.external() 안엥서 internal()을 호출할 때 발생한다. 이떄는 CallLogAspect 어드바이스가 호출되지 않는다. 자바 언어에..

스터디/Spring 2025.01.08

[SPRING 고급] 포인트컷 지시자

📍포인트컷 지시자execution: 메서드 실행 조인 포인트를 매칭한다. 스프링 AOP에서 가장 많이 사용하고 기능도 복잡within: 특정 타입 내의 조인 포인트를 매칭args: 인자가 주어진 타입의 인스턴스인 조인 포인트this: 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트target: Target 객체(스프링 AOP 프록시가 가르키는 실제 대상)를 대상으로 하는 조인 포인트@target: 실행 객체의 클래스에 주어진 타입의 애노테이션이 있는 조인 포인트@within: 주어진 애노테이션이 있는 타입 내 조인 포인트@annotation: 메서드가 주어진 어노테이션을 가지고 있는 조인 포인트를 매칭@args: 전달된 실제 인수의 런타임 타입이 주어진 타입의 애노테이션을 갖는 조인..

스터디/Spring 2025.01.07

[SPRING 고급] @Aspect와 스프링 AOP

📍@Aspect 프록시스프링 애플리케이션에 프록시를 적용하려면 포인트컷과 어드바이스로 구성되어 있는 어드바이저(Advisor)를 만들어서 스프링 빈으로 등록하면 된다. 그러면 나머지는 앞서 배운 자동 프록시 생성기가 모두 자동으로 처리해준다. 자동 프록시 생성기는 스프링 빈으로 등록된 어드바이저를 찾고, 스프링 빈들에 자동으로 프록시를 적용해준다  @Slf4j@Aspectpublic class LogTraceAspect { private final LogTrace logTrace; public LogTraceAspect(LogTrace logTrace) { this.logTrace = logTrace; } @Around("execution(* hello.proxy.ap..

스터디/Spring 2025.01.03

[SPRING 고급] 빈 후처리기

📍빈 후처리기빈 등록 과정1. 생성- 스프링 빈 대상이 되는 객체를 생성한다. ( @Bean` , 컴포넌트 스캔 모두 포함)2. 전달- 생성된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에 전달한다.3. 후 처리 작업- 빈 후처리기는 전달된 스프링 빈 객체를 조작하거나 다른 객체로 바뀌치기 할 수 있다.4. 등록- 빈 후처리기는 빈을 반환한다. 전달 된 빈을 그대로 반환하면 해당 빈이 등록되고, 바꿔치기 하면 다른 객 체가 빈 저장소에 등록된다.  빈 후처리기를 사용하려면 `BeanPostProcessor` 인터페이스를 구현하고 스프링 빈으로 등록하면 된다.postProcessBeforeInitialization 객체 생성 이후에 @PostConstruct 같은 초기화가 발생하기 전에 호출되는 포스..

스터디/Spring 2024.12.31

[SPRING 고급] 프록시팩토리와 포인트컷,어드바이스,어드바이저

📍프록시 팩토리프록시 팩토리는 인터페이스가 있으면 JDK 동적 프록시를 사용하고, 구현 클래스만 있다면 CGLIB를 사용한다. 그리고 이 설정을 변경할 수도 있다스프링은 부가 기능을 적용할 때에 Advice라는 새로운 개념을 도입했다.개발자는 InvocationHandler나 MethodInterceptor를 신경쓰지 않고 Advice만 만들면 된다. 결과적으로 InvocationHandler나 MethodInterceptor는 Advice를 호출하게 된다.프록시 팩토리를 사용하면 Advice를 호출하는 전용 InvocationHandler, MethodInterceptor를 내부에서 사용한다. 특정 조건에 맞을 때 프록시 로직을 적용하는 기능도 공통으로 제공하기 위해서 Pointcut 이라는 개념을 ..

스터디/Spring 2024.12.29

[SPRING 고급] JDK 동적 프록시와 CGLIB

📍 리플렉션자바가 기본으로 제공하는 JDK 동적 프록시 기술이나 CGLIB 같은 프록시 생성 오픈소스 기술을 활용하면 프록시 객체를 동적으로 만들어낼 수 있다.쉽게 이야기해서 프록시 클래스를 지금처럼 계속 만들지 않아도 된다는 것이다.프록시를 적용할 코드를 하나만 만들어두고 동적 프록시 기술을 사용해서 프록시 객체를 찍어내면 된다.리플렉션 기술을 사용하면 클래스나 메서드의 메타정보를 동적으로 획득하고, 코드도 동적으로 호출할 수 있다.✔️ 주의리플렉션을 사용하면 클래스와 메서드의 메타정보를 사용해서 애플리케이션을 동적으로 유연하게 만들 수 있다.하지만 리플랙션 기술은 런타임에 동작하기 때문에, 컴파일 시점에 오류를 잡을 수 없다.예를 들어 getMethod("callA")를 실수로 getMethod("..

스터디/Spring 2024.12.27

[SPRING 고급] 프록시 패턴과 데코레이터 패턴

📍 프록시객체에서 프록시가 되려면, 클라이언트는 서버에게 요청을 한 것인지, 프록시에게 요청을 한 것인지 조차 몰라야 한다.서버와 프록시는 같은 인터페이스를 사용해야 한다. 그리고 클라이언트가 사용하는 서버 객체를 프록시 객체로 변경해도 클라이언트 코드를 변경하지 않고 동작할 수 있어야 한다.런타임(애플리케이션 실행 시점)에 클라이언트 객체에 DI를 사용해서 client->server에서 client->proxy로 객체 의존관계를 변경해도 클라이언트 코드를 전혀 변경하지 않아도 된다. 클라이언트 입장에서는 변경 사실 조차 모른다.DI를 사용하면 클라이언트 코드의 변경 없이 유연하게 프록시를 주입할 수 있다.프록시의 주요 기능1. 접근 제어-권한에 따른 접근 차단-캐싱-지연 로딩2. 부가 기능 추가-원래..

스터디/Spring 2024.12.24

[SPRING 고급] 템플릿 메서드와 전략 패턴, 템플릿 메서드 패턴

템플릿 메서드 패턴은 다형성을 사용해서 변하는 부분과 변하지 않는 부분을 분리하는 방법이다. -AbstractTemplate은 템플릿 메서드 패턴에서 부모 클래스이고, 템플릿 역할을 한다.  📍템플릿 메서드 패턴작업에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 연기한다.템플릿 메서드를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의 할 수 있다.부모 클래스에 알고리즘의 골격인 템플릿을 정의하고 일부 변경되는 로직은 자식 클래스에 정의하는 것이다. 결국 상속과 오버라이딩을 통한 다형성으로 문제를 해결하는 것이다 하지만 템플릿 메서드 패턴은 상속을 사용한다따라서 상속에서 오는 단점들을 그대로 안고 간다. 특히 자식 클래스가 부모 클래스와 컴파일 시점에 강..

스터디/Spring 2024.12.21

[SPRING 고급] 동시성 문제와 ThreadLocal 사용

1. Thread-A는 userA를 nameStore에 저장했다.2. Thread-B는 userB를 nameStore에 저장했다3. Thread-A는 userB를 nameStore에서 조회했다.4. Thread-B는 userB를 nameStore에서 조회했다. 📍동시성 문제Thread-A 입장에서는 저장한 데이터와 조회한 데이터가 다른 문제가 발생한다.이처럼 여러 쓰레드가 동시에 같은 인스턴스의 필드 값을 변경하면서 발생하는 문제를 동시성 문제라고 한다.이런 동시성 문제는 여러 쓰레드가 같은 인스턴스의 필드에 접근해야 하기 때문에 트래픽이 적은 상황에서는 확률상 잘 나타나지 않고, 트래픽이 점점 많아질수록 자주 발생한다.특히 스프링 빈처럼 싱글톤 객체의 필드를 변경하며 사용할때 이러한 동시성 문제를 조..

스터디/Spring 2024.12.17