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] 책을 참고하였습니다.
'SPRING BOOT > SPRING DATA JPA' 카테고리의 다른 글
Spring Data JPA : @Qeury를 이용한 데이터 조회 (0) | 2022.11.19 |
---|---|
Spring Data JPA 조회 페이징 처리 (0) | 2022.11.19 |
Spring Data JPA [SELECT] 쿼리메소드 (0) | 2022.11.05 |
Spring Data JPA 개요 (0) | 2022.10.10 |