2025년 1월 13일

김동환·2025년 1월 13일

오늘의 코드
address.repository.js 업데이트로 수정했습니다.

import { prisma } from './../utils/prisma/index.js';

class AddressRepository {
  #orm;

  constructor(orm) {
    this.#orm = orm;
  }

  // 주소 생성
  createAddress = async ({ address, addressName, userId }) => {
    return await this.#orm.address.create({
      data: {
        userId,
        address,
        addressName,
      },
    });
  };

  // 주소 조회
  getAllAddress = async () => {
    return await this.#orm.address.findMany();
  };

  // 주소 수정
  updateAddress = async ({ addressId, address, addressName }) => {
    console.log(addressId);
    return await this.#orm.address.update({
      where: {
        addressId,
      },
      data: {
        address: address,
        addressName: addressName,
      },
    });
  };

  // 주소 삭제
  deleteAddress = async ({ addressId }) => {
    return await this.#orm.address.delete({
      where: { addressId },
    });
  };

  // 주소 찾기
  findUnique = async (addressId) => {
    return await this.#orm.address.findUnique({ where: { addressId } });
  };

  // 유저 찾기
  findUser = async (userId) => {
    return await this.#orm.user.findUnique({
      where: { userId },
    });
  };

  // 메인 주소 설정
  setMainAddress = async ({ addressId, userId }) => {
    // 1. 기존 메인 주소 비활성화
    await this.#orm.address.updateMany({
      where: { userId, mainAddress: true },
      data: { mainAddress: false },
    });

    // 2. 지정된 주소를 메인 주소로 설정
    return await this.#orm.address.update({
      where: { addressId },
      data: { mainAddress: true },
    });
  };

  // Repository 메서드: 특정 사용자의 mainAddress가 true인 주소들을 조회
  getMainAddresses = async (userId) => {
    return await this.#orm.address.findMany({
      where: {
        userId, // 특정 사용자
        mainAddress: true, // mainAddress가 true인 항목만
      },
    });
  };

  // 특정 사용자의 모든 주소 조회
  getAllAddressesByUserId = async (userId) => {
    return await this.#orm.address.findMany({
      where: { userId },
    });
  };
}

export default new AddressRepository(prisma);

오늘 배운 것 (TIL - Today I Learned)

프로젝트: AddressRepository 클래스 구현


1. AddressRepository란?

  • AddressRepository는 데이터베이스와 상호작용하는 클래스이다.
  • 사용자의 주소 정보를 CRUD(생성, 조회, 수정, 삭제) 작업을 수행한다.
  • Prisma ORM을 활용하여 데이터베이스와 연결된다.

2. 주요 배운 점

1) 클래스와 생성자

  • 클래스 내에서 private 필드(#orm)를 선언하여 외부에서 접근하지 못하게 설정했다.
  • 생성자를 통해 의존성 주입(DI, Dependency Injection) 방식으로 Prisma ORM을 전달받았다.
    constructor(orm) {
      this.#orm = orm;
    }

2) CRUD 메서드

  • 주소 생성 (createAddress)

    • userId, address, addressName을 받아 새로운 주소를 데이터베이스에 추가한다.
    createAddress = async ({ address, addressName, userId }) => {
      return await this.#orm.address.create({
        data: {
          userId,
          address,
          addressName,
        },
      });
    };
  • 주소 조회 (getAllAddress)

    • 모든 주소를 조회하는 메서드.
    getAllAddress = async () => {
      return await this.#orm.address.findMany();
    };
  • 주소 수정 (updateAddress)

    • addressId를 기준으로 해당 주소의 내용을 수정한다.
    updateAddress = async ({ addressId, address, addressName }) => {
      return await this.#orm.address.update({
        where: { addressId },
        data: { address, addressName },
      });
    };
  • 주소 삭제 (deleteAddress)

    • addressId로 특정 주소를 삭제한다.
    deleteAddress = async ({ addressId }) => {
      return await this.#orm.address.delete({
        where: { addressId },
      });
    };
  • 주소 찾기 (findUnique)

    • addressId를 통해 특정 주소를 조회한다.
    findUnique = async (addressId) => {
      return await this.#orm.address.findUnique({ where: { addressId } });
    };
  • 유저 찾기 (findUser)

    • userId로 특정 유저 정보를 조회한다.
    findUser = async (userId) => {
      return await this.#orm.user.findUnique({
        where: { userId },
      });
    };

3. Prisma ORM 사용법

  • create: 데이터를 생성한다.
  • findMany: 여러 데이터를 조회한다.
  • update: 데이터를 수정한다.
  • delete: 데이터를 삭제한다.
  • findUnique: 특정 데이터를 조회한다.

4. 기타 배운 점

  • private 필드 사용: #를 이용해 클래스 내부에서만 접근할 수 있도록 설정.
  • ES6 Arrow Function: 클래스 메서드에서 this 컨텍스트가 유지되도록 사용.
  • 데이터 구조와 명확한 인자 전달: 메서드 호출 시 객체 구조 분해 할당 사용.

5. 추가 개선점

  • 에러 처리: 현재 코드에서는 에러 발생 시 예외 처리가 누락되어 있다. 각 메서드에 try-catch 블록을 추가하여 안정성을 높이는 것이 필요하다.
  • 테스트 코드 작성: 각 메서드가 의도대로 동작하는지 확인하기 위해 단위 테스트(Unit Test)를 작성해야 한다.

앞으로 이 구조를 활용해 API 구현 및 확장된 기능을 추가할 계획입니다.

profile
Node.js 7기

0개의 댓글