IT/개발지식

    쿼리에서 비즈니스 로직을 걷어내자

    소스 코드를 보다보면 간혹 복잡하고 긴 쿼리를 맞딱뜨릴 일이 있다. 문제는 100라인이 넘어가는 긴 쿼리를 분석하고 수정해야 하는 경우다. 특히 쿼리가 어딘가 잘못되어 빠르게 고쳐야만 하는 상황이라면 눈앞이 아득하다. 아래 예시를 보자. SELECT A.ID, A.NAME, B.ADDRESS, A.NVL(GRADE, ""), CASE WHEN A.GRADE >= 4 THEN "Y" ELSE "N" END AS SCHOLARSHIP_CANDIDATE, C.PROFESSOR, A.PHONE, A.COMMENT FROM STUDENT A, CAMPUS B, PROFESSOR C, LECTURE D, MAJOR E WHERE A.PROFESSOR_ID = C.ID AND A.SCHOOL_ID = B.ID AND..

    Spring @Cacheable을 내부 메서드에 쓰면 안되는 이유

    자주 사용되면서 호출이 빈번한 데이터를 메모리에 쉽게 캐싱할 수 있도록 Spring에서는 @Cacheable을 제공한다. 하지만 아래 예제와 같이 내부 메서드에 @Cacheable을 설정하면 캐싱이 작동하지 않는다. @Slf4j @Service @RequiredArgsConstructor public class ProductService { private final productJpaRepository productJpaRepository; public ProductInfo getProductInfo(String productName){ List products = productJpaRepository.findAllByProductName(productName); long allProductCount =..

    Spark 개발 환경 구축하기 - Scala, IntelliJ, SBT

    Spark 애플리케이션을 개발에는 크게 Scala 또는 Python을 사용할 수 있다. 기존에 자바로 개발을 주로 해왔던 개발자라면 Scala를 선호할텐데 개발 환경 세팅을 할때 참조할만한 자료가 많지 않아 직접 프로젝트 세팅을 하며 정리해봤다. 시작하기에 앞서 세 가지 선결 사항이 있다. Spark 설치, 환경변수 설정 Scala 설치 IntelliJ Scala plugin 설치 설치 방법은 구글에서 쉽게 찾을 수 있다. 본 게시물 최하단에도 참고 링크를 걸어두었다. 1. 프로젝트 생성 이제 Scala, Spark, IntelliJ Scala plugin 설치는 모두 되어있다고 가정하고 IntelliJ 새프로젝트를 생성해보자. build tool을 선택하면 되는데 sbt가 recommended라고 되어..

    Spring Batch - Paging 처리시 주의점

    스프링배치의 ItemReader 중에서는 Paging 처리를 지원하는 것들이 있다. 대표적으로 JdbcPagingItemReader와 최근에 추가된 것으로 보이는 JpaPagingItemReader가 있다. 이외에 Spring Data repository를 사용할 수 있게 해주는 RepositoryItemReader도 Paging처리를 지원한다. 해당 ItemReader들을 활용해 Paging 처리를 할시, 데이터가 Skip현상이 발생할 수 있다. 아래와 같이 유저 상태가 '01'인 데이터들을 읽어들여 '02'로 업데이트 해주는 배치 애플리케이션이 있다고 가정해보자. 실제로는 select 쿼리에 페이징 처리도 들어가게 된다. 이렇게 페이징 처리를 했을때의 문제는 where 절에 조건 컬럼을 업데이트한다는..

    Springboot yaml 파일에 List 세팅하기

    yaml property에 list 형식의 데이터를 세팅해줘야 되는 경우가 있다. 이런 경우 두 가지 방식이 있는데, 먼저 아래와 같이 "- "(dash and space) 문법을 활용하면 자바에서 Collection 필드에 주입할 수 있다. my: servers: - dev.example.com - another.example.com 그러면 자바 코드에서는 아래와 같이 Collection 필드에 주입된다. dash 뒤에 공백을 한 칸 줘야하는 것을 꼭 잊지말자.@ConfigurationProperty 말고 @Value를 사용할 수도 있는데, @ConfigurationProperty는 bulk injection이 되므로 데이터가 계층 구조일때 편의성이 있다. 반면 단일 필드를 사용할때는 @value가 더..