개요
저번 포스팅에서는 프로젝트에 Spring Security를 적용하여 임시적인 옵션들을 구성해 주었다.
이번 포스팅에서는 본격적인 API 개발을 위해 루트가 되는 Game 엔티티를 설계해 보겠다.
Game Entity 설계(1) - 디렉토리 생성 및 클래스 생성
사진과 같이 Game이라는 도메인을 대표하는 루트 디렉토리 밑에 Entity라는 하위 디렉토리를 생성하여 Game이라는 클래스 파일을 생성해 준다.
Game Entity 설계(2) - Entity 설계
package com.gamepleconnect.game.entity;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Getter
@Entity
@Table(name = "gameple_game")
@NoArgsConstructor
public class Game {
@Id
@Column(name = "game_code")
private Long gameCode;
@Column(name = "game_alias", nullable = false)
private String gameAlias;
@Builder
public Game(Long gameCode, String gameAlias) {
this.gameCode = gameCode;
this.gameAlias = gameAlias;
}
}
디렉토리 생성을 마쳤다면 위와 같이 Game 엔티티를 설계해 준다.
해당 엔티티는 기본적으로 Game Code와 Game Alias라는 두 가지 컬럼을 가지고 있다.
Game Code는 게임 테이블의 PK로 각 게임이 가지는 고유한 코드값이고 Game Alias는 게임의 별칭이다.
위 엔티티는 우리가 제작할 모든 도메인의 루트가 되는 역할을 할 것이다.
우리가 관리하는 모든 테이블에 Game Code라는 컬럼만 존재한다면 어떠한 게임의 데이터인지 바로 파악이 가능해 관리가 용이해진다.
해당 엔티티를 살펴보면 이상한 점이 하나 존재할 것이다.
테이블의 PK는 보통 Auto Increment를 사용하지만 해당 엔티티에는 그런 속성은 존재하지 않는다.
Auto Increment를 사용하지 않은 이유는 만약 Game 테이블이 여러 개의 DB 서버에 각각 존재하고 테이블마다 가지고 있는 데이터의 수나 순서가 다르다고 가정할 때 Game Code는 Auto Increment된 PK값에 의존하므로 Game Code가 일관성 없는 값이 될 수 있기 때문이다.
그렇기 때문에 사전에 어떤 게임은 어떤 Game Code를 사용해야 한다고 명세를 하고 그 값에 따라 모든 DB 서버의 Game Code가 일관성을 가져가야 한다.
JPA 속성 수정
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/gameple_db?serverTimezone=Asia/Seoul
username: root
password: kim1011205
jpa:
properties:
hibernate:
show_sql: true
format_sql: true
hibernate:
ddl-auto: update
엔티티 클래스를 모두 작성했다면 application.yml의 JPA 관련 속성들을 수정해 준다.
show_sql, format_sql 옵션은 각각 애플리케이션에서 쿼리가 실행될 때 해당 내용을 콘솔에 노출시켜주며 쿼리를 더 정돈된 형식으로 출력해 준다.
ddl-auto: update 옵션은 엔티티의 변경된 내용들을 연결된 DB 서버에 반영해 주는 역할을 한다.
그렇기에 저렇게 속성을 수정하고 애플리케이션을 재실행해 보면
해당 사진에서 볼 수 있듯이 우리가 DB 서버에 테이블을 생성하지 않았기에 변경된 내용이 있다고 감지하여 DB 서버에 반영됨을 알 수 있다.
update 이외에도 create, create-drop 등과 같은 여러 옵션들이 존재하니 찾아보도록 하자.
현재는 애플리케이션을 로컬 환경에서 구동하기 때문에 괜찮지만 Production 환경에서 create-drop과 같은 옵션을 사용했다가 모든 데이터가 날아가 버릴 수 있으니 잘 찾아보고 사용해야 한다.
'Project > Gameple' 카테고리의 다른 글
[Project - Gameple] Project Gameple(8) - 프로모션 API - 사전예약 API (0) | 2023.09.17 |
---|---|
[Project - Gameple] Project Gameple(7) - 브랜치 API - IP 기반 국가 코드 조회 API (0) | 2023.09.13 |
[Project - Gameple] Project Gameple(5) - Spring Security 적용하기 (0) | 2023.07.07 |
[Project - Gameple] Project Gameple(4) - Swagger 적용하기 (0) | 2023.06.29 |
[Project - Gameple] Project Gameple(3) - 프로젝트 생성 (0) | 2023.06.27 |