본문 바로가기
개발 기초 다지기

복습 그동안 소소하게 궁금했던것들 정리 (스키마 관계 설정, 모듈 export default)

by 너의고래 2024. 6. 25.

감사하게도 캠프 중 지금까지 공부했던 것 중 부족한 부분을 공부할 수 있는 시간을 주셨다. 안그래도 이해가 잘 가지 않는 부분을 적어놓고 주말중 복습을 진행할 예정이었는데, 이번 기회로 이 부분을 꼼꼼하게 채워나갈 수 있게 되었다.

지금 내가 부족한 부분이 인증, 인가 미들웨어, 오류 처리, 트렌젝션, 로그 정도로 크게 나눌 수 있을 것 같다. 인증, 인가 부분은 지속적으로 프로젝트를 진행하며 계속 한 부분이긴하지만, 팀프로젝트에서 어쩌다보니 내가 CRUD만 주구장창 맡게되면서 생각보다 이해도가 높지 않다. (대신 CRUD랑 데이터베이스쪽은 생각보다 마스터가 되어있다.) 과거 들었던 강의들을 다시 듣고 구현했던 코드들을 다시 보며 공부를 진행하고있다. 아직 이 부분은 정리할 정도로 깔끔하게 마무리된 것 같지 않아, 오늘 공부하며 작게 하나둘씩 궁금했던 부분은 해소했던 부분을 정리해보려 한다.

1. 스키마 관계설정에서 첫번째 키워드는?

model Users {
  userId    Int      @id @default(autoincrement()) @map("userId")
  email     String   @unique @map("email")
  password  String   @map("password")
  createdAt DateTime @default(now()) @map("createdAt")
  updatedAt DateTime @updatedAt @map("updatedAt")

  userInfos UserInfos? // 사용자(Users) 테이블과 사용자 정보(UserInfos) 테이블이 1:1 관계를 맺습니다.

  @@map("Users")
}


model UserInfos {
  userInfoId   Int      @id @default(autoincrement()) @map("userInfoId")
  userId       Int      @unique @map("userId") // 사용자(Users) 테이블을 참조하는 외래키
  name         String   @map("name")
  age          Int?     @map("age")
  gender       String   @map("gender")
  profileImage String?  @map("profileImage")
  createdAt    DateTime @default(now()) @map("createdAt")
  updatedAt    DateTime @updatedAt @map("updatedAt")

  // Users 테이블과 관계를 설정합니다.
  user Users @relation(fields: [userId], references: [userId], onDelete: Cascade)

  @@map("UserInfos")
}

나름 데이터베이스, 스키마 쪽을 열심히 공부했다고 생각했는데, 항상 관계 설정하는 곳의 맨 앞쪽에 있는 키워드는 역할이 무엇인지 궁금했다. (UserInfos에 있는 관계설정의 맨 앞에 있는 'user') 튜터님들께서는 그냥 칭하는 것이라고했는데 나에게는 별로 와닿지 않은 설명이었다. 그래서 이번에 복습하면서 이 스키마가 나오길래 시간 여유도 있는김에 한번 찾아보았다.

Prisma 스키마에서 user는 관계를 설정할 때 사용되는 특별한 키워드이다. userUserInfos 모델에서 Users 모델과의 관계를 나타내는 역할을 한다.

여기서 user는 다음과 같은 역할을 수행한다:

  1. 관계 설정:
    • @relation 데코레이터를 사용하여 데이터 모델 간의 관계를 설정할 때, user해당 관계를 식별하는 이름이다. 이 이름을 사용하여 UserInfos 모델에서 Users 모델과의 관계를 정의합니다.
  2. 필드 매핑:
    • @relation(fields: [userId], references: [userId], onDelete: Cascade)에서 userUserInfos 모델의 userId 필드가 Users 모델의 userId와 연결됨을 나타낸다. 즉, UserInfos 테이블의 userId 필드는 Users 테이블의 userId를 외래 키로 참조하게 됩니다.

따라서 user는 Prisma에서 데이터 모델 간의 관계를 설정할 때 사용되는 이름으로, 이를 통해 데이터베이스에서의 관계를 코드로 명확하게 정의하고 다룰 수 있다.

이번 팀프로젝트를 진행하며, 내가 사용한 connect에 명시된 부분이 바로 이부분이었다. 튜터님들 말씀처럼 그냥 명칭이 맞는데, 정확히 관계를 식별하는 이름이라고 알게되어 깔끔하게 정리 된 기분이다.

2. JavaScript 모듈을 통해 export시, default와 이름을 명시해주었을 때는 어떤점이 다를까?

과제를 진행하며, 수도 없이 import와 export를 진행했다. 나는 대체로 이름을 명시해주고 export를 해서 import 할 때도 그렇게 진행하였는데, 강의를 보면 default로 진행하는 경우가 많았다. 이 부분에 대해서는 아무도 말해주지 않아 이번기회에 찾아보았다.

export default

  • 사용법: 모듈에서 한 번만 사용할 수 있다.
  • 설명: 모듈에서 하나의 기능이나 객체를 기본적으로 내보낼 때 사용된다. 다른 파일에서 해당 모듈을 불러올 때는 기본으로 내보낸 객체를 바로 가져올 수 있다.
    // ModuleA.js
    const someObject = { name: "John", age: 30 };
    export default someObject;
    // 다른 파일에서 ModuleA.js 불러오기
    import someObject from './ModuleA.js';
    console.log(someObject); // { name: "John", age: 30 }
  • 예를 들어:
  • 한 모듈에서 한 번만 사용: export default는 하나의 모듈에서 하나만 사용할 수 있으며, 기본적으로 내보내는 객체를 다른 파일에서 불러올 때는 해당 객체의 이름을 자유롭게 지정할 수 있습니다.

 

함수를 export default로 내보낸다면.

// ModuleA.js
export default function() {
  console.log("This is a default function.");
}
    • export default를 사용하여 함수나 객체를 내보낼 경우, import 구문에서는 기본으로 내보낸 항목을 가져올 때 이름을 직접 지정할 필요가 없다.
    • 함수를 export default로 내보낼 때는 그 함수를 가져올 때 함수 이름을 자유롭게 지정할 수 있다.
    • 객체를 export default로 내보낼 때는 그 객체를 가져올 때 객체 이름을 자유롭게 지정할 수 있다.

명시적인 이름을 지정해줄 때

  • 사용법: 여러 개의 기능이나 객체를 내보낼 수 있다.
  • 설명: 각 객체나 기능에 이름을 지정하여 외부에서 해당 이름으로 접근할 수 있다. 이 방식은 모듈에서 여러 개의 객체나 함수를 내보내고자 할 때 사용된다.
    // ModuleB.js
    export const functionA = () => { /* ... */ };
    export const functionB = () => { /* ... */ };
    // 다른 파일에서 ModuleB.js 불러오기
    import { functionA, functionB } from './ModuleB.js';
    functionA();
    functionB();
  • 예를 들어:
  • 여러 개 사용 가능: 명시적으로 이름을 지정해주면 한 모듈에서 여러 개의 객체나 함수를 내보낼 수 있다. 외부에서는 해당 이름들을 사용하여 접근할 수 있다.

요약

  • export default는 한 모듈에서 하나의 객체나 기능을 기본적으로 내보낼 때 사용된다.
  • 명시적인 이름을 지정하여 export할 경우 여러 개의 객체나 함수를 내보낼 수 있다.

따라서 모듈의 사용 목적에 따라 export default와 명시적인 이름을 지정하여 export하는 방식을 적절히 선택하여 사용할 수 있다.

 

내가 궁금했던 사용 상황과, import 할 때 어떻게 이름을 지정해야하는가에 대한 궁금증이 풀렸다.

 

아무래도 과제와 함께 급하게 진행하다보니 이러한 부분들을 놓치고 진행할 때가 많았는데 이번기회로 코드를 작성함에 대해 찝찝함이 사라지고 조금더 깔끔한 기분으로 할 수 있게된 것 같다.

댓글