on
[SPRING] :: MVC 패턴 (정식)
[SPRING] :: MVC 패턴 (정식)
[예시] :: SPRING 정식 동작
:: SERVICE(인터페이스)와 SERVICEIMPL(구현 클래스)가 기능의 구현부를 담아
:: 컨트롤러와 DAO를 연결하여 맵퍼(XML)에 접근하도록 돕는 방식
[참고] :: 서비스는 추상 메소드명칭으로 어떤 영역의 기능인지 확인 및 관리가 용이하다는 장점이 있다.
(게시판의 기능 구현 시 서비스에서 게시판 관련 기능 전체를 한번에 관리)
[예시] :: 게시판 예제
# BOARDDAO.JAVA
package dao; import java.util.List; /* DAO Data Access Object의 약자로, DB를 통해서 CRUD등의 데이터 조작을 하는 객체 */ public interface BoardDAO { // 인터페이스에 구현할 기능의 명칭을 추상 메소드로 작성하는 영역 List selectList(); // 어떤 타입이 들어올지 모르므로 제네릭(< >)을 사용하지 않는다. int insert(Object ob); // 어떠한 타입이든 받을 수 있도록 자료형의 부모격인 OBJECT를 사용한다. int update(Object ob); int delete(int idx); }
# BOARDDAOIMPL.JAVA
package dao; import java.util.ArrayList; import java.util.List; public class BoardDAOImpl implements BoardDAO{ // 인터페이스를 구현하는 클래스 생성 (예제에서는 시간상 SELECTLIST만 구현) // SELECTLIST @Override public List selectList() { // SPRING은 LIST생성시 제네릭 타입을 사용해야한다. List list = new ArrayList(); // DB에 접근했다고 가정 (DAO에 SQLSESSION을 받아서 SQLSSION.SELECTLIST작성) list.add("사과"); list.add("수박"); list.add("참외"); list.add("바나나"); return list; // LIST 반환 } // INSERT @Override public int insert(Object ob) { // TODO Auto-generated method stub return 0; } // UPDATE @Override public int update(Object ob) { // TODO Auto-generated method stub return 0; } // DELETE @Override public int delete(int idx) { // TODO Auto-generated method stub return 0; } }
# BOARDSERVICE.JAVA
package service; import java.util.List; /* SERVICE와 SERVICEIMPL SERVICE(인터페이스)와 SERVICEIMPL(구현 클래스)은 기능의 구현부(명칭)을 담아 컨트롤러와 DAO를 연결하여 맵퍼에 접근하도록 돕는다. 약식방식에서는 SERVICE와 SERVICEIMPL을 사용하지 않지만 정식방식에서는 객체 지향의 특징인 캡슐화나 좀 더 편리한 관리를 위해서 사용한다. SERVICE의 장점 1 추상 메소드를 구현할시, 메소드명을 통해서 해당 메소드가 어떤 영역의 기능인지 쉽게 파악할 수 있다. 2 하나의 인터페이스에서 공통된 속성의 기능을 수행하는 경우 한 곳에서 관리하기 쉽다. (게시판의 CRUD 기능 구현시, SERVICE에서 CRUD기능 전체를 관리) */ public interface BoardService { // LIST (리스트로 결과를 반환하는 SELECTLIST추상 메소드) List selectList(); // 필요한 경우 BOARD에 관련된 기능의 추상메소드(명칭)를 구현하면 된다. }
# BOARDSERVICEIMPL.JAVA
package service; import java.util.List; import dao.BoardDAO; public class BoardServiceImpl implements BoardService{ // BOARDSERVICE를 구현하는 CLASS /* 동작 방식 (CONTROLLER > BOARDSERVICE > BOARDSERVICEIMPL > BOARDDAO > BOARDDAOIMPL의 순서) 컨트롤러에서 BOARDSERVICE의 SELECTLIST를 호출 BOARDSERVICEIMPL를 통해서 BOARD의 SELECTLIST를 호출하는 방식 (SELECTLIST를 SERVICE, DAO에서 호출하는 방식) BOARDSERVICEIMPL에서 DAO로 메소드 요청을 전달하기위해서는 여기 DAO객체가 있어야한다. */ // 객체 생성된 DAO를 서비스에서 받아주기 위한 BOARDDAO객체 BoardDAO dao; // 아래 생성자를 생성했으므로 BEAN호출을 위한 기본 생성자가 있어야한다. public BoardServiceImpl() { // TODO Auto-generated constructor stub } // BEAN 전달을 위한 생성자 public BoardServiceImpl(BoardDAO dao) { this.dao = dao; } // 추상 메소드 오버라이딩 @Override public List selectList() { // 위에서 BOARDDAO를 받게 되니 // BOARDSERVICEIMPL에서 SELECTLIST를 호출시 // BOARDDAO에 있는 SELECTLIST메소드를 호출하여 값을 넘겨줄 수 있도록 지정한다. return dao.selectList(); } // BOARD서비스를 구현하는 클래스 Board 서비스를 구현하는 클래스를 생성 }
# ROOT-CONTEXT.XML
# BOARDCONTROLLER.JAVA
:: 외부의 요청을 받기위한 클래스
:: 컨트롤러로 사용하는 클래스는 @CONTROLLER 라는 컨트롤러임을 명시하는 어노테이션(프로그램 주석)이 필요하다.
package controller; import java.util.List; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import service.BoardService; /* 컨트롤러 (CONTROLLER) JSP와 마찬가지로 SPRING에서 외부의 요청을 받아들이기위한(어느 페이지를 실행하는지 알려주는) 클래스 컨트롤러로 사용하는 클래스는 컨트롤러를 표시하는 어노테이션(프로그램 주석)이 있어야한다. SPRING에서 특수한 기능으로서 동작하게하도록 인식하기위한 용도로 사용된다. (예시, OVERRIDING의 @표시) 컨트롤러 어노테이션은 반드시 클래스내에 존재해야한다. (어노테이션이 없으면 맵핑을 읽어들이지 못한다.) */ // 컨트롤러임을 명시하는 어노테이션 @Controller public class BoardController { // BOARDSERVICE객체를 받아줄 SERVICE객체 생성 BoardService service; // SETTER 생성 (ROOT-CONTEXT의 SERVICEBEAN이 파라미터 자리로 들어와야한다.) public void setService(BoardService service) { this.service = service; } // 기본 생성자 public BoardController() { System.out.println("--BoardController의 생성자--"); } }
[참고] :: 프로그램 주석은 스프링에서 특수한 기능으로서 동작하도록 인식하기위한 용도로 사용된다.
# SERVLET-CONTEXT.XML
:: 컨트롤러의 빈객체를 관리
:: 컨트롤러의 빈객체 생성 방식은 자동과 수동 생성 방식이 있다.
:: ID는 빈객체의 명칭, CLASS는 사용하고자하는 컨트롤러 명칭, REF는 참조하고자하는 객체가 된다.
:: ROOT-CONTEXT는 컨트롤러를 제외한 모든 객체, SERVLET-CONTEXT는 컨트롤러의 객체를 생성한다.
# BOARDCONTROLLER.JAVA
:: SERVLET-CONTEXT의 빈객체 생성 방식에따라 컨트롤러에서 서비스 객체를 받아줘야한다.
@REQUESTMAPPING("주소") 혹은 @REQUESTMAPPING(VALUE={"주소","주소"})
:: VALUE를 사용하여 여러개의 주소를 받는 것도 가능하다.
package controller; import java.util.List; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import service.BoardService; /* 컨트롤러 (CONTROLLER) JSP와 마찬가지로 SPRING에서 외부의 요청을 받아들이기위한(어느 페이지를 실행하는지 알려주는) 클래스 컨트롤러로 사용하는 클래스는 컨트롤러를 표시하는 어노테이션(프로그램 주석)이 있어야한다. SPRING에서 특수한 기능으로서 동작하게하도록 인식하기위한 용도로 사용된다. (예시, OVERRIDING의 @표시) 컨트롤러 어노테이션은 반드시 클래스내에 존재해야한다. (어노테이션이 없으면 맵핑을 읽어들이지 못한다.) */ // 컨트롤러임을 명시하는 어노테이션 @Controller public class BoardController { // BOARDSERVICE객체를 받아줄 SERVICE객체 생성 BoardService service; // SETTER 생성 (ROOT-CONTEXT의 SERVICEBEAN이 파라미터 자리로 들어와야한다.) public void setService(BoardService service) { this.service = service; } // 기본 생성자 public BoardController() { System.out.println("--BoardController의 생성자--"); } /* 맵핑을 통해서 과일 목록 가져오기 컨트롤러 내부의 각각의 메서드는 서블릿의 역할을 수행한다. 서블릿이 하나의 맵핑이 가능한데 반해, 컨트롤러는 여러 기능을 맵핑할 수 있다는 장점이 있다. 기본적으로 맵핑은 String타입으로 반환형을 잡는데 RETURN시 " "의 JSP주소를 반환하기 때문이다. MODEL (ORG.SPRING.FRAMEWORK.UI) 서블릿과 컨트롤러의 중간매개체 역할을 수행한다. 일종의 REQUEST영역이라고 생각할 수 있으며 실제 REQUEST영역보다는 설정 범위가 좁다. (MODEL에는 IP의 정보를 담을 수 없지만 REQUEST보다 조금 더 가벼워서 많이 사용한다.) MODEL, REQUEST등의 저장영역은 파라미터에 넣어서 사용해야한다. */ @RequestMapping("/board/list.do") public String list(Model model) { /* 동작 과정 1 SERVLET-CONTEXT 내용대로 셋터 인젝션을 통해서 SERVICEBEAN을 주입한다. 2 SERVICEBEAN에는 BOARDSERVICEIMPL이 들어와있으니 SERVICE.SELECTLIST를 통해서 BOARDDAOIMPL의 SELECTLIST문을 호출한다. SELECTLIST메소드안에 있는 과일 목록이 LIST에 담긴다. */ List list = service.selectList(); // BINDING (ADDATTRIBUTE로 저장) model.addAttribute("list", list); // FORWARDING // 호출하고자하는 JSP는 VIEWS폴더 안에 만들어주면 호출하게 된다. return "board_list"; } }
# BOARDLIST.JSP
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> Insert title here 과일 목록 ${ vo }
from http://hikr90.tistory.com/147 by ccl(A) rewrite - 2021-12-31 23:27:39