JPA/SpringBoot with JPA

[스프링 부트와 JPA 활용1] 01. 프로젝트 생성

송재근 2021. 11. 21. 14:35
반응형

스프링 부트 스타터(https://start.spring.io/)

  • 사용 기능: web, thymeleaf, jpa, h2, lombok, validation
    • groupId: jpabook
    • artifactId: jpashop

 

Gradle 전체 설정

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

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

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  implementation 'org.springframework.boot:spring-boot-starter-validation'
  implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
  implementation 'org.springframework.boot:spring-boot-starter-web'
  
  compileOnly 'org.projectlombok:lombok'
  runtimeOnly 'com.h2database:h2'
  
  annotationProcessor 'org.projectlombok:lombok'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'
	//JUnit4 추가
  testImplementation("org.junit.vintage:junit-vintage-engine") {
  	exclude group: "org.hamcrest", module: "hamcrest-core"
  }
}

test {
	useJUnitPlatform()
}

JUnit5를 잘 알고 선호하면 입력하지 않아도 된다.

 

  • 동작 확인
    • 기본 테스트 케이스 실행
    • 스프링 부트 메인 실행 후 에러페이지로 간단하게 동작 확인(`http://localhost:8080')

 

View 환경 설정

  • 스프링 부트 thymeleaf viewName 매핑
    • resources:templates/ +{ViewName}+ .html

 

@Controller
public class HelloController {

	@GetMapping("hello")
	public String hello(Model model) {
    
 		model.addAttribute("data", "hello!!");
 		return "hello";
    
	}
    
}

 

thymeleaf 템플릿엔진 동작 확인(hello.html)

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
	<title>Hello</title>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'안녕하세요. ' + ${data}" >안녕하세요. 손님</p>
</body>
</html>

위치: resources/templates/hello.html

 

  • index.html 하나 만들기
    • static/index.html

 

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
	<title>Hello</title>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Hello
<a href="/hello">hello</a>
</body>
</html>

spring-boot-devtools 라이브러리를 추가하면,

html 파일을 컴파일만 해주면 서버 재시작 없이 View 파일 변경이 가능하다.

 

JPA와 DB 설정, 동작확인

main/resources/application.yml

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop
    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

띄어쓰기 주의!

 

실제 동작하는지 확인하기

 

회원 엔티티

@Entity
@Getter @Setter
public class Member {

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

 

회원 리포지토리

@Repository
public class MemberRepository {

	@PersistenceContext
	EntityManager em;
 
	public Long save(Member member) {
		em.persist(member);
		return member.getId();
	}
    
	public Member find(Long id) {
		return em.find(Member.class, id);
	}
    
}

 

테스트

import jpabook.jpashop.domain.Member;
import jpabook.jpashop.repository.MemberRepository;
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.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;

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

	@Autowired MemberRepository memberRepository;

	@Test
	@Transactional
	@Rollback(false)
	public void testMember() {
    
		Member member = new Member();
		member.setUsername("memberA");
        
		Long savedId = memberRepository.save(member);
        
		Member findMember = memberRepository.find(savedId);
        
		Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());

		Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
        
		Assertions.assertThat(findMember).isEqualTo(member); //JPA 엔티티 동일성 보장
        
	}
    
}

@Test는 JUnit4를 사용하면 org.junit.Test를 사용하셔야 합니다.

만약 JUnit5 버전을 사용하면 그 것에 맞게 사용하시면 됩니다.

 

  • Entity, Repository 동작 확인
  • jar 빌드해서 동작 확인

 

쿼리 파라미터 로그 남기기

로그에 다음을 추가하기 org.hibernate.type : SQL 실행 파라미터를 로그로 남긴다.

외부 라이브러리 사용

https://github.com/gavlyukovskiy/spring-boot-data-source-decorator

스프링 부트를 사용하면 이 라이브러리만 추가하면 된다.

implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'

 

참고: 쿼리 파라미터를 로그로 남기는 외부 라이브러리는 시스템 자원을 사용하므로, 개발 단계에서는 편하 게 사용해도 된다. 하지만 운영시스템에 적용하려면 꼭 성능테스트를 하고 사용하는 것이 좋다.

반응형