4. Spring - Bean, AOP, Proxy, Reflection

hsso_o·2024년 7월 18일
0

스터디

목록 보기
29/44

Bean

  • 스프링 IoC (Inversion of Control) 컨테이너에 의해 관리되는 객체
  • 특징
    • 싱글톤
      • 애플리케이션 내에서 하나의 인스턴스만 생성되어 사용
      • 필요에 따라 프로토타입 스코프 등을 사용하여 여러 인스턴스를 생성 가능
    • 의존성 주입
      • 스프링 빈 간의 의존성은 컨테이너가 자동으로 주입
    • 라이프 사이클 관리
      • 스프링 컨테이너가 빈의 생성, 초기화, 소멸 등 라이프 사이클 관리

Bean Scope

  • 스프링 빈이 생성될 때 생성되는 인스턴스의 범위를 의미
    Bean ScopeDescription
    Singleton하나의 인스턴스만을 생성하고, 모든 빈이 해당 인스턴스를 공유하여 사용한다.
    Prototype매번 새로운 인스턴스를 생성한다.
    RequestHTTP 요청을 처리할 때마다 새로운 인스턴스를 생성하고, 요청 처리가 끝나면 인스턴스를 폐기한다. 웹 애플리케이션 컨텍스트에만 해당된다.
    SessionHTTP 세션 당 하나의 인스턴스를 생성하고, 세션이 종료되면 인스턴스를 폐기한다. 웹 애플리케이션 컨텍스트에만 해당된다.

빈 정의 방법

  • XML 설정
    • 스프링 설정 파일(applicationContext.xml)에 빈을 정의
  • 자바 설정 클래스
    • @Configuration과 @Bean 어노테이션을 사용하여 자바 클래스에서 빈을 정의
  • 컴포넌트 스캔과 어노테이션
    • @Component, @Service, @Repository, @Controller 어노테이션을 사용하여 클래스에서 직접 빈을 정의하고, @Autowired 등을 사용하여 의존성을 주입받음

빈의 라이프 사이클

  1. 빈 생성: 컨테이너가 빈의 인스턴스를 생성합니다.
  2. 의존성 주입: 필요한 의존성을 주입받습니다.
  3. 초기화 메서드 호출: 초기화 작업을 위해 정의된 메서드를 호출합니다.
  4. 빈 사용: 애플리케이션에서 빈을 사용합니다.
  5. 소멸 전 메서드 호출: 컨테이너 종료 시 소멸 작업을 위해 정의된 메서드를 호출합니다.
  6. 빈 소멸: 빈의 인스턴스를 제거합니다.
  • 빈 라이프사이클 메서드는 @PostConstruct와 @PreDestroy 어노테이션을 사용하거나, XML 및 자바 설정에서 명시 가능
@Component
public class MyBean {

    @PostConstruct
    public void init() {
        // 초기화 작업
    }

    @PreDestroy
    public void destroy() {
        // 소멸 전 작업
    }
}

AOP(Aspect Oriented Programming)

  • 관점 지향 프로그래밍
  • 중복되는 공통 코드를 분리하고 코드 실행 전이나 후의 시점에 해당 코드를 삽입
    • 소스 코드의 중복 감소
    • 필요할 때마다 가져다 쓸 수 있게 객체화 -> 유지보수 용이
      -> 부가 기능을 따로 관리하는 것
  • 핵심적인 비즈니스 로직으로부터 횡단 관심사를 분리하는 것에 목적

횡단 관심사(Cross-Cutting Concern)
애플리케이션의 여러 부분에서 공통적으로 사용되는 기능이나 관심사
ex) 로깅, 트랜잭션 관리, 보안 등

  • 장점
    • 모듈화 : 횡단관심사를 별도의 모듈로 분리해 코드 중복 줄이고 유지보수 쉬워짐
    • 유연성 : 특정 기능을 여러 객체에 쉽게 적용 가능
    • 가독성
    • 재사용성

핵심 용어

용어설명
Aspect공통 기능을 모듈화한 단위로, 여러 애플리케이션 객체에 적용될 수 있는 부가 기능을 정의
Advice특정 조인포인트에서 수행되는 작업
Join pointAdvice가 적용될 수 있는 위치를 말한다.
PointcutJoin point 중에서 Advice가 적용될 가능성이 있는 부분을 선별한 것을 말한다.
WeavingAdvice를 핵심 비즈니스 로직에 적용하는 것을 말한다. -> Aspect를 실제 객체에 적용하는 과정

어드바이스 유형

종류설명
Before대상 메소드가 실행되기 이전에 실행되는 어드바이스
After-returning대상 메소드가 정상적으로 실행된 이후에 실행되는 어드바이스
After-throwing예외가 발생했을 때 실행되는 어드바이스
After대상 메소드가 실행된 이후에(정상, 예외 관계없이) 실행되는 어드바이스
Around대상 메소드 실행 전/후에 적용되는 어드바이스

AOP 동작 방식

  • 프록시 패턴을 사용하여 AOP를 구현
    • 기본적으로 런타임에 프록시 객체를 생성하여 Aspect를 적용
  1. 클라이언트 호출: 클라이언트가 메서드를 호출.
  2. 프록시 객체 호출: 실제 객체가 아닌 프록시 객체를 통해 메서드가 호출됨.
  3. 어드바이스 적용: 프록시 객체는 해당 메서드 호출 전, 후, 또는 예외 시 어드바이스를 적용.
  4. 실제 메서드 호출: 어드바이스 적용 후 실제 메서드를 호출.
  5. 결과 반환: 실제 메서드 호출 결과를 클라이언트에게 반환.

프록시(Proxy)

  • 기존의 객체를 감싸서 그 객체의 기능을 확장하거나 변경할 수 있게 해줌
    • 다른 객체에 대한 접근을 제어하거나 추가 기능을 제공하는 중간 객체
  • 특징
    • 접근 제어 : 원래 객체에 대한 접근 제어 가능
      • 접근 권한 확인, 로깅 기능 추가 등
    • 지연 초기화
      • 실제 객체의 생성을 지연시킬 수 있음

리플렉션(Reflection)

  • 자바의 런타임에 클래스, 메서드, 필드 등을 동적으로 조작할 수 있는 기능을 제공
    • 런타임에 객체의 메서드를 호출하거나 필드 값을 변경하는 등의 작업 가능
  • 특징
    • 동적 객체 생성 및 조작
    • 클래스 정보 추출

동작 원리

  1. Class 로딩: JVM은 클래스가 필요할 때 해당 클래스를 로딩하고, 클래스의 정보를 메모리에 올립니다. 이 때, Class 객체가 생성됩니다.

  2. Class 객체 획득: 로딩된 클래스의 메타데이터에 접근하기 위해 Class 객체를 얻습니다. 이 객체는 클래스의 필드, 메서드, 생성자 등의 정보를 제공합니다.

  3. 메타데이터 접근: Class 객체를 사용하여 필드, 메서드, 생성자 등의 세부 정보에 접근할 수 있습니다. 이 정보를 통해 프로그램은 실행 중에 클래스의 구조를 분석하고, 필요한 메서드를 호출하거나 필드를 수정할 수 있습니다.

profile
아뇨 소혠데요-

0개의 댓글