스프링 부트
스프링 프레임워크보다 편리
자동 의존성 관리
쉽고 빠른 테스트 및 배포
설정 과정 단순화, 환경 설정 자동화
라이브러리 자동 업데이트 가능
프로젝트 환경 툴 내장 (Tomcat, Jetty, UnderFlow 등 설치 불필요)
myboot01/src/main/resources/application.properties
톰캣 서버 설정
#Server
server.port=8090 #포트번호
server.session.timeout=360000 #유효시간
myboot01/src/main/java/com/myboot01/Myboot01Application.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication //스프링부트 설정
public class Myboot01Application {
public static void main(String[] args) { //main 메소드 필수
SpringApplication.run(Myboot01Application.class, args);
}
}
myboot01/src/main/java/com/myboot01/DemoController.java
package com.myboot01;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class DemoController {
@ResponseBody
@RequestMapping("/") //모든 요청
public String home() {
System.out.println("Hello Boot!!"); //콘솔 출력
return "Hello Boot!!"; //브라우저 출력
}
}
myboot01/src/main/java/com/myboot01/ServletInitializer.java
web.xml없이 톰캣 실행
...
public class ServletInitializer extends SpringBootServletInitializer {
...
myboot01/pom.xml
...
<!-- JSP 관련 라이브러리 설정 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
...
myboot01/src/main/resources/application.properties
#Server
server.port=8090
server.session.timeout=360000
#Spring MVC
#JSP 파일 위치 설정
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
myboot01/src/main/webapp/WEB-INF/views/hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<% request.setCharacterEncoding("UTF-8"); %>
<html>
<head>
<script src="${contextPath}/js/scriptTest.js" type="text/javascript"></script> <!-- js file -->
<meta charset="utf-8">
<title>hello.JSP 페이지</title>
</head>
<body>
안녕하세요 <br>
<h2>${message}</h2>
<img width=200 height=200 src="${contextPath}/image/duke3.png" /> <br/>
<input type="button" name="테스트" value="테스트" onClick="test();">
</body>
</html>
타임리프
간결하게 구현하는 화면
빠르고 쉬운 스프링 연동
JSP가 아닌 순수 HTML을 사용하면서 동적인 동작을 가능하게 함
myboot01/pom.xml
...
<!-- 타임리프 관련 라이브러리 설정 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
...
myboot01/src/main/java/com/myboot01/DemoController.java
...
@Controller
public class DemoController {
@ResponseBody
@RequestMapping("/")
public String home(){
System.out.println("Hello Boot!!");
return "Hello Boot!!";
}
@RequestMapping("/hello.do")
public String hello(Model model){
System.out.println("안녕하세요");
model.addAttribute("message","hello.html입니다.!");
return "hello";
}
}
myboot01/src/main/resources/static/scriptTest.js
function test() {
alert("thymeleaf 테스트입니다");
}
myboot01/src/main/resources/templates/hello.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"> <!-- 타임리프 사용 설정 -->
<head>
<script src="/js/scriptTest.js" type="text/javascript"></script> <!-- js file -->
<meta charset="utf-8" />
<title>hello.html입니다.</title>
</head>
<body>
<h1> thymeleaf 테스트입니다.</h1>
<div th:text="${message}"></div>
<img src="/image/duke3.png" width="200" height="200" /><br>
<input type="button" name="테스트" value="테스트" onClick="test()" />
</body>
groovy 스크립트 기반 동적 빌드 기능 제공
메이븐보다 간단한 빌드 작업, 편리한 기능 추가 가능
Gradle 프로젝트 구조
myboot02/build.gradle
pom.xml 역할
buildscript {
ext { springBootVersion = '2.0.6.RELEASE' }
repositories { mavenCentral() }
dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") }
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.myboot02'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
implementation('org.springframework.boot:spring-boot-starter-jdbc')
implementation('org.springframework.boot:spring-boot-starter-web')
implementation('org.apache.tomcat.embed:tomcat-embed-jasper') //톰캣 사용 설정
implementation('javax.servlet:jstl:1.2') //JSP 사용 설정
runtimeOnly('com.h2database:h2')
testImplementation('org.springframework.boot:spring-boot-starter-test')
}
myboot02/src/main/resources/application.properties
#Server
server.port=8090
server.session.timeout=360000
#Spring MVC
spring.mvc.view.prefix=/WEB-INF/views/ #jsp file path
spring.mvc.view.suffix=.jsp
이전 MyBatis
interface DAO { abstract method; }
class MemberDAOImpl implements interface { sqlSession -> mapper SQL }
Spring Boot MyBatis
interface DAO { abstract method; }
service { method -> mapper SQL }
MemberDAOImpl.java 불필요
myboot03/libs/ojdbc6.jar
oracle database driver
myboot03/build.gradle
...
dependencies {
implementation('org.springframework.boot:spring-boot-starter-jdbc')
implementation('org.springframework.boot:spring-boot-starter-web')
implementation('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
/* jsp 사용 설정 */
implementation('org.apache.tomcat.embed:tomcat-embed-jasper')
implementation('javax.servlet:jstl:1.2')
/* oracle driver */
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation files('libs/ojdbc6.jar')
runtimeOnly('com.h2database:h2')
testImplementation('org.springframework.boot:spring-boot-starter-test')
}
...
myboot03/src/main/resources/application.properties
#Server
server.port=8090
server.session.timeout=360000
#Spring MVC
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
#Database config
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.username=scott
spring.datasource.password=tiger
spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
#mybatis config
mybatis.config=classpath:mybatis-config.xml
mybatis.type-aliases-package=com.myboot03.member.vo #memberVO package
myboot03/src/main/resources/mybatis-config.xml
...
<configuration>
<mappers>
<!-- mapper path -->
<mapper resource="mybatis/mappers/member.xml"/>
<!-- <mapper resource="mybatis/mappers/board.xml"/> -->
</mappers>
</configuration>
myboot03/src/main/resources/mybatis/mappers/member.xml
...
<mapper namespace="com.myboot03.member.dao.MemberDAO">
<resultMap id="memResult" type="memberVO">
<result property="id" column="id" />
<result property="pwd" column="pwd" />
<result property="name" column="name" />
<result property="email" column="email" />
<result property="joinDate" column="joinDate" />
</resultMap>
<select id="selectAllMemberList" resultMap="memResult">
<![CDATA[
select * from t_member order by joinDate desc
]]>
</select>
<insert id="insertMember" parameterType="memberVO">
<![CDATA[
insert into t_member(id,pwd, name, email)
values(#{id}, #{pwd}, #{name}, #{email})
]]>
</insert>
...
myboot03/src/main/java/com/myboot03/member/controller/MemberControllerImpl.java
...
@Controller("memberController")
public class MemberControllerImpl implements MemberController {
@Autowired
private MemberService memberService;
@Autowired
private MemberVO memberVO ;
@Override
@RequestMapping(value= "/member/listMembers.do", method = RequestMethod.GET)
public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception {
//String viewName = (String)request.getAttribute("viewName");
List membersList = memberService.listMembers();
//ModelAndView mav = new ModelAndView(viewName);
ModelAndView mav = new ModelAndView("/member/listMembers");
mav.addObject("membersList", membersList);
return mav;
}
...
myboot03/src/main/java/com/myboot03/member/dao/MemberDAO.java
...
@Mapper
@Repository("memberDAO")
public interface MemberDAO {
/* mapper file SQL */
public List selectAllMemberList() throws DataAccessException;
public int insertMember(MemberVO memberVO) throws DataAccessException ;
public int deleteMember(String id) throws DataAccessException;
public MemberVO loginById(MemberVO memberVO) throws DataAccessException;
}
myboot03/build.grade
...
dependencies {
implementation('org.springframework.boot:spring-boot-starter-jdbc')
implementation('org.springframework.boot:spring-boot-starter-web')
implementation('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
implementation('org.apache.tomcat.embed:tomcat-embed-jasper')
implementation('javax.servlet:jstl:1.2')
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation files('libs/ojdbc6.jar')
implementation('org.apache.tiles:tiles-jsp:3.0.4') <!-- tiles 사용 설정 -->
runtimeOnly('com.h2database:h2')
testImplementation('org.springframework.boot:spring-boot-starter-test')
}
myboot03/src/main/java/com/myboot03/common/tiles/TilesConfig.java
...
@Configuration //설정 클래스
public class TilesConfig {
@Bean
public TilesConfigurer tilesConfigurer() {
final TilesConfigurer configurer = new TilesConfigurer();
configurer.setDefinitions(new String[] {"WEB-INF/tiles/tiles_member.xml"}); //단일 tiles 설정 파일
//configurer.setDefinitions(new String[] {"WEB-INF/tiles/tiles_member.xml","WEB-INF/tiles/tiles_board.xml"}); //복수 tiles 설정 파일
configurer.setCheckRefresh(true);
return configurer;
}
@Bean
public TilesViewResolver tilesViewResolver() {
final TilesViewResolver resolver = new TilesViewResolver();
resolver.setViewClass(TilesView.class);
return resolver;
}
}
myboot03/src/main/java/com/myboot03/common/interceptor/InterceptorConfig.java
...
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
/* 요청별 interceptor 적용 여부 지정 */
registry.addInterceptor(new ViewNameInterceptor())
.addPathPatterns("/*.do") //적용
.addPathPatterns("/*/*.do") //적용
.excludePathPatterns("/users/login"); //미적용
}
}
myboot03/src/main/java/com/myboot03/member/controller/MemberControllerImpl. java
...
@Override
@RequestMapping(value= "/member/listMembers.do", method = RequestMethod.GET)
public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception {
String viewName = (String)request.getAttribute("viewName");
List membersList = memberService.listMembers();
ModelAndView mav = new ModelAndView(viewName);
//ModelAndView mav = new ModelAndView("/member/listMembers");
mav.addObject("membersList", membersList);
return mav;
}
...
*자바 웹을 다루는 기술