Spring-스프링 이란

업데이트:

스프링 5 변화
  • 리액티브 프로그래밍(Reactive Programming)의 지원
    • 변화의 전파와 데이터 흐름과 관련된 선언적 프로그래밍 패러다임이다.
    • 변화의 전파와 데이터 흐름 : 데이터가 변경될 때마다 이벤트를 발생시켜서 데이터를 계속적으로 전달한다.
    • 선언적 프로그래밍 : 실행할 동작을 구체적으로 명시하는 명령형 프로그램과 달리 선언형 프로그래밍은 단순한 목표를 선언한다.
    • 스프링 WebFlux
      • 스프링 MVC의 프로그래밍 모델을ㅇ 가져와서 만들어졌지만, 스프링 MVC와 많은 컴포넌트를 공통으로 사용하며, 같은 애노테이션을 공유한다.
      • 개발자들이 더 쉬우면서 확장성이 좋은 웹 애플리케이션을 개발할 수 있다. 또한 이제는 스프링 데이터에서도 리액티브하면서 블로킹이 없는 데이터 리퍼지터리를 생성할수 있따.
스프링이란?
  • 스프링 애플리케이션 컨텍스트 라는 컨테이너를 제공하고 애플리케이션 컴포넌트들을 생성하고 관리한다.
  • 애플리케이션 컴포넌트 또는 빈들은 스프링 애플리케이션 컨텍스트 내부에서 서로 연결되어 완전한 애플리케이션을 만든다. 벽돌, 모르타르, 목재, 못, 배관, 배선이 함꼐 어우러져 집을 구성하는 것과 비슷히다.
  • 빈의 상호 연결은 의존성 주입이라고 알려진 패턴을 기반으로 수행된다.
    • 애플리케이션 컴포넌트에서 의존하는 다른 빈의 생성과 관리를 자체적으로 하는대신 별도의 개체(컨테이너)가 해주며, 이 개체에서는 모든 컴포넌트르 생성, 관리하고 해당 컴포넌트를 필요로 하는 빈에 주입한다.
    • 일반적으로 이것은 생성자 인자 또는 속성의 접근자 메서드를 통해 처리된다.
  • 기존의 스프링에서는 XML을 통해서 빈을 관리했으나 최신의 스프링은 자바 기반의 구성이 더 많이 사용된다.
    • @Configuration 애노테이션은 이것이 각 빈을 스프링 애플리케이션 컨텍스트에 제공하는 구성 클래스라는 것을 스프링에게 알려준다.
    • 구성 클래스의 메서드에는 @Bean 애노테이션이 지정되어 있으며, 이것은 각 메서드에서 반환되는 객체가 애플리케이션 컨텍스트의 빈으로 추가되어야 한다는 것을 나타낸다.
      • 기본적으로 각 빈의 ID가 해당 빈을 정의하는 메서드의 이름과 동일하다
    • XML 기반 구성에 비해 더 강화된 타입 안전과 향상된 리팩토링 기능을 포함한 몇 가지 장점이 있다.
    • 기본적으로 스프링은 자동으로 컴포넌트를 구성할 수 있는 자동-구성 기능이 있어서 별도의 XML 구성이나 자바 구성이 없어도 된다.
      • 자동연결, 컴포넌트 검색이라는 스프링 기법을 기반으로 작동하는데 애플리케이션의 classpath에 지정된 컴포넌트를 찾은 후 스프링 애플리케이션 컨텍스트의 ㅂㄴ으로 생성할 수 있다.
스프링 애플리 케이션 초기 설정
  • 스프링 이니셜라이저(Initializr)
    • REST API를 사용하는 브라우저 기반의 웹 애플리케이션이며, 우리가 원하는 기능을 구현할 수 있는 스프링 프로젝트의 구조를 생성해준다.
  • Packaging
    • WAL : 기존의 자바 애플리케이션 서버에 애플리케이션을 배포할 때 사요도미ㅕ 대부분의 클라우드 플랫폼에는 잘 맞지 않거 일부 클라우드 플랫폼에서는 가능하다.
    • JAR : 라이브러리와 데이크톱 UI 애플리케이션의 패키징에 사용되고 모든 자바 클라우드 플랫폼에서 사용이 가능하다
  • 스프링 구조
    • 전형적인 메이븐 또는 그래들 프로젝트 구조로 되어 있다.
    • 소스 코드 : src/main/java
    • 테스트 코드 : src/test/java
    • 자바 리소스가 아닌것 : src/main/resources
    • 주요 항목
      • mvnw, mvnw.cmd: 메이븐 래퍼 스크립트, 메이븐이 설치되어 있지 않더라도 이 스크립트르 사용하여 프로젝트 빌드 가능
      • pom.xml : 메이븐 빌드 명세를 지정한 파일
      • TacoCloudApplication.java(테스트 프로젝트 파일) : 스프링 부트 메인 클래스
      • application.properties : 구성 속성 지정
      • static : 브라우저에 제공할 정적인 콘텐츠(이미지, CSS, JS…)가 저장된 폴더
      • templates : 브라우저에 콘텐츠를 보여주는 템플릿 파일을 두는 폴더
      • TacoCloudApplicationTests.java : 스프링 애플리케이션이 성공적으로 로드되는지 확인하는 간단한 테스트 클래스
  • pom.xml
    • 빌드 명세를 정의한다.
    • 요소의 : 프로젝트가 부모 POM(Project Object Model)으로 spring-boot-starter-parent를 갖는다는 것을 지정한다.
      • 부모 POM은 스프링 프로젝트에 흔히 사용되는 여러 라이브러리의 의존성 관리를 제공한다.
      • RELEAse 버전은 스프링 부트 버전을 나타내며 이 스프링 부트 버전에 의해 정의된 의존성 관리를 계승한다.
      • 의존성은 요소에 정의되며, STS의 프로젝트 위저드에서 선택한 각 의존성이 요소로 지정된다.
    • pom.xml 파일의 제일 끝에는 스프링 부트 플러그인이 지정된다.
      • 메이븐을 사용하는 애플리케이션을 실행할수 있게 해준다.
      • 의존성에 지정된 모든 라이브러리가 실행 가능 JAR 파일에 포함되어 있는지 그리고 런타입 시에 classpath에서 찾을 수 있는지 확인한다.
      • 실행 가능 JAR 파일의 메인 클래스로 부트스트랩 클래스를 나타내는 매니페스트 파일을 JAR 파일에 생성한다.
  • @SpringBootApplication는 @SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan의 결합이다.
@SpringBootApplication // 스프링 부트 애플리케이션임을 나타낸다.
public class TacoCloudApplication {
	public static void main(String[] args) {
		SpringApplication.run(TacoCloudApplication.class, args); // 애플리케이션을 실행한다.
	}
}
웹 요청 처리
  • 스프링은 스프링 MVC라고 하는 강력한 웹 프레임워크를 갖고 있다. 스프링 MVC의 중심에는 컨트롤러가 있으며, 이것은 웹 요청과 응답을 처리하는 컴포넌트다.
  • 웹 브라우저를 상대하는 애플리케이션의 경우에 컨트롤러는 선택적으로 모델 데이터를 채워서 응답하며, 브라우저에 반환되는 HTML을 생성하기 위해 해당 응답의 웹 요청을 뷰에 전달한다.
  • 타임리프(Thymeleaf)
    • 뷰 템플릿으로 html태그를 기반으로 하여 th:속성을 이용하여 동적인 View를 제공한다.
      • html문서언어는 한글이며 타임리프를 사용하겠다는 말이다.
    • 변수식으로 사용하는 ${}, 메세지 방식#{}, 객체변수식인 *{}, 링크방식 @{} 있다.
  • @WebMvcTest
    • 스프링 부트에서 제공하는 특별한 테스트 애노테이션이며, 스프링 MVC 애플리케이션의 형태로 테스트가 샐행되도록한다.
    • 테스트를 하려고하는 컨트롤러에 스프링 MVC가 등록이 되고 스프링 MVC에 웹 용청을 보낼수 있다.
    • 스프링 MVC 모의 메커니즘을 사용할 수 있고 테스트 클래스에 MockMvc 객체를 주입할 수 있다.
  • Boot Dashboard
    • 스프링 부트 프로젝트의 목록이 나오며 프로젝트 시작 및 중단 디버깅 모드를 사용할 수 있다.
    • 스프링 부트 애플리케이션에는 실행에 필요한 모든 것이 퐇마된다. 따라서 톰캣과 같은 애플리케이션 서버에 별로도 애플리케이션을 설치할 필요가 없다.
스프링 부트 DevTools
  • 스프링 개발자에게 편리한 도구를 제공한다, 각종 IDE의 플러그인이 아니며 특정 IDE를 사용해야 되는 것도 아니다.
  • 사용중일때 애플리케이션은 JVM에서 두개의 클래스 로더에 의해 로드된다. 그중 하나는 자바코드, 속성파일, 프로젝트의 main 경로에 있는 모든것이 로드된다.
  • 제공항목
    • 코드가 변경될 때 자동으로 애플리케이션을 다시 시작한다.
    • 브라우저로 전송되는 리소스(템플릿, JS, CSS)가 변경될때 자동으로 브라우저를 새로고침힌다.
    • 템플릿 캐시를 자동으로 비활성화 한다.
    • H2 데이터베이스가 사용중이면 자동으로 H2콘솔을 활성화 한다.
  • LiveReload
  • 템플릿을 변경하고 새로고침을 누르지 않아도 자동으로 그 결과를 볼 수 있다.
  • 사용하는 클라이어트 PC의 브라우져에서 플러그인을 설치해야 한다.
핵심 스프링 프레임워크
  • 스프링 MVC
    • 스프링의 웹 프레임 워크이며 웹 요청을 처리하기 위해 사용되며 HTML이 아닌 출력을 생성하는 REST API를 만들 떄도 스프링 MVC를 사용할 수 있다.
  • 템플릿 기반의 JDBC
  • 데이터 퍼시스턴스 지원
    • 애플리케이션을 종료하고 다시 실행하더라도 이전에 저장된 데이터를 다시 불러올 수 있다.
  • 리액티브 프로그래밍 지원
    • 스프링 MVC 개념의 스프링 WebFlux라는 새로운 리액티브 웹 프레임 워크가 포함된다.
스프링 핵심 기능
  • 스프링 부트
    • 스타터 의존성과 자동구성
    • 액추에이터는 애플리케이션의 내부 작동을 런타임 시에 살펴볼 수 있는 기능을 제공하며, 여기에는 메트릭, 스레드 덤프 정보, 애플리케이션의 상태, 애플리케이션에서 사용할 수 있는 환경 속성이 포함된다.
    • 환경 속성의 명세
    • 핵심 프레임워크에 추가되는 테스트 지원
  • 스프링 데이터
    • 간단한 자바 인터페이스로 애플리케이션의 데이터 리퍼지터리를 정의 할수 있다.
    • 서로 다른 종류의 데이터베이스와 함께 사용될 수 있다.
      • JPA, mongo, Neo4j 등..
  • 스프링 시큐리티
    • 인증, 허가, API 보안을 포함하는 폭 넓은 범위의 애플리케이션 보안 요구를 다룬다.
  • 스프링 통합과 배치
    • 대부분의 애플리케이션은 다른 애플리케이션 또는 같은 애플리케이션의 서로 다른 컴포넌트를 통합할 필요가 생간다. 이런 요구사항을 해결하기 위한 이미알려진 몇가지 통합 패턴이 있다. 스프링 통합과 스플이 배치는 스프링 기반 애플리케이션의 이런 패턴 구현을 제공한다.
  • 스프링 클라우드
    • 애플리케이션을 거대한 하나의 단일체로 개발하는게 아닌 마이크로서비스라는 여러 개의 개별적인 단위들로 합성하는 것이다.
    • 마이크로 서비스는 애플리케이션 개발과 실행에서 많은 관심을 받은 주제로 스프링을 사용해서 클라우드 애플리케이션을 개발하기 위한 프로젝트들의 모음인 스플링 클라우드를 사용한다.
정리
  • 웹 애플리케이션 생성, 데이터베이스 사용, 애플리케이션 보안, 마이크로 서비스 등에서 개발자의 노력을 덜아주는 것이 스프링의 목표다
  • 스프링 부트는 손쉬운 의존성 관리, 자동구성, 런타임 시의 애플리케이션 내부 작동 파악을 스프링에서 할수 있게 한다.
  • 스프링 애플리케이션은 스프링 Initializr를 사용해서 초기 설정할 수 있다. 스프링 Initializr는 웹을 기반으로 하며, 대부분의 자바 개발 환경을 지원한다.
  • 빈 이라고 하는 컴포넌트는 스프링 애플리케이션 컨테그스테서 자바나 XML로 선언할 수 있으며, 컴포넌트 탐색으로 찾거나 스프링 부트 자동 구성에서 자동으로 구성할 수도 있다.

댓글남기기