스프링 부트 첫걸음 — 환경 설정

Spring boot를 활용하여 프로젝트 생성부터 API 개발을 위한 가장 기초적이고 필수적인 내용을 담고 있습니다. 간략한 코드 예제를 통하여 스프링 부트로 개발하는데 도움을 얻으셨으면 좋겠습니다. 포스팅은 환경설정API 개발 두편으로 나뉩니다.

1. 프로젝트 환경설정

Spring Initializer 를 활용하면 초기 환경설정을 한번에 쉽게 해결할 수 있습니다.

버전과 언어는 선호에 맞게 선택하면 되지만 무난하게 선택을 하였습니다 (21년 10월 기준)

# 좌측에서는 아래와 같이 설정하여 줍니다.
Project: Gradle
Language: Java
Boot: 2.4.12
Packaging: Jar
Java: 11
# 우측에서는 아래 의존성 라이브러리인 Dependencies를 추가해줍니다.
Spring Web
Spring Data Jpa
Lombok
Validation
Thymeleaf (선택사항, API만 개발한다면 제외합니다)

Generate하여 파일을 다운로드 받고 Intelij에서 build.gradle 파일을 Open하면 Intelij에서 자동으로 의존성 패키지들 프로젝트에 다운로드 해줍니다.

기본 테스트 유닛이 Junit5 지만 Junit4를 사용하고 싶다면 build.gradle 파일에 dependencies 안에 아래 코드를 추가해주세요.

testImplementation("org.junit.vintage:junit-vintage-engine") {
exclude group: "org.hamcrest", module: "hamcrest-core"
}

위에 설정만으로도 충분하지만 개발편의를 위하여 IDE설정을 해줍니다.

2. IDE 설정

(1) Lombok
이제는 필수라고 할 수 있는 개발 편의성을 높여주는 lombok plugin을 설치해줍니다. 그리고 롬복 어노테이션 라이브러리가 컴파일시 문제가 되지 않도록 선택하여 줍니다. Build > Compiler > Annotation Processors > Enable

annotation processing

(2) 프로젝트 빌드 설정 변경
Java 프로젝트 빌드 속도를 높이기 위하여 빌드설정을 gradle에서 intelij로 변경하여 줍니다.
Preferences > Build Execution, Deployment > Build Tools > Gradle

build and run using

3. H2 데이터베이스 설치

개발과 테스트를 위한 H2 데이터베이스를 설치합니다.

(1) 데이터베이스 다운로드

https://www.h2database.com/html/main.html

(2) H2 데이터베이스 생성

다운로드 받은 폴더로 이동합니다. 폴더경로/bin/h2.sh 를 실행하면 h2db콘솔 화면이 오픈됩니다.

> cd ~/Downloads/h2
> cd bin
> ./h2.sh
h2/bin 하위로 이동

(3) 데이터베이스 생성

오픈된 콘솔에서 JDBC URL에 jdbc:h2:~/{데이터베이스명} 으로 지정하면 홈디렉토리에 {데이터베이스명}.mv.db파일이 생성됩니다.

(4) 스프링 프로젝트에 H2 데이터베이스 설정

데이터베이스 생성 이후 스프링 프로젝트의 src/main/resources/application.yml 에는 다음과 같이 DB설정 URL로 변경해줍니다.

spring:
datasource:
url: jdbc:h2:tcp://localhost/~/{데이터베이스명}
username: sa
password:
driver-class-name: org.h2.Driver

(5) DB 설정 옵션

spring:
jpa:
show-sql: true
database-platform: H2
hibernate:
ddl-auto: create
# ddl-auto: create
# 어플리케이션 실행시점에 테이블을 drop하고 생성합니다.
# 로컬환경을 제외한 Production이나 공용개발 환경에서는
# 반드시 spring.jpa.hibernate.ddl-auto:none 으로 꺼주세요.
# show-sql: true
# System.out에 하이버네이트 실행쿼리를 출력할 수 있습니다.
logging.level:
org.hibernate.SQL: debug
# logger에 하이버네이트 실행쿼리를 남길 수 있습니다.

(6) 쿼리 파라미터 로그 남기기

외부 라이브러리를 사용하면 물음표로 남는 쿼리에 실제 값이 바인딩되어 System.out 출력됩니다. 단, 성능에 부하가 될 수 있으니 Production에서는 성능 부하 테스트 후 적용하는 것이 좋습니다.

스프링 부트가 대부분의 라이브러리의 버전정보를 내부적으로 세팅해주기 때문에 명시적인 버전을 명시할 필요가 없지만 외부라이브러리의 경우 자동으로 세팅하지 못하기 때문에 버전을 명시해주어야합니다.

implementation("com.github.gavlyukovskiy:p6spy-spring-boot-starter:${version}"

4. 환경 설정중 생기는 흔한 에러 케이스

(1) EntityManager가 Transactional 안에서 수행되지 않았기 때문에 에러가 발생

# 에러
org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call;
# 해결 방법
@Transactional 어노테이션을 코드블록에 추가해준다.

(2) Junit5부터는 build.gradle에 테스트코드 인식을 위하여 useJUnitPlatform 추가

# 에러
No tests found for given includes: [jpabook.jpashop.MemberRepositoryTest] (filter.includeTestsMatching)
# 해결 방법
아래 내용을 build.gradle에 추가해준다.
test {
useJUnitPlatform()
}

(3) Entity class에 테이블명이 없거나 테이블 등록중 테이블 시퀀스가 없어 에러발생

# 에러
Sequence "HIBERNATE_SEQUENCE" not found;
# 해결 방법
Id 필드의 GeneratedValue의 stragegy를 IDENTITY로 변경해준다
@GeneratedValue(strategy = GenerationType.IDENTITY)

5. 빌드된 Jar 실행

> cd {프로젝트 경로}
> ./gradlew clean build // 기존 파일 지우고 새롭게 빌드
> cd ./build/libs
> jar -jar {생성된 jar파일명}.jar

참고 출처

해당 내용은 인프런 “실전! 스프링 부트와 JPA 활용1 — 웹 애플리케이션 개발”을 수강하며 정리한 내용입니다

Blog https://chrisjune.dev Work for www.29cm.co.kr