개발지식 먹는 하마 님의 블로그
Spring Framework 1편 본문
Spring Framework의 모듈과 모듈 내의 각 요소에 대해 정리해보자!
Spring Framework
✅ 구조
IoC 컨테이너와 사용 이유에 대한 간략 설명!
객체 생성 권한을 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
이제 각 요소가 실제 서비스 흐름에서 어떻게 동작하는지 아래의 이미지와 함께 좀 더 살펴보자!
- Client ➡️ Spring Controller
사용자가 보낸 요청을 Java 코드로 변환
XML이면 -> OXM
Json이면 -> Jackson
변환된 요청이 Controller를 통해서 Service로 전달 - ➡️ Service
요청이 @Transactional이 선언된 서비스에 진입하면 트랜잭션 시작
성공하면 Commit, 실패하면 Rollback
Service에서 testRepositoy.save()를 호출 - ➡️Repository ➡️ JPA
- JPA가 실제 SimpleJpaRepository 구현체를 생성 (우리가 짠 Repository는 그냥 코드일 뿐)
- JPA의 EntityManager가 객체를 영속화 persist 또는 merge - ➡️ Hibernate
- Hibernate가 1차 캐시 등록, Dirty Checking 준비, 메타데이터 수집 진행
- flush 또는 commit 시점에 SQL 생성
- JDBC API를 통해 SQL 실행 - ➡️ JDBC Interface
DB 연결 관리, SQL 실행 - ➡️ JDBC Driver
SQL을 DB 형식에 적합하게 변환 후 실제 네트워크 통신으로 전송 - ➡️ 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 |