Symfony 신입 데이터베이스 기술면접

Symfony 신입 · 취준 (0~1년) 데이터베이스 3문항 조회수 29 · 2026-08-04 (화) 12:47:40
1 Doctrine ORM 기본
Easy

Q. Symfony의 Doctrine ORM에서 Entity 클래스를 작성할 때 반드시 포함해야 하는 어노테이션과 그 역할에 대해 설명해주세요.

테이블 매핑, 기본키 설정, 컬럼 정의에 필요한 어노테이션들을 생각해보세요.

A. 모범답안

Doctrine Entity에는 최소한 세 가지 어노테이션이 필요합니다. @ORM\Entity는 클래스가 데이터베이스 엔티티임을 선언하며, @ORM\Table은 매핑될 테이블명을 지정합니다. @ORM\Id와 @ORM\GeneratedValue는 기본키 필드를 정의하고 자동 생성 전략을 설정합니다. @ORM\Column은 각 프로퍼티가 데이터베이스 컬럼과 매핑되도록 하며, 타입과 제약조건을 명시할 수 있습니다. 이러한 어노테이션을 통해 PHP 클래스와 데이터베이스 스키마가 자동으로 연결됩니다.

핵심 포인트
  • • @ORM\Entity로 엔티티 클래스 선언
  • • @ORM\Id와 @ORM\GeneratedValue로 기본키 설정
  • • @ORM\Column으로 각 필드를 컬럼에 매핑
답변에 넣으면 좋은 키워드
Entity ORM 어노테이션 매핑 Id Column GeneratedValue
실무에서는

실무에서 데이터베이스 테이블 구조를 PHP 객체로 매핑하여 타입 안전성을 확보하고 객체 지향적으로 데이터를 다룰 때 사용합니다.

Follow-up 질문

OneToMany 관계를 설정할 때 사용하는 어노테이션과 cascade 옵션에 대해 설명해보세요.

2 인덱스와 쿼리 성능
Medium

Q. 사용자 테이블에서 이메일로 검색하는 쿼리가 느려서 인덱스를 추가하려고 합니다. Doctrine에서 인덱스를 추가하는 방법과 인덱스가 성능을 개선하는 원리를 설명해주세요.

Entity 클래스의 어노테이션을 통해 인덱스를 정의할 수 있으며, 인덱스는 데이터 검색 속도와 관련이 있습니다.

A. 모범답안

Doctrine에서는 @ORM\Table 어노테이션의 indexes 속성을 사용하여 인덱스를 정의합니다. 예를 들어 이메일 필드에 인덱스를 추가하려면 @ORM\Table(indexes={@ORM\Index(name="email_idx", columns={"email"})}) 형태로 작성합니다. 인덱스는 데이터베이스가 특정 컬럼의 값을 정렬된 자료구조로 미리 저장해두는 것으로, 전체 테이블을 스캔하지 않고 빠르게 원하는 데이터를 찾을 수 있게 합니다. 특히 WHERE 절이나 JOIN 조건에 자주 사용되는 컬럼에 인덱스를 추가하면 조회 성능이 크게 향상됩니다. 다만 인덱스는 INSERT, UPDATE, DELETE 시 추가 비용이 발생하므로 적절히 사용해야 합니다.

핵심 포인트
  • • @ORM\Table의 indexes 속성으로 인덱스 정의
  • • 인덱스는 정렬된 자료구조로 검색 속도를 향상
  • • 조회 성능은 개선되지만 쓰기 작업에는 오버헤드 발생
답변에 넣으면 좋은 키워드
Index indexes 성능 WHERE 조회 최적화 스캔
실무에서는

실무에서 사용자 로그인 시 이메일로 조회하거나, 검색 기능에서 특정 필드로 자주 필터링할 때 인덱스를 추가하여 응답 속도를 개선합니다.

Follow-up 질문

복합 인덱스(Composite Index)는 언제 사용하며, 컬럼 순서가 왜 중요한지 설명해보세요.

3 트랜잭션과 데이터 일관성
Medium

Q. 온라인 쇼핑몰에서 주문 생성 시 재고를 차감하는 로직을 구현할 때, 동시에 여러 사용자가 같은 상품을 주문하면 재고가 음수가 될 수 있습니다. Doctrine에서 트랜잭션을 사용하여 이 문제를 방지하는 방법을 설명해주세요.

EntityManager의 트랜잭션 메서드와 데이터베이스 격리 수준을 고려해보세요.

A. 모범답안

Doctrine의 EntityManager를 통해 트랜잭션을 사용할 수 있습니다. $entityManager->beginTransaction()으로 트랜잭션을 시작하고, 재고 확인과 차감, 주문 생성을 한 트랜잭션 안에서 처리한 후 $entityManager->commit()으로 커밋합니다. 오류 발생 시에는 catch 블록에서 $entityManager->rollback()을 호출하여 모든 변경사항을 취소합니다. 동시성 문제를 완전히 방지하려면 비관적 락(Pessimistic Lock)을 사용하여 재고 조회 시 해당 행을 잠금으로써 다른 트랜잭션이 동시에 접근하지 못하도록 해야 합니다. 또는 낙관적 락(Optimistic Lock)을 사용하여 버전 필드로 충돌을 감지할 수도 있습니다.

핵심 포인트
  • • beginTransaction, commit, rollback으로 트랜잭션 관리
  • • 트랜잭션 내에서 재고 확인과 차감을 원자적으로 처리
  • • 비관적 락 또는 낙관적 락으로 동시성 문제 해결
답변에 넣으면 좋은 키워드
트랜잭션 EntityManager commit rollback 비관적 락 낙관적 락 동시성
실무에서는

실무에서 결제, 포인트 차감, 재고 관리 등 데이터 일관성이 중요한 비즈니스 로직에서 트랜잭션과 락을 사용하여 동시성 문제를 방지합니다.

Follow-up 질문

비관적 락과 낙관적 락의 차이점과 각각 어떤 상황에서 사용하는 것이 적절한지 설명해보세요.

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!