두번째 교육...
어제 워크샵을 양평으로 갔다가 일정을 마무리하고 밤에 나와서...피곤해 죽을거 같다.
오늘 수업... 잘 들을 수 있어야 하는디...큰일..ㅋ.ㅋ
오늘은 MVC를 이용해 간단한 게시판을 하나 생성해본다.
1. 프로젝트 시작
- Dynamic web project 를 생성한다
- web.xml 에 servlet 을 정의해준다.
<servlet>
<servlet-name>springapp</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springapp</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
- 환경설정 용 xml 파일은 servlet-name과 이름을 같게(servlet명-servlet.xml)해서 생성해주면 알아서 설정파일을 읽어준다. 따라서 springapp-servlet.xml 로 파일을 생성해서 WEB-INF 폴더 안에 넣어준다.
- 필요한 Lib파일들을 lib에 추가해준다. spring.jar를 비롯한 modules아래 파일과 기타 필요한 파일들을 추가해주고 JRE System Library에 jstl.jar, standard.jar 가 없는 경우 해당 파일도 추가해준다.
2. DB 설정
- com.quantum.feature_3.3.0.2.bin.dist.zip 의 압축을 풀어 안에 있는 두개의 폴더를 eclipse폴더 안에 복사해주고 eclipse를 재실행한다. 재실행 후 이클립스 우측 상단의 perspective 설정 부분에 new 를 클릭해서 Others로 들어가보면 Quantum 이 생성된것을 확인 할 수 있다. Quantum View 선택 후 좌측 Database Bookmarks에서 new Bookmark를 실행한다.
- Add > Add External Jar를 선택하여 ojdbc14.jar 를 추가해줘야 하는데 이 파일은 C:\oraclexe\app\oracle\product\10.2.0\server\jdbc\lib 아래 위치해 있다. (찿기 쉽게 C:\Tomcat6 폴더 아래로 복사해주자 ㅋㅋ)
확인 후 Class선택 부분을 눌러서 oracle.jdbc.driver.OracleDriver를 선택해주자.
다음으로 계정정보 입력창이 나오게 되는데 계정정보를 입력하고 확인을 해주면 좌측 Database Bookmarks에 설정한 이름으로 DB북마크가 생성된것을 확인할 수 있다.
- 사용할 데이터 베이스를 선택하고 board에 사용할 테이블, 시퀀스 등을 생성해서 환경을 설정해준다.
- oracle 10g 메뉴에서 Database 홈페이지로 이동을 눌러 DB홈에서 계정 설정을 맞춰서 생성해주어야 한다.
(DB는 원하는 DB의 플러그인만 이클립스에 설치해주면 다른 DB로 교체 가능하다)
- J2E perspective로 돌아가서 Servers>server.xml을 열어보면 파일 가장 하단에 현재 프로젝트에 대한 Context가 설정되어 있는것을 확인할 수 있다. Context안에 서버 리소스 설정을 해준다.
<Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver" maxActive="100" maxIdle="30" maxWait="10000" name="jdbc/oracle" password="계정비번" type="javax.sql.DataSource" url="jdbc:oracle:thin:@localhost:1521:DB명" username="계정명"/>
3. Controller
- insert_form.do를 맵핑하기 위한 bean을 설정해준다.
<bean name="/insert_form.do" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<property name="viewName" value="/board/insert_form.jsp" />
</bean>
- form에서 데이터를 컨트롤러로 넘겨주기위해서는 Command 객체가 필요하다.
따라서 이 Command객체를 사용할 수 있는 AbstractCommandController로 InsertController 클래스를 생성해 준다.
- InsertController 에서 사용할 command 객체를 연결해준다.
form에서 controller로 데이터를 넘기는 객체를 command객체, DB에서 controller로 데이터를 넘기는 객체를 DTO라고 하는데 정석은 두 객체를 따로 생성해주어야 하나 실습 편의사 DB의 column명과 form의 name값을 일치시켜서 하나의 클래스(Board)로 두 객체의 역활을 담당하도록 하는걸로 진행한다.
따라서 InsertController에서 사용할 Command객체로 Board를 연결해준다.
<bean name="/board_insert.do" class="kosta.controller.InsertController">
<property name="commandClass" value="kosta.model.Board" />
</bean>
4. DI 패턴으로 DAO 받아오기
- Jndi 객체 생성
org.springframework.jndi.JndiObjectFactoryBean 클래스의 빈을 선언해준다. property로 jndiName을 설정해줘야 하는데 Server.xml에서 설정해준 Resource 의 name값을 value로 넣어준다.
외부 리소스를 사용하는 것이기 때문에 resourceRef 를 true로 설정해줘야한다.
<bean id="springDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/oracle" />
<property name="resourceRef" value="true" />
</bean>
- Jdbc Template 객체 생성
생성한 Jndi 객체를 받는 org.springframework.jdbc.core.JdbcTemplate 객체를 생성해 준다. dataSource로 위에서 생성한 Jndi의 id값을 넣어주는 이때 객체를 받는 것이기 때문에 value가 아닌 ref로 선언해 줘야한다
<bean id="springJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="springDataSource" />
</bean>
- DAO에 생성한 jdbc객체를 프로퍼티 방식으로 넘겨준다. 이때 넘겨줄 클래스의 변수명이 property의 name값과 일치해야 한다.
<bean id="boardDao" class="kosta.model.BoardDao">
<property name="myJdbcTemplate" ref="springJdbcTemplate"/>
</bean>
- 이제 InsertController객체에서 생성한 DAO를 받아서 사용할 수 있도록 역시 DI패턴의 프로퍼티 방식으로 DAO를 넘겨주자. 위에서 선언한 InsertController 빈에 property하나만 추가해주면 된다. 이때도 InsertController 내부에 선언한 프로퍼티명과 일치해야 한다. ref에는 위에서 생성한 jdbc를 받은 DAO객체의 id값을 넣어주면 된다.
<property name="boardDao" ref="boardDao"></property>
5. List
- 글 작성 후 리스트로 이동할때는 데이터를 가지고 이동할 필요가 없기때문에 리다이렉트를 넣어서 새로운 ModelAndView를 생성해 리턴한다.
return new ModelAndView("redirect:/board_list.do");
- ListController 클래스의 경우에는 Command를 받아야 할 필요가 없으므로 AbstractController를 상속받거나 일반 Controller 인터페이스를 구현해주어도 된다.
이번에는 인터페이스 구현상식으로 작업을 진행했다.
- BoardDao의 list 메소드 생성
boardDorg.springframework.jdbc.core.RowMapper 를 이용해 데이터를 List형태로 리턴받는다. RowMapper를 inner class로 구현하는데 override 메쏘드로 mapRow가 자동 생성된다. command 겸 DTO로 이용할 Board 객체를 생성해서 set을 이용해 값을 셋팅해주는 소스를 작성하면 RowMapper가 알아서 List에 자동으로 add해서 리스트를 돌려주게 된다
- ListController에서 Dao로 부터 받은 list와 view를 지정해서 ModelAndView객체를 넘겨주면 그 객체를 받아서 view를 구현해 준다.
- list.jsp 파일
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
상단에 위 소스를 선언해 주고 루프가 들어가야 할 부분을 <c:forEach>로 감싸주어 구현하면 되는데 이때 items에 MAV로 부터 넘겨준 list를 선언해준다.
<c:forEach var="board" items="${list }">
<tr>
<td>${board.seq }</td>
...
</tr>
</c:forEach>
6. View
- myJdbcTemplate.queryForObject 메소드를 통해 조건에 해당하는 데이터를 가지고 온다.
board = myJdbcTemplate.queryForObject(sql, value, mapper);
7. SimpleFormController
- 글 수정시에 DB에서 기존 자료를 가져오는 DTO와 글 수정후 DB에 저장하는 Command를 가진 Controller두개를 하나로 처리하도록 해주는 컨트롤러이다.
글 수정 폼으로 이동시에는 글 번호를 가진 get 방식으로 이동하고, 글 수정 완료시에는 post방식으로 데이터가 이동하는 것에 착안한것으로 같은 컨트롤러에서 데이터 전송방식에 따라 처리를 다르게 해준다.
- formBackingObject, onSubmit 메소드를 이클립스 소스생성기로 override해준다.
이때 formBackingObject 메쏘드는 super 클래스인 AbstractController 내부에 위치하고 있다.
- formBackingObject 메소드에서 isFormSubmission(request) 를 체크해서 true인경우는 Post방식, false인경우는 Get방식으로 분기 처리해준다.
- Get 경우
view페이지 구현시와 마찬가지로 request에서 seq를 받아서 view 페이지를 연결해준다.
Get할때 연결할 view페이지를 xml에서 property로 선언해서 추가해 주어야 하며, 처리시에 받아온 command 데이터를 호출하기 위해 commandName선언도 해주어야한다.
<property name="formView" value="/board/update_form.jsp"/>
<property name="commandName" value="boardCmd"/>
- Post 경우
수정폼에서 전송한 데이터를 command 객체화 한다.
board = (Board)super.formBackingObject(request);
Post 전송의 경우 formBackingObject 를 거쳐서 onSubmit을 타게 되는데 이때 onSubmit으로 가져가야 하므로 command객체를 xml파일에서 commandClass를 선언해 준다.
<property name="commandClass" value="kosta.model.Board" />
onSubmit 메쏘드 내에서 업데이트 처리 로직을 구현해준다.
- 업데이트 실패시 이전 폼 화면으로 돌아가도록 처리하기 위해서는 exception 처리를 통해 showForm를 호출하면 된다.
업데이트 성공시에는 xml에 선언해 둔 successView 로 이동하게 할 수 있다.
<property name="successView" value="redirect:/board_list.do"/>
xml에 위와 같이 선언해 둔 후 수정 성공 시 setViewName 에 getSuccessView 메소드를 호출하면 된다.
Spring & Ibatis framework 3 - 2011.10.29 (0) | 2011.10.29 |
---|---|
Javascript Frameworks (0) | 2011.10.26 |
Spring & Ibatis framework 1 - 2011.10.15 (0) | 2011.10.15 |
Java Script Key code (0) | 2011.07.27 |
Asp에서의 인코딩 변환 (0) | 2011.07.22 |