Spring Boot 소개
최범균, 2014-12-22
웹 어플 만들때 필요한 것들 예시
•  Maven
•  Spring MVC
•  JPA + Spring Data
•  JSP
•  MySQL
•  Tomcat이나 Jetty로 테스트
•  SLF4J + Logback
•  JUnit, Spring Test
2	
  
Boot 이전의 설정: 메이븐
<dependencies>	
  
	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>javax.servlet.jsp</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>jsp-­‐api</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <version>2.2</version>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <scope>provided</scope>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>javax.servlet</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>javax.servlet-­‐api</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <version>3.0.1</version>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <scope>provided</scope>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>javax.servlet</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>jstl</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <version>1.2</version>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.springframework</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>spring-­‐webmvc</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <version>${spring.version}</version>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.springframework</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>spring-­‐orm</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <version>${spring.version}</version>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.hibernate</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>hibernate-­‐en:tymanager</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <version>4.3.7.Final</version>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.springframework.data</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>spring-­‐data-­‐jpa</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <version>1.7.0.RELEASE</version>	
  
	
  	
  	
  	
  </dependency>	
  
	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>com.mchange</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>c3p0</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <version>0.9.2.1</version>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>mysql</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>mysql-­‐connector-­‐java</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <version>5.1.30</version>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.springframework</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>spring-­‐core</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <version>${spring.version}</version>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <exclusions>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <exclusion>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <groupId>commons-­‐logging</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>commons-­‐logging</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  </exclusion>	
  
	
  	
  	
  	
  	
  	
  	
  	
  </exclusions>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.slf4j</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>jcl-­‐over-­‐slf4j</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <version>1.7.7</version>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>ch.qos.logback</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>logback-­‐classic</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <version>1.1.2</version>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>junit</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>junit</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <version>4.12</version>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <scope>test</scope>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.springframework</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>spring-­‐test</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <version>${spring.version}</version>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <scope>test</scope>	
  
	
  	
  	
  	
  </dependency>	
  
</dependencies>	
  
<build>	
  
	
  	
  	
  	
  <plugins>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <plugin>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>maven-­‐compiler-­‐plugin</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <version>3.1</version>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <configura:on>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <source>1.8</source>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <target>1.8</target>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <encoding>uU-­‐8</encoding>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  </configura:on>	
  
	
  	
  	
  	
  	
  	
  	
  	
  </plugin>	
  
	
  
	
  	
  	
  	
  	
  	
  	
  	
  <plugin>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.eclipse.jeVy</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>jeVy-­‐maven-­‐plugin</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <version>9.2.6.v20141205</version>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <configura:on>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <webApp>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <contextPath>/</contextPath>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  </webApp>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <scanIntervalSeconds>3</scanIntervalSeconds>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  </configura:on>	
  
	
  	
  	
  	
  	
  	
  	
  	
  </plugin>	
  
	
  
	
  	
  	
  	
  </plugins>	
  
</build>	
  
3	
  
Boot 이전의 설정: 스프링
@EnableJpaRepositories(basePackages	
  =	
  "domain")	
  
@EnableWebMvc	
  
@EnableTransac:onManagement	
  
@ComponentScan(basePackages	
  =	
  "controller")	
  
public	
  class	
  Config	
  extends	
  WebMvcConfigurerAdapter	
  {	
  
	
  	
  	
  	
  @Override	
  
	
  	
  	
  	
  public	
  void	
  configureDefaultServletHandling(DefaultServletHandlerConfigurer	
  configurer)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  configurer.enable();	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  @Override	
  
	
  	
  	
  	
  public	
  void	
  configureViewResolvers(ViewResolverRegistry	
  registry)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  registry.jsp().prefix("/WEB-­‐INF/view/");	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  @Bean	
  
	
  	
  	
  	
  public	
  LocalContainerEn:tyManagerFactoryBean	
  en:tyManagerFactory()	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  LocalContainerEn:tyManagerFactoryBean	
  emf	
  =	
  new	
  LocalContainerEn:tyManagerFactoryBean();	
  
	
  	
  	
  	
  	
  	
  	
  	
  emf.setPackagesToScan("domain");	
  
	
  	
  	
  	
  	
  	
  	
  	
  emf.setDataSource(dataSource());	
  
	
  	
  	
  	
  	
  	
  	
  	
  HibernateJpaVendorAdapter	
  adapter	
  =	
  new	
  HibernateJpaVendorAdapter();	
  
	
  	
  	
  	
  	
  	
  	
  	
  adapter.setDatabase(Database.MYSQL);	
  
	
  	
  	
  	
  	
  	
  	
  	
  adapter.setShowSql(true);	
  
	
  	
  	
  	
  	
  	
  	
  	
  emf.setJpaVendorAdapter(adapter);	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  emf;	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  @Bean	
  
	
  	
  	
  	
  public	
  DataSource	
  dataSource()	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  ComboPooledDataSource	
  ds	
  =	
  new	
  ComboPooledDataSource();	
  
	
  	
  	
  	
  	
  	
  	
  	
  try	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ds.setDriverClass("com.mysql.jdbc.Driver");	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  catch	
  (PropertyVetoExcep:on	
  e)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  throw	
  new	
  Run:meExcep:on(e);	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  ds.setJdbcUrl("jdbc:mysql://localhost/test?characterEncoding=uU8");	
  
	
  	
  	
  	
  	
  	
  	
  	
  ds.setUser("root");	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  ds;	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  @Bean	
  
	
  	
  	
  	
  public	
  PlaUormTransac:onManager	
  transac:onManager(En:tyManagerFactory	
  emf)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  JpaTransac:onManager	
  tm	
  =	
  new	
  JpaTransac:onManager();	
  
	
  	
  	
  	
  	
  	
  	
  	
  tm.setEn:tyManagerFactory(emf);	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  tm;	
  
	
  	
  	
  	
  }	
  
}	
  
4	
  
Boot 이전의 설정: web.xml
<?xml	
  version="1.0"	
  encoding="UTF-­‐8"?>	
  
<web-­‐app	
  xmlns:xsi="hVp://www.w3.org/2001/XMLSchema-­‐instance"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  xmlns="hVp://java.sun.com/xml/ns/javaee"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  xsi:schemaLoca:on="hVp://java.sun.com/xml/ns/javaee	
  
	
  	
  	
  	
  	
  	
  hVp://java.sun.com/xml/ns/javaee/web-­‐app_3_0.xsd"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  version="3.0">	
  
	
  
	
  	
  	
  	
  <servlet>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <servlet-­‐name>dispatcher</servlet-­‐name>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <servlet-­‐class>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  org.springframework.web.servlet.DispatcherServlet	
  
	
  	
  	
  	
  	
  	
  	
  	
  </servlet-­‐class>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <init-­‐param>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <param-­‐name>contextClass</param-­‐name>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <param-­‐value>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  org.springframework.web.context.support.Annota:onConfigWebApplica:onContext	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  </param-­‐value>	
  
	
  	
  	
  	
  	
  	
  	
  	
  </init-­‐param>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <init-­‐param>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <param-­‐name>contextConfigLoca:on</param-­‐name>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <param-­‐value>config.Config</param-­‐value>	
  
	
  	
  	
  	
  	
  	
  	
  	
  </init-­‐param>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <load-­‐on-­‐startup>1</load-­‐on-­‐startup>	
  
	
  	
  	
  	
  </servlet>	
  
	
  
	
  	
  	
  	
  <servlet-­‐mapping>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <servlet-­‐name>dispatcher</servlet-­‐name>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <url-­‐paVern>/</url-­‐paVern>	
  
	
  	
  	
  	
  </servlet-­‐mapping>	
  
	
  
	
  	
  	
  	
  <filter>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <filter-­‐name>encodingFilter</filter-­‐name>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <filter-­‐class>org.springframework.web.filter.CharacterEncodingFilter</filter-­‐class>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <init-­‐param>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <param-­‐name>encoding</param-­‐name>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <param-­‐value>UTF-­‐8</param-­‐value>	
  
	
  	
  	
  	
  	
  	
  	
  	
  </init-­‐param>	
  
	
  	
  	
  	
  </filter>	
  
	
  	
  	
  	
  <filter-­‐mapping>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <filter-­‐name>encodingFilter</filter-­‐name>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <url-­‐paVern>/*</url-­‐paVern>	
  
	
  	
  	
  	
  </filter-­‐mapping>	
  
	
  
</web-­‐app>	
   5	
  
프로젝트 설정 작업
•  따분하고 지루하고 실수하기 딱 좋은 과정
– 의존 모듈 간 버전 맞추기
– (다른 소스에서) 설정 C&P하고 수정
– 잘 되나 테스트
– 빌드와 실행
6	
  
Boot
•  최소한의 노력으로 스프링 기반 프로젝트를
시작할 수 있도록 도와줌
– 스프링 및 연동 기술의 표준화된 버전 설정
– 설정 최소화 : 기술별 표준화된 설정 모음 제공
– 임베디드 서버, 보안, 모니터링 구현 지원
7	
  
Boot 이후: 설정
<parent>	
  
	
  	
  	
  	
  <groupId>org.springframework.boot</groupId>	
  
	
  	
  	
  	
  <ar:factId>spring-­‐boot-­‐starter-­‐parent</ar:factId>	
  
	
  	
  	
  	
  <version>1.2.0.RELEASE</version>	
  
</parent>	
  
<dependencies>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.springframework.boot</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>spring-­‐boot-­‐starter-­‐web</ar:factId>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.springframework.boot</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>spring-­‐boot-­‐starter-­‐data-­‐jpa</ar:factId>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.springframework.boot</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>spring-­‐boot-­‐starter-­‐test</ar:factId>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>mysql</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>mysql-­‐connector-­‐java</ar:factId>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>javax.servlet</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>jstl</ar:factId>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.springframework.boot</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>spring-­‐boot-­‐starter-­‐tomcat</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <scope>provided</scope>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.apache.tomcat.embed</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>tomcat-­‐embed-­‐jasper</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <scope>provided</scope>	
  
	
  	
  	
  	
  </dependency>	
  
</dependencies>	
  
<build>	
  
	
  	
  	
  	
  <plugins>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <plugin>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.springframework.boot</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>spring-­‐boot-­‐maven-­‐plugin</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  </plugin>	
  
	
  	
  	
  	
  </plugins>	
  
</build>	
  
@SpringBootApplica:on	
  
public	
  class	
  Applica:on	
  {	
  
	
  
	
  	
  	
  	
  public	
  sta:c	
  void	
  main(String[]	
  args)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  SpringApplica:on.run(Applica:on.class,	
  args);	
  
	
  	
  	
  	
  }	
  
	
  
}	
  
spring.view.prefix:	
  /WEB-­‐INF/view/	
  
spring.view.suffix:	
  .jsp	
  
	
  
spring.datasource.url=jdbc:mysql://localhost/test?characterEncoding=uU8	
  
spring.datasource.username=root	
  
spring.datasource.password=	
  
spring.datasource.driver=com.mysql.jdbc.Driver	
  
	
  
spring.jpa.database=MYSQL	
  
8	
  
이전과 이후 비교
9	
  
Boot가 해 준 것 1, 모듈 설정
<parent>	
  
	
  	
  	
  	
  <groupId>org.springframework.boot</groupId>	
  
	
  	
  	
  	
  <ar:factId>spring-­‐boot-­‐starter-­‐parent</ar:factId>	
  
	
  	
  	
  	
  <version>1.2.0.RELEASE</version>	
  
</parent>	
  
	
  
<dependencies>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.springframework.boot</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>spring-­‐boot-­‐starter-­‐web</ar:factId>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.springframework.boot</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>spring-­‐boot-­‐starter-­‐data-­‐jpa</ar:factId>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.springframework.boot</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>spring-­‐boot-­‐starter-­‐test</ar:factId>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.springframework.boot</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>spring-­‐boot-­‐starter-­‐tomcat</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <scope>provided</scope>	
  
	
  	
  	
  	
  </dependency>	
  
	
  	
  	
  	
  <dependency>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.apache.tomcat.embed</groupId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <ar:factId>tomcat-­‐embed-­‐jasper</ar:factId>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <scope>provided</scope>	
  
	
  	
  	
  	
  </dependency>	
  
</dependencies>	
  
표준 버전 모음	
  
spring-­‐mvc 등 웹 관련 모듈 자동 설정	
  
spring-­‐data-­‐jpa,	
  JPA,	
  Hibernate 관련 모듈 설정	
  
연관된 spring-­‐orm,	
  커넥션 풀 등 모듈 설정	
  
spring-­‐test,	
  JUnit	
  등 관련 모듈 설정	
  
임베디드 톰캣 관련 모듈 설정	
  
10	
  
모듈 구성
11	
  
Boot가 해 준 것 2, 스프링 설정
@SpringBootApplica7on	
  
public	
  class	
  Applica:on	
  {	
  
	
  
	
  	
  	
  	
  public	
  sta:c	
  void	
  main(String[]	
  args)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  SpringApplica7on.run(Applica:on.class,	
  args);	
  
	
  	
  	
  	
  }	
  
	
  
}	
  
	
  
//	
  @SpringBootApplica:on은 다음과 동일	
  
//	
  @Configura:on	
  
//	
  @EnableAutoConfigura7on	
  
//	
  @ComponentScan	
  
모든 설정 자동 생성!	
  
- 스프링 MVC	
  
-­‐	
  DataSource	
  
-­‐	
  JPA,	
  JPA	
  TX,	
  Spring	
  Data	
  JPA	
  
-­‐	
  DispatcherServlet,	
  CharacterEncodingFilter	
  
spring.view.prefix:	
  /WEB-­‐INF/view/	
  
spring.view.suffix:	
  .jsp	
  
	
  
spring.datasource.url=jdbc:mysql://localhost/test?...	
  
spring.datasource.username=root	
  
spring.datasource.password=	
  
spring.datasource.driver=com.mysql.jdbc.Driver	
  
	
  
spring.jpa.database=MYSQL	
  
JSP용 ViewResolver 설정	
  
DataSource	
  설정	
  
JPA 설정	
  
12	
  
@EnableAutoConfiguration
@EnableAutoConfigura:on	
   @JpaRepositoriesAutoConfigura:on	
  
@HibernateJpaAutoConfigura:on	
  
@EmbeddedServletContainerAutoConfigura:on	
  
@WebMvcAutoConfigura:on	
  
@DataSourceAutoConfigura:on	
  
@OOOOAutoConfigura:on	
  들	
  
각 AutoConfigura:on은 조건에 따라 기본 설정 생성	
  
13	
  
Boot가 해 준 것 3, 서버 실행
•  임베디드 톰캣으로 실행
– mvn spring-boot:run
...	
  
[INFO]	
  -­‐-­‐-­‐	
  spring-­‐boot-­‐maven-­‐plugin:1.2.0.RELEASE:run	
  (default-­‐cli)	
  @	
  bootVersion	
  -­‐-­‐-­‐	
  
...	
  
10:11:57.394	
  [app.Applica:on.main()]	
  INFO	
  	
  app.Applica:on	
  -­‐	
  Star:ng	
  Applica:on	
  on	
  MADVIRUSui-­‐MacBook-­‐Air.local	
  with	
  PID	
  15134	
  (...)	
  
...	
  
...	
  
10:11:59.947	
  [app.Applica:on.main()]	
  INFO	
  	
  o.s.b.c.e.t.TomcatEmbeddedServletContainer	
  -­‐	
  Tomcat	
  ini:alized	
  with	
  port(s):	
  8080/hVp	
  
10:12:00.219	
  [app.Applica:on.main()]	
  INFO	
  	
  o.a.catalina.core.StandardService	
  -­‐	
  Star7ng	
  service	
  Tomcat	
  
10:12:00.221	
  [app.Applica:on.main()]	
  INFO	
  	
  o.a.catalina.core.StandardEngine	
  -­‐	
  Star7ng	
  Servlet	
  Engine:	
  Apache	
  Tomcat/8.0.15	
  
...	
  
...	
  
10:12:05.708	
  [app.Applica:on.main()]	
  INFO	
  	
  o.s.b.c.e.t.TomcatEmbeddedServletContainer	
  -­‐	
  Tomcat	
  started	
  on	
  port(s):	
  8080/hIp	
  
10:12:05.712	
  [app.Applica:on.main()]	
  INFO	
  	
  app.Applica:on	
  -­‐	
  Started	
  Applica:on	
  in	
  8.702	
  seconds	
  (JVM	
  running	
  for	
  12.428)	
  
14	
  
Boot가 해 준 것 4, 실행 가능 war 생성
•  패키징한 war를 java 명령어로 실행 가능
– mvn package
– java -jar target/myapp.war
•  임베디드 톰캣으로 실행
•  생성된 war를 일반 WAS에 배포해도 됨
•  war가 아닌 jar 타입으로도 가능
15	
  
다양한 기능에 대한 자동 설정 지원
16	
  
운영지원 기능 : Actuator
•  서비스 상태(Health), 계측(Metric) 등 서비스
운영 지원을 위한 정보 제공 기능
•  다음 의존 추가로 자동 활성화
•  예, /health
<dependency>	
  
	
  	
  	
  	
  <groupId>org.springframework.boot</groupId>	
  
	
  	
  	
  	
  <ar:factId>spring-­‐boot-­‐starter-­‐actuator</ar:factId>	
  
</dependency>	
  
17	
  
Actuator가 제공하는 정보
•  env : 스프링 Environment의 프로퍼티 목록
•  health : 어플리케이션 Health 상태 정보
•  metrics : 계측 정보
•  mappings : 웹 경로 매핑 정보
•  dump : 쓰레드 덤프
•  beans : 빈 목록 정보
•  trace : 최근 HTTP 요청 목록 표시(100개)
18	
  
기타
•  Remote Shell 기능 (Telnet로 연결해서 관리)
•  기본 로깅 설정 제공
•  NoSQL 지원 (Redis, MongoDB, Solr 등)
•  WebSocket 설정 지원
•  JTA 설정 지원 (Atomikos, Bitronix)
•  Maven과 Gradle 지원
19	
  
참고자료
•  Spring Boot 프로젝트
– http://projects.spring.io/spring-boot/
•  레퍼런스 문서가 좋음
•  도서: Learning Spring Boot
– http://goo.gl/Awzzoz
•  Gradle 기반
•  현재 버전에 맞게 코드를 수정해야 할 부분이 간혹 있
지만 감을 잡기에 충분한 지식 제공
20	
  

Spring Boot 소개

  • 1.
  • 2.
    웹 어플 만들때필요한 것들 예시 •  Maven •  Spring MVC •  JPA + Spring Data •  JSP •  MySQL •  Tomcat이나 Jetty로 테스트 •  SLF4J + Logback •  JUnit, Spring Test 2  
  • 3.
    Boot 이전의 설정:메이븐 <dependencies>        <dependency>                  <groupId>javax.servlet.jsp</groupId>                  <ar:factId>jsp-­‐api</ar:factId>                  <version>2.2</version>                  <scope>provided</scope>          </dependency>          <dependency>                  <groupId>javax.servlet</groupId>                  <ar:factId>javax.servlet-­‐api</ar:factId>                  <version>3.0.1</version>                  <scope>provided</scope>          </dependency>          <dependency>                  <groupId>javax.servlet</groupId>                  <ar:factId>jstl</ar:factId>                  <version>1.2</version>          </dependency>          <dependency>                  <groupId>org.springframework</groupId>                  <ar:factId>spring-­‐webmvc</ar:factId>                  <version>${spring.version}</version>          </dependency>          <dependency>                  <groupId>org.springframework</groupId>                  <ar:factId>spring-­‐orm</ar:factId>                  <version>${spring.version}</version>          </dependency>          <dependency>                  <groupId>org.hibernate</groupId>                  <ar:factId>hibernate-­‐en:tymanager</ar:factId>                  <version>4.3.7.Final</version>          </dependency>          <dependency>                  <groupId>org.springframework.data</groupId>                  <ar:factId>spring-­‐data-­‐jpa</ar:factId>                  <version>1.7.0.RELEASE</version>          </dependency>    <dependency>                  <groupId>com.mchange</groupId>                  <ar:factId>c3p0</ar:factId>                  <version>0.9.2.1</version>          </dependency>          <dependency>                  <groupId>mysql</groupId>                  <ar:factId>mysql-­‐connector-­‐java</ar:factId>                  <version>5.1.30</version>          </dependency>          <dependency>                  <groupId>org.springframework</groupId>                  <ar:factId>spring-­‐core</ar:factId>                  <version>${spring.version}</version>                  <exclusions>                          <exclusion>                                  <groupId>commons-­‐logging</groupId>                                  <ar:factId>commons-­‐logging</ar:factId>                          </exclusion>                  </exclusions>          </dependency>          <dependency>                  <groupId>org.slf4j</groupId>                  <ar:factId>jcl-­‐over-­‐slf4j</ar:factId>                  <version>1.7.7</version>          </dependency>          <dependency>                  <groupId>ch.qos.logback</groupId>                  <ar:factId>logback-­‐classic</ar:factId>                  <version>1.1.2</version>          </dependency>          <dependency>                  <groupId>junit</groupId>                  <ar:factId>junit</ar:factId>                  <version>4.12</version>                  <scope>test</scope>          </dependency>          <dependency>                  <groupId>org.springframework</groupId>                  <ar:factId>spring-­‐test</ar:factId>                  <version>${spring.version}</version>                  <scope>test</scope>          </dependency>   </dependencies>   <build>          <plugins>                  <plugin>                          <ar:factId>maven-­‐compiler-­‐plugin</ar:factId>                          <version>3.1</version>                          <configura:on>                                  <source>1.8</source>                                  <target>1.8</target>                                  <encoding>uU-­‐8</encoding>                          </configura:on>                  </plugin>                    <plugin>                          <groupId>org.eclipse.jeVy</groupId>                          <ar:factId>jeVy-­‐maven-­‐plugin</ar:factId>                          <version>9.2.6.v20141205</version>                          <configura:on>                                  <webApp>                                          <contextPath>/</contextPath>                                  </webApp>                                  <scanIntervalSeconds>3</scanIntervalSeconds>                          </configura:on>                  </plugin>            </plugins>   </build>   3  
  • 4.
    Boot 이전의 설정:스프링 @EnableJpaRepositories(basePackages  =  "domain")   @EnableWebMvc   @EnableTransac:onManagement   @ComponentScan(basePackages  =  "controller")   public  class  Config  extends  WebMvcConfigurerAdapter  {          @Override          public  void  configureDefaultServletHandling(DefaultServletHandlerConfigurer  configurer)  {                  configurer.enable();          }          @Override          public  void  configureViewResolvers(ViewResolverRegistry  registry)  {                  registry.jsp().prefix("/WEB-­‐INF/view/");          }          @Bean          public  LocalContainerEn:tyManagerFactoryBean  en:tyManagerFactory()  {                  LocalContainerEn:tyManagerFactoryBean  emf  =  new  LocalContainerEn:tyManagerFactoryBean();                  emf.setPackagesToScan("domain");                  emf.setDataSource(dataSource());                  HibernateJpaVendorAdapter  adapter  =  new  HibernateJpaVendorAdapter();                  adapter.setDatabase(Database.MYSQL);                  adapter.setShowSql(true);                  emf.setJpaVendorAdapter(adapter);                  return  emf;          }          @Bean          public  DataSource  dataSource()  {                  ComboPooledDataSource  ds  =  new  ComboPooledDataSource();                  try  {                          ds.setDriverClass("com.mysql.jdbc.Driver");                  }  catch  (PropertyVetoExcep:on  e)  {                          throw  new  Run:meExcep:on(e);                  }                  ds.setJdbcUrl("jdbc:mysql://localhost/test?characterEncoding=uU8");                  ds.setUser("root");                  return  ds;          }          @Bean          public  PlaUormTransac:onManager  transac:onManager(En:tyManagerFactory  emf)  {                  JpaTransac:onManager  tm  =  new  JpaTransac:onManager();                  tm.setEn:tyManagerFactory(emf);                  return  tm;          }   }   4  
  • 5.
    Boot 이전의 설정:web.xml <?xml  version="1.0"  encoding="UTF-­‐8"?>   <web-­‐app  xmlns:xsi="hVp://www.w3.org/2001/XMLSchema-­‐instance"                    xmlns="hVp://java.sun.com/xml/ns/javaee"                    xsi:schemaLoca:on="hVp://java.sun.com/xml/ns/javaee              hVp://java.sun.com/xml/ns/javaee/web-­‐app_3_0.xsd"                    version="3.0">            <servlet>                  <servlet-­‐name>dispatcher</servlet-­‐name>                  <servlet-­‐class>                          org.springframework.web.servlet.DispatcherServlet                  </servlet-­‐class>                  <init-­‐param>                          <param-­‐name>contextClass</param-­‐name>                          <param-­‐value>                                  org.springframework.web.context.support.Annota:onConfigWebApplica:onContext                          </param-­‐value>                  </init-­‐param>                  <init-­‐param>                          <param-­‐name>contextConfigLoca:on</param-­‐name>                          <param-­‐value>config.Config</param-­‐value>                  </init-­‐param>                  <load-­‐on-­‐startup>1</load-­‐on-­‐startup>          </servlet>            <servlet-­‐mapping>                  <servlet-­‐name>dispatcher</servlet-­‐name>                  <url-­‐paVern>/</url-­‐paVern>          </servlet-­‐mapping>            <filter>                  <filter-­‐name>encodingFilter</filter-­‐name>                  <filter-­‐class>org.springframework.web.filter.CharacterEncodingFilter</filter-­‐class>                  <init-­‐param>                          <param-­‐name>encoding</param-­‐name>                          <param-­‐value>UTF-­‐8</param-­‐value>                  </init-­‐param>          </filter>          <filter-­‐mapping>                  <filter-­‐name>encodingFilter</filter-­‐name>                  <url-­‐paVern>/*</url-­‐paVern>          </filter-­‐mapping>     </web-­‐app>   5  
  • 6.
    프로젝트 설정 작업 • 따분하고 지루하고 실수하기 딱 좋은 과정 – 의존 모듈 간 버전 맞추기 – (다른 소스에서) 설정 C&P하고 수정 – 잘 되나 테스트 – 빌드와 실행 6  
  • 7.
    Boot •  최소한의 노력으로스프링 기반 프로젝트를 시작할 수 있도록 도와줌 – 스프링 및 연동 기술의 표준화된 버전 설정 – 설정 최소화 : 기술별 표준화된 설정 모음 제공 – 임베디드 서버, 보안, 모니터링 구현 지원 7  
  • 8.
    Boot 이후: 설정 <parent>          <groupId>org.springframework.boot</groupId>          <ar:factId>spring-­‐boot-­‐starter-­‐parent</ar:factId>          <version>1.2.0.RELEASE</version>   </parent>   <dependencies>          <dependency>                  <groupId>org.springframework.boot</groupId>                  <ar:factId>spring-­‐boot-­‐starter-­‐web</ar:factId>          </dependency>          <dependency>                  <groupId>org.springframework.boot</groupId>                  <ar:factId>spring-­‐boot-­‐starter-­‐data-­‐jpa</ar:factId>          </dependency>          <dependency>                  <groupId>org.springframework.boot</groupId>                  <ar:factId>spring-­‐boot-­‐starter-­‐test</ar:factId>          </dependency>          <dependency>                  <groupId>mysql</groupId>                  <ar:factId>mysql-­‐connector-­‐java</ar:factId>          </dependency>          <dependency>                  <groupId>javax.servlet</groupId>                  <ar:factId>jstl</ar:factId>          </dependency>          <dependency>                  <groupId>org.springframework.boot</groupId>                  <ar:factId>spring-­‐boot-­‐starter-­‐tomcat</ar:factId>                  <scope>provided</scope>          </dependency>          <dependency>                  <groupId>org.apache.tomcat.embed</groupId>                  <ar:factId>tomcat-­‐embed-­‐jasper</ar:factId>                  <scope>provided</scope>          </dependency>   </dependencies>   <build>          <plugins>                  <plugin>                          <groupId>org.springframework.boot</groupId>                          <ar:factId>spring-­‐boot-­‐maven-­‐plugin</ar:factId>                  </plugin>          </plugins>   </build>   @SpringBootApplica:on   public  class  Applica:on  {            public  sta:c  void  main(String[]  args)  {                  SpringApplica:on.run(Applica:on.class,  args);          }     }   spring.view.prefix:  /WEB-­‐INF/view/   spring.view.suffix:  .jsp     spring.datasource.url=jdbc:mysql://localhost/test?characterEncoding=uU8   spring.datasource.username=root   spring.datasource.password=   spring.datasource.driver=com.mysql.jdbc.Driver     spring.jpa.database=MYSQL   8  
  • 9.
  • 10.
    Boot가 해 준것 1, 모듈 설정 <parent>          <groupId>org.springframework.boot</groupId>          <ar:factId>spring-­‐boot-­‐starter-­‐parent</ar:factId>          <version>1.2.0.RELEASE</version>   </parent>     <dependencies>          <dependency>                  <groupId>org.springframework.boot</groupId>                  <ar:factId>spring-­‐boot-­‐starter-­‐web</ar:factId>          </dependency>          <dependency>                  <groupId>org.springframework.boot</groupId>                  <ar:factId>spring-­‐boot-­‐starter-­‐data-­‐jpa</ar:factId>          </dependency>          <dependency>                  <groupId>org.springframework.boot</groupId>                  <ar:factId>spring-­‐boot-­‐starter-­‐test</ar:factId>          </dependency>        <dependency>                  <groupId>org.springframework.boot</groupId>                  <ar:factId>spring-­‐boot-­‐starter-­‐tomcat</ar:factId>                  <scope>provided</scope>          </dependency>          <dependency>                  <groupId>org.apache.tomcat.embed</groupId>                  <ar:factId>tomcat-­‐embed-­‐jasper</ar:factId>                  <scope>provided</scope>          </dependency>   </dependencies>   표준 버전 모음   spring-­‐mvc 등 웹 관련 모듈 자동 설정   spring-­‐data-­‐jpa,  JPA,  Hibernate 관련 모듈 설정   연관된 spring-­‐orm,  커넥션 풀 등 모듈 설정   spring-­‐test,  JUnit  등 관련 모듈 설정   임베디드 톰캣 관련 모듈 설정   10  
  • 11.
  • 12.
    Boot가 해 준것 2, 스프링 설정 @SpringBootApplica7on   public  class  Applica:on  {            public  sta:c  void  main(String[]  args)  {                  SpringApplica7on.run(Applica:on.class,  args);          }     }     //  @SpringBootApplica:on은 다음과 동일   //  @Configura:on   //  @EnableAutoConfigura7on   //  @ComponentScan   모든 설정 자동 생성!   - 스프링 MVC   -­‐  DataSource   -­‐  JPA,  JPA  TX,  Spring  Data  JPA   -­‐  DispatcherServlet,  CharacterEncodingFilter   spring.view.prefix:  /WEB-­‐INF/view/   spring.view.suffix:  .jsp     spring.datasource.url=jdbc:mysql://localhost/test?...   spring.datasource.username=root   spring.datasource.password=   spring.datasource.driver=com.mysql.jdbc.Driver     spring.jpa.database=MYSQL   JSP용 ViewResolver 설정   DataSource  설정   JPA 설정   12  
  • 13.
    @EnableAutoConfiguration @EnableAutoConfigura:on   @JpaRepositoriesAutoConfigura:on   @HibernateJpaAutoConfigura:on   @EmbeddedServletContainerAutoConfigura:on   @WebMvcAutoConfigura:on   @DataSourceAutoConfigura:on   @OOOOAutoConfigura:on  들   각 AutoConfigura:on은 조건에 따라 기본 설정 생성   13  
  • 14.
    Boot가 해 준것 3, 서버 실행 •  임베디드 톰캣으로 실행 – mvn spring-boot:run ...   [INFO]  -­‐-­‐-­‐  spring-­‐boot-­‐maven-­‐plugin:1.2.0.RELEASE:run  (default-­‐cli)  @  bootVersion  -­‐-­‐-­‐   ...   10:11:57.394  [app.Applica:on.main()]  INFO    app.Applica:on  -­‐  Star:ng  Applica:on  on  MADVIRUSui-­‐MacBook-­‐Air.local  with  PID  15134  (...)   ...   ...   10:11:59.947  [app.Applica:on.main()]  INFO    o.s.b.c.e.t.TomcatEmbeddedServletContainer  -­‐  Tomcat  ini:alized  with  port(s):  8080/hVp   10:12:00.219  [app.Applica:on.main()]  INFO    o.a.catalina.core.StandardService  -­‐  Star7ng  service  Tomcat   10:12:00.221  [app.Applica:on.main()]  INFO    o.a.catalina.core.StandardEngine  -­‐  Star7ng  Servlet  Engine:  Apache  Tomcat/8.0.15   ...   ...   10:12:05.708  [app.Applica:on.main()]  INFO    o.s.b.c.e.t.TomcatEmbeddedServletContainer  -­‐  Tomcat  started  on  port(s):  8080/hIp   10:12:05.712  [app.Applica:on.main()]  INFO    app.Applica:on  -­‐  Started  Applica:on  in  8.702  seconds  (JVM  running  for  12.428)   14  
  • 15.
    Boot가 해 준것 4, 실행 가능 war 생성 •  패키징한 war를 java 명령어로 실행 가능 – mvn package – java -jar target/myapp.war •  임베디드 톰캣으로 실행 •  생성된 war를 일반 WAS에 배포해도 됨 •  war가 아닌 jar 타입으로도 가능 15  
  • 16.
    다양한 기능에 대한자동 설정 지원 16  
  • 17.
    운영지원 기능 :Actuator •  서비스 상태(Health), 계측(Metric) 등 서비스 운영 지원을 위한 정보 제공 기능 •  다음 의존 추가로 자동 활성화 •  예, /health <dependency>          <groupId>org.springframework.boot</groupId>          <ar:factId>spring-­‐boot-­‐starter-­‐actuator</ar:factId>   </dependency>   17  
  • 18.
    Actuator가 제공하는 정보 • env : 스프링 Environment의 프로퍼티 목록 •  health : 어플리케이션 Health 상태 정보 •  metrics : 계측 정보 •  mappings : 웹 경로 매핑 정보 •  dump : 쓰레드 덤프 •  beans : 빈 목록 정보 •  trace : 최근 HTTP 요청 목록 표시(100개) 18  
  • 19.
    기타 •  Remote Shell기능 (Telnet로 연결해서 관리) •  기본 로깅 설정 제공 •  NoSQL 지원 (Redis, MongoDB, Solr 등) •  WebSocket 설정 지원 •  JTA 설정 지원 (Atomikos, Bitronix) •  Maven과 Gradle 지원 19  
  • 20.
    참고자료 •  Spring Boot프로젝트 – http://projects.spring.io/spring-boot/ •  레퍼런스 문서가 좋음 •  도서: Learning Spring Boot – http://goo.gl/Awzzoz •  Gradle 기반 •  현재 버전에 맞게 코드를 수정해야 할 부분이 간혹 있 지만 감을 잡기에 충분한 지식 제공 20