Study Note

Spring Boot JPA 사용하기 본문

Spring/Spring Boot

Spring Boot JPA 사용하기

moreLearn 2020. 2. 11. 11:24

spring boot에서는 JPA 연동에 필요한 XML 설정을 자동으로 처리하는 JPA 스타터를 제공한다.

project 생성 및 설정

  1. eclipse에서 spring starter project로 project를 생성한다.
  2. project의 설정을 맞춘다.
  3. Dependencies 설정에서 이미지와 같이 5개의 설정을 선택한다.

  1. src/main/resources 밑의 application.properties 파일을 이미지와 같이 설정한다.
  2. DataSource Setting을 통해서 DBMS 접속을 위한 정보를 저장한다.
  3. JPA Setting을 통해서 JPA 설정을 한다.
  4. Loggin Setting을 통해 log 출력 level을 설정한다.

해당 표는 JPA Setting의 설정 내용이다.

spring.jpa.hibernate.ddl-auto의 값에 따른 설정 내용이다.

엔티티 매핑

package com.example.demo.domain;

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.CreationTimestamp;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString()
@Entity
@Table(name="users")
public class User {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Long id;
	private String username;
	
	private String password;
	
	@Temporal(value = TemporalType.TIMESTAMP)
	@CreationTimestamp
	private Date createdAt;

}

 

위의 코드는 간단한 엔티티 클래스이다.

  • @Getter, @Setter, @ToString은 각각 getter, setter, toString 메소드를 생성한다.
  • @Entity를 사용하여 해당 클래스를 엔티티로 처리한다.
  • @Table을 이용하여 테이블 이름을 설정해 줄 수 있다. 만약 테이블 이름과 클래스 이름이 같을 경우 생략해두 된다.
  • @Temporal을 사용하여 Date 타입의 날짜 데이터를 매핑한다.
    DATE는 날짜 TIME은 시간 TIMESTAMP는 날짜와 시간을 출력한다.
  • @CreationTimestamp를 사용하면 insert 시 자동으로 시간이 저장된다.
  • @Id가 지정된 변수는 식별자가 되어 primary key 역할을 한다.
  • @GeneratedValue는 @Id가 선언된 변수에 기본 키값을 자동으로 할당한다. 다음 표는 각 @GeneratedValue의 PK 전략이다.

application을 실행하면 콘솔에 Table이 자동 생성된 것을 확인할 수 있다.

리포지터리 작성

기존의 DAO와 동일한 개념으로 Repository 인터페이스가 있어 비즈니스 클래스에서는 Repository를 이용하여 실질적인 DB 연동 처리를 한다.

Respoitory의 상속 구조이다. Repository에는 거의 기능이 없으며 CRUD 기능은 CrudRepository에서 제공하며 페이징 처리가 필요한 경우 PagingAndSortingRepository를 사용한다. 마지막으로 Spring Data JPA에서 제공한 기능을 사용하려면 JpaRepository를 사용하면 된다.

package com.example.demo.persistence;

import org.springframework.data.repository.CrudRepository;

import com.example.demo.domain.User;

public interface MemberRepository extends CrudRepository<User, Long>{

}

 

해당 인터페이스는 CredRepository를 상속받은 인터페이스이다. 기본적인 CRUD기능을 수행할 수 있다. extends의 CrudRepository<User, Long>는 각각 엔티티 클래스 타입과 식별자(@Id) 타입을 지정한 것이다.

CRUD 기능 테스트

다음은 CrudRepository에서 제공하는 메소드들 이다.

CRUD 기능을 간단하게 사용해보기 위한 테스트 클래스인 UserRepositoryTest을 구현했다.

package com.example.demo;

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.example.demo.domain.User;
import com.example.demo.persistence.UserRepository;

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTest {
	@Autowired
	private UserRepository userRepo;

	@Test
	public void testDeleteUser() {
		userRepo.deleteById(1L);
	}

	
	@Test	
	public void testUpdateUser() {
		System.out.println("=== 1번 User 조회 ===");
		User user = userRepo.findById(1L).get();
		
		System.out.println("=== 1번 User의 username 수정 ===");
		user.setUsername("username2");
		userRepo.save(user);
	} 

	
	@Test
	public void testGetUser() {
		User user = userRepo.findById(1L).get();
		System.out.println(user.toString());
	} 

	
	@Test
	public void testInsertUser() {
		User user= new User();
		user.setUsername("username");
		user.setPassword("password");
		userRepo.save(user);
	}
}

testInsertUser() : @CreationTimestamp을 사용했기 때문에 created_at에 자동으로 날짜와 시간이 저장되었고 콘솔에서 쿼리가 실행된 모습을 볼 수 있다.

testGetUser() : 쿼리와 검색 결과를 확인할 수 있다.

testUpdateUser() : 수정할 데이터에 해당하는 엔티티를 메모리에 올리기 위해 select를 1번 하고 update 직전에 다시 수정할 엔티티를 메모리에 올리고 수정이 되기 때문에 select가 2번 실행된다.

testDeleteUser() : 삭제할 엔티티를 영속성 컨텍스트에 올리기 위해 select가 실행되고 delete가 실행된다.

'Spring > Spring Boot' 카테고리의 다른 글

SpringBoot JPA의 QueryDSL  (0) 2020.02.11