Spring Data JPA 첫 정리하기 위해 세팅한 환경은 다음과 같다.

 

# DB : MySQL 5.7

# STS : 4.16.0.RELEASE

# Spring Boot : 2.7.4

# Dependencies

  * Lombok

  * MySQL Driver

  * Spring Boot DevTools

  * Spring Data JPA

  * Spring Web

 

1. DataSource 설정

Spring Boot에서 JPA를 사용하기 위해서는 DataSource 설정이 필요하다.

src/main/resources 에서 application.properties 파일을 열어 아래의 내용을 입력한다.

# MySql Connector 버전에 따라 입력 내용이 다름 
# MySql Connector8 이상 버전  com.mysql.cj.jdbc.Driver (8 미만의 Connector도 모두 지원)
# MySql Connector8 미만 버전  com.mysql.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/cookie?useSSL=false
spring.datasource.username=cookie
spring.datasource.password=cookie_1234

# 스키마 생성(create) 
spring.jpa.hibernate.ddl-auto = create

# DDL 생성 시 DB 기능 사용 여부
spring.jpa.generate-ddl = true

# 실행된 SQL 표시 여부
spring.jpa.show-sql = true

# 데이터베이스 지정
spring.jpa.database = mysql

# 로그 레벨
logging.level.org.hibernate = info

# MySQL상세 지정
spring.jpa.database-platform = org.hibernate.dialect.MySQL5InnoDBDialect

 

설정 부분 중 spring.jpa.hibernate.ddl-auto 부분에서 DDL 처리 옵셜을 지정할 수 있다.

옵션 설명
create 기존 테이블을 삭제 후 다시 생성 (Drop -> Create)
create-drop 테이블 생성 후 테이블을 삭제 (Create -> Drop) ==> 테스트용으로 좋음
update 변경된 부분만 DB에 반영
validate Entity와 테이블의 맵핑 성공 여부만 확인
none spring.jpa.hibernate.ddl-auto 기능을 사용하지 않음

 

2. Entity 클래스 (구 DTO, VO)

테이블에서 사용할 컬럼을 지정해준다.

이번 연습의 컨셉은 게임에서 길드원의 정보를 기록하는 테이블이다. 

경로는 package 정보를 참고하자.

package com.cookie.domain;
import java.sql.Timestamp;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.CreationTimestamp;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
@Entity
@Table(name = "tbml_GuildInfo")
public class Guild {
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long 		indexNo;			// 번호(pk)
	private int 		level;				// 레벨
	private String 		userName;			// 유저명
	private String		userJob;			// 직업명
	private String		authority;			// 길드권한
	private Long		contribution;		// 기여도
	
	@CreationTimestamp
	private Timestamp	guildRegDate;		// 가입일
	
}

테이블을 생성할 때 꼭 필요한 것은 @Entity 와 @Id 어노테이션이다.

클래스는 테이블이 되며 멤버변수는 테이블의 컬럼들이 된다.

여기서 어노테이션을 통해 테이블 생성에 조건을 추가할 수 있다.

 

@어노테이션 설명
@Id 지정한 변수를 Entity 구별용 식별자로 지정 = PK 지정
@GeneratedValue @Id로 지정된 식별자의 관리 전략을 지정
@Column 컬림이 되는 멤버변수들에 제약조건을 지정한다. 아래 표 참고
@Table 생성될 테이블은 클래스의 명칭을 따라가지만 명칭을 다르게 하고자 할 때 사용
속성값을 사용하여 인덱스 생성 등을 지정할 수도 있다.
@Entity 해당 클래스의 인스턴스가 Entity 임을 명시해 줌.

 

* @GeneratedValue 전략

strategy 설명
AUTO 현재 DB에 맞게 자동 선택
IDENTITY PK 생성 방식을 DB에 위임하는 방식으로 DB에 의존적임. (MySQL에서 주로 사용)
SEQUENCE 시퀀스 컬럼을 이용 (오라클에서만 사용)
TABLE 유일성이 보장되는 테이블을 이용

 

* @Column 속성

속성 타입 설명
name String 컬럼명을 지정
unique boolean 유니크 여부를 지정
nullable boolean null 허용 여부를 지정
insertable boolean insert가 가능한 컬럼인가 지정
updatable boolean update가 가능한 컬럼인가 지정
table String 테이블 이름
length int 컬럼 사이즈를 지정
precision int 소수점 정밀도를 지정
scale int 소수점 이하 자리수를 지정

 

 

3. Repository Interface 생성 (구 DAO)

Spring Data JPA는 별도의 클래스 생성없이 인터페이스를 구현하는 것으로 JPA관련 처리를 끝낼 수 있다.

실제 DB 작업에서 많이 쓰이는 CRUD 방식은 CrudRepository 인터페이스에서 대부분의 기능을 지원해준다.

따라서 새로 만들 GuildRepository 인터페이스는 CrudRepository 인터페이스를 상속받아 사용하면 된다.

 

Spring Data JPA의 인터페이스 구조는 다음과 같다. (T : Table명 , ID : 식별자(PK) 타입)

 Repository<T,ID>

CrudRepository<T, ID>  

PagingAndSortingRepository<T, ID>

 

package com.cookie.persistence;

import org.springframework.data.repository.CrudRepository;
import com.cookie.domain.Guild;

public interface GuildRepository extends CrudRepository<Guild, Long>{
}

 

4. 데이터 INSERT

Repository까지 준비되었다면 실제 데이터를 넣어 보자.

간단하게 데이터가 잘 들어가는지만 확인하기 위한 용도이므로 src/test/java 에서 테스트를 진행해본다.

package com.cookie;
import java.util.Random;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.cookie.domain.Guild;
import com.cookie.persistence.GuildRepository;

@SpringBootTest
class StudyJpaApplicationTests {

	@Autowired
	private GuildRepository guildRepository;
	
	@Test
	void testInsert50() {
		Random ran = new Random();
		
		int 	jobNo 	= 0;
		String 	job[] 	= {"기사","도적","마법사"};
		
		for(int i = 1; i <= 50; i++) {
			jobNo = ran.nextInt(3);
			
			Guild guild = new Guild();
			guild.setLevel(i);
			guild.setUserName("cookie" + i);
			guild.setUserJob(job[jobNo]);
			guild.setAuthority("길드원");
			guild.setContribution(i*20);
			guildRepository.save(guild);
			
		}
	}
}

소스코드를 보면 SQL에 관련된 아무런 쿼리도 존재하지 않는다.

직접 쿼리를 작성할 필요가 없어지고 개발만 하면 되므로 편리성이 매우 좋다.

코드 마지막에는 save()를 통해 insert함을 추측해 볼 수 있다.

 

마지막으로 MySQL 워크벤치 확인 결과이다. 

Guild.java 에서 설정한 대로 테이블 명은 "tbml_GuildInfo" 로 지정했으나 실제로는 "tbml_guild_Info" 로 들어갔다.

자동으로 대소문자 구분없이 "_" 로 구분된 모습이다.

 

 

 

※ Spring Data JPA는 구멍가게코딩단의 [초급 개발자들을 위한 가볍고 넓은 스프링부트 스타트 스프링 부트2.0] 책을 참고하였습니다.

+ Recent posts