2.8 KiB
2.8 KiB
bean registration 예시
좋은 예시 1: application service는 stereotype 등록
@Service
public class RegisterUserService implements RegisterUserUseCase {
...
}
왜 좋은가:
- 애플리케이션 주 컴포넌트라는 역할이 드러난다
- scanning 기반 등록에 자연스럽다
좋은 예시 2: external client는 configuration + bean
@Configuration
public class VaultClientConfiguration {
@Bean
public VaultTransitClient vaultTransitClient(
VaultProperties properties,
ObjectMapper objectMapper
) {
return new VaultTransitClient(
properties.address(),
properties.token(),
HttpClient.newHttpClient(),
objectMapper
);
}
}
왜 좋은가:
- 외부 라이브러리/인프라 객체 조립이 한 곳에 모인다
- 생성 로직이 명시적이다
좋은 예시 3: security/filter wiring은 configuration에 둠
@Configuration
public class WebConfiguration {
@Bean
public FilterRegistrationBean<TraceIdFilter> traceIdFilter() {
FilterRegistrationBean<TraceIdFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new TraceIdFilter());
return registration;
}
}
왜 좋은가:
- framework wiring 성격이 분명하다
- business component와 분리된다
좋은 예시 4: domain object는 bean으로 등록하지 않음
public record UserEmail(String value) {}
왜 좋은가:
- value object는 container 관리 대상이 아니다
- 생성/검증 책임은 domain에 남는다
나쁜 예시 1: domain entity를 bean으로 등록
@Component
public class User {
...
}
문제:
- domain object 생명주기를 container가 소유하게 된다
- 의미가 맞지 않는다
나쁜 예시 2: @Component 안에 습관적 @Bean
@Component
public class UserFactoryComponent {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
문제:
- full @Configuration 대신 lite mode가 된다
- configuration 역할과 component 역할이 섞인다
개선:
- 별도 @Configuration 클래스로 이동
나쁜 예시 3: 의미 없는 잡다한 config
@Configuration
public class CommonConfig {
@Bean ...
@Bean ...
@Bean ...
}
문제:
- 어떤 조립을 담당하는지 이름만 보고 알기 어렵다
- 변경 이유가 다른 bean이 섞이기 쉽다
나쁜 예시 4: 단순 helper까지 bean으로 올림
@Component
public class StringMaskingHelper {
public String mask(String input) { ... }
}
문제:
- lifecycle/DI 이득이 작다
- plain helper로 둘 수 있다면 굳이 bean일 필요가 없다