코드로 배우는 스프링 웹 프로젝트(구멍가게 코딩단) 책 보면서 따라해봄!!!
spring homapage 뛰우기
<typeAliases>의 적용
XML Mapper를 이용하는데 있어서 매번 parameterType이나 resultType을 패키지까지 포함된 클래스명을 작성하는 일이 번거롭다면 MyBatis의 설정 파일인 mybatis-config.xml을 사용해서 <typeAliases>를 작성해 줄 수 있습니다. (빨간 네모 추가)
<typeAliases>는 하위 요소로 <package>와 <typeAlias> 요소를 가질 수 있습니다.
이 요소들을 이용하면 매번 parameterType이나 resultType에 사용하는 클래스의 이름을 ‘org.zerock.domain’은 생략한 채로 표현하는 것이 가능합니다.
계층별 구현 – 비즈니스 계층
비즈니스 계층은 고객의 요구사항이 반영되는 영역입니다. 비즈니스 영역에 만들어지는 클래스나 인터페이스는 반드시 요구사항과 일치하도록 설계돼야 합니다.
스프링에서 비즈니스 영역은 일반적으로 서비스라는 이름을 칭합니다. 일반적인 개발 순서는 1) 요구사항을 메소드로 정리해서 xxxService 인터페이스를 정의하고, 2)xxxServiceImpl이라는 구현 객체를 만들어 주는 순서로 진행 합니다. 이후의 모든 예제에서 Service 객체라고 하면 구현 객체를 의미합니다.
이 단계에서 완성되는 코드는 아래 그림에서 BoardService/BoardServiceImpl 파일입니다.
비즈니스 계층의 구현
비즈니스 계층은 쉽게 말해서 컨트롤러와 DAO 사이의 접착제 역할을 합니다.
- 비즈니스 계층은 고객마다 다른 부분을 처리할 수 있는 완충장치 역할을 합니다.
- 각 회사마다 다른 로직이나 규칙을 데이터베이스에 무관하게 처리할 수 있는 완충 영역으로 존재할 필요가 있습니다.
비즈니스 계층의 구현은 로직에 필요한 데이터베이스 관련 객체들을 모아서 자신이 원하는 일을 처리하는 용도입니다.
root-context.xml의 설정
Root-context.xml에 <context>를 사용해서 패키지를 자동으로 인식할 수 있도록 합니다.
Root-context.xml 추가
<context:component-scan base-package="org.zerock"></context:component-scan>
처음에 “org.zerock.persistence” “org.zerock.
boardservice/ boardserviceimpl의 작성
package org.zerock.services;
import java.util.List;
import org.zerock.domain.BoardVO;
public interface BoardService {
public void regist(BoardVO board) throws Exception;
public BoardVO read(Integer bno) throws Exception;
public void modify(BoardVO board) throws Exception;
public void remove(Integer bno) throws Exception;
public List<BoardVO> listAll() throws Exception;
} |
인터페이스를 구현한 구현 클래스는 아래와 같습니다.
package org.zerock.services;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Service; import org.zerock.domain.BoardVO;
import org.zerock.persistence.BoardDAO;
@Service public class BoardServiceImpl implements BoardService {
@Inject private BoardDAO dao;
@Override public void regist(BoardVO board) throws Exception { // TODO Auto-generated method stub dao.create(board);
}
@Override public BoardVO read(Integer bno) throws Exception { // TODO Auto-generated method stub return dao.read(bno); }
@Override public void modify(BoardVO board) throws Exception { // TODO Auto-generated method stub dao.update(board);
}
@Override public void remove(Integer bno) throws Exception { // TODO Auto-generated method stub dao.delete(bno); }
@Override public List<BoardVO> listAll() throws Exception { // TODO Auto-generated method stub return listAll(); }
}
|
클래스의 선언부에는 스프링의 빈으로 인식되기 위해서 @Service 애노테이션이 적용된 것을 볼 수 있습니다.
데이터베이스에서 원하는 결과가 나오기 시작하고, java로 작성한 코드들이 스프링에서 정상적으로 동작하는 것을 확인했다면 마지막 작업은 실제로 이를 웹 화면에서 처리하는 컨트롤러와 뷰를 제작하는 일 입니다.(가장 중요)
등록 구현
스프링 mvc에서 컨트롤러를 설계할 때 고민해야 하는 사항들
- 공통적인 uri 경로와 각 기능별 uri
- 각 uri에 대한 호출 방식(get, post)
- 결과 처리와 리다이렉트 방식의 페이지 결정
- 예외 페이지
컨트롤러의 선언
스프링 MVC를 이용하는 경우에는 컨트롤러 역시 ‘@Controller’라는 애노테이션을 추가하는 것만으로 설정이 완료됩니다.
작성하는 컨트롤러는 아래와 같이 애노테이션으로 ‘@Controller’를 추가해주고, Board의 모든 공통 경로를 ‘/board/’로 인식할 수 있게 합니다.
등록 작업과 파라미터의 결정
- 특별한 경우가 아니라면 VO 클래스 혹은 DTO 클래스를 파라미터로 사용하는 것이 편리합니다.
- 브라우저에서 들어오는 요청이 자동으로 파라미터로 지정한 클래스의 객체 속성값으로 처리되는데 이를 바인딩이라고 합니다.
- 스프링 MVC의 Model 객체는 해당 메소드에서 뷰에 필요한 데이터를 전달하는 용도로 사용됩니다. 그러므로 만일 메소드 내에서 뷰를 전달할 데이터가 있다면, model을 파라미터로 선언해 주는 것이 편리합니다.
등록 작업의 메소드
등록 작업은 크게 1) 등록을 위한 입력 페이지를 보는 경우(get 방식으로 처리) 2) 실제로 데이터를 처리하는 부분(post 방식으로 처리)
따라서 다음과 같이 설계합니다.
package org.zerock.controller;
import javax.inject.Inject;
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.zerock.domain.BoardVO;
import org.zerock.services.BoardService;
@Controller @RequestMapping("/board/*") public class BoardController {
private static final Logger logger = LoggerFactory.getLogger(BoardController.class);
@Inject private BoardService service;
@RequestMapping(value = "/register", method = RequestMethod.GET) public void registerGET(BoardVO board, Model model) throws Exception{ logger.info("register get......"); }
@RequestMapping(value="/register", method = RequestMethod.POST) public String registPOST(BoardVO board, Model model) throws Exception{
logger.info("regist post ......"); logger.info(board.toString());
service.regist(board);
model.addAttribute("result", "success");
return "/board/success";
}
}
|
RegisterGET() 메소드의 선언에 사용된 @RequestMapping 애노테이션의 설정을 보면 특정한 URI를 의미하는 value 속성과 GET/POST 등의 전송방식으로 결정하는 method라는 속성이 사용된 것을 볼 수 있습니다.
Value와 method 속성은 둘 다 배열로 여러 가지 속성값을 지정할 수 있습니다. 필요한 경우에는 아래와 같이 처리할 수 도 있습니다.
@RequestMapping(value =”/register”, method = {RequestMethod.GET,RequestMethod.POST})
GET 방식은 항상 사용자가 직접 브라우저에서 접근이 가능할 때 사용합니다. 일반적인 경우라면 GET 방식은 1) 입력 페이지와 2) 조회 페이지에서 사용합니다.
반면에 POST 방식은 항상 외부에서 많은 정보를 입력하는 경우에 사용합니다. 브라우저에서 주소창에 보여지면 안 되는 정보를 전송하는 데 처리합니다.
실제로 화면에서 입력되어 들어오는 데이터를 처리하는 registPOST() 메소드의 파라미터는 자동으로 모든 데이터를 BoardVO로 수집하도록 하는 부분과, 향후에 뷰로 데이터를 전달할 가능성이 있으므로 Model 클래스의 객체를 받도록 설계하였습니다.
Model 클래스는 스프링 mvc에서 제공하는 데이터 전달용 객체라고 생각하면 됩니다. Model 클래스는 map과 유사하게 키와 값으로 데이터를 저장하는 역할을 합니다. 과거 servlet에서는 requestdispatcher에 데이터를 저장했듯이, 스프링에서는 model을 이용해서 데이터를 저장합니다.
registPost()에서는 결과를 ‘/board/success’에 해당하는 뷰로 전송하는 것을 볼 수 있습니다. 실제 경로는 ‘/WEB-INF/views/board/success.jsp’가 됩니다.
3.2 컨트롤러의 동작 확인과 루트 경로 지정
Tomcat은 기본적으로 프로젝트 생성 시, 마지막 경로를 웹 상에서 경로를 사용합니다. 예를 들어 ‘org.zerock.controller’로 패키지를 지정한 경우에는 ‘http://localhost:8080/controller’라는 경로를 사용하게 됩니다.
프로젝트를 ‘http://localhost:8080’ 경로를 사용하기 위해서는 tomcat 설정의 ‘modules’ 메뉴를 이용해서 수정해야 합니다.
TOMCAT 서버를 더블 클릭하면 화면 상단에 modules라는 메뉴를 확인할 수 있습니다.
'JAVA > spring' 카테고리의 다른 글
spring redirect (4) | 2019.07.04 |
---|---|
register(등록), success(등록 성공) (0) | 2019.07.04 |
Spring CreateTest (0) | 2019.06.13 |
Spring Connection(DataSource) (0) | 2019.06.11 |
Spring+mybatis (0) | 2019.06.05 |
댓글