스프링 부트는 자바 기반의 오픈 소스 프레임워크인 스프링(Spring)을 기반으로 한, 웹 애플리케이션과 마이크로서비스를 빠르고 쉽게 개발하고 실행할 수 있도록 도와주는 도구입니다. 스프링 프레임워크는 기능이 강력하고 확장성이 뛰어난 프레임워크이지만, 초기에 설정과 환경 구축이 복잡하다는 단점이 있었습니다. 이러한 단점을 보완하기 위해 스프링 프레임워크를 기반으로 하는 스프링 부트가 등장하게 되었다.
💡 SpringFramwork 핵심
📌 제어 역전 (IoC : Inversion of Control)
스프링에서는 프로그램의 흐름을 프레임워크가 주도한다. 객체의 생성부터 생명주기 관리를 컨테이너가 도맡아서 한다. 즉, 제어권이 컨테이너로 넘어가게 되고, 이것을 제어권의 흐름이 바뀌었다고 해서 IoC(Inversion of Control: 제어의 역전)이라고 한다. 제어권이 컨테이너로 넘어옴으로써 DI(의존성 주입), AOP(관점 지향 프로그래밍) 등이 가능해졌다. 의존성을 역전시켜 객채 간에 결합도를 줄이고, 유연한 코드를 작성할 수 있게 됨에 따라 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있게 해 준다.
📌 의존성 주입 (DI : Dependency Injection)
스프링이 다른 프레임워크와 차별화되어 제공하는 의존 관계 주입 기능. 객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입시켜 주는 방식이다. 이를 통해 모듈 간의 결합도가 낮아지고 유연성이 높아진다.
/*
Setter Injection
의존성을 입력 받는 setter 메서드를 만들고 이를 통해서 의존성을 주입한다.
*/
public class SampleController {
private SampleRepository sampleRepository;
@Autowired // 있어도 되고, 없어도 됨
public void setSampleRepository(SampleRepository sampleRepository) {
this.sampleRepository = sampleRepository;
}
}
/*
Contructor Injection
필요한 의존성을 포함하는 클래스의 생성자를 만들고 이를 통해 의존성을 주입한다.
*/
public class SampleController {
private SampleRepository sampleRepository;
public SampleController(SampleRepository sampleRepository) {
this.sampleRepository = sampleRepository;
}
}
/*
Field Injection
의존성을 주입할 변수에 @Autowired 어노테이션을 붙인다.
*/
public class SampleController {
@Autowired
private SampleRepository sampleRepository;
}
이 외에도 Lombok 라이브러리를 사용해 @AllArgsConstructor, @RequiredArgsConstructor 어노테이션을 통해 자동 생성자 메서드를 사용할 수 있다. 특히 @RequiredArgsConstructor의 경우, 의존성을 주입받을 객체를 private final로 선언되어 생성 시점에 딱 한 번만 주입받을 수 있도록 하기 때문에 불필요한 변경점이 발생하지 않아 안전하다. 권장하는 방법은 생성자를 통한 주입이다.
📌 관점 지향 프로그래밍 (AOP : Aspect Oriented Programming)
객체 지향 프로그래밍 패러다임을 보완하는 기술로 메서드나 객체의 기능을 핵심 관심사(Core Concern)와 공통 관심사(Cross-cutting Concern)로 나누어 프로그래밍하는 것을 말합니다. “핵심 관심사”는 각 객체가 가져야 할 본래의 기능이며, “공통 관심사”는 여러 객체에서 공통적으로 사용되는 코드를 말합니다.
여러 개의 클래스에서 반복해서 사용하는 코드가 있다면 해당 코드를 모듈화 하여 공통 관심사로 분리합니다. 이렇게 분리한 공통 관심사를 Aspect로 정의하고 Aspect를 적용할 메서드나 클래스에 Advice를 적용하여 공통 관심사와 핵심 관심사를 분리할 수 있습니다. 이렇게 AOP에서는 공통 관심사를 별도의 모듈로 분리하여 관리하며, 이를 통해 코드의 재사용성과 유지 보수성을 높일 수 있습니다.
📌 AOP 주요 용어
Aspect
공통적인 기능들을 모듈화 한것을 의미합니다.
Target
Aspect가 적용될 대상을 의미하며 메소드, 클래스 등이 이에 해당 됩니다.
Join point
Aspect가 적용될 수 있는 시점을 의미하며 메소드 실행 전, 후 등이 될 수 있습니다.
Advice
Aspect의 기능을 정의한 것으로 메서드의 실행 전, 후, 예외 처리 발생 시 실행되는 코드를 의미합니다.
Point cut
Advice를 적용할 메소드의 범위를 지정하는 것을 의미합니다.
📌 주요 어노테이션
@Aspect
해당 클래스를 Aspect로 사용하겠다는 것을 명시합니다.
@Before
대상 “메서드”가 실행되기 전에 Advice를 실행합니다.
@AfterReturning
대상 “메서드”가 정상적으로 실행되고 반환된 후에 Advice를 실행합니다.
@AfterThrowing
대상 “메서드에서 예외가 발생”했을 때 Advice를 실행합니다.
@After
대상 “메서드”가 실행된 후에 Advice를 실행합니다.
@Around
대상 “메서드” 실행 전, 후 또는 예외 발생 시에 Advice를 실행합니다.
🤔 스프링 & 스프링 부트의 차이
Spring Boot는 Spring framework와 몇 가지면에서 차이가 있다.
Embed Tomcat을 사용하기 때문에, (Spring Boot 내부에 Tomcat이 포함되어 있다.) 따로 Tomcat을 설치하거나 매번 버전을 관리해 주어야 하는 수고로움을 덜어준다.
starter을 통한 dependency 자동화 :아마 Spring 유저들이 가장 열광한 기능이 아닐까 싶다. 과거 Spring framework에서는 각각의 dependency들의 호환되는 버전을 일일이 맞추어 주어야 했고, 때문에 하나의 버전을 올리고자 하면 다른 dependeny에 까지 영향을 미쳐 version관리에 어려움이 많았다. 하지만, 이제 starter가 대부분의 dependency를 관리해 주기 때문에 이러한 걱정을 많이 덜게 되었다.
XML설정을 하지 않아도 된다.
jar file을 이용해 자바 옵션만으로 손쉽게 배포가 가능하다. Spring Actuaor를 이용한 애플리케이션의 모니터링과 관리를 제공한다.