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'
}
- 그 다음 MariaDB에 접근하기 위해서는
application.properties
에서 설정하면 되는데 저는yml
포맷을 이용할 것입니다. (yml에 대한 상세한 설명이 있습니다)
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 등)을 생성할 것인지를 결정하는 설정입니다. 주로
create
와update
를 사용하는데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
'공부 기록' 카테고리의 다른 글
[스프링 부트로 게시판 만들기] 05. 회원가입 (0) | 2021.07.20 |
---|---|
[스프링 부트로 게시판 만들기] 04. Thymeleaf + Bootstrap (0) | 2021.07.19 |
[스프링 부트로 게시판 만들기] 02. Lombok(롬복) 설정 (0) | 2021.07.18 |
[스프링 부트로 게시판 만들기] 01. 프로젝트 생성 (0) | 2021.07.18 |
[스프링 부트로 게시판 만들기] 00. 앞으로 만들 프로젝트 (0) | 2021.07.18 |
댓글