본문 바로가기

Spring공부

스프링 부트

스프링과 스프링 부트

스프링은 장점이 많은 개발 도구이지만 설정이 매우 복잡하다는 단점이 있다. 그래서 스프링을 개발팀에서 이란 단점을 인식하고 단점을 보완하고자 스프링 부트를 출시했다. 스프링 부트는 스프링 프레임워크를 더 쉽고 빠르게 이용할 수 있도록 만들어주는 도구 이다. 빠르게 스프링 프로젝트를 설정할 수 있고 의존성 세트라고 불리는 스타터를 사용해 간편하게 의존성을 사용하거나 관리 할 수 있다. 스프링 부트는 개발자가 조금 더 비즈니스 로직 개발에만 집중할 수 있도록 만들어주는 도구이다.

 

참고로 스프링 부트와 스프링이 다른 도구라고 생각하는 사람들이 있는데. 스프링 부트는 스프링에 속한 도구이다. 단, 스프링과 스프링 부트는 개발할 때의 몇가지 차이점이 존재 한다

  스프링 스프링 부트
목적  엔터프라이즈 애플리케이션 개발을 더 쉽게 만들기 스프링 개발을 더빠르고 쉽게 하기
설정 파일 개발자가 수동으로 구성 자동 구성
XML 일부 파일은 XML로 직접 생성하고 관리 사용하지 않음
인메모리 데이터 베이스 지원  지원하지 않음 인메모리 데이터베이스 자동 설정 지원
서버 프로젝트를 띄 우는 서버르 별도로 수정 설정 내장형 서버를 제공해 별도의 설정이 필요 없음

 

.

 

제어의 역전과 의존성 주입

스프링은 모든 기능의 기반을 제어의 역전과 의존성 주입에 두고 있다. 제어의 역전은 IOC로 의존성 주입은 DI라고 부른다.

 

IOC란?

IOC는 'Inversion of Control'의 약어로, 한글로는 '제어의 역전'이라고 번역된다. IOC는 소프트웨어 디자인 패턴 중 하나로, 컴퓨터 프로그램의 제어 흐름에 대한 관점을 바꾸는 개념이다. 일반적으로 프로그램이 실행될 때, 제어 흐름은 애플리케이션 코드가 프레임워크나 라이브러리에 의해 결정된다. 하지만 IOC 패턴을 사용하면 제어 흐름의 결정권이 프레임워크나 라이브러리로부터 개발자에게 넘어간다.

 

DI란?

DI는 "의존성 주입(Dependency Injection)"의 약어입니다. 이것은 소프트웨어 공학에서 중요한 개념으로, 객체 간의 의존 관계를 만들고 관리하는 방법론입니다.

간단히 말하면, 의존성 주입은 객체가 직접 필요로 하는 의존 객체를 생성하거나 관리하는 대신, 외부에서 의존 객체를 주입하는 것을 의미합니다. 이를 통해 객체는 자신이 필요로 하는 다른 객체에 대한 제어를 갖지 않고, 외부로부터 필요한 의존성을 받아들일 수 있습니다.

의존성 주입은 코드의 결합도를 낮추고 유연성을 높여줍니다. 객체 간의 의존 관계가 코드 내에 하드코딩되는 것이 아니라 외부에서 주입되기 때문에, 객체의 재사용성과 테스트 용이성이 향상됩니다.

 

스프링 컨테이너란?

스프링 컨테이너(Spring Container)는 스프링 프레임워크의 핵심이자 핵심 컴포넌트 중 하나입니다. 이것은 스프링 애플리케이션의 객체를 생성, 관리 및 제어하는 책임이 있습니다. 스프링 컨테이너는 객체의 라이프사이클을 관리하고, 의존성 주입(Dependency Injection)을 통해 객체 간의 의존 관계를 해결합니다.

스프링 컨테이너는 일반적으로 두 가지 유형으로 나뉩니다:

  1. BeanFactory:
    • BeanFactory는 스프링의 가장 기본적인 컨테이너입니다.
    • 빈(Bean) 객체의 생성, 초기화, 주입 등을 관리합니다.
    • 필요할 때마다 빈 객체를 생성하기 때문에 빈의 지연 로딩을 지원합니다.
  2. ApplicationContext:
    • ApplicationContext는 BeanFactory의 확장된 버전으로, 모든 기능을 포함하고 있습니다.
    • 빈의 지연 로딩, 메시지 처리, 이벤트 발행, 트랜잭션 관리 등의 기능을 제공합니다.
    • 또한, 스프링의 AOP(Aspect-Oriented Programming)와 같은 고급 기능도 지원합니다.

스프링 컨테이너는 XML 파일, 자바 설정 클래스 또는 애노테이션을 사용하여 빈(Bean) 정의를 구성할 수 있습니다. 컨테이너는 이러한 빈의 정의를 기반으로 빈 객체를 생성하고 관리합니다. 그러면 애플리케이션의 다른 부분에서 필요할 때마다 이러한 빈 객체를 주입받아 사용할 수 있습니다.

스프링 컨테이너는 애플리케이션의 객체 관리를 담당하기 때문에 스프링 애플리케이션의 생명주기를 제어하고, 의존성 주입을 통해 객체 간의 결합도를 낮추는 데 중요한 역할을 합니다.

 

빈이란?

빈(Bean)은 스프링 프레임워크에서 관리되는 객체를 의미합니다. 이 객체들은 스프링 컨테이너에 의해 생성, 관리, 및 주입되며, 애플리케이션의 핵심 구성 요소로 사용됩니다.

빈은 일반적으로 다음과 같은 특징을 가집니다:

  1. 의존성 주입(Dependency Injection, DI): 빈은 다른 빈과의 의존 관계를 갖습니다. 이 의존 관계는 스프링 컨테이너에 의해 관리되며, DI를 통해 빈에 필요한 의존 객체를 주입합니다.
  2. 라이프사이클 관리: 빈은 컨테이너가 관리하는 객체이므로, 컨테이너의 라이프사이클에 따라 생성, 초기화, 소멸 등의 단계를 거칩니다. 이를 통해 빈은 필요한 시점에 생성되고 소멸되며, 필요한 초기화 작업을 수행할 수 있습니다.

 

관점 지향 프로그래밍(AOP)

스프링 프레임워크는 관점 지향 프로그래밍(AOP)을 지원하여 애플리케이션에서 횡단 관심사를 분리하고 모듈화할 수 있도록 도와줍니다. 이를 통해 핵심 비즈니스 로직과 공통 관심사(예: 로깅, 트랜잭션 관리, 보안 등)를 분리하여 코드의 가독성을 높이고 유지보수성을 향상시킬 수 있습니다.

스프링에서 AOP를 구현하는 방법은 다음과 같습니다:

  1. Aspect(관점) 정의: 관점은 횡단 관심사를 모듈화한 것으로, 스프링에서는 일반적으로 클래스나 애노테이션으로 정의됩니다. 예를 들어, 로깅을 담당하는 Aspect를 정의할 수 있습니다.
  2. Advice(조언) 정의: Advice는 관점이 실행될 때 실제로 수행되는 코드입니다. 스프링에서는 Before, After, Around 등의 Advice를 정의할 수 있습니다.
  3. Pointcut(지점 절단) 정의: Pointcut은 어떤 메소드나 어노테이션 등이 Aspect의 적용 대상인지를 정의하는데 사용됩니다.
  4. Weaving(위빙): 스프링은 컴파일 시점, 로드 시점, 런타임 시점 등 다양한 방법으로 Aspect를 애플리케이션의 코드에 삽입합니다.

스프링에서 AOP를 사용하면 예를 들어 여러 서비스 클래스에서 공통으로 사용되는 트랜잭션 관리나 인증/인가와 같은 보안 기능을 별도의 코드 중복 없이 적용할 수 있습니다. 이는 코드의 재사용성을 높이고 유지보수성을 개선하는 데 도움이 됩니다.

 

이식 가능한 서비스 추상화(Portable Service Abstraction)

 

이식 가능한 서비스 추상화(Portable Service Abstraction)는 스프링 프레임워크의 핵심 기능 중 하나입니다. 이것은 서로 다른 환경에서 동일한 서비스를 사용할 수 있도록 해주는 추상화 계층을 제공합니다.

스프링의 이식 가능한 서비스 추상화는 다음과 같은 장점을 제공합니다:

  1. 다양한 서비스 기술 지원: 스프링은 다양한 서비스 기술을 추상화하여 일관된 방식으로 사용할 수 있도록 지원합니다. 예를 들어, JMS(Java Message Service), JDBC(Java Database Connectivity), JNDI(Java Naming and Directory Interface) 등의 기술을 표준화된 인터페이스로 제공하여 개발자가 특정 기술에 종속되지 않고 동일한 코드를 유지할 수 있습니다.
  2. 환경변수 처리: 서비스 추상화는 환경 변수를 사용하여 서비스 구성을 쉽게 변경하고 관리할 수 있도록 합니다. 예를 들어, 데이터베이스 연결 정보를 환경 변수로 정의하여 애플리케이션을 다른 환경(로컬, 개발, 테스트, 운영 등)에 쉽게 이식할 수 있습니다.
  3. 테스트 용이성: 서비스 추상화를 사용하면 테스트를 쉽게 수행할 수 있습니다. 스프링은 테스트용 구현체를 제공하여 실제 서비스를 모의(mock) 또는 가짜(fake) 객체로 대체하여 테스트를 수행할 수 있도록 합니다.
  4. 확장성: 스프링의 서비스 추상화는 확장 가능한 구조를 제공하여 새로운 서비스 기술이나 환경에 대응할 수 있습니다. 새로운 서비스 구현체를 추가하거나 기존 구현체를 확장하여 다양한 요구 사항에 대응할 수 있습니다.

이러한 이식 가능한 서비스 추상화는 스프링 애플리케이션의 유연성과 이식성을 높이는 데 중요한 역할을 합니다.

 

 

'Spring공부' 카테고리의 다른 글

테스트 코드  (0) 2024.05.16
스프링 부트 구조 살펴보기  (0) 2024.05.14
자바 백엔드 개발자가 알아주면 좋은 지식.  (0) 2024.05.14
@Transactional  (0) 2024.02.01
DTO의 필요성  (0) 2024.01.29