공부/Spring

[ Spring ] 스프링 부트란?

haena02 2023. 2. 23. 20:39
반응형

스프링 프레임워크는 자바 기반의 애플리케이션 프레임워크로 애플리케이션을 개발하기 위한 다양한 기능을 제공한다.

스프링은 목적에 따라 다양한 프로젝트를 제공하는데, 그중 하나가 스프링부트이다. 

 

1. 스프링 프레임워크

 

스프링은 자바에서 가장 많이 사용하는 프레임워크이다. 

스프링의 핵심가치는 다음과같다. 

"애플리케이션 개발에 필요한 기반을 제공해서 개발자가 비지니스 로직 구현에만 집중할 수 있게끔 하는것"

 

스프링을 효율적으로 사용할 수 있도록 스프링의 특징과 구조등을 알아보자!

 

제어역전 (IoC, Inversion of Control)

일반적인 자바 개발의 경우 사용하려는 객체를 선언하고 해당 객체의 의존성을 생성한 후 객체에서 제공한다.

하지만 제어역전을 특징으로 하는 스프링은 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리(생성, 주입,해제)를 IoC컨테이너에게 위임한다.

객체의 관리를 컨테이너에게 맡겼다는 점에서 제어역전이라고 부르며, 이를 통해 의존성 주입과 관점지향 프로그래밍이 가능해진다. 

 

*의존성이란? 

하나의 코드가 다른 코드에게 의존하는 상태를 의미한다.

의존한다는 것은 하나의 코드가 변경되었을 시 다른 코드도 영향을 받는다는 의미이다. 

 

의존성 주입 (DI, Dependency Injection)

의존성 주입이란 제어역전의 방법 중 하나로, 의존성 있는 코드에서 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식을 의미한다. 

스프링에서 의존성을 주입받는 방법은 다음과같이 세가지가 있다. 

  • 생성자를 통한 의존성 주입
  • 필드 객체 선언을 통한 의존성 주입
  • setter 메서드를 통한 의존성 주입

스프링에서는 @Autowired라는 어노테이션을 통해 의존성을 주입할 수 있다.

의존성을 주입한다는 것, 즉 객체를 주입받는다는 것은 외부에서 생성된 객체를 인터페이스를 통해 넘겨받는다는 것이고 이는 결합도를 낮춰 유연한 구조를 갖게한다.

 

권장하는 주입방법은 생성자를 통한 방법이다.

이유는 다른 방식과는 다르게 레퍼런스 객체 없이는 객체를 초기화할 수 없게 설계하기 때문이다.

코드는 다음과같다.

 

public class DIcontroller{

	MyService myservice;
    
    @Autowired
    public DIcontroller(MyService myservice){
    	this.myservice=myservice;
    }
}

 

 

관점 지향 프로그래밍 (AOP, Aspect-Oriented Programming)

 

AOP는 관점을 기준으로 묶어 개발하는 방식을 의미한다. 

여기서 관점이란 어떤 기능을 구현할 때 그 기능을  핵심기능과 부가기능으로 구분해 각각을 하나의 관점으로 보는것을 의미한다. 

 

핵심기능은 비지니스 로직을 구현하는 과정에서 비지니스 로직이 처리하려는 목적기능을 말한다.

부가기능은 핵심기능이 어떤 기능인지 무관하게 로직이 수행되기 전 또는 후에 수행하는 기능을 의미한다.

부가기능은 핵심기능과 상관없이 비슷한 로직으로 실행될 확률이 높으므로, AOP에서는 반복되는 부가기능을 하나의 공통 로직으로 처리하도록 모듈화한다. 

 

AOP를 구현하는 방법은 다음과같이 크게 세가지가 있다.

  • 컴파일 과정에서 삽입하는 방식
  • 바이트 코드를 메모리에 로드하는 과정에서 삽입하는 방식
  • 프락시 패턴을 이용한 방식

AOP의 목적은 OOP와 마찬가지로 모듈화해서 재사용 가능한 구성을 만드는 것이고, 모듈화된 객체를 편하게 적용시킬 수 있게 함으로써 개발자가 비지니스 로직을 구현하는데에만 집중할 수 있게 도와준다.

 

 

스프링의 다양한 모듈

 

스프링 프레임워크는 기능별로 구분된 약 20여개의 모듈로 구성돼 있다.

스프링을 사용한다고 해서 모든 모듈을 사용할 필요는 없으며 필요한 것들만 사용하면 된다.

이를 경량 컨테이서 설계라고 한다. 

 

 

2. 스프링 프레임워크 vs 스프링 부트

 

스프링에서 필요한 모듈을 추가하다 보면 설정이 복잡해진다.

이런 문제를 해결하기 위해 등장한 것이 스프링 부트이다. 

 

스프링 프레임워크랑 비교했을 때 스프링 부트가 가진 특징을 알아보자.

 

의존성 관리

스프링 부트에는 'spring-boot-starter'라는 의존성을 제공한다. 

이의 의존성은 여러 종류가 있고, 각 라이브러리의 기능과 관련해서 자주 사용되고 서로 호환되는 버전의 모듈조합을 제공한다. 

'spring-boot-starter'에는 다음과같은 내용이 들어있다.

  • web : 스프링 MVC를 사용하는 RESTful애플리케이션을 만들기 위한 의존성이다.
  • test : 테스트용 라이브러리를 포함한다.
  • jdbc : JDBC기능을 제공한다.
  • security : 스프링 시큐리티 기능을 제공한다.
  • jpa : JPA기능을 제공한다.

 

자동설정

스프링 부트는 스프링의 기능을 사용하기 위한 자동 설정을 지원한다.

자동설정은 애플리케이션에 추가된 라이브러리를 실행하는 데 필요한 환경 설정을 알아서 찾아준다.

즉, 애플리케이션을 개발하는 데 필요한 의존성을 추가하면 프레임워크가 이를 자동으로 관리해준다.

 

여기서 중요한 것은 @SpringBootApplication 어노테이션이다.

이 어노테이션을 사용한 다는 것은 다음의 세 어노테이션을 사용하는 것 과 같다.

  • @SpringBootConfiguration : 스프링부트 설정을 나타내는 어노테이션이다. 
  • @EnableAutoConfiguration :  sring-boot-autoconfigure패키지 안에 spring.factories 파일을 추가하여 미리 정의된 Bean을 가져와서 등록해준다. 
  • @ComponentScan : 해당 어노테이션이 위치한 패키지의 하위루트까지 쭉 가면서 @Component 시리즈가 붙어있는 클래스를 찾아 인스턴스를 생성하여 Bean을 등록한다.

 

내장 WAS

스프링 부트의 각 웹 애플리케이션에는 내장 WAS(Web application Server)가 존재한다.

웹 애플리케이션을 개발할 때 가장 기본이 되는 의존성인 'spring-boot-starter-web'의 경우 톰캣을 내장한다. 

필요에 따라서는 톰캣이 아닌 다른 웹 서버로 대체할 수도 있다. 

 

모니터링

개발이 끝나고 서비스를 운영할 때 해당 시스템이 사용하는 스레드, 메모리, 세션 등의 주요 요소들을 모니터링해야한다.

스프링부트에는 액추에이터라는 자체 모니터링 도구가 있다. 

반응형