728x90

JPA는 자바 객체와 DB 테이블 간의 매핑을 처리하는 ORM(Object Relational Mapping) 기술의 표준이다.

JPA를 이용하기 위해서는 maven(메이븐)을 이용하거나 gradle(그래들)을 이용하여 패키지를 관리한다.

 

1. 프로젝트 의존성 추가(build.gradle)

dependencies {
    implementation 'mysql:mysql-connector-java'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}

 

2. application.properties 에 DB 정보 추가하기

# MySQL 설정 
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 
 
# DB Source URL 
spring.datasource.url=jdbc:mysql://<IP>:<Port/<DB>?useSSL=false
<IP>:<Port/<DB> ==> localhost:3306/study_db
 
 
# DB username 
spring.datasource.username=<username> 
 
# DB password 
spring.datasource.password=<password> 
 
true 설정시 JPA 쿼리문을 볼 수 있다 
spring.jpa.show-sql=true 
 
# DDL(create, alter, drop) 정의시 DB의 고유 기능을 사용할 수 있다. 
spring.jpa.hibernate.ddl-auto=update 
 
# JPA의 구현체인 Hibernate가 동작하면서 발생한 SQL의 가독성을 높여준다. 
spring.jpa.properties.hibernate.format_sql=true
 

 

DB와 통신이 정상적으로 잘 되는지 먼저 확인을 해야 한다.

DB와 통신이 잘 되는데도 불구하고 에러가 발생해서 엄청 삽질을 했는데 결국 사소한 문제였다.

spring.datasource.password=<password> 패스워드 뒤에 공백이 추가되어 있는 줄 모르고 있었다.

 

3. 테이블 설계

   ㅇ DB 생성 : CREATE DATABASE studydb default CHARACTER SET UTF8;

 

   ㅇ 테이블 생성

       - 테이블을 직접 생성해주었는데, 테이블 생성하지 않고 자동으로 추가되는 것도 확인했다.

       - 테이블명을 User 로 첫글자를 대문자로 해서 생성후 테스트해보니, Spring Boot 에서 소문자 user 생성하더라.

CREATE TABLE `user` (
  `uid` int(11) NOT NULL,
  `account` varchar(45) NOT NULL,
  `email` varchar(45) DEFAULT NULL,
  `phone_number` varchar(15) DEFAULT NULL COMMENT '전화번호',
  `created_at` datetime NOT NULL,
  `created_by` varchar(45) NOT NULL,
  `updated_at` datetime DEFAULT NULL,
  `updated_by` varchar(45) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
ALTER TABLE `user`  ADD PRIMARY KEY (`uid`);
ALTER TABLE `user`  MODIFY `uid` int(11) NOT NULL AUTO_INCREMENT;
 

   ㅇ 사용자 권한 추가

MySQL 5.7 버전을 설치하고 테스트를 했더니, 패스워드 지정시 기본으로 영문 소문자, 대문자, 숫자, 특수문자를 포함해서 8자리 이상 입력해야 되더라.

// 비밀번호 정책 확인
show variables like 'validate_password%';

// DB 생성
create database studydb default character set utf8;

 

// 사용자 생성 및 권한 추가

use mysql;
create user codefox@localhost identified by 'Autoset12#$';
grant all privileges on studydb.* to codefox@localhost;
flush privileges;

use mysql;
create user codefox@'192.168.1.25' identified by 'Autoset12#$';
grant all privileges on studydb.* to codefox@'192.168.1.25';
flush privileges;

 

※ Virtual Box를 설치하여 CentOS 7 + MySQL 5.7 버전을 설치하고 192.168.1.X 동일 사설 네트워크 환경에서 테스트하기 위한 설정이다. 192.168.1.25 는 Windows 10 이 설치된 PC 의 IP주소이고 CentOS 7 서버의 IP주소는 192.168.1.20 이다.

 

4. Entity 클래스

package com.example.study.model.entity;
 
import lombok.*;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.time.LocalDateTime;
import java.time.LocalTime;
 
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class User {
    // DB의 테이블의 이름과 동일한 User 클래스 생성
 
    @Id  // @Id : Primary Key를 의미
    @GeneratedValue(strategy = GenerationType.IDENTITY) //MySQL의 AUTO_INCREMENT를 사용
    private Long idx;
    private String account;
    private String email;
    private String phoneNumber;
    private LocalDateTime createdAt;
    private String createdBy;
    private LocalDateTime updatedAt;
    private String updatedBy;
}
 

 

5. JPA Repository 생성

@Repository
- 따로 쿼리문 작성없이 생성, 조회, 업데이트, 삭제(CRUD)를 할 수 있게 기능을 제공해줌
- 제너릭 타입으로는 첫번째부터, <Entity, PrimaryKey의 타입>을 넣는다

 

package com.example.study.repository;
 
import com.example.study.model.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
 
@Repository
public interface UserRepository extends JpaRepository<User,Long> {
}
 

 

 

6. 테스트

테이블에 User 데이터가 잘 생성되는지 테스트하는 과정이다.

프로젝트 구조 확인

 

package com.example.study.repository;
 
import com.example.study.StudyApplicationTests;
import com.example.study.model.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
 
import java.time.LocalDateTime;
 
@SpringBootTest
public class UserReposityTest extends StudyApplicationTests {
 
    // Dependency Injection(DI)
    @Autowired
    private UserRepository userRepository;
 
    @Test
    public void create(){
        User user = new User();
        user.setAccount("test01");
        user.setEmail("jsk005@naver.com");
        user.setPhoneNumber("010-0001-0000");
        user.setCreatedAt(LocalDateTime.now());
        user.setCreatedBy("admin01");
 
        User newUser = userRepository.save(user);
        System.out.println("newUser :" + newUser);
    }
 
    public void read(){
 
    }
 
    public void update(){
 
    }
 
    public void delete(){
 
    }
}
 

 

3번을 눌러서 테스트하면 DB에 데이터가 저장되는지 여부를 확인할 수 있다.

 

 

 

MySQL 과 MariaDB 모두 테스트를 했고, User 데이터가 잘 생성되는걸 확인할 수 있다.

Run 정보를 확인해보면....

 

'Spring' 카테고리의 다른 글

Spring Boot JPA(Java Persistence API ) - MariaDB  (0) 2021.10.23
[SpringBoot] Lombok  (0) 2021.10.22
MariaDB 10.6 설치  (0) 2021.10.21
IntelliJ IDEA 에서 Spring 프로젝트 생성  (0) 2021.10.20
Spring Tool Suite 4 기본 환경 설정  (0) 2020.11.09
블로그 이미지

Link2Me

,