전체 글

소프트웨어 개발자입니다. 더 많은 사람들이 양질의 지식을 습득하기 위한 생태계 구축에 기여하기 위한 공간입니다.
Computer launguage/Java

자바 NIO (1) 채널, 버퍼의 동작 과정을 간단한 채팅 서버/클라 애플리케이션 구현을 통해 리서치

자바 NIO는 세가지 주요 클래스를 사용합니다.간단하게 알아보고 채팅 서버와 클라이언트 애플리케이션을 만들어보죠. 1. Buffer, channelBuffer특정 원시(primitive) 타입 데이터의 컨테이너입니다. 원시 타입의 데이터들을 많이 담을 수 있는 통이라고 생각하면 편합니다. 한 곳에서 다른 장소로 데이터를 보내기 위해 사용되는 일시적인 공간이며, 채널을 위한 읽거나 기록된 정보를 보유합니다. Buffer에 대해 자세히 알려면 capacity, limit, postion에 대해 알고 있어야 합니다.capacity : 버퍼의 크기. 버퍼의 크기 만큼 데이터 요소를 담을 수 있다.position : 다음 읽거나 써야할 인덱스 위치. 그림1에 의하면 min까지는 데이터를 읽었으니 position은..

회고

2023 회고, Grow efficiently

인삿말 안녕하세요! 김민석입니다! 본 회고 글에서는 를 풀어 나갈겁니다. 문제 정의, 원인 분석, 해결 전략 등을 세세하게 적어보려해요:) 그럼 바로 시작하겠습니다! 타임라인(2023) 1월 ~ 2월: 카카오뱅크 인턴 수료 3월 ~ 4월: 인턴 때 진행한 과제 고도화(Link) 계좌 및 이체 시스템 기술 문서 URL | Built with Notion 2023.03 ~ 2023.04 excellent-snowshoe-c4c.notion.site 5월 ~ 8월: 취업 준비(Resume) 김민석 (Kim MinSuk) Resume | Built with Notion 💁‍♂️ Software engineer(Back-end) excellent-snowshoe-c4c.notion.site 9월 ~ 12월: 채널..

TIL/개발 칼럼

TDD 관점에서 테스트란? 장단점은?

테스트란? TDD 관점에서 테스트는 요구사항에 대한 명세. 주어진 상황에서 객체(혹은 서버)에게 요청을 보냈을 때 기대하는 결과 혹은 과정에 대한 명세. 기대하는 결과를 명세: 특정 Input에 특정 Output 약속 ex) 평균값 메소드는 (1,2,5) → (3)를 테스트 기대하는 행동 명세: A메소드 호출은 B,C,D를 2번씩 호출하는 것을 약속 💡 테스트는 요구사항을 구현한 동작에 대한 검증 아닌가? 테스트를 작성하는 동기의 차이라고 생각합니다. 구현한 코드가 원하는 대로 동작하고 다른 코드의 변화에 의해 테스트가 작성된 코드가 영향을 받지 않는 것에 테스트의 목적을 둔다면, 테스트는 요구사항을 구현한 동작에 대한 검증으로 바라볼 수 있습니다. 반면, 요구사항을 구현하기 전, 사용자가 서비스에게 바..

TIL/개발 칼럼

#7 타행 이체 개선기, 비관락 획득 후 외부 API 호출 최소화

📌 문제 상황 1. 즉각 요청-응답 프로세스는 외부 서비스와의 connection을 유지한 채 비관 lock을 잡기에, lock으로 인한 다양한 이슈가 외부 서비스로 전파될 위험 존재(ex. deadlock 발생시 connection도 대기) 2. 즉각 요청-응답 프로세스는 타행 이체(은행A→은행B 이체)를 2개의 API(이체 입금 요청 API, 이체 입금 완료 응답 API)로 구현하자는 은행 간 약속(프로토콜)을 무시하는 방법임. 📌 접근 방법과 해결과정 원인 분석 - 그림2 즉, 이체 입금 요청을 비동기로 처리하는 구조의 문제점 재파악. - 입금을 위해 비관 lock을 잡고 Network I/O를 하는 것이 가장 큰 문제라고 파악. - 특히 타행(이체 입금 역할)은 당행(이체 출금 역할)의 이체 내역..

TIL/개발 칼럼

Resume 링크

Resume by notion(도메인 내용 최소화) : https://excellent-snowshoe-c4c.notion.site/Kim-MinSuk-Resume-1238eab976484c3f86345913f638913f?pvs=4

TIL/개발 칼럼

#6 타행 이체 기능 성능 개선기, 속도(gap lock으로 인한 insert 병목 해결)

목차 1. 간단 요약 2. 사전 지식 3. 문제 상황 4. 접근 방법과 해결 과정 Gap lock 분석 현 설계의 문제점 로컬 테스트로 검증 개선 방향 성능 테스트 5. 결과 6. 배운점 ✍️ 간단 요약 OutBox 데이터를 polling 하는 스케줄러가 읽기 연산을 할 경우, connection은 (마지막 레코드, 무한대) 범위에 gap lock을 겁니다(MySQL ver 8.0 innodb, Repeatable-read 기준). 그로 인해 이체 출금의 insert 쿼리가 병목이 되어 TPS가 낮게 나왔었습니다. Read Committed로 변경한 결과, gap lock의 해제를 기다리지 않고 insert할 수 있게 됐습니다. 이는 Mean Test Time 감소로 이어져 tps를 86%(66.6 → ..

TIL/개발 칼럼

#5 타행 이체 기능 성능 개선기, 속도(이체 입금 요청 API 처리 전략)

목차 1. [문제 상황] 비동기가 너무 느린 현상 2. [원인 분석] 동기로 작동하는 경우(케이스) 존재 3. 이체 입금 요청 API 처리 방법별 장단점 4. API 로직 선정 및 테스트 5. 고민해봐야할 것 ✍️ 사전 지식 용어 당행 : 사용자로부터 이체 요청을 받고, 이체 입금을 진행하는 은행 타행 : 이체 과정에서 출금을 진행하는 은행 당행 이체 : 입금 은행과 출금 은행이 동일한 이체 타행 이체 : 입금 은행과 출금 은행이 다른 이체 OutBox 데이터 : 이벤트나 메시지를 DB에 있는 아웃박스에 저장해서 DB 트랜잭션의 일부로 발행하는 패턴을 Transactinal OutBOx라고 합니다. 서로 다른 서버의 트랜잭션을 관리하고 할 때, eventual consistency를 보장하기 위해 DB ..

TIL/개발 칼럼

#4 타행 이체 기능 성능 개선기, 속도(인프라 개선)

목차 1. [문제 상황] 동기 보다 비동기가 느린 현상 2. [원인 분석] 로컬에서만 일어나는 NIO 3. [해결] 당행과 타행으로 테스트 서버 분리 4. 고민해봐야할 것 ✍️ 사전 지식 용어 당행 : 사용자로부터 이체 요청을 받고, 이체 입금을 진행하는 은행 타행 : 이체 과정에서 출금을 진행하는 은행 당행 이체 : 입금 은행과 출금 은행이 동일한 이체 타행 이체 : 입금 은행과 출금 은행이 다른 이체 OutBox 데이터 : 이벤트나 메시지를 DB에 있는 아웃박스에 저장해서 DB 트랜잭션의 일부로 발행하는 패턴을 Transactinal OutBOx라고 합니다. 서로 다른 서버의 트랜잭션을 관리하고 할 때, eventual consistency를 보장하기 위해 DB 테이블을 메세지 큐로 사용하는 방식을 ..

김민석(갈레, 페퍼)
개발자-김민석