스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 [김영한 강사님]
plugins {
id 'org.springframework.boot' version '2.7.3' // 기본적인 스프트 플러그인, 라이브러리 버전까지 관리해줌
id 'io.spring.dependency-management' version '1.0.13.RELEASE' // 스프링 부트에 필요한것들 import
id 'java' // 사용 언어
}
configurations { //lombok에서 사용하기 위한 설정
compileOnly {
extendsFrom annotationProcessor
}
}
./gradlew dependencies -configuration compileCliassPath
spring-boot-starter-aop
spring-boot-starter-jdbc
hibernate + JPA : 하이버네이트 + JPA
spring-data-jpa : 스프링 데이터 JPA
spring-boot
spring-boot-starter-logging
스프링 공식 튜도리얼 : https://spring.io/guides/gs/serving-web-content/
스프링부트 메뉴얼 : https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-developing-web-applications.html#boot-features-spring-mvc-templateengines
resources:templates/
+ {ViewName} + .html@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model) {
model.addAttribute("data", "hello!!"); // 여기의 hello!!가
return "hello";
}
}
<!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> //여기의 ${data}로 들어와서 안녕하세요. hello!! 가 나온다.
</body>
</html>
개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면 제공
/jpashop.mv.db
파일 생성 확인jdbc:h2:tcp://localhost/~/jpashop
이렇게 tcp 네트워크 모드로 접속 *참고 : -tcpPort 옵션을 통하여 H2 Database 실행 포트를 설정할 수 있다
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
show_sql
옵션은 System.out
에 하이버네이트 실행 SQL을 남긴다.org.hibernate.SQL
옵션은 logger를 통해 하이버네티으 실행 SQL을 남긴다.❗주의❗ application.yml 같은 yml 파일은 띄어쓰기 2칸으로 계층을 만들기 때문에 띄어쓰기 2칸은 필수로 해주어야 한다.
Member.java
@Entity
@Getter
@Setter
public class Member{
@Id @GeneratedValue
private Long id;
private String username;
MemberRepository
@Repository
public class MemberRepository {
@PersistenceContext // 스프링 부트가 @PersistenceContext가 있으면 EntityManager를 주입해줌
EntityManager em;
public Long save(Member member) {
em.persist(member);
return member.getId();
}
public Member find(Long id) {
return em.find(Member.class, id);
}
}
비영속성 : 엔티티 객체를 생성한 순수한 객체의 상태이며 저장하지 않은 상태이다. 따라서 영속성 컨텍스트나 DB와 관련이 없다.
영속성 : 엔티티 매니저를 통해 엔티티를 영속성 컨텍스트에 저장한 상태를 말한다. 영속성 컨텍스트가 관리하는 엔티티를 영속상태라고 한다.
준영속 : 영속성 컨텍스트가 관리하던 영속상태의 엔티티를 영속성 컨텍스트가 관리하지 않으면 준영속 상태가 된다.
MemberRepositoryTest
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() {
// 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); //JPA 엔티티 동일성 보장
}
}
스프링 부트를 통해서
persistence.xml
과LocalContainerEntityManagerFactoryBean
등 복잡한 설정이 다 자동화가 되어있다.
build.gradle
마지막에 추가
test {
useJUnitPlatform()
}
logging.org.hibernate.type
에 trace를 주면 SQL 실행 파라미터를 로그로 남긴다.https://github.com/gavlyukovskiy/spring-boot-data-source-decorator
스프링 부트를 사용하면 implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'
해주면 된다.
❗참고❗ 쿼리 파라미터를 로그로 남기는 외부 라이브러리는 시스템 자원을 사용하므로, 개발 단계에서는 편하게 사용해도 되지만 운영시스템에 적용하려면 꼭 성능테스트를 하고 사용하는 것이 좋다.
기존 어플리케이션에서 코드를 변경하지 않고도 데이터베이스의 데이터를 자연스럽게 가로채고, 로그도 남기개 해주는 프레임워크이다.
사용자의 DataSource를 P65pyDataSource가 감싸고, jdbc요청이 발생 할 때마다 p6spy가 프록시로 래핑해서 해당 정보를 분석하고, 로그를 남기는 원리로 작동한다.
P6Spy를 도입하는 방법
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-jpa
https://shanepark.tistory.com/415