개발/Spring

[Spring] 스프링 코어 정리 1

TutleKing 2022. 10. 12. 16:35

스프링 프레임 워크란?
- 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크
    - 프레임워크에 종속적이지 않음 (non-intrusive)
    - 원하는 기능만 끼워넣어서 사용가능 (modular)
    - 비기능적 요구사항 개발시, 필요한 인프라 제공
    - POJO를 통한 개발 
- 특징
    - 경량 컨테이너로 Spring Bean을 직접 관리
        - Spring Bean : 스프링 프레임워크가 원하는 대로 짠 자바 객체
        - Spring 객체 라이프 사이클 관리 
        - Container : Spring bean 객체의 생성,보관,제거에 관한 모든 일을 처리 
    - POJO 기반 프레임워크
        - 특정 인터페이스 구현 및 상속을 받을 필요 없음 
    - 제어 역전(IoC : Inversion of Control)
        - 컨트롤의 제어권이 프레임워크에 있어 Spring에서 사용자 코드를 호출 
        - 방법 중 하나로 DI(Dependency Injection)가 있음 
    - 관점지향 프로그래밍(AOP : Aspect Oriented Pro~)
        - 문제 해결을 위한 집중 가능 (기능적/비기능적 요구사항에 맞춘 개발 가능)
    - 영속성과 관련된 다양한 서비스 지원
    - 높은 확장성 및 범용성  

스프링 프레임워크 모듈들 
- Core Container 
    - Spring Core : 핵심 유틸리티 포함
    - Spring Context : ApplicationContext, 스케쥴링, AOP, Cache 관련 클래스 제공
    - Spring beans : 스프링 빈과 관련된 클래스와 어노테이션 제공
    - Spring expression : SpEL(Spring Expression Language) 관련 기능 제공
- AOP
    - Spring-aop : 프록시
    - Spring-aspects  : AspectJ
- Data Access / Integration 
    - JDBC : DB 커넥터 제공 
    - ORM : 객체와 DB 테이블간의 관계 설정 
    - Web : 상대방 서버에 리소스를 GET
    - Test : 테스트 
    - Web-Mvc : 내가 서버를 담당

스프링 프로젝트
- Spring Boot
    - Spring application을 구현시, 스프링 프레임워크를 편하게 쓸 수 있도록 여러기능을 제공 
    - 스프링 코어를 기반으로 하여 여러기능을 추가한 것
- Spring Framework
- Spring Data
    - JPA, MongoDB
- Spring Batch
    - 대용량 데이터 처리 프레임워크
- Spring Security
    - 인증, 인가


스프링 프레임워크 디펜던시
- BOM(Bill of Materials) : 자재 목록 - version 관리의 용이성 



스프링 핵심기능(트라이앵글)
- DI (Dependency Injection)
- AOP (Aspect-oriented Programming)
- PSA (Portable Service Abstraction)
- 이것은 모두 POJO안에서 가동


자바의 다형성
- 자바의 객체는 부모클래스 타입의 참조변수나 구현한 인터페이스 변수에 담을 수 있음 
- 메시지를 수신하는 객체의 클래스가 무엇인가에 따라 어떤 메서드가 실행되는지 결정됨
    - Compile타임에서는 알 수 없고 Runtime 타임이 되어야 결정됨


IoC 제어역전
- 컨트롤의 제어권이 프레임워크에 있음을 의미 : 내가 만든 애플리케이션 코드를 호출
- 예시
    - 흐름의 제어역전(template method 패턴)
        - 추상 클래스에 탬플릿에 해당하는 메소드에서 실행의 흐름이 이미 결정
        - 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴 
        - 전체적으로 동일하지만 부분적으로 다른 구문으로 구성된 메서드의 코드 중복을 최소화 할때 유용
    - 객체 생성의 제어 역전
        - 외부에서 생성된 객체를 사용하여 서비스 객체(실행 만함)에게 객체 생성의 책임이 없게함 
        - 서비스 - 객체간의 의존성 결합


ApplicationContext
- Spring IoC Container 를 나타낸다.
- configuration metadata를 읽어드려 Bean의 인스턴스화, 구성 및 조립을 담당한다
- 스프링 컨테이너를 통해 내가 짠 POJO와 configuration metadata를 조립(매칭)하여 Ready for use 상태가 된다. 


Spring Bean
- an object managed by a Spring IoC Container
- Spring Bean은 name, type, object로 구성되어 있음 
- 스프링 프레임워크에서 중요하게 관리되어야하는 객체 


Bean Factory
- 스프링 IoC를 기반으로 둔 기능을 제공한다. 

ApplicationContext
- Bean Factory의 기능에 더해 많은 기능을 제공 
- 스프링 애플리케이션 내의 중앙 인터페이스로 애플리케이션의 구성 정보를 제공
- 기능
    - Bean Factory 메소드 제공
    - Resources를 load 하여 제공
    - 이벤트를 관리하는 기능 제공
    - 국제화를 지원하도록함 
    - 상위 컨텍스트에서 상속함
- 역할
    - Spring Bean 생성
    - Spring Bean 파기
    - Spring Bean 주입 

ClassPathXmlApplicationContext 를 사용하기 위해서는 설정.xml 파일을 src/main/resource 에 둔다. 


Bean 객체의 생명 주기
- Bean Scope 
    - Singleton
        - 스프링 컨테이너에서 단 하나만 존재하는 객체 
    - Prototype
        - 사용하기 위해 생성된 시점 부터 동작하는 객체 (여러개 가능)
    - Web-aware
- Callbacks - 초기화
    - XML bean 설정에서 init-method를 통해 초기화 작업 가능 (POJO 유지)
- Callbacks - 소멸
    - destroy-method를 통해 소멸 작업 가능 

의존성(Dependency)
- 객체지향언어에서 두 클래스간의 관계를 말함
- 4가지 종류
    - 의존관계(dependency) : 일시참조 
    - 연관관계(Association) : 클래스 필드로 가지고있음
    - 집합관계(Aggregation) : 연관관계의 특수한 상황 (생명주기 일치 x)
    - 합성관계(Composition) : 연관관계의 특수한 형태, 집합 관계보다 강결합 (생명주기 일치)

의존성 주입(Dependency Injection)
- IoC 패턴 중 하나 : 외부의 설정을 통해 구성요소간의 의존관계가 정의됨
- Object 간의 의존성을 낮추고 외부에서 객체를 생성하고 조달한다.
- 예시
    - Factory Method 패턴 
        - 사용하고자 하는 클래스는 Application의 서브 클래스가 결정하도록 함
        - Application에서 추상화된 메서드를 통해 실제 사용하는 곳에서 구현체를 정함
        - 구체적인 클래스가 추상클래스에 종속되지 않음  
- 방법(Bean wiring)
    - Constructor Injection
        - 생성자 주입 
        - XML : constructor-arg 속성
    - Setter Injection
        - setter 메서드 통해 주입
        - XML : property 속성
    - Field Injection(Autowired)
        - XML : autowire 속성을 통해 주입 
            - byType  : 클래스 타입으로 (only one)
            - byName : 객체 이름으로 (setter 이름 변경 )
            - constructor

반응형