인프런 김영한 강사님의
실전! 스프링 데이터 JPA
을 정리한 글입니다.
스프링 부트 스타터 활용
Gradle - Groovy Project
사용 기능 : web, jpa, h2, lombok
스프링부트 3.0 이상 사용 시
JPA 애노테이션
스프링에서 자주 사용하는 @PostConstruct 애노테이션
스프링에서 자주 사용하는 검증 애노테이션
plugins {
id ‘org.springframework.boot’ version= ‘2.2.1.RELEASE’
id ‘io.spring.dependency-management’ version ‘1.0.8.RELEASE’
id ‘java’
}
group = ‘study’
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-web’
implementation ‘com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.7’
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’
}
}
test {
useJUnitPlatform()
}
package study.datajpa.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "hello";
}
}
참고 : 최근 IntelliJ 버전은 Gradle로 실행 하는 것이 기본 설정이고, 이는 실행 속도가 느리므로. 자바가 직접 실행하도록 변경하자.
./gradlew dependencies --configuration compileClasspath
spring-boot-starter-aop
spring-boot-starter-jdbc
hibernate + JPA : 하이버네이트 + JPA
spring-data-jpa : 스프링 데이터 JPA
junit : 테스트 프레임워크, 스프링 부트 2.2부터 junit5(jupiter
) 사용
vintage
assertj : 테스트 코드를 좀 더 편하게 작성하도록 도와주는 라이브러리
spring-test : 스프링 통합 테스트 지원
권한 주기 : chmod 755 h2.sh
데이터베이스 파일 생성 방법
jdbc:h2:~/datajpa
(최소 한번)~/datajpa.mv.db
파일 생성 확인jdbc:h2:tcp://localhost/~/datajpa
의 형태로 접속참고 : H2 데이터베이스의 MVCC 옵션은 H2 1.4.198 버전부터 제거되었음. 사용 버전이 1.4.199이므로 옵션 없이 사용
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/datajpa
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
# show_sql: true
format_sql: true
logging.level:
org.hibernate.SQL: debug
# org.hibernate.type: trace
참고 : 모든 로그 출력은 가급적 로거를 통해 남겨야 한다.
show_sql
:System.out
에 하이버네이트 실행 SQL을 남김
org.hibernate.SQL
: logger를 통해 하이버네이트 실행 SQL를 남김
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
...
}
@Repository
public class MemberJpaRepository {
@PersistenceContext
private EntityManager em;
public Member save(Member member) {
em.persist(member);
return member;
}
public Member find(Long id) {
return em.find(Member.class, id);
}
}
@SpringBootTest
@Transactional
@Rollback(false)
public class MemberJpaRepositoryTest {
@Autowired
MemberJpaRepository memberJpaRepository;
@Test
public void testMember() {
Member member = new Member("memberA");
Member savedMember = memberJpaRepository.save(member);
Member findMember = memberJpaRepository.find(savedMember.getId());
assertThat(findMember.getId()).isEqualTo(member.getId());
assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
assertThat(findMember).isEqualTo(member); //JPA 엔티티 동일성 보장
}
}
Entity, Repository 동작 확인
jar 빌드해서 동작 확인
참고 : 스프링 부트를 통해 복잡한 설정이 다 자동화
1
org.hibernate.type
: SQL 실행 파라미터 로그로 남김.implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.7'
참고 : 쿼리 파라미터를 로그로 남기는 외부 라이브러리는 시스템 자원을 사용하므로, 개발 단계에서는 편하게 사용해도 된다.
운영 시스템에 적용하려면 꼭 성능 테스트를 하고 사용하는 것이 좋다.
스프링부트 3.0 버전 이상일 경우,
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'