스프링부트는 스프링 프레임워크의 서브 프로젝트로, 스프링 프레임워크를 사용가능한 상태로 만들어 주는 도구와 같다. 왜 사용가능한 상태로 만들어주냐묜? 그냥 스프링을 쓰면 설정할게 넘흐나 많아서 힘들어잉
스프링은 다른 프레임워크와 통합을 지향 → 다른 프레임워크와 연동이 쉽다.
화면 UI는 스트러츠로, 비즈니스 영역은 스프링으로, 데이터 영역은 JPA 쓰던가 이런 방식으로..
이러다보니 설정을 위해서 라이브러리와 XML 등 관리할 게 넘흐 많아잉~ 그래서 스프링부트가 나옴
라이브러리 관리 자동화
: 스타터를 이용한 라이브러리 의존성 처리
설정 자동화
: 라이브러리 기반으로 실행 환경을 자동으로 설정한다
라이브러리 버전 자동 관리
: 스프링부트 버전에 해당하는 스프링 라이브러리, 서드파티 라이브러리들을 호환되는 버전으로 자동 관리
테스트 환경과 내장 톰갯
: 테스트관련 라이브러리가 기본적으로 포함되어 있으며 톰캣 서버를 내장하고 있다.
독립적 실행 가능한 JAR
: 웹 애플리케이션을 WAR가 아닌 JAR 파일로 패키징 가능
실습 환경
- macOS
- IntelliJ
알아서 샥샥 만들어준다. 감사하다~
얘네들은 전부 정해진 규칙을 따르고 있기 때문에 마음대로 바꾸면 안된다잉
스프링부트로 생성한 프로젝트는 기본적으로 메이븐 프로젝트 구조를 따른다.
이 중 resources가 기존 메이븐 기반 프로젝트와 다르게 구성된다. xml 파일은 없고 static, template폴더가 있음
스프링부트 애플리케이션을 실행하기 위해서는 메인 클래스가 필요한데, src/main/java에 이미 작성되어 있음. main()
메소드를 가진 실행파일이다. 얘를 실행하면 됨
스프링부트로 만든 애플리케이션 실행 방법
src/main/java 폴더 아래 SpringbootTestApplication
package com.example.springboottest;
// import..
@SpringBootApplication
public class SpringbootTestApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTestApplication.class, args);
}
}
@SpringBootApplication
그냥 이 클래스 실행하면 됨
요래 콘솔에 뜬다잉? 그리고 localhost:8080 들어가보면
요래 뜬다잉? 아무것도 설정 안 해놔서 그럼
그런데!! 콘솔을 보면 톰캣이 실행되고 있다.. 톰캣을 설정한 적이 없는데 어떻게 서버가 알아서 구동이 된거냐!!
처음 프로젝트 생성 시 의존성으로 Spring Web 추가했는데, 그러면 스프링부트가 알아서 웹 프로젝트 환경에 최적화된 라이브러리들을 등록함. 이 때 톰캣 라이브러리가 같이 다운로드 된 것
SpringbootTestApplication 수정 후 재실행 해야함
package com.example.springboottest;
// import ...
@SpringBootApplication
public class SpringbootTestApplication {
public static void main(String[] args) {
// SpringApplication.run(SpringbootTestApplication.class, args);
SpringApplication app =
new SpringApplication(SpringbootTestApplication.class);
app.setWebApplicationType(WebApplicationType.NONE);
app.run(args);
}
}
SpringApplication
객체의 run()
메소드를 정적 호출방식이 아닌 객체 생성을 통한 호출 방식으로 수정한다. 그리고 run()
메소드 호출 전 SpringApplication의 WebApplicationType을 NONE 설정 → 일반 자바 애플리케이션으로 실행됨. ( 톰캣도 구동 안 됨 )
WebApplicationType 설정 가능 타입
src/main/resources 폴더의 application.properties 파일
→ 전체 프로젝트의 프로퍼티 정보를 관리하는 설정파일
## WebApplicationType Settings
spring.main.web-application-type=none
요래 쓰면 SpringbootTestApplication 클래스에서 WebApplicationType을 SERVLET으로 해놔도 웹 애플리케이션이 아닌 일반 자바 애플리케이션으로 실행됨
→ 자바소스보다 application.properties 가 우선순위가 높다
스프링부트는 이러한 다양한 설정을 프로퍼티 파일을 통해 처리한다
src/main/resources/application.properties
## WebApplicationType Settings
spring.main.web-application-type=none
## Banner Settings
spring.main.banner-mode=off ## 배너 감추기
package com.example.springboottest;
// import ...
@SpringBootApplication
public class SpringbootTestApplication {
public static void main(String[] args) {
// 생략
app.setBannerMode(Banner.Mode.OFF); // 배너 감추기
app.run(args);
}
}
* 배너파일의 위치를 다른 곳으로 두는 것도 가능하다! ↓
## Banner Settings
## 배너 보이기
spring.main.banner-mode=console
## 배너 파일 위치 설정
spring.banner.location=banner/banner.txt
## 이미지 배너 파일 위치 설정
spring.banner.image.location=banner/spring_boot.png
spring.banner.image.height=10
spring.banner.image.width=80
application.properties
web-application 타입을 servlet으로 설정해줘야 한다!
💡 application.properties 파일에 설정한 프로퍼티 정보들은 실제 해당
Properties
객체의 Setter 메소드가 호출되어 의존성이 주입된 것!
실제로 ServerProperties 클래스로 이동해보면 아래와 같다
@ConfigurationProperties(
prefix = "server",
ignoreUnknownFields = true
)
public class ServerProperties {
private Integer port;
// 생략
public ServerProperties() {
// 생략
}
public Integer getPort() {
return this.port;
}
public void setPort(Integer port) {
this.port = port;
}
// ...
}
prefix = "server"
: server 접두사로 시작하는 프로퍼티를 설정하는 것 = 내부적으로 ServerProperties 객체의 setPort()
메소드를 호출하는 것