이번에는 아래와 같은 로직으로 작업하였다.
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 목록을 먼저 진행할지 좀더 고민 하고 진행할 생각이다..
'프로그래밍 > 개인프로젝트' 카테고리의 다른 글
[Spring Boot] Global Exception 에러 처리 (0) | 2025.01.09 |
---|---|
2. Todo List Application Project (0) | 2025.01.02 |
1. Todo List Application Project - ERD, 엔티티 정의서 (0) | 2025.01.02 |
0. Todo List Application Project (0) | 2025.01.02 |
[프로젝트] 7. 오류페이지(일반) - 프론트화면(react) (0) | 2024.09.04 |