[Tistory] 신입 개발자 기술면접 : 데이터베이스 01

원글 페이지 : 바로가기

🗣️ DBMS란? DBMS (Database Management Sysyem, 데이터베이스 관리 시스템) 는 데이터베이스 내 데이터에 접근하도록 도와주는 시스템입니다. DBMS는 크게 질의처리기와 저장시스템으로 이루어져 있습니다. DB를 사용하지 않고, OS에 종속적인 파일 시스템을 사용하면 프로그램의 확장성을 해치고 검색 효율이 크게 떨어집니다. 또한 파일 시스템의 데이터 중복, 비일관성, 검색 등의 문제를 해결할 수 있습니다. 널리 사용되는 DBMS 중 일부는 MySql, Oracle 등입니다. 🗣️ RDBMS란? 관계형 데이터베이스 관리 시스템 (RDBMS)은 데이터베이스에 별도의 테이블에 저장된 관계형 데이터 모델을 기반으로하며 공통 열의 사용과 관련이 있습니다. SQL (Structured Query Language)을 사용하여 관계형 데이터베이스에서 데이터에 쉽게 액세스 할 수 있습니다. 🗣️ 데이터베이스를 이용해 개발해 본 경험이 있나요? 저는 OO프로젝트를 수행하며 OO에 대한 데이터베이스를 구축 및 활용했습니다. OO테이블을 생성했고, 겹치는 OO가 없다는 점을 고려해 OO을 기본 키로 설정했습니다. 그리고 필요한 정보 OO에 따라 JOIN 연산을 이용해 테이블을 조회해 사용자에게 제공했습니다. 구축했던 데이터베이스에 저장한 정보, 테이블의 구성, 키 값을 생각해 보고 답변을 준비해야 합니다. 구축했던 데이터베이스의 키 값에 대한 유효성을 묻거나, ERD를 간략히 그리는 것을 요구할 수 있습니다. 추가로 어떤 DBMS를 사용했고, 왜 사용했는지, 장단점은 무엇인지를 알고 있어야 합니다. 🗣️ NoSQL이 무엇인지 관계형 데이터베이스와 비교해 설명해 보세요. NoSQL은 비관계형 데이터베이스로, 2차원 형태의 관계형 데이터베이스보다 유연한 데이터 구조를 가질 수 있습니다. 그래서 Document, Key-Value, Graph 등 다양한 형태로 데이터를 저장할 수 있습니다. 또한, 서버 증설을 통한 데이터베이스 확장이 가능해서 방대한 양의 데이터를 저장하는 데 유리합니다. 하지만 중복 데이터를 허용하므로 데이터를 갱신하는 경우 관계형 데이터베이스보다 처리 비용이 많이 든다는 단점이 있습니다. RDB(관계형 데이터베이스) 정해진 스키마에 따라 데이터를 ‘테이블’에 저장하는 데이터베이스 데이터 구조가 보장되어있고, 중복을 피할 수 있습니다. SQL을 사용해 RDBMS에서 데이터를 저장, 수정, 삭제 및 검색할 수 있습니다. 수직적 확장이 가능합니다. (서버의 성능을 향상시키는 것) 관계를 맺고 있는 데이터의 변경이 잦은 경우 / 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우에 사용합니다. NoSQL 스키마가 없거나, 느슨한 스키마로 데이터 간의 관계 없이 자유로운 형태로 데이터를 저장하는 데이터베이스 (비정형) 유연하기 때문에 데이터 조정과 새로운 필드 생성이 자유롭습니다. 중복을 계속해서 업데이트 해줘야 하는 단점이 있습니다. 수평적 확장으로 트래픽 분산 및 대용량 처리가 가능합니다. 읽기를 자주하지만 데이터 변경은 자주 없는 경우 / 비정형의 데이터 구조를 가진 경우 / 막대한 양의 데이터에 의해 데이터베이스를 수평적으로 확장해야 하는 경우에 사용 표로 간단히 정리하면 다음과 같습니다. 구분 관계형 데이터베이스 NoSQL 데이터베이스 데이터 저장 2차원 테이블 분산형 구조로, 다양한 형태 데이터 중복 없음 있다. 갱신 시 이를 처리해야 함 스키마 스키마가 있어서 데이터의 무결성을 보장함 스키마가 없고 유연한 데이터 처리 가능 데이터 확장 수직적 확장 지원 (서버 자체 성능 향상) 수평적 확장 지원 (분산형으로 서버 추가) DBMS Oracle, MySQL, SQLite MongoDB 🗣️ 데이터베이스에서의 ‘키’ 에 대해 아는대로 설명해 주세요. 검색, 정렬 시 튜플(행, 레코드) 을 구분하는 기준이 되는 속성을 의미합니다. 키는 유일성과 최소성이라는 두 가지 특성을 가질 수 있습니다. 유일성 : 하나의 키 값으로 튜플을 식별할 수 있다. 모든 레코드에서 해당 필드에 중복된 값이 나타나지 않는다는 속성 최소성 : 튜플을 식별하는 데 필요한 속성만으로 이루어져 있다. 최소한의 필드로 레코드를 유일하게 구별할 수 있어야 한다는 속성 🔑 슈퍼키 (Super Key) 테이블에 존재하는 필드들의 부분집합으로써, 유일성을 만족해야 하는 키입니다. 부분 집합이므로 필드 하나도 슈퍼키가 될 수 있고, 필드 여러 개가 묶인 키도 슈퍼키가 될 수 있습니다. 필드가 여러 개가 묶인 키를 ‘복합키’라고도 부릅니다. 🔑 후보키 (Candidate Key) 후보키는 기본 키가 될 수 있는 후보가 되는 키들을 의미합니다. 슈퍼키 중에서 최소성을 만족하는 키를 의미합니다. 따라서 후보키는, 유일성 + 최소성을 만족하는 키들을 의미합니다. 🔑 기본키 (Primary Key) 기본 키는 테이블에서 특정 레코드를 구별하기 위해 후보 키 중에서 선택된 하나의 고유한 식별자를 의미합니다. 중복되는 값이나 NULL값은 가질 수 없습니다. 후보키 중에서 값이 자주 변경되지 않고, 값이 단순한 것을 선택하는 것이 좋습니다. 🔑 대체키 (Alternate Key) 후보 키 중에서 기본 키로 선택된 것들을 제외한 나머지 모든 것을 대체키라고 부릅니다. 🔑 외래키 (Foreign Key) 한 테이블의 키 중에서 다른 테이블의 레코드를 유일하게 식별할 수 있는 키를 의미합니다. 하나의 필드 또는 전체 필드의 부분집합으로 구성되고, 중복된 값과 NULL값을 가질 수 있으며 반드시 참조되는 테이블에서 유일한 값을 갖는 필드를 참조해야 합니다. 데이터베이스에서는 참조 무결성을 위해 참조 대상이 존재하지 않는 외래 키를 허용하지 않습니다. 즉, 어떠한 외래 키 BB가 AA를 참조한다면, AA는 반드시 데이터베이스에 존재해야 합니다. 외래 키는 참조 무결성을 지키기 위해 RESTRICTED와 CASCADE, SET NULL이라는 개념을 외래 키에 적용할 수 있도록 기능을 제공합니다. RESTRICTED : 레코드를 변경 또는 삭제하고자 할 때 해당 레코드를 참조하고 있는 개체가 있다면, 변경 또는 삭제 연산을 취소한다. CASCADE : 레코드를 변경 또는 삭제하면, 해당 레코드를 참조하고 있는 개체도 변경 또는 삭제된다. SET NULL : 레코드를 변경 또는 삭제하면, 해당 레코드를 참조하고 있는 개체의 값을 NULL로 설정한다. 🗣️ 슈퍼 키와 후보 키의 차이점을 설명해 보세요. 슈퍼 키와 후보 키 모두 튜플을 식별할 수 있는, 유일성을 만족하는 키입니다. 하지만 슈퍼 키는 최소성을 만족하지 않아도 됩니다. 따라서 슈퍼 키에는 튜플을 식별할 수 없는 속성이 포함될 수 있습니다. 반면에 후보 키는 최소성을 만족해야 합니다. 따라서 튜플을 식별하는 데 필요한 속성으로만 구성되어야 합니다. 🗣️ 데이터베이스의 무결성에 관해 설명해 보세요. 무결성은 데이터베이스에 저장된 데이터와 실제 데이터가 일치하는지?에 대한 정확성, 유효성 그리고 데이터의 일관성을 의미합니다. 이를 보장하기 위해 저장, 삭제, 수정을 제약하기 위한 조건이 무결성 제약 조건입니다. 데이터베이스의 무결성으로는 기본 키가 고유한 값을 가져야 한다는 개체 무결성, 속성 값이 도메인에 속해야 한다는 도메인 무결성, 외래 키 값은 참조하는 테이블의 기본 키 값이어야 한다는 참조 무결성이 있습니다. 개체 무결성 : 모든 테이블이 기본 키를 가져야 한다. 기본 키는 null, 중복 값 불가능하다. 도메인 무결성 : 테이블의 속성 값은 도메인에 속해야 한다. 도메인은 속성이 가질 수 있는 값의 집합을 의미한다. 참조 무결성 : 외래 키는 null이거나 참조 테이블의 기본 키 값과 동일해야 한다. 🗣️ Index 가 무엇인가요? Index (색인) 도 하나의 데이터베이스 객체이며, 데이터베이스 크기의 약 10% 정도의 저장공간을 필요로 합니다. 데이터베이스에서 튜플 검색 성능을 향상하기 위해 속성 값과 튜플이 저장된 주소를 인덱스 테이블에 저장하는 방식입니다. Key-Value 형태로 ‘속성 값-튜플 주소’를 인덱스 테이블에 저장합니다. 속성 값을 기준으로 정렬 상태를 유지합니다. Index는 테이블을 처음부터 끝까지 검색하지 않고, 인덱스를 검색해서 해당 자료의 테이블을 접근하는 방법을 의미합니다. Index는 항상 정렬된 상태를 유지하므로 튜플 검색보다 원하는 값을 검색하는 데 속도가 빠른 장점을 가지고 있습니다. 하지만 새로운 값을 추가하거나 삭제, 수정하는 경우에는 인덱스 변경 및 정렬 과정이 필요해서 DML 실행 속도가 느린 단점이 있습니다. 또한 Index 저장을 위한 추가 공간이 필요하다는 단점이 있습니다. DML(Data Manipulation Language) 데이터를 조작하는 명령어 ex) INSERT, DELETE, UPDATE 즉, Index는 데이터의 저장 성능을 희생하는 대신, 데이터의 검색 속도를 높이는 기능입니다. https://velog.io/@sweet_sumin/%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%93%9C-%EC%9D%B8%EB%8D%B1%EC%8A%A4-Clustered-Index-%EB%84%8C-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%93%9C-%EC%9D%B8%EB%8D%B1%EC%8A%A4-Non-Clustered-Index 참고로 Primary Key는 Index를 생성할 필요가 없습니다. (클러스터드 인덱스, 논클러스터드 인덱스 질문 유도) 🗣️ 인덱스를 사용 중일 때 데이터를 삭제하면 발생할 수 있는 문제는 무엇일까요? 데이터 삭제가 잦을 경우, 저장 공간을 낭비할 수 있다는 문제점이 있습니다. 인덱스는 데이터베이스의 검색 효율을 높이기 위해 인덱스 테이블을 사용합니다. 삭제 연산이 일어나면 데이터베이스에서는 해당 튜플이 삭제되지만, 인덱스 테이블에서는 해당 튜플을 ‘사용하지 않음’ 으로 처리하고 실제로 데이터는 삭제하지 않습니다. 그래서 잦은 데이터 삭제가 일어나면 인덱스 테이블에 불필요한 데이터가 남아 저장 공간을 낭비하게 됩니다. 🗣️ 클러스터드 인덱스, 논클러스터드 인덱스에 대해 설명해 주시겠어요? 책에 비유하자면, 클러스터드 인덱스는 페이지를 알기 때문에 바로 그 페이지를 펴는 것 넌 클러스터드 인덱스는 뒤에 목차에서 찾고자 하는 내용의 페이지를 찾고 그 페이지로 이동하는 것. 테이블 스캔은 처음부터 한 장씩 넘기면서 내용을 찾는 것입니다. 클러스터드 인덱스는 검색 속도를 향상시켜주지만 새로운 데이터를 삽입할 때는 많은 비용이 소모됩니다. 논 클러스터드 인덱스는 말 그대로 클러스터 형의 반대인 군집화 되어있지 않은 인덱스 타입입니다. 그러므로 테이블에 저장된 물리적 순서에 따라 데이터를 정렬하지 않습니다. 즉, 순서대로 정렬되어 있지 않습니다. https://gwang920.github.io/database/clusterednonclustered/ 출처 https://gocoder.tistory.com/1826 https://gwang920.github.io/database/clusterednonclustered/ 🗣️ 트랙잭션이 무엇인지 아는대로 설명해 주세요. 데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위를 의미합니다. 논리적인 작업의 쿼리 개수와 관계 없이 트랜잭션으로 묶어놓은 작업 단위 전체가 100% 적용되거나 아무것도 적용되지 않아야 함을 보장합니다. (all or nothing) 트랜잭션의 특징은 앞 글자를 따서 ACID 라 부릅니다. Atomicity (원자성) : 트랜잭션을 구성하는 연산 전체가 모두 정상적으로 실행되거나 모두 취소되어야 한다. Consistency (일관성) : 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지한다. Isolation (고립성) : 두 개 이상의 트랜잭션이 동시에 발생할 때, 서로의 연산에 영향을 주면 안 된다. Durability (영구성) : 커밋된 트랜잭션의 내용은 영구히 반영된다. 트랜잭션의 상태는 활동, 장애, 철회, 부분완료, 완료 가 있습니다. 활동 (Active) : 트랜잭션이 실행 중인 상태 장애 (Fail) : 트랜잭션이 실행에 오류가 발생해 중단한 상태 철회 (Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback (트랜잭션 연산 이전의 상태로 돌아감) 을 수행하는 상태 부분 완료 (Partitially Commit) : 트랜잭션이 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태 완료 (Committed) : 트랜잭션이 성공적으로 종료되어 commit 연산을 실행한 후의 상태 트랜잭션을 처리하는 중 이상 현상이 발생할 수 있습니다. 속성 간 종속이나 데이터의 중복으로 발생합니다. 삽입 이상, 갱신 이상, 삭제 이상이 있으며, 속성 간 종속을 해제하고 데이터베이스의 중복을 제거하기 위해 테이블을 분해하는 데이터베이스 정규화를 진행하게 됩니다. 🗣️ DB에서 락은 무엇인가요? 락은 트랜잭션이 처리되는 순서를 보장해 무결성을 유지하는 방법입니다. 락에는 공유 락과 베타 락이 있습니다. 공유 락은 데이터를 읽기 위한 락으로, 데이터가 변경되지 않습니다. 따라서 특정 트랜잭션을 수행 중일 때 공유 락을 가진 다른 트랜잭션이 동시에 접근할 수 있습니다. 반면에 베타 락은 데이터를 수정하는 락으로, 하나의 트랜잭션을 수행 중일 때 접근할 수 없습니다. 이와 같이 락을 이용할 때 트랜잭션이 교착 상태에 빠질 수 있습니다. 🗣️ 더 자세히 설명해주세요! DB Lock은 트랜잭션 처리의 순차성을 보장하기 위한 방법으로, 데이터에 접근하기 전에 Lock을 요청해서 Lock이 허락되면 해당 데이터에 접근할 수 있도록 하는 기법입니다. DB Lock의 종류는 크게 두 가지로, 비관적 락과 낙관적 락이 있습니다. 비관적 락과 낙관적 락의 사용 기준은 ‘읽기와 수정 비율이 어디에 가까운지’입니다. 수정의 비율이 높다면 (충돌이 발생할 것으로 예상되면) 비관적 락을, 읽기의 비중이 높다면 (충돌이 발생하지 않을 것이라 예상되면) 낙관적 락을 사용합니다. 비관적 락 (Pessimistic Lock) : 데이터 갱신 시 충돌이 발생할 것으로 예상해 락을 거는 방식 공유락(Shared Lock) : 사용 중인 데이터를 다른 트랜잭션이 읽기 허용, 쓰기 비허용 베타락(Exclusive Lock) : 사용 중인 데이터를 다른 트랜잭션이 읽기, 쓰기 모두 비허용 데이터 수정 즉시 트랜잭션 충돌을 감지할 수 있습니다. 롤백을 개발자가 일일히 하기 힘든 경우, 충돌이 일어났을 때 롤백 비용이 많이 드는 경우, 주문 시에 쿠폰 사용, 알림 제공, 주문서 작성 등 여러 기능이 한 트랜잭션에 묶여있는 경우에 적합합니다. 낙관적 락 (Optimistic Lock) : 데이터 갱신 시 충돌이 발생하지 않을 것이라 가정해 락을 걸지 않고, 버전 관리 기능을 통해서 트랜잭션 격리성을 관리하는 방식. Version 컬럼을 별도로 추가해서 충돌을 방지합니다. Version 정보를 사용하면 최초 커밋만 인정이 되고, Bulk Insert는 버전을 무시하기 때문에 Bulk Insert에서 버전을 증가시키려면 버전 필드를 강제로 증가시켜야 합니다. DB가 제공하는 락 기능을 사용하지 않고, JPA가 제공하는 버전 관리 기능(Application Level의 Lock)을 사용합니다. 커밋 전까지는 충돌을 알 수 없습니다. 충돌이 나면 롤백 처리는 개발자의 몫입니다. Why? 데이터 수정 즉시 트랜잭션 충돌을 감지하고 롤백이 가능하므로 수정이 많은 경우 비관적 락을 사용하는 것이 좋습니다. 읽기 작업이 많다면 JPA의 버전관리 기능을 활용해 개발하는 것이 더욱 편리하기 때문에 낙관적 락을 사용하는 것이 좋습니다. 🗣️ DB의 교착 상태가 무엇입니까? 데이터베이스의 교착 상태는 하나의 트랜잭션이 처리 중인데 데이터에 대해 락을 가지고 있는 상태에서 다른 트랜잭션이 처리 중인 데이터에 대해 락을 요청하면서 무한 대기 상태에 빠지는 현상입니다. 교착 상태를 해결하는 방법으로는 예방 기법과 회피 기법이 있습니다. 예방 기법은 트랜잭션을 수행하기 전에 미리 락을 획득하는 방식이고, 회피 기법은 트랜잭션이 들어온 순서에 따라 락을 획득하거나 트랜잭션을 종료하는 방식입니다. 🗣️ 트랙잭션의 격리성을 아시나요? 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타내는 것을 트랜잭션의 격리 수준이라고 말합니다. 간단히 표현하자면, 특정 트랜잭션이 다른 트랜잭션에 변경한 데이터를 볼 수 있도록 허용할 지 말지를 결정하는 것 입니다. Read Uncommitted 다른 트랜잭션에서 커밋되지 않은 내용에 접근 가능 (Dirty Read) 락 발생 X Read Committed 커밋된 내용만 접근 가능 한 트랜잭션 내에서 검색 결과가 비일관적인 현상 발생 (Nonrepeatable read) 락 발생 X Repeatable Read 커밋이 완료된 데이터만 읽을 수 있으며, 트랜잭션 범위 내에서 조회한 내용이 항상 동일함을 보장 일정범위의 레코드를 두번 이상 읽을 때, 첫 번재 쿼리에서 없던 유령 레코드가 두번째 쿼리에서 나타나는 현상을 Phantom read 락 발생 O Serializable 한 트랜잭션에서 사용하는 데이터는 다른 트랜잭션이 접근 불가능 락 발생 O 🗣️ DB의 트랜잭션 수행 중 오류가 발생하면 어떻게 처리할까요? 데이터베이스에서 트랜잭션 수행 과정 중 오류가 발생하면 ROLLBACK을 통해 트랜잭션을 수행하기 전 상태로 데이터베이스를 원복해야 합니다. 이렇게 처리하는 이유는 트랜잭션 수행 결과가 데이터베이스에 완전히 반영되거나 아예 반영되지 않아야 하기 때문입니다. 🗣️ Commit, Rollback 이란 무엇입니까? Commit : 트랜잭션이 성공해 트랜잭션 결과를 영구적으로 반영하는 연산입니다. Rollback : 트랜잭션의 실행을 취소했음을 알리는 연산이며, 트랜잭션이 수행한 결과를 원래의 상태(트랜잭션 연산 이전의 상태)로 원상 복귀시키는 연산을 의미합니다. 🗣️ DB에서 동시성 제어란 무엇입니까? DBMS는 다수의 사용자를 가정하기 때문에 다중 트랜잭션의 상호 간섭 작용 중, DB를 보호해야 합니다. 동시에 여러 개의 트랜잭션이 수행될 때, 트랜잭션들이 DB의 일관성을 파괴하지 않도록 트랜잭션 간의 상호작용을 제어하는 것을 의미합니다. 동시성 제어 기법의 종류는 다음과 같습니다. https://velog.io/@ha0kim/%EB%8F%99%EC%8B%9C%EC%84%B1-%EC%A0%9C%EC%96%B4 Reference https://junghn.tistory.com/entry/DB-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EC%9D%B8%EB%8D%B1%EC%8A%A4%EC%99%80-%EB%84%8C%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EA%B0%9C%EB%85%90-%EC%B4%9D%EC%A0%95%EB%A6%AC https://hoons-dev.tistory.com/93

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다