개요
"Prisma 사용할 때 @map 과 @@map 의 차이가 뭐예요?"
나는 해당 질문을 들었을 때 벙쪘다...
'그냥 단순히 @map은 필드에 사용하고 @@map은 테이블에 쓰는 거 아닌가?'
막연하게 지금까지 그렇게 사용하는 것을 보고 그대로 사용했던 나로서는 당혹스럽지 않을 수 없었다...
그럼 @map과 @@map의 역할은 뭐고, 또 무슨 차이가 있는거지...?
대충은 알 것 같은데, 또 명확하게 정답이라고 내놓을 자신은 없었다...
본론으로 돌아와서, 이 질문의 의도는 뭘까?
단순히 궁금해서 물어봤을 수도 있고, 제대로 알고 있는지 테스트하는 것일 수도 있다.
다만 내가 이 질문에서 느꼈던 건 어떤 문법을 사용하고 도구를 이용하든, 그 의도와 목적을 명확히 파악하고, 무슨 역할을 하는 도구인지, 어떻게 작동하는 문법인지, 확실하게 알고 사용할 필요가 있다는 사실이다.
따라서 이번 시간에는 Prisma를 다시 공부하는 시간을 가져보겠다!!!
Prisma
데이터베이스와 애플리케이션 간의 데이터 관리를 간소화하는 ORM (Object-Relational Mapping) 도구로써, DB에 있는 데이터를 JavaScript, TypeScript, 또는 Node.js 애플리케이션에서 쉽게 사용할 수 있도록 해주며, 일반적인 SQL 쿼리를 작성하지 않고도 데이터베이스와 상호작용할 수 있도록 도와준다.
Prisma는 특히 TypeScript와의 강력한 통합으로 정적 타입 안전성과 자동 완성을 제공한다.
주요 구성 요소
- Prisma Client
애플리케이션 코드에서 데이터베이스에 안전하게 접근하고 조작할 수 있도록 자동 생성된 안전 타입 API.
- Prisma Migrate
데이터베이스의 스키마를 안전하게 변경하고 마이그레이션을 쉽게 관리할 수 있는 도구. 개발자가 Prisma 스키마 파일을 업데이트하고 이를 데이터베이스와 동기화하는 과정을 자동화한다.
- Prisma Studio
데이터베이스 데이터를 시각적으로 탐색하고 관리할 수 있는 웹 기반 UI. SQL 쿼리 없이 데이터베이스의 테이블과 레코드를 관리할 수 있다.
- Prisma Schema
Prisma의 핵심 구성 요소로, 데이터 모델 정의와 데이터베이스 설정을 포함한 파일(schema.prisma). 이 파일에서 데이터베이스 모델(테이블 및 관계)을 정의하고, 데이터베이스 연결 정보를 설정한다.
특징
- 타입 안정성
Prisma는 데이터베이스 스키마를 기반으로 정적 타입을 자동 생성한다. 이를 통해 애플리케이션 코드에서 SQL 쿼리 오류를 방지할 수 있으며, 코드 작성 시 자동 완성 기능을 제공하여 개발자 경험을 개선한다.
- 쿼리 API
Prisma Client는 다양한 CRUD 작업을 위한 강력한 API를 자동으로 생성한다. 이를 통해 복잡한 SQL 쿼리를 직접 작성할 필요 없이 데이터베이스와 상호작용할 수 있다.
findMany: 여러 레코드 조회
findFirst: 첫 번째 레코드 조회
findUnique: 고유한 레코드 조회
create: 새 레코드 생성
update: 레코드 업데이트
delete: 레코드 삭제
그 밖에도 Migration, 다중 DB 지원, 관계형 데이터 처리, 확장성 등이 있다.
Prisma를 사용하는 이유 (ORM을 사용하는 이유)
- 생산성 향상
복잡한 SQL 쿼리 대신 직관적인 JavaScript / TypeScript 코드를 사용하여 데이터베이스 작업을 할 수 있다.
- 타입 안전성
정적 타입 검사를 통해 데이터베이스 관련 버그를 미리 예방할 수 있다.
- 자동 마이그레이션 관리
Prisma Migrate를 통해 데이터베이스 스키마 변경 사항을 쉽게 관리할 수 있다.
- 복잡한 관계형 데이터 처리
Prisma는 관계형 데이터베이스와의 상호작용을 간편하게 만들어 준다.
본론
자, 그럼 이제 처음 질문을 받았던 @map 과 @@map 의 차이를 한 번 알아보자.
우선 내가 알고 있던 바와 같이 @map은 데이터베이스에서 실제로 사용되는 필드 이름을 지정할 때 사용하고, @@map은 테이블 이름을 지정할 때 사용한다. 이를 통해 Prisma 모델의 필드 이름 또는 모델 이름과 데이터베이스의 실제 스키마를 다르게 매핑할 수 있다. 따라서 둘의 주요 차이는 적용 대상인 것이다!
- @map (필드 수준 매핑)
모델의 필드를 데이터베이스에서 다른 이름으로 매핑할 때 사용된다. 즉, Prisma 모델에서 사용하는 필드 이름과 실제 데이터베이스에 저장되는 컬럼 이름이 다를 때 사용한다.
- @@map (모델 수준 매핑)
모델 자체를 데이터베이스의 다른 테이블 이름으로 매핑할 때 사용된다. 즉, Prisma에서 사용하는 모델 이름과 데이터베이스의 테이블 이름이 다를 때 사용한다.
만약 아래와 같이 prisma model을 작성했다고 가정해보자!
model Test {
testId Int @id @default(autoincrement()) @map("testId")
@@map("Test")
}
뭔가 이상하지 않은가!?
@map과 @@map을 사용했지만 실제 필드와 테이블 네임과 동일한 네임을 가진다!
다시 말해, 이는 불필요하게 @map과 @@map을 사용하고 있는 것이다!!!
따라서 의도를 반영해서 prisma model을 작성하자면,
model Test {
testId Int @id @default(autoincrement())
}
이렇게 작성하는 것이 더 간결하고 명확한 모델이 된다.
이제 정리해보자!!!
@map과 @@map은 Prisma 모델의 필드 이름이나 모델 이름이 데이터베이스에서 사용되는 이름과 다를 경우에만 사용하는 것이 바람직하다!
'Side Projects' 카테고리의 다른 글
모듈 시스템에서 변수 바인딩 방식 (0) | 2024.10.11 |
---|---|
Chrome dino 모작 - 트러블 슈팅 (1) | 2024.10.07 |
Session Storage / Local Storage (0) | 2024.09.23 |
gabia에서 ec2 인스턴스 도메인 설정하고 관리하기 (0) | 2024.09.20 |
추억 앨범 페이지 만들기 (0) | 2024.09.11 |