스프링부트는 복잡하고 어려운 스프링 기술을 간결하고 쉽게 사용할 수 있도록 도와주는 기술이다. JPA는 강력한 Java ORM 표준 기술이다. 이 두 기술을 합치면 높은 개발 생산성을 유지하면서 빠르게 웹 애플리케이션을 개발할 수 있다.
Dependencies 추가
프로젝트 실행
앞서 gradle 프로젝트로 생성하였는데, gradle은 라이브러리들을 관리해주는 역할을 한다. (라이브러리들 간의 의존관계까지 관리해준다.)
각 라이브러리의 하위에는 해당 라이브러리가 의존하는 라이브러리들이 있다.
HikariCP - 커넥션 풀, 스프링부트 2점대부터는 기본으로 사용한다. 실제 운영에서 많이 쓴다고 한다.
slf4j - 로그를 찍는 인터페이스의 모음.
타임리프는 흔히 View Template(뷰 템플릿)이라고 부른다. 뷰 템플릿은 컨트롤러가 전달하는 데이터를 이용하여 동적으로 화면을 구성할 수 있게 해준다.
HTML 코드에 JAVA 코드를 넣어 동적 웹페이지를 생성하는 웹어플리케이 도구이다. (JSP와 마찬가지로 서버 사이드에서 랜더링 해주는 도구.) html태그를 기반으로하여 th:속성을 이용하여 동적인 View를 제공한다.
장점
타임리프를 이용해 서버 사이드 동적 화면 렌더링을 진행해보겠다.
@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model) {
model.addAttribute("data", "hello!!");
return "hello";
}
}
resources/templates/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>
Model을 통해 hello.html에 전달한 data 값이 동적으로 잘 랜더링된 것을 확인할 수 있다.
정적 화면 컨텐츠 파일은 resources/static 폴더에 넣어둔다고 보면 된다.
참고: spring-boot-devtools 라이브러리를 추가하면, html 파일을 컴파일만 해주면 서버 재시작 없이View 파일 변경이 가능하다. (캐싱 없애서 reload 가능하게 해줌)
인텔리J 컴파일 방법: 메뉴 build Recompile
개발이나 테스트 용도로 가볍고 편리한 DB, 웹 콘솔 화면 제공
https://www.h2database.com
- 다운로드 및 설치
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
회원 엔티티
회원 리포지토리
테스트
이 코드에서 @Transactional 이 없으면 트랜잭션이 없다는 에러가 난다. <- 엔티티 매니저를 통한 모든 데이터 변경은 항상 트랜잭션 안에서 일어나야 하기 때문이다!
@Transactional 이 테스트 코드에 있으면, DB를 롤백한다! -> 반복적인 테스트가 가능하다.
같은 트랜잭션 안에서 엔티티를 저장하고 조회하면 영속성 컨텍스트가 똑같기 때문에, 같은 id(식별자)를 가지면 같은 엔티티로 식별된다.
- 쿼리 파라미터 로그 남기기
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'