Open a-young-kim opened 5 months ago
저도 궁금했던 내용이라 gpt답변 첨부합니다
팩토리 빈(factory bean)은 객체의 생성 로직을 캡슐화하여 필요한 곳에서 쉽게 객체를 생성하고 관리할 수 있도록 하는 디자인 패턴입니다. 스프링에서는 주로 애플리케이션 컨텍스트에 빈을 등록하는 데 사용됩니다. 팩토리 빈을 사용하면 객체 생성의 복잡한 로직을 캡슐화하고, 재사용성과 관리성을 높일 수 있습니다.
초기화와 설정의 한 번성 EmbeddedDatabaseBuilder는 데이터베이스를 설정하고 초기화하는 작업을 한 번만 수행합니다. 이 초기화 작업이 완료되면 EmbeddedDatabase 인스턴스가 생성되고, 이 인스턴스를 통해 데이터베이스와 상호작용하게 됩니다. EmbeddedDatabaseBuilder는 이후에 다시 사용되지 않으며, 초기화 과정에서만 필요합니다.
팩토리 빈의 역할 팩토리 빈은 이러한 일회성 초기화 로직을 캡슐화하는 역할을 합니다. 팩토리 빈을 사용하면 EmbeddedDatabaseBuilder를 통해 데이터베이스를 설정하고 초기화하는 로직을 하나의 빈으로 묶어서 관리할 수 있습니다.
중앙 집중화된 관리 초기화 로직을 중앙에서 관리할 수 있습니다. 예를 들어, 데이터베이스 설정을 변경해야 할 때 한 곳만 수정하면 됩니다. 여러 클래스에서 동일한 초기화 로직을 반복하지 않고, 팩토리 빈을 통해 일관되게 관리할 수 있습니다.
재사용성 동일한 초기화 로직을 여러 곳에서 재사용할 수 있습니다. 팩토리 빈을 사용하면 필요한 곳에서 이 빈을 주입받아 사용할 수 있습니다.
의존성 주입의 장점 스프링의 의존성 주입 기능을 활용하여 다른 빈들에 EmbeddedDatabase 빈을 주입할 수 있습니다. 이를 통해 각 클래스가 직접 데이터베이스를 초기화하지 않고, 스프링 컨텍스트에서 자동으로 주입받을 수 있습니다.
유지보수성 데이터베이스 초기화 로직이 변경되더라도 팩토리 빈에서만 수정하면 됩니다. 코드의 유지보수가 용이해집니다.
라이프사이클 관리 스프링은 빈의 생명주기를 관리합니다. 팩토리 빈을 사용하면 데이터베이스 초기화와 종료(cleanup) 작업을 스프링이 관리하도록 할 수 있습니다. 예를 들어, 애플리케이션 종료 시점에 데이터베이스 연결을 정리하는 작업을 자동으로 처리할 수 있습니다.
환경별 설정 용이성 다양한 환경(dev, test, prod)에 따라 데이터베이스 초기화 설정을 다르게 할 수 있습니다. 프로파일(profile)별로 다른 팩토리 빈을 정의하여 사용할 수 있습니다.
예시 코드 다음은 EmbeddedDatabaseBuilder를 팩토리 빈으로 사용하여 내장형 데이터베이스를 초기화하는 예시입니다:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
@Configuration
public class DataSourceConfig {
@Bean
public EmbeddedDatabase dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2) // H2 데이터베이스 타입 설정
.addScript("classpath:schema.sql") // 스키마 초기화 스크립트 추가
.addScript("classpath:data.sql") // 데이터 초기화 스크립트 추가
.build(); // 데이터베이스 빌드 및 초기화 수행
}
}
이 예제에서 DataSourceConfig 클래스는 데이터베이스 초기화 로직을 캡슐화한 팩토리 빈을 정의하고 있습니다. EmbeddedDatabaseBuilder를 사용하여 데이터베이스를 설정하고, build() 메서드를 통해 초기화된 EmbeddedDatabase 인스턴스를 생성합니다. 이 인스턴스는 스프링 컨텍스트에 빈으로 등록되어 다른 빈들이 주입받아 사용할 수 있습니다.
EmbeddedDatabaseBuilder를 사용하여 내장형 데이터베이스를 초기화하는 과정을 팩토리 빈으로 만드는 이유는 중앙 집중화된 관리, 재사용성, 유지보수성, 의존성 주입의 편리함, 라이프사이클 관리, 환경별 설정 용이성 등 다양한 장점을 제공하기 때문입니다. 이러한 이유로 팩토리 빈을 사용하여 데이터베이스 초기화 로직을 관리하는 것이 권장됩니다.
p.634
EmbeddedDatabaseBuilder를 사용할 때 초기화 코드가 필요한데 이를 팩토리 빈으로 만드는 것이 좋다고 합니다. 그 이유를 책에서는
EmbeddedDatabaseBuilder 오브젝트는 한 번 초기화를 거쳐서 내장형 DB를 기동하고 이에 접근할 수 있는 EmbeddedDatabase를 만들어주면 그 이후 사용할 일은 없다
라고 설명하였습니다.하지만 왜 팩토리 빈으로 만드는 것이 좋은 지 이해가 잘 되지 않아서 설명 부탁드립니다.