전체 글 25

[DB] 레전드 MVCC

이번에 말하는 MVCC는 Multi Concurrency Control의 기능으로 일반적으로 레코드 레벨의 트랜잭션을 지원하는 RDMS가 제공하는 기는 중 하나로 이 기능의 목적은 잠금을 사용하지 않아도 일관되게 읽기를 가능하게 하는 것이 큰 목적이다. InnoDB는 Undo log를 사용해 이 기능을 구현하였는데 하나의 레코드에 대해 여러 개의 버전이 동시에 관리한다는 것이다.이 기능을 설명하기 위해 상황을 가정해 보자면 격리 수준을 커밋된 데이터만 조회가능한 READ_COMMITTED인 MySQL 서버에 InnoDB가 어떻게 작동할까? 우선 테이블을 생성한 후 데이터를 넣어보자.mysql> CREATE TABLE member ( m_id INT NOT NULL, m..

카테고리 없음 2025.02.07

[database] 디스크 읽기 방식에는 무엇이 다를까

랜덤I/O와 순차I/O와 같은 디스크 읽기 방식을 살펴보고자 한다.컴퓨터의 CPU나 메모리와 같은 전기적 특성을 가진 장치는 빠르게 발전하지만 기계식 장치의 성능은 그렇지 못했다.요즘에는 하드 디스크보다 SSD가 많이 사용되지만 아직도 데이터를 저장하는 장치는 CPU와 메모리와 같은 장치에 비해 느린 것이 분명 사실이다. 백엔드 개발자인 사람들도 api의 성능을 높이기 위해 고민하는 것이 데이터베이스 튜닝이 빠질 수 없을 만큼 어떻게 I/O를 빠르게 할 수 있을지에 대해 고민을 많이 하는 것이 분명하기 때문에 이론적으로 어떻게 이뤄지는지도 중요하다고 생각한다. HDD와 SSD컴퓨터의 CPU나 메모리에서 전자식 장치를 사용하지만 드라이브가 HDD인 기계식 장치일 경우가 있다. 그렇게 되면 HDD를 많이 사..

카테고리 없음 2025.01.31

[linux] Swap Memory? 중요한건가

스왑 메모리 그게 뭐지? 중요한 건가? 처음 들어보는데 할 수 있다.한번 중요한지 안 중요한지 알아보자. Swap MemorySwap Memory란 실제로 존재하는 메모리 공간은 가득 차서 더 이상 여유 공간이 존재하지 않을 때 필요한 만큼 디스크 공간을 이용하여 부족한 메모리를 대체할 수 있는 메모리라고 할 수 있다. 간단히 말하면 가상 메모리라고 하면 이해하기 쉽다.하지만 실제 메모리 공간이 아닌 디스크에 저장하는 만큼 공간은 늘어 이점이 될 수 있지만 실제 메모리처럼 빠르지 않다는 게 단점이다. 그래서 실제 운영환경에서 스왑 메모리를 사용하는 것은 좋은 방법이 아니며 실제 메모리에 올려 사용하는 방법을 지향하는 것이 좋다.확인 방법리눅스에서 Swap Memory를 확인하고 싶다면 free -h 위와..

카테고리 없음 2025.01.11

[database] MySQL 엔진 아키텍처...1편

MySQL에서 서버는 머리에 해당하는 MySQL 엔진과 손발에 해당하는 스토리지 엔진으로 구분할 수 있다.만약 스토리지 엔진은 핸들러 API를 만족한다면 누구든 스토리지 엔진이 구현 가능하여 MySQL 서버에 추가해서 사용이 가능하다. 그래서 이번 블로그에서는 직접 스토리지 엔진을 구현하기 전에 MySQL 서버에서 기본적으로 제공되는 InnoDB 스토리지 엔진과 MyISAM 스토리지 엔진을 구분하며 MySQL의 아키텍처에 대해 살펴보자. MySQL 엔진 아키텍처 MySQL의 쿼리를 작성하고 더 좋게 튜닝하기 위해서는 기본적인 MySQL 엔진의 구조를 알아야 한다.MySQL의 서버는 다른 RDBS에 비해 독특하다. 사용자 입장에서는 모를 수도 있지만 독특해 다른 RDBS에서 얻을 수 없는 장점이 존재하기도..

카테고리 없음 2024.12.21

[project] 프로젝트 "Expo" 소프트웨이브까지의 회고..

프로젝트 소개광주광역시교육청의 외주를 받아 박람회의 관람객과 연수자, 일반 프로그램과 연수 프로그램 등을 단 하나의 QR로 입장 및 퇴장, 출석 등을 체크하여 통계를 낼 수 있도록 만든 프로젝트이다. 백엔드 깃허브Github: https://github.com/School-of-Company/Expo-Server GitHub - School-of-Company/Expo-ServerContribute to School-of-Company/Expo-Server development by creating an account on GitHub.github.com 기간2024.10.08 ~ 진행 중 팀원AOS: 1명 | Server: 1명 | iOS: 1명  | Front: 2명 | Design: 1명첫 외주현재..

project 2024.12.16

[spring] @Transactional인데 readOnly를 곁들인..

Spring을 사용하여 개발하다 보면 서비스 로직에 빠질 수 없는 것이 @Transactional 어노테이션이다. 하지만 이것에도 많은 옵션이 있다는 걸 아셨나요? 많은 것 중에 api의 성능을 높일 수도 있는 옵션은 readOnly를 알아보고자 합니다. @Transactional(readOnly = true)Spring에서 AOP를 사용하여 @Transactional을 사용할 수 있는데 여기서 위와 같이 readOnly를 true로 하게 된다면 읽기 전용으로 변경이 가능하다. 하지만 주의해야 될 점이라고 하자면 readOnly라는 옵션에서 직관적으로 알 수 있듯이 서비스 자체가 데이터를 DB에서 읽기만 하는 것에 적용을 해야 된다는 것이다. 만약 CUD 작업을 해야 되는 서비스이라면 데이터를 추가, 수..

spring 2024.12.07

[cs] J W T(Json Web Token)

토큰 관련된 인증은 대부분 로그인과 관련되어 사용합니다.그중 JWT는 웹 표준을 따르고 있고, JSON 객체를 사용해 정보를 전달합니다. JWT의 장점이라고 하자면 토큰 안에 정보를 담아 전달하기 때문에 JWT로 인증이 가능하다는 점입니다.또한, 웹 표준을 따르기 때문에 언어 대부분이 JWT를 지원합니다. JWT 구조 위 사진과 같이 헤더, 페이로드, 서명으로 이루어져 있습니다. 이것을 "."으로 구분합니다. 헤더에는 JWT 타입과 어떤 해싱 알고리즘을 사용했는지 명시합니다.페이로드는 Claim이 들어갑니다. 여기서 Claim은 3가지 종류가 있습니다. 3가지 종류로는 registered, public, private가 있습니다.서명은 JWT 토큰의 무결성을 보장하기 위해 헤더와 페이로드를 해싱한 후 비..

cs 2024.10.21

[cs] Spring에서 ULID적용하기

ULID란?Universally Unique Lexicographically Sortable Identifier의 약자로 대소문자를 구분하지 않는 시간을 나타내는 10글자와 16글자의 임의의 값으로 구성한다. ULID는 앞에 타임스태프가 있듯이 생성 순서를 밀리세컨 단위로 기록할 수 있어 순서대로 정렬이 가능하다. 하지만 만약 밀리세컨까지 동일하게 생성된다는 가정을 한다면, 순서는 랜덤으로 배정된다. 또한, ULID는 Crockford’s Base32 기반으로 만들어져 (I, L, O, U)는 들어가지 않는다. 제외된 이유는 이것들은 대소문자에 의해 사람들에게 헷갈릴 수도 있기 때문에라고 한다. 논리대로라면 1ms에 2^80개를 만들 수 있다. 그러면 충돌할 가능성이 존재할까?https://medium...

카테고리 없음 2024.10.14

[Psychology] Diderot effect

혹시 Diderot effect라고 아시나요?이 효과는 심리학 용어로는 "디드로 효과"라고 흔히 불리는데요.이 효과에 대해 이야기해보고자 합니다.디드로 효과디드로 효과란 하나의 물건을 사고나면 그 물건과 어울리는 다른 제품들을 계속적으로 구매하는 현상을 말합니다.예시를 들어, 아이폰을 사고 나면 애플워치, 에어팟 등을 사는 그런 현상을 말합니다.다른 말로는 "디드로 통일성(Diderot conformity)"라고 부르기도 합니다. 하지만 이런 효과로 인해 관련된 제품들을 계속 구매하는 소비가 일어나는데 그러면 "심리적으로 소비자는 어떤 마음으로 사는 걸까?"라는 생각이 들 수 있습니다. 보통 사람들의 소비를 하는 이유가 무엇일까요? 사람들은 어떤 물건의 기능적의 필요로 제품을 구매하는 경우가 대부분인 반..

카테고리 없음 2024.10.06

[cs] 싱글톤의 장점과 단점

싱글톤이란싱글톤 패턴이란 특정 클래스의 인스턴스를 1개만 생성하는 것을 보장하는 디자인 패턴 중 하나이다. 이 패턴은 생성자로 매번 생성하더라도 인스턴스를 매번 생성하는 것이 아닌 최초로 생성한 동일한 인스턴스를 계속 사용하는 패턴입니다. 만약에 spring 백엔드 개발자라면 떼고 싶어도 뗄 수 없는 디자인 패턴이자 spring을 조금 더 특별하게 만들어주는 것이라고 할 수도 있다. 싱글톤의 장점위에서 말했던 대로 처음에 생성한 동일한 인스턴스를 계속 사용하기 때문에 메모리 낭비를 예방할 수 있다.예를 들어 유저가 1초에 10, 100번의 요청을 보낸다고 가정하면 10개, 100개의 인스턴스를 생성하는 것이 아닌 이미 생성된 인스턴스(static)를 호출하여 사용해 메모리 낭비를 방지할 수 있습니다. p..

cs 2024.09.23