본문 바로가기
Lecture/Spring

[본격 게시판짜기 Part3.5 Spring MVC] SqlMapClientDaoSupport활용, Model 변경하기

by cusmaker 2012. 10. 13.
반응형

2012/06/13 - [Lecture/HTML] - [본격 게시판짜기 Part1.1 - 게시판도 HTML부터] 게시글 리스트

2012/06/13 - [Lecture/HTML] - [본격 게시판짜기 Part1.2 - 게시판도 HTML부터] 글입력폼

2012/06/13 - [Lecture/Javascript-기초] - [본격 게시판짜기 Part1.3 - Dom 맛보기 ] 글입력폼 검사

2012/06/13 - [Lecture/Jsp] - [본격 게시판짜기 Part1.4 - HTML-> JSP] form 파라미터 받기

2012/06/26 - [Lecture/SQL / Oracle] - [본격 게시판짜기 Part1.5 JSP > Oracle] 게시판 DB 테이블 생성

2012/06/26 - [Lecture/Jsp] - [본격 게시판짜기 Part1.6 Oracle > JSP] Database 접속 및 Select

2012/07/05 - [Lecture/Jsp] - [본격 게시판짜기 Part1.7 JSP, SQLDeveloper] 게시글 입력 및 리스트조회기능

2012/07/08 - [Lecture/Jsp] - [본격 게시판짜기 Part1.8 JSP 게시글 조회] 게시글 조회기능 및 게시글 삭제

2012/07/10 - [Lecture/Jsp] - [본격 게시판짜기 Part2.1 Model2 MVC패턴] 뷰(View) 코드 분리

2012/07/10 - [Lecture/Jsp] - [본격 게시판짜기 Part2.2 Model2 MVC패턴] Entity Beans의 사용

2012/07/12 - [Lecture/Jsp] - [본격 게시판짜기 Part2.3 Model2 MVC패턴] Controller구성

2012/07/13 - [Lecture/Jsp] - [본격 게시판짜기 Part2.4 Model2 MVC패턴] Model 구성

2012/07/16 - [Lecture/Mybatis] - [본격 게시판짜기 Part2.5 Model2 MVC패턴] Model 구성2 - i-batis의 사용

2012/07/17 - [Lecture/Mybatis] - [본격 게시판짜기 Part2.6 Model2 MVC패턴] Model 구성2 - i-batis의 사용2

2012/07/21 - [Lecture/Mybatis] - [본격 게시판짜기 Part2.7 Model2 MVC패턴] i-batis의 queryForList 활용 Paging기능구현

2012/07/22 - [Lecture/Jsp] - [본격 게시판짜기 Part2.8 Model2 MVC패턴] count기능추가

2012/07/28 - [Lecture/Jsp] - [본격 게시판짜기 Part2.9 Model2 MVC패턴] 파일업로드 기능추가

2012/07/28 - [Lecture/Jsp] - [본격 게시판짜기 Part2.10 Model2 MVC패턴] 파일다운로드/삭제 기능추가

2012/07/31 - [Lecture/Jsp] - [본격 게시판짜기 Part3.1 Spring MVC] Ajax란?

2012/08/28 - [Lecture/Jsp] - [본격 게시판짜기 Part3.2 Spring MVC] lightbox 적용하기

2012/09/22 - [Lecture/Spring] - [본격 게시판짜기 Part3.3 Spring MVC] Spring MVC 개요 및 설정하기

2012/09/22 - [Lecture/Spring] - [본격 게시판짜기 Part3.4 Spring MVC] Spring MVC 개요 및 설정하기2


안녕하세요 cocy입니다.


지난시간에는 스프링 라이브러리를 설정하고

컨트롤러 구성후 restful 서비스를 구현하여

listAction을 실행시켜 list페이지를 띄우는것까지 성공하였는데요,


이때 listAction에서 사용되는 DAO는 기존에 구성한 DAO인데 이를

스프링에서 지원하는 SqlMapClientDaoSupport 객체를 사용하여

변경해 보도록 하겠습니다. 


현재 사용되는 DAO와 비교하자면 

성능이나 기능이나 별반 크게 다른 부분은 없지만,

스프링 스타일로 갑시다. 


작업은 어렵지 않습니다. 되도록 이해를 중점으로 봐주시기바랍니다.


일단 보실 부분은 BoardService.java의 listAction입니다.

@Service

public class BoardService extends BoardController {


@Override

public ModelAndView listAction(@PathVariable Integer page) throws Exception {

if(page == null){ // 넘어온 파라미터가 있다면

page =0;

}  // 해당 파라미터를 int형으로 캐스팅후 변수에 대입합니다.

ArrayList<Board> articleList = BoardDao.getInstance().getArticleList(page);

// 그리고 변경된 dao 메서드에 넣어줍니다.

ModelAndView mav = new ModelAndView("list");

mav.addObject("articleList", articleList); // 셋팅된 리스트를 뷰에 포워드합니다.

mav.addObject("page", page);// 페이지번호를 뷰에서 보기위해 표시합니다.

return mav;

}

//이후생략


변경후 >>

 @Service

public class BoardService extends BoardController {

@Autowired

private BoardDao boardDao;

@Override

public ModelAndView listAction(@PathVariable Integer page) throws Exception {

if(page == null){ // 넘어온 파라미터가 있다면

page =0;

}  // 해당 파라미터를 int형으로 캐스팅후 변수에 대입합니다.

ArrayList<Board> articleList = boardDao.getArticleList(page);

// 그리고 변경된 dao 메서드에 넣어줍니다.

ModelAndView mav = new ModelAndView("list");

mav.addObject("articleList", articleList); // 셋팅된 리스트를 뷰에 포워드합니다.

mav.addObject("page", page);// 페이지번호를 뷰에서 보기위해 표시합니다.

return mav;

}

//이후생략



차이점이 보이시나요?

단순히 @Autowired 어노테이션을 달고 boardDao 객체를 선언해 준뒤

이를 dao호출과정에서 사용한 것밖엔 차이점이 없습니다.


@Autowired  어노테이션은 클래스가 선언부 상단에 

스프링컨테이너에 등록시키는 어노테이션들(@Service, @Controller, @Repository-여기서사용됨 등등)중 하나를

사용했을때 해당 클래스이름의 제일 앞글자를 소문자로한 형태를 id로 갖고 스프링컨테이너에 등록됩니다.

(클래스이름이 BoardDao라면 boardDao)

해서 해당 객체의 변수명을 id로 만들고 @Autowired 어노테이션을 달아주면

자동으로 해당 객체를 셋팅해주게됩니다.

기존에 스프링 하위버전이나 어노테이션을 사용하지 않을 경우에는 

application-context 설정파일(xml)에 

해당 빈을 등록후 사용시에는 변수와 더불어 setter()를 사용해야 하나,

어노테이션을 사용하게되면 이런 수고들을 덜게됩니다.

 


그럼 다음으로 dao를 직접 고쳐보도록 합시다.

보실부분은 com.board.dao패키지의 BoardDao.java입니다.

public class BoardDao extends CommonDao {

public static BoardDao getInstance() {

BoardDao _instance = new BoardDao();

_instance.SetDB();

return _instance;

}

@SuppressWarnings("unchecked")

public ArrayList<Board> getArticleList(int page) throws SQLException  {

return  (ArrayList<Board>)GetDB().queryForList("getArticleList", null, page, 10 );

}


현재 소스를 보게되면 데이터베이스 접속정보를 가진 CommonDao를 상속받고 

GetDB()메소드를 통해 각종 함수를 호출하고 있는데요,


기억 나실지 모르겠지만 스프링 설정내용중 spring.board.config패키지의 dataSource.xml파일을 잠깐 보겠습니다.

    <!-- database 계정정보 및 드라이버정보 -->

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"

destroy-method="close" p:driverClass="core.log.jdbc.driver.OracleDriver"

p:jdbcUrl="jdbc:oracle:thin:@localhost:1521:xe" p:user="board"

p:password="board" />

<!-- 트랜젝션 매니져 -->

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager"

p:dataSource-ref="dataSource" />

<!-- ibatis SqlmapConfig -->

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"

p:dataSource-ref="dataSource" p:configLocation="classpath:spring/board/config/sqlMapConfig.xml" />

이미 데이터베이스에 관한 모든 설정이 되어있습니다. CommonDao를 상속할 이유가 없어지는 거죠.

쿨하게 지워주시고, SqlMapClientDaoSupport 객체를 상속받도록 하겠습니다.

그리고 getDB대신 getSqlMapClient() 메소드로 변경합니다.

※ 변경 tip : Ctrl + F > find : getDB() > replace with : getSqlMapClient() > replace All 클릭!


그리고

해당 액션에서 사용하기위한 인스턴스를 반환하는 getInstance()메소드를 구현하고 있는데요,

더이상 필요없습니다. 과감하게 지워주시고 다음의 코드를 삽입합니다.

@Resource(name="sqlMapClient")

public void setSuperSqlMapClient(SqlMapClient sqlMapClient){

super.setSqlMapClient(sqlMapClient);

}


수정된 최종 소스는 다음과 같습니다.

@Repository

public class BoardDao extends SqlMapClientDaoSupport{

@Resource(name="sqlMapClient")

public void setSuperSqlMapClient(SqlMapClient sqlMapClient){

super.setSqlMapClient(sqlMapClient);

}

@SuppressWarnings("unchecked")

public ArrayList<Board> getArticleList(int page) throws SQLException  {

return  (ArrayList<Board>)getSqlMapClient().queryForList("getArticleList", null, page, 10 );

}



여기서 @Repository 어노테이션을 사용하였는데요,

컨트롤러 클래스에 @Controller 어노테이션을 사용하듯,

Dao클래스에 사용되는 어노테이션입니다.


이상으로 DAO교체 작업이 끝났습니다.

간단하죠? 그런데 무언가 마무리가 깔끔하지 않습니다.


스프링스타일로 고쳤으니 패키지명도 변경하도록 하죠.

com.board.dao > spring.board.model



결론적으로 더이상 commonDao는 사용되지 않게 되었으며, 

사용시에는 인스턴스를 직접 사용하지않고 어노테이션으로 자동 매핑된 객체로부터 메소드를 사용합니다.


정상적으로 돌아가는지 한번 확인해 보시기 바랍니다.


수고하셨습니다.


다음장(MultipartResolver) >> http://cusmaker.tistory.com/135