2025/04 9

SOLID 원칙

시작작년에 회사에 입사를 하고, 이번에 추가 기능에 대한 프로젝트를 하나 맡았는데, 기존 구조나 코드가 조금 복잡한 감이 없지 않았다.개발 진행 중에, CTO님도 이 부분에 대한 문제를 기존부터 염두에 두고 계셔서, 이 참에 조금 대대적인 리팩토링을 하기로 했다.기존 로직을 건드리는 것이 어떻게 보면 조금 위험하긴 하다보니, 여태 이렇게 운영이 된 것 같다. 그런데, 하다보니 어떤식으로 리팩토링 하는 것이 좋은지에 대한 고민이 항상 있다보니 가끔은 머리가 아프기도 했다.개발을 하다보면 불필요한 로직이나 코드, 혹은 어느 한줄만 없어지면 다음 로직이 조금 간단해질 수 있는 여지가 있는 코드 등등 뭔가 조금 거슬리는 코드 들이 있는데, 이런 부분들을 좋게 개선하려다 보니 SOLID 원칙이 생각이 났다.생각이..

Kafka VS RabbitMQ

시작회사에서 로그 시스템을 개발을 해야하는데, 메시지 브로커를 사용하려고 한다.후보군은 RabbitMQ와 Kafka인데, 뭐가 적절한지 몰라서 알아보려고 한다.처음에는 둘 다 비슷하지 않을까 했는데, 돌아가는 구조가 약간은 다른 것 같다. 1. 메시지 브로커란?말 그대로 메시지를 중계해주는 역할.서비스끼리 서로 실시간으로 호출 안 하고, 메시지를 던져주면 알아서 꺼내서 쓰는 흐름. 2. Kafka vs RabbitMQ 간단 비교 KafkaRabbitMQ구조로그 기반큐 기반메시지 전달Consumer가 가져감 (Pull)Consumer에게 보냄 (Push)특징대용량 로그 스트리밍복잡한 메시지 라우팅일단, Kafka는 진짜 ‘로그 저장소’ 느낌이고,RabbitMQ는 ‘전통적인 큐 시스템’에 가깝다. 3. 언제..

ETC 2025.04.21

Database Table Lock

이번에 작업한 개발 내용 중, 데이터 컨버전이 필요한 부분이 있었는데, 해당 내용 실행 시, 테이블 락이 걸리면서 관련 테이블에 데이터를 쓸 수 없는(Write) 상황이 발생했다.테이블 락이란?트랜잭션이나 명령이 하나의 테이블 전체에 대해 잠금을 거는 행위락이 걸린 동안에는 다른 트랜잭션이 해당 테이블에 대해 읽거나 쓸 수 없다. 구분InnoDBMyISAM기본 락Row-level Lock (행 락)Table-level Lock (테이블 락)락 충돌 가능성낮음높음동시성높음낮음특징트랜잭션 지원트랜잭션 미지원우리는 InnoDB를 사용하기 때문에, InnoDB에서 테이블 락이 발생하는 대표적인 사례를 나열해보자.InnoDB에서 테이블 락이 걸리는 대표적 사례Foreign Key 제약 조건 충돌부모 테이블을 참조..

DB 2025.04.14

jenv 사용법 정리

1. 사용 계기아마 회사에서 추가적인 서비스를 구축하려고 보면, 기존에 사용중인 자바 버전 때문에 조금 고민하게 되는 순간이 있을 것이다. 기존 버전을 유지하며 새로운 시스템을 구축해도 되기는 하지만, 버전이 낮다면 올려서 개발해야 하는가에 대한 고민이 생긴다.현 상황이 그러한데, 현재 사용중인 자바 버전이 1.8 버전이다. 불과 몇년 전만 해도 공공기관 프로젝트를 나가보면 대부분 1.8을 사용하고 있고, 그 이상 버전은 보지 못한 것 같다. 최근 Spring boot 프로젝트를 생성해주는 웹을 들어가보니 기본적으로 17 버전 이상의 프로젝트만 생성해주고 있다. boot 자체적으로 17버전 이상을 권장하고 있는 것은 아닌가 생각해봤는데, 어찌됐든 계속해서 1.8 버전을 사용하기에는 보안이나 활용적인 측면..

ETC 2025.04.14

[MySQL] 테이블 파티셔닝

테이블 파티셔닝이란?하나의 큰 테이블을 논리적으로 여러 개의 파티션으로 나누어 저장하는 방식대량 데이터 처리에 효과적✅ 장점쿼리 성능 향상 → 파티션 프루닝(Partition Pruning)으로 특정 파티션만 조회데이터 삭제 속도 개선 → DELETE 대신 DROP PARTITION으로 빠르게 삭제INSERT 성능 향상 → 특정 파티션에만 추가테이블 크기 관리 최적화 → 데이터 분산 저장아카이빙 용이 → 특정 파티션을 파일로 저장 후 삭제 가능ℹ️ 파티션 프루닝: 조건에 따라 필요한 파티션만 조회하는 기법 ✅ 단점특정 쿼리에서 성능 저하파티션 키(파티션을 나누는 컬럼)이 조회 조건에 포함되어 있지 않으면 오히려 일반 테이블보다 느려질 수 있음인덱스 관리가 어려움파티션 키 외에 다른 컬럼을 인덱스로 추가..

DB 2025.04.14

[JAVA] DeferredResult

개념직역하면 지연된 결과.요청을 받는 쓰레드와 응답을 하는 쓰레드가 다르다.요청을 받게 되면, DeferredResult는 결과를 받기 전까지 대기하고, 결과가 셋팅되면 응답 처리한다.프로세스의 규모가 크고, 시간이 오래걸리는 작업을 실행할때 사용할 수 있다.논블로킹 IO이고, DeferredResult가 응답하기 전까지 다른 작업이 가능하다.📓 왜 사용하지?조금 시간이 걸리는 작업의 경우는 기능의 성능 저하를 일으킬 수 있다. 그렇기 때문에 해당 클래스를 활용하여 나중에라도 값을 응답 받을 수 있고, 그리고 그 동안 다른작업을 처리하기 위해 사용한다.📓 사용예시@SpringBootApplicationpublic class DemoApplication { static Queue> results = n..

카테고리 없음 2025.04.14

[JAVA] Thread safe

1. 개념Thread safe 란, 멀티 스레드 프로그래밍에서 여러 쓰레드로부터 동시에 접근하더라도 프로그램 실행에는 영향이 없는 것을 의미한다.2. 왜 사용할까?위에서 말했듯, 여러 쓰레드가 동시에 접근하더라도, 프로그램 실행에는 영향이 없어야 한다.영향을 주는 경우의 예시는, 쉽게는 데이터 변경이 일어나는 작업을 예로 들 수 있겠다.A라는 데이터를 1번 쓰레드가 변경을 시도하려했는데, 2번 쓰레드에서도 동시에 요청이 들어와서 변경을 시도하려한다.1번 쓰레드가 데이터 변경을 처리할때, 2번 쓰레드가 같은 시도를 하게된다면 어떻게 될까?1번에서 조회 후 변경작업을 한다고 치자, 조회 조건과 변경해야할 데이터가 같은 컬럼이라면, 2번에서는 조회할 데이터를 찾지 못 할수도 있다.혹은, 1번의 작업이 모두 끝..

카테고리 없음 2025.04.14

[JAVA] ReentrantLock, ReentrantReadWriteLock

1. 개념동시성을 제어할 수 있는 객체.synchronized 와 유사하나, 더 세밀한 제어와 확장된 기능을 제공함.2. 차이점ReentrantLock은 단일 잠금을 제공하고, ReentrantReadWriteLock의 경우는 읽기와 쓰기의 잠금을 별도로 관리할 수 있음.ReentrantLock은 선택적으로 공정한 잠금정책을 제공할 수 있지만, ReentrantReadWriteLock은 지원하지 않음.읽기 작업이 많은 경우, ReentrantReadWriteLock이 더 나은 성능을 보여줌.재진입의 의미!ReentrantLock에서 '재진입’이란 이미 특정 스레드에 의해 잠금이 획득된 상태에서 같은 스레드가 다시 그 잠금을 획득하는 것을 의미.3. ReentrantLockReentrantLock lock..

[JAVA] CompletableFuture

1. 개념자바에서 비동기 프로그래밍을 가능하게 하는 클래스.기존 Future 라는 인터페이스를 Implements📓 사용 이유자바에서 비동기 프로그래밍을 사용해야 하는 상황에 해당 클래스를 사용한다.그리고 Future라는 인터페이스가 있으나, 반드시 예외 처리를 해줘야 하는 부분이 있고,get() 함수를 사용하거나, 타임아웃을 걸어주기 전까지는 다른 작업을 할 수 없다.CompletableFuture의 경우는 다양한 상황의 비동기적 프로그래밍을 할 수 있고,때에 따라서는 동기적 흐름을 만들 수 있다.예를 들어, 메소드 A와 메소드 B의 관계에서, A와 B의 반환 값이 모두 필요한 상황이라면 A와 B를 동시에 실행하고, 두개의 메소드가 전부 완료되는 시점에 반환값들을 처리할 수 있다.다른 상황으로는, A..