[시작하기]_01_소개
환경
- 자바 8 이상
- Maven, 또는 Gradle
스프링부트 소개
opinionated view
: 스프링부트가 가진 컨벤션을 의미
스프링부트가 널리 쓰이는 설정
이라고 생각하는 설정들을 (사용자가 일일히 설정하지 않고 사용할 수 있도록) 기본적으로 제공한다.
스프링 플랫폼(스프링 프레임워크를 설정하는 값)에 대한 뷰도 제공해준다.
third-party libraries 제 3의 라이브러리에 대한 설정도 제공해준다. (ex. 톰캣 설정 - 8080 포트를 띄워서 기본적으로 제공해준다.)
그렇기 때문에 사용자가 바로 프로젝트를 쉽게 시작할 수 있다.
스프링 목적
모든 스프링 개발을 할 때 더 빠르고 더 폭넓은 사용성을 제공한다.
컨벤션 설정을 제공해준다. (일일이 설정하지 않아도 이미 컨벤션으로 정해져있는 설정을 제공해준다.)
★ 하지만 사용자가 원하는 대로 이러한 설정들을 쉽게 변경할 수 있다. ★
비즈니스 로직에 필요한 기능뿐아니라 non-functional features 기능도 제공해준다.
더이상 XML 설정을 사용하지 않고, code generation1도 하지 않는다. (그래서 오히려 더 쉽고, 명확하고, 커스터마이징하기 쉽다.)
스프링부트 시작하기
- 스프링 references
- 스프링홈페이지 > [PROJECTS] > [Spring Boot] > [Learn] > Reference Doc.
- Getting Started
스프링부트 프로젝트 기본 셋팅
-
[Create New Project] > [Maven]
- GroupId : 패키지명
- ArtifatId : 프로그램명
Enable Auto-Import
선택 : 인텔리제이에서 pom.xml 파일을 변경할 때 마다 자동으로 변경사항을 import 해준다. (디팬던시 추가, 프로퍼티 변경 등) -
pom.xml
에spring-boot-starter-parent
의존성 추가<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.3.RELEASE</version> </parent>
maven 안에 프로젝트간의 계층 구조를 만들 수 있다. 이 프로젝트의
부모 프로젝트
를spring-boot-starter-parent
프로젝트로 지정해준 것이다.스프링부트가 제공하는 의존성 관리와 매우 관련이 깊은 설정이다.
-
spring-boot-starter-web
의존성 추가<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
-
build에
spring-boot-maven-plugin
플러그인 추가<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
-
main 작성
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
⇒ 웹 브라우저에서
localhost:8080
으로 접속해보면 Whitelabel Error Page 가 나오면서 서버가 동작 중인 것을 확인할 수 있다. -
패키지파일 생성
터미널에서 mvn package
명령 실행
※ mvn package 명령어
- 컴파일된 결과물을 패키지 파일로 생성
- 컴파일, 테스트, 빌드를 수행하여 패키지 파일을 생성한다.
- 프로텍트 이름, 버전, 패키징 옵션에 맞게 파일이 생성된다.
- pom에서 아래와 같이 설정하면 결과 파일은 test-1.0-SNAPSHOT.war 로 생성된다.
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
지금 만든 프로젝트는 웹프로젝트가 아니라 Maven기반은 Java프로젝트 이므로 jar
패키지파일이 생성된다.
- jar 파일 실행
※ jar 파일 위치 : target
디렉토리
java -jar /path/of/jar/xxx.jar
tomcat이 8080 포트로 시작되었고, 시작하는데 2초가 걸렸다.
웹브라우저에서 8080포트 접속하면 서버 실행된 것 확인 가능
스프링 부트 원리 에서 배울 내용
-
스프링 MVC가 동작하려면 여러가지 Dependency가 필요한데, 우리가 넣어준 의존성은
spring-boot-starter-web
밖에 없다.어떻게 해서 수많은 의존성이 들어왔을까?
-
스프링 MVC 앱 설정 - 디스패처 서블릿, 리스너에 웹 애플리케이션 컨텍스트 어떤 것을 쓸지 설정, 빈 설정파일 제공 (어디서 부터 빈 설정을 읽어야 하는지 등등) 이러한 설정들을 안했는데 동작한다.
⇒
SpringBootApplication
에 들어있다.@EnableAutoConfiguration
어노테이션과 밀접한 관계가 있다. -
Spring Application의
run
을 실행하면 어떠한 동작으로 내장 톰캣이 뜨는 것인가?
스프링 부트 프로젝트 생성기
start.spring.io
-
start.spring.io 에서 프로젝트 생성
-
maven, gradle 프로젝트, 스프링 부트 버전, java 버전, 의존성 추가 > [GENERATE] > zip 아카이브 파일이 다운로드 된다.
-
다운로드된 zip 파일을 압축해제(
unzip
) 후, Intellij에서 open
⇒ 의존성 확인
앞서 추가해준 의존성에 몇가지만 더 추가되어 있다.
-
properties - UTF0-8
-
spring-boot-starter-test
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
Spring console
- 프로젝트 생성을 위해 이 명령어를 설치하는 것은 비효율적이니깐.. (다른 기능도 있긴 함) 있다는 것만 알려주고 넘어감
스프링 부트 프로젝트 구조
Maven Java 기본 프로젝트의 구조와 동일
-
src > main > java
: java 소스 코드 -
src > main > resources
: java 소스 코드를 제외한 모든 것- Class Path Root 가 되는 위치
- Java Application에서 이 위치(
resources
)를 기준으로 파일들을 참조할 수 있다. - spring resource abstraction에서 어떻게 참조하는지? hint. class path 라는 prefix를 붙인다.
-
test > java > resources
: 테스트와 관련된 리소스 (java파일 제외) -
스프링 부트에서 딱 하나 추천하는 main Application 클래스의 위치
-
@SpringBootApplication
어노테이션을 붙인 main 클래스 -
Default Package(최상위 패키지 경로)에 바로 위치시키는 것을 추천한다.
-
컴포넌트 스캐닝이 여기(
@SpringBootApplication
가 달려있는 위치)서부터 진행된다. -
이 패키지(dev.solar)부터 시작해서 패키지 하위의 모든 패키지 않의 모든 빈을 등록한다.
-
만약
src > main > java
아래에 바로 main 클래스가 위치한다면???모든 패키지를 스캐닝하게 된다. 그럴 필요가 없기 때문에…
-
-
프로그래머가 Program code를 직접 작성하지 않고 자동으로 code를 생성해 내는 것 ↩