[Day 25 | Spring] Bean 예제 코드

y♡ding·2024년 11월 15일
0

데브코스 TIL

목록 보기
160/163

1. Bean Configuration

1.1 기본 빈 설정
  • 스프링에서 Java Config를 사용해 빈을 생성하고 설정할 수 있습니다.
  • 빈은 @Bean 어노테이션으로 정의되며, 설정 클래스에서 관리됩니다.

코드 예시:

package org.example.di05;

import org.springframework.context.annotation.Bean;

public class BeanConfig {
    @Bean
    public BoardTo boardTo() {
        BoardTo to = new BoardTo();
        to.setSeq(1);
        to.setSubject("제목 1");
        return to;
    }
}
1.2 의존성 설정
  • Setter Injection: 객체의 setter 메서드를 통해 의존성을 주입합니다.

코드 예시:

@Bean
public Action writeAction() {
    BoardTo to = new BoardTo();
    to.setSeq(2);
    to.setSubject("제목2");

    WriteAction writeAction = new WriteAction();
    writeAction.setTo(to); // Setter Injection
    return writeAction;
}
1.3 메서드 재사용
  • 빈 생성 메서드를 호출해 의존성을 주입할 수도 있습니다.

코드 예시:

@Bean
public WriteAction writeAction1() {
    WriteAction writeAction = new WriteAction();
    writeAction.setTo(boardTo()); // 재사용 가능
    return writeAction;
}

2. Bean Lifecycle

2.1 초기화 및 소멸 메서드 설정
  • @BeaninitMethoddestroyMethod 속성을 사용하여 커스텀 초기화 및 소멸 메서드를 지정할 수 있습니다.

코드 예시:

@Bean(initMethod = "init_method", destroyMethod = "destroy_method")
public Action action() {
    return new WriteAction();
}

WriteAction 클래스:

public class WriteAction implements Action {
    public WriteAction() {
        System.out.println("WriteAction() 생성자 호출");
    }

    @Override
    public void execute() {
        System.out.println("execute() 실행");
    }

    public void init_method() {
        System.out.println("init_method() 호출");
    }

    public void destroy_method() {
        System.out.println("destroy_method() 호출");
    }
}
실행 순서:
1. WriteAction() 생성자 호출
2. init_method() 호출
3. execute() 실행
4. destroy_method() 호출

3. Component Scan

3.1 자동 구성
  • @Component를 사용하여 클래스를 스프링 빈으로 등록합니다.
  • @ComponentScan을 통해 특정 패키지를 스캔하고 빈을 자동으로 탐색합니다.

코드 예시:

@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization 호출");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization 호출");
        return bean;
    }
}

BeanConfig 설정:

@ComponentScan(basePackageClasses = {CustomBeanPostProcessor.class})
public class BeanConfig {
    @Bean(initMethod = "init_method", destroyMethod = "destroy_method")
    public Action action() {
        return new WriteAction();
    }
}
Component Scan 특징:
  • 지정된 패키지 내의 모든 @Component를 자동으로 탐색하여 빈으로 등록.
  • 특정 클래스만 스캔하려면 basePackageClasses 옵션 사용.

4. Config 파일 분리 및 통합

4.1 Config 분리
  • 여러 개의 @Configuration 클래스를 작성하여 모듈화 가능.
  • 각 Config 클래스는 서로 다른 역할을 수행.
4.2 Config 통합
  • @Import를 통해 여러 Config를 하나로 통합.

코드 예시:

@Configuration
public class BeanConfig1 {
    @Bean
    public BoardTo boardTo() {
        return new BoardTo();
    }
}

@Configuration
public class BeanConfig2 {
    @Bean
    public Action writeAction() {
        return new WriteAction();
    }
}

@Configuration
@Import({BeanConfig1.class, BeanConfig2.class})
public class MainConfig {
}

5. 주의 사항

  • 중복된 빈 이름: 동일한 이름의 메서드가 여러 Config에서 정의되면 에러 발생.
    • 단, 최후에 호출된 메서드가 우선순위를 가지며 에러가 나지 않을 수도 있음.
  • Config 통합: @Import를 사용해 한 Config에서 모든 설정을 통합 관리.

6. 학습 요약

  1. Bean 등록 및 설정:

    • Java Config에서 @Bean 어노테이션으로 설정.
    • 메서드 호출 또는 Setter Injection으로 의존성 주입.
  2. Bean 생명주기 관리:

    • @Bean(initMethod, destroyMethod)를 통해 커스텀 초기화 및 소멸 메서드 지정.
    • BeanPostProcessor로 초기화 전후 로직 추가 가능.
  3. 자동 구성:

    • @Component@ComponentScan으로 빈 자동 등록 및 관리.
  4. Config 모듈화:

    • Config 파일을 여러 클래스로 분리하고, @Import를 통해 통합 관리 가능.

0개의 댓글

관련 채용 정보