Spring Framework

Seoyeon Kim·2023년 6월 9일
2

Spring Framework

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

Spring FrameworkJava 기반의 애플리케이션 프레임워크로 엔터프라이즈급 애플리케이션을 개발하기 위한 다양한 기능을 제공한다. 스프링은 목적에 따라 다양한 프로젝트를 제공하는데, 그 중 하나가 Spring Boot다.

엔터프라이즈급 개발은 기업 환경을 대상으로 하는 개발을 뜻한다. 네이버나 카카오톡 같은 대규모 데이터를 처리하는 환경을 엔터프라이즈 환경이라고 부른다. 스프링은 이 환경에 알맞게 설계돼 있어 개발자는 애플리케이션을 개발할 때 많은 요소를 프레임워크에 위임하고 비즈니스 로직을 구현하는 데 집중할 수 있다.

스프링 프레임워크는 애플리케이션 개발에 필요한 모듈만 선택해서 사용하게끔 설계돼 있으며, 이를 경량 컨테이너 설계라고 부른다.


IoC : Inversion of Control

제어 역전을 특징으로 하는 스프링은 기존 자바 개발 방식과 다르게 동작한다. IoC를 적용한 환경에서는 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 외부에 위임한다. 여기서 '외부'는 Spring Container 또는 IoC Container를 의미한다. 객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것을 제어 역전이라고 부르며, 제어 역전을 통해 DI, AOP 등이 가능해진다.


DI : Dependency Injection

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

스프링 공식 문서에서 권장하는 의존성 주입 방법은 생성자를 통해 의존성을 주입받는 방식이다. 다른 방식과는 다르게 생성자를 통해 의존성을 주입받는 방식은 래퍼런스 객체 없이는 객체를 초기화할 수 없도록 설계할 수 있기 때문이다.


OOP : Object-Oriented Programming

각 기능을 재사용 가능한 개별 객체로 구성해 프로그래밍하는 것을 뜻한다. 핵심 키워드는 다음과 같다.

  1. 추상화 (abstraction)
  2. 캡슐화 (encapsulation)
  3. 상속 (inheritance)
  4. 다형성 (polymorphism)

AOP : Aspect-Oriented Programming

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

간혹 AOP를 OOP의 대체 개념으로 오해하는 경우가 있는데, AOP는 OOP를 더욱 잘 사용하도록 돕는 개념으로 보는 것이 좋다.

핵심 기능은 비즈니스 로직을 구현하는 과정에서 비즈니스 로직이 처리하려는 목적 기능을 말한다. 예를 들어, 상품 정보를 데이터 베이스에 저장하고 저장된 상품 정보 데이터를 보여주는 코드는 핵심 기능이라고 할 수 있다.

실제 애플리케이션을 개발하다 보면 핵심 기능에 부가 기능을 추가할 상황이 생긴다. 핵심 기능인 비즈니스 로직 사이에 로깅 처리를 하거나 트랜잭션을 처리하는 코드를 예로 들 수 있다.

일반적인 OOP 방식의 애플리케이션 로직에는 객체마다 핵심 기능을 수행하기 위한 로직과 함께 부가 기능인 로깅, 트랜잭션 등의 코드를 작성한다.

상품 정보 등록 - 로깅 → 로직 → 로깅 → 로직 → 트랜잭션 → 로깅 → 로직
상품 정보 조회 - 로깅 → 로직 → 로깅 → 로직 → 트랜잭션 → 로깅 → 로직

여기서 로깅과 트랜잭션 영역은 동일한 기능을 수행할 확률이 높다. 즉, 핵심 기능을 구현한 로직에 동일한 코드가 포함된다는 것을 의미한다.

AOP의 관점에서 부가 기능은 핵심 기능이 어떤 기능인지에 무관하게 로직이 수행되기 전 또는 후에 수행되기만 하면 된다. 로깅과 트랜잭션 작업처럼 여러 비즈니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입하는데 이를 AOP라고 한다.

이러한 AOP를 구현하는 방법은 다음과 같다.

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

이 가운데 스프링은 디자인 패턴 중 하나인 프락시 패턴을 통해 AOP 기능을 제공하고 있다.

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


Spring Boot

"스프링 부트를 이용하면 단독으로 실행 가능한 상용 수준의 스프링 기반 애플리케이션을 손쉽게 만들 수 있습니다."

다양한 기능을 제공하는 Spring Framework의 복잡한 설정 문제를 해결하기 위해 등장한 것이 Spring Boot다. 별도의 복잡한 설정을 하지 않아도 스프링 부트를 사용하면 상대적으로 쉽게 개발할 수 있다.


의존성 관리

스프링 프레임워크에서는 개발에 필요한 각 모듈의 의존성을 직접 설정해야 하며, 호환되는 버전을 명시해야 정상 동작한다. 애플리케이션에서 사용하는 스프링 프레임워크나 라이브러리의 버전을 올리는 상황에서는 연관된 다른 라이브러리의 버전까지도 고려해야 한다.

하지만 스프링 부트에서는 'spring-boot-starter'라는 의존성을 제공한다. 'spring-boot-starter'의 의존성은 여러 종류가 있으며, 각 라이브러리의 기능과 관련해서 자주 사용되고 서로 호환되는 버전의 모듈 조합을 제공한다.


자동 설정

스프링 부트는 스프링 프레임워크의 기능을 사용하기 위한 Auto Configuration을 지원한다. 자동 설정은 애플리케이션에 추가된 라이브러리를 실행하는 데 필요한 환경 설정을 알아서 찾아준다. 즉, 애플리케이션을 개발하는 데 필요한 의존성을 추가하면 프레임워크가 이를 자동으로 관리해준다.

Bean

Bean은 스프링 애플리케이션에서 사용, 관리되는 객체를 말한다. 스프링에서는 Bean을 생성, 관리, 검색, 제거하는 등의 작업을 자동으로 처리할 수 있다.

Bean은 일반적으로 스프링 컨테이너에 등록되어 있으며, 컨테이너는 Bean의 생명 주기를 관리한다. 컨테이너는 Bean의 생성과 소멸, 그리고 필요한 시점에 Bean을 주입하는 등의 작업을 수행한다.

스프링에서 Bean은 자바 클래스로부터 생성됩니다. 클래스에 대한 정보를 스프링 컨테이너에 등록하면, 스프링은 이를 사용하여 Bean을 생성하고 컨테이너에서 관리한다.

스프링에서 Bean을 등록할 때는, @Component, @Service, @Repository, @Controller 등의 애노테이션을 사용하거나, XML 파일에 등록하는 방법을 사용할 수 있다. 또한, 스프링은 자동으로 Bean을 생성하고 등록하는 기능을 제공하는데 이를 스프링의 Autowiring이라고 한다. Autowiring을 사용하면, 스프링이 Bean을 자동으로 생성하고 의존성 주입을 수행한다.

Bean Lifecycle

Bean Lifecycle은 Spring Framework에서 Bean이 생성되고, 사용되고, 소멸될 때 일어나는 과정을 말한다. Lifecycle은 다음과 같다.

  1. 인스턴스화 (Instantiation)
  2. 의존성 주입 (Dependency Injection)
  3. 초기화 (Initialization)
  4. 사용 (Usage)
  5. 소멸 (Destruction)

Bean이 생성될 때, 해당 Bean 클래스의 객체 인스턴스가 생성되고, 이후에는 해당 Bean의 의존성이 주입된다. 그리고 Bean이 사용되기 전에 초기화 작업이 수행되며 다른 Bean이나 컴포넌트에서 참조할 수 있게 된다. 마지막으로, 해당 Bean이 소멸될 때 수행될 작업이 정의된다.


내장 WAS

스프링 부트의 각 웹 애플리케이션에는 내장 Web Application Server가 존재한다. 웹 애플리케이션을 개발할 때 가장 기본이 되는 의존성인 'spring-boot-stater-web'의 경우 톰캣을 내장하고 있다.

스프링 부트의 자동 설정 기능은 톰캣에도 적용되므로 특별한 설정 없이도 톰캣을 실행할 수 있다. 필요에 따라서는 톰캣이 아닌 다른 웹 서버로 대체할 수도 있다.

스프링 부트에서 모듈을 사용하면 기본적으로 Tomcat을 사용하는 Spring MVC 구조를 기반으로 동작한다.

1개의 댓글

comment-user-thumbnail
2023년 6월 29일

안녕하세요:) 가능하다면 다른 분들과 교류하고 싶습니다. 괜찮으시다면 javavoja@protonmail.com으로 메일 부탁드립니다. 감사합니다.

답글 달기