Develop

27일차_Spring-core(Scope, Bean, DI, AOP), Spring-mvc(Context) 본문

백엔드/KDT_Programmers

27일차_Spring-core(Scope, Bean, DI, AOP), Spring-mvc(Context)

230801 2025. 4. 9. 23:47

안녕하세요!

오늘은 4/9(수) 27일차(6주 3일차) 입니다.

 

스프링 코어, MVC에 대해서 학습했습니다.

어제 공부를 해서 그런지 오늘 수업 이해도가 조금 있었고, 코드를 놓치는일도 조금 줄었습니다 ^-^b

 

Spring 에서 Scope

Scope는 Spring Bean의 생명주기와 가시성을 정의하는 설정

  • 주요 Scope
    • Singleton
      • 기본값이며, Spring IoC 컨테이너당 하나의 Bean 인스턴스를 생성함
      • 스프링 컨테이너가 시작될 때 객체를 생성하고 등록함
    • Prototype
      • 요청이 들어올 때마다 새로운 Bean 인스턴스를 생성함
      • Bean은 미리 등록 되지만 객체는 사용할 때마다 생성
    • Request
      • HTTP 요청 당 하나의 Bean 인스턴스를 생성함
      • 웹 애플리케이션에서만 사용 가능
      • 웹 요청 마다 새로 생성됨 (Spring Web에서만 해당)
    • Session : HTTP 세션 당 하나의 인스턴스를 생성함
      • 웹 애플리케이션에서만 사용 가능
    • Application
      • 하나의 WebApplicationContext 기준으로 인스턴스를 생성하고 공유함

 

Spring Container 에서 Bean 등록 및 관리 (XML vs Annotation)

1. XML 기반 Bean 등록

XML 파일(application-context.xml)을 사용하여 Spring Bean을 정의하고 등록

  • Book, CheatSheet, Score 등의 클래스를 XML에서 빈으로 선언하고, 이를 Spring Container가 관리함

 

2. 어노테이션을 이용한 Bean등록 (@Autowired)

  • @Component, @Configuration, @Bean 어노테이션을 사용하여 Bean 등록
  • Developer, JdbcProperties, JdbcTemplate 등의 클래스에서 어노테이션으로 Bean을 정의

  • @Component
    • 클래스 자체를 스프링 빈으로 등록
    • 객체 생성 시점 : 스프링이 @ComponentScan 을 통해 자동으로 인식하고 생성함
    • 주로 서비스, 유틸, 설정 객체 등 사용자 정의 클래스에 사용함
    • @Service, @Repository, @Controller 도 결국 @Component의 세부 타입임
  • @Configuration
    • 해당 클래스를 설정 파일로 인식함
    • 내부에서 @Bean 메서드를 포함할 수 있음
    • 객체 생성 시점 : 스프링이 @Configuration 이 붙은 클래스를 분석하여 내부 @Bean 메서드를 실행하고, 그 반환 객체들을 컨테이너에 등록함
  • @Bean
    Bean 은 스프링이 관리하는 자바객체 스프링 컨테이너에 등록돼서 스프링이 생성하고, 필요할때 꺼내주고, 수명관리 해줌
    • 직접 객체를 생성해서 스프링 컨테이너에 등록할 때 사용함
    • 보통 외부 라이브러리 나 제어가 필요한 객체 등록 시 사용함
    • 객체 생성 시점 : @Configuration 클래스 안에서 메서드 단위로 직접 객체를 생성해서 빈으로 등록
    • 선언만 해두면, 스프링이 생성자 호출과 초기화를 자동으로 처리해 줌
    • (수동 등록 + 이름 지정 가능)

 

의존성 주입 (DI)

Autowired 방식

  • @Autowired
    • Spring 이 필요한 의존성(=다른 객체)을 자동으로 주입해주는 어노테이션
  • 사용
    • 필드 or 생성자 or 메서드에 ‘이 타입의 Bean 을 넣어줘’ 라고 요청할 때 사용함
    • 어떤 타입의 Bean 이 여러개 있을때, 배열이나 List로 받고 싶을때 사용 → 스프링이 해당 타입의 빈을 모아서 자동으로 주입해줌
  • @Qualifier
    • 같은 타입의 Bean 이 여러개 있을 때, 그 중 어떤걸 주입할지 지정해주는 어노테이션
    • Autowired 는 기본적으로 타입만 보고 자동주입하는데, 동일 타입의 빈이 2개 이상 있으면 에러남
      • 이럴 때 @Qualifier(”Bean name”) 으로 해결

 

SpEL (Spring Expression Language)

  • SpEL 사용 (c_el)
    • 스프링 표현 언어(SpEL)를 활용하여 Bean의 값을 동적으로 설정하거나, 계산식을 적용하는 방법 학습
  • 학습 내용
    • 리터럴 표현식 (A_Literal.java)
    • 연산자 사용법 (B_Operator.java)
    • 다른 빈 참조 (C_BeanRef.java)
    • 메서드 호출 (D_Method.java)
    • 프로퍼티 파일 값 읽기 (E_Properties.java)

 

Design Pattern - Proxy Pattern

  • 프록시(Proxy)
    • 실제 객체에 접근하기 전, 대리 객체를 통해 간접적으로 접근하게 만드는 디자인 패턴
    • 주로 기능 실행 전후에 부가적인 작업을 끼워 넣을 때 사용함 (ex. 로그, 보안, 트랜잭션 등)
  • 구조
    • Subject (인터페이스): 공통 기능 정의 (Developer)
    • RealSubject (실제 객체): 핵심 로직 담당 (Man, Woman, Child)
    • Proxy (프록시 객체): RealSubject를 감싸고, 대신 메서드를 호출함 (Aspect)
  • 학습 내용
    • 스프링 AOP에서 프록시를 활용하는 방법
      • Proxy를 이용해 핵심 로직 외에 부가 로직을 분리하는 구조를 학습함
        • Aspect 클래스는 내부에 실제 객체(Man, Woman, Child)를 감싸고, develop() 호출 전후로 로그 출력 등 부가 기능을 넣을 수 있음
        • 이 구조는 스프링 AOP에서 사용하는 방식과 거의 동일함 → 실제 AOP는 프록시를 사용해 공통 로직을 메서드 호출 전후에 끼워 넣는 구조로 작동함
      • Developer man = new Aspect(new Man()); Developer woman = new Aspect(new Woman()); Developer child = new Aspect(new Child()); man.develop(); woman.develop(); child.develop();

 

AOP (Aspect-Oriented Programming)를 이용한
횡단 관심사 분리(Cross-Cutting Concern Separation)


횡단 관심사

  • 여러 클래스나 모듈에 공통적으로 반복되는 기능들( ex. 예외처리 기능 : 예외 발생 시 공통 메시지 처리)


분리

  • 이 공통 기능들을 매번 클래스마다 작성하지 않고, 한 곳에 모아서 분리해서 관리하는 것
  • 예시

         횡단 관심사 분리 전 (클래스에 직접 작성)

public void doSomething() {
    System.out.println("로그 찍기 시작");
    // 핵심 기능
    System.out.println("로그 찍기 끝");
}



횡단 관심사 분리 후 (AOP 적용)

  • @LogExecutionTime 애노테이션만 붙이면 됨
  • 실제 로그는 프록시가 알아서 전후로 찍어줌 (핵심로직이 깔끔해지고, 공통 로직은 Aspect 에 관리됨)
@LogExecutionTime
public void doSomething() {
    // 핵심 기능만 남음
}



Interceptor

  • 스프링 AOP 에서 Proxy 를 직접 구현하는 방식 중 하나
  • 개발자가 직접 인터페이스를 구현해서 프록시 클래스 역할을 수행함
  • 핵심 로직 전/후로 수동으로 코드를 작성함
  • 보통 MethodInterceptor, InvocationHandler  등을 구현해서 사용

AutoProxy

  • 스프링이 자동으로 프록시를 생성하고, Advisor/Advice 를 적용해주는 기능
  • 조건에 맞는 클래스나 빈을 스프링이 알아서 감싸줌
  • BeanNameAutoProxyCreator, DefaultAdvisorAutoProxyCreator, AnnotationAwareAspectJAutoProxyCreator 등이 있음
  • @Aspect 기반 AOP도 결국 AutoProxy임 (AnnotationAwareAspectJAutoProxyCreator)

 


공부하면서 궁금한 부분을 정리해봤습니다.

 

오늘의 질문

Command + N 했을 때 오버라이드/implement 차이

  • Override = 부모 클래스의 메서드를 바꿔씀 (재정의)
  • Implement = 인터페이스 메서드를 처음 구현함
  • 둘 다 @Override 붙고, IntelliJ에서 자동완성도 거의 똑같아 보이지만,
  •  맥락(상속 vs 인터페이스 구현) 에 따라 다르게 부름!

 

Context와 Scope의 차이

  • Context : 객체를 담고 관리하는 공간 (ex. 회사(건물))
    • ApplicationContext, WebApplicationContext, ServletContext 등
  • Scope : 그 객체가 살아있는 생명 범위 (ex. 직원 근무기간(계약기간))
    • singleton, prototype, request, session, application 등
    ⇒ 컨텍스트는 많은 객체들을 담고 관리하는 측면에서 회사로 비유하고,
  • 스코프는 각각의 객체가 얼마나 오래, 언제까지 그안에서 일할지를 정하는 근무기간에 비유함

 

 

오늘도 고생하셨습니다 !