본문 바로가기

전체 글262

[Prisma] create api 사용시 안전하게 데이터 생성하기 model Post { id Int @id @default(autoincrement()) content String authorId Int author User @relation(fields: [authorId], references: [id]) @@index([authorId], map: "Post_authorId_fkey") } model User { id Int @id @default(autoincrement()) name String posts Post[] } 위의 스키마를 기반으로 아래의 코드를 작성한다고 생각해 보겠습니다. const post = await prisma.post.create({ data: {...}, }); 여기서 prisma는 prisma client api에 대한 모든 타입.. 2022. 11. 26.
[데이터 베이스] MySQL트랜잭션 격리수준 트랜잭션의 문제점 여러 트랜잭션이 실행되면서 데이터 불일치에 대한 문제가 발생하게 됩니다. 이런 문제가 없으면 좋겠지만은 여러 트랜잭션이 하나의 데이터를 공유하기 때문에 발생할 수 밖에 없는 문제 입니다. 여러 트랜잭션이 실행되면서 발생할 수 있는 데이터 불일치 문제에는 DIRTY READ, NON REPEATABLE READ, PHANTOM READ가 있습니다. DIRTY READ A트랜잭션의 작업 내용이 완료(commit)되지 않았는데, 그 내용을 B트랜잭션에서 볼 수 있는 현상. A트랜잭션에서 B트랜잭션이 commit하지 않은 데이터를 조회하여 작업 후 commit하였습니다. 이때 만약 B트랜잭션이 롤백된다면, 결국 A트랜잭션은 잘못된 데이터를 사용하여 commit하게 됩니다. 사실 생각해보면 DI.. 2022. 11. 7.
[GraphQL] custom scalar type 사용하기 scalar라는 단어는 선형대수학에서 처음 나왔는데, 행렬과 벡터에서 하나의 수를 구분하기 위해 사용되었다고 합니다. 이 의미는 프로그래밍에서 사용하는 것과 유사한데, 자료구조에서 원소를 구분할 수 있는 single value를 scalar라고 합니다. [12, 6, true, "a", "b"] 배열에 있다면 각각의 원소값은 number(12,6), string(a, b), boolean(true)로 구분할 수 있으며 이때 number, string, boolean이 scalar 값을 의미합니다. scalar와 대조되는 개념은 compound이며 compound는 array, map, set, struct 처럼 여러 scalar 값을 포함하는 것을 의미합니다. 종종 scalar와 primitive를 헷갈.. 2022. 10. 9.
[GraphQL] null propagation GraphQL type field는 기본적으로 nullable이다. null값에 대해 허용하는 type languaged의 경우 대부분 기본적으로 non-null합니다. 변수를 선언하면 기본적으로 null을 허용하지 않으며 null값을 허용하는 경우 명시적으로 표시해줘야 합니다. - typescript type User = { name: string // non-null hobby?: string // nullable } - c# Nullable num; int? num; - kotlin var a : String? = null 이와는 반대로 GraphQL field는 기본적으로 nullable합니다. 때문에 반드시 값이 존재하는 경우 명시적으로 non-null을 의미하는 (!)를 표시해줘야 합니다. t.. 2022. 10. 1.
[Nexus] Source Types으로 parent 타입 수정하기 Source란 ? Nexus를 사용해서 schema를 만들 때, sourceTypes 옵션을 추가할 수 있습니다. sourceTypes는 source의 type을 내가 원하는 타입으로 매핑해주는 역할을 합니다. 여기서 source는 resolver의 첫번째 인자를 의미합니다. 클라이언트가 아래와 같이 질의한다고 해봅시다. query{ user{ - resolver (1) email - resolver (2) address - resolver (3) posts{ - resolver (4) content - resolver (5) } } } 우리가 질의하는 모든 field에는 resolver가 존재합니다. 질의는 resolver에서 처리되며 결과값을 클라이언트에서 받아보는 것이죠. resolver는 4개의 .. 2022. 4. 9.
[typescript] any ,unknown, never, void ? 길지 않은 시간동안 타입 스크립트를 사용하면서 any, void, unknown, never가 정확히 무엇이고, 언제 사용하는지 잘 몰랐습니다. 그래서 위의 키워드가 나올 때 마다 조금 찝찝했고(?) 언젠간 한번은 맘잡고 공부해야 하는 주제라고 생각했습니다. any [대명사] 아무(것) [한정사] 어느, 어떤 any type으로 선언한 변수에는 어떠한 값도 할당할 수 있습니다. 어떤 값이 할당 되는지 전혀 문제되지 않습니다 any로 선언했으니깐요. 기존의 javascript code에는 type system이 없기 때문에 이는 typescript code에 any를 덕지덕지 붙이는 것과 다름이 없습니다. function stringToLowerCase(str: any) { return str.toLowe.. 2021. 10. 14.
같은 이해 수준을 공유 하면서 대화 하고 있을까 얼마전에 리처드 파인만의 "왜 자석은 서로 밀어내는가?" 라는 동영상을 보았다. 영상에서 기자는 다음과 같이 질문을 하였다. 두 개의 자석을 들고 서로 밀었을 때 서로 밀치려는 느낌을 느낄 수 있잖아요, 이를 반대 방향으로 돌려서 가져다 대면 서로 붙으려 하고요. 이때 두 자석 사이에 느껴지는 그 느낌은 무엇인가요 ? 라는 질문에 리처드 파인만은 다음과 같이 대답했다. 그게 무슨말이죠, 두 개의 자석 사이에서 느껴지는 느낌..이라니 ? 이 영상의 내용은 여기서 부터 시작한다. 기자는 자석이 서로 밀어낼 때 어떤 일이 발생하는지 궁금했고, 이 질문은 지극히 정상적이다. 하지만 리처드 파인만은 답변은 단지 왜? 라는 질문에 답변을 하기 보다는 왜? 라는 질문이 얼마나 어려운지를 말하고 있다. 왜 라는질문을 .. 2021. 9. 26.
[GraphQL] GraphQL와 N+1 N+1문제는 orm을 사용하면 빈번하게 마주하는 입니다. N+1이 무엇이고, 어떻게 해결할 수 있는지는 다른 많은 블로그에서 참고할 수 있습니다. 이 글에서는 그것보다는 GraphQL을 사용하는 유저로서 GraphQL의 특징과 연결지어 N+1을 설명하고 왜 문제가 되는지, 어떻게 해결할 수 있는지 알아 보겠습니다. GraphQL resolver는 데이터를 어떻게 처리할까 기존의 rest api의 경우 /users 엔드 포인트에 요청을 보내면 원하든 원하지 않든 항상 유저와 유저의 게시글을 가져오게 됩니다. 이를 over fetching이라고 하죠. 비슷하게 하나의 엔드 포인트 요청으로 원하는 데이터를 못가져오게 되어 여러번 요청((under fetching))을 보내야 합니다. 이와는 다르게 Graphq.. 2021. 9. 26.
[node.js] single thread and libuv node.js는 기존의 multi thread와 어떻게 다를까 ? 우리가 server side언어로 개발한 서버 프로그램은 수많은 클라이언트의 요청을 처리할 수 있어야 합니다. 기존의 java, .net, php..의 경우 multi thread 방법으로 클라이언트의 요청을 처리하였습니다. 즉 각각의 클라이언트의 요청에 스레드를 할당하여 thread에서 클라이언트의 요청을 처리하는 방식을 선택하였습니다. apacha tomcat의 경우 default thread pool size(200개)를 두어 thread pool의 thread를 사용하여 클라이언트 요청을 처리하였습니다. 하지만 위와 같은 방법은 문제점이 있는데요, 1. 클라이언트의 요청이 증가함에 따라(이를 처리하는 thread의 수가 증가) 메모.. 2021. 9. 24.