분류 전체보기 960

27. 프록시, 데코레이션 패턴 예제 틀 및 요구사항

@Slf4j @RestController public class OrderControllerV3 { private final OrderServiceV3 orderService; public OrderControllerV3(OrderServiceV3 orderService) { this.orderService = orderService; } @GetMapping("/v3/request") public String request(String itemId) { orderService.orderItem(itemId); return "ok"; } @GetMapping("/v3/no-log") public String noLog() { return "ok"; } } @Service public class Order..

26. 컨트롤러 인터페이스 및 수동 빈 등록

흐름 상 조금 뜬금없기는 하다. @RequestMapping @ResponseBody public interface OrderControllerV1 { @GetMapping("/v1/request") String request(@RequestParam("itemId") String itemId); @GetMapping("/v1/no-log") String noLog(); } 이게 인터페이스다. 보면 에노테이션까지 들어간다. 들어가야 한다고 한다. 컨트롤러는 @Controller 또는 @RequestMapping 둘 중 하나만 있으면 컨트롤러로 인식 한다. 단, @RequestMapping은 @Component가 안 붙어있어서 컴포넌트 스캔 대상이 아님. 보면 @GetMapping, @RequestPara..

25. 템플릿 콜백 패턴 적용

public interface TraceCallback { T call(); } 콜백용 인터페이스 하나 만들고, public class TraceTemplate { private final LogTrace trace; public TraceTemplate(LogTrace trace) { this.trace = trace; } public T execute(String message, TraceCallback callback){ TraceStatus status = null; try{ status = trace.begin(message); // 로직 T result = callback.call(); trace.end(status); return result; } catch (Exception e){ tra..

24. 템플릿 콜백 패턴

사실 기존거랑 똑같다. 콜백은 언어마다 다를 수 있는데, 자바의 콜백은 따지고 보면 앞서 했던 람다 방식 처럼 함수 하나만 있는 인터페이스에 람다식으로 주는 것 이다. 그래서, 이제 템플릿 콜백 패턴으로 만들면 public interface Callback { void call(); } 그냥 순수 콜백용 인터페이스 하나 구현하고, @Slf4j public class TimeLogTemplate { public void execute(Callback callback){ long startTime = System.currentTimeMillis(); // 비즈니스 로직 실행 callback.call(); long endTime = System.currentTimeMillis(); long resultTime..

23. 전략 패턴 인자로 받기

이전 까지는 미리 문맥 객체의 필드에 전략객체를 넣어 사용했다. 이번엔 아예 인자로 줄 것 이다. 이러면 코드가 훨씬 깔끔해 진다. @Slf4j public class ContextV2 { public void execute(Strategy strategy){ long startTime = System.currentTimeMillis(); // 비즈니스 로직 strategy.call(); long endTime = System.currentTimeMillis(); long resultTime = endTime - startTime; log.info("resultTime={}", resultTime); } } 구현 자체는 이렇고, @Test void strategyV2(){ ContextV2 context..

22. 전략 패턴 익명 및 람다

@Test void strategyV2(){ Strategy logic1 = new Strategy() { @Override public void call() { log.info("비즈니스 로직1 실행"); } }; ContextV1 context1 = new ContextV1(logic1); context1.execute(); } 이렇게 익명 클래스로 만들 수 있다. @Test void strategyV3(){ ContextV1 context1 = new ContextV1(new Strategy() { @Override public void call() { log.info("비즈니스 로직1 실행"); } }); context1.execute(); } 아예 이렇게 인자로 넣을 수 도 있고, public ..

21. 전략 패턴

기존의 템플릿 메서드 패턴은 알고리즘의 골격을 정의하고 일부 단계만 하위 클래스로 연기 하는 것이다. 하지만 이것은 상속의 단점을 가지고 간다. 자식 클래스가 부모 클래스를 강하게 의존하고 있다던지 등. 전략 패턴 또한 이런 변하는 부분과 변하지 않는 부분에 대한 해결을 제시하는 패턴이다. 전략 패턴은 템플릿 메서드 패턴 처럼 부모가 문맥(Context)를 가지고 있는 게 아닌, 문맥 객체에 로직 객체를 줘서 위임하는 방식이다. 즉, 문맥에 고정된 것을 넣고 로직 객체의 로직을 실행시키도록 한다 이렇게 문맥 객체를 하나 따로 만들고, 인터페이스를 만들어서, 로직들은 그 인터페이스를 상속 받아서 구현한다. @Slf4j public class ContextV1 { private Strategy strateg..

20. 템플릿 메서드 패턴 적용

public abstract class AbstractTemplate { private final LogTrace trace; protected AbstractTemplate(LogTrace trace) { this.trace = trace; } public T execute(String message){ TraceStatus status = null; try{ status = trace.begin(message); // 로직 T result = call(); trace.end(status); return result; } catch (Exception e){ trace.exception(status, e); throw e; } } protected abstract T call(); } 이렇게 가상 클래..

19. 익명 클래스

익명 클래스는 객체를 생성함과 동시에 오버라이드를(클래스를 정의) 할 수 있다. @Test void templateMethodV2(){ AbstractTemplate template1 = new AbstractTemplate() { @Override protected void call() { log.info("비즈니스 로직1 실행"); } }; AbstractTemplate template2 = new AbstractTemplate() { @Override protected void call() { log.info("비즈니스 로직2 실행"); } }; template1.execute(); template2.execute(); } 저렇게 가상 클래스를 new 하면 인텔리제이가 오버라이드 하는 틀을 만들어 ..

18. 템플릿 메서드 패턴 예제

@Slf4j public class TemplateMethodTest { @Test void templateMethodV0(){ loginc1(); loginc2(); } private void loginc1(){ long startTime = System.currentTimeMillis(); // 비즈니스 로직 실행 log.info("비즈니스 로직1 실행"); // 비즈니스 로직 종료 long endTime = System.currentTimeMillis(); long resultTime = endTime - startTime; log.info("resultTime={}", resultTime); } private void loginc2(){ long startTime = System.currentTi..