본문 바로가기

소프트웨어-이야기

동시성 문제와 잠금 동시성 문제 (1) Lost Update한 트랜잭션의 변경 사항이 다른 트랜잭션에 의해 덮어씌워지는 현상을 말한다. 여러 트랜잭션이 동일 데이터를 읽고, 동시에 수정하려고 할 때 발생한다. (2) Write Skew여러 트랜잭션이 동시에 실행될 때, 각각의 트랜잭션이 다른 트랜잭션이 수행한 읽기 결과를 기준으로 조건을 확인하고 쓰기 작업을 수행함으로써, 전체 데이터베이스 상태가 일관되지 않게 되는 문제이다. 여러 트랜잭션이 동일 데이터를 읽고, 읽은 데이터를 기반으로 서로 다른 데이터를 수정할 때 발생한다. 주문, 재고, 판매상태 사례를 통해 Write Skew 개념을 파악해보자. 잠금 전략(1) 비관적 잠금 (Pessimistic Lock) 다른 트랜잭션이 데이터를 변경하려 할 가능성이 높다. 그러니 ..
데이터베이스 트랜잭션과 격리수준 Transaction트랜잭션은 작업의 완전성을 보장해주는 것을 말한다.논리적인 작업 셋을 모두 완벽하게 처리한다. --> 트랜잭션의 Commit 작업을 뜻한다.처리하지 못할 경우에는 원 상태로 복구한다. --> 트랜잭션의 Rollback 작업을 뜻한다.이렇게 작업의 완전성을 보장하여, partial update 문제를 방지한다.(a) partial update 문제partial update은 작업이 일부만 적용되는 현상이다.myisam 엔진과 Innodb 엔진 사례를 통해, 트랜잭션이 적용되지 않아 "partial update" 문제가 발생하는 사례를 살펴보자. (myisam 엔진은 트랜잭션을 지원하지 않는다.)위의 그림은 PK가 중복되는 레코드를 추가하여 오류가 발생했을 때, 엔진 별로 최종 데이터 결..
타임라인 회고 (Timeline Retrospective) 프로젝트 회고를 준비하며, GPT와 쿵짝쿵짝 정리한 시나리오를 정리한 자료입니다. 타임라인 회고는 1개월 이상 지속된 장기 프로젝트 회고로 적합한 방법입니다. 진행 방식은 다음과 같습니다. 준비물스티커, 네임펜, 3가지 색상의 포스트잇 진행방법1. 칠판에 타임라인을 그립니다. (5분)2. 포스트잇에 사건을 적어서 붙입니다. 따뜻한 감정은 빨간 포스트잇에, 차가운 감정은 파란 포스트잇에 작성합니다. (15분)3. 주요 사건들을 그룹핑합니다. (5분)4. 스티커를 5개씩 배부하고, 투표를 합니다. (5분)5. 투표를 받은 상위 사건들로 어떤 일이 있었는지 이야기를 나눕니다. (15분)6. 사건을 바탕으로 다음 5가지를 생각해봅니다. (15분) Achievements Surprises ..
VirtualThread 아는 체하기 (1) Virtual Thread이란?JDK 21에 추가된 경량 쓰레드이다. OS 쓰레드를 사용하지 않고 JVM 내부 스케줄링을 통해 쓰레드를 생성한다.수십만~수백만개의 쓰레드를 동시에 사용할 수 있다.(2) 일반 Thread이란?기존의 일반 Thread는 OS Thread를 그대로 매핑한 것이다. 이를 Platform Thread라고 한다.Java Thread는 실제로 OS Thread를 사용한 것이다. Thread를 생성할 때 커널 영역에 접근하기 위해, 시스템 콜을 해야한다. 이로 인하여 오버헤드가 발생한다.이러한 배경으로 생성 갯수가 제한적이고, 생성하고 유지하는 비용이 크다.그래서 Thread를 무한히 생성할 수 없기 때문에 Thread Pool으로 관리해왔다.미리 Thread를 만들어두고, 재..
Playwright을 활용한 비주얼 테스트: 스크린샷을 떠서 통채로 비교하기 Visual 테스트란? 애플리케이션 화면을 스크린샷으로 저장하여, 앱의 현재 상태와 비교하는 것을 말한다.E2E 테스트는 뷰의 동작을 검증한다면, Visual 테스트는 화면에 표시된 시각적인 부분을 검증한다. visual 테스트으로 수동 테스트 프로세스를 자동화하면, 브라우저 별로 데이터가 잘 뜨는지 매번 테스트를 하지 않아도 된다. Playwright이란? Playwright을 사용하면 UI를 캡쳐한 이미지 결과를 비교할 수 있다. Playwright 실습편 (1) 프로젝트 폴더를 만든 후, 냅다 설치! # Install node dependenciesnpm install -D @playwright/testnpm install -D typescript# Install playwright browser..
spring boot 3.2에서 HTTP 통신하는 방법 아는 체하기 RestClientRestclient가 등장했다. https://docs.spring.io/spring-framework/reference/integration/rest-clients.html#rest-restclient restclient와 virtual thread 조합을 사용하면, non blocking 통신을 쉽게 구현할 수 있다.  RestClient와 ClientRequestFactoryRestClient는 HttpClient를 사용한다. 그리고 이 값은 ClientRequestFactory으로 조정할 수 있다.ClientRequestFactory와 관련 클라이언트 정보는 다음과 같다. FactoryClient JdkClientHttpRequestFactoryJava’s HttpClient H..
시스템 설계 스터디 진행기 최근 커뮤니티를 통해 시스템 설계 스터디를 진행했다.스터디장으로 스터디를 준비하고, 진행했던 과정을 기록하고자 한다.  1. 그라운드룰 정하기 GITHUB PR Template 샘플## Checklist  - [ ] README 파일에 다음 요소가 모두 포함되어있는지 확인합니다.    * Requirements      * Functional      * Non-Functional      * Estimates    * Design    * API      * Reference  - [ ] 해당 기술이 활용되는 사례를 생각해봅니다.   - [ ] 참고하기 좋은 포스팅 사례를 찾아봅니다.   - [ ] 함께 고민해보고 싶은 주제나 키워드를 생각해봅니다. 2. 스터디 주제 선정하기 systemdesignfi..
[Spring] 유틸리티 클래스에 빈 생성자를 만들어야하는 이유 public final class AmericanoUtils { public static boolean isEmpty(String source) { return source == null || source.length() == 0; } } 위와 같은 유틸리티 클래스를 만들면, 소나큐브에서 "add a private constructor to hide the implicit public one" 워닝이 뜬다. 유틸리티 클래스에는 기본 생성자가 만들어져있어야하기 때문이다. 유틸리티 클래스에 왜 기본 생성자를 만들어야할까? 컴파일러는 생성자 코드가 없으면, 자동으로 기본 생성자를 생성한다. new AmericanoUtils(); 이 경우, 예상치 못한 방식대로 코드가 구현될 수 있다. 그래서 소나큐브는 기본..