Symfony 신입 데이터베이스 기술면접
새 면접Q. Symfony의 Doctrine ORM에서 Entity 클래스를 작성할 때 반드시 포함해야 하는 어노테이션과 그 역할에 대해 설명해주세요.
테이블 매핑, 기본키 설정, 컬럼 정의에 필요한 어노테이션들을 생각해보세요.
Doctrine Entity에는 최소한 세 가지 어노테이션이 필요합니다. @ORM\Entity는 클래스가 데이터베이스 엔티티임을 선언하며, @ORM\Table은 매핑될 테이블명을 지정합니다. @ORM\Id와 @ORM\GeneratedValue는 기본키 필드를 정의하고 자동 생성 전략을 설정합니다. @ORM\Column은 각 프로퍼티가 데이터베이스 컬럼과 매핑되도록 하며, 타입과 제약조건을 명시할 수 있습니다. 이러한 어노테이션을 통해 PHP 클래스와 데이터베이스 스키마가 자동으로 연결됩니다.
- • @ORM\Entity로 엔티티 클래스 선언
- • @ORM\Id와 @ORM\GeneratedValue로 기본키 설정
- • @ORM\Column으로 각 필드를 컬럼에 매핑
실무에서 데이터베이스 테이블 구조를 PHP 객체로 매핑하여 타입 안전성을 확보하고 객체 지향적으로 데이터를 다룰 때 사용합니다.
OneToMany 관계를 설정할 때 사용하는 어노테이션과 cascade 옵션에 대해 설명해보세요.
Q. 사용자 테이블에서 이메일로 검색하는 쿼리가 느려서 인덱스를 추가하려고 합니다. Doctrine에서 인덱스를 추가하는 방법과 인덱스가 성능을 개선하는 원리를 설명해주세요.
Entity 클래스의 어노테이션을 통해 인덱스를 정의할 수 있으며, 인덱스는 데이터 검색 속도와 관련이 있습니다.
Doctrine에서는 @ORM\Table 어노테이션의 indexes 속성을 사용하여 인덱스를 정의합니다. 예를 들어 이메일 필드에 인덱스를 추가하려면 @ORM\Table(indexes={@ORM\Index(name="email_idx", columns={"email"})}) 형태로 작성합니다. 인덱스는 데이터베이스가 특정 컬럼의 값을 정렬된 자료구조로 미리 저장해두는 것으로, 전체 테이블을 스캔하지 않고 빠르게 원하는 데이터를 찾을 수 있게 합니다. 특히 WHERE 절이나 JOIN 조건에 자주 사용되는 컬럼에 인덱스를 추가하면 조회 성능이 크게 향상됩니다. 다만 인덱스는 INSERT, UPDATE, DELETE 시 추가 비용이 발생하므로 적절히 사용해야 합니다.
- • @ORM\Table의 indexes 속성으로 인덱스 정의
- • 인덱스는 정렬된 자료구조로 검색 속도를 향상
- • 조회 성능은 개선되지만 쓰기 작업에는 오버헤드 발생
실무에서 사용자 로그인 시 이메일로 조회하거나, 검색 기능에서 특정 필드로 자주 필터링할 때 인덱스를 추가하여 응답 속도를 개선합니다.
복합 인덱스(Composite Index)는 언제 사용하며, 컬럼 순서가 왜 중요한지 설명해보세요.
Q. 온라인 쇼핑몰에서 주문 생성 시 재고를 차감하는 로직을 구현할 때, 동시에 여러 사용자가 같은 상품을 주문하면 재고가 음수가 될 수 있습니다. Doctrine에서 트랜잭션을 사용하여 이 문제를 방지하는 방법을 설명해주세요.
EntityManager의 트랜잭션 메서드와 데이터베이스 격리 수준을 고려해보세요.
Doctrine의 EntityManager를 통해 트랜잭션을 사용할 수 있습니다. $entityManager->beginTransaction()으로 트랜잭션을 시작하고, 재고 확인과 차감, 주문 생성을 한 트랜잭션 안에서 처리한 후 $entityManager->commit()으로 커밋합니다. 오류 발생 시에는 catch 블록에서 $entityManager->rollback()을 호출하여 모든 변경사항을 취소합니다. 동시성 문제를 완전히 방지하려면 비관적 락(Pessimistic Lock)을 사용하여 재고 조회 시 해당 행을 잠금으로써 다른 트랜잭션이 동시에 접근하지 못하도록 해야 합니다. 또는 낙관적 락(Optimistic Lock)을 사용하여 버전 필드로 충돌을 감지할 수도 있습니다.
- • beginTransaction, commit, rollback으로 트랜잭션 관리
- • 트랜잭션 내에서 재고 확인과 차감을 원자적으로 처리
- • 비관적 락 또는 낙관적 락으로 동시성 문제 해결
실무에서 결제, 포인트 차감, 재고 관리 등 데이터 일관성이 중요한 비즈니스 로직에서 트랜잭션과 락을 사용하여 동시성 문제를 방지합니다.
비관적 락과 낙관적 락의 차이점과 각각 어떤 상황에서 사용하는 것이 적절한지 설명해보세요.
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!