스프링 DI
빈 설정 예제
applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 데이터베이스 설정 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/board_db"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</bean>
<!-- DAO -->
<bean id="boardRepository" class="com.example.board.repository.BoardRepository">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 서비스 -->
<bean id="boardService" class="com.example.board.service.BoardService">
<property name="boardRepository" ref="boardRepository"/>
</bean>
</beans>
1. 메이븐 프로젝트 생성
2. pom.xml - Spring Framework 관련 의존성 추가 (spring-context, spring-jdbc) 등 작성
3. 프로젝트 메이븐 업데이트
4. src/main/resource에 applicationContext.xml 파일 생성
빈으로 스프링 컨테이너 생성
스프링 빈 설정 (데이터베이스 설정, 서비스 객체 설정 등)
대충 빈즈 < 빈(여러개 또는 하나) < 프로퍼티(빈안에 여러개 또는 하나) < 리스트(값), 맵(키,값) 등등
데이터베이스 설정이나서비스 설정 코드를 작성하고
제네릭엑스엠엘앱컨텍스트 클래스 임포트 하고 뉴 생성자주입하고
겟 빈 해서 applicationContext.xml에 작성했던 스프링컨테이너에서 빈 객체를 가져다 쓴다.
GenericXmlApplicationContext ctx =
new GenericXmlApplicationContext("classpath:applicationContext.xml");
BoardsService bs = ctx.getBean("BoardService",BoardsService);
beans 태그 안에 여러 개의 bean 태그가 들어가고, 각 bean은 property를 가질 수 있어요.
리스트(List)나 맵(Map) 같은 컬렉션을 프로퍼티로 설정하는 것도 가능하지만, jdbcUrl 같은 설정은 개별 빈으로 설정해야 해요.
GenericXmlApplicationContext는 XML 설정을 로드하는 컨테이너예요.
new GenericXmlApplicationContext("classpath:applicationContext.xml"); 를 사용하면 스프링 컨테이너가 초기화되지만, 보통 ApplicationContext 인터페이스로 참조하는 것이 일반적이에요.
빈 객체 가져오기
- getBean("id", 클래스) 메서드를 사용하여 스프링 컨테이너에서 빈을 가져옴
- BoardService 클래스 타입을 지정하면 형 변환 불필요
- ctx.getBean("boardService") 도 가능하지만, 반환 타입을 지정하는 것이 안전함
- jdbcUrl 같은 설정이 리스트나 맵이 아니라 개별 속성으로 관리됨
- getBean() 호출할 때 클래스 타입을 지정하는 것이 더 안전함
- 스프링 컨테이너(ApplicationContext)가 빈을 관리
- 각 빈은 @Autowired(어노테이션 방식) 또는 property(XML 방식)으로 다른 빈을 주입받음
- XML 설정을 기반으로 GenericXmlApplicationContext를 통해 스프링 컨테이너를 생성
- ctx.getBean("id", 클래스명.class)로 빈을 가져옴
지금도 개념을 잘 잡고 있는데, "jdbcUrl 같은 설정은 리스트가 아니라 속성으로 설정한다", "getBean() 사용 시 타입을 지정하면 더 안전하다"