[Spring] SpringBoot

young-gue Park·2023년 10월 24일
1

Spring

목록 보기
12/14
post-thumbnail

⚡ SpringBoot


📌 스프링부트

🔷 자바의 웹 프레임워크로 기존 스프링 프레임워크(Spring Framework)에 톰캣 서버를 내장하고 여러 편의 기능들을 추가하여 꾸준한 인기를 누리고 있는 프레임워크

  • 설정이 간소화되었다.
  • 프로젝트 내부 tomcat을 가지고 있다.

💡 스프링부트란?

🔷 SpringBoot 탄생 과정

위쪽은 자바 진영, 아래쪽은 그 외.


⭐ SpringBoot Project 생성

❗ STS 사용 기준이다.

  1. https://start.spring.io/에서 Project를 생성한다.

    • Dependencies 추가 (DevTools, Web …) 후 파일을 생성한다.
  2. STS workspace에 파일 압축 해제 후 import한다.

  3. 기존의 Spring과는 다르게 SpringBoot는 Spring Starter Project를 이용하여 윈도우의 Install Wizard와 같이 손쉽게 SpringBoot기반의 프로젝트를 만들 수 있다.

    • 다음과 같이 설정 후 next

  • SpringBoot의 버전 및 Dependency 설정

  • 확인 후 Finish

⭐ SpringBoot Project 구조

🔷 project 생성 구조 및 주요 구성 폴더/파일

프로젝트의 주요 파일설명
src/main/javajava source directory
SpringDay12HelloBootApplication.javaapplication을 시작할 수 있는 main method가존재하는 스프링 구성 메인 클래스.
staticcss, js, img등의 정적 resource directory
templatesSpringBoot에서 사용 가능한 여러가지 View Template(Thymeleaf, Velocity, FreeMarker등) 위치
application.propertiesapplication 및 스프링의 설정 등에서 사용할 여러 가지 property를 정의한 file
src/mainjsp등의 리소스 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를 해당 경로로 만들어 두면 된다.


⭐SpringBoot Project 특징

🔷 Spring 사용시 개발자가 직접 해야만 했던 복잡한 설정을 해결한다.

🔷 SpringBoot의 장점

  • 간편하고 자동화된 빌드 및 설정을 제공한다.
  • project에 따라 자주 사용되는 library들이 미리 조합되어 있다.(Best Practice)
  • 복잡한 설정(XML)을 하지 않아도 된다.(자동)
  • 내장 서버를 제공해서 WAS를 추가로 설치하지 않아도 개발과 손쉬운 배포가 가능하다.(독립실행)
  • WAS에 배포하지 않고도 실행할 수 있는 JAR파일로 Web Application을 개발 할 수 있다

📌 SpringBoot Board

🔷 Swagger와 REST API 적용 이전의 Board를 이용하여 SpringBoot 프로젝트로 바꾼다.

  • 기존의 WEB-INF 폴더 내 설정 파일들(web.xml, root-context.xml, servlet-context.xml)은 필요한 설정들만 application.properties에 옮기거나 config 파일로 관리한다.

🖥 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에 저장된 채 출력되어 무엇이 등록되어있는지 알기 편하다.

정상 작동까지 확인 완료!


오늘로 일단 스프링을 마무리한다.
설정을 쉽게쉽게 건너뛸 수 있다는 점에서 스프링부트가 참 좋긴 하다.

profile
Hodie mihi, Cras tibi

0개의 댓글

관련 채용 정보