스프링이란?#
- 스프링 애플리케이션 컨텍스트(Spring application context): 애플리케이션 컴포넌트들을 생성하고 관리하는 컨테이너.
- 빈(bean): 스프링에서 관리하는 애플리케이션 컴포넌트
- 빈의 상호 연결은 Depedency Injection이라고 알려진 패턴을 기반으로 수행된다.
- 스프링 애플리케이션 컨텍스트가 빈의 생성과 관리를 자체적으로 해주며, 모든 빈을 생성, 관리하고 빈을 필요로 하는 다른 빈을 주입한다.

- 지금까지의 스프링 버전에서는 XML 파일을 사용해서 빈을 상호 연결하도록 스프링 애플리케이션 컨텍스트에 알려줬다.
- 최신 버전에서는 자바 기반의 configuration이 더 많이 사용된다.
@Configuration
은 이것이 각 빈을 스프링 애플리케이션 컨텍스트에 제공하는 구성 클래스라는 것을 스프링에게 알려준다.- 구성 클래스의 메서드에는
@Bean
이 지정되어 있으며, 이것은 각 메서드에서 반환되는 객체가 애플리케이션 컨텍스트의 빈으로 추가되어야 한다는 것을 나타낸다.
@Configuration
class ServiceConfiguration {
@Bean
fun inventoryService(): InventoryService {
return InventoryService()
}
@Bean
fun productService(): ProductService {
return ProductService(inventoryService())
}
}
- 스프링은 자동으로 컴포넌트를 구성할 수 있는 자동-구성 기능이 있어서 별도의 XML 구성이나 자바 구성이 없어도 된다.
- 자동-구성은 autowiring(자동 연결)과 component scanning(컴포넌트 검색)이라는 스프링 기법을 기반으로 한다.
- component scanning을 사용하여 스프링은 자동으로 애플리케이션의 classpath에 지정된 컴포넌트를 찾은 후 스프링 애플리케이션 컨텍스트의 빈으로 생성할 수 있다.
- 자동 연결을 사용하여 의존 관계가 있는 컴포넌트를 자동으로 다른 빈에 주입한다.
- Spring Boot는 자동-구성 기능이 더욱 향상되었다.
- 스프링 부트의 자동-구성은 애플리케이션을 빌드하는 데 필요한 별도의 구성 코드(XML이나 자바)를 현격히 줄여준다.
스프링 애플리케이션 초기 설정하기#
스프링 프로젝트 구조 살펴보기#
mvnw
/mvnw.cmd
: 메이븐 래퍼 스크립트. 메이븐이 각자 컴퓨터에 설치되어 있지 않더라도 이 스크립트를 사용하여 프로젝트를 빌드할 수 있다.pom.xml
: 메이븐 빌드 명세를 지정한 파일application.properties
: 구성 속성을 지정할 수 있다.static
: 브라우저에 제공할 정적인 콘텐츠를 둘 수 있는 폴더templates
: 브라우저에 콘텐츠를 보여주는 템플릿 파일을 두는 폴더- 빌드 명세
<parent>
: 우리 프로젝트가 부모 POM(project object model)으로 spring-boot-start-parent를 갖는다.<dependencies>
: 의존성을 정의한다.<plugins>
: 플러그인을 지정한다.
- 스타터 의존성의 장점
- 우리가 필요로 하는 모든 라이브러리 의존성을 선언하지 않아도 되므로 빌드 파일이 훨씬 더 작아지고 관리하기 쉬워진다.
- 라이브러리 이름이 아닌 기능 관점으로 의존성을 생각할 수 있다.
- 라이브러리드릐 버전을 걱정하지 않아도 된다.
- 플로그인의 중요 기능
- 메이븐을 사용하는 애플리케이션을 실행할 수 있게 해준다.
- 의존성에 지정된 모든 라이브러리가 실행 가능 JAR 파일에 포함되어 있는지 그리고 런타임 시에 classpath에서 찾을 수 있는지 확인한다.
- 실행 가능 JAR 파일의 메인 클래스로 부트스트랩 클래스를 나타내는 매니페스트 파일을 JAR 파일에 생성한다.
@SpringBootApplication
은 다음 세 개의 애노테이션을 결합한 것이다.@SpringBootConfiguration
: 현재 클래스를 구성 클래스로 지정한다. @Configuration
의 특화된 형태다.@EnableAutoConfiguration
: 스프링 부트 자동-구성을 활성화한다.@ComponentScan
: 컴포넌트 검색을 활성화한다. @Component
, @Controller
, @Service
등의 애노테이션과 함께 클래스를 선언하면 자동으로 찾아서 스프링 애플리케이션 컨텍스트에 컴포넌트로 등록한다.
run()
메서드에 전달되는 두 매개변수는 구성 클래스와 명령행 인자다.- kotlin의 경우는 명령행 인자만 전달된다.
@SpringBootApplication
class StudyApplication
fun main(args: Array<String>) {
runApplication<StudyApplication>(*args)
}
@SpringBootTest
- 스프링 부트 기능으로 테스트를 시작하라는 것을 JUnit에 알려준다.
- 스프링 애플리케이션 컨텍스트를 로드하는 작업을 수행한다.
- 하지만 테스트 메서드가 없으면 로드하지 않는다. 빈 테스트 메서드라도 있으면 로드를 진행한다.
스프링 애플리케이션 작성하기#
웹 요청 처리하기#
- 컨트롤러: 웹 요청과 응답을 처리하는 컴포넌트
@Controller
- 컴포넌트로 식별되게 해준다.
@Component
, @Service
, @Repository
등 소수의 다른 애노테이션도 동일한 기능을 제공해준다.
- 컨트롤러라는 역할을 잘 설명해준다.
컨트롤러 테스트하기#
@WebMvcTest
- 스프링 MVC를 테스트하기 위한 스프링 지원을 설정한다.
- 실제 서버를 시작하는 대신
@Controller
, @ControllerAdvice
, Filter
, @HandlerInterceptor
, WebMvcConfigurer
, HandlerMethodArgumentResolver
등의 빈을 자동-구성한다. - 일반적인
@Conponent
와 @ConfigurationProperties
빈은 스캔하지 않는다. @MockBean
을 통해 mock 구현체를 사용할 수도 있다.MockMvc
또한 자동-구성된다. Mock MVC는 MVC 컨트롤러를 빠르게 테스트할 수 있는 방법을 제공한다.
@WebMvcTest(HomeController::class)
class HomeControllerTest(@Autowired val mockMvc: MockMvc) {
@Test
fun testHomePage() {
mockMvc.perform(get("/")) // GET /를 수행한다.
.andExpect(status().isOk) // HTTP 200이 되어야 한다.
.andExpect(view().name("home")) // home 뷰가 있어야 한다.
.andExpect(content().string(
containsString("Welcome to...") // 콘텐츠에 다음 문자열이 있어야 한다.
))
}
스프링 부트 자동-구성#
- 스프링 부트의 자동-구성에서 의존성 라이브러리들을 감지하고 자동으로 다음의 일을 수행할 수 있다.
- 스프링 MVC를 활성화하기 위해 스프링 애플리케이션 컨텍스트에 관련된 빈들을 구성한다.
- 내장된 톰캣 서버를 스프링 애플리케이션에 구성한다.
- 템플릿 엔진을 사용중일 경우 해당 뷰 리졸버 구성
스프링 살펴보기#
핵심 스프링 프레임워크#
- 스프링 MVC
- 웹 요청을 처리하기 위해 컨트롤러 클래스를 작성할 수 있다.
- HTML이 아닌 출력을 생성하는 REST API를 만들 수 있다.
- 템플릿 기반의 JDBC 지원(
JdbcTemplate
)을 포함해서 기본적인 데이터 퍼시스턴스 지원 - 리액티브 프로그래밍 지원
- 스프링 MVC 개념의 스프링 WebFlux라는 새로운 리액티브 웹 프레임워크 포함
스프링 부트#
- Actuator
- 애플리케이션의 내부 작동을 런타임 시에 살펴볼 수 있는 기능
- metric, 스레드 덤프 정보, 애플리케이션의 상태, 애플리케이션에서 사용할 수 있는 환경 속성 등
- 환경 속성의 명세
- 핵심 프레임워크에 추가되는 테스트 지원
- 스프링 부트 CLI 제공
- 스프링 부트 CLI를 사용하면 애플리케이션 전체를 그루비 스크립트들로 작성하여 명령행에서 실행할 수 있다.
스프링 데이터#
- 간단한 자바 인터페이스로 애플리케이션의 데이터 리퍼지터리를 정의할 수 있다.
- 데이터를 저장하고 읽는 메서드를 작명 규칙을 사용해서 정의한다.
- JPA, Mongo, Neo4j 등
스프링 시큐리티#
- 인증, 인가, API 보안을 포함하는 폭넓은 범위의 애플리케이션 보안 요구를 다룬다.
스프링 통합(Integration)과 배치#
- 대부분의 애플리케이션은 다른 애플리케이션 또는 같은 애플리케이션의 서로 다른 컴포넌트를 통합할 필요가 있다.
- 스프링 통합: 데이터가 사용 가능한 즉시 처리되는 실시간 통합
- 스프링 배치: 다량의 데이터가 처리되는 시점을 트리거(대개 시간을 기준하는 트리거)가 알려줄 때 데이터가 수집 처리되는 배치 통합을 처리 해준다.
스프링 클라우드#
- 마이크로서비스를 스프링을 사용해서 개발하기 위한 프로젝트의 모음