# DAO와 페이지 컨트롤러에 스프링 어노테이션 적용
빈 설정 파일(beans.xml)에 선언된 대로 스프링 IoC 컨테이너는 spms 패키지 및 그 하위 패키지의 클래스 중에서 @Component 어노테이션이 붙은 클래스를 찾아 인스턴스를 생성한다. 실습 프로젝트에서 DAO와 페이지 컨트롤러에 대해 자동으로 객체를 생성하도록 이 어노테이션을 붙여 본다.
spms.dao.MySqlMemberDao 클래스를 다음과 같이 변경한다.
package spms.dao;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.stereotype.Component;
//import spms.annotation.Component;
import org.springframework.beans.factory.annotation.Autowired;
import spms.vo.Member;
//스프링 어노테이션(@Component)으로 변경
@Component("memberDao")
public class MySqlMemberDao implements MemberDao {
SqlSessionFactory sqlSessionFactory;
@Autowired
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
...
}
- @Component 어노테이션
다행히 우리가 만든 어노테이션의 이름도 @Component 이다. 사실 이 때를 대비해 스프링 어노테이션 이름과 같게 만들었다. 그러니 어노테이션 선언 부분은 바꿀 필요가 없고, import문만 변경하면 된다.
//import spms.annotation.Component;
import org.springframework.stereotype.Component;
기존의 import문을 제거하고, 스프링 어노테이션을 선언한다.
- @Autowired 어노테이션
MySqlMemberDao 클래스가 사용할 SqlSessionFactory 객체를 위해 셋터 메서드 선언에 @Autowired를 붙였다. 스프링 IoC 컨테이너는 MySqlMemberDao 인스턴스를 생성한 후 setSqlSessionFactory() 메서드를 호출하여 컨테이너에서 준비한 SqlSessionFactory 객체를 주입할 것이다.
spms.dao.MySqlProjectDao 클래스를 MySqlMemberDao 클래스처럼 어노테이션을 붙인다. 마찬가지로 spms.controls 패키지에 있는 모든 페이지 컨트롤러에 대해 스프링 어노테이션을 붙인다.
# 나의 빈 컨테이너여, 안녕!
지금까지 실습 프로젝트의 DAO와 페이지 컨트롤러 등을 관리하기 위해 만든 어노테이션과 클래스들은 스프링 IoC 컨테이너를 사용함으로써 슬모가 없어졌다. 애써 작성한 것이 아깝지만, 관련 패키지 및 클래스 파일을 삭제한다.
spms.annotation.Component 클래스 및 spms.annotation 패키지를 삭제한다.
지금까지 빈 컨테이너로서 성실히 역할을 수행한 spms.context.ApplicationContext 클래스도 삭제한다.
# ContextLoaderListener 변경
기존의 ContextLoaderListener 클래스에서는 ApplicationContext 객체를 사용하여 자바 객체를 관리하였다. 이제 스프링 IoC 컨테이너를 사용할 것이기 때문에 소스 코드를 변경한다.
spms.listeners.ContextLoaderListener 클래스를 다음과 같이 변경한다.
package spms.listeners;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//스프링 IoC 컨테이너 사용
@WebListener
public class ContextLoaderListener implements ServletContextListener {
static ClassPathXmlApplicationContext applicationContext;
public static ClassPathXmlApplicationContext getApplicationContext() {
return applicationContext;
}
@Override
public void contextInitialized(ServletContextEvent event) {
try {
applicationContext = new ClassPathXmlApplicationContext("beans.xml");
}catch(Throwable e) {
e.printStackTrace();
}
}
@Override
public void contextDestroyed(ServletContextEvent event) {}
}
static ClassPathXmlApplicationContext applicationContext;
public static ClassPathXmlApplicationContext getApplicationContext() {
return applicationContext;
}
우리가 만든 ApplicationContext 클래스를 사용하는 대신에 스프링에서 제공하는 IoC 컨테이너를 사용할 것이기 때문에 클래스 변수와 겟터 메서드를 이에 맞추어 변경한다.
@Override
public void contextInitialized(ServletContextEvent event) {
try {
applicationContext = new ClassPathXmlApplicationContext("beans.xml");
}catch(Throwable e) {
e.printStackTrace();
}
}
웹 애플리케이션을 시작하면 contextInitialized() 메서드가 호출될 것이고, 이 메서드에서는 스프링 IoC 컨테이너(ClassPathXmlApplicationContext)를 준비할 것이다. 스프링 IoC 컨테이너는 beans.xml에 선언된 대로 데이터 소스와 트랜잭션 관리자, mybatis 객체를 생성하고, 클래스 경로에서 DAO와 페이지 컨트롤러를 찾아 인스턴스를 생성할 것이다. 이전 코드에 비하면 훨씬 간결해졌다.
# 프런트 컨트롤러 'DispatcherServlet' 변경
프런트 컨트롤러에서는 페이지 컨트롤러를 꺼내는 부분만 변경하면 된다. 우리가 만든 ApplicationContext 클래스 대신 스프링 클래스로 변경한다.
spms.servlets.DispatcherServlet 클래스를 다음과 같이 변경한다.
package spms.servlets;
import java.io.IOException;
import java.util.HashMap;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import spms.bind.DataBinding;
import spms.bind.ServletRequestDataBinder;
//import spms.context.ApplicationContext;
import org.springframework.context.ApplicationContext;
import spms.controls.Controller;
import spms.listeners.ContextLoaderListener;
//스프링 IoC 컨테이너 사용
@SuppressWarnings("serial")
@WebServlet("*.do")
public class DispatcherServlet extends HttpServlet {
...
}
사실 ApplicationContext 클래스 이름도 스프링의 클래스 이름을 본떠 만든 것이다. 따라서 다음과 같이 import문만 변경하면 된다.
//import spms.context.ApplicationContext;
import org.springframework.context.ApplicationContext;
기존의 import를 삭제하고, 스프링에서 제공하는 ApplicationContext 인터페이스를 import 하였다. 스프링의 ApplicationContext는 클래스가 아니고 인터페이스이다. ClassPathXmlApplicationContext 클래스는 이 인터페이스를 구현한 클래스이다. 따라서 다음의 코드는 계속 유효하다. 변경할 필요가 없다.
ApplicationContext ctx = ContextLoaderListener.getApplicationContext();
# mybatis 설정 파일 및 SQL 맵퍼 파일 정리
mybatis 설정 파일은 이제 더이상 필요 없으니 삭제한다. Gradle 폴더 구조에 따라 SQL 맵퍼 파일은 자바 소스 폴더에서 분리하여 src/main/resources 폴더로 옮긴다.
src/main/java/spms/dao/mybatis-config.xml 파일을 삭제한다.
톰캣 서버의 DataSource 객체를 사용하는 순간 db.properties 파일은 쓸모가 없어졌다. 이 파일도 삭제한다.
src/main/java/spms/dao 폴더에 있는 SQL 맵퍼 파일을 src/main/resources/spms/dao 폴더로 옮긴다.
# 웹 애플리케이션 실행 테스트
SPMS 실습 프로젝트에 스프링 IoC 컨테이너가 잘 적용되었는지 테스트 해본다.
톰캣 서버를 재시작시키고, 이전과 같이 프로젝트 목록 조회와 신규 프로젝트 등록, 변경, 삭제를 테스트한다. 정상적으로 잘 수행할 것이다.
SPMS 실습 프로젝트에 간단히 스프링 IoC 컨테이너를 적용해 보았다.
★ 스프링 IoC 컨테이너 총정리
이번 장에서는 스프링 IoC 컨테이너의 사용 방법을 배웠다. SPMS 실습 프로젝트에 스프링 프레임워크를 적용하기에 앞서, 간단한 예제를 통해 스프링 IoC 컨테이너를 사용하는 방법을 연습하였다. 특히 ClassPathXmlApplicationContext 클래스를 이용하여 빈 설정 파일을 로딩하고 빈을 다루는 방법을 살펴보았다.
빈의 프로퍼티 타입이 String이나 기본 타입이 아닌 경우, 커스텀 프로퍼티 에디터를 사용하여 프로퍼티 값을 할당하였다. 특히 애플리케이션에서 자주 사용하는 java.util.Date 프로퍼티에 대해 커스텀 프로퍼티 에디터를 만들고, 스프링 IoC 컨테이너에 등록하는 것을 실습하였다.
이번 장에서 주목할 점은 Gradle 빌드 도구를 사용한 것이다. 이전 장에서는 mybatis나 MySQL JDBC 드라이버, Log4J와 같은 라이브러리를 사용하려면 해당 홈페이지에 방문하여 내려받아야 했다. 그러나 Gradle을 도입함으로써 이런 불편한 점을 간단히 해결할 수 있었다. Gradle 설정 파일에 의존 라이브러리 정보를 선언해 두면, 메이븐 중앙서버로부터 지정된 라이브러리를 자동으로 내려받기 때문에 의존 라이브러리 관리가 매우 편리하다. Gradle은 단지 의존 라이브러리만 관리하는 것이 아니라 자바 소스를 컴파일하고, 단위 테스트를 수행하고, 이클립스와 관련된 설정 파일을 생성하고 삭제하는 작업도 수행한다.
특히 이 강의의 마지막 실습에서 Gradle과 스프링 IoC 컨테이너를 SPMS 프로젝트에 적용해 봄으로써 스프링 프레임워크의 유용성을 다시 한 번 확인하였다.
참고도서 : https://freelec.co.kr/book/1674/
[열혈강의] 자바 웹 개발 워크북
[열혈강의] 자바 웹 개발 워크북
freelec.co.kr
'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글
| 151. 스프링 IoC 컨테이너 적용 (1) (1) | 2022.11.14 |
|---|---|
| 150. Gradle 적용 (0) | 2022.11.13 |
| 149. 빈 자동 등록 (1) | 2022.11.11 |
| 148. 어노테이션을 이용한 의존 객체 자동 주입 (2) (2) | 2022.11.10 |
| 147. 어노테이션을 이용한 의존 객체 자동 주입 (1) (0) | 2022.11.09 |
댓글