데이터베이스의 개념적인 부분을 다시한번 복습하고, 이해할 수 있었습니다.
더불어 예상 꼬리질문들을 작성하고 답해보면서 왜?
라는 것을 다시 한번 생각해볼 수 있었습니다!
미션 코드는 다음 PR에서 확인할 수 있습니다. [이호석] DAY5 Spring Data JPA 세팅하기 PR
✏️ 데이터베이스의 정의
데이터베이스는 특정 조직의 여러 사용자가 공유
하여 사용할 수 있도록 통합
해서 저장
한 운영
데이터의 집합이다.
여기에서 데이터베이스의 4가지 정의를 알 수 있습니다.
✏️ 데이터베이스의 특징
정의를 바탕으로 4가지의 특징을 도출할 수 있습니다.
✏️ DDL
Data Definition Language의 약자로 데이터 정의어라 부르며 새로운 데이터베이스를 구축하기 위해 스키마를 정의하거나 기존 스키마의 정의를 삭제 또는 수정하기 위해 사용되는 데이터 언어입니다. CREATE, ALTER, DROP과 같은 문이 포함됩니다.
✏️ DML
Data Management Language의 약자로 데이터 조작어라 부르며 데이터의 삽입, 삭제, 수정, 검색 등의 처리를 DBMS에 요구하기 위해 사용되는 데이터 언어입니다. SELECT, INSERT, UPDATE, DELETE 문이 이곳에 해당합니다.
✏️ DCL
Data Control Language의 약자로 데이터 제어어라 부르며 데이터베이스에 저장된 데이터를 여러 사용자가 무결성과 일관성을 유지하며 문제없이 공유할 수 있도록 내부적으로 필요한 규칙, 기법을 정의하는 데 사용되는 데이터 언어입니다. GRANT, REVOKE 문이 이곳에 해당합니다.
트랜잭션은 하나의 작업을 수행하는데 필요한 데이터베이스의 연산을 모아놓은 것으로 데이터베이스에서는 논리적인 작업의 단위가 됩니다. 이를 통해 작업의 완전성을 보장해줍니다.
트랜잭션의 논리적인 작업 단위를 완벽하게 처리해야 하고, 처리하지 못한 경우에는 원 상태로 복구하여 작업의 일부만 적용되는 현상을 발생하지 않게 만들어야 합니다.
🤔 꼬리 질문: 트랜잭션의 특성에 관해 설명해주세요
원자성(Atomicity)
은 all or nothing과 같이 트랜잭션을 수행하다 장애가 발생하는 경우 지금까지 실행한 연산 처리를 모두 취소하고 데이터베이스를 트랜잭션 작업 전의 상태로 되돌려야 합니다. 아무런 문제가 발생하지 않아야 모든 작업이 수행되어 데이터베이스에 적용됩니다.일관성(Consistency)
은 트랜잭션이 성공적으로 수행된 후에도 데이터베이스가 일관된 상태를 유지해야 함을 의미합니다.격리성(Isolation)
은 현재 수행 중인 트랜잭션이 완료될 때까지 트랜잭션이 생성한 중간 연산 결과에 다른 트랜잭션이 접근할 수 없음을 의미합니다.지속성(Durability)
은 트랜잭션이 성공적으로 완료된 후 데이터베이스에 반영한 수행 결과는 어떠한 경우에도 손실되지 않고 영구적이어야 합니다.🤔 꼬리 질문: 그렇다면 트랜잭션을 다루는 연산은 무엇이 있을까요?
Commit
과 Rollback
이 존재합니다. Commit은 트랜잭션의 수행이 성공적으로 완료되었음을 선언하며, Commit 연산 이후 트랜잭션의 수행 결과가 실제 데이터베이스에 반영됩니다. Rollback은 트랜잭션 수행 중 장애가 발생했을 때 사용되며 트랜잭션 수행이 실패했음을 말합니다. Rollback이 되면 지금까지 실행한 트랜잭션의 연산 결과가 취소되고 데이터베이스는 트랜잭션이 수행되기 전의 상태로 되돌아갑니다.❗️ 참고
CREATE TABLE STUDENT(
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
class VARCHAR(255) DEFAULT 'basic',
PRIMARY KEY(id)
) engine=InnoDB;
class
column은 자바에서는 클래스를 생성할때 사용되는 예약어이므로 의미를 나타낼 수 있는 다른 필드명으로 명명하고, @Column 속성을 통해 DB 컬럼 명을 지정한다.
name
column은 default값을 가지므로 @DynamicInsert
와 @ColumnDefault
를 이용해 지정할 수 있다.
@DynamicInsert
: insert 구문 생성 시점에 null이 아닌 컬럼만 포함한다.@ColumnDefault
: 해당 컬럼의 default값을 지정한다. (Table이 생성될때 적용된다.)다른 방식으로는 @Column의 columnDefinition 속성을 이용할 수 있다.
@Column(name = "class", columnDefinition = "varchar(255) default 'basic'")
private String name;
위 방식또한 @DynamicInsert를 이용해 null이 아닌 컬럼만을 insert구문에 포함시킬 수 있다.
실제 테스트 코드를 다음과 같이 작성한 후 실행하면 정상동작함을 확인할 수 있었습니다.
@DynamicInsert는 필수적으로 붙여주는것이 좋다고 생각되는데,
insert시 null값을 자동적으로 걸러주기 때문에 거의 필수적이라고 생각됩니다.
default 설정을 ddl에 적용하는 방식은 좀 더 직관적인 @ColumnDefault를 사용할 것 같습니다.
안녕하세요 모그님! 아직 면접 경험이 없기에 혼자서 꼬리질문을 연습삼아 만들어봤습니다 ㅎㅎ
사실 꼬리 질문이라 하면 정말 물어볼 것들이 무궁무진해진다고 생각합니다.
다양한 꼬리 질문들을 전부 공부하고 외우기에는 정말 많은 시간이 필요하다고 생각되는데, 이런 많은 것들 중에서 조금 더 효과적으로 공부하려면 어떻게 해야 할지 궁금합니다. (공부에 왕도는 없다지만,,)
항상 정성 가득한 리뷰와 조언 감사합니다! 🥲