[스터디] Spring Data JPA 세팅하기(5회차)

이호석·2023년 3월 22일
0

[스터디] Spring Boot

목록 보기
4/7
post-thumbnail

😁 배운 내용

데이터베이스의 개념적인 부분을 다시한번 복습하고, 이해할 수 있었습니다.
더불어 예상 꼬리질문들을 작성하고 답해보면서 왜? 라는 것을 다시 한번 생각해볼 수 있었습니다!

미션 코드는 다음 PR에서 확인할 수 있습니다. [이호석] DAY5 Spring Data JPA 세팅하기 PR



✏️ 미션 제출

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

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

  • ✏️ 데이터베이스의 정의
    데이터베이스는 특정 조직의 여러 사용자가 공유하여 사용할 수 있도록 통합해서 저장운영 데이터의 집합이다.

    여기에서 데이터베이스의 4가지 정의를 알 수 있습니다.

    1. 공유 데이터 : 데이터베이스는 특정 조직의 여러 사용자가 함께 소유하고 이용할 수 있어야 합니다.
    2. 통합 데이터 : 데이터베이스는 중복을 최소화하고 통제가 가능한 중복만 허용하는 데이터들의 집합입니다.
    3. 저장 데이터 : 데이터는 주로 컴퓨터가 처리하므로 컴퓨터가 접근할 수 있는 매체에 데이터를 저장해야 합니다.
    4. 운영 데이터 : 데이터는 특정 조직을 운영하고 조직의 주요 기능을 수행하기 위해 꼭 필요하므로 지속해서 유지해야 합니다.
  • ✏️ 데이터베이스의 특징
    정의를 바탕으로 4가지의 특징을 도출할 수 있습니다.

    1. 데이터베이스는 실시간 접근이 가능하다. : 데이터베이스는 사용자의 데이터 요구(질의)에 실시간으로 응답할 수 있어야 합니다.
    2. 데이터베이스는 계속 변화한다. : 데이터베이스는 동적입니다. 따라서 데이터의 삽입, 삭제, 갱신으로 항상 현재의 정확한 데이터를 유지해야 합니다.
    3. 데이터베이스는 동시 공유가 가능하다. : 여러 사용자가 서로 다른 데이터를 동시에 사용하는 것뿐 아니라, 같은 데이터를 동시에 사용하는 것도 모두 지원해야 합니다.
    4. 데이터베이스는 내용으로 참조가 가능하다. : 데이터베이스는 저장된 주소, 위치가 아닌 데이터의 내용 즉, 값(value)으로 참조할 수 있습니다.

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

  • ✏️ DDL
    Data Definition Language의 약자로 데이터 정의어라 부르며 새로운 데이터베이스를 구축하기 위해 스키마를 정의하거나 기존 스키마의 정의를 삭제 또는 수정하기 위해 사용되는 데이터 언어입니다. CREATE, ALTER, DROP과 같은 문이 포함됩니다.

    • 🤔 꼬리 질문: 스키마란 무엇인가요?
      • 답변: 스키마는 데이터베이스에 저장되는 데이터 구조와 제약조건을 정의합니다. 예를 들어 고객에서 고객 번호, 이름, 나이, 주소가 존재하고 고객 번호는 정수, 이름은 최대 10글자와 같이 정해진 구조 및 제약조건 내용을 스키마라 합니다.
    • 🤔 꼬리 질문: 스키마에 따라 데이터베이스에 저장된 값이 인스턴스입니다. 인스턴스와 스키마는 어떤 특성의 차이가 있을까요?
      • 답변: 스키마는 한번 정의되면 자주 변경되지 않지만, 인스턴스는 계속 변하는 특성이 있습니다. 고객 인스턴스로 예를 들면 고객은 항상 동일하지 않고, 언제든지 다른 고객이 추가되거나 현재 고객이 고객에서 제외될 수 있기 때문입니다.
  • ✏️ DML
    Data Management Language의 약자로 데이터 조작어라 부르며 데이터의 삽입, 삭제, 수정, 검색 등의 처리를 DBMS에 요구하기 위해 사용되는 데이터 언어입니다. SELECT, INSERT, UPDATE, DELETE 문이 이곳에 해당합니다.

    • 🤔 꼬리 질문: DML은 절차적, 비절차적 데이터 조작어가 있습니다. 이것의 차이는 무엇인가요?
      • 답변: 절차적 데이터 조작어는 사용자가 어떤(What) 데이터를 원하고 해당 데이터를 얻으려면 어떻게(how) 처리해야 하는지를 설명합니다. 비절차적 데이터 조작어는 사용자가 어떤(What) 데이터를 원하는지만 설명합니다.
  • ✏️ DCL
    Data Control Language의 약자로 데이터 제어어라 부르며 데이터베이스에 저장된 데이터를 여러 사용자가 무결성과 일관성을 유지하며 문제없이 공유할 수 있도록 내부적으로 필요한 규칙, 기법을 정의하는 데 사용되는 데이터 언어입니다. GRANT, REVOKE 문이 이곳에 해당합니다.

    • 🤔 꼬리 질문: 무결성이 무엇인가요?
      • 답변 무결성이란 데이터에 결함이 없는 상태, 즉 데이터가 정확하고 유효하게 유지된 상태를 말합니다. 데이터베이스가 삽입, 삭제, 수정 연산으로 상태가 변하더라도 무결성은 지켜져야 합니다.
    • 🤔 꼬리 질문: 무결성 제약조건에 관해 설명해주세요.
      • 답변: 무결성 제약조건에는 개체 무결성 제약조건과 참조 무결성 제약조건이 존재합니다. 개체 무결성 제약조건은 기본키를 구성하는 모든 속성은 널 값을 가지면 안 된다는 제약조건이며 참조 무결성 제약조건은 외래키는 참조할 수 없는 값을 가질 수 없다는 규칙입니다.
    • 🤔 꼬리 질문: 기본키는 왜 널값을 가지면 안 되고, 외래키는 왜 참조할 수 없는 값을 가질 수 없어야 하나요?
      • 답변: 기본키는 릴레이션에 포함된 튜플들을 유일하게 구별해주고, 각 튜플에 쉽게 접근할 수 있도록 하기에 만약 null 값을 가지게 된다면 튜플의 유일성을 판단할 수 없고, 기본키의 목적이 상실됩니다. 외래키는 다른 릴레이션의 기본키를 참조하며, 이를 통해 두 릴레이션 간의 관계를 표현합니다. 하지만 기본키와 상관없는 값을 외래키가 갖게 되면 두 릴레이션을 연관 지을 수 없으므로 외래키의 의미가 없어집니다.

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

트랜잭션은 하나의 작업을 수행하는데 필요한 데이터베이스의 연산을 모아놓은 것으로 데이터베이스에서는 논리적인 작업의 단위가 됩니다. 이를 통해 작업의 완전성을 보장해줍니다.

트랜잭션의 논리적인 작업 단위를 완벽하게 처리해야 하고, 처리하지 못한 경우에는 원 상태로 복구하여 작업의 일부만 적용되는 현상을 발생하지 않게 만들어야 합니다.

  • 🤔 꼬리 질문: 트랜잭션의 특성에 관해 설명해주세요

    • 답변: 트랜잭션은 ACID라는 4가지 특성을 가지며 각각 원자성, 일관성, 격리성, 지속성으로 이루어져 있습니다.
      원자성(Atomicity)은 all or nothing과 같이 트랜잭션을 수행하다 장애가 발생하는 경우 지금까지 실행한 연산 처리를 모두 취소하고 데이터베이스를 트랜잭션 작업 전의 상태로 되돌려야 합니다. 아무런 문제가 발생하지 않아야 모든 작업이 수행되어 데이터베이스에 적용됩니다.
      일관성(Consistency)은 트랜잭션이 성공적으로 수행된 후에도 데이터베이스가 일관된 상태를 유지해야 함을 의미합니다.
      격리성(Isolation)은 현재 수행 중인 트랜잭션이 완료될 때까지 트랜잭션이 생성한 중간 연산 결과에 다른 트랜잭션이 접근할 수 없음을 의미합니다.
      지속성(Durability)은 트랜잭션이 성공적으로 완료된 후 데이터베이스에 반영한 수행 결과는 어떠한 경우에도 손실되지 않고 영구적이어야 합니다.
  • 🤔 꼬리 질문: 그렇다면 트랜잭션을 다루는 연산은 무엇이 있을까요?

    • 답변: 트랜잭션의 연산으로 CommitRollback이 존재합니다. Commit은 트랜잭션의 수행이 성공적으로 완료되었음을 선언하며, Commit 연산 이후 트랜잭션의 수행 결과가 실제 데이터베이스에 반영됩니다. Rollback은 트랜잭션 수행 중 장애가 발생했을 때 사용되며 트랜잭션 수행이 실패했음을 말합니다. Rollback이 되면 지금까지 실행한 트랜잭션의 연산 결과가 취소되고 데이터베이스는 트랜잭션이 수행되기 전의 상태로 되돌아갑니다.

❗️ 참고



✅ SQL문 연습하기

목표 : sql문으로 아래 조건을 만족하는 STUDENT 테이블 생성하기

  • sql문
    CREATE TABLE STUDENT(
        id BIGINT NOT NULL AUTO_INCREMENT,
        name VARCHAR(100) NOT NULL,
        class VARCHAR(255) DEFAULT 'basic',
        PRIMARY KEY(id)
    ) engine=InnoDB;



✅ student entity로 연결하기

목표 : 위에서 생성한 student 테이블에 매핑되는 JPA 엔티티 생성하기

  • 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를 사용할 것 같습니다.



🤔 개선 및 고민되는 부분들

꼬리질문?

안녕하세요 모그님! 아직 면접 경험이 없기에 혼자서 꼬리질문을 연습삼아 만들어봤습니다 ㅎㅎ
사실 꼬리 질문이라 하면 정말 물어볼 것들이 무궁무진해진다고 생각합니다.

다양한 꼬리 질문들을 전부 공부하고 외우기에는 정말 많은 시간이 필요하다고 생각되는데, 이런 많은 것들 중에서 조금 더 효과적으로 공부하려면 어떻게 해야 할지 궁금합니다. (공부에 왕도는 없다지만,,)

항상 정성 가득한 리뷰와 조언 감사합니다! 🥲

profile
꾸준함이 주는 변화를 믿습니다.

0개의 댓글