개발지식 먹는 하마 님의 블로그

Spring Framework 1편 본문

Java

Spring Framework 1편

devhippo 2025. 8. 8. 18:58

Spring Framework의 모듈과 모듈 내의 각 요소에 대해 정리해보자!

Spring Framework

✅ 구조

https://www.google.com/url?sa=i&url=https%3A%2F%2Fvelog.io%2F%40duckchanahn%2FSpring-%25EC%259D%25B4%25EB%25A1%25A0%25EC%25A0%2595%25EB%25A6%25AC&psig=AOvVaw07K_XgQ3KaT9EgO9GPOSiD&ust=1745041217711000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqGAoTCKjUkqLv4IwDFQAAAAAdAAAAABChAQ

 

IoC 컨테이너와 사용 이유에 대한 간략 설명!

https://icefree.tistory.com/entry/Spring-Core-Container

객체 생성 권한을 Contatiner에 위임하며 Service에 영향을 최소화하여 재사용성을 높인다 = IoC 제어의 역전

 

💡Core Container

IoC 컨테이너를 통한 Bean 생명주기 관리!!!

💎 Beans

Bean 정의, 등록, 생명주기, 의존성 주입을 담당한다.
  • DI (의존성 주입)
  • 빈 스코프 설정
  • @Autowired, @Qualifier 기반 의존성 관리

Bean Factory는 싱글톤의 필요성을 제거하고 Configuration과 Dependency를 분리하게끔 도와준다.

@Component, @Service 등의 Annotation을 통해 Bean으로

💎 Core

스프링의 기본 유틸리티와 핵심 기능 제공

 

  • 리소스 로딩
  • 클래스 경로 관리
  • 이벤트 처리

모두 이 Core의 인터페이스와 클래스를 상속/구현받아 사용한다. 

 

💎 Context

전체 스프링 컨테이너 구성을 제공하는 모듈 

Beans + Core 기능을 종합하여 애플리케이션 전체 Context를 제공한다.

  • ApplicationContext = BeanFactory + alpha
  • 이벤트 발행/수신
  • 환경/프로파일 관리

💎 SpEL ( Spring Expression Language )

런타임에 객체 그래프를 조회하고 조작하는 기능
  • 속성 동적 주입 @Value
  • 조건문, 연산자, 컬렉션 등 지원
  • 동적 표현식 설정 @Scheduled

 

이 4개의 요소는 서로 별개가 아닌 유기적으로 연결되어 있다.
흐름과 함께 정리해 보자

1.  Application 시작 시, ApplicationContext(BeanFactory를 상속 받은 최상위 컨테이너) 생성

2. Core + Beans 초기화
    - @ComponentScan, @Bean, @Configuration 등의 정의 분석
    - BeanDefinition으로 등록됨

3. Bean 등록 및 DI 처리
    - 등록된 BeanDefinition에 따라 실제 객체 생성
    - 생성자 주입 처리

4. Context 기능 활성화

5. SpEL 표현식 평가
    - @Value 같은 SpEL 포함 설정 데이터들 즉시 평가됨

6. 빈 사용 및 애플리케이션 실행
    - @Component, @Service, @Scheduled, @EventListener 등 각 기능이 본격 동작

 

한 번더 정리하자면,

  • Core는 근본 토대!
  • Beans는 IoC 컨테이너의 핵심!
  • Context는 두 기능을 모두 통합한 관리자!
  • SpEL은 동적 제어를 돕는 보조!

이런 느낌이라고 이해하면 될 것 같다.


💡Data Access / Integration

추상화를 통해 데이터에 쉽게 접근하도록 한다!

스프링에는 데이터 접근 및 통합을 위한 5가지 요소가 있다.

🗂️ OXM ( Object/XML Mapping

 Object와 XML 간의 변환을 위한 추상 계층을 제공한다. (XML 전용)

REST API 응답/요청에서 객체를 매핑한다.
JSON은 Jackson을 통해 매핑한다.

🗂️ JMS ( Java Message Service  )

Kafka, RabbitMQ와 처럼 메시징 처리를 위한 모듈을 제공한다.

비동기 통신에 주로 많이 쓰인다.

🗂️ ORM ( Object Relation Mapping )

JPA(인터페이스), Hibernate(구현체)에 위치하여 객체와 관계형 DB 간의 매핑을 담당한다.

개발자가 코드로 작성한 Entity 클래스를 런타임 시, Hibernate가 매핑해서 자동으로 SQL을 생성 및 실행한다.

🗂️ JDBC ( Java Database Connectivity )

자바의 표준 DB 연동 인터페이스

ORM의 기반이 된다. 
DAO 개발을 좀 더 쉽고 일관된 방법으로 개발할 수 있는 레이어를 제공한다.
https://devhippo.tistory.com/159

🗂️ Transactions

트랜잭션 경계 설정 및 관리

자세한 내용은 별도의 글에서 다루도록 하겠다!
https://devhippo.tistory.com/158

 

이제 각 요소가 실제 서비스 흐름에서 어떻게 동작하는지 아래의 이미지와 함께 좀 더 살펴보자!

\https://www.google.com/url?sa=i&url=https%3A%2F%2Fvelog.io%2F%40adam2%2FJPA%25EB%258A%2594-%25EB%258F%2584%25EB%258D%25B0%25EC%25B2%25B4-%25EB%25AD%2598%25EA%25B9%258C-orm-%25EC%2598%2581%25EC%2586%258D%25EC%2584%25B1-hibernate-spring-data-jpa&psig=AOvVaw3VUPy1swZP_HeAb29GFaba&ust=1745041525473000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqFwoTCNDourPw4IwDFQAAAAAdAAAAABAE

  1. Client ➡️ Spring Controller
    사용자가 보낸 요청을 Java 코드로 변환
    XML이면 -> OXM
    Json이면 -> Jackson
    변환된 요청이 Controller를 통해서 Service로 전달
  2. ➡️ Service
    요청이 @Transactional이 선언된 서비스에 진입하면 트랜잭션 시작
    성공하면 Commit, 실패하면 Rollback
    Service에서 testRepositoy.save()를 호출

  3. ➡️Repository ➡️ JPA
    - JPA가 실제 SimpleJpaRepository 구현체를 생성 (우리가 짠 Repository는 그냥 코드일 뿐)
    - JPA의 EntityManager가 객체를 영속화 persist 또는 merge
  4. ➡️ Hibernate
    - Hibernate가 1차 캐시 등록, Dirty Checking 준비, 메타데이터 수집 진행
    - flush 또는 commit 시점에 SQL 생성
    - JDBC API를 통해 SQL 실행 
  5. ➡️ JDBC Interface
    DB 연결 관리, SQL 실행

  6. ➡️ JDBC Driver
    SQL을 DB 형식에 적합하게 변환 후 실제 네트워크 통신으로 전송

  7. ➡️ DB
    RDBMS가 SQL 파싱 후 실행
    DB 결과가 다시 역순으로 전파됨
    JDBC → Hibernate → JPA → Repository → Service
JMS는 비동기를 사용하는 경우
커밋 완료 이후, 서비스 로직에서 비동기 서비스를 호출 시
메시지를 MQ에 저장하고 다른 Consumer가 메시지를 수신 후 별도 처리하는 흐름으로 주로 활용됨 

 


💡Web

Web

Spring Web의 전체적인 기능

💻  Servlet

Web 요청/응답 처리

모든 컨트롤러는 DispatcherServlet을 통해 동작한다.

💻 WebSocket 

실시간 양방향 통신을 위한 프로토콜 지원

채팅, 실시간 알림 등 빠른 통신이 필요한 경우에 주로 사용된다.
STOMP 프로토콜을 지원한다.

Portlet

포털 환경에서 사용하는 컨테이너 지원 (현재는 거의 사용되지 않음)

 

 

'Java' 카테고리의 다른 글

Java - Enum  (0) 2025.03.11
Java - Pattern & Matcher  (0) 2025.02.28
Java - GUI JFrame  (0) 2025.02.25
Java - 람다(Lambda) & 스트림(Stream)  (0) 2025.02.25
Java - 제네릭 (Generic)  (0) 2025.02.25