sitelink1  
sitelink2  
sitelink3  
extra_vars6  
http://blog.empas.com/ahnyounghoe/13186543
5. Spring MVC 컨틀롤러 작성
먼저 src 폴더에 artcle.web 이라는 패키지를 만들고, AbstractController(Spring MVC컨트롤러 탐험기 [6] AbstractController 정리 참조)를 상속 받아서 ArticleListController 클래스를 생성합니다.
package article.web;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
 
public class ArticleListController extends AbstractController {

 @Override
 protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
  return null;
 }

 
}
 
요청 처리 코드인 handleRequestInternal 메소드를 작성해보죠. 테스트를 먼저 만들어 보면 좋지만 HttpServletRequest 등으로 인해서 약간의 Mockup이 필요하기 때문에 지금은 생략합니다.
 
먼저 화면(view)에 전해줄 모델 객체는 다수의 아티클 링크 정보입니다. 그래서 ArticleLink라는 도메인 객체를 선언했고, 다수이기 때문에 List 컬렉션 타입으로 선언합니다. 이클립스에서 빠른 수정(Quick Fix:Ctrl+1)하면 ArticleLink 클래스를 생성할 수 있죠.
 
List<ArticleLink> model;
 
article.domain 패키지에 만들어보겠습니다.
 
package article.domain;
 
public class ArticleLink {}
 
속성과 협력 객체(collaborator)를 결정해야 하는데, 간단히 모델링을 해봅니다.



대강의 개념 모델을 그려본 것이죠. 아티클링크(ArticleLink)객체가 중심으로 의견을 배제하고 객체를 작성해보면 id, description, title, lang, link, regiDate 등과 회원 객체를 속성(프로퍼티)으로 갖습니다. 회원 객체의 클래스 이름은 UserInfo로 하겠습니다. 우선은 id 속성만 넣죠. 현재 필요한 것은 이 속성 뿐이라서요.
 
package article.domain;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Date;

/**
 * 아티클 링크 정보를 담는 객체
 *
 * @author younghoe
 *
 */
public class ArticleLink {
 /**
  * 설명
  */
 private String description;
 /**
  * 관리번호
  */
 private Integer id;
 /**
  * 언어
  */
 private String language;
 /**
  * 링크 URI
  */
 private URI link;

 /**
  * 등록일자
  */
 private Date regiDate;
 /**
  * 등록자
  */
 private UserInfo registrator;

 /**
  * 제목
  */
 private String title;

...
 
 public String getLink() {
  return link.toString();
 }

...

 public void setLink(String link) throws URISyntaxException {
  this.link = new URI(link);
 }

 
...
 
}
 
이클립스의 Source > Generate Getters and Setters 메뉴로 setter/getter를 생성하고, link 속성에 대한 setter/getter만 변경합니다. 이는 화면이나 DB로 부터 입력받을 때와 화면 출력 또는 DB 저장시는 문자열로 받지만 객체 내부적으로는 URI 타입으로 보관하려는 것이죠. 장단이 있겠지만, 일반적으로 명확한 타입을 쓰는 것이 좋으니까요. 적어도 잘못된 리소스 경로 입력을 막아주기는 하겠죠. 자동생성한 나머지 setter/getter는 생략합니다.
 
UserInfo 객체도 같은 패키지에 만들어둡니다.
 
package article.domain;
/**
 * 사용자 정보 객체
 *
 * @author younghoe
 *
 */
public class UserInfo {
 /**
  * 사용자 ID
  */
 private String id;
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
}
 
다시 handleRequestInternal로 돌아가면 결과값인 모델 객체를 주는 것은 비즈니스 영역의 객체가 되겠죠.(서버단이라고 불러도 좋구요.) 화면과 DB 연결 객체를 바로 잇는 것은 바람직하지 않긴 하지만, 별다른 작업이 추가되기 전이니 바로 DB 연결 객체(DAO)가 결과를 주는 것으로 하죠.
 
List<ArticleLink> model = articleLinkDao.getDefaultList();
 
articleLinkDao라는 멤버 변수를 가정하고 getDefaultList 메소드를 호출합니다. 기본 목록을 제공하는 비즈니스 (오퍼레이션) 요구 사항 정의한 것이죠. 이를 위해선 멤버 변수 선언을 해야겠죠.(이클립스 빠른 수정을 이용하세요.)
 
package article.web;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import article.dao.ArticleLinkDao;
import article.domain.ArticleLink;
public class ArticleListController extends AbstractController {
 private ArticleLinkDao articleLinkDao;

 @Override
 protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
  List<ArticleLink> model = articleLinkDao.getDefaultList();
  return null;
 }

 public void setArticleLinkDao(ArticleLinkDao articleLinkDao) {
  this.articleLinkDao = articleLinkDao;
 }
}
 
articleLinkDao 멤버의 타입은 인터페이스 타입이어야 합니다. 따라서, ArticleLinkDao는 클래스가 아니라 인터페이스가 되어야 하죠. 자동 생성으로 setter만 생성합니다. setter는 Spring의 IoC 구동을 위해 필요하지만, getter는 캡슐화를 저해할 수 있어 생성하지 않는 것이 좋습니다. 빠른 수정으로 ArticleLinkDao 인터페이스에 getDefaultList 메소드도 추가해주세요.
 
package article.dao;
import java.util.List;
import article.domain.ArticleLink;
public interface ArticleLinkDao {
 List<ArticleLink> getDefaultList();
}
 
이제 null을 반환하던 handleRequestInternal 메소드의 코드만 수정해주면 완성됩니다. 첫번째 인자는 화면 이름입니다. 다음은 화면 즉, jsp 페이지에서 참조할 모델의 이름입니다. ArticleLink의 List(List<ArticleLink>)를 articleList라는 이름으로 참조하겠다는 것이죠. 마지막 인자는 모델 객체입니다.
 
 @Override
 protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
  List<ArticleLink> model = articleLinkDao.getDefaultList();
  return new ModelAndView("index", "articleList", model);
 }
 
이제 Spring MVC 어플리케이션 개발 <3> Web Application Context 파일 작성 에서의 /index.do 빈 설정을 변경합니다.
 <bean name="/index.do"
  class="org.springframework.web.servlet.mvc.ParameterizableViewController">
  <property name="viewName" value="index" />
 </bean>
 
즉, 위의 내용을 아래와 같이 변경합니다.
 <bean name="/index.do" class="article.web.ArticleListController">
  <property name="articleLinkDao" ref="articleLinkDao" />
 </bean>
 
협업 객체인 articleLinkDao는 역시 Spring context 파일에 정의되어 있어야 합니다. article-servlet.xml 파일에 정의해도 되지만, DB 접근에 관련된 객체들은 별도의 파일로 구분하겠습니다. WEB-INF 폴더에 spring이라는 폴더를 만들고 dao-context.xml 이라는 파일을 생성하죠.
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<!-- DAO package (Persistence Layer) bean 설정 파일 -->
<beans>
 <bean id="articleLinkDao"
  class="article.dao.SqlMapArticleLinkDao">
 </bean>
</beans>
 
그리고 인터페이스를 구현한 클래스는 ibatis 프레임워크의 Sqlmap을 사용하도록 하겠습니다. 그래서 이름을 SqlMapArticleLinkDao이라 하고, article.dao 패키지에 생성합니다.
 
package article.dao;
import java.util.List;
import article.domain.ArticleLink;
 
public class SqlMapArticleLinkDao implements ArticleLinkDao {

 public List<ArticleLink> getDefaultList() {
  return null;
 }
}
 
dao-context.xml은 자동으로 인식하지 못하기 때문에 web.xml에 설정해줘야 합니다.
 
 <!-- Spring Context 파일 경로 설정 -->
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
   /WEB-INF/spring/dao-context.xml
  </param-value>
 </context-param>
 <listener>
  <listener-class>
   org.springframework.web.context.ContextLoaderListener
  </listener-class>
 </listener>
 
처음 한번은 꽤나 번거로운 작업이 됩니다. 그러나, 공통화 될 수 있는 단순 작업이니 우려할 일은 아니죠.

번호 제목 글쓴이 날짜 조회 수
공지 (확인전) [2021.03.12] Eclipse에서 Spring Boot로 JSP사용하기(Gradle) 황제낙엽 2023.12.23 0
공지 [작성중/인프런] 스프링부트 시큐리티 & JWT 강의 황제낙엽 2023.12.20 6
43 스프링의 구조별 기능 설명 황제낙엽 2007.06.26 42
42 실습 STEP2 - 기초편 (데이터 베이스 접속) file 황제낙엽 2007.06.21 21
41 java.util.MissingResourceException: Can't find bundle for base name xxx, locale ko_KR 황제낙엽 2007.06.21 2362
40 자바지기 스프링 프레임웍 아티클 황제낙엽 2007.06.04 54
39 AOP(Aspect Oriented Programming) 황제낙엽 2007.06.03 39
38 Spring MVC 어플리케이션 개발 <12> 간단한 조회 구현 방안 비교 황제낙엽 2007.05.27 31
37 Spring MVC 어플리케이션 개발 <11> 간단한 조회 구현 방안 비교 황제낙엽 2007.05.27 164
36 Spring MVC 어플리케이션 개발 <10> 도메인 객체 수정시 변경 사항 황제낙엽 2007.05.27 10
35 Spring MVC 어플리케이션 개발 <9> JSP 화면 작성 황제낙엽 2007.05.27 28
34 Spring MVC 어플리케이션 개발 <8> Spring기반 iBatis DAO 작성 황제낙엽 2007.05.27 51
33 Spring MVC 어플리케이션 개발 <7> Spring과 iBatis 연동을 위한 준비 황제낙엽 2007.05.26 17
» Spring MVC 어플리케이션 개발 <5> MVC 컨트롤러 작성 황제낙엽 2007.05.26 22
31 Spring MVC 어플리케이션 개발 <4> 화면 요구 작성 황제낙엽 2007.05.26 19
30 Spring MVC 어플리케이션 개발 <3> Web Application Context 파일 작성 황제낙엽 2007.05.26 125
29 Spring MVC 어플리케이션 개발 <2> Spring MVC 구동을 위한 web.xml 작성 황제낙엽 2007.05.26 32
28 Spring MVC 어플리케이션 개발 <1> 프로젝트 디렉토리 생성 황제낙엽 2007.05.26 51
27 Struts에서 Spring으로의 이주 가이드 - Spring (java/j2ee Application Framework) 황제낙엽 2006.02.27 29
26 실습 STEP1 - 기초편 (Hello Spring 출력) file 황제낙엽 2007.04.27 18
25 Bean 생명주기 관리 황제낙엽 2007.03.23 24
24 Spring프레임워크 소개문서 (3) 황제낙엽 2007.03.22 35