728x90
반응형

전체 글 48

[이슈] PostgreSQL 시퀀스 불일치로 데이터 추가 오류

PostgreSQL 시퀀스(nextval) 불일치로 인한 ID 충돌 이슈 해결기상황데이터베이스: PostgreSQL ORM: Prisma id Int @id @default(autoincrement())nextval('"MyTable_id_seq"'::regclass)DataGrip, DBeaver 등의 DB 툴에서 수작업으로 데이터 삽입 중 ID 오류 발생Prisma 애플리케이션 로직을 통해 데이터 생성 시에도 ID 충돌 오류 발생이슈 요약수작업 데이터 입력 중→ duplicate key value violates unique constraint 발생 Prisma를 통한 데이터 생성 시→ 이미 존재하는 ID를 재사용하려고 시도하며 충돌 발생 원인 분석PostgreSQL은 SERIAL 또는 aut..

Troubleshooting 2025.11.11

[Node.js] Node.js는 싱글 스레드인가?

서론Node.js 의 동작 원리라고 하면 공통적으로 나오는 키워드들이 있다. 바로 '단일 스레드 (싱글 스레드)', '비동기 논블로킹 IO' 이다.그런데, 'Node.js가 정말로 싱글 스레드인가요?' 라는 질문에는 '사실 그렇지는 않다' 라는 답변이 나온다.이 부분에 대해 정리하는 글이다. 본론Node.js가 싱글 스레드라는 말은, 관점에 따라 다르다. Node.js 도 결국 하나의 소프트웨어로, 내부 동작에 대해 몰라도 사용할 수 있게 제공되었기 때문이다. 우리가 express.js, NestJS 등 Node.js 라는 런타임 환경에서 동작하는 간단한 로직을 작성할 때는 Node.js 가 싱글 스레드로 동작한다는 것만 알면 된다. 예를 들어, HTTP 요청을 받아 라우팅을 처리하고, 비즈니스 로직을..

[현문hyun답] MongoDB 에서 별도의 컬렉션으로 분리하는 것과 문서 내부에 저장하는 것 비교

서론MongoDB의 장점이자 단점이 될 수 있는 것은 문서 내부에 통으로 저장하는 방식으로 join으로 인한 성능 저하를 줄일 수 있다는 점이다. 이는 다시 말해 처음 설계에서 어떻게 할지 정하는 것이 더욱 중요하다는 얘기가 될 수도 있다. 데이터 무결성과 중복 사이에서 적절한 줄타기가 필요한 특징이다.그럼에도 불구하고, 별도의 컬렉션으로 분리하여 다른 컬렉션의 id를 참조해야하는 경우가 발생하기 마련이기 때문에, 두 방법을 비교해보는 글을 쓰게 되었다. 본론별도의 컬렉션으로 분리사용자주 추가되고, 자주 변경되는 데이터A와 B 데이터가 독립적으로 관리되어야 하는 경우다양한 필터링이나 분석이 필요한 경우장점데이터 중복을 줄일 수 있어 저장 공간을 효율적으로 사용별도의 문서로 관리되기 때문에 필요할 때만 쿼..

현문hyun답 2024.11.18

[현문hyun답] 언제 어떤 데이터베이스와 ORM/ODM을 사용하는게 좋을까? (2) - ORM/ODM

본론 - 2Mongoose개요MongoDB 전용 ODM장점MongoDB의 모든 기능을 활용할 수 있음스키마를 쉽게 정의하고 유효성 검사를 설정할 수 있음쿼리 전후에 미들웨어를 추가하여 로직을 쉽게 확장할 수 있음단점비동기 처리 방식이 TypeORM이나 Prisma에 비해 덜 직관적임쿼리 작성 시 코드가 복잡해 질 수 있음    Prisma개요Typescript ORM다양한 데이터베이스 지원타입 안정성을 제공하고 데이터베이스 스키마를 선언적으로 정의할 수 있음장점Typescript와 호환이 잘 되어 컴파일 시점에 오류를 잡을 수 있음체이닝을 통한 간결한 쿼리 작성 가능데이터베이스 스키마에 따라 자동으로 타입 생성단점MongoDB의 모든 기능을 지원하지 않음마이그레이션 충돌이나 관리가 복잡함생성된 쿼리가 최..

현문hyun답 2024.11.15

[현문hyun답] 언제 어떤 데이터베이스와 ORM/ODM을 사용하는게 좋을까? (1) - 데이터베이스

서론프로젝트를 하다보면 이 데이터베이스보다는 다른 게 더 적합할 것 같다 혹은 이 ORM은 내가 하는 작업에서는 불편한 점이 있다같은 생각이 들 때가 있다. 데이터베이스 별 특성은 알고 있어도 실제 프로젝트에 어떤 식으로 적용될 지와 적용되었을 때 실제로 어떨 지를 예시를 들어 같이 정리해보면 선택할 때 도움이 될 것이라 작성하게 되었다. 본론 - 1RDBMS (MySQL, MariaDB, PostgreSQL)개요데이터를 테이블 형식으로 구조화하여 저장하는 데이터베이스 시스템행과 열로 구성되는 테이블데이터 간의 관계를 정의주요 특징스키마 기반ACID 속성: 원자성, 일관성, 고립성, 지속성을 보장하여 데이터의 무결성 유지관계: 테이블 간의 관계를 설정할 수 있으며, 외래 키를 통해 데이터의 무결성 유지장..

현문hyun답 2024.11.14

[NestJS] Strategy Pattern (전략 패턴)

1. 서론전략 패턴에 대해서는 간단하게 알고 있었지만 한동안은 if-else 문 혹은 switch 문과의 차이를 크게 못 느꼈었다. 그러다가 실무에서 어떤 환경이 주어졌을 때 전략 패턴이 떠올랐고 적용하면서 이점을 느끼게 되어 기록하게 되었다. 실무에서 NestJS를 사용 중이기에 제목과 예시 코드가 NestJS 이지만 디자인 패턴 중 하나인 만큼 어디에도 적용이 가능할 것이다. 2. 본론정의Strategy Pattern (전략 패턴)은 객체의 행위를 정의하는 방법 중 하나알고리즘을 정의하고 이를 캡슐화하여 클라이언트 코드에서 독립적으로 사용할 수 있도록 하는 디자인 패턴여러 알고리즘을 정의하고, 그 알고리즘을 동적으로 선택하여 사용주요 구성 요소Context: 전략을 사용하는 클라이언트 객체Strate..

Design Pattern 2024.11.13

[타입스크립트] 타입스크립트에 타입 지정하기

서론타입스크립트와 자바스크립트의 가장 큰 차이이자 타입스크립트의 존재 이유는 동적 언어인 자바스크립트의 단점을 보완하는 타입 지정이다.그런데, 정말 간단하면서 당연한 사실임에도 일반적인 정적 언어를 사용해오며 습관적으로 작성했던 타입이 사실 타입스크립트에서는 정확하지 않을 수 있다는 사실을 확인하여 기록하게 되었다. 본론그동안 자바를 사용하면서는 다음과 같이 선언했다. String str = "test"; 위 코드는 의심의 여지 없이 정확한 코드이다. 자바에서는 문자열의 타입이 String이고, 정적 언어이기 때문에 타입을 지정하여 변수를 선언했다. 그래서 타입스크립트에서 다음과 같이 선언했다. const str: string = "test"; 타입스크립트에서는 문자열의 타입이 string이고, 마찬가지..

[현문hyun답] go의 goroutine(고루틴), kotlin의 coroutine(코루틴), typescript의 generator(생성기), roblox lua의 corotuine(코루틴) 비교

0. 서론Go 언어나 Kotiln 언어는 웹, 앱 또는 서버 등을 제작할 때 사용하게 되었는데, 기존에 주로 사용하던 Java나 Javascript에서는 쉽게 접하지 못했던 고루틴과 코루틴을 접하게 되었다.Typescript의 생성기는 zepeto(제페토) 게임을 만들면서 접하게 되었는데 zepeto unity에서 typescript로 코드를 작성하면서 게임 내에 필요한 비동기적 작업을 generator로 쓰게 되었다.Roblox Lua의 코루틴은 Roblox 게임을 만들면서 접하게 되었고 상당히 자주 사용하게 되었다.여러 언어를 사용하면서 이름은 다르지만 비슷한 기능을 사용하고 있다는 점에서 흥미가 생겨 비교를 해보게 되었다. 1. Go의 gorotuine(go 루틴, 고루틴)Go 언어에서 경량 스레..

현문hyun답 2024.08.13

[스프링부트] 스프링캐시 Spring Cache 설정 및 속도 비교

서론특정 데이터들을 반복적으로 호출하고 있는 코드가 있었다. 현재까지는 2천 개보다 조금 많은 수준의 데이터를 가지고 있었지만, 앞으로 훨씬 더 많은 데이터가 들어갈 예정인데 단순히 조회를 위한 데이터임에도 여러 곳에서 데이터를 호출해야하기 때문에 캐시 도입을 결정하였다. 캐시를 설정하는데에는 여러 방법이 있지만 스프링부트로 백엔드를 개발하고 있기 때문에 스프링에서 제공해주는 스프링 캐시를 사용하기로 하였다. 본론1. 캐시 메모리에 저장할 데이터 정의@Datapublic class SomeDataCache { private T someData; private LocalDateTime expirationDate;}2. 캐시 설정 파일 정의@EnableCaching@Configurationpubl..

Java 2023.09.04

[유니티/C#] FSM을 알아보자

서론 if - else if 지옥과 예외 처리 지옥에 빠진 나를 구원하는 FSM 본론 FSM: Finite State Machine(유한 상태 기계)은 상태 패턴의 한계를 해결할 수 있는 방안 중 하나다. 상태 패턴: 행동과 상태를 나누는 디자인 패턴. 행동을 인터페이스로 정의하여 상태에 따라 행동을 분류. 먼저 상태 패턴의 구조에는 세 가지 핵심 요소가 있다. Context 클래스: 클라이언트가 객체의 내부 상태를 변경할 수 있도록 요청하는 인터페이스를 정의하고 현재 상태에 대한 포인터를 보유함. IState 인터페이스: 구체적인 상태 클래스로 연결할 수 있도록 설정. ConcreteState 클래스: IState 인터페이스를 구현하고 Context 오브젝트라 상태의 동작을 트리거하기 위한 퍼블릭 메서..

Game 2023.06.11
728x90
반응형