스프링이란?

  • 스프링 애플리케이션 컨텍스트(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)과 배치

  • 대부분의 애플리케이션은 다른 애플리케이션 또는 같은 애플리케이션의 서로 다른 컴포넌트를 통합할 필요가 있다.
  • 스프링 통합: 데이터가 사용 가능한 즉시 처리되는 실시간 통합
  • 스프링 배치: 다량의 데이터가 처리되는 시점을 트리거(대개 시간을 기준하는 트리거)가 알려줄 때 데이터가 수집 처리되는 배치 통합을 처리 해준다.

스프링 클라우드

  • 마이크로서비스를 스프링을 사용해서 개발하기 위한 프로젝트의 모음