패키징
- 기존의 자바 웹 애플리케이션은 WAR 파일로 패키징되며, JAR 파일은 라이브러리와 데스크톱 UI 애플리케이션 패키징에 사용되었다.
- WAR 파일은 기존의 자바 애플리케이션 서버에 애플리케이션을 배포할 때는 적합하지만, 대부분의 클라우드 플랫폼에는 맞지 않는다.
- JAR 패키징은 클라우드를 염두에 둔 선택으로, 모든 자바 클라우드 플랫폼은 실행 가능한 JAR 파일을 사용한다.
스프링 프로젝트 구조
- 애플리케이션 소스 코드는 src/main/java, 테스트 코드는 src/test/java, 자바 리소스가 아닌 것은 src/main/resources에 저장된다.
- Applicaton은 스프링 부트의 메인 클래스이며, application.properties에 구성 속성을 지정할 수 있다.
- static은 브라우저에 제공할 정적인 콘텐츠(이미지, 스타일시트, 자바스크립트 등)를 둘 수 있는 폴더이다.
- templates는 브라우저에 콘텐츠를 보여주는 템플릿 파일을 두는 폴더이다.
- ApplicationTests.java는 스프링 애플리케이션이 성공적으로 로드되는지 확인하는 간단한 테스트 클래스이다.
Gradle 설정
- 그래들은 자바, 그루비, 스칼라 등 JVM에서 실행되는 언어의 빌드 자동화 툴로, 빌드 자동화 툴을 이용하면 컴파일, 라이브러리 다운로드, 패키징, 테스팅 등을 자동화할 수 있다.
- 라이브러리를 다운받는 대신 원하는 라이브러리와 버전을 코드로 작성하고, 오퍼레이터가 직접 컴파일, 빌드, 유닛 테스트를 실행하는 대신 이 과정을 일련의 코드로 적는다.
- 그러면 빌드 자동화 툴이 이 코드를 해석해서 프로젝트 빌드에 필요한 작업을 실행해 준다.
플러그인
plugins {
id 'org.springframework.boot' version '2.5.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
- 그래들은 의도적으로 많은 기능을 제공하지 않는 대신, 플러그인을 통해 그래들을 확장해서 사용할 수 있다.
- 따라서 자바를 컴파일하려면 자바 플러그인이 필요하다.
메타데이터
group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
- group은 보통 artifact를 배포하는데 사용된다.
- version은 프로젝트의 버전을 말한다.
- 추가한 자바 플러그인은 sourceCompatibility에 명시된 자바 버전을 이용해 스스로 컴파일한다.
리포지터리
repositories {
mavenCentral()
}
- 그래들이 라이브러리를 다운받는 곳을 리포지터리라고 부르며, 그중 메이븐 센트럴을 주로 사용한다.
의존성
dependencies {
// 스프링 부트 스타터
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
// devTools
developmentOnly 'org.springframework.boot:spring-boot-devtools'
// lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
// 테스트
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
- 프로젝트에 사용할 라이브러리를 명시하면, 그래들이 리포지터피에서 라이브러리를 다운 및 설치한다.
- implementation, runtimeOnly 등은 라이브러리의 scope에 대한 내용
필수 의존성
더보기
스프링 부트 스타터
- 스프링 부트 스타터 의존성 항목들은 자체적으로 라이브러리 코드를 갖지 않고 다른 라이브러리의 것을 사용한다.
- 스타터 의존성을 사용하면 우리가 필요로 하는 모든 라이브러리의 의존성을 선언하지 않아도 되므로, 빌드 파일이 작아지고 관리하기 쉬워진다.
- 또한 라이브러리 이름이 아닌 기능 관점으로 의존성을 생각할 수 있다. (예 - 웹 스타터 의존성)
- 스프링 부트에 포함되는 라이브러리들의 버전은 호환이 보장되므로, 라이브러리들의 버전을 걱정하지 않아도 된다.
스프링 부트 DevTools
- 스프링 개발자에게 개발 시점에 편리한 도구를 제공하며, 개발 시에만 사용되고 실제 운영에서는 스스로 비활성화한다.
- DevTools가 제공하는 기능은 다음과 같다.
1. 코드가 변경되면 자동으로 애플리케이션 다시 시작
- DevTools는 변경을 감지해서 자동으로 애플리케이션을 다시 시작시키므로, 프로젝트의 자바 코드와 속성 파일들을 변경하면 곧바로 해당 변경이 적용된다.
- DevTools를 사용하면 애플리케이션은 JVM에서 두 개의 클래스 로더에 의해 로드되는데 하나는 자바 코드, 속성 파일, 프로젝트의 src/main/ 경로에 있는 모든 것과 함께 로드된다. (자주 변경)
- 나머지 클래스 로더는 자주 변경되지 않는 의존성 라이브러리와 함께 로드된다.
- 변경이 감지되는 경우 DevTools는 프로젝트 코드를 포함하는 클래스 로더만 다시 로드하고, 스프링 애플리케이션 컨텍스트를 다시 시작시키기 때문에 애플리케이이 시작하는데 걸리는 시간을 단축해준다.
- But 의존성 라이브러리를 포함하는 클래스 로더는 자동으로 다시 로드되지 않기 때문에, 애플리케이션이 자동으로 다시 시작될 때 의존성 변경은 적용되지 않는다.
2. 브라우저로 전송되는 리소스가 변경될 때 자동으로 브라우저를 새로고침하고, 템플릿 캐시 비활성화
- 기본적으로 Thymeleaf와 FreeMarker 같은 템플릿에서는 템플릿이 사용되는 모든 웹 요청마다 매번 다시 파싱되지 않게 하기 위해서, 템플릿의 파싱 결과를 캐시에 저장하고 사용하도록 구성된다.
- 그러나 개발 시점에는 애플리케이션이 실행 중일 때 템플릿을 변경하면 여전히 변경 전의 캐싱된 템플릿이 사용되므로 바로 변경 결과를 확인할 수 없어서 불편
- DevTools는 모든 템플릿 캐싱을 자동으로 비활성화해서 템플릿을 변경하고 브라우저를 새로고침하면 변경된 템플릿이 적용된다.
- DevTools가 사용될 때는 애플리케이션과 함께 자동으로 LiveReload 서버를 활성화한다.
- LiveReload 서버와 LiveReload 브라우저 플러그인을 연결하면, 브라우저에 전달되는 거의 모든 리소스에 변경이 생길 때 브라우저가 자동으로 새로고침 된다. (템플릿, 이미지, 스타일시트, 자바스크립트 등)
롬복
- 롬복은 어노테이션을 추가하면 컴파일 시 그에 상응하는 코드를 만들어주는 라이브러리이다.
- 롬복이 코드를 작성하려면 어노테이션 프로세서가 필요하며, 어노테이션 프로세서가 프로젝트 컴파일 시 고나련 코드를 자동으로 작성해준다. (getter, setter, builder, constructor 등)
- Builder는 오브젝트 생성을 위한 디자인 패턴 중 하나로, 생성자 매개변수의 순서를 기억할 필요가 없다는 것이 장점
- @NoArgsConstructor 어노테이션은 매개변수가 없는 생성자를 구현해주며, @AllArgsConstructor 어노테이션은 클래스의 모든 멤버 변수를 매개변수로 받는 생성자를 구현해준다.
테스트
test {
useJUnitPlatform()
}
- 그래들을 사용하면 빌드뿐만 아니라 유닛 테스트도 실행할 수 있으며, JUnitPlatform을 사용해 유닛 테스트 하도록 명시한다.
부트스트랩 클래스
- 부트스트랩 클래스는 애플리케이션을 부트스트랩하기 위한 최소한의 스프링 구성을 포함한다.
- @SpringBootApplication 어노테이션은 해당 클래스가 스프링 부트를 설정하는 클래스임을 의미하며, 아래 세 어노테이션이 결합한 것
- @SpringBootConfiguration: 현재 클래스를 구성 클래스로 지정한다. (@Configuration 어노테이션의 특화된 형태)
- @EnableAutoConfiguration: 스프링 부트의 자동-구성을 활성화하여, 우리가 필요로 하는 컴포넌트들을 자동으로 구성하도록 스프링 부트에 알려준다.
- @ComponentScan: 컴포넌트 검색을 활성화하여, 스프링이 @Component 어노테이션이 붙은 클래스를 찾아 스프링 애플리케이션 컨텍스트에 컴포넌트로 등록한다.
- 또한, 스프링은 @SpringBootApplication 어노테이션이 달린 클래스가 있는 패키지를 베이스 패키지로 간주한다.
- 스프링은 베이스 패키지와 그 하위 패키지에서 자바 빈을 찾아 스프링의 애플리케이션 컨텍스트에 등록하고, 애플리케이션 실행 중 어떤 오브젝트가 필요한 경우 의존하는 다른 오브젝트를 찾아 연결해준다
- main() 메서드는 실제로 애플리케이션을 시작시키고 스프링 애플리케이션 컨텍스트를 생성하는 SpringApplication 클래스의 run() 메서드를 호출한다.
- run() 메서드에 전달되는 두 개의 매개변수는 구성 클래스와 명령행 인자
애플리케이션 테스트
- 스프링 애플리케이션 컨텍스트가 성공적으로 로드될 수 있는지 확인하는 기본적인 검사를 수행한다.
- @SpringBootTest는 스프링 부트 기능으로 테스트를 시작하라는 것을 JUnit에게 알려준다.
- contextLoads() 처럼 실행 코드가 없더라도 @Test 어노테이션이 있으면 @SpringBootTest 어노테이션이 작업을 수행하여 애플리케이션 컨텍스트가 로드된다.
'Spring > Spring' 카테고리의 다른 글
빈 생명주기와 콜백 (0) | 2022.03.03 |
---|---|
의존관계 주입 방법 (0) | 2022.03.03 |
객체지향 설계와 스프링 (0) | 2022.02.28 |
@Bean과 @Component (0) | 2022.01.27 |
스프링 컨테이너와 컴포넌트 스캔 (0) | 2022.01.20 |