[Co Labor] 패키지, 데이터베이스 설계 및 스프링부트 프로젝트 생성, Hibernate, 스프링부트 프로젝트 초기 오류 및 MySQL 오류 잡기

2024. 8. 8. 19:14프로젝트: Co Laobr

패키지 설계


일단 이렇게 객체의 기능별로 나누어서 정의했다. 결과론적으로 보면 가시성이 굉장히 떨어져서 실제 기능별로 나누어서 Job, Enterprise 이런식으로 정의하고 그 안에서 controller, domain으로 나누어서 정의하는게 훨씬 가시성이 있을 것 같다.

 

api 패키지와 exception 패키지는 시간이 없어서 사용하지 않았다. 이것도 결과론적으로 보면 에러, 호출 결과들을 정의해놓고 가는게 더 빨랐을 것 같지만 아쉬운 부분이다. 


데이터베이스 설계

데이터베이스는 ERD 다이어그램을 만들었다. 

 

Co Labor

Draw ERD with your team members. All states are shared in real time. And it's FREE. Database modeling tool.

www.erdcloud.com

erdcloud.com에서 작업했는데 draw.io보다 데이터베이스에 특화되어있어서 쿼리를 export/import 할 수 있어서 좋다. 일단 스토리보드를 토대로 필요한 엔티티를 싹 뽑았는데 당연하게도 점점 수정사항이 생겼다. 가장 큰 수정 사항은 enterprise, job에 이미지를 삽입해야 한다는 것이고 DB에 이미지를 넣는게 어렵다 어렵다 해서 좀 겁먹었는데 하다보니 그렇게 어려운 것 같지는 않다. 이건 나중에 후술하도록 하고,,,

 

데이터베이스 설계에서의 문제점은 프론트를 하다보니 느꼈는데, enterprise에서는 name 엔티티를 사용하고 job에서는 title을 사용하는 등 일관성의 문제가 있었다. 설계할 땐 큰 신경을 안썼는데 프론트 입장에서는 엔티티가 다르다보니 굉장히 헷갈리고 코드의 일관성이 떨어졌다.


스프링부트 프로젝트 생성

Spring Initalizer로 프로젝트를 생성했다. Spring Initalizer의 장점은 의존성 관리가 굉장히 쉽다는 것인데, 라이브러리의 버전을 서로 충돌없이 잘 초기화할 수 있어서 좋다.

 

스프링부트에 JPA 의존을를 추가했다면 DB 연결을 해줘야 실행시킬 수 있다. 

먼저 MySQL을 설치하고 서버를 시작한 뒤 권한을 부여해주자.

GRANT ALL PRIVILEGES ON labor_user.* TO '아이디'@'localhost' IDENTIFIED BY '비밀번호';
FLUSH PRIVILEGES;

 

 

그리고 application.properties에 연결할 DB를 설정한 뒤 스키마를 생성하면 된다.

spring.application.name=co-labor

#MySQL ??
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# DB Source URL
spring.datasource.url=jdbc:mysql://localhost:3306/database-name
# DB username
spring.datasource.username=username
#DB password
spring.datasource.password=password

spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true

 

이럼 이제 오류 없이 실행할 수 있다!

다만, 다 올바르게 설정한 후에도 시스템 변수를 인식할 수 없다는 오류가 생길 수 있다.

제어판 -> 시계 및 국가 -> 국가 또는 지역 -> 관리자 옵션 -> 시스템 로캘 변경 -> Beta : ~~ 체크!

 

무슨 상관인지 모르겠는데 이걸 체크해두면 해결된다! 스택오버플로우를 뒤져보다가 겨우 발견했다..


Hibernate를 알기 위해서

Hibernate에 대해 알기 전에 ORM부터 알아야 한다. Obejct-Relational Mapping, ORM은 객체 지향 프로그래밍 언어를 사용하여 호환되지 않은 유형의 시스템 간에 데이터를 변환하는 프로그래밍 기술이다. 사전적 정의라 잘 와닫지 않는데, 객체와 관계형 데이터베이스의 데이터를 매핑하는 것을 말한다.

덕분에 ORM을 사용하여 SQL 쿼리 없이 데이터베이스에 데이터를 저장하고 관리할 수 있다.

Java Persistence API, JPA는 자바의 ORM 표준 인터페이스이다. JPA를 구현한게 Hibernate라서 JPA를 사용하려면 Hibernate 프레임워크를 사용하면 되는데, Hibernate는 내부적으로 JDBC를 사용한다.

JDBC는 자바와 데이터베이스 SQL 사이에 독립적인 연결을 지원하는 표준이다. 즉, DB 작업을 위한 표준이라 볼 수 있다. 오라클, AWS 같은 DBMS 회사들이 JDBC 인터페이스를 구현하여 제공하는데, 이를 JDBC 드라이버라 한다.

즉, JDBC 드라이버란 DBMS 회사들이 자신들의 데이터베이스 시스템에 접근할 수 있도록 표준 JDBC 인터페이스에 명시된 메소드를 구현한 것이라 볼 수 있다.

따라서 JDBC API를 사용하면 하나의 자바 어플리케이션 코드로 JDBC 드라이버를 제공하는 어떤 DBMS에도 접근이 가능하다!

참고로 Spring Data JPA는 JPA를 쓰기 편하게 만든 모듈이다. JPA를 한 단계 추상화한 Repository 인터페이스를 제공하고, Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, 스프링이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록한다.


Hibernate

  • 엔티티(Entity): 데이터베이스 테이블에 매핑되는 자바 클래스이다. 각 엔티티 인스턴스는 테이블의 행을 나타낸다.
  • 세션(Session): 데이터베이스와의 연결을 관리하는 Hibernate의 인터페이스이다. 이를 통해 데이터베이스 작업을 수행한다.
  • 방언(Dialect): 특정 데이터베이스에 맞는 SQL 문법을 생성하기 위해 사용되고 MySQL, PostgreSQL, Oracle 등 다양한 데이터베이스에 맞는 방언이 존재한다.
  • Hibernate 설정 파일: Hibernate를 설정하는 데 사용되는 파일로, 데이터베이스 연결 정보와 Hibernate 옵션을 포함한다.
package com.example.demo;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.Setter;

@Entity
@Getter
@Setter
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;
}
  1. @Entity:
    • 이 클래스가 JPA 엔티티임을 나타내며, 데이터베이스 테이블에 매핑된다.
  2. @Id:
    • 엔티티의 기본 키 필드를 나타낸다. 각 엔티티 인스턴스의 고유 식별자가 된다.
  3. @GeneratedValue:
    • 기본 키 값 생성 전략으로, strategy = GenerationType.IDENTITY는 데이터베이스가 자동으로 기본 키 값을 생성하도록 한다. MySQL에서 AUTO_INCREMENT 기능을 사용하여 기본 키를 생성한다.