본문 바로가기

728x90
반응형

전체 글

(694)
스프링 AOP (3) - 실무 주의사항 프록시 내부호출 문제 스프링은 프록시 방식의 AOP를 사용합니다. 따라서 AOP를 적용하려면 항상 프록시를 통해서 대상객체(Target)을 호출해야 합니다. 그래야 어드바이를 통해서 정상적으로 호출되며 직접 호출하면 어드바이스가 적용되지 않습니다. 하지만, 대상 객체(Target) 내부에서 메서드 호출이 발생하면 프록시를 거치지 않아 직접 호출을 하고 제대로 AOP가 적용되지 않습니다. @Aspect public class CallLogAspect { @Before("execution(* hello.aop.internalcall..*.*(..))") public void doLog(JoinPoint joinPoint) { log.info("aop={}", joinPoint.getSignature()); ..
영어독서가 취미입니다 *개요 영어공부는 하나의 언어이기 때문에 왕도가 끝이 없습니다. 계속 보거나 듣지 않으면 까먹고 지칩니다. 몇 년 전에 축구 감독 무리뉴의 책을 해외배송으로 약 3권 정도 시켰었습니다. 그런데 영어가 너무 장벽이 높다는 생각에 읽지도 못하고 새책으로 구석에만 있던 것을 최근에 발견했습니다. 어떻게 하면 영어에 취미를 붙이고 관심을 가져볼까? 고민하며 책을 읽었습니다. 완벽한 영어란 없다 '어쩌면 완벽한 영어란 건 애초에 존재하지 않는 건 아닐까', 비영어권 외국인의 발음이 미국인처럼 될 수 없으며, 될 필요도 없어요. 100번 공부법, 유튜브 공부법, TED 공부법, 외국인과 잘 말하는 방법, 이러한 모든 방법들이 누군가에는 맞고, 누군가에게는 맞지 않을 수 있습니다. 하지만 분명한 건 이 모든 것들이 ..
물류 재고 관리 개선하기 개요 회사에서 재고 실사를 하면 전산과 실물재고가 다른 경우가 있었습니다. 이 문제를 해결하기 위해 현재 상황을 분석하여 원인을 파악하고 개선한 내용을 정리합니다. 1. 지점별 제품/부품 추천 갯수 개선하기 문제점 각 지점에서 고객에게 설치를 하기 위해 제품, 부품 재고를 주문하는데 재고가 많이 남거나, 부족해서 재고가 필요한 곳에 제대로 전달되지 못하거나 자주 주문해야 하는 경우가 있었습니다. 이를 개선해 한 번 주문할 때 적정 재고를 주문할 수 있도록 권장 주문수량, 최수 주문수량을 추가했습니다. 그럼에도, 각 지점에서 설치, 교환에 필요한 재고들을 주문하는데 수량 제한이 없다보니 재고가 마이너스로 관리되는 경우들이 있었습니다. 예를 들어, 창고에 있는 제품 A가 재고가 5개밖에 없는데 3개의 지국에..
스프링 AOP (2) - AOP 구현 및 예제 개요 스프링 AOP (1) 편에서는 JDK 동적 프록시, CGLIB와 스프링 프록시, 빈 후기처리를 통해 프록시의 생성과정 및 작동 방법에 대해 배웠습니다. 이번에는 스프링에서 AOP의 개념 및 사용법에 대해서 알아보겠습니다. AOP(Aspect Of Programming)이란? AOP의 Aspect는 '관점'이라는 뜻으로 AOP는 이름 그대로 애플리케이션에서 기능 하나하나를 횡단 관심사의 관점으로 보는 것입니다. AOP는 OOP 지향 프로그래밍에서 횡단 관심사를 깔끔하게 처리하기 위해 등장했습니다. 핵심 기능과 분리하여 공통의 부가 기능들을 AOP에 정의합니다. 이를 Aspect라 하며 스프링에서 제공하는 advisor는 advice(부가 기능 정의)와 pointcut(어디에 적용 할 것인가)을 가지고..
스프링 AOP (1) - 동적 프록시 개요 스프링에서 제공하는 AOP의 기능과 원리를 알아보겠습니다. 리플렉션, JDK 동적 프록시와 CGLIB 소개를 시작으로 스프링이 지원하는 프록시와 빈 후기처리를 알아보겠습니다. 리플렉션 리플렉션은 런타임에 클래스와 메서드의 메타정보를 사용해 애플리케이션을 동적으로 유연하게 만드는 기술입니다. 리플렉션은 스프링 프록시의 기본이 되는 기술이므로 개념을 알아야 합니다. 리플렉션은 런타임에 원하는 동작을 할 수 있다는 장점이 있지만 컴파일 시점의 오류를 잡을 수 없으므로 특별한 경우를 제외하고는 사용하면 안 됩니다. JDK 동적 프록시와 CGLIB 스프링에서 리플렉션 기반으로 동적 프록시를 사용하면 런타임 시 개발자를 대신하여 프록시를 생성해주고 다양한 동작을 할 수 있습니다. JDK 동적 프록시와 CGLI..
기존 로그를 스프링 AOP 로 개선하기 개요 회사에 로그가 상세하게 기록되지 않아서 오류를 확인하기 힘들었습니다. AOP를 활용해 비지니스 코드에 따로 로그를 작성하지 않고도 원하는 곳에 작성할 수 있도록 개발했습니다. 기존의 로그 방식 Front, Admin 2개의 프로젝트가 있는데 이 중에 Admin 프로젝트는 로그가 아래처럼 각 Controller의 시작시에 찍혀 있습니다. 이는 비지니스 로직에 의미없는 불필요한 코드 추가이며 새로운 메서드가 생성될 때마다 수동으로 작성해야 합니다. 또한 로그 규칙이 변경된다면 모든 메서드의 로그 코드를 수정해야 하는 불편함이 있습니다. 로그는 각 메서드마다 공통으로 기능이 필요한 부분으로 관점 지향 프로그래밍이 필요합니다. 따라서 스프링 AOP를 사용해서 로그 체계를 새롭게 잡았습니다. 스프링 AOP의..
UNION을 CASE WHEN THEN으로 개선하기 개요 회사에서 사용하는 기존 통계 쿼리가 5개의 UNION으로 연결되어 있었습니다. 중복되는 코드가 엄청 많았고 약 150줄이었습니다. COUNT, SUM 등을 이용하여 개선을 할 수 있다고 판단하여 UNION을 CASE WHEN THEN을 개선했습니다 문제상황 GROUP BY를 통해서 크게 3개의 덩어리를 합쳐야 했는데, 각 덩어리는 GIRO_PBLC_YN 칼럼 값에 따라서 2개로 나뉩니다. '총 건수'를 계산하는 쿼리문 하나와, '지로발행 안함' 전용 쿼리가 합쳐집니다. 쿼리는 아래와 같습니다. SELECT REQ_DT, FILE_NM, CRE_DT, MAX(TOT_CNT) TOT_CNT, MAX(TOT_CNT_N) TOT_CNT_N, MAX(TOT_REQ_AMT) TOT_REQ_AMT FROM (S..
갑작스런 문제 해결하기(feat.워드 커닝햄의 "Hm... That's interesting.) 개요 오늘 회사에서 코드를 고친 부분에서 오류가 나서 제대로 파일 다운로드가 되지 않았습니다. 이 작업이 당장 급한 것은 아니었으므로 수정하고 다음날 하도록 안내를 했는데 실수를 맞닥뜨렸을 때 어떻게 대응해야 하는지 생각을 했습니다. 문제상황 기존에 사용하고 있던 쿼리문이 고도화되면서 WHERE절에 조건을 추가했습니다. 따라서 WHERE 조건에 따라서 SELECT 결과값이 달라집니다. 문제는 제가 A쿼리문이 한군데서만 쓰이고 있다고 생각해서 수정했는데, 알고보니 공통코드쪽에서도 같은 쿼리를 사용하고 있었고, 공통 쿼리 쪽 쿼리에는 WHERE절에서 NULL조건이 들어가 아무런 조회도 되지 않았고 파일 다운로드해도 아무런 데이터가 없었던 것입니다. 이 문제를 다루면서 김창준님께서 칼럼에 쓰신 내용이 떠올랐습..

728x90
반응형