Server 121

Gradle - DependencyManagement 이해하기!

멀티 모듈 프로젝트에서 외부 라이브러리를 사용할 때 고민이 있었다. A 프로젝트와 B 프로젝트와 C 프로젝트에서 모두 동일한 버전의 라이브러리를 사용해야 하는 상황 각 프로젝트의 build.gradle에서 라이브러리 의존성 버전을 일일이 동기화해줘야 한다. 이러한 문제를 잘 해결할 수 없을까..? dependency-management-plugin Gradle의 의존성 관리 플러그인(Dependency-management-plugin)을 사용하면 이를 해결할 수 있다. 의존성 관리 플러그인은 Maven과 같은 의속성의 관리 및 제외를 제공하는 Gradle Plugin이다. Gradle 6.8 이상 Java 8 버전 이상에서 지원된다. 사용하기 전에 DependencyManagement는 Gradle 플러..

Server/Gradle 2023.05.30

ATDD 이해해보기!

최근 TDD에 큰 관심이 생겨서 요즘 핫하다는 ATDD에 대해서와 TDD에 대해 더 깊게 이해하려고 했다. 강연을 찾던 중 NEXTSTEP에 ATDD, 클린 코드 with Spring이라는 좋은 강의 코스가 있는데, 가격이 80만원이다... ㄷㄷ https://edu.nextstep.camp/c/R89PYi5H/ 사실 조금 부담스러워서 우아한 ATDD라는 우아한 테크 세미나 발표가 있다. 아래는 해당 발표 내용을 공부하며 정리한 것이다..! 사실 메모에 가깝다. 인수 테스트 인수 테스트는 시나리오(사용자 스토리) 기반으로 기능을 테스트하는 것이다. 이러한 인수 테스트는 아래의 장점이 있다. 배포 없이 빠른 피드백을 받을 수 있다. 도메인과 서비스 파악에 큰 도움이 된다. QA 절차 없이 테스트 코드만으로..

Server/JUnit, Spock 2023.05.17

우아한 스프링 배치 강연내용 정리 (+ 통합 테스트 SpringTestContext Caching 팁!)

배달의 민족의 주문, 포인트, 정산 시스템에서 향로님께서 적용하면서 얻은 팁을 아래 강연에서 발표했다. https://www.youtube.com/watch?v=_nkJkWVH-mo Web vs Batch Web 실시간 처리를 위주로 한다. 상대적인 처리 속도를 가진다. QA가 용이하다. Batch 후속 처리를 위주로 한다. 절대적인 처리 속도가 측정된다. QA가 복잡하다. (DB나 자바 코드를 까봐야, 문제를 찾을 수 있기 때문) 철저한 테스트 코드가 반드시 필요하다. 배치 애플리케이션이 필요한 근거 아래의 경우에는 필수적으로 배치 애플리케이션이 필요할 수 있다. 일정 주기로 실행되어야 할 때 실시간 처리가 어려운 대량의 데이터를 처리할 때 배민에서는 매출의 경우 5억건 정도가 있고, 매출 상세의 경우..

Server/Spring batch 2023.05.02

Spring Batch - 기본 주요 도메인 이해하기!

Job Job은 배치 계층에서 가장 상위에 있는 개념으로 하나의 작업 자체를 의미한다. Job Configuration을 통해 생성되고 하나의 작업을 어떻게 구성하고 실행할 것인지 전체적으로 명세한다. 여러 개의 Step으로 구성되기 때문에 최소한 1개 이상의 Step을 구성해야 한다. Job의 경우 빈으로 등록한 후 수동으로 실행시킬 수도 있고, SpringBoot의 BatchAutoConfiguration에서 기본으로 빈으로 등록한 Job을 수행한다. Job 구현체 Job 구현체는 크게 두 가지로 나뉜다. SimpleJob 순차적으로 Step을 실행시키는 Job 모든 Job에서 유용하게 사용할 수 있는 표준 기능을 가지고 있다. FlowJob 특정한 조건과 흐름에 따라 Step을 구성하여 실행시키는 ..

Server/Spring batch 2023.04.24

HikariCP 커넥션 누수 해결기 (Session wait_timeout 적용!)

HikariCP 커넥션 누수 해결기 (Session wait_timeout 적용!) 아래의 에러가 뜨면서 커넥션 연결이 실패하는 이슈가 발생했다. the last packet successfully received from the server was 30,035 milliseconds ago. 조금더 로그를 올라가보니 이런 경고가 뜨고있었다. 아래와 같이 각 커넥션으로 연결을 시도하다가 모두 실패했다. 2023-04-18 08:01:12.345 WARN 20 --- [nio-8080-exec-9] com.zaxxer.hikari.pool.PoolBase : HikariPool-3 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@1d5d8..

Server/Spring JPA 2023.04.19

Spring - Kafka Producer, Consumer 설계하기!

아래는 이벤트 처리를 위해 Kafka Producer, Consumer를 설계하고 적용한 내용을 정리한 것이다. Kafka 자체에 대한 내용은 이전 포스팅을 참고하자. 참고: https://jaehoney.tistory.com/197 비즈니스 설명 필요한 비즈니스는 아래와 같이 표현할 수 있다. 메일 API가 사용자에게 요청을 받아서 발송 서버로 요청을 한다. 발송 서버는 메일을 발송한 후 비동기 이벤트를 통해 Kafka로 메시지를 전파한다. Consumer는 해당 메일 정보를 받아서 사용자 설정(Archive 설정)에 따라 메일을 영구히 보관한다. Kafka 설정 Kafka에서 Producer, Topic, Consumer에는 수 많은 설정이 있다. 해당 설정들은 성능, 가용성에 엄청난 차이를 불러온다..

Server/Spring 2023.04.17

Spring - @Component가 동작하지 않는 이슈?! (Bean과 Component 차이)

Kafka Consumer 모듈을 개발하던 중에 이상한 버그가 발생했다. (어떤 모듈인지는 크게 중요하지 않다.) 아래는 샤딩 처리를 위해 개발한 사내 라이브러리의 일부이다. @Component @Aspect public class SharedProcessor { private final SharedDataSourceManager shardDataSourceManager; @Before("@within(org.springframework.transaction.annotation.Transactional) || @annotation(org.springframework.transaction.annotation.Transactional)") public void setSharedInfo(JoinPoint jo..

Server/Spring 2023.04.17

스프링 배치(Spring Batch) 이해하기!

Spring Batch 자바에서는 표준으로 제공하는 일괄 처리(batch)를 위한 기술이 존재하지 않았다. 스프링 배치(Spring Batch)는 이러한 문제를 해결하기 위해서 Spring Source와 Accenture가 공동으로 개발하여 탄생했다. (Accenture는 배치 아키텍처를 구현하면서 쌓은 기술적인 경험과 노하우를 가진 기업) 배치(Batch) 활용 사례 아래의 처리가 필요할 때 배치를 사용할 수 있다. 주기적으로 배치 프로세스를 커밋 적당한 양의 데이터로 분할 처리 동시 다발적인 Job의 병렬 처리 의존 관계가 있는 step 여러 개를 순차적으로 처리 조건적 Flow 구성을 통한 체계적이고 유연한 배치 모델 구성 반복, 재시도, Skip 처리 작업의 진행상황 및 로그 추적 Batch P..

Server/Spring batch 2023.03.27

SpringBoot - zip 압축 및 다운로드 구현하기!

Spring 프로젝트에서 zip 다운로드를 구현한 내용을 공유한다. 요구사항은 아래와 같았다. 사용자로부터 GET 요청을 받으면 파일 시스템 내의 특정 폴더의 파일들을 zip 형태로 내려준다. Content-Type / Accept 스펙 설계 API를 설계하면서 Content-Type과 수용 가능한 Accept 설계가 필요하다. 아래의 두 가지 중 선택에 고민이 있었다. application/zip application/octet-stream 아래 부분 참고했을 때 application/zip이 IANA에 공식적으로 등록된 MIME 표준이라서 가장 적합한 솔루션이라고 한다. 참고 - stackoverflow 추가로 아래의 이유가 있어서 application/zip을 선택했다. zip 이외의 다운로드가 추..

Server/Spring 2023.03.10

Spring - 멀티 모듈을 적용하면서 (+ CQRS, 이벤트 기반 아키텍처 적용)

최근 사이드 프로젝트에서 멀티모듈을 적용하면서 생긴 문제점들과 해결 과정을 공유하고자 한다. 기존의 싱글 모듈 프로젝트를 아래 네 개의 모듈로 분리할 수 있었다. 멀티 모듈을 적용한 부분과 이벤트 기반 아키텍처를 적용한 부분에 대해 다룬다. 멀티 모듈 아래는 멀티 모듈을 적용해보게 된 이유에 대해 설명한다. 1. Write Back (주기 반영) 조회가 1회 발생할 때마다 조회 수를 매번 Update문으로 갱신하면 DB에 부하가 매우 커질 것이라고 판단했다. 쓰기 락으로 인해 처리량 감소 -> DB 커넥션 쌓임 TPS 저하 및 DB 서버 부하 상승 그래서 Write Back을 해서 일정 주기로 DB에 반영할 수 있도록 작업이 필요했다. 즉, Scheduler가 필요했다. API에 Scheduler를 추가..

Server/Spring 2023.01.25