3. Todo List Application Project - Docker, DB 생성, Entity, Test

이번에는 아래와 같은 로직으로 작업하였다.

1. Docker에 MariaDB 가동

2. Spring과 MariaDB 연동

3. Entity 생성

4. JPA 사용하여 조회 Test 진행

 

# docker image mariadb 설치
docker pull mariadb

# mariadb 가동
# -d : 백그라운드 실행
# -p : 3306:3306 > localhost:3306 요청시 > docker_ip:3306 으로 연동해줌(포트포워딩같기도하고)
# --name : 컨테이너 이름
# MYSQL_ROOT_PASSWORD : mysql root 접속시 비밀번호
# mariadb:latest = mariadb 최신 버전
docker run -d -p 3306:3306 --name todoDoit-db -e MYSQL_ROOT_PASSWORD=[비밀번호] mariadb:latest

# 가동중인 컨테이너목록(실행중인 것만 나옴)
# 여기서 containnerID 확인가능
docker ps

# 로그 확인
docker logs [Container ID)

# docker 컨테이너 접속
docer exec -it [Container ID) bash

# mariadb 접속
# 입력하고 패스워드 입력(아까 컨테이너 생성시 입력했던 비밀번호)
mariadb -u root -p

# DB에 데이터베이스 조회
use databases;

#database 생성
create database [생성하고싶은 database 명]

그럼 아래와같이 생성된것을 확인 가능

 

이전 회사에서 리눅스환경에서 작업을 하다보니 리눅스 환경이 생각보다 편하다 ..

 

Entity 생성 해보자!

 

BaseEntity.java - 테이블마다 [생성일, 수정일] 중복되는것같아 하나의 엔티티에 공통으로 설정하엿음

package dev.memory.tododoit.entity;

import jakarta.persistence.*;
import lombok.Getter;
import org.hibernate.annotations.Comment;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Getter
public abstract class BaseEntity {

    @Column(nullable = false, updatable = false)
    @Comment(value = "생성일")
    private LocalDateTime createdAt;

    @Column(nullable = false)
    @Comment(value = "마지막 수정일")
    private LocalDateTime updatedAt;

    // PrePersist : 엔티티가 업데이트 되기전에 시간 자동 설정
    @PrePersist
    protected void onCreate() {
        this.createdAt = LocalDateTime.now();
        this.updatedAt = LocalDateTime.now();
    }

    // PreUpdate : 엔티티가 업데이트되기 전에 updateAt를 자동 설정
    @PreUpdate
    protected void onUpdate() {
        this.updatedAt = LocalDateTime.now();
    }

}

 

User.java - 유저관련 엔티티

package dev.memory.tododoit.entity;

import jakarta.persistence.*;
import lombok.Getter;
import org.hibernate.annotations.Comment;

@Entity
@Table(name = "user")
@Getter
public class User extends BaseEntity {

    public User() {
    }

    public User(String accountId, String email, String password, Provider socialProvider, String socialId, Deleted isDeleted) {
        this.accountId = accountId;
        this.email = email;
        this.password = password;
        this.socialProvider = socialProvider;
        this.socialId = socialId;
        this.isDeleted = isDeleted;
    }

    @Id
    @Comment(value = "사용자 고유 ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(unique = true)
    @Comment(value = "사용자 계정 ID")
    private String accountId;

    @Comment(value="사용자 이메일")
    private String email;

    @Comment(value = "비밀번호")
    private String password;

    @Enumerated(EnumType.STRING)
    @Comment(value = "소셜 로그인 제공자")
    private Provider socialProvider;

    @Comment(value = "소셜 로그인ID")
    private String socialId;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    @Comment(value = "삭제여부")
    private Deleted isDeleted;

}

 

Todo.java - Todo 관련 엔티티

package dev.memory.tododoit.entity;

import jakarta.persistence.*;
import org.hibernate.annotations.Comment;

import java.time.LocalDate;

@Entity
@Table(name = "todo")
public class Todo extends BaseEntity{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Comment(value = "Todo 고유 ID")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "category_id")
    private Category category;

    @Comment(value = "할 일 제목")
    private String title;

    @Comment(value = "할 일 내용")
    private String description;

    @Comment(value = "마감 기한")
    private LocalDate dueDate;

    @Comment(value = "우선순위")
    private String Priority;

    @Enumerated(EnumType.STRING)
    @Comment(value = "완료 여부")
    private Completed completed;

    @Enumerated(EnumType.STRING)
    @Comment(value = "삭제 여부")
    private Deleted isDeleted;

}

 

Category.java - Todo 등록시 카테고리 관리 엔티티

package dev.memory.tododoit.entity;

import jakarta.persistence.*;
import org.hibernate.annotations.Comment;

import java.time.LocalDateTime;

@Entity
@Table(name = "category")
public class Category extends BaseEntity{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Comment(value = "카테고리 고유ID")
    private Long id;


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    @Comment(value = "사용자 고유ID")
    private User user;

    @Comment(value = "카테고리 이름")
    private String name;

    @Enumerated(EnumType.STRING)
    @Comment(value = "삭제여부")
    private Deleted isDeleted;

}

 

Provider.java - enum클래스 / 소셜로그인 구분

package dev.memory.tododoit.entity;

public enum Provider {
    LOCAL, KAKAO, NAVER, GOOGLE
}

 

Deleted.java - enum 클래스 / 삭제여부 구분

package dev.memory.tododoit.entity;

public enum Deleted {
    Y, N
}

 

Completed - enum클래스 / Todo 목표 성공/실패 구분

package dev.memory.tododoit.entity;

public enum Completed {
    DONE,
    NOT_DONE
}

 

 

이제 테스트를 위한 코드작성

UserRepository.java

package dev.memory.tododoit.repository;

import dev.memory.tododoit.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
}

 

 

UserRepositoryTest.java

package dev.memory.tododoit.repository;

import dev.memory.tododoit.entity.Deleted;
import dev.memory.tododoit.entity.Provider;
import dev.memory.tododoit.entity.User;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;

import java.util.List;

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) // 실제 DB 사용
class UserRepositoryTest {

    @Autowired
    UserRepository userRepository;

    /**
     * 테스트 실행전 더미데이터 생성
     */
    @BeforeEach
    void setUp() {
        User user1 = new User("account01", "account01@memory.dev", "password1",
                Provider.KAKAO, "socialId01", Deleted.N);

        User user2 = new User("account02", "account02@memory.dev", "password2",
                Provider.KAKAO, "socialId02", Deleted.N);

        User user3 = new User("account03", "account02@memory.dev", "password3",
                Provider.KAKAO, "socialId03", Deleted.N);

        userRepository.save(user1);
        userRepository.save(user2);
        userRepository.save(user3);
    }

    @Test
    void testCode() {

        // user테이블 전체 조회
        List<User> userLists = userRepository.findAll();

        // user 테이블에 총 3개의 행이 존재하는지 체크
        Assertions.assertEquals(3, userLists.size());

    }

}

 

우선 기본적으로 구성은 끝이났다.

 

다음으로는 로그인을 먼저 진행할지..

Todo 목록을 먼저 진행할지 좀더 고민 하고 진행할 생각이다..

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유