[Spring] SpringBoot

2024. 7. 6. 23:44BE/Spring

1. SpringBoot란?

 

Spring Boot

 

spring.io

 

Spring Boot는 제품 수준의 Spring 애플리케이션을 쉽게 만들 수 있게 도와준다.

 

Spring 플랫폼과 다른 라이브러리를 활용하면, 복잡한 설정 없이 바로 시작할 수 있다.

 

대부분의 Spring Boot 애플리케이션은 간단한 Spring 설정만 필요하다.

 

  • 복잡한 설정을 자동화.
  • 자주 사용되는 library들이 조합되어 있다. (starter dependency 제공)
  • 서버를 내장하고 있어서 Tomcat, Jetty와 같은 별도의 WAS 설치가 필요 없다.
  • WAS에 배포하지 않고도 실행할 수 있다.

 


2. 시작하기

 

가. Spring initializr

 

https://start.spring.io/

 

SpringBoot 프로젝트를 생성하는 하나의 방법.

 

dependency를 쉽게 추가할 수 있다.

 


나. Spring Starter Project

 

eclipse sts에서 사용할 수 있다.

 

기능은 동일하다.

(DevTools : 수정 사항을 실시간으로 적용)

 


3. 디렉터리 구조

 

  • XXXApplication.java : 일반적으로 Java 애플리케이션의 진입점으로, main 메서드를 포함한다.
  • src/main/resources/static : 애플리케이션의 HTML, CSS, JavaScript, 이미지와 같은 정적 자원을 포함.
  • src/main/resources/apllication.properties : 데이터베이스 연결, 서버 포트 등 애플리케이션 설정을 구성.

 


4. application.properties

 

application.properties 파일은 Spring Boot 애플리케이션의 설정을 정의하는 데 사용된다.

 

서버, 데이터베이스, 로그 레벨, 파일 업로드, 라이브러리, view resolver, 기타 설정을 포함합니다.

 

# Web ContextRootPath and PortNumber Settings
#server.servlet.context-path=/board
server.port=80

# JSP Path (ViewResolver)
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

# DataBase Settings : hikariCP : https://github.com/brettwooldridge/HikariCP
spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/companyweb?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8
spring.datasource.hikari.username=company
spring.datasource.hikari.password=company
spring.datasource.hikari.pool-name=hikari-pool

# hikariCP property setting
spring.datasource.hikari.maximum-pool-size=50
spring.datasource.hikari.minimum-idle=50
spring.datasource.hikari.connection-timeout=5000
spring.datasource.hikari.connection-init-sql=SELECT 1
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.auto-commit=true

#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.url=jdbc:mysql://localhost:3306/companyweb?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8
#spring.datasource.username=company
#spring.datasource.password=company
#spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource

#MyBatis Setting
mybatis.type-aliases-package=com.company.*.model
mybatis.mapper-locations=mapper/**/*.xml

# file upload path : window
#file.path=C:/board/upload/
#file.path.upload-images=C:/board/upload/imageUpload
#file.path.upload-files=C:/board/upload/fileUpload/
#spring.servlet.multipart.location=C:/board/upload/

# file upload path : mac
file.path=/Users/fkaus4598/company/workspace/Framework/board6-springboot/upload
file.path.upload-images=/Users/fkaus4598/company/workspace/Framework/board6-springboot/upload/image
file.path.upload-files=/Users/fkaus459/company/workspace/Framework/board6-springboot/upload/file
#spring.servlet.multipart.location=C:/board/upload/

#File Upload size Setting
spring.servlet.multipart.max-file-size=25MB
spring.servlet.multipart.max-request-size=25MB

#log level Setting
logging.level.root=info
logging.level.com.company=debug

 


가. ViewResolver

 

src/main/resources/apllication.properties에 추가:

spring.application.name=Hello

server.servlet.context-path=/Hello

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

이때 공백문자를 사용하며 안된다.

  • server.servlet.context-path : 기본 context path 설정. 모든 url은 /Hello로 시작한다.
  • spring.mvc.view.prefix=/WEB-INF/views/, spring.mvc.view.suffix=.jsp : view resolver의 prefix, suffix 정의.

 


나. Jasper

 

부트에 처음에 내장되어 있는 Tomcat은 WAS가 아닌 Web Server 역할만 수행한다.

 

JSP를 사용할 거라면 Jasper가 필요하다.

 

JSP를 Servlet으로 변환하고 실행할 수 있게 Tomcat에 jasper를 추가해야 한다.

 

<!-- pom.xml -->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
</dependency>
# application.properties
spring.application.name=Hello

# Server Setting
# server.port=80
# server.servlet.context-path=your_context_path

# View Resolver
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

 


다. Hikari

 

Boot에서 Connection Pool을 만드는 방법이다..

 

 

HikariCP는 자바 애플리케이션에서 사용되는 고성능 JDBC 커넥션 풀링 라이브러리다.

 

connection pooling을 제공하는 JDBC DataSource의 구현체다.

 

Hikari는 빠르고 가벼워서 많이 사용된다.

# DataBase Settings : hikariCP : https://github.com/brettwooldridge/HikariCP
spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/companyweb?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8
spring.datasource.hikari.username=company
spring.datasource.hikari.password=company
spring.datasource.hikari.pool-name=hikari-pool

# hikariCP property setting
spring.datasource.hikari.maximum-pool-size=50
spring.datasource.hikari.minimum-idle=50
spring.datasource.hikari.connection-timeout=5000
spring.datasource.hikari.connection-init-sql=SELECT 1
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.auto-commit=true

기존의 legacy의 META-INF/context.xml에 있던 db 정보를 application.properties로 옮긴다.

 

Connection Pool 생성을 위해 필요하다.

 

그 외 hikariCP에 대한 설정을 추가한다.

package com.company.config;

import javax.sql.DataSource;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration
@PropertySource("classpath:/application.properties")
public class DataBaseConfiguration {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    public HikariConfig hikariConfig() {
        return new HikariConfig();
    }

    @Bean
    public DataSource dataSource() throws Exception {
        DataSource dataSource = new HikariDataSource(hikariConfig());
        System.out.println(dataSource.toString());
        return dataSource;
    }

}

dataSource bean을 등록한다.

 

legacy의 root-context.xml에서 dataSource를 등록하는 부분을 DataBaseConfiguration.java로 옮긴다.

 


라. MyBatis

# application.properties
# mybatis setting
mybatis.type-aliases-package=com.company.*.model
mybatis.mapper-locations=mapper/**/*.xml

MyBatis가 타입 별칭을 찾아야 하는 패키지(mybatis.type-aliases-package)와 mapper XML 파일의 위치(mybatis.mapper-locations)를 지정한다.

 

legacy의 root-context.xml에 있던 부분이다.

 


마. 환경 변수

# application.properties
custom.property.value=HelloWorld
my.blog=개발은즐거워

application.properties에 환경변수를 등록할 수 있다.

 

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class ExampleComponent {

    @Value("${custom.property.value}")
    private String customValue;

        @Value("${my.blog}")
        private String blogName;

    public void printCustomValue() {
        System.out.println("Custom Property Value: " + customValue);
    }

    public void printBlogName() {
        System.out.println("Blog name : " + blogName);
    }
}

이때 @Value 사용해서 값을 읽어 들인다.

 


마. File upload

# file upload path : window
file.path=C:/board/upload/
file.path.upload-images=C:/board/upload/imageUpload
file.path.upload-files=C:/board/upload/fileUpload/

 


5. XXXApplication.java

package com.company.board;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = {"com.company"})
public class Board6SpringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(Board6SpringbootApplication.class, args);
    }

}
  • @SpringBootApplication
    : Spring Boot 애플리케이션의 설정 클래스를 나타낸다.
    : 내부적으로 @SpringBootConfiguration, @EnableAutoConfiguration, @Component-scan을 자동으로 수행한다.

 

어노테이션 설명
@Configuration 하나 이상의 @Bean 메서드를 선언하고, Spring 컨테이너에서 해당 메서드들을 통해 빈 제공.
@EnableAutoConfiguration Spring Boot가 미리 정의해둔 설정들을 적용한다. 필요한 설정을 자동으로 처리할 수 있다.
@ComponentScan Spring이 지정된 패키지 및 하위 패키지에서 bean을 자동으로 검색하고 등록하도록 지시한다.

 

스캔 범위를 직접 지정하고 싶다면 @componentScan(basePackages = {”…”}와 같이 하면 된다.

 

public static void main(String[] args) {
    SpringApplication.run(Board6SpringbootApplication.class, args);
}

스프링 부트 애플리케이션의 진입점.

 

SpringApplication.run() 메서드를 호출하여 애플리케이션을 부트스트랩하고 실행한다.

 


6. Spring Boot의 동작 순서

 

  1. SpringApplication.run() 호출
    : 애플리케이션의 진입점인 main 메서드에서 SpringApplication.run()이 호출된다.
    : run()는 애플리케이션을 부트스트랩하고 실행시키는 역할을 한다.

  2. SpringApplication 인스턴스 생성
    : SpringApplication 클래스의 인스턴스가 생성된다.
    : 이 과정에서 애플리케이션의 초기 설정이 이루어진다.

  3. 애플리케이션 타입 결정
    : 애플리케이션이 웹 애플리케이션인지 여부를 결정한다.
    : 서블릿 기반의 웹 애플리케이션, 리액티브 웹 애플리케이션, 웹 환경이 아닌 애플리케이션

  4. 애플리케이션 콘텍스트 준비
    : Spring 애플리케이션 콘텍스트를 생성 및 초기화한다.
    : 환경 설정 파일(application.properties 등)을 로드하고, 빈(Bean) 정의를 읽어 들인다.
    : 이 과정에서 @EnableAutoConfiguration이 실행되어 필요한 설정이 자동으로 적용된다.

  5. 애플리케이션 콘텍스트 로드
    : 각종 설정과 빈이 애플리케이션 콘텍스트에 로드된다. 이때, @ComponentScan을 통해 빈을 검색하고 등록한다.

  6. 애플리케이션 이벤트 및 리스너 설정
    : 애플리케이션 이벤트와 리스너가 설정된다. 이를 통해 특정 이벤트가 발생할 때 커스텀 로직을 실행할 수 있다.

  7. 내장 웹 서버 시작
    : 웹 애플리케이션의 경우, 내장 웹 서버(Tomcat, Jetty 등)가 시작된다.

  8. 애플리케이션 초기화 및 실행
    : 모든 설정이 완료되면 애플리케이션이 초기화되고, CommandLineRunnerApplicationRunner 빈이 실행된다. 이를 통해 애플리케이션이 본격적으로 실행을 시작한다.

 

public ConfigurableApplicationContext run(String... args) {
    // 1. Startup 인스턴스 생성: 애플리케이션 시작 추적을 위해 Startup 인스턴스를 생성합니다.
    Startup startup = Startup.create();
    // 2. 종료 훅 설정: registerShutdownHook이 true인 경우 종료 훅을 설정합니다.
    if (this.registerShutdownHook) {
        SpringApplication.shutdownHook.enableShutdownHookAddition();
    }
    // 3. 부트스트랩 컨텍스트 생성: 초기 설정 정보를 담은 부트스트랩 컨텍스트를 생성합니다.
    DefaultBootstrapContext bootstrapContext = createBootstrapContext();
    // 4. 애플리케이션 컨텍스트 초기화: ConfigurableApplicationContext 변수를 초기화합니다.
    ConfigurableApplicationContext context = null;
    // 5. 헤드리스 모드 설정: GUI 환경 없이 실행될 수 있도록 설정합니다.
    configureHeadlessProperty();
    // 6. 실행 리스너 준비: 애플리케이션 생명주기 이벤트를 처리할 리스너를 가져옵니다.
    SpringApplicationRunListeners listeners = getRunListeners(args);
    // 7. 리스너 시작 알림: 리스너에게 애플리케이션이 시작 중임을 알립니다.
    listeners.starting(bootstrapContext, this.mainApplicationClass);
    try {
        // 8. 애플리케이션 인자 준비: 명령 줄 인자를 처리합니다.
        ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
        // 9. 환경 설정 준비: 실행 환경 설정을 로드하고 설정합니다.
        ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);
        // 10. 배너 출력: 애플리케이션 시작 시 콘솔에 배너를 출력합니다.
        Banner printedBanner = printBanner(environment);
        // 11. 애플리케이션 컨텍스트 생성: 주요 구성 요소로서의 애플리케이션 컨텍스트를 생성합니다.
        context = createApplicationContext();
        context.setApplicationStartup(this.applicationStartup);
        // 12. 애플리케이션 시작 설정: 시작 정보를 기록하고 관리합니다.
        prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
        // 13. 컨텍스트 준비: 애플리케이션 컨텍스트를 초기화하고 설정을 적용합니다.
        refreshContext(context);
        // 14. 새로 고침 후 작업 수행: 추가 초기화 작업을 수행합니다.
        afterRefresh(context, applicationArguments);
        // 15. 시작 작업 완료: 시작 시간을 기록하고 상태를 업데이트합니다.
        startup.started();
        // 16. 시작 로그 기록: 시작 정보를 로그에 기록합니다.
        if (this.logStartupInfo) {
            new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), startup);
        }
        // 17. 리스너에게 시작 알림: 애플리케이션이 시작되었음을 리스너에게 알립니다.
        listeners.started(context, startup.timeTakenToStarted());
        // 18. 실행기 호출: CommandLineRunner 및 ApplicationRunner를 실행합니다.
        callRunners(context, applicationArguments);
    }
    catch (Throwable ex) {
        // 19. 실행 실패 처리: 예외 발생 시 실행 실패를 처리합니다.
        throw handleRunFailure(context, ex, listeners);
    }
    try {
        if (context.isRunning()) {
            // 20. 준비 완료 알림: 정상 실행 중임을 리스너에게 알립니다.
            listeners.ready(context, startup.ready());
        }
    }
    catch (Throwable ex) {
        throw handleRunFailure(context, ex, null);
    }
    // 21. 최종 컨텍스트 반환: 애플리케이션 실행이 완료되었음을 나타내며 컨텍스트를 반환합니다.
    return context;
}

 


'BE > Spring' 카테고리의 다른 글

[Spring] SOP & CORS  (0) 2024.07.06
[Spring] Rest API  (0) 2024.07.06
[Spring] 비동기 통신  (0) 2024.07.06
[Spring] MyBatis-Spring module  (0) 2024.07.06
[MyBatis] 동적 SQL  (0) 2024.07.06