Keep walking 👩🏻‍💻 465

Redis의 기초 개념을 이해해보자

목차Redis는 안써봐서 모르겠어요RDBMS vs NoSQLMySQL vs Redis스키마확장성트랜잭션Redis의 특징디스크 X , 인메모리 O = 빠름싱글 스레드 고가용성 (automatic fail over)기타참고 자료1. Redis는 안써봐서 모르겠어요2024년 한 해 동안 개발자 친구들과 얘기하면서 지식을 공유할 때, 빈번하게 사용됐던 문장은 위의 소제목이 아닐까 싶습니다. 현업에서는 MySQL만을 사용하다보니, 개인적으로는 NoSQL에 대한 경험이 전무한 상황이었습니다.이로 인해 아래와 같은 대화가 나눠진 적이 있었습니다.🙋🏻‍♀️ 어드민에서는 DB 테이블에서 extraData라는 컬럼을 하나 만들어두고, 그 안에 json 형식으로 key - value를 저장하고 -> 데이터를 역직렬화..

🖥️ CS/DB 2025.02.11

복합 인덱스의 순서는 중요하다

목차작성 계기인덱스란?인덱스 컬럼 기준복합 인덱스의 순서는 중요하다예시 사례 - 4개의 복합 인덱스1번 인덱스만 타는 경우1번, 2번 인덱스를 타는 경우2번, 1번 인덱스를 타는 경우 (역방향)1번, 4번 인덱스를 타는 경우2번 ~ 4번 인덱스를 타는 경우결론참고 자료0. 작성 계기현업에서는 쿼리 작성 후 해당 쿼리가 적절한지에 대한 판단을 DBA분께 문의를 드립니다.만약 성능이 좋지 못한 쿼리라면 개선책을 제시해주시며, 개발자는 이를 따라 쿼리를 수정하게 됩니다.개발자가 DB에 대한 깊은 이해를 하지 못한 상황에서도 적절성에 대한 유효성을 체크해주시니 좋은 일이지만,이에 의존하여 가끔은 내가 짠 쿼리가 제대로 인덱스를 타는지 아닌지를 모르는 경우가 발생합니다.특히 업무가 바쁘거나, 생각보다 단순한 쿼리..

🖥️ CS/DB 2025.01.06

@EntityListener와 @PostLoad의 이슈

목차findBy에서 왜 UPDATE 쿼리가 나가지?프로시저와 연관이 있을까?범인은 @EntityListeners일부 중요한 비즈니스 변수명은 임의의 값으로 변경했다는 점을 알아두자.1. findBy에서 왜 UPDATE 쿼리가 나가지?아래와 같은 비즈니스 로직이 있었다. @Override @MyProjectWriteTransactional // 커스텀 트랜잭션 어노테이션 public String changeMoney(ChangeMoneyCommand command) { // entity를 flush 하는 로직 // procedure를 콜 하는 로직 return MemberRatingQuery.getMemberRatingMandatory(command.memberId()).getMemb..

DB 데이터 동시성 이슈 해결법

목차작성 계기동시성 이슈의 원인해결책 (1) - 물리적 DB 1개 사용해결책 (2) - DB간의 동기화 (MQ)해결책 (3) - Kafka + 물리적 DB 1개 사용1. 작성 계기Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)의 강의를 듣고 인상 깊은 내용을 정리 중이다.현업에서는 Master DB 1대 Slave DB 1대로 레플리카구조로 이루어진 프로젝트가 대부분이다.만약 동일 서비스에 Master DB가 여러대일때의 상황을 고려해본 적이 별로 없다.(레플리카에 대한 설명은 클러스터링, 레플리카, 그리고 샤딩 게시글에서 확인해보자.)강의를 통해 학습했으니 내용을 정리해보자.2. 동시성 이슈의 원인해당 프로젝트에서는 USER SERVICE 에서 ORDER SERVICE API를 ..

🖥️ CS/DB 2024.11.13

동기, 비동기, 그리고 Batch의 thread-pool : thread-pool은 다다익선이 아닐까? (2)

동기, 비동기, 그리고 Batch에서 사용되는 thread의 지식을 정리한 글 입니다.내용이 긴 관계로 part를 나누어 업로드합니다.부족한 부분, 또는 잘못된 부분이 있으면 피드백을 남겨주시면 감사드리겠습니다. 🙆🏻‍♀️🙇🏻‍♀목차ThreadPoolExecutor의 가용 스레드를 최대로?내장형 Tomcat(WAS)의 가용 스레드를 최대로?Batch의 thread-pool은 다를까?결론참고 자료1. ThreadPoolExecutor의 가용 스레드를 최대로?ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue)/*corePoolSize = 최초 ..

[마이크로서비스 아키텍처 구축] 6. 분산 트랜잭션

해당 글은 마이크로서비스 아키텍처 구축에서 학습한 내용을 다룹니다.목차DB 트랜잭션분산 트랜잭션 - 2PC문제점 1 - 격리성 위배문제점 2 - 원자성을 지키기 어려움분산 트랜잭션, 그냥 안된다고 하라사가 (SAGA) 패턴사가 실패 모드사가 롤백롤백을 줄이기 위해 워크플로 단계를 재정렬사가 패턴 구현오케스트레이션형 사가코레오그래피형 사가혼합 (+ 분산 트레이싱)무엇을 사용해야 할까?사가 vs 분산 트랜잭션부록 - DB 분산 트랜잭션1. DB 트랜잭션기존 Monolithic에서 한 번에 동시에 2개의 데이터를 변경했을 경우,1개의 DB로 그림 6-1에서 단일 트랜잭션을 유도할 수 있다.그러나 MSA 분산환경에서는 그림 6-2 처럼 서로 다른 DB에 데이터가 적재되고, 이는 동일 트랜잭션 내에서 트랜잭션의 ..

IntelliJ에서 Gradle Build가 실패할 때 해결책

가끔 Gradle 프로젝트를 IntelliJ로 불러올 때 Gradle이 정상작동하지 않을 때가 있다.build에 실패한 로그라도 남으면 좋을텐데, 저렇게 밑도 끝도 없이 failed만 나올 때가 있다.향로님의 IntelliJ에서 Gradle 프로젝트가 작동안될때에 언급된 해결책을 시도했으나, 잘 해결되지 않았다.그러다가 발견하게된 해결책을 공유한다.먼저 좌측 패키지 구조에서 보이는 .idea 디렉토리를 제거하자.직접 패키지 위치를 찾지 않고 아래와 같이 터미널에서 명령어를 통해서도 제거가 가능하다.// 프로젝트의 루트 디렉토리에서 명령어를 입력하자rm -rf ./.idea그런 다음 File > Project Structure에 들어가보자.좌측의 Module로 들어간 다음, 만약 현재 프로젝트가 그대로 잔..

ThreadPoolExecutor vs ThreadPoolTaskExecutor

목차ThreadPoolExecutor (from Java)(1) Executors.newFixedThreadPool(2) Executors.newCachedFixedThreadPool(3) Custom ThreadPoolExecutorThreadPoolTaskExecutor (from Spring)정리Java의 ThreadPoolExecutor에 대한 전반적인 내용은 pompitzz님의 Java의 ThreadPoolExecutor, Spring의 ThreadPoolTaskExecutor를 참고했다.1. ThreadPoolExecutor (from Java) ThreadPoolExecutor는 자바 표준 라이브러리(java.util.concurrent)에서 제공하는 기본적인 thread-pool 구현체Ja..

[마이크로서비스 아키텍처 구축] 5. MSA 마이크로서비스 통신 구현 (2)

해당 글은 마이크로서비스 아키텍처 구축에서 학습한 내용을 다룹니다.목차MSA에서 DRY와 코드 재사용의 위험서비스 디스커버리DNS동적 서비스 레지스트리1. MSA에서 DRY와 코드 재사용의 위험개발자라면 DRY(Don't Repeat Yourself), 즉, 반복하지 말라는 약어를 종종 듣게된다.동일한 작업을 수행하는 코드 라인이 많으면 코드 베이스가 필요 이상으로 커져 파악하기 어려워지며,동작을 변경하려고 할 때 해당 동작이 시스템의 많은 곳에 복제되어있다면 변경할때 누락되기 쉽다.때문에 DRY는 재사용할 수 있는 코드를 만들도록 유도한다.중복된 코드를 모아 추상화한 다음, 여러 곳에서 호출할 수 있으며, 아마도 어디에서나 사용할 수 있는 공유 라이브러리를 만드는 단계까지 갈 수도 있다.라이브러리를 통..