본문 바로가기
공부 기록

[스프링 부트로 게시판 만들기] 03. 데이터 베이스 설정 및 User 테이블 생성

by 매트(Mat) 2021. 7. 18.

 

 

MariaDB란

  • MariaDB란 오픈소스 RDBMS(관계형 데이터베이스)입니다. (출처: https://dololak.tistory.com/766)
  • MySQL을 개발했던 핵심 개발자들이 오라클사를 나와 만든 것이 MariaDB입니다.
  • 즉, MySQL의 완변한 대체제가 바로 이 MariaDB 인 것이죠. (MySQL과 거의 동일한 기능을 제공합니다.)




주의

  • 여기서 MariaDB 설치에 대해 다루진 않겠지만 당연히 설치할 때 사용자 계정과 비밀번호는 반드시 기억하셔야 합니다. (혹은 개인 노트에 기록)
  • 그리고 기존에 MySQL을 사용하셨던 분들이라면 기본 포트인 3306을 사용하셨을텐데 MariaDB를 설치하면 이 역시도 기본 포트가 3306입니다. 따라서 포트가 충돌날 수 있어서 저같은 경우에는 MariaDB 포트번호를 3308로 설정해주었습니다.
  • MariaDB 설치시 기본적으로 같이 설치되는 GUI인 HeidiSQL을 사용할 것입니다.

 

  • 마지막으로 File -> Settings -> annotaion 이라고 검색하여 빨간색 부분에 체크를 해줍니다.
  • 그러면 Lombok 세팅은 끝납니다.
캡처




MariaDB 계정 생성

create user 'azure'@'%' identified by 'azure1234'; /*계정 생성*/
GRANT ALL PRIVILEGES ON *.* TO 'azure'@'%'; /*모든 권한 부여*/
create database myblog; /*DB 생성*/
  • 이제부터 이 계정으로 들어가 myblog라는 DB를 이용하게 될 것입니다.




JPA(Java Persistence API)란

  • 자바 진영의 ORM 기술 표준으로, 인터페이스의 모음입니다.
    • 즉, 실제로 동작하는 것이 아닙니다.
    • JPA 인터페이스를 구현한 대표적인 오픈소스가 Hibernate입니다.
    • ORM(Object Relational Mapping)이란, 객체는 객체대로, 관계형 DB는 관계정 DB대로 설계하여 ORM 프레임워크가 중간에서 매핑시켜줍니다. 즉, ORM은 객체와 RDB 두 기둥 위에 있는 기술입니다.
  • (출처: https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html)

 

캡처




MariaDB 연동

  • MariaDB를 사용하기 위해서는 mariadb client 의존성을 다운받습니다.
  • JPA 사용을 위해 JPA 의존성도 다운받습니다.
dependencies {
    ...
    runtimeOnly 'org.mariadb.jdbc:mariadb-java-client' //MariaDB
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}

 

spring:
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://localhost:3308/myblog?serverTimezone=Asia/Seoul
    username: azure
    password: azure1234
  • url : myblog부분에는 자신의 DB 명을 입력하시면 됩니다.




User 테이블 생성

  • User 테이블을 생성하기 전에 JPA 관련 설정을 해보도록 하겠습니다.

application.yml

spring:
  datasource:
    ...

  jpa:
    open-in-view: true
    hibernate:
      ddl-auto: create
      use-new-id-generate-mappings: false
    show-sql: true
    properties:
      hibernate.format_sql: true
  • open-in-view는 나중에 설명하겠습니다!
  • ddl-auto : 프로젝트 실행 시에 자동으로 DDL(create, drop, alter 등)을 생성할 것인지를 결정하는 설정입니다. 주로 createupdate를 사용하는데 create는 프로젝트 실행 시 매번 테이블을 생성해주고, update는 변경이 필요한 경우 테이블을 수정해줍니다.
  • use-new-id-generate-mappings : JPA의 기본 numbering(넘버링) 전략을 사용할 것인지에 대한 설정입니다. 저는 Entity 클래스에서 따로 설정해줄 것이기 때문에 false로 했습니다.
  • show-sql : 프로젝트 실행 시 sql문을 로그로 보여줍니다.
  • hibernate.format_sql : sql을 포맷팅해서 좀 더 예쁘게 sql문을 로그로 보여줍니다.
  • physical-strategy(디폴트 사용) : 기본값으로 엔티티 클래스의 필드명을 카멜케이스 표기법이 아닌 언더스코어(_)로 네이밍을 짓습니다. (변수명 그대로 하고 싶다면 physical-strategy에 대해서 알아보시면 됩니다.)

 


  • 이제 User 테이블을 만들어보겠습니다.
  • User 테이블의 용도는 회원CRUD, 로그인 등이 있겠습니다.
  • 그래서 필요한 컬럼은 아이디, 비밀번호, 이메일, 닉네임 입니다.
  • 여기에 Role(역할)을 추가해서 관리자, 사용자로 구분할 것입니다. (권한)
  • domain 패키지를 생성하고 user 패키지와 user 클래스를 생성합니다.
캡처

User 클래스

package com.azurealstn.blogproject.domain.user;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id; //sequence, auto_increment

    @Column(nullable = false, length = 30)
    private String username; //아이디

    @Column(nullable = false, length = 100)
    private String password;

    @Column(nullable = false, length = 50)
    private String email;

    @Column(nullable = false, length = 50)
    private String nickname; //닉네임

    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private Role role;
}
  • @NoArgsConstructor : Lombok 어노테이션으로 빈 생성자를 만들어줍니다.
  • @Entity : 해당 클래스가 엔티티를 위한 클래스이며, 해당 클래스의 인스턴스들이 JPA로 관리되는 엔티티 객체라는 것을 의미합니다. 즉, 테이블을 의미합니다.
    • 디폴트값으로 클래스의 카멜케이스 이름을 언더스코어 네이밍(_)으로 테이블 이름을 매칭합니다.
  • @Id : 테이블의 Primary Key(PK)
  • @GeneratedValue(strategy = GenerationType.IDENTITY) : PK를 자동으로 생성하고자 할 때 사용합니다. 즉, auto_increment를 말합니다. 여기서는 JPA의 넘버링 전략이 아닌 이 전략을 사용합니다. (전에 application.yml 설정에서 use-new-id-generate-mappings: false로 한 것이 있습니다.)
  • @Column : 해당 필드가 컬럼이라는 것을 말하고, @Column에는 다양한 속성을 지정할 수 있습니다. (nullable = false: null값이 되면 안된다!, length = 50: 길이 제한 등등)
  • @Enumerated(EnumType.STRING) : JPA로 DB에 저장할 때 Enum 값을 어떤 형태로 저장할지를 결정합니다.
    • 기본적으로는 int로 저장하지만 int로 저장하면 무슨 의미인지 알 수가 없기 때문에 문자열로 저장될 수 있도록 설정합니다.
  • User 클래스 Setter가 없는 이유는 이 setter를 무작정 생성하게 되면 해당 클래스의 인스턴스가 언제 어디서 변해야하는지 코드상으로는 명확하게 알 수가 없어 나중에는 변경시에 매우 복잡해집니다.
  • Builder를 사용하는 이유는 어느 필드에 어떤 값을 채워야하는지 명확하게 알 수 있기 때문에 실수가 나지 않습니다.

  • domain/user 패키지에 Role 클래스를 생성합니다.

Enum 클래스

package com.azurealstn.blogproject.domain.user;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum Role {

    USER("ROLE_USER", "사용자"),
    ADMIN("ROLE_ADMIN", "관리자");

    private final String key;
    private final String title;
}
  • 스프링 시큐리티에서는 권한 코드에 항상 ROLE_이 앞에 있어야 합니다. 따라서 키 값을 ROLE_USER, ROLE_ADMIN로 지정했습니다.
  • 이제 메인 클래스에서 실행해보도록 하겠습니다. (프로젝트 실행 시에 테이블이 생성됩니다.)
캡처
  • HeidiSQL에서 확인해보면 정상적으로 테이블이 만들어졌습니다 ㅎㅎ.
캡처







다음으로

  • 이제부터 테스트 코드는 전체 테스트 코드로 돌려줄 것입니다. (코드 작성할 때 다른 테스트 코드에 영향이 간지 안간지 확인하기 위해. 뭐든지 코드의 안정성을 보려면 테스트 코드를 짜야합니다.)
  • 방법은 쉽습니다. test 폴더에 우클릭 ✔Run Tests in blog-project... 를 누르시면 됩니다.
캡처
  • ✔ 표시가 뜬다면 OK입니다.
  • 다음 시간에는 회원 테이블을 만들었으니 회원 가입을 해보도록 하겠습니다.







References

댓글