[기초 공부] Spring 정리

woodyn·2021년 5월 25일
0

기초 공부

목록 보기
11/16

Spring Framework

자바 엔터프라이즈 애플리케이션을 개발하기 위한 프레임워크

  • IoC(Inversion of Control): 객체의 수명주기를 프레임워크가 관리함
  • DI(Dependency Injection): 클래스에 의존성을 얻기 위한 코드를 작성할 필요가 없음
    • 의존성 코드가 단순해져 테스트 작성 시 격리가 용이함
  • AOP(Aspect-oriented programming): 여러 곳에 흩어져 있는 관심사를 모듈화하여 관리할 수 있음

IoC Container

IoC 원칙을 구현하기 위한 컨테이너

  • Bean을 생성할 때 필요한 의존성을 주입해줌
  • BeanFactory: 기본적인 기능을 제공하는 컨테이너
  • ApplicationContext: BeanFactory를 상속하며, 엔터프라이즈 기능을 추가로 제공하는 컨테이너

Configuration Metadata

Spring 컨테이너가 객체를 어떻게 생성할 것인지 표현하기 위한 메타데이터

  • XML-based metadata: 외부 XML 파일로 표현
    • 클래스에서 프레임워크에 대한 의존성을 줄일 수 있음
  • Java-based metadata: 애너테이션 등의 자바 코드로 표현
    • XML 방식에 비해 관리가 쉬움

Bean Definition

BeanDifinition: Configuration metadata로 정의한 Bean의 메타데이터 (@Bean으로 정의)

  • 이름
    • id: 단일 이름을 설정하기 위한 필드
    • name: alias를 적용하기 위한 필드
    • 둘 다 제공하지 않으면, 컨테이너가 자동으로 생성함
  • 패키지와 클래스 이름
  • Scope와 수명주기 콜백
  • 다른 Bean으로의 참조 (collaborators 혹은 dependencies)
  • 다른 Config 설정 (application.yml 등)

Depndency Injection

의존성 주입을 위한 방식들

  • 생성자를 통한 주입 (@Autowired)
    • 불변 클래스로 설계할 수 있음
    • 순회 의존성 문제를 빠르게 진단할 수 있음
  • Setter를 통한 주입 (@Autowired)
    • 순회 의존성을 구현할 수 있음
  • ApplicationContext를 통해 획득 (@Autowired 혹은 ApplicationContextAware)
    • 싱글톤 Bean에서 매번 새로운 프로토타입 Bean을 획득할 수 있음
    • Spring 프레임워크에 크게 의존하게 됨
  • @Lookup 애너테이션을 통해 획득
    • 싱글톤 Bean에서 매번 새로운 프로토타입 Bean을 획득할 수 있음

Bean Scopes

Bean의 수명주기 범위

  • singleton: 단일 인스턴스로 관리 (기본 값)
  • prototype: 다수의 인스턴스로 관리
    • 삭제 콜백을 사용할 수 없음
  • request: HTTP 요청 단위로 관리
  • session: HTTP 세션 단위로 관리
  • application: ServletContext 단위로 관리

Lifecycle Callbacks

수명주기 콜백을 구현하기 위한 방식들

  • @PostConstruct@PreDestroy 활용
  • InitializingBean 구현
  • Bean 정의 메타데이터에 init-methoddestroy-method 설정

@Autowired (@Resource)

의존성을 주입받기 위한 애너테이션

  • 배열이나 컬렉션으로 다수의 Bean을 주입받을 수도 있음
  • required = false 혹은 Optional, @Nullable: 주입이 가능하면 주입받도록 함
  • 주입 가능한 특별한 의존성들:
    • BeanFactory
    • ApplicationContext
    • Evironment
    • ResourceLoader
    • ApplicationEventPublisher
    • MessageSource

Bean에 적용할 수 있는 애너테이션들

  • @Primary: 다른 Bean보다 주입 우선순위를 갖도록 함
  • @Qualifier: 특정 Bean을 주입받을 수 있도록 태그를 적용함

@Value

프로퍼티 값을 읽어오는 애터네이션

  • PropertySourcesPlaceholderConfigurer 빈을 통해 application.yml 파일을 읽어옴
  • SpEL 활용 가능

Classpath Scanning

classpath를 스캔하여 컴포넌트를 로드하는 기능

  • @Configuration 클래스에 @ComponentScan을 적용하여 사용함
    • @SpringBootApplication에는 해당 기능이 전체 패키지를 기준으로 적용되어 있음
  • Stereotype 애너테이션: 정형화된 컴포넌트를 위한 애너테이션들
    • @Component: 일반적인 컴포넌트 애너테이션
    • @Controller
    • @Service
    • @Repository

@Configuration

클래스에서 bean definition metadata를 정의하기 위한 애너테이션

  • @Bean: 팩토리 메소드로 bean definition metadata 정의
    • CGLIB 프록싱에 의해, 해당 메소드 호출 시 빈을 제공함
    • @Confiugration이 아닌 클래스 내부에서의 @Bean 메소드 호출은 빈을 제공하지 않으므로 주의 (lite 모드)
  • 모든 @Configuration 클래스들은 CGLIB에 의해 프록싱되며, @Bean 메소드 호출 시 캐싱된 빈을 제공함
  • @Import: 다른 Configuration 클래스의 메타데이터 로드
    • 일반 컴포넌트 클래스들도 불러올 수 있음
  • @Profile 혹은 @Conditional: Configuration이 적용될 조건 설정

JSR 330 표준 애너테이션

Spring의 여러 애너테이션을 Java 표준 애너테이션으로 대체할 수 있음

  • 장점: Spring 프레임워크에 대한 의존성이 줄어듬
  • 단점: Spring만이 제공하는 기능을 활용할 수 없음

Environment

프로파일과 프로퍼티들을 갖고 있는 추상화된 객체

  • sprig.profiles.active 프로퍼티로 프로파일 활성화
    • 기본 프로파일: default

PropertySource

프로퍼티가 담긴 자원을 추상화한 객체

  • Environment에서 여러 PropertySource로부터 프로퍼티 값을 찾아줌
  • 우선순위:
    • JVM 시스템 프로퍼티 (-D 명령어 인자)
    • 운영체제 환경 변수
  • @PropertySoure: 특정 파일을 읽어, PropertySource를 선언적으로 추가하도록 만드는 애너테이션

Application Events

이벤트 처리를 위한 클래스들

  • ApplicationEvent: 이벤트 클래스
  • ApplicationListener: 이벤트 처리 클래스

Resources

Spring에서 여러 자원들을 추상적으로 다루기 위한 인터페이스

Resource

자원을 추상화한 인터페이스

  • UrlResource
  • ClassPathResource
  • FileSystemResource
  • PathResource
  • ServletContextResource
  • InputStreamResource
  • ByteArrayResource

ResourceLoader

Resource를 불러오기 위한 컴포넌트

  • ApplicationContextResourceLoader를 상속함

Converter

String과 객체 간의 변환을 수행하는 컴포넌트

  • e.g. HTTP 요청 인자를 파싱하여 Controller에 전달
  • Spring 3 이전에 사용되던 PropertyEditor를 대체함
  • ConversionService: Converter를 등록하고, 변환 기능을 위임하는 컴포넌트

Formatter

특정 문자열 형식을 기반으로 변환을 수행하는 컴포넌트

  • FormatterRegistry: Formatter를 등록하는 곳
  • FormattingConversionService: FormatterRegistryConversionService의 구현체

Java Bean Validation

클래스의 필드 값을 검증하기 위한 기능

SpEL

Spring Expression Language; 런타임 환경에서 객체를 조회하거나 조작하기 위한 표현 언어

  • 메소드 실행, 프로퍼티 접근, 생성자 호출 등 지원

AOP with Spring

Spring이 제공하는 관점 지향 프로그래밍

  • Aspect: 여러 클래스를 횡단하는 관심사를 모듈화한 개념
  • Join point: 프로그램 실행에서의 시점 (e.g. 메소드 호출)
  • Advice: 특정 Join pointAspect가 수행하는 동작 (e.g. around, before, after)
  • Pointcut: 목표로 할 Join point를 특정하기 위한 조건
  • Introduction: 대상 타입에 추가적인 메소드나 필드를 정의하는 것
  • Target object: Advice가 적용될 대상 객체
  • AOP proxy: AOP 프레임워크가 Aspect를 구현하기 위해 생성한 프록시 객체
  • Weaving: 대상 객체를 생성하기 위해 Aspect를 적용하는 것 (e.g. 컴파일 타임 Weaving, 런타임 Weaving)

Spring AOP

Spring IoC를 통한 간단한 AOP 구현을 목적으로 하는 AOP 프레임워크

  • 런타임 Weaving 방식 (런타임 성능이 떨어짐)
  • 프록시 패턴으로 구현 (한계점이 존재함)
    • this로 내부 메소드 호출 시 프록싱이 적용되지 않음
      • AopContext.currentProxy()로 호출할 수 있으나, Spring AOP에 의존하게 됨

Proxying Mechanisms

Spring AOP에서 사용하는 프록싱 방식

  • JDK dynamic proxy: JDK의 built-in 기능
    • Reflection으로 Proxy 객체 생성 (성능이 나쁨)
    • 아무 interface를 구현하는 대상에 사용됨
  • CGLIB: 오픈소스 라이브러리
    • 클래스의 바이트 코드를 조작하여 Proxy 객체 생성 (성능이 좋음)
    • final 메소드는 프록싱으로 재정의할 수 없음
    • 어떠한 interface도 구현하지 않는 대상에 사용됨

AspectJ

Spring AOP보다 강력한 기능을 제공하는 AOP 프레임워크

  • 컴파일 시점 혹은 컴파일 전, 로드 시점 Weaving 지원 (런타임 성능이 좋음)
  • 프록시 패턴이 아닌, 컴파일을 통해 구현 (한계점이 없음)
  • Spring AOP에 비해 다양한 기능을 지원하고 성능이 좋으나, 비교적 사용하기 복잡함
  • Configuration에 @EnableAspectJAutoProxy를 추가하여 적용

Null-safety

Null 허용성 정보를 명시적으로 제공하기 위한 애너테이션들

  • @Nullable
  • @NonNull

Logging

로깅을 통합적으로 제공하기 위한 기능

  • Spring Boot Starter를 사용하면 Logback이 기본적으로 사용됨

Spring Web MVC

Servlet API를 기반으로 개발된 웹 프레임워크

Context Hierarchy

  • 중앙 Servlet인 DispatcherServlet으로 모든 요청을 받고, 필요한 곳으로 전해줌
    • 요청 처리를 한 곳에서 관리할 수 있도록 함
  • DispatcherServletWebApplicationContext를 참조함
    • WebApplicationContextApplicationContext를 상속함
  • Root WebApplicationContext에서 기반 빈들을 관리함
  • Servlet WebApplicationContext에서는 Servlet 관련 빈을 관리함
    • Root WebApplicationContext을 부모 Context로 둠

Spring Boot

Spring 프레임워크를 더 쉽게 사용할 수 있도록 하는 프레임워크

  • 다른 Spring 프레임워크들을 빠르게 도입할 수 있도록 함 (starters)
    • Auto Configuration: 의존성 등록만으로 설정이 끝나도록 만듬
  • XML 설정의 필요성을 제거함
  • 서버 구동에 필요한 모든 것들을 jar에 담아 배포할 수 있음
    • Spring Boot 내에 웹 서버를 내장하므로 배포가 간단함
  • 테스트에서 필요한 빈만 로드하도록 도와 테스트 속도를 향상시킴

Spring Data

Spring 프레임워크에서 데이터베이스를 추상화하여 사용할 수 있도록 하는 프레임워크

  • Repository: 데이터베이스를 추상화한 컴포넌트
    • 메소드 이름 표현으로 SQL을 작성할 수 있음

Spring Data JPA

Spring에서 JPA를 쉽게 사용할 수 있도록 돕는 프레임워크

profile
🦈

0개의 댓글