문제 상황동시에 여러 번 호출할 경우 DB 데이터가 중복 저장되는 현상 빈번히 발생한 번의 요청에 종류가 다른 4가지 멤버의 기여도를 가져와 하나의 같은 테이블을 업데이트, 다른 한 테이블에는 insertDB Lock 적용DB Lock을 통해 데이터의 중복 저장을 막을 수 있을 것이라 기대시도 1 : @Version 기반 낙관적 락성능을 생각해 낙관적 락을 먼저 걸어보기로 했다.Jpa 엔티티에 @Version 필드를 추가해 락을 적용한다.다중 요청시 version 필드의 충돌로 인해 롤백이 자주 발생했다.쓰기 작업에 더 높은 수준의 락이 필요하다고 느꼈다.시도 2: 공유락읽기 작업에는 락이 걸리지 않아도 되었기에 공유락을 선택했다. (이전의 데이터를 읽어도 큰 상관은 없었다.)사용할 JpaReposito..
Latency 3.52s -> 454ms 로 쿼리를 7.7배 개선한 작업을 공유하고자 합니다. 문제 상황 & 고민 서비스의 핵심 API의 Latency가 데이터가 몇십만 건이 쌓이는 경우 성능적 개선이 필요했습니다. 해당 API에서 사용하는 DB 조회 쿼리 개선이 필요하다고 판단했습니다. 개선 작업 약 41만 건의 랜덤한 데이터 삽입 이후 K6를 통해 부하테스트를 통한 평균 Latency를 확인하며 진행했습니다. 부하테스트의 경우 같은 조건으로 5번 이상씩 수행하며 평균에 가까운 값을 확인했습니다. 1. 초기 상태 [3.52s] 어떤 작업도 하지 않은 상태에선 조회 API Latency가 3.52초가 걸렸으며, 이로 인해 개선 작업을 시작했습니다. 서비스의 가장 중요한 결과 조회 API 이었기에 더더욱 ..
기아 상태 특정 프로세스의 우선 순위가 낮아서 원하는 자원을 계속 할당받지 못하는 상태이다. SJF, SRT, 우선순위 스케줄링, SPN, feed back 등의 스케줄링 방법에서 발생 가능하다. 기아 상태 해결 방법 에이징(Aging) 프로세스가 대기 큐에서 기다릴수록 우선순위를 증가시켜주는 방식이다. 이렇게 하면 오랫동안 기다린 프로세스가 결국에는 CPU를 할당받을 수 있다. 우선순위 기반의 스케줄링 알고리즘에서 주로 사용된다. 피드백(Feedback) 프로세스가 CPU를 사용할수록 우선순위를 감소시켜주는 방식입니다. 이렇게 하면 자주 CPU를 사용하는 프로세스가 낮은 우선순위로 밀려나게 되고, 오랫동안 기다린 프로세스가 높은 우선순위로 올라가게 된다. 다단계 큐(Multilevel Queue)나 다..
프로세스 프로그램 어떤 작업을 하기 위해 해야할 일들을 순서대로 나열한 것 컴퓨터에서 어떤 작업을 위해 실행할 수 있는 '정적인 상태'의 파일 프로세스 프로그램이 실행되서 돌아가고 있는 상태, 컴퓨터에서 연속적으로 실행되고 있는 '동적인 상태'의 컴퓨터 프로그램 프로세스는 운영체제가 메모리 등의 필요한 자원을 할당해준 '실행중인 프로그램' 프로그램을 실행하면 운영체제로부터 실행에 필요한 자원을 할당받아 '프로세스'가 되는 것 프로세스 문맥 프로세스가 현재 어떤 상태에서 수행되고 있는지 정확히 규명하기 위해 필요한 정보 시분할 시스템 환경에서 명령을 수행하기 위해서 이전에 어디까지 명령을 수행했는지 정확한 수행 시점과 상태를 재현할 수 있는 정보가 필요하고 이 정보가 프로세스 문맥 프로세스 문맥은 하드웨어..
개요 운영체제 컴퓨터의 하드웨어 바로 윗단에 설치되는 소프트웨어이다. 컴퓨터 시스템의 하드웨어 자원을 효율적으로 관리하는 역할을 한다. 주어진 자원으로 최대한의 성능을 내면서 특정 사용자 혹은 프로그램이 지나친 불이익을 받지 않도록 한다. 주요 역할 사용자에게는 편리한 인터페이스와 환경을 제공하는 역할을 한다. 운영체제 자신을 보호하는 역할을 가진다. (보안적인 측면) 운영체제의 분류 시분할 시스템 여러 작업을 수행할 때 컴퓨터의 처리 능력을 일정한 시간 단위로 분할해 사용하는 방식이다. 현대의 범용 컴퓨터는 대부분 시분할 방식을 사용한다. 다중 프로그래밍 방식과 결합하여 모든 작업이 동시에 진행되는 것처럼 대화식 처리가 가능하다. 다중 프로그래밍 시스템(multi-programming system) 하..
Join 두 개 이상의 테이블을 하나의 집합으로 만드는 연산 Join 기법들 대표적인 기법들만 소개할 예정 NL Join이 디폴트 기법 설명 Nested Loop Join (NL Join) 선행 테이블에서 액세스한 각 값을 후행 테이블과 조인하는 방식 Sort Merge Join (SM Join) 조인 컬럼을 기준으로 데이터를 정렬하여 조인을 수행하는 방식 Hash Join 해시 함수를 이용해서 데이터를 조인하는 방식 NL Join 프로그래밍에서 사용하는 중첩 반복문과 유사한 방식으로 조인 수행 반복문 외부의 테이블은 선행 테이블 혹은 외부 테이블(Outer Table) 이라 부른다. 반복문 내부에 있는 테이블은 후행 테이블 또는 내부 테이블(Inner Table) 이라 부른다. 선행 테이블 의 조건을 ..
사전 지식 (용어) DB Key란? 튜플들을 구별할 수 있는 기준이 되는 속성이다. 필요한 이유 하나의 릴레이션에는 수많은 튜플들이 존재한다. 각 튜플들 간에는 중복되는 속성값이 발생할 수 있다. 이 튜플들을 구분하기 위한 기준이 필요하고, Key가 그 기준이 된다. Key 의 종류 키의 종류로는 크게 슈퍼키, 후보키, 기본키, 대체키, 외래키 등이 있다. 최소성, 유일성 모든 키의 종류가 이 두개를 만족하는 것은 아님! 유일성 키를 통해 모든 튜플을 구별할 수 있는 특징 유일성을 만족하는 예시 회원 테이블 [주민등록번호] 혹은 [이메일] 과목 테이블 [강의 연도, 과목명, 교수명, 강의 교시] 유일성을 만족하지 않는 예시 회원 테이블 [취미] 최소성 키에 튜플을 식별하는데 불필요한 어트리뷰트가 없는 경..
재검토중 이 글에서 설명하는 방법으로 이슈가 해결되지 않음을 확인했습니다. 하나의 탐구과정으로 봐주시면 감사하겠습니다.문제의 발생ObjectMapper의 NamingStrategies를 여러개 쓰이게 되는 상황이 발생했다.여러 종류의 외부 API를 반영하는 서비스였기에 외부 API 마다의 json 네이밍 컨벤션이 달랐다.특히, 하나의 NamingStrategies가 늘어날 때 마다 ObjectMapper에 대한 빈을 하나 더 등록하면서 주입 받을 때도 빈이 여러개라서 신경을 써야 하는 등의 불편함이 발생했다.이 문제를 해결하는 방법을 찾던 중, 디자인 패턴인 Composite 패턴을 통해 해결하기로 했다.Composite 패턴이란?Component 라 불리는 최상위 클래스와 Leaf, Composite ..