Spring Boot + JPA + H2 Application 간단하게 띄우기
1. 프로젝트 만들기
1.1 spring initializr을 통해 프로젝트 뼈대 만들기
-https://start.spring.io/ 에서 손쉽게 dependency 가 추가된 프로젝트 틀을 만들수 있다.
2. 애플리케이션 기본 설정
- 아래와 같이 @SpringBootApplication만 붙이면 바로 Application을 구동시킬수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13
@SpringBootApplication(scanBasePackageClasses = {RootConfig.class}) public class Application extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication app = new SpringApplication(Application.class); app.addListeners(new ApplicationPidFileWriter()); app.run(args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } }
- 하지만 일반적으로 만들고자 하는 웹 애플리케이션을 만들려면 추가적인 설정들이 필요한데 필자는 scanBasePackageClasses 속성을 이용해서 RootConfig Configuration class를 만들고 이를 기준으로 처리하도록 하였다.
1
2
3
4
@Configuration
@ComponentScan(basePackageClasses = ApplicationPackageRoot.class)
public class RootConfig {
}
- 여기서 특정 패키지 루트 하위에 있는 모든 bean 컴포넌트들을 스캔시키기 위해 최상단에 ApplicationPackageRoot 라는 inteface를 만들고 이 패키지 위치를 기준으로 @ComponentScan 처리하도록 했음.
참고로 @Configuration annotation을 사용하면 우리가 일반적으로 AutoConfigration을 위해 사용하는 @Enable{XXX} 류의 설정용 Bean을 생성하여 사용할 수 있다.
- 이런식으로 프로젝트 구조를 잡고 설정을 했을떄 패키지 구조를 살펴보면 다음과 같다.
3. Web MVC Configuration
- 먼저 dependency를 추가하자.
1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- EnableWebMvc를 통해 기본적인 mvc 설정은 모두 커버가 된다. 자세한 내용이 알고 싶다면 DelegatingWebMvcConfiguration.class 파일을 참조하도록 하자
1
2
3
4
5
6
7
8
9
10
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/bundle/**")
.addResourceLocations("/static/bundle/").setCachePeriod(3600)
.resourceChain(true).addResolver(new PathResourceResolver());
}
}
4. JSP Configration
- jsp를 사용하려면 일단 pom.xml에 dependancy를 추가해주어야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- jsp -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
- 위 디펜던시를 추가하지 않으면 jsp 파일을 찾을수 없다고 404 Page Not Found를 맞이할 수 있을 것이다.
- 그리고 템플릿 엔진으로 jsp를 사용하기 위해 필자가 추가로 한 부분은 internalResourceViewResolver Bean을 추가한 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
@Configuration @EnableWebMvc public class WebMvcConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/bundle/**") .addResourceLocations("/static/bundle/").setCachePeriod(3600) .resourceChain(true).addResolver(new PathResourceResolver()); } @Bean public ViewResolver internalResourceViewResolver() { final InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/templates/"); viewResolver.setSuffix(".jsp"); return viewResolver; } }
- 이를 통해 jsp web 페이지를 랜더링할 수 있다. 여기서 이런 방식 말고 다른 방법으로 처리할수도 있는데 그 방법은 application.yml 파일에 설정을 추가해주는 것이다.
1 2 3 4 5
spring: mvc: view: prefix: /WEB-INF/templates/ suffix: .jsp
5. JPA Configration
5.1 DataSource
- 실제 웹 애플리케이션을 운영하는 것이 아니라 샘플 프로젝트를 만들고 연습하기에 가장 쉬운 방법은 H2 in memory DB를 사용하는 것일 것이다. 이를 사용하기란 매우 간단하다.
- 먼저 h2 dependency를 pom.xml에 추가한다.
1
2
3
4
5
6
<!-- db -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
- PersistenceConfigration에서 DataSource Bean을 정의한다.
1 2 3 4 5
@Bean public DataSource dataSource() { EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); return builder.setType(EmbeddedDatabaseType.H2).build(); }
- 이제 H2를 사용할 준비는 끝났다. 이제 다음으로 넘어가서 JPA 설정을 해보자
5.2 JPA
- 여기서 JPA라고 이야기했지만, 실제로는 JPA 구현체 중에서 유명한 것 중 하나인 hibernate를 사용할 것이다.
- 이를 사용하기 위해서는 먼저 dependency를 추가해주어야 한다.
1
2
3
4
5
6
7
8
9
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.4.14.Final</version>
</dependency>
- 그리고 이와 관련된 configuration 값들을 정의해준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
spring: datasource: driver-class-name: org.h2.Driver url: jdbc:h2:mem:test;DB_CLOSE_DELAY=-1 username: password: h2: console: enabled: true path: /h2 jpa: database-platform: org.hibernate.dialect.H2Dialect database: H2 generate-ddl: false open-in-view: false show-sql: true hibernate: ddl-auto: create naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl properties: hibernate: format_sql: true use_sql_comments: true cache.use_second_level_cache: true cache.use_query_cache: false generate_statistics: true cache.region.factory_class: org.hibernate.cache.ehcache.EhCacheRegionFactory
- 이 외에도 hibernate 설정은 아주 다양하게 많이 있을텐데, 자세한 것은 공식 문서를 참조하도록 하자. ( https://hibernate.org/orm/documentation/5.4/ )
사실 위에서 가장 중요한 부분은 “hibernate.ddl-auto” 설정 값인데 이 값은 만약 실제 서비스에서 사용하고자 한다면 “validate” 정도의 설정값을 사용하는게 좋다. 하지만 예제에서는 인메모리 DB를 사용하는 특성상 create를 사용한것이니 참고하자.
- application.yml에 설정값을 넣어두었다면 이제 Java Configration 을 정의해보자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
@Configuration @EnableJpaRepositories(basePackages = "com.sungsu.boilerplate.app") @EnableTransactionManagement public class PersistenceConfig { @Bean public DataSource dataSource() { EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); return builder.setType(EmbeddedDatabaseType.H2).build(); } @Bean public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { JpaTransactionManager txManager = new JpaTransactionManager(); txManager.setEntityManagerFactory(entityManagerFactory); return txManager; } }
- @EnableJpaRepositories의 basePackages 하위에 있는 @Entity 와 @Repository를 자동 등록이 된다.
- EnableJpaRepositories를 보면 default로 “transactionManager” 를 사용하기 때문에 PlatformTransactionManager Type의 클래스로 bean 등록을 해주면 된다.
- 이렇게 하면 H2 + JPA application이 완성되었다.
Result
console
web
Comment
- 작성된 내용 중 혹시 제가 잘못 알고 있는 내용이 있다면 언제든지 코멘트 부탁드립니다.
- 이 포스팅을 쓰면서 만든 샘플코드는 github에 올려두었다. 혹시 신규 프로젝트를 시작하고자할떄 필요하다면 언제든지 사용하셔도 됩니다.
Comments powered by Disqus.