[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
전체를 선택한다.
아래와 같이 설정하면 된다.
💛 개인 공부 기록용 블로그입니다. 👻