데이터베이스 면접 단골질문

실제 면접 질문에서 자주 물어보는 내용이다. 아래와 같은 내용의 면접 질문을 받았을 때, 어떻게 대답할 건지 정리해보자.

데이터베이스의 특징에 대해 설명해주세요.

데이터베이스는 여러 사람이 공유하여 사용할 목적으로 통합되어 관리되는 데이터의 집합으로, 다음과 같은 4가지 특징을 가집니다.

실시간 접근성, 계속적인 변화, 동시 공유, 내용에 의한 참조.

실시간 접근성(real-time accessibility)

데이터베이스는 사용자의 질의에 따른 즉각적인 처리, 응답이 가능합니다.

게속적인 변화(continuous evolution)

새로운 데이터의 삽입(insert), 삭제(delete), 갱신(update)을 통해 항상 최신의 상태를 유지합니다. 즉, 동적인 상태를 갖습니다.

동시 공유(concurrent sharing)

데이터베이스는 서로 다른 목적을 가진 여러 응용 프로그램에서 사용되기 위한 데이터로, 다수의 사용자가 동시에 같은 내용의 데이터를 공유할 수 있습니다.

내용에 의한 참조(content reference)

데이터를 참조할 때 데이터 레코드의 주소나 위치가 아닌 데이터의 내용으로 데이터를 찾습니다.

데이터베이스 언어(DDL, DML, DCL)에 대해 설명해주세요.

DDL(Data Definition Langauage)

데이터를 정의하는 언어로, 생성, 변경, 삭제등을 수행하는 명령어들을 DDL이라고 합니다.

DDL의 대상은 도메인, 스키마, 테이블, 뷰, 인덱스 등이 있습니다.

DDL의 명령어로는 CREATE, ALTER, DROP, TRUNCATE 등이 있으며, 각각 생성, 수정, 삭제의 역할을 합니다.

DML(Data Manipulation Language)

데이터로 입력된 것들을 CRUD하는 언어를 말합니다.

INSERT, UPDATE, SELECT, DELETE가 DML 명령어에 속하며, 데이터를 삽입, 수정, 조회, 삭제하는 동작을 합니다.

DCL(Data Control Language)

관리자가 사용하는 언어로, 보안, 무결성 유지, 병행제어 및 회복을 위한 언어입니다.

권한 부여와 제거를 수행하는 GRANT, REVOKE 등이 해당 명령어에 속합니다.

  • 무결성(Integrity) : 신뢰할 수 있는 서비스 제공을 위해서 의도하지 않은 요인에 의해 데이터, 소프트웨어, 시스템 등이 변경되거나 손상되지 않고 완전성, 정확성, 일관성을 유지함을 보장하는 특성이다.

  • 병행 제어(Concurrency Control) : 여러 트랜잭션 수행시 데이터의 일관성을 유지하기 위한 제어 기법으로, 데이터베이스의 활용도와 공유도를 극대화시키고 일관성을 유지할 수 있도록 한다.

  • 회복 기법(Recovery) : 트랜잭션 도중 오류가 생겼을 시 데이터베이스를 정상적인 상태로 복구하는 작업이다.

트랜잭션이란 무엇인지 설명해주세요.

트랜잭션이란 데이터베이스의 상태를 변화시키는 작업의 단위입니다. ACID라고 불리는 4가지 특성을 가지고 있습니다.

Atomicity - 원자성

최소 단위임. 하나의 트랜잭션이 실패하면 모든 트랜잭션을 실패하게 만드는, 전체 성공 또는 전체 실패의 특성.

Consistency - 일관성

항상 일관된 상태 유지. 데이터의 무결성 유지하며, 병행 제어를 보장.

Isolation - 격리성

하나의 트랜잭션에 다른 트랜잭션이 영향을 끼칠 수 없음. 고립화(다른 트랜잭션이 현재의 데이터의 무결성을 해치지 않도록 잠금)

Durability - 영속성

완료된 트랜잭션은 영원히 그 상태를 저장해야 함. 회복 기법과 관련이 있음.

참고ㅣ 정보통신용어사전

참고 | 정보처리기사 블로그 정리

Spring Boot 프로젝트에 MySQL 연결하기

MySQL 설치하고 Spring Boot 프로젝트 dependency에 추가해주면 된다.

처음엔 에러 폭탄이 났는데 스키마가 이상하게 만들어져서 싹 지우고 다시 하니까 위에 발생한 문제들이 안 났다. (why…?)

Table/Entity 추가

앞서 Controller, Repository, Service 추가해줄때 열심히 추가해준 어노테이션을 생각하며 여기서도 어노테이션을 꼼꼼히 잘 써주면 된다.

@Table
@Entity
public class Student {

}

Student라는 엔티티를 생성하기 위해 @Entity 어노테이션을 붙여줬다.

엔티티로만 설정해주면 논리 모델로서만 동작하기 때문에 실제 데이터베이스상에서 물리 모델로 확인하려면 테이블로 만들어줘야 한다. 그래서 @Table 어노테이션까지 추가해줬다.

엔티티와 테이블의 차이?
테이블은 데이터베이스에 실제로 존재하는 물리 구조고, 이 테이블을 논리적으로 표현하는 개념을 엔티티라고 한다.
JPA는 @Entity가 붙은 클래스를 관리하며, JPA를 이용해서 테이블을 매핑하기 위해선 해당 어노테이션이 필요하다.

Column 추가

컬럼명 데이터타입 조건
id bigint primaray key, not null, auto increment
name varchar not null
class_name varchar 미입력 시 default값인 ‘basic’으로 저장되도록

이 조건을 만족하는 데이터를 각각 Student 클래스와 데이터베이스 상의 테이블로 만들어줬다.

import javax.persistence.*;

@Table
@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String name;
    private String className;
}

각 엔티티를 구분하기 위한 PK(Primary Key)인 id를 설정해주고, 각 컬럼에 해당하는 name, className을 만들어주었다.

id는 @GeneratedValue(strategy = GenerationType.IDENTITY)를 통해 자동으로 1씩 올라갈 수 있도록 만들었다. 수동으로 내가 식별자를 부여해줄 수 있지만, 데이터가 삽입되고 삭제되는 과정을 반복적으로 겪다 보면 id가 뒤섞여 중복될수도 있고, 순서가 잘못될수도 있다.

SQL문으로 Table 생성

자바 코드로 엔티티를 만들었으니 이에 해당하는 물리 테이블을 데이터베이스에 만들어야 한다.

CREATE TABLE student (
    id BIGINT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL
    class_name VARCHAR(255) DEFAULT 'basic'
)

student라는 이름의 Table을 생성하되, 괄호 안에 있는 각 칼럼에 타입과 조건을 지정해줄 수 있도록 만들었다.

워크벤치에 해당 코드를 넣고 번개를 빠방 치면 테이블이 만들어진다. 역시 Spring Boot 프로젝트를 돌려보면 데이터베이스상에 생성된 해당 테이블과 엔티티가 매핑된다.

결론

항상 데이터베이스는 미지의 영역이었다. 데이터베이스라고 하면 파이어베이스나 코어데이터 정도를 써봤기에 SQL문으로 관리할 수 있는 관계형데이터베이스는 처음이었다. 그래서 엔티티는 뭐고, 테이블은 왜 따로 만들고, Spring Boot 프로젝트와 MySQL은 왜 분리돼있고.. 등등에 대해서 처음에 감이 잘 안 왔다.

데이터베이스는 데이터베이스고, 그걸 서버랑 연결하는건 별개의 일이었다는 것을 이제서야 깨달았다. (이미 연결된 상태의 것들을 쓰다보니 몰랐음)

정처기 공부하면서 SQL문을 내가 살면서 써볼 일이 있을까 했는데 이렇게 써보네,, 5월에 SQLD 시험 접수하던데 이왕 시작해본거 한번 따볼까 싶다.

댓글남기기