전체 글
-
DB LockDB 2024. 12. 7. 21:57
실무에서 경험한 DB Lock에 대해 정리한 내용입니다. 평화롭던 어느 날 서비스에서 타임아웃이 떨어지며 장애가 발생했었습니다. 결제 승인 단계에서 데이터베이스에서 조회하는 과정에서 타임아웃이 떨어지며 Null Exception이 발생했습니다. 데이터베이스 idle transaction을 확인했을 때 idle이 full filled 상태였고 DB Lock이라는 결론을 내렸습니다. DB Lock이란데이터베이스는 DB 동시성을 보장하기 위해 트랜잭션에서 Lock을 겁니다. 쉽게 이야기 하자면 데이터를 수정하는 도중에는 수정되고 있는 데이터를 조회할 수 없게 Lock을 걸게 됩니다. UPDATE가 실행되던 중 SELECT가 실행되면 Lock이 걸리게 되고 UPDATE가 끝나면 Lock이 풀리며 Select가..
-
실무주의 자바 POI 라이브러리JAVA 2024. 11. 29. 22:30
안녕하세요. 신입 개발자로 다시 글을 쓰게 되었습니다. 회사 생활 이야기는 다음 편에 글을 써보도록 하며 오늘은 실무에서 자주? 사용되는 자바 POI라이브러리 사용해서 부장님한테 사랑받는 개발자가 되어봅시다. 잠깐 실무 이야기를 하자면 매일 아침 지급데이터가 나오는데 대량이체시 한 번에 100개의 계좌 밖에 못한다면 지급데이터를 100개씩 나눠 여러 개의 엑셀 파일로 만들어야 했습니다. 방법은 많습니다. 100개로 페이징처리된 목록을 다운로드하거나 100개 이상의 엑셀 파일을 직접 나눠도 됩니다. 저는 n개의 데이터를 pivot 만큼 나누고 여러 개의 엑셀파일을 압축하여 하나의 파일로 다운가능하는 것을 목표로 했습니다. 구현 방식은 입맛에 맞게 수정하시어 사용하시길 바랍니다. dependenciesde..
-
GraphQL API 왜 쓰는지 알아보기Server 2024. 4. 20. 00:48
GraphQL API란 무엇일까? 흔히 프런트는 화면에 뿌려줄 데이터를 서버로부터 받게 됩니다. 이때 RESTful API를 통해 데이터를 받게 됩니다. RESTful 함이란 uri에 동작이 명시되어 API를 요청할 때 결과를 예측가능하게 하여 원활한 협업을 위한 하나의 규칙입니다. REST API는 요청 당 하나의 스키마로부터 데이터를 응답받게 됩니다. 최근 앱은 하나의 화면이 여러 스키마들의 데이터로 구성되어 있기 때문에 비즈니스 로직에서 여러 스키마에게 REST API를 요청해야 합니다. 하지만 스키마의 모든 데이터가 화면을 구성하는 것이 아니기 때문에 화면에 구성될 데이터만 응답해줘야 했습니다. 이러한 배경에서 한번의 요청에서 필요한 데이터만 전달해 주는 GraphQL이 나오게 되었습니다. (Gr..
-
[JPA] 영속성 컨텍스트CS 2024. 4. 3. 23:46
Spring 프레임워크에서는 데이터베이스와 연동되어 데이터가 바뀌는 비즈니스 로직을 처리합니다. 데이터베이스와 연동하는 방법은 JDBC를 설치하고 쿼리를 작성하면 됩니다. 이때 Mybatis를 사용할 수도 있고 JPA를 사용할 수도 있습니다. 오늘은 Spring DATA JPA를 이용한 데이터베이스 연동을 할 때 내부에서 동작하는 과정 및 이슈에 대해 알아보려 합니다. JPA는 데이터베이스의 테이블을 엔티티라는 객체로 자바 애플리케이션에서 관리합니다. 이때 엔티티를 영속하게 관리하는데 이를 영속성 컨텍스트가 관리합니다. 그리고 JPA에서 자동으로 SQL문을 생성하고 데이터베이스에 질의를 날립니다. 영속한 엔티티는 영속성 컨택스트에서 관리되는데 몇 가지 상태를 가집니다. 엔티티의 상태 비영속(New) 영속..
-
[CS] RabbitMQ 멀티리스너 설정 시 패키지 통일CS 2024. 4. 3. 23:45
RabbitMQ를 사용할 때 멀티리스너 설정 시 발생하는 에러를 해결한 경험과 의존성에 관한 글입니다. RabbitMQ를 사용하기 위해서 큐에 메시지를 쓰는 애플리케이션과 메시지를 가져와 읽는 애플리케이션을 구현해야 합니다. 물론 하나의 애플리케이션에서 구현할 수 있지만 두 개로 구분할 수도 있습니다. 흔히 PUB/SUB 패턴 또는 단순히 Producer와 Consumer라고 표현하는데 앞서 설명했듯이 exchange에 바인딩된 queue에 여러 가지 타입으로 메시지를 추가할 수 있었습니다. 이 말은 Producer가 여러개 존재할 수 있는 구조입니다. [CS] RabbitMQ 기본 RabbitMQ는 오픈소스 메시지 브로커 소프트웨어이고 Erlang으로 구현되어 있습니다. 기본 프로토콜을 AMQP(Adv..
-
[CS] RabbitMQ 기본CS 2024. 3. 20. 14:42
RabbitMQ는 오픈소스 메시지 브로커 소프트웨어이고 Erlang으로 구현되어 있습니다. 기본 프로토콜을 AMQP(Advanced Message Queue Protocol)을 사용하고 있으며 플러그인으로 STOMP, MQTT 등의 프로토콜로 확장할 수 있습니다. RabbitMQ는 위와 같은 기본 구조로 이루어져 있습니다. Sender를 통해 RabbitMQ에 메시지를 전달하고 Receiver에서 큐를 읽어 들이는 메커니즘입니다. 그렇다면 RabbitMQ 내부에서 어떤 방법으로 큐에 메시지를 Push 하고 Pop 하는지 알아봅시다. RabbitMQ로 보낼 때 Sender에서 exchange로 보내지게 됩니다. 이후 exchange와 관계된 큐에 메시지가 Push 됩니다. 이때 exchange와 큐간의 관..
-
[CS] Java HashMap의 동작 과정CS 2024. 3. 1. 22:59
Java에서는 HashMap, HashSet 등 Hash를 사용한 자료구조를 사용하는데 HashMap의 동작 과정에 대해 알아봅시다. 우선 HashMap은 Key라는 유일한 값에 대한 Value를 O(1)의 시간복잡도로 구할 수 있습니다. 자세히 알아보기 전에 HashMap의 전체 동작과정을 확인해 봅시다. HashMap에 값을 추가할 때 Key의 해시 함숫값으로 hashcode라는 Key에 대한 유일한 값이 나오게 됩니다. 자바의 hashcode()의 리턴은 int 형으로 2^32 수로 표현가능하지만 입력으로 주어지는 Key는 2^32개 이상일 수도 또는 모든 HashMap이 2^32개의 버킷을 가지고 있을 수 없으므로 hashcode가 중복되는 경우가 발생하는데 이것을 해쉬충돌이라고 합니다. 해시충돌..
-
[CS] 자바 Minor GC, Major GC(Full GC)CS 2024. 1. 26. 23:37
Heap 영역에서 GC가 발생하는데 Young 영역과 Old 영역으로 이루어져 있습니다. [CS] 자바 Gabage Collection Gabage Collection : GC라고 하며 Heap 영역에서 참조되지 않는 객체의 자원을 해제해서 메모리 공간을 효율적으로 사용할 수 있게 도와줍니다. 하지만 GC가 동작하는 동안 다른 동작이 멈추게 되는데 devlog-jul95.tistory.com 이글 참조. Young 영역에서 발생하는 GC를 Minor GC라고, Old 영역에서 발생하는 GC를 Major GC 또는 Full GC라 합니다. Eden 영역에는 new로 생성된 새로운 객체가 옮겨집니다. 만약 Eden 영역에 객체가 가득 차게 된다면 Minor GC가 발생합니다. 이때 Eden 영역에서 Reac..