[SPRING] JPA 웹 애플리케이션 - 1. 환경 설정
프로젝트 생성
https://start.spring.io/에서 아래와 같이 설정한 뒤에 프로젝트를 생성한다.

build.gradle 변경
아래 build.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'
implementation 'org.springframework.boot:spring-boot-devtools'
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'
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()
}
spring-boot-devtools
implementation 'org.springframework.boot:spring-boot-devtools'
spring-boot-devtools 라이브러리를 추가하면, html 파일을 컴파일만 해주면 서버 재시작 없이 View 파일 변경이 가능하다.
인텔리J 컴파일 방법
상단바 ->Build->Recompile ...
p6spy-spring-boot-starter
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'
p6spy-spring-boot-starter 라이브러리를 추가하면, 아래와 같이 쿼리 파라미터의 로그를 남길 수 있다.

외부 라이브러리를 사용한 것이다.
https://github.com/gavlyukovskiy/spring-boot-data-source-decorator
참고
쿼리 파라미터를 로그로 남기는 외부 라이브러리는 시스템 자원을 사용하므로, 개발 단계에서는 편하 게 사용해도 된다.
하지만 운영시스템에 적용하려면 꼭 성능테스트를 하고 사용하는 것이 좋다.
lombok 적용
- Prefrences -> plugin -> lombok 검색 실행 (재시작)
- Prefrences -> Annotation Processors 검색 -> Enable annotation processing 체크 (재시작)
IntelliJ Gradle 대신에 자바 직접 실행
- Preferences -> Build, Execution, Deployment -> Build Tools -> Gradle (혹은
gradle검색) - Build and run using: Gradle -> IntelliJ IDEA
- Run tests using: Gradle -> IntelliJ IDEA
H2 데이터베이스 사용
H2 데이터베이스는 Version 1.4.200을 설치해야한다.
파일 생성 (최초 한번)
JDBC URL에jdbc:h2:~/jpashop을 입력한 뒤 연결한다.~/jpashop.mv.db파일이 생성되었는지 확인한다. (터미널의 home(~)에서..)
접속
이후 부터는 JDBC URL에 jdbc:h2:tcp://localhost/~/jpashop을 입력하여 연결한다.
JPA와 DB 설정 & 동작 확인
application.yml
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
spring.jpa.hibernate.ddl-auto: create
- 이 옵션은 애플리케이션 실행 시점에 테이블을 drop 하고, 다시 생성한다.
참고
모든 로그 출력은 가급적 로거를 통해 남겨야 한다.
show_sql: 옵션은System.out에 하이버네이트 실행 SQL을 남긴다.org.hibernate.SQL: 옵션은 logger를 통해 하이버네이트 실행 SQL을 남긴다.
주의 🚨
application.yml같은yml파일은 띄어쓰기(스페이스) 2칸으로 계층을 만든다.
따라서 띄어쓰기를 주의해야 한다!
동작 확인
회원 엔티티
src/main/java/jpabook/jpashop/Member.java
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue // 자동으로 생성된다.
private Long id;
private String username;
}
회원 리포지토리
src/main/java/jpabook/jpashop/MemberRepository.java
@Repository
public class MemberRepository {
@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);
}
}
테스트
src/test/java/jpabook/jpashop/MemberRepositoryTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberRepositoryTest {
@Autowired
MemberRepository memberRepository;
@Test
@Transactional
@Rollback(false)
public void testMember() throws Exception {
// given
Member member = new Member();
member.setUsername("memberA");
// when
Long savdId = memberRepository.save(member);
Member findMember = memberRepository.find(savdId);
// then
assertThat(findMember.getId()).isEqualTo(member.getId());
assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
}
}
테스트 코드에 @Transactional 애노테이션을 붙이면 자동으로 롤백하기 때문에 변경 사항을 db에서 확인할 수 없다.
변경 사항을 확인하기 위해서 @Rollback(false) 애노테이션을 붙였다.
주의 🚨
@Test는 JUnit4를 사용하면org.junit.Test를 사용해야 한다.
만약 JUnit5 버전을 사용하면 그 것에 맞게 사용하면 된다.
Live Templates 생성
tdd를 입력한 뒤에 tab을 누르면 테스트 코드 템플릿이 나오도록 커스텀 설정할 수 있다.
Preference->template검색 후Live Templates을 클릭한다.
(Editor->Code Style->Live Templates)- 우측에
+를 클릭 ->Template Group선택 custom이라는 이름으로 그룹 생성custom에 커서 올리고+다시 클릭 ->Live Templates선택<abbreviation>에tdd입력Template text에 코드 작성 (Description은 작성해도 되고 안해도 된다.)
template text:@Test public void $NAME$() throws Exception { // given $END$ // when // then }- 맨 하단에서
Define클릭 후Java전체를 선택한다.
아래와 같이 설정하면 된다.

💛 개인 공부 기록용 블로그입니다. 👻