스프링 부트란?
스프링 프레임워크(Spring Framework)는 자바(Java) 기반의 애플리케이션 프레임워크로 엔터프라이즈급 애플리케이션을 개발하기위한 기능을 제공합니다. 스프링(Spring)은 목적에 따라서 다양한 프로젝트를 제공하는데, 그중 하나가 스프링 부트(Spring Boot)입니다.
애플리케이션 프레임워크?
프레임워크란, 자동차를 만드려면, 차의 기본 베이스가 되는 차체와 같습니다. 웹 개발에 있어서 어떠한 목적을 쉽게 달성할 수 있도록 해당 목적과 관련된 코드의 뼈대를 미리 만들어둔 것을 의미합니다.애플리케이션 프레임워크는 애플리케이션 개발에 집중된 코드와 기술들의 뼈대를 제공해줍니다.
'엔터프라이즈급 개발'은 기업 환경을 대상으로 하는 개발을 뜻합니다. 대규모의 데이터를 처리하는 환경을 엔터프라이즈급 환경이라고 부릅니다. 스프링은 이러한 환경에 알맞게 설계되어 있어 개발자는 애플리케이션을 개발할 때 많은 요소를 프레임워크에 위임하고 비즈니스 로직을 구현하는데 집중할 수 있습니다.
제어역전(IoC)
스프링부트는 스프링의 핵심 개념 중 하나인 제어역전(Inversion of Control, IoC)을 강력하게 지원합니다.
일반적인 자바 개발의 경우 객체를 사용하기 위해서 사용하려는 객체를 선언하고, 해당 객체의 의존성을 생성한 후 객체에서 제공하는 기능을 사용합니다. 제어역전(IoC)은 개발자가 코드의 제어 흐름을 직접 관리하는 것이 아니라, 프레임워크가 그 역할을 대신하도록 하는 디자인 패턴입니다. 개발자가 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 외부(스프링 컨테이너, IoC컨테이너)에 위임합니다.
의존성 주입
스프링부트에서 IoC는 "의존성 주입(Dependency Injection, DI)"을 통해 구현됩니다. 의존성 주입은 객체 간의 의존 관계를 느슨하게 만들어주는 방식으로, 객체가 직접 필요로 하는 의존 객체를 스프링 컨테이너라는 곳에서 주입받는 것을 의미합니다. 개발자는 객체 간의 의존성을 설정하고, 스프링이 이를 바탕으로 필요한 객체를 생성하고 주입해줍니다.
// 의존성 주입 전 예시
public class Car {
private Engine engine;
public Car() {
this.engine = new Engine(); // 자동차 객체가 엔진 객체를 생성
}
public void start() {
engine.start(); // 자동차가 엔진을 사용하여 출발
}
}
쉽게 설명하자면, 의존성 주입(Dependency Injection)은 객체들 사이의 관계를 설정해주는 방법 중 하나입니다.한 객체가 다른 객체를 사용할 때를 상상해 봅시다. 예를 들어, 우리가 자동차를 만들고 있다고 하고, 자동차는 엔진이 필요합니다. 일반적으로 자동차 객체가 직접 엔진 객체를 생성하고 사용하는 방식은 위와 같을 것입니다.
하지만 이렇게 하면 자동차 객체가 엔진에 대한 의존성을 갖게 되고, 자동차 객체를 테스트하거나 유연하게 변화시키기 어려워집니다.
// 의존성 주입 후 예시
public class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine; // 외부에서 엔진 객체를 주입받음
}
public void start() {
engine.start(); // 자동차가 주입받은 엔진을 사용하여 출발
}
}
이렇게 하면, 이제 자동차 객체는 엔진 객체를 직접 생성하지 않고, 생성자를 통해 외부에서 주입받습니다. 이렇게 함으로써 자동차 객체는 엔진에 대한 의존성을 완전히 분리시킬 수 있습니다. 이는 테스트나 유지보수, 확장성 측면에서 매우 유용합니다.
스프링에서의 의존성 주입
스프링에서는 @Autowired라는 어노테이션(annotation)을 통해 의존성을 주입할 수 있습니다. @Autowired를 사용하면 스프링 컨테이너는 해당 필드, 생성자 또는 메서드에 대해 자동으로 의존성을 해결하여 해당 객체를 주입합니다.
4.3버전 이후로는 의존성을 주입할 때, 해당 어노테이션을 생략할 수도 있지만 가독성을 위해 명시하는 것이 좋습니다.
@Service
public class MyService {
// Autowired 사용 예시
private MyRepository myRepository;
@Autowired
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
// setter 메서드를 사용한 의존성 주입
@Autowired
public void setMyRepository(MyRepository myRepository) {
this.myRepository = myRepository;
}
}
위의 코드에서 MyService 클래스는 @Service 어노테이션으로 스프링 Bean으로 등록되어 있습니다. MyService는 MyRepository에 의존합니다.
생성자를 통한 의존성 주입은 위 예시 코드에서 MyService 클래스의 생성자에서 @Autowired 어노테이션을 생성자에 적용하면 스프링은 MyRepository를 찾아 자동으로 주입합니다.
Setter 메서드를 사용한 의존성 주입은 setMyRepository() 메서드에서 @Autowired 어노테이션을 메서드에 적용하면 스프링은 MyRepository를 찾아 주입합니다.
이외에도 필드객체나 일반 메서드를 통해서 의존성을 주입할 수도 있습니다.
관점지향 프로그래밍(AOP)
관점 지향 프로그래밍(AOP, Aspect-Oriented Programming)은 스프링의 중요한 특징이자 소프트웨어 개발에서 모듈화의 한 가지 방법입니다. AOP는 여러 모듈 또는 관심 영역(Aspect)을 개발하는 데 사용됩니다. 여기서 관심 영역(Aspect)란 어떤 기능을 구현할 때 그 기능을 핵심기능 부가기능같이 관점으로 보는 것을 의미합니다. 예를 들어, 로깅을 담당하는 관심 영역, 트랜잭션 관리를 담당하는 관심 영역 등이 있습니다.
위의 그림을 예시로 들면, Login, Sale, Download 서비스는 각각 다른 기능으로 각자 로직이 구현되어 있습니다. 하지만 DB에 접근하거나 유지보수를 할 때, 작성된 로깅, 트랜잭션은 동일한 기능을 수행할 확률이 높습니다.즉, 각 서비스에 동일한 코드가 포함된다는 것을 의미합니다. AOP관점에서는 서비스랑 상관없이 로깅이나 트랜직션이 로직이 수행되기 전 후로 수행되기만 하면 되므로 하나의 공통적으로 처리하도록 모듈화 하는 방식을 AOP라고 합니다.
간단히 말하면, 스프링 부트의 AOP는 핵심 비즈니스 로직과는 독립적인 부가적인 기능들을 모듈화하여 적용하는 프로그래밍 방법입니다. 이를 통해 코드의 재사용성과 유지보수성을 높일 수 있습니다.
스프링 프레임워크 > 스프링 부트
스프링 프레임워크는 기존 개발 방식의 문제와 한계를 극복하기 위해 다양한 기능을 제공하지만, 기능이 많은 만큼 설정이 복잡합니다. 이처럼 많은 모듈들을 추가하다보면 설정이 복잡해지는 문제를 해결하기 위해 스프링 부트(Spring Boot)가 있습니다.
- 의존성관리
스프링 프레임워크에서 모듈의 의존성을 직접 설정해야했던 불편함이 있었지만, 스프링 부트에서는 'spring-boot-starter'라는 의존성을 제공합니다. 각 라이브러리의 기능과 관련해서 자주 사용되고 호환되는 버전의 모듈 조합을 제공합니다.
-자동 설정
스프링 부트는 스프링 프레임워크의 기능을 사용하기 위한 자동 설정(Auto Configuration)을 지원합니다. 애플리케이션에 추가된 라이브러리를 실행하는데 필요한 설정을 알아서 찾아줍니다.
-내장 WAS
스프링 부트의 각 웹 애플리케이션은 내장 WAS(Web Application Server)가 존재합니다. 가장 기본적인 의존성인 'spring-boot-starter-web'의 경우 톰캣을 내장하고 있습니다. 덕분에 특별한 설정 없이 톰캣을 실행할 수 있습니다.
'Backend > Spring Boot' 카테고리의 다른 글
Spring Boot - Spring Data JPA 활용 (0) | 2023.07.29 |
---|---|
Spring Boot - API를 작성하는 다양한 방법 (0) | 2023.07.23 |
Spring boot - VScode로 시작하기 (0) | 2023.07.16 |
Spring boot - 데이터베이스 연동 (0) | 2023.07.15 |
Spring Boot 개발에 앞서 알면 좋은 기본 지식 (2) | 2023.07.08 |