해당 일지의 내용은 인프런의 김영한 - 실전! 스프링 부트와 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차 캐쉬에서 가져오기 때문에 같음
}
}
'Spring' 카테고리의 다른 글
GSON toJson, fromJson에 대한 ...삽질?! (0) | 2020.07.25 |
---|---|
[스프링부트 기초] 스프링부트 활용: 외부설정,프로파일,로깅 (0) | 2019.12.02 |
[스프링 프레임워크 핵심 기술] IoC 컨테이너 (0) | 2019.12.02 |
@Component, @Service, @Repository, @Controller?? (0) | 2019.05.26 |
댓글