실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
스프링 핵심 원리 - 기본편 - 인프런
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다. 초급 프레임워크 및 라이브러리 웹 개발 서버 개발 Back-End Spring 객체지향 온
www.inflearn.com
강의를 들으며 생각 정리 + "자바 ORM 표준 JPA 프로그래밍" 책 참고
지금까지는 순수한 자바 환경에서 JPA를 사용했다. 따라서 데이터베이스 커넥션과 트랜잭션 처리도 JPA가 제공하는 기능을 직접 사용했다. 스프링 프레임워크와 JPA를 함께 사용한다는 것은 스프링 컨테이너 위에서 JPA를 사용한다는 의미다.
스프링부트는 스프링 프레임워크 기반의 애플리케이션을 쉽게 만들기 위한 스프링 프로젝트이다. 즉, 스프링부트는 스프링을 쉽게 사용할 수 있도록 필요한 설정을 대부분 미리 세팅 해놓았다는 뜻이다.
이제 스프링부트와 JPA를 사용해서 실제 웹 애플리케이션을 만들어보자.
프로젝트 생성
스프링 부트 스타터(https://start.spring.io)에서 프로젝트를 기본적으로 셋팅할 수 있다.
기본적인 설정은 다음과 같다.
Gradle Project
groupId: jpabook
artifactId: jpashop (프로젝트 이름)
Java version : 11
dependency : Spring web, Thymeleaf, Spring Data JPA, H2 Database, Lombok, Validation
이제 프로젝트를 생성하고 실행시킨다.
<build.gradle>
plugins {
id 'org.springframework.boot' version '2.4.2'
id 'io.spring.dependency-management' version '1.0.11.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-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-validation'
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()
}
build.gradle이 위와 같이 생성된다.
중요한건 dependecies 부분인데, 앞서 미리 설정한 라이브러리들을 불러온다. 스프링부트는 스프링부트 버전에 맞춰 알맞은 버전의 라이브러리를 불러오기 때문에 따로 버전 표시를 하지 않아도 된다.
+) 추가로 Test시 JUnit4를 사용하기 위해 주석 부분을 추가했다.
+) 롬복의 경우 다음 링크를 참고해서 설치한다.
스프링 - 롬복(lombok) 라이브러리 설치
롬복 라이브러리는 도메인 클래스에서 getter/setter 메서드와 toString, equals, hashCode 등의 메서드를 애노테이션으로 사용할 수 있도록 해주는 라이브러리이다. 이외에도 몇 가지 기능이 존재하지만,
gksdudrb922.tistory.com
+) IntelliJ에서 Gradle 사용 시 주의점
IntelliJ에서 Gradle 사용시 자바 직접 실행
IntelliJ에서 Gradle 프로젝트 사용시 Gradle 대신에 자바 직접 실행 방법 최근 IntelliJ 버전은 Gradle로 실행을 하는 것이 기본 설정이다. 이렇게 하면 실행속도가 느리다. 다음과 같이 변경하면 자바로
gksdudrb922.tistory.com
라이브러리 살펴보기
gradle 의존관계는 실행 창(git bash 등)에서 프로젝트 폴더로 들어가 ./gradlew dependencies 명령을 통해 확인할 수 있다.
IntelliJ에서 우측 "gradle"을 클릭해서 확인할 수도 있다.
스프링부트는 기본적으로 라이브러리를 등록하면 의존관계가 필요한 다른 라이브러리들을 모두 가져온다.
프로젝트 생성시 등록한 라이브러리들에 대한 주요 의존 라이브러리들을 살펴보면 다음과 같다.
스프링부트 라이브러리
spring-boot-starter-web
- spring-boot-starter-tomcat: 톰캣 (웹서버)
- spring-webmvc: 스프링 웹 MVC
spring-boot-starter-thymeleaf: 타임리프 템플릿 엔진(View)
spring-boot-starter-data-jpa
- spring-boot-starter-aop
- spring-boot-starter-jdbc
- HikariCP 커넥션 풀 (부트 2.0 기본)
- hibernate + JPA: 하이버네이트 + JPA
- spring-data-jpa: 스프링 데이터 JPA
spring-boot-starter(공통): 스프링 부트 + 스프링 코어 + 로깅
- spring-boot
- spring-core
- spring-boot-starter-logging
- logback, slf4j
테스트 라이브러리
spring-boot-starter-test
- junit: 테스트 프레임워크
- mockito: 목 라이브러리
- assertj: 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리
- spring-test: 스프링 통합 테스트 지원
View 환경 설정
스프링부트를 실행하면 기본적으로 localhost:8080에 화면을 띄운다.
기본적인 화면은 Whitelabel Error Page가 나온다. 아무것도 설정한 것이 없을 때 나오는 화면이다.
첫 화면을 설정하고 싶다면 index.html을 생성해서 원하는 코드를 채워 넣으면 스프링부트 실행 시 기본 화면으로 제공된다.(welcome page)
후에 Controller와 다른 템플릿 파일을 사용해서 여러 웹 화면을 만들 수 있다.(이후에 차근차근 공부해보자)
+) html 파일을 수정할 때마다 서버를 중지했다 다시 재시작 해줘야 하는 번거로움이 있었는데, spring-boot-devtools 라이브러리를 build.gradle에 추가하면, html 파일을 컴파일만 해주면 서버 재시작 없이 View 파일 변경이 가능하다.
devtools
스프링 웹 환경에서 html 파일을 수정할 때마다 서버를 중지했다 다시 재시작 해줘야 하는 번거로움이 있었는데, spring-boot-devtools 라이브러리를 추가하면, html 파일을 컴파일만 해주면 서버 재시
gksdudrb922.tistory.com
H2 데이터베이스 설치
h2 데이터베이스는 개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면을 제공한다.
version : 1.4.200
+) 현재 사용하는 스프링부트 버전과 맞는 h2 버전은 스프링 매뉴얼을 참고하면 된다.
https://gksdudrb922.tistory.com/110
[Spring] 스프링 부트, 라이브러리 버전 맞추기
현재 사용하는 스프링 부트에서 새로운 라이브러리를 implement 하고 싶을 때, 부트 버전에 맞는 라이브러리 버전을 설치해줘야 정상 동작한다. 스프링 부트에 맞는 라이브러리 버전을 확인하는
gksdudrb922.tistory.com
다운로드 및 설치 방법
H2 데이터베이스 설치
H2 데이터베이스는 개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면을 제공한다. 현재 1.4.200 버전(2019 -10-14)을 사용한다. 다운로드 및 설치 다운로드 링크 https://www.h2database.com 윈도우 유저는 Win
gksdudrb922.tistory.com
JPA와 DB 설정, 동작확인
gradle project에서 먼저 application 파일을 작성해야 한다. 여기서는 application.yml을 사용한다.
<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
datasource
데이터베이스를 연결하는 부분이다. 앞서 설치한 H2 데이터베이스의 정보를 작성하면 된다.
jpa
ddl-auto: create -> 애플리케이션 실행 시점에 테이블을 drop하고, 다시 생성한다.
show_sql -> 콘솔에 하이버네이트 실행 SQL을 남긴다.
format_sql -> SQL을 남길 때 정리된 format으로 남긴다.
logging
org.hibernate.SQL: debug -> logger를 통해 하이버네이트 실행 SQL을 남긴다. 결국 실무에서는 SQL을 로거로 찍어야 하므로 여기서는 jpa 옵션인 show_sql이 아닌 hibernate.SQL 옵션을 사용하겠다.
org.hibernate.type: trace -> SQL 실행 파라미터를 로그로 남긴다.
+) 외부 라이브러리를 사용해서 실행 파라미터를 더 상세히 확인할 수 있다.
https://github.com/gavlyukovskiy/spring-boot-data-source-decorator
여기서는 P6Spy를 사용한다. 스프링 부트를 사용하면 build.gradle에 이 라이브러리만 추가하면 된다.
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:[$version]'
외부 라이브러리의 경우 기존 라이브러리들과 다르게 버전 표시를 해 주어야 한다.
라이브러리를 추가 했다면 실행 파라미터를 로그로 확인할 수 있다. 예를 들어, insert 쿼리에서 '?' 로 표시되어 있어 어떤 값이 저장되는 지 알 수 없을 때, 아래와 같이 해당 값을 확인할 수 있다.
+) 쿼리 파라미터를 로그로 남기는 외부 라이브러리는 시스템 자원을 사용하므로, 개발 단계에서는 편하게 사용해도 된다. 하지만 운영시스템에 적용하려면 꼭 성능테스트를 하고 사용하는 것이 좋다.
간단한 스프링부트 테스트를 수행해 본다. (테스트는 JUnit4를 사용한다)
<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 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);
}
}
- 테스트는 항상 트랜잭션 안에서 수행되어야 한다. 만약 테스트에서 @Transactional이 있다면 테스트 종료 전 DB 값들을 롤백해주기 때문에 실제 DB에 값이 남지는 않는다.
- 롤백을 하고싶지 않다면 @Rollback(false)를 추가하면 테스트가 끝났을 때, DB에 값이 남아 있다.
- assertion에서 isEqualTo는 기본적으로 '==' 비교를 사용한다. 위 예시에서 회원을 find할 때 영속성 컨텍스트에서 조회하기 때문에 기본키가 같다면 같은 객체로 취급한다. (DB에서 직접 조회하는 경우 다른 객체로 취급한다)
+) 실행 창에서 스프링부트 실행하기
만약 git bash를 사용한다면 프로젝트 폴더에서 -> ./gradlew build -> cd build/libs -> java -jar [file] (file은 libs 폴더 안에 .jar 파일을 말한다)
'java > jpa' 카테고리의 다른 글
[JPA] 애플리케이션 구현 준비 (0) | 2021.02.11 |
---|---|
[JPA] 도메인 분석 설계 (0) | 2021.02.11 |
[JPA] 객체지향 쿼리 언어2 - 중급 문법 (0) | 2021.02.08 |
[JPA] 객체지향 쿼리 언어1 - 기본 문법 (0) | 2021.02.03 |
[JPA] 값 타입 (0) | 2021.02.02 |