
멱등성(Idempotency)멱등성이라는 용어부터 살펴보자. 멱등성은 수학에서 유래된 개념으로, 같은 작업을 여러 번 반복해도 결과가 달라지지 않는 성질을 뜻한다. 이 개념은 HTTP Method에서도 중요한 역할을 한다.예를 들어, 같은 GET 요청을 서버에 1번 보내든 10번 보내든, 서버에서 반환되는 데이터는 항상 동일하다. 하지만 POST 요청은 어떨까? 여러 번 실행하면 새로운 데이터가 계속 추가될 수 있다. 바로 이런 차이가 멱등성과 관련이 있다. HTTP Method의 멱등성위에서 언급한 것처럼, HTTP Method에도 멱등성을 적용할 수 있다. RFC 7231 문서에는 여러 번 동일한 요청을 보냈을 때 서버에 미치는 의도된 영향이 동일한 경우 멱등성을 가진다고 정의되어있다. 아래 표는,..
![[TypeORM] Join의 속성(RelationOptions)들을 파헤쳐보자](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx7fNZ%2FbtsLKug3vNl%2FLFkeSskTwllcIQKs34scV1%2Fimg.png)
서론최근 신입 개발자분이 입사하셨다. TypeORM을 사용해서 특정 기능을 구현하던 도중, 계속해서 하위 테이블에서 상위 테이블의 FK가 NULL로 들어가는 문제가 있었다. 구현하신 로직을 따라가면서 문제점을 발견할 수 있었는데, 기존에 하위 모델에서 가지고 있는 상위 모델 객체의 정보를 저장 직전에 ORM의 create 인터페이스로 새로 생성하여 저장했기 때문이다. 현재 내가 개발중인 도메인의 테이블들은 대부분 비정규화가 심한 테이블들이여서 ORM에서 관계를 매핑해주지 않고 ORM의 인터페이스 혹은 raw query로 JOIN을 수행하고 있다. 이렇다보니 한 번에 무엇이 문제인지 찾을 수 없었다. 사용하고 있는 특정 기술들 중 핵심적인 ORM이기 때문에, 이번 일을 계기로 하나하나 직접 사용하며 정리해..

1년차 백엔드 개발자의 회고록 / 2023년을 되돌아보며..두서없이 쓰는 본인의 개발 입문 1년( + 1개월) 기념 (실무 3개월차) 1년을 되돌아보며 작성하는 장황한 글이다. 왜 개발자를 선택했는가? 나는 작년 11월. 국비지원 백엔드 개발자 양성과정 교육을mag1c.tistory.com 개발자로서의 2024년올해는 계속해서 도전하는 한 해였지만 반대로 빠르게 번아웃을 맞았던 한 해이기도 하다. 성과Java, Spring으로 시작했던 개발이 작년 말 입사 후 Node쪽으로 완전히 변하게 되었고, 입사하자마자 업무를 바로 수행해야 하는 상황에 적응하기 위해 부단히 노력했다. 노력 덕분인지 입사 2주만에 두 개의 스프린트를 모두 완료하였고, 곧바로 수습 종료 후 정규직으로 전환되었다. 올해는 자율적으..
![[MySQL] Lost Update와 Write Skew](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdppIEe%2FbtsLeAo81jz%2FO7MshK7WQ3akMeRwwRCns1%2Fimg.png)
서론트랜잭션의 격리 수준 포스팅에서 다루지 않았던 이상현상 중 Lost Update와 Write Skew같은 일관되지 않은 쓰기 결과를 반환하는 데이터 부정합 문제가 있다. PostegraSQL에서는 격리 수준을 REPEATABLE READ로 설정하는 것만으로도 쓰기 결과를 올바르게 보장할 수 있다. 하지만 MySQL의 MVCC(Multi Version Concurrency Control)은 일관된 읽기(Consistence Read)를 지원하지만 위와 같은 데이터 업데이트의 부정합 문제를 REPEATABLE READ의 격리 수준 만으로는 해결할 수 없다. 아래 그림은 MySQL에서 REPEATABLE READ 격리 수준을 사용했을 때 Lost Update가 발생하는 상황이다. 고객 A가 10,000원..
![[데이터베이스] MVCC(다중 버전 동시성 제어 - Multi Version Concurrency Control)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4PoMp%2FbtsK326NemX%2FNlFKZttD35YO0mdqSKN4GK%2Fimg.png)
동시성 제어(Concurrency Control)DBMS에서 동시성 제어는 동시에 데이터에 접근하는 여러 사용자, 즉 여러 트랜잭션의 상호작용에서 트랜잭션의 isolation을 보장하고 일관성과 무결성을 유지할 수 있도록 하는 목적으로 사용되는 기술이다. 이러한 동시성 제어를 하는 대표적인 방식 중 가장 대표적인 Lock을 간단하게 알아보자. 공유 잠금(읽기 잠금, shared lock)이나 배타적 잠금(쓰기 잠금, exclusive lock)을 통해 Lock을 획득한 후 트랜잭션 내부의 작업을 수행하는 방식이다. (read로도 쓰기 잠금을 획득할 수 있다) 다른 트랜잭션은 이전 트랜잭션에서 Lock을 반환해야 작업이 수행이 가능하다는 의미이다. 이는 곧 SERIALIZABLE하다는 의미이며,..

처음으로 오픈소스에 기여해보았다 (feat. 오픈소스 멘토링)저는 처음 오픈소스에 기여하겠다!!! 라는 생각을 실천하는데 1년이나 걸렸습니다.부끄럽지만 너무 다가가기 어렵고 힘들었습니다. 하여 누구나 오픈소스에 쉽게 접했으면 하는 마음에 다소 가mag1c.tistory.com 오픈소스 멘토링 때 선정했던 두 가지 이슈 중에, 선택하지 않았던 nest의 file-validation-pipe의 이슈를 다시 살펴보았다.누군가가 PR을 하겠다고 코멘트가 달려있어서 선택하지 않았던 이슈였지만 누가 먼저 PR을 보내느냐가 중요하다던 말이 떠올랐다. 간단한 이슈였기 때문에 바로 PR을 보냈고, 곧바로 머지 되었다. (멤버분의 코멘트로 보아 11버전에서 업데이트 될 것 같다) 이슈 정의기존 NestJS의 파일 V..
![[MySQL] 트랜잭션 격리수준(isolation level)과 이상현상 (with 테스트 코드)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FME52v%2FbtsKYfksHvd%2FHmKsw3KxT1yVX1kAqFqg60%2Fimg.png)
기억에 오래남고 이해하기 쉽게 현재 조직의 웨딩 도메인의 적립금을 예시로 간단한 엔터티 설계와 더불어 테스트 코드를 작성하여 각 격리수준과 이에 따른 이상현상을 정리해보았다. 개념들은 MySQL의 공식문서를 활용하여 정리하였고, AUTO_COMMIT은 FALSE를 가정하고 예제들을 작성하였다. (예제에 필요한 기본적인 엔터티와 데이터 세팅은 아래를 참조) CREATE TABLE icash ( no INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, user_no INT UNSIGNED UNIQUE NOT NULL, icash INT UNSIGNED DEFAULT 0 NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTA..

저는 처음 오픈소스에 기여하겠다!!! 라는 생각을 실천하는데 1년이나 걸렸습니다.부끄럽지만 너무 다가가기 어렵고 힘들었습니다. 하여 누구나 오픈소스에 쉽게 접했으면 하는 마음에 다소 가벼운 스타일로 포스팅을 진행하려 합니다. 오픈소스에 기여하게 된 계기우리는 오픈소스를 쉽게 접하고 사용한다. 특히 node 진영에서는 npm install 딸깍 한 번이면 오픈소스를 쉽게 받아 사용할수 있다. 어제도 메세지큐를 사용하기 위해 bullmq @nestjs/bullmq를, UI Board를 위해 @bull-board/api와@bull-board/express를 갖다 썻으니 벌써 4개의 오픈소스를 사용한 셈이다. 동물은 죽어서 가죽을 남기고 사람은 죽어서 이름을 남긴다는데, 개발자로 살면서 나도 죽기전에 ..