🔷 자바의 웹 프레임워크로 기존 스프링 프레임워크(Spring Framework)에 톰캣 서버를 내장하고 여러 편의 기능들을 추가하여 꾸준한 인기를 누리고 있는 프레임워크
💡 스프링부트란?
🔷 SpringBoot 탄생 과정
위쪽은 자바 진영, 아래쪽은 그 외.
❗ STS 사용 기준이다.
https://start.spring.io/에서 Project를 생성한다.
STS workspace에 파일 압축 해제 후 import한다.
기존의 Spring과는 다르게 SpringBoot는 Spring Starter Project를 이용하여 윈도우의 Install Wizard와 같이 손쉽게 SpringBoot기반의 프로젝트를 만들 수 있다.
SpringBoot의 버전 및 Dependency 설정
🔷 project 생성 구조 및 주요 구성 폴더/파일
프로젝트의 주요 파일 | 설명 |
---|---|
src/main/java | java source directory |
SpringDay12HelloBootApplication.java | application을 시작할 수 있는 main method가존재하는 스프링 구성 메인 클래스. |
static | css, js, img등의 정적 resource directory |
templates | SpringBoot에서 사용 가능한 여러가지 View Template(Thymeleaf, Velocity, FreeMarker등) 위치 |
application.properties | application 및 스프링의 설정 등에서 사용할 여러 가지 property를 정의한 file |
src/main | jsp등의 리소스 directory |
🖥 SpringDay12HelloBootApplication.java
메인 메서드 실행만으로 Tomcat 서버가 작동한다.
콘솔에서 까리한 타이틀과 함께 서버가 열렸음을 알려준다.
만든게 없어서 지금 뜨는게 없는데...
package com.bzeromo.hello.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("msg", "Hello Boot");
return "hello";
}
}
컨트롤러를 만들고
application.properties 파일에 설정 뒤
<!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
View 사용을 위해 pom.xml에 View resolver(jasper) 등록
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<h2>${msg }</h2>
</body>
</html>
Hello.jsp를 해당 경로로 만들어 두면 된다.
🔷 Spring 사용시 개발자가 직접 해야만 했던 복잡한 설정을 해결한다.
🔷 SpringBoot의 장점
🔷 Swagger와 REST API 적용 이전의 Board를 이용하여 SpringBoot 프로젝트로 바꾼다.
🖥 application.properties
# JSP path
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
# dataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/bzeromo_board?serverTimezone=UTC
spring.datasource.username=bzeromo
spring.datasource.password=1234
# mybatis
mybatis.mapper-locations=classpath*:mappers/*.xml
mybatis.type-aliases-package=com.bzeromo.board.model.dto
💡 properties 파일의 주석은
#
으로 표시한다.
🖥 com.bzeromo.board.config.DBConfig
package com.bzeromo.board.config;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan(basePackages="com.bzeromo.board.model.dao") //Main에 붙여도 되긴 하다만 깔끔한 구조를 위해...
public class DBConfig {
}
🖥 com.bzeromo.board.config.WebConfig
package com.bzeromo.board.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Value("${spring.mvc.view.prefix}")
private String prefix;
@Value("${spring.mvc.view.suffix}")
private String suffix;
@Bean
public ViewResolver InternalResourceViewResolver () {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix(prefix);
resolver.setSuffix(suffix);
resolver.setViewClass(JstlView.class);
return resolver;
}
//static을 먼저 탐색하게 만들기
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
}
//등록할 인터셉터가 있을 때 필드를 통해 의존성을 주입 받고 등록
@Override
public void addInterceptors(InterceptorRegistry registry) {
}
}
💡 이전에 사용하던 컴포넌트 스캔, 트랜잭션 매니저 등의 설정이나 web.xml의 필터를 포함한 모든 설정들은 다 필요가 없어졌다. 특히 하나하나 bean으로 등록하지 않아도 이미 알아서 해주었기 때문에 이러한 xml 파일들은 모두 없애도 좋다.
💡 context-root가 이제 없기 때문에 뷰에 풀 경로를 작성하더라도 상관이 없어졌다.
🖥 SpringDay12HelloBootApplication
package com.bzeromo.board;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class SpringDay12HelloBootApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(SpringDay12HelloBootApplication.class, args);
for(String name: context.getBeanDefinitionNames()) {
System.out.println(name);
}
}
}
메인 메서드 내에서 저런 식으로 구현해두면 등록되어있는 bean의 이름을이 context에 저장된 채 출력되어 무엇이 등록되어있는지 알기 편하다.
정상 작동까지 확인 완료!
오늘로 일단 스프링을 마무리한다.
설정을 쉽게쉽게 건너뛸 수 있다는 점에서 스프링부트가 참 좋긴 하다.