Java

    [Spring] WireMock 을 사용한 HTTP Client 유닛테스트

    개인 깃허브에서 Riot API를 사용하여 리그오브레전드 게임 관련 어플리케이션을 만들고 있었다. 하지만 API가 어떻게 만들어졌는지 모르겠지만.. 정상적인 API 요청을 보내도 실패할때가 있고 몇 초 뒤에 아무렇지 않게 성공 응답을 반환한다. 😱 뼈져리게 Retry의 필요성을 느꼈다. 해당 기능을 개발하면서 비정상적인 응답이 왔을때 Retry, 예외 처리에 대한 테스트 코드를 작성하기 위해 응답 값 모킹이 필요했고, 이를 위해 WireMock을 사용하게 되었다. 작성한 테스트 및 고려한 사항들에 대해 공유하고자 한다. 본 글은 spring boot, gradle, java를 사용하고 http client는 feign, 테스트 프레임워크는 spock(groovy)를 사용한다. spring, spock 환..

    [QueryDsl] transform GroupBy

    요즘 querydsl에서 굉장히 유용하게 사용하고 있는 기능이 있는데, 바로 transform이다. document import static com.querydsl.core.group.GroupBy.*; Map results = query.from(post, comment) .where(comment.post.id.eq(post.id)) .transform(groupBy(post.id).as(list(comment))); 다음과 같이 querydsl에선 결과 값을 불러온 후 메모리에서 원하는 자료형으로 변환할 수 있는 기능을 제공한다. 함수 이름이 groupBy 라고 해서 sql의 group by와 혼동될 수 있는데, query에서 group by를 사용하지 않는다. 대신 aggregation에 필요한 ..

    [JPA] JPQL, QueryDsl, Spring Data의 exists

    queryDsl의 exists 이슈에 대해서 알게된 계기가 있었는데, 바로 [우아콘2020] 수십억건에서 QUERYDSL 사용하기 이다. @Override public boolean exists(Predicate predicate) { return createQuery(predicate).fetchCount() > 0; } 기존 queryDsl에서 exists 함수를 사용하게 되면 내부적으로 count 함수, 정확히는 fetchCount 함수를 실행하여 반환하게 된다는 이야기이다. fetchCount는 exists query를 발생시키지 않고 count query를 발생시킨다. exists는 첫번째 결과 값을 만나면 반환하는 반면 count 함수는 전체 결과 값을 조회해야 하기 때문에 성능 이슈가 발생하..

    [Spring] Spring Batch에 Hexagonal Architecture를 적용해보자

    팀에서 클린 아키텍처와 유지보수를 위해 전반적으로 헥사고날 아키텍처를 적용하기로 했다. 이는 Spring Batch가 포함된 프로젝트도 포함이 되었는데, 헥사고날 아키텍처가 제대로 적용된 것 같지 않아서 내가 다시 설계해보자는 의미로 구현했다. 구글에 검색해도 Spring MVC 예시는 많이 나오는데, Spring Batch에 헥사고날 아키텍처를 적용한 예시는 잘 찾아볼 수 없는 것 같다. 마침 "직접 구현하며 배우는 클린 아키텍처"를 읽어서 바로 적용할 수 있었다. 책에 대한 후기는 다른 게시글에 남길 것 이다. 그래서 이번 포스팅은 batch 자체의 성능 개선, 기능 구현, 인프라 구성보다는 아키텍처 구성에 초점을 맞출 것이다. 또한 헥사고날 아키텍처의 기본적인 개념은 다루지 않으므로 기본 개념은 다..

    [Spring] Log4j2를 이용해 로깅해보자

    시스템이 실행되면서 필연적으로 에러가 발생하게 되는데, 시스템이 동작하는 과정을 하루종일 모니터링하고 있을 순 없다. 그렇기 때문에 로깅을 통해 시스템의 상태와 정보를 기록해두어야 한다. 너무 세세한 정보를 기록하면 방대한 양의 로그가 쌓여 원하는 정보를 얻기 힘들기 때문에 적절한 포맷과 정보를 로깅하는 것이 중요하다. Log4j? Logback? Log4j2? Spring에 로깅 구현체를 검색하다보면 해당 3가지의 구현체가 가장 많이 나온다. Log4j는 2015년에 지원이 중단된 오래된 프레임워크이고, Logback은 Spring의 spring-boot-starter-logging에서 지원해주는 디폴트 구현체이다. Logback 이후 Log4j2가 나오게 되었는데, 다른 로깅 프레임워크보다 많은 처리..

    [JAVA] JMH(Java Microbenchmark Harness)를 사용하여 성능 테스트를 해보자

    JMH(Java Microbenchmark Harness) 개발을 하다보면 이 로직보다 다른 로직이 더 빠를 것 같은데? 이 라이브러리 사용이 더 좋을 것 같은데? 하는 궁금증이 있다. 하지만 어플리케이션 단위로 성능을 측정하기엔 부수적인 로직들과 라이브러리가 들어가기 때문에, 함수 단위로 성능 측정을 하고 싶은 생각이 든다. 그렇다고 time함수를 사용해서 end time과 start time을 측정해서 성능 테스트 결과는 이러하다 라고 하기엔 warm up, 쓰레드 갯수 등 고려해야 할 사항들이 많다. 이러한 부분을 해결해주기 위한 성능 측정 프레임워크가 벤치마크 프레임워크이다. 특징 oracle의 jit compiler 개발자가 만들었기 때문에 타 benchmark framework보다 신뢰할 수 ..