2024. 7. 6. 23:44ㆍBE/Spring
1. SpringBoot란?
Spring Boot는 제품 수준의 Spring 애플리케이션을 쉽게 만들 수 있게 도와준다.
Spring 플랫폼과 다른 라이브러리를 활용하면, 복잡한 설정 없이 바로 시작할 수 있다.
대부분의 Spring Boot 애플리케이션은 간단한 Spring 설정만 필요하다.
- 복잡한 설정을 자동화.
- 자주 사용되는 library들이 조합되어 있다. (starter dependency 제공)
- 서버를 내장하고 있어서 Tomcat, Jetty와 같은 별도의 WAS 설치가 필요 없다.
- WAS에 배포하지 않고도 실행할 수 있다.
2. 시작하기
가. Spring initializr
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의 동작 순서
SpringApplication.run()
호출
: 애플리케이션의 진입점인main
메서드에서SpringApplication.run()
이 호출된다.
:run()
는 애플리케이션을 부트스트랩하고 실행시키는 역할을 한다.SpringApplication
인스턴스 생성
:SpringApplication
클래스의 인스턴스가 생성된다.
: 이 과정에서 애플리케이션의 초기 설정이 이루어진다.- 애플리케이션 타입 결정
: 애플리케이션이 웹 애플리케이션인지 여부를 결정한다.
: 서블릿 기반의 웹 애플리케이션, 리액티브 웹 애플리케이션, 웹 환경이 아닌 애플리케이션 - 애플리케이션 콘텍스트 준비
: Spring 애플리케이션 콘텍스트를 생성 및 초기화한다.
: 환경 설정 파일(application.properties 등)을 로드하고, 빈(Bean) 정의를 읽어 들인다.
: 이 과정에서@EnableAutoConfiguration
이 실행되어 필요한 설정이 자동으로 적용된다. - 애플리케이션 콘텍스트 로드
: 각종 설정과 빈이 애플리케이션 콘텍스트에 로드된다. 이때,@ComponentScan
을 통해 빈을 검색하고 등록한다. - 애플리케이션 이벤트 및 리스너 설정
: 애플리케이션 이벤트와 리스너가 설정된다. 이를 통해 특정 이벤트가 발생할 때 커스텀 로직을 실행할 수 있다. - 내장 웹 서버 시작
: 웹 애플리케이션의 경우, 내장 웹 서버(Tomcat, Jetty 등)가 시작된다. - 애플리케이션 초기화 및 실행
: 모든 설정이 완료되면 애플리케이션이 초기화되고,CommandLineRunner
와ApplicationRunner
빈이 실행된다. 이를 통해 애플리케이션이 본격적으로 실행을 시작한다.
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 |