본문 바로가기
Backend 개발자/Springboot

Intellij Springboot build.gradle 설정 및 Application.yml H2 DB 구성하기 , 사전과제 시작하기 챕터2

by by 앵과장 2023. 3. 29.
반응형

사전과제 시작하기 챕터1 에서는 

Github Repository 생성 및 Local 맥북 git Sync 맞추는 작업 Intellij 설정까지 알아보았습니다.

 

챕터1 을 안보셨다면 아래 내용부터 시작해주세요

 

프로젝트 생성 github 생성부터 SpringStart(start.spring.io) 사전과제 선행조건 만들기, 사전과제 시작하

많은 기업에서 개발자를 뽑을때 코딩테스트 + 사전과제 전형을 진행하게됩니다. 그래서 사전과제를 시작하기 위해서 필요한 선행조건인 Github 생성부터 Springboot 시작하기 위한 https://start.spring.io

angryfullstack.tistory.com

 

챕터2에서는 많은 개발자들이 가장 삽질을 많이 하게되는 build.gradle 파일과 Application.yml 그리고 

자주사용해보지 않아서 할때마다 어색한 H2 DB설정까지 진행하겠습니다.

 

Intellij Java버전 설정하기

많은 개발자분들이 intellij 에서 Java 설정을 잘못해서 지속적으로 보는 오류가 존재합니다.

바로 java 버전을 잘못설정해서 버전이 안맞는다는내용에 오류를 보게됩니다.

 

1. File > Project Structure 선택

Start Spring io 에서 선택한 Java 버전이 11인데 Intellij 에서 이렇게 특정 버전으로 되어있는경우

jdk 컴파일 관련오류를 지속적으로 볼수가 있게됩니다.

오류가 발생하지 않을수있지만 다양한 라이브러리와 application.yml 설정하고 진행하다보면 어느순간 오류가나고있는 프로젝트를 볼수 있기때문에 되도록이면 내가 진행하고자하는 jdk 버전을 잘설정해주시기 바랍니다.

 

2.Project Settings > Project > SDK 버전 설정

project SDK 버전, Project language level 버전을 맞춰주시면됩니다.

Project Settings > Platform Settings > SDKs > sdk 버전 설정

4. Gradle > Reload All Gradle Projects 클릭

5. Gradle > build > clean 진행후  build 까지

6. File > Invalidate Caches 

그래도 잘안된다면 위에 Caches 초기화 해보세요

그래도 안된다면 Intellij 를 꺼따켜보거나 컴퓨터 재부팅해보세요

 

저위에 이것저것 해보고 application bootRun 되었나요 ?

추가적인 Application.yml 없이 bootRun 하시면 

INFO 레벨로 표기된것처럼 8080 기본포트로 시작된 Springboot 정보확인이 가능합니다.

http://localhost:8080/

URI로 접근했는데 이렇게뜨면 정상구동된것이며 추가적인 Swagger, Rest Doc 작업전까지는 아래처럼 뜨면 정상입니다.

Application.yml, build.gradle  설정하기

1. application.yml 파일생성

start.spring.io 로 시작하게되면 application.properties 기본으로 구성되기때문에 yml로 변경이 필요합니다.

 

Application.yml

jpa, datasource, h2, logging 에 필요한 설정만 기본적으로 진행하고

추가적인 설정은 기능구현하면서 추가하시면됩니다.

spring:
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: create-drop
    properties:
      dialect: org.hibernate.dialect.H2Dialect
      hibernate:
        format_sql: true
        show_sql: false
    database-platform: org.hibernate.dialect.H2Dialect
    defer-datasource-initialization: true
    open-in-view: false

  datasource:
    jdbc-url: jdbc:h2:~/h2db/blog;MODE=MySQL;
    driver-class-name: org.h2.Driver
    hikari:
      maximum-pool-size: 30             # (default : 10)최대 pool size,
                                        # "Connection is not available, request timed out after ${connection-timeout}ms" 오류 밸상되면 pool locking(deadlock)상태임,
                                        # HikariCP max pool size 공식 => T * (C - 1) + 1,
                                        # T = CPU코어 개수(현재 하나의 커넥션에서 처리되는 Thead개수),
                                        # C = 하나의 트랜젝션에서 최대 사용될 커넥션 개수
                                        # ex> cpu 물리 코어 개수 = 5, 트랜게션당 최대 커넥션수 = 3 ==> 5 * (3 - 1) + 1 = 11
      connection-timeout: 30000         # (default : 30_000) client가 pool에 connection을 기다리는 최대 시간
      minimum-idle: 10                  # (default : maximum-pool-size와 동일) pool에 유지할 최소 connection 개수(최적의 응답시간을 위해서는 0으로 설정)
      idle-timeout: 600000              # (default : 600_000, 최소값 : 10_000ms) pool에서 유휴상태로 유지 될수 있는 최대 시간, (minimum-idle값이 maximum-pool-size보다 작게 설정된 경우에만 작동함)
      max-lifetime: 1800000             # (default : 1_800_000, 최소값 : 30_000ms) 최대 connection 유지 시간, 이 설정값이 지난 connection은 제거됨
                                        # "possibly consider using a shorter maxLifeTime value"오류가 발생되면 이 값을 DB의 대기(MySQL의 경우 wait_timeout(default: 28_800/8h)) 시간보다 2~3초 짧게 잡으면 됨

  h2:
    console:
      path: /h2
      enabled: true

logging:
  level:
    root: WARN
    com.github.antksk: INFO

 

build.gradle

Rest Doc 설정 정보 및 Web Application 에 필요한 dependencies 정보를 추가하였습니다

Springboot 버전, asciidoctor.jvm.convert 버전정보만 유념해서 설정하면 큰무리없이 진행가능합니다.

plugins {
	id 'java'
	id 'org.springframework.boot' version '2.7.10'
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'
	id "org.asciidoctor.jvm.convert" version "3.3.2"
}

group = 'com.github.blog'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
	mavenCentral()
}

configurations {
	asciidoctorExtensions
	compileOnly {
		extendsFrom annotationProcessor
	}
}

ext {
	set('snippetsDir', file("build/generated-snippets"))
	set('springCloudVersion', "2021.0.6")
}

dependencyManagement {
	imports {
		mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
	}
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-actuator'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

	implementation 'org.springframework.boot:spring-boot-starter-hateoas'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	
	implementation 'org.hibernate:hibernate-validator:8.0.0.Final'

	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.h2database:h2'

	annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
	annotationProcessor 'org.projectlombok:lombok'


	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	asciidoctorExtensions 'org.springframework.restdocs:spring-restdocs-asciidoctor'
	testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc'
	testCompileOnly 'org.projectlombok:lombok'
	testAnnotationProcessor 'org.projectlombok:lombok'
}


test {
	outputs.dir snippetsDir
	useJUnitPlatform()
}

asciidoctor { // asciidoctor 작업 구성
	dependsOn test // test 작업 이후에 작동하도록 하는 설정
	configurations 'asciidoctorExtensions' // 위에서 작성한 configuration 적용
	inputs.dir snippetsDir // snippetsDir 를 입력으로 구성

	sources{
		include("**/index.adoc","**/common/*.adoc")
	}

	baseDirFollowsSourceFile()
}

asciidoctor.doFirst {
	delete file('src/main/resources/static/docs')
}

task copyDocument(type: Copy) {
	dependsOn asciidoctor
	from file("build/docs/asciidoc")
	into file("src/main/resources/static/docs")
}

build {
	dependsOn copyDocument
}

tasks {

	bootJar {
		archiveClassifier = ''
		archiveFileName = "blog.${archiveExtension.get()}"
		enabled = true

		dependsOn copyDocument    // (10-1)
		from ("${asciidoctor.outputDir}") {  // (10-2)
			into 'static/docs'     // (10-3)
		}
	}
}

 

Github 프로젝트 샘플은 아래 링크에 추가하였습니다.

진행하면서 막히시면 제가 만든 프로젝트를 Fork 떠서 프로젝트 설정후에 참고하면서 진행하시면 도움이 됩니다.

https://github.com/lswteen/blogsearch

 

GitHub - lswteen/blogsearch: blogsearch

blogsearch. Contribute to lswteen/blogsearch development by creating an account on GitHub.

github.com

H2 database 설정하기

1.intellij 우측에 Database > Data Source > H2 선택

2. H2 설정하기

Remote, In-memory, Embedded 3가지 설정이 가능합니다.

Embedded 의 경우에는 Local PC에 특정경로로 저장하면 파일로 만들어집니다.

~/h2db/blog.mv.db 해당경로에 파일은 blog.mv.db로 저장됩니다. ~/ 같은경우 mac에서는 최상위 Root 경로입니다.

 

과제같은경우 검토하는 입장에서는 in-memory 형태로 구성하는것이 추가적인 설정없이 동작 확인가능하기 때문에 과제제출용으로는 In-memory 로 진행하시는것을 추천드립니다.

추가적인 User, Password 설정안하고도 사용가능하고 Test Connection 클릭시 이렇게 Succeeded 가 뜨면 성공입니다.

H2 사용 안해보셨다면 생각보다 삽질을 하게됩니다. 

물리적으로 이렇게 생성되었는지 확인 해보면됩니다.

application.yml 에 

h2 설정해두시면 아래처럼 기본 포트 경로 접근이가능합니다. application.yml에 설정이 필요하고 yml문법에 잘맞춰서 설정하시면됩니다.

이제 사전과제를 작업할 기본적인 Springboot bootRun 그리고 H2 db까지 진행가능하게 확인하였습니다.

 

챕터3에서는 Rest Doc 만들고 기본적인 Spring MVC 작업까지 진행해보도록 하겠습니다.