본문 바로가기
Spring

[JPA 공부일지] JPA와 DB설정 동작확인

by 작심평생 2020. 1. 27.

해당 일지의 내용은 인프런의 김영한 - 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발의 내용을 학습한 것임을 알려드립니다.


build.gradle

plugins {
id 'org.springframework.boot' version '2.1.9.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java'
}

group = 'jpabook'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'

// 쿼리 파라미터 이쁘게 보는..
// 운영에도 적용하면 성능문제가 발생할 수 있으니 확인하고 사용하기
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8'

compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
implementation 'junit:junit:4.12'
}

test {
useJUnitPlatform()
}


  • 스프링부트 프로젝트를 만들 때 boot 버전확인이 필요합니다.
    • WHY?
      • 활용편에서 테스트환경을 junit4를 이용하는데 Boot 최신버전에서는 import를 못하는 상황이 발생했습니다.
      • 따라서 실습환경을 맞춰주기 위해서는 Boot 버전을 2.1.9로 변경 후 @RunWith를 import 하면 됩니다.




application.yml

# MVCC : 여러개 한번에 접근했을때 빨리 처리가 됨. (H2 1.4.198 부터 제거됨)
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/jpashopWithBoot
username: sa
password:
driver-class-name: org.h2.Driver

jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
# show_sql: true : sysout으로 sql찍음
format_sql: true

logging:
level:
org.hibernate.SQL: debug #로거를 통해서





Member.java

package jpabook.jpashop;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Getter @Setter
public class Member {

@Id @GeneratedValue
private Long id;
private String username;
}





MemberRepository.java

package jpabook.jpashop;

import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Repository
public class MemberRepository {

// 스프링컨테이너에서 해당 어노테이션이 붙어있으면 entitymanager를 주입해줌
// 엔티티 매니저 생성 전에 엔티티 팩토리를 생성해야하는데 이건 다 springboot에서 알아서 (spring-data-jpa!)
@PersistenceContext
private EntityManager em;

// 저장하는 코드
public Long save(Member member){
em.persist(member);
return member.getId();
}

public Member find(Long id){
return em.find(Member.class, id);
}
}


  • 해당 강의를 수강하기 전에 자바 ORM 표준 JPA 프로그래밍 - 기본편 을 수강했습니다.
  • 원래 순수 JPA를 사용하면 엔티티매니저를 이용하기 위해선 팩토리를 선언하고 이를 위해선 따로 xml 파일도 있어야했는데 이를 Spring에서 대신해 주기 때문에 편하게 엔티티매니저를 사용할 수 있었습니다.




MemberRepository.test

package jpabook.jpashop;

import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;

import static org.junit.Assert.*;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberRepositoryTest {

@Autowired
MemberRepository memberRepository;

@Test

// 테스트에 적용된 경우, test끝내고 데이터를 롤백해버림. 따라서 DB에 테스트 데이터가 없음.
// 만약 테스트 데이터 롤백을 안하려면 @RollBack(false) 어노테이션 추가하면 됨.
@Transactional
@Rollback(false)
public void testMember() throws Exception{
// given
Member member = new Member();
member.setUsername("memberA");

// when
Long savedId = memberRepository.save(member);
Member findMember = memberRepository.find(savedId);

// then
Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
Assertions.assertThat(findMember).isEqualTo(member); // 결과 : true
// ? 같은 트렉젝션 안에서 저장하고 조회하면 영속성 컨텍스트가 같고 그럼 id값이 같기 때문.
// , 1차 캐쉬에서 가져오기 때문에 같음
}
}


댓글