💡 김영한님의 스프링 핵심 원리 고급편 강의를 듣고 정리한 내용입니다.Overview앞서 전략 패턴에서 ContextV2는 변하지 않는 템플릿 역할을 한다. 그리고 변하는 부분은 파라미터로 넘어온 Strategy의 코드를 실행해서 처리한다. 이렇게 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 콜백(callback)이라 한다.콜백 정의프로그래밍에서 콜백(callback) 또는 콜애프터 함수(call-after function)는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있다. (위키백과 참고)쉽게 이야기해서 callback은 코드가 호출( call )은 되는데 코드를 넘겨준 곳의 뒤(..
💡 김영한님의 스프링 핵심 원리 고급편 강의를 듣고 정리한 내용입니다.Overview이번에는 동일한 문제를 전략 패턴을 사용해서 해결해보자.@Slf4jpublic class ContextV1Test { @Test void templateMethodV0() { logic1(); logic2(); } private void logic1() { long startTime = System.currentTimeMillis(); // 비즈니스 로직 실행 log.info("비즈니스 로직1 실행"); // 비즈니스 로직 종료 long endTime = System.currentTimeMillis(); ..
💡 김영한님의 스프링 핵심 원리 고급편 강의를 듣고 정리한 내용입니다.Overview로그 추적기 도입 전과 도입 후의 코드를 비교해보자. 로그 추적기 도입 전 - V0 코드// OrderControllerV0 코드 @GetMapping("/v0/request")public String request(String itemId) { orderService.orderItem(itemId); return "ok";}// OrderServiceV0 코드public void orderItem(String itemId) { orderRepository.save(itemId);}로그 추적기 도입 후 - V3 코드//OrderControllerV3 코드 @GetMapping("/v3/request")public Str..
문제 상황키즈핑 프로젝트를 진행하면서 이벤트 당첨자 조회에 캐싱을 적용하기로 했습니다.이에 따라, ConcurrentHashMap을 사용해 로컬 캐시를 직접 구현했습니다.아래 코드의 findWinner 메서드는 couponWinnerCacheStore에 캐시가 비어 있는 경우 DB에서 데이터를 가져와 couponWinnerCacheStore에 당첨자를 저장하여 DB와 캐시 데이터 간의 정합성을 유지하도록 설계했습니다. 단일 스레드 환경에서는 findWinner() 메서드를 통한 조회에 문제가 없다고 생각했습니다.하지만 멀티 스레드 환경에서는 상황이 달라질 수 있습니다.여러 스레드가 동시에 findWinner() 메서드에 접근할 수 있기 때문에, 결과적으로 updateTodayWinners() 메서드가 여..