이번 포스팅에서는 Spring Framework와 Spring Boot 에 대해 알아보겠습니다.
💡 Spring Framework가 뭐야?
Spring Framework는 자바 애플리케이션 개발을 위한 오픈소스로 공개된 애플리케이션 프레임워크입니다.
Spring 이 등장함으로 인해 개발자들이 기술을 사용하기 위해 불가피하게 작성해야했던 복잡한 코드들을 걷어내주었고,
이로 인해 코드의 복잡성을 낮춰주었다고 합니다.
Framework ?
프레임워크란, 어떠한 목적을 쉽게 달성할 수 있도록 해당 목적과 관련된 코드의 뼈대를 미리 만들어둔 것을 의미한다.
애플리케이션 프레임워크는 애플리케이션을 개발하는데에 있어 필요한 모든 업무 분야 및 기술과 관련된 코드들의 뼈대를 제공합니다.
Spring Framework의 특징 3가지를 알아보겠습니다.
1. 제어의 역전 (IoC, Inversion of Control)
일반적으로 개발자가 필요한 객체를 생성하고 해제하는 등 관리하는 방법이 아닌, 개발자가 객체를 선언해놓기만 하면 (애노테이션을 이용하면 간단하게 가능합니다) 스프링 컨테이너가 자동으로 객체를 생성해주고 객체의 라이프 사이클을 관리해주는 것입니다.
쉽게 말하면, 제어권이 개발자에게 있는게 아닌, 스프링 컨테이너에게 있다고 하여, 제어의 역전이라고 부릅니다.
아래에 나올 '의존성 주입'이 해당 IoC 특성을 이용하는 것입니다.
2. 의존성 주입 (DI, Dependency Injection)
의존성 주입의 의미는,
어떠한 객체가 다른 객체를 참조할 때, 참조 변수만 선언해놓으면 스프링 컨테이너가 현재 스프링 컨텍스트에 존재하는 객체를 찾아서 자동으로 주입해주는 것을 의미합니다.
이를 통해 개발자가 직접 인스턴스화하고자 하는 클래스의 생성자나 생성 메서드를 이용해서 호출하여 참조 변수에 할당하는 소스코드를 작성할 필요가 없게 됩니다.
아래 코드처럼 작성해두면, 스프링이 B를 A의 생성자를 통해 주입해주는 것을 수행해줍니다.
class A {
private final B b;
public A (B b) {
this.b = b;
}
}
또한 여기에 추상화까지 잘 이용하면, A 클래스가 B 클래스에 의존하던 것을 C 클래스에 의존하는 것으로 바꾸는 변화가 발생했을 때에
최소한의 수정만으로 변화를 유연하게 수용할 수 있게 됩니다.
3. 관점 지향 프로그래밍 (AOP, Aspect Oriented Programming)
관점 지향 프로그래밍은,
애플리케이션의 핵심적인 관심사 (비즈니스 로직)와 이를 가로지르는 관심사(Cross-Cutting Concerns)를 분리하여 프로그래밍하는 방식을 의미합니다.
만약 모든 메서드들의 실행 시간을 기록하고 싶다 가정하면,
모든 메서드들의 시작과 끝에 타이머 시작과 종료 코드를 넣어줘야합니다.
이럴 때 모든 메서드들의 시작과 끝에 동일한 로직들을 넣는 것이 아닌, 별개의 클래스로 둘 수 있습니다.
결국, 여기서는 메서드들의 실행 시간을 기록하는 것이 공통적인 "관점"이라고 볼 수 있겠습니다.
이외에도 로깅 기능, 보안 기능, 트랜잭션 관리 기능 등을 개발할 때 AOP를 적극 활용하는데요,
이러한 기능들은 여러 모듈에서 공통적으로 필요하지만, 각 모듈의 핵심 비즈니스 로직과는 직접적인 관련이 없기 때문입니다.
AOP는 이러한 공통 기능들을 별도의 모듈 (Aspect)로 분리하여 관리할 수 있게 하여
개발자들이 비즈니스 로직에 집중할 수 있게 되고 (유지보수 용이) , 코드의 중복을 제거할 수 있다는 큰 장점이 있습니다.
또한 AOP를 적용함으로써 **객체 지향 프로그래밍(OOP, Object Oriented Programming)을 잘 지킬 수 있게 됩니다.
**객체지향 프로그래밍 (OOP, Object Oriented Programming)
실세계의 문제를 해결하기 위해 소프트웨어 내에서 상태와 행동을 지닌 여러 객체들이 메세지를 주고 받으며 기능을 수행한다'는 관점으로 프로그래밍하는 방식을 의미합니다.
이러한 객체들을 조합하여 복잡한 시스템을 구축할 수 있게 됩니다.
스프링 프레임워크에서 AOP
스프링 프레임워크에서 AOP는 주로 어노테이션을 통해 구현됩니다. 예를 들어, 트랜잭션 관리를 위해 @Transactional 어노테이션을 사용하면, 해당 메서드의 실행을 하나의 트랜잭션으로 묶을 수 있습니다.
💡 Spring Boot가 뭐야?
Spring Boot는 Spring Framework를 사용하여 애플리케이션을 개발할 때 필요한 번거로운 설정 및 요구사항의 많은 부분에 대해
자동화를 지원하여 Spring Framework 기반 애플리케이션을 더 빠르게 실행 가능하도록 해주는 오픈소스 Java 프레임워크입니다.
특징
- Tomcat이나 Jetty, Undertow을 내장하고 있습니다. (WAS 설정X, WAR 파일 패키징할 필요 없이 JAR 파일로 패키징하여 바로 실행가능합니다.)
- 빌드 환경을 단순화할 수 있도록 'starter' 라이브러리를 통해 기본적으로 필요한 라이브러리들을 일괄 제공합니다. ex)
spring-boot-starter-web
- 라이브러리 버전 호환 자동화 (따로 라이브러리 버전을 관리할 필요 없습니다.)
- configuration 클래스 통한 간편한 설정 관리 (XML 설정 X)
- 설정의 자동화 (기존에 필요했던 설정들을 애노테이션을 통해 자동으로 등록해줍니다.)
- 배포에 필요한 준비 요소들을 제공합니다. (health check 등..)
참고
https://f-lab.kr/insight/understanding-oop-and-aop
https://spring.io/projects/spring-boot
'백엔드 개발하며 작성한 > Spring' 카테고리의 다른 글
[Spring Batch] 1. 스프링 배치 공부 순서와 간단 소개 (0) | 2023.06.11 |
---|---|
@Component에 대해 (@Bean) (0) | 2022.07.26 |
@RequestBody 붙였어?? (0) | 2022.07.13 |
Spring Boot에서 Connection Pool 이용하기 (HikariCP) (0) | 2022.04.10 |
Filter와 OncePerRequestFilter (0) | 2022.02.22 |