Spring Boot 소개
-
Upload
beom-kyun-choi -
Category
Technology
-
view
7.753 -
download
7
Transcript of Spring Boot 소개
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