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 |