전체 글 361

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 차이)

어느날 AOP를 활용한 샤딩 라이브러리를 개발하던 중에 버그가 발생했다.아래는 개발한 라이브러리의 일부이다.@Component@Aspectpublic class ShardAspect { private final DataSourceFactory dataSourceFactory; @Before("@within(org.springframework.transaction.annotation.Transactional)") public void setDataSources(JoinPoint joinPoint) throws SQLException { // 구현 }}문제는 해당 라이브러리가 API 모듈에서는 동작했는데, 컨슈머 모듈에서는 동작하지 않았다.디버깅을 했는데 생성자 쪽 브레이크..

Server/Spring 2023.04.17

MySQL - 이모지(Emoji) 뒷 내용이 모두 잘리는 문제 해결!

개발 DB에는 데이터가 잘 저장되는데 실 서버 DB에서 데이터가 잘리는 문제가 발생했다. 확인해보니 문자열의 이모지 뒷 내용이 전부 잘린 것으로 확인해서 DDL을 각 DB의 DDL을 비교해봤다. (MySQL을 사용하고 있다.) 그런데 개발 서버 DDL과 실서버 DDL이 동일했다. 그런데 왜 데이터가 개발 서버에서만 잘렸지..? utf8 vs utf8mb4 개발 서버와 실서버의 컬럼은 모두 charset - utf8을 사용하고 있었다. utf8과 utf8mb4는 어떤 차이가 있을까? utf8 - 내부적으로 한 문자당 가변으로 최대 3바이트를 사용한다. utf8mb4 - 내부적으로 한 문자당 가변으로 최대 4바이트를 사용한다. 여기서 이모지는 4바이트를 차지한다. 즉 utf8mb4로는 표현할 수 있고, ut..

Database/SQL 2023.04.05

Java - (JDK17에서는) String vs StringBuilder

Java 관련된 질문 중 String과 StringBuilder의 차이를 묻는 경우가 많다. 우리는 잘 알고 있는가..? 흔히 알려진 Java 관련 질문 중에서도 잘못된 질문과 답이 아주 많다고 생각한다. 대표적인 것 중 CheckedException과 UncheckedException의 대표적인 차이가 트랜잭션이 롤백된다는 것이다. 사실 CheckedException과 UnCheckedException은 근본적으로 트랜잭션과 아무 관련이 없다 (https://www.youtube.com/watch?v=_WkMhytqoCc) (무지성으로 공부하면서 Ctrl + C, Ctrl + V 한 결과..) String과 StringBuilder의 차이도 너무 무지성으로 외우는 경우가 많다. (나도 그랬다.) Str..

Language/Java 2023.04.04

Clean Architecture - 헥사고날 아키텍처에서 테스트 작성하기!

테스트 피라미드일반적으로 테스트의 기본 전제는 만드는 비용이 적고, 유지보수하기 쉽고, 빨리 실행되고, 안정적인 작은 크기의 테스트들에 대해 높은 커버리지를 유지하는 것이다.하나의 단위(일반적으로 하나의 클래스)가 제대로 동작하는 지 확인할 수 있는 테스트는 단위 테스트이며, 여러 개의 단위를 넘는 경계나 아키텍처, 시스템을 결합하는 테스트는 비용이 더 비싸지고, 실행이 더 느려지며, 깨지기 쉬워진다.단위 테스트는 의존하는 다른 클래스들은 인스턴스화 하지 않고 테스트하는동안 필요한 작업들을 흉내(mock)만 내도록 대체한다.통합 테스트는 하나의 기능에 필요한 여러 유닛을 인스턴스화하고 데이터를 보낸 후 전체적인 기능을 테스트한다.시스템 테스트의 경우 애플리케이션을 구성하는 모든 객체 네트워크를 가동시켜 ..

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

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

Server/Spring batch 2023.03.27

Redis Cluster(레디스 클러스터) 이해하기!

해당 포스팅에서는 Redis cluster에 대해서 다룬다. Sharding 일반적으로 샤딩을 할 때 아래와 같이 Hash-Based Sharding을 사용할 수 있다. 문제는 위의 경우 샤드가 하나 늘어날 때마다 기존 데이터들을 전혀 다른 곳으로 이동시켜야 한다. Redis(레디스)는 이러한 점을 해결하고자 HashSlot을 사용한다. Redis는 16384개의 Hash Slot으로 Key 공간을 나누어서 관리한다. 각 키는 CRC16 해싱 후 16384로 Modulo Op(나머지 연산)를 하고 Hash Slot에 매핑한다. Hash slot은 각 노드들에게 나누어 분배한다. 이러한 과정으로 인해 새로운 샤드가 추가되더라도 모든 데이터가 영향을 받지 않고 Slot이 겹쳐지는 일부 샤드의 데이터만 옮겨주..

Database/NoSQL 2023.03.27

NoSQL - MongoDB 다양한 데이터 모델링 기법!

1. 너무 큰 배열 문제 아래 카페 서비스의 데이터 모델링을 한 예시가 있다. db.cafe.insertMany([ { _id: 1, name: "IT Community", desc: "A Cafe where developer's share information.", created_at: ISODate("2018-08-09"), last_article: ISODate("2022-06-01T10:56:32.00Z"), level: 5, members: [ { id: "tom93", first_name: "Tom", last_name: "Park", phone: "000-0000-1234", joined_at: ISODate("2018-09-12"), job: "DBA" }, { id: "asodsa123"..

Database/NoSQL 2023.03.21