Spring IOC를 통한 객체 생성 방식
Spring 컨테이너는 빈(Bean)을 생성할 때 기본적으로 기본 생성자(No-args constructor)를 사용합니다. 하지만 필요에 따라 파라미터가 있는 생성자를 통해 객체를 생성할 수도 있으며, 설정 방법은 다음과 같습니다.
- 인덱스 기반 주입:
index속성을 사용하여 생성자 파라미터 순서대로 값을 전달합니다. - 타입 기반 주입:
type속성을 사용하지만, 타입 충돌 우려가 있어 권장되지 않습니다. - 이름 기반 주입:
name속성을 사용하여 생성자 매개변수 명칭에 값을 직접 할당합니다.
<bean id="account" class="com.example.pojo.Account">
<constructor-arg name="username" value="admin" />
</bean>
참고: Spring 컨테이너는 설정 파일이 로드되는 시점에 정의된 빈들을 즉시 초기화합니다.
의존성 주입(DI) 및 설정 관리
의존성 주입이란 객체 간의 관계를 컨테이너가 직접 관리하고, 속성을 외부에서 주입하는 기법입니다. P-Namespace와 C-Namespace를 사용하면 XML 설정을 훨씬 간결하게 작성할 수 있습니다.
- P-Namespace:
property태그 대신p:속성명="값"을 사용합니다. - C-Namespace:
constructor-arg태그 대신c:생성자파라미터명="값"을 사용합니다.
빈의 스코프(Scope)는 singleton(기본값, 전체 컨테이너 내 1개)과 prototype(요청 시마다 매번 새로운 객체 생성)으로 나뉩니다.
자동 빈 설정(Auto-wiring)
자동 주입은 XML에 명시적으로 의존성을 적지 않아도 컨테이너가 타입을 분석하여 연결해주는 기능입니다.
- byName: setter 메서드의 이름과 일치하는 ID를 가진 빈을 찾습니다.
- byType: 빈의 타입과 일치하는 객체를 컨테이너에서 찾아 주입합니다.
최근에는 @Autowired나 @Resource 같은 어노테이션을 사용하여 의존성을 주입합니다. @Autowired는 타입 우선, @Resource는 이름 우선으로 동작한다는 차이점이 있습니다.
Java 기반 설정
XML 대신 자바 클래스를 통해 설정을 관리할 수 있습니다. @Configuration 어노테이션이 붙은 클래스는 설정 파일 역할을 하며, @Bean 어노테이션은 메서드가 반환하는 객체를 컨테이너에 등록합니다.
@Configuration
public class AppConfig {
@Bean
public Service myservice() {
return new ServiceImpl();
}
}
대리 패턴(Proxy Pattern)과 AOP 원리
대리 패턴은 실제 객체에 직접 접근하는 대신 대리자(Proxy)를 통해 기능을 확장하는 기법입니다. 이는 AOP(관점 지향 프로그래밍)의 핵심 원리입니다.
- 정적 대리: 인터페이스별로 직접 대리 클래스를 작성해야 하므로 코드량이 많아집니다.
- 동적 대리(JDK Dynamic Proxy): 런타임에 리플렉션(Reflection)을 사용하여 대리 객체를 생성합니다.
InvocationHandler인터페이스를 구현하여 메서드 실행 전후로 부가 기능(로깅, 트랜잭션 등)을 쉽게 삽입할 수 있습니다.
동적 대리를 사용하면 비즈니스 로직과 인프라 코드(로그 출력, 권한 체크 등)를 완벽하게 분리하여 유지보수성을 극대화할 수 있습니다.