일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- transaction
- Spring Boot
- spring
- 백준
- jpa
- 인프런
- 스프링 핵심 기능
- 스프링 핵심 원리
- 그리디
- kotlin
- Greedy
- AOP
- pointcut
- Android
- Proxy
- Exception
- 스프링
- 김영한
- 자바
- 알고리즘
- java
- Servlet
- QueryDSL
- http
- springdatajpa
- JPQL
- db
- SpringBoot
- Thymeleaf
- JDBC
- Today
- Total
목록인프런/[인프런] 스프링 핵심 원리 - 고급 (105)
개발자되기 프로젝트
1. 기존 요구사항 모든 PUBLIC 메서드의 호출과 응답 정보를 로그로 출력 애플리케이션의 흐름을 변경하면 안됨 로그를 남긴다고 해서 비즈니스 로직의 동작에 영향을 주면 안됨 메서드 호출에 걸린 시간 정상 흐름과 예외 흐름 구분 예외 발생시 예외 정보가 남아야 함 메서드 호출의 깊이 표현 HTTP 요청을 구분 HTTP 요청 단위로 특정 ID를 남겨서 어떤 HTTP 요청에서 시작된 것인지 명확하게 구분이 가능해야 함 트랜잭션 ID (DB 트랜잭션X) 2. 단점.. 하지만 이 요구사항을 만족하기 위해서 기존 코드를 많이 수정해야 한다. 코드 수정을 최소화 하기 위해 템플릿 메서드 패턴과 콜백 패턴도 사용했지만, 결과적으로 로그를 남기고 싶은 클래스가 수백개라면 수백개의 클래스를 모두 고쳐야한다. 로그를 남..
v3 - 컴포넌트 스캔으로 스프링 빈 자동 등록 이번에는 컴포넌트 스캔으로 스프링 빈을 자동 등록해보자. 1. OrderRepositoryV3 @Repository public class OrderRepositoryV3 { public void save(String itemId) { if(itemId.equals("ex")){ throw new IllegalStateException("예외 발생"); } sleep(1000); } private void sleep(int millis) { try { Thread.sleep(millis); } catch (InterruptedException e) { e.printStackTrace(); } } } 2. OrderServiceV3 @Service publi..
v2 - 인터페이스 없는 구체 클래스 - 스프링 빈으로 수동 등록 이번에는 인터페이스가 없는 Controller , Service , Repository 를 스프링 빈으로 수동 등록해보자. 1. OrderRepositoryV2 public class OrderRepositoryV2 { public void save(String itemId) { if(itemId.equals("ex")){ throw new IllegalStateException("예외 발생"); } sleep(1000); } private void sleep(int millis) { try { Thread.sleep(millis); } catch (InterruptedException e) { e.printStackTrace(); } }..
다양한 상황에서 프록시 사용법을 이해하기 위해 다음과 같은 기준으로 기본 예제 프로젝트를 만들어보자. v1 - 인터페이스와 구현 클래스 - 스프링 빈으로 수동 등록 v2 - 인터페이스 없는 구체 클래스 - 스프링 빈으로 수동 등록 v3 - 컴포넌트 스캔으로 스프링 빈 자동 등록 실무에서는 스프링 빈으로 등록할 클래스는 인터페이스가 있는 경우도 있고 없는 경우도 있다. 그리고 스프링 빈을 수동으로 직접 등록하는 경우도 있고, 컴포넌트 스캔으로 자동으로 등록하는 경우도 있다. 이런 다양한 케이스에 프록시를 어떻게 적용하는지 알아보기 위해 다양한 예제를 준비해보자. 1. v1 - 인터페이스와 구현 클래스 - 스프링 빈으로 수동 등록 지금까지 보아왔던 Controller , Service , Repository..
1. 정리 지금까지 우리는 변하는 코드와 변하지 않는 코드를 분리했다. 템플릿 메서드 패턴, 전략 패턴, 그리고 템플릿 콜백 패턴까지 진행하면서 변하는 코드와 변하지 않는 코드를 분리했다. 그리고 최종적으로 템플릿 콜백 패턴을 적용하고 콜백으로 람다를 사용해서 코드 사용도 최소화 할 수 있었다. 2. 한계 지금까지 설명한 방식의 한계는 아무리 최적화를 해도 결국 로그 추적기를 적용하기 위해서 원본 코드를 수정해야 한다는 점이다. 클래스가 수백개이면 수백개를 더 힘들게 수정하는가 조금 덜 힘들게 수정하는가의 차이가 있을 뿐, 본질적으로 코드를 다 수정해야 하는 것은 마찬가지이다. 지금부터 원본 코드를 손대지 않고 로그 추적기를 적용할 수 있는 방법을 알아보자. 그러기 위해서 프록시 개념을 먼저 이해해야 한..
1. Callback public interface TraceCallback { T call(); } 2. TraceTemplate TraceTemplate 는 템플릿 역할을 한다. execute(..) 를 보면 message 데이터와 콜백인 TraceCallback callback 을 전달 받는다. 제네릭을 사용했다. 반환 타입을 정의한다. public class TraceTemplate { private final LogTrace trace; public TraceTemplate(LogTrace trace) { this.trace = trace; } public T execute(String message, TraceCallback callback){ TraceStatus status = null; ..
Context --> Template Strategy --> Callback 1. Callback 인터페이스 public interface Callback { void call(); } 2. TimeLogTemplate template는 호출할 callback을 전달 받는다. 전달된 callback은 클라이언트 코드 쪽에서 실행되는 것이 아니라 template 안에서 실행됨. 템플릿 콜백 패턴은 전략 패턴과 모든 것이 동일한데 전략을 익명 내부 클래스로 정의해서 사용한다. @Slf4j public class TimeLogTemplate { public void execute(Callback callback){ long startTime = System.currentTimeMillis(); //비즈니스 로..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bxPt8T/btrlTlbwh6k/D6kKwotduCfioXTUOp8UFK/img.png)
ContextV2는 변하지 않는 템플릿 역할을 한다. 그리고 변하는 부분은 파라미터로 넘어온 Strategy의 코드를 실행해서 처리한다. 이렇게 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 Callback이라 한다. 템플릿 콜백 패턴은 전략 패턴의 변형으로, 스프링의 3대 프로그래밍 모델 중 하나인 DI(의존성 주입)에서 사용하는 특별한 형태의 전략 패턴이다. 템플릿 콜백 패턴은 전략 패턴과 모든 것이 동일한데 전략을 익명 내부 클래스로 정의해서 사용한다는 특징이 있다. 1. Callback 정의 프로그래밍에서 콜백(callback) 또는 콜애프터 함수(call-after function)는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉..