일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- SpringBoot
- Android
- Proxy
- springdatajpa
- spring
- 알고리즘
- Thymeleaf
- db
- QueryDSL
- AOP
- java
- 스프링 핵심 원리
- Servlet
- 백준
- JDBC
- transaction
- pointcut
- jpa
- Spring Boot
- http
- Exception
- kotlin
- 그리디
- 김영한
- 자바
- 스프링 핵심 기능
- 스프링
- JPQL
- Greedy
- 인프런
- Today
- Total
목록인프런 (528)
개발자되기 프로젝트
템프릿 메서드 패턴 덕분에 변하는 코드와 변하지 않는 코드를 명확하게 분리함 로그를 출력하는 템플릿 역할을 하는 변하지 않는 코드는 모두 AbstractTeplate에 담아두고, 변하는 코드는 자식 클래스에서 각각 구현한다. 1. 이전에 작성한 코드 비교 //OrderServiceV0 코드 public void orderItem(String itemId) { orderRepository.save(itemId); } //OrderServiceV3 코드 public void orderItem(String itemId) { TraceStatus status = null; try { status = trace.begin("OrderService.orderItem()"); orderRepository.save(i..
1. AbstractTemplate Class AbstractTemplate 은 템플릿 메서드 패턴에서 부모 클래스이고, 템플릿 역할을 한다. 제네릭을 사용했다. 반환 타입을 정의한다. 객체를 생성할 때 내부에서 사용할 LogTrace trace 를 전달 받는다. 로그에 출력할 message 를 외부에서 파라미터로 전달받는다. 템플릿 코드 중간에 call() 메서드를 통해서 변하는 부분을 처리한다. abstract T call() 은 변하는 부분을 처리하는 메서드이다. 이 부분은 상속으로 구현해야 한다. public abstract class AbstractTemplate { private final LogTrace trace; public AbstractTemplate(LogTrace trace) { ..
1. 익명 내부 클래스 템플릿 메서드 패턴은 SubClassLogic1, SubClasLogic2처럼 클래스를 계속 만들어야 하는 단점이 있음. 귀찮아! 익명 내부 클래스를 사용하면 단점을 보완 가능함! 익명 내부 클래스를 사용하면 객체 인스턴스를 생성하면서 동시에 생성할 클래스를 상속 받은 자식 클래스를 정의할 수 있다. 이 클래스 SubClasJogic1처럼 직접 지정하는 이름이 없고 클래스 내부에 선언된 클래스여서 익명 내부 크래스라 함. 2. Test @Test void templateMethodV2(){ //상속 받으면서 구현 바로 함. AbstractTemplate template1 = new AbstractTemplate() { @Override protected void call() { l..
1. Template Method Pattern 2. AbstractTemplate 템플릿 메서드 패턴은 이름 그대로 템플릿을 사용하는 방식이다. 템플릿은 기준이 되는 거대한 틀이다. 템플릿이라는 틀에 변하지 않는 부분을 몰아둔다. 그리고 일부 변하는 부분을 별도로 호출해서 해결한다. AbstractTemplate 코드를 보자. 변하지 않는 부분인 시간 측정 로직을 몰아둔 것을 확인할 수 있다. 이제 이것이 하나의 템플릿이 된다. 그리고 템플릿 안에서 변하는 부분은 call() 메서드를 호출해서 처리한다. 템플릿 메서드 패턴은 부모 클래스에 변하지 않는 템플릿 코드를 둔다. 그리고 변하는 부분은 자식 클래스에 두고 상속과 오버라이딩을 사용해서 처리한다. @Slf4j public abstract class..
1. Template Method - 예제1 @Slf4j public class TemplateMethodTest { @Test void templateMethodV0(){ logic1(); logic2(); } /** * 시간을 찍는 로직과, 비즈니스 로직이 섞여있음. */ private void logic1(){ long startTime = System.currentTimeMillis(); //비즈니스 로직 시행 log.info("비즈니스 로직1 실행"); //비즈니스 로직 종료 long endTime = System.currentTimeMillis(); long resultTime = endTime - startTime; log.info("resultTime = {}", resultTime); }..
하위 클래스 위임 - Template Method 1. Template Method Pattern?? 상위 클래스에서는 전체적인 흐름을 구현하고 구체적인 처리는 하위 클래스에 위임. 2. 의도와 동기 Operation에 알고리즘의 기본 골격 구조를 정의하고, 구체적인 단계는 서 bsh-developer.tistory.com 1. 로그 추적기 전후 비교. 로그 추적기 도입 전 //OrderControllerV0 코드 @GetMapping("/v0/request") public String request(String itemId) { orderService.orderItem(itemId); return "ok"; } //OrderServiceV0 코드 public void orderItem(String it..
1. Thread Lcoal 주의사항 Thread Local의 값을 사용 후 제거하지 않으면, WAS처럼 Thread Pool을 사용하는 경우에 문제가 발생할 수 있다. 2. 예시 사용자A가 저장 HTTP를 요청했다. WAS는 쓰레드 풀에서 쓰레드를 하나 조회한다. 쓰레드 thread-A 가 할당되었다. thread-A 는 사용자A 의 데이터를 쓰레드 로컬에 저장한다. 쓰레드 로컬의 thread-A 전용 보관소에 사용자A 데이터를 보관한다. 사용자A의 HTTP 응답이 끝난다. WAS는 사용이 끝난 thread-A 를 쓰레드 풀에 반환한다. 쓰레드를 생성하는 비용은 비싸기 때문에 쓰레드를 제거하지 않고, 보통 쓰레드 풀을 통해서 쓰레드를 재사용한다. thread-A 는 쓰레드풀에 아직 살아있다. 따라서 쓰..
1. Configuration 변경 동시성 문제가 있는 FieldLogTrace 대신에 ThreadLocalLogTrace 를 스프링 빈으로 등록하자. Configuration을 제외하고 코드 변경 없이 구현을 변경할 수 있다. - 다형성, ocp 준수! @Configuration public class LogTraceConfig { @Bean public LogTrace logTrace(){ return new ThreadLocalLogTrace(); } } 2. 실행 결과 동시성 문제가 발생하도록 요청을 여러 번 보낸다. 이 전과는 다르게 level이 누적되지 않고, traceId가 중복으로 사용되지 않는다. [io-8080-exec-10] : [d278b1ae] OrderController.requ..