스프링 프레임워크

랏 뜨·2024년 12월 20일

🔎 Overview

  지난 포스팅에서 기본에 대해서 제대로 다잡고 가야겠다는 이야기를 했었다.

  이번 포스팅은 그 때보다 더 초심으로 돌아가, 스프링 프레임워크는 무엇이며, 스프링은 무슨 일을 하고 흐름 및 동작 원리를 가지고 동작하는지 등을 정리해보려 한다.


📕 스프링 프레임워크

  • 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크
  • 엔터프라이즈 애플리케이션에 필요한 다양한 기능 및 컴포넌트를 지원
  • 모듈화된 설계를 통해 원하는 기능만 선택적으로 사용할 수 있음
  • 개발의 복잡도는 줄이고 효율성은 올리게 해주는 도구


📑 스프링 프레임워크의 역할

1) 의존성 주입

  • Dependency Injection, 일명 그 유명한 DI
  • 객체 간의 의존성을 개발자가 아닌 스프링 컨테이너가 직접 관리
    • 객체를 생성할 때 new 를 사용하지 않고 스프링 컨테이너에서 알아서 주입
  • 설정 파일( XML, Java Config ...)이나 어노테이션을 통해 객체의 생성 및 주입

2) IoC 컨테이너 / Inversion of Control Container

  • 스프링 컨테이너와 사실상 같은 개념
    • 스프링 컨테이너는 IOC 컨테이너의 구현체
    • 스프링에서 컨테이너는 일반적으로 IoC 컨테이너를 지칭
  • 스프링의 핵심 개념 중 하나이며, 객체의 생성 및 생명 주기 담당 등 객체를 관리
  • 개발자는 객체에 관한 것들을 사실상 이 컨테이너에 맡김

3) AOP / Aspect-Orient Programming

  • 비즈니스 로직과 로깅, 보안, 트랜잭션 등의 공통 로직을 분리하여, 코드의 중복을 줄이고 유지보수를 쉽게 함
  • @Aspect 어노테이션으로 지정
  • @Transactional 로 지정된 메서드도 사실상 AOP 를 기반으로 작동
    • @Transcational 메서드가 호출되면, Proxy 객체가 이를 중간에 인터셉트
    • 메서드 실행 전/후로 트랜잭션 시작 및 종료를 지정 <- 이 작업이 AOP

4) 트랜잭션 관리

  • @Transactional 이 붙어있는 메서드 및 클래스를 관리
    • @Transactional 이 클래스 내에 하나라도 붙어있으면, 프록시 객체를 생성
    • 컨테이너에 등록되는 것은 실제 객체가 아닌 프록시 객체
      - 실제 객체와 프록시 객체를 모두 생성하기는 함
      - 프록시 객체의 내부 필드에 실제 객체를 참조할 수 있는 값이 들어있음
      - 실제 객체에 접근할 수 있는 객체는 오직 프록시 객체 밖에 없음

5) 웹 애플리케이션 개발 지원

  • 스프링 MVC를 통해 웹 애플리케이션의 개발 지원
    • DispatcherServlet이 요청을 중앙에서 처리
    • 컨트롤러, 서비스, DAO를 명확하게 분리하여 계층형 아키텍처 제공

6) 데이터 접근 지원

  • JDBC , JPA 와 같은 데이터 접근 기술과의 통합을 제공
  • 스프링 데이터를 통해 DB 와의 상호작용을 간소화

7) 보안

  • Spring Security인증권한 부여를 처리


💡 스프링의 장점

1) 유연성

  • 다양한 애플리케이션 개발 환경에 적합

2) 테스트 용이성

  • DI 로 인해 단위 테스트통합 테스트가 쉬움

3) 모듈화

  • 필요한 부분만 사용할 수 있음

4) 풍부한 커뮤니티 및 문서

  • 많이 사용되기 때문에 학습 및 개발 자료가 풍부

🌊 스프링의 전체 흐름과 동작 원리

1) 애플리케이션 실행

  • 컨테이너의 초기화 진행

2) 빈 등록

  • 설정 파일, 컴포넌트 스캔등을 통해 을 찾아서 컨테이너에 등록

3) 빈 생성 및 관리

  • DI 를 통해 등록된 빈 간의 관계를 설정
  • 빈이 등록된 이름으로 호출되면 해당 빈으로 등록된 작업을 수행
    • 이후 반환값을 호출부에 넘김
  • 필요시 싱글톤, 프로토타입스코프를 설정해서 관리

4) AOP 적용

  • @Advice 등을 통해 지정된 Pointcut 에서 AOP 로직 적용

5) 요청 처리

  • 클라이언트로부터 받은 웹 요청은 DispatcherServlet 이 받아서 적절한 핸들러(Controller)에 전달
    • 이 때 Controller에 매핑된 URL이 사용됨
  • 컨트롤러 -> 서비스 -> 레포지토리 -> DB 순서 및 역순으로 데이터에 접근 및 관리

6) 응답 반환

  • Controller로부터 받은 처리 결과를 클라이언트에게 반환
  • 위에서 서술했듯이, MVC 흐름으로 진행

⏰ 컴포넌트 및 컴포넌트 스캔


1️⃣ 컴포넌트

  • 애플리케이션의 으로 등록되어 스프링 컨테이너에서 관리되는 클래스
  • @Component 로 등록할 수 있으며, @Controller , @Service, @Repository 등 또한 이를 포함하는 어노테이션
  • 등록된 컴포넌트컴포넌트 스캔을 통해 자동으로 애플리케이션 컨텍스트에 등록


2️⃣ 컴포넌트 스캔

  • 스프링은 패키지 전체를 스캔하며 @Component 및 같은 역할을 하는 클래스들을 자동으로 빈으로 등록
    • 기본적으로 애플리케이션 클래스가 위치한 패키지를 기준으로 해당 패키지하위 패키지를 모두 스캔
@Configuration
@ComponentScan(basePackages = "com.ll")
public class AppConfig {
}
  • basePackages 속성으로 스캔할 패키지 및 범위를 지정
  • com.ll 패키지 내의 @Component 들을 모두 스캔하여 으로 등록



✔️ Tip) @SpringBootApplication

  • public static void main(String[] args) 메서드를 포함한 메인 클래스에 지정된 어노테이션
  • @ComponentScan 어노테이션 및, 총 세 가지 중요한 어노테이션을 포함

1) @EnableAutoConfiguration : 스프링부트가 자동 설정을 활성화하도록 함

2) @ComponentScan : 스프링이 @Component 등 컴포넌트로 정의된 클래스들을 자동으로 스캔하여 빈으로 등록

3) @Configuration : 해당 클래스가 스프링의 설정 클래스임을 나타냄


⚙️ 스프링 프레임워크의 주요 모듈

‼️ 스프링 프레임워크 자체가 포함하고 있는, 스프링을 작동시키기 위한 모듈(라이브러리)

1) spring-core

  • 스프링의 핵심 모듈
  • IOCDI 관련 기능을 제공

2) spring-context

  • 스프링 컨테이너와 관련된 기능 제공
  • 애플리케이션 컨텍스트 등을 포함
  • 빈의 관리 역시 기능에 포함되지만, 핵심적인 빈 관리 기능들은 spring-beans 에서 관리

3) spring-aop

  • AOP 기능을 지원
  • 메서드 실행 전/후부가적인 처리 추가 가능

4) spring-transaction

  • 트랜잭션 관리를 위한 기능 제공
  • DB 트랜잭션을 관리
  • 선언적 트랜잭션 처리 가능
    • 개발자가 직접 트랜잭션을 제어하지 않고, 설정을 통해 관리하는 방법
    • 주로 AOP 를 이용해서 구현

5) spring-beans

  • 빈 생성, 초기화, 소멸, DI 등을 포함하는 핵심적인 빈 관리 기능을 제공
  • BeanFactory 와 관련된 기능을 제공하며, 빈의 생명주기 관리를 처리

6) spring-web

  • 스프링의 웹 관련 기능 제공
  • 스프링 MVC, 웹 애플리케이션 구성 등을 지원

7) spring-orm

  • JPA , HibernateORM 프레임워크와의 통합 기능 제공

8) spring-jdbc

  • JDBC 기반으로 DB 와 연동하는 기능을 제공

9) spring-messaging

  • 메시지 시스템을 위한 기능을 제공
  • STOMP, WebSocket 등을 지원

☑️ 그 외 필요한 라이브러리들은 build 파일에 의존성을 추가하여 가져올 수 있음

     이 때, Maven Repository 가 주로 사용됨


참고) OpenAI. (2024).ChatGPT(4o)[Large language model].https://chatgpt.com/

profile
기록

0개의 댓글