기출 ORM 필요성과 원리

agnusdei·어제
0

Database

목록 보기
30/33

[문제] ORM과 그 필요성, 구현 단계에서 적용되는 기술에 대해 설명하시오.


1. 정의 (Definition)

ORM(Object-Relational Mapping)이란,
객체지향 프로그래밍의 객체와 관계형 데이터베이스(RDBMS)의 테이블 간의 구조적/행위적 차이를 자동으로 연결(Mapping)해주는 기술이다.

  • TypeScript에서는 클래스 또는 모델을 통해 객체를 정의하고,
  • RDB에서는 정형화된 테이블 스키마로 데이터를 저장하며,
  • ORM은 이 둘 간의 **구조적 불일치(Paradigm Mismatch)**를 해소해준다.

2. 도입 배경 및 필요성 (Necessity)

2.1 패러다임 불일치 해소

항목객체지향 모델관계형 모델
단위객체(Class/Instance)테이블/행(Row)
관계 표현참조(Reference)외래키(Foreign Key)
상속 표현클래스 상속별도 테이블 설계 필요
타입 체계언어의 타입 시스템SQL 기반 정적 타입

→ ORM은 이러한 차이를 자동으로 해석하여 매핑함. (예: Prisma에서 @relation으로 관계 표현)

2.2 생산성 향상 및 개발 효율화

  • 반복적인 SQL 작성 생략 → 코드 간결화
  • 객체 중심 비즈니스 로직 작성 가능

2.3 유지보수성과 이식성 향상

  • Prisma 스키마 변경 → 자동 마이그레이션 및 타입 반영
  • 다양한 DBMS(PostgreSQL, MySQL, SQLite 등)에 대응

2.4 정적 타입 보장(Type Safety)

  • Prisma는 모델 기반으로 TypeScript 타입 자동 생성
  • 컴파일 타임에 오류 검출 가능 → 안정성 향상

3. ORM의 구현 단계별 적용 기술 (TypeScript + Prisma 중심)

[1단계] 모델링 및 매핑 설계

  • Prisma의 schema.prisma 파일에 모델 구조를 정의
  • 각 모델은 DB 테이블과 1:1 매핑
model User {
  id    Int    @id @default(autoincrement())
  name  String
  email String @unique
  posts Post[]
}
  • 관계(Relation): UserPost는 1\:N 관계, @relation으로 표현
  • 타입 매핑: Prisma 타입 → TypeScript 타입으로 자동 변환

[2단계] 타입 매핑과 객체-컬럼 간 구조 변환

(1) 기본 타입 매핑

  • TypeScript ↔ RDBMS 간의 매핑이 Prisma 내부에서 자동 수행됨
Prisma 타입TypeScript 타입SQL 타입 예시
StringstringVARCHAR, TEXT
IntnumberINT, BIGINT
BooleanbooleanBOOLEAN, TINYINT(1)
DateTimeDateTIMESTAMP, DATETIME

→ 예: Prisma 모델의 name: String → DB에서는 VARCHAR, 코드에서는 string

(2) 타입 전환의 의미

  • Object → RDB: Prisma가 객체 속성을 SQL INSERT/UPDATE용 데이터로 변환
  • RDB → Object: SQL 결과를 객체로 역변환하여 개발자가 사용 가능

[3단계] 데이터 조작 및 트랜잭션 처리

(1) 데이터 생성 및 관계 포함 저장

await prisma.user.create({
  data: {
    name: '엔지니어',
    email: 'eng@openai.com',
    posts: {
      create: [{ title: 'ORM 정복하기', content: '기술사 수준으로 접근' }]
    }
  }
});
  • 관계형 조인 없이도 객체 구조로 관계 정의 가능

(2) 조회 및 관계 탐색

const user = await prisma.user.findUnique({
  where: { id: 1 },
  include: { posts: true }
});

→ 내부적으로 JOIN 쿼리를 자동 생성하여 관계 탐색 수행

(3) 트랜잭션 처리

await prisma.$transaction([
  prisma.user.create(...),
  prisma.post.create(...)
]);
  • 여러 쿼리를 단일 트랜잭션으로 처리

[4단계] 스키마 마이그레이션 및 동기화

(1) DB 구조 변경 관리

npx prisma migrate dev --name add_user_table
  • Prisma 스키마 변경 시 DB 구조 자동 반영
  • 마이그레이션 로그 관리 가능

(2) Prisma Client 재생성

npx prisma generate
  • 모델 변경 사항이 TypeScript 타입에 반영됨

4. ORM 적용 시 고려사항

  • N+1 쿼리 문제: Prisma는 기본적으로 명시적 관계 조회 사용 (Lazy Loading 없음)
  • 복잡 쿼리 처리: prisma.$queryRaw 또는 prisma.$executeRaw로 SQL 직접 사용 가능
  • 대규모 시스템 성능 튜닝: Prisma는 SQL 추적이 가능하므로 로그 기반 분석 중요

5. 어린이 요약

  • ORM은 개발자가 "사람 만들기", "글 쓰기" 같은 걸 코드로 하면,
  • 알아서 컴퓨터가 데이터베이스에 저장해줘요!
  • Prisma는 TypeScript랑 잘 어울려서 실수도 적고, 빠르고 똑똑해요!

[기술사 핵심 요약 정리]

항목설명
정의객체-관계 간 구조를 자동으로 매핑해주는 기술
목적SQL 추상화, 생산성 향상, 유지보수성 확보
기술Prisma ORM + TypeScript + PostgreSQL
핵심 기능모델 정의, 타입 매핑, 관계 설정, 트랜잭션 처리, 마이그레이션
적용 계층데이터 액세스 계층 (DAO/Repository)
주요 장점타입 안전성, 관계 표현 명확성, 마이그레이션 자동화

0개의 댓글