본문 바로가기
study

[JSCODE] Spring Data JPA 세팅하기

by 당코 2023. 3. 21.

데이터베이스

데이터베이스는 특정 조직의 업무를 수행하는 데 필요한 상호 관련된 데이터들의 모임이다

특징

  • 실시간 접근성(Real-Time Accessibility) : 수시적이고 비정형적인 질의(조회)에 대하여 실시간 처리에 의한 응답이 가능해야 한다.
  • 계속적인 변화(Continuous Evolution) : 데이터베이스의 상태는 동적이다. 즉 새로운 데이터의 삽입(Insert),삭제(Delete),갱신(Update)로 항상 최신의 데이터를 유지한다.
  • 동시공용(Concurrent Sharing): 데이터베이스는 서로 다른 목적을 가진 여러 응용자들을 위한 것이므로 다수의 사용자가 동시에 같은 내용의 데이터를 이용할 수 있어야 한다.
  • 내용에 의한 참조(Content Reference): 데이터베이스에 있는 데이터를 참조할 때 데이터 레코드의 주소나 위치에 의해서가 아니라, 사용자가 요구하는 데이터 내용으로 데이터를 찾는다.

 

데이터베이스 언어

DDL(Data Definition Language)

테이블과 같은 데이터 구조를 정의하는데 사용되는 명령어들로 (생성, 변경, 삭제, 이름변경) 데이터 구조와 관련된 명령어

  • CREATE : 데이터베이스, 테이블 등을 생성한다.
  • ALTER : 테이블을 수정한다.
  • DROP : 데이터베이스, 테이블을 삭제한다.
  • TRUNCATE : 테이블을 초기화한다.

 

DML(Data Manipulation Language)

정의된 데이터베이스의 데이터를 조회, 수정, 삭제 등의 역할을 하는 명령어

  • SELECT : 데이터를 조회한다.
  • INSERT : 데이터를 추가한다.
  • UPDATE : 데이터를 수정한다.
  • DELETE : 데이터를 삭제한다.

 

DCL(Data Control Language)

데이터베이스에 접근하거나 객체에 권한을 주는 등의 역할을 하는 명령어

GRANT : 특정 데이터베이스 사용자에게 특정 작업에 대한 권한을 부여한다.

REVOKE : 특정 데이터베이스 사용자에게 특정 작업에 대한 권한을 박탈, 회수한다.

COMMIT : 트랜잭션의 작업이 정상적으로 완료되었음을 관리자에게 알려준다.

ROLLBACK : 트랜잭션의 작업이 비정상적으로 종료 되었을 때 원래 상태로 복구한다.

 

트랜잭션

데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다.

트랜잭션은 ACID라 하는 원자성(Atomicity), 일관성 (Consistency), 격리성(Isolation), 지속성(Durability)을 보장해야 한다.

  • 원자성: 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야 한다.
  • 일관성: 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.
  • 격리성: 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다. 격리성은 동시성과 관련된 성능 이슈로 인해 트랜잭션 격리 수준 (Isolation level)을 선택할 수 있다.
  • 지속성: 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.

 

트랜잭션이 시작되고 변경 결과를 데이터베이스에 반영하고 싶으면 commit을 호출하고

결과를 반영하고 싶지 않으면 rollback을 호출하면 된다.

 

student 엔티티 생성하기

@Entity
@DynamicInsert
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @NotNull
    private Long id;

    @NotNull
    private String name;

    @Column(name = "class")
    @ColumnDefault("'basic'")
    private String studentClass;


    public Student() {
    }
}

id, name, studentClass를 가지는 student 엔티티를 생성하였다.

기본 키 매핑 전략은 IDENTITY를 사용하여 기본 키 생성을 데이터베이스에 위임하였다.

id와 name은 null이 아니어야 하는 조건이 있어 @Notnull 어노테이션을 붙여주었다.

@Notnull 어노테이션을 사용하기 위해 build.gradle에 의존성을 추가하였다.

implementation 'org.hibernate:hibernate-validator:7.0.5.Final'

 

컬럼명을 class로 만드는 과정에서 class가 자바의 예약어로 등록이 되어있기 때문에 studentClass로 변수를 만들고

@Column(name="class")를 이용해 컬럼명을 수정해주었다.

그리고 class의 default 값을 basic으로 설정하기 위해서 @DynamisInsert와 @ColumnDefault 어노테이션을 사용하였다.

사용할 때 주의 할 점은 @ColumnDefault안의 값이 " 'basic' "와 같이 쌍따옴표 안에 따옴표가 있는 방식으로 해줘야한다.

 

배운 내용, 깨달은 점

데이터베이스를 사용하기 위해서 직접 의존성을 추가해주면서 설정 파일 관리하는 법에 대해 익숙해지게 되었다.

데이터베이스의 컬럼의 조건을 만족시키기 위해 기능을 직접 찾아보고 쿼리가 날라가는 것을 보면서 작동 방식에 대해 이해하게 되었다.