전체 글

전체 글

    [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 함수는 전체 결과 값을 조회해야 하기 때문에 성능 이슈가 발생하..

    [Clean Code] 만들면서 배우는 클린 아키텍처 후기

    프로젝트에 헥사고날 아키텍처를 도입하면서 접하게 된 책이다. 첫 장부터 마지막 장까지 빠트릴 내용없이 굉장히 흥미롭게 읽었다. 책을 읽기 전, 읽은 후를 되새김질하며 계층형 아키텍처에서 헥사고날 아키텍처로 변환하면서 느낀점들을 서술하고자 한다. 계층형 아키텍처의 문제점 프로그램의 아키텍처가 데이터베이스에 의존하게 된다 당연히 어플리케이션 데이터의 기반은 데이터베이스가 아닌가? 라고 생각할 수 있다. 물론 어느정도 맞는 말이다. 모놀로틱 서비스에선 하나의 데이터베이스 모델만을 기반으로 아키텍처를 설계했고, 외부에서 데이터를 가져오는 일이 드물었다. 하지만 서비스는 점점 거대해지고 MSA 로의 변환이 필수가 되어버린다. 이렇게 되면 도메인 모델은 web에서 뿐만 아니라 gRPC, kafka 등등 다양한 인프..

    [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가 나오게 되었는데, 다른 로깅 프레임워크보다 많은 처리..

    [AWS] LocalStack을 사용하여 S3 Bucket에 파일 업로드/다운로드

    개발을 하다보면 데이터베이스, 파일 저장소 등 인프라를 필연적으로 사용하게 된다. 하지만 로컬 환경, 테스트 환경에서도 실제 구동되고 있는 머신을 사용하는 것은 불필요한 자원들을 소모할 수 있다. 통합 테스트를 격리된 환경에서 진행할 수 없다는 단점도 있다. 이를 위해 나온 솔루션이 바로 LocalStack 이다! aws의 서비스인 Lambda, S3, DynamoDB 등등 다양한 서비스를 로컬환경에서 구동할 수 있다. RDS, IAM 등 유료버전에서만 제공하는 기능, 서비스들도 있다. 로컬스택이 동작하는 방식이나 테라폼, 스프링 클라우드와 연동 등 더 다양한 설정이 궁금하다면 공식문서를 참조하자. 역시 공식 문서를 보는 것이 제일 정확하고 깔끔한 것 같다. 환경설정 다른 블로그를 보면 보통 locals..