package com.example.demo.pojo1;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public interface Action {
public ActionForward execute(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException;
}
package com.example.demo.pojo1;
public class ActionForward {
private String path = null;
private boolean isRedirect = false;
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public boolean isRedirect() {
return isRedirect;
}
public void setRedirect(boolean isRedirect) {
this.isRedirect = isRedirect;
}
}
package com.example.demo.pojo1;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("*.fc")
public class FrontController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
package com.example.demo.pojo1;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
/**
* * **********@Insert : @int (입력)***********
* http://localhost:8000/member/memberInsert.gd
* http://localhost:8000/lecture/lectureInsert.gd
* http://localhost:8000/notice/noticeInsert.gd
*
*
* * ******@Update : @int ***********
* http://localhost:8000/member/memberUpdate.gd
* http://localhost:8000/lecture/lectureUpdate.gd
* http://localhost:8000/notice/noticeUpdate.gd
*
*
* *******@Delete : @int ***********
* http://localhost:8000/member/memberDelete.gd
* http://localhost:8000/lecture/lectureDelete.gd
* http://localhost:8000/notice/noticeDelete.gd
*
* ==============================
* select(dispatcher(forward)) - false
* select - forward - false
* ********@Select : List<Map> - dispatcher **********
*
* http://localhost:8000/member/memberSelect.gd
* http://localhost:8000/lecture/lectureSelect.gd
* http://localhost:8000/notice/noticeSelect.gd
*
*
*/
//앞에 뭐가 오든지간에 접이머가 .gd로 끝나면 내가 간섭할게 라고 해석
@WebServlet("*.gd")
public class FrontMVC extends HttpServlet{
/**
* ㅇㅇ
*/
private static final long serialVersionUID = 1L;
Logger logger = LoggerFactory.getLogger(FrontMVC.class);
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
doService(req,res);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
doService(req,res);
}
protected void doService(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//http://localhost:8000/notice/noticeInsert.gd
String uri = req.getRequestURI(); // >> /notice/noticeInsert.gd
// ===>>> /notice/noticeInsert.gd (도메인 짤라서 옴)
//만약에 이렇게 쓴다면, 배열로 만들 떄 문제가 발생한다.(.gd) 도 포함 그래서 제거해야된다.
logger.info(uri);
String context = req.getContextPath(); //===>>> /x notice/
// /notice/
String command = uri.substring(context.length()+1);
// notice+1(/) 제외한 앞부터 start == noticeInsert.gd란 얘기(substring) 결과값
// >>> notice/noticeInsert.gd 이렇게 나온다 (/)를 없애기 위해 +1 한 것.
// 이제, gd를 제거해야된다.
int end = command.lastIndexOf(".");
// .에 대한 인덱스를 가져와서 noticeInsert.gd
// 점이 있는 위치 정보를 가져온다.(lastIndexOf)가 들어간다.
// command은 uri를 substring했기 떄문에
// noticeInsert.gd이기 떄문에 (.) 기준으로 인덱스를 구하면
//command 재정의한다.
command = command.substring(0,end); // notice/noticeinsert까지만 가져온다 .gd는 제거한다.
String upmu[] = null;
upmu = command.split("/");
//메소드 이름으로 들어간다. (/) 기준으로 나눈다.
NoticeController nc = new NoticeController();
//MemberController mc= new MemberController();
//LectureController lc = new LectureController();
ActionForward af = null;
for(String name : upmu)
{
logger.info(name);
}
///이 지점은 내려가는 방향이다.
if("notice".equals(upmu[0])) {
req.setAttribute("upmu",upmu); // 배열을 보낸다.
af = nc.execute(req, res);//NoticeController클래스로 건너감 - upmu[1]-메소드이름이니까...
}// 3번에 위치하는 부분
//이 지점은 java와 오라클 서버를 경유한 뒤 시점이다.
if(af !=null) {
if(af.isRedirect()) {
res.sendRedirect(af.getPath());
}
else{
RequestDispatcher view = req.getRequestDispatcher(af.getPath());
view.forward(req, res);
}
}/////////// end of if - 응답페이지 호출하기 - 포워드
else if("member".equals(upmu[0])) {
}
else if("lecture".equals(upmu[0])) {
}
}}
////////////////////[[ 어떤 컨트롤러를 태울 것인가?]]//////////////////////
////////////////////[[ 컨트롤을 타고 난 뒤에 내가 할일은?]]//////////////////////
// 해당 업무에 대응하는 컨트롤러에서 결정된 페이지 이름을 받아온다.
// 위에서 결정된 true 혹은 false 값에 따라 sendRedirect() 와 forward를 통해
// 응답 페이지를 호출해준다. - FrontMVC의 역할이다.
package com.example.demo.pojo1;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class NoticeController implements Action {
Logger logger = LoggerFactory.getLogger(NoticeController.class);
NoticeLogic nLogic = new NoticeLogic();//이른
@Override
public ActionForward execute(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
String upmu[] = (String[])req.getAttribute("upmu");
// 여기서 setAttribute를 받는다.
// 이 부분에서 하나 얻을 수 있는 부분은 java와 서블릿간 대화를 할 때도 setAttribute를 진행한다.
if("noticeList".equals(upmu[1])) {//select
logger.info("noticeList");
List<Map<String ,Object>> nList = null;
}
else if("noticeInsert".equals(upmu[1])) {//insert (여기서 디비와 비벼지는 부분이다)
logger.info("noticeInsert");
int result = 0;
}else if("noticeUpdate".equals(upmu[1])) {//update
logger.info("noticeUpdate");
int result = 0;
}else if("noticeDelete".equals(upmu[1])) {//delete
logger.info("noticeDelete");
int result = 0;
}
return null;
}
}
//NoticeController는 서블릿을 상속받지 않았다 (결합도를 낮추고 싶어서) - 프레임워크 사상중에 하나이니깐
//서블릿이 아닌데 req와 res는 어디서 주입받죠? -> doGet(req,res)는 톰캣이 주입해주기 때문에 NullPointException이 발생하지만
// 여기선 NullPointException이 발생한다.
// res,req를 설정해줘야되기 때문에 (주입) 새로 서블릿 파일을 만들어야한다.(FrontMVC)
// 이 말은 FrontMVC로부터 값을 주입받는다. 단, 톰캣이 아니기 떄문에 NullPointException이 발생할 수 있다.
package com.example.demo.pojo1;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class NoticeLogic {
Logger logger = LoggerFactory.getLogger(NoticeLogic.class);
public List<Map<String,Object>> noticeList()
{
logger.info("noticeList");
List<Map<String,Object>> nList = new ArrayList<>();
return nList;
}
public int noticeInsert() //.gd
{
//리턴타입 int
int result = 0;
return result;
}
public int noticeUpdate() //.gd
{
//리턴타입 int
int result = 0;
return result;
}
public int noticeDelete() //.gd
{
//리턴타입 int
int result = 0;
return result;
}
}
package com.example.demo.pojo1;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class NoticeLogic {
Logger logger = LoggerFactory.getLogger(NoticeLogic.class);
public List<Map<String,Object>> noticeList() // select
{
logger.info("noticeList");
List<Map<String,Object>> nList = new ArrayList<>();
return nList;
}
public int noticeInsert() // Insert
{
//리턴타입 int
int result = 0;
return result;
}
public int noticeUpdate() //Update
{
//리턴타입 int
int result = 0;
return result;
}
public int noticeDelete() //delete
{
//리턴타입 int
int result = 0;
return result;
}
}
xxx(*).gd에 대한 처리는 : 업무이름/메소드로 설계 예정이다. -> 배열로 저장한 다음 Tokenizer / Splice를 이용해서 자른다.
FrontMVC를 반드시 경유해야하며, 기존에는 HttpServlet를 상속받아서 사용했지만, 이렇게 하지 않고 사용자정의함수로 doService 메소드를 사용해서 doGet() / doPost 처리를 할 것이다.
FrontMVC로부터 배열로 전달을 받으며,
컨트롤 계층은 4개의 메소드를 반드시 갖는다.
컨트롤 계층도 MemberController, NoticeController, LectureController가 존재한다. 이 컨트롤러에는 4가지 메소드가 존재하는 것이다.
그리고 Action
인터페이스를 상속받으며, execute라는 메소드를 @Overide한다. 왜 가운데 Action이라는 인터페이스를 두고 구현했을까? -> 결합도를 낮추기 위해서다.
ActionForward
사용하는 이유는 해당 클래스는 불변객체이며, url에 대한 처리 및 리다이렉트
및 포워드
설정을 한다. 이 부분은 중요한 부분이므로 꼭 알고 있어야한다.컨트롤러 계층은 모델계층과 유기적인 관계를 갖는다. 모델, 즉, 처리 계층은 순수한 자바
로 되어 있으며 디비와 소통한다.
그렇다면 각각의 컨트롤계층은 HttpServlet를 상속받지 않았는데, 어떻게 사용 가능하지?
FrontMVC에서 HttpServlet를 상속받으며, 여기서 url에대한 슬라이싱을 진행하고, 배열에 저장한 다음
이걸 기준으로 if문으로 분기 후(execute 실행 및 req,res)객체주입한다. 그 후에 디비 및 자바코드의 결과값을 받아온 다음 ActionForward를 통해서 경로설정한다.
NullPointException
이 발생하지 않았지만, 지금부터는 NullPointException
이 발생한다.package com.example.demo.pojo1;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public interface Action {
public ActionForward execute(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException;
}
package com.example.demo.pojo1;
public class ActionForward {
private String path = null;
private boolean isRedirect = false;
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public boolean isRedirect() {
return isRedirect;
}
public void setRedirect(boolean isRedirect) {
this.isRedirect = isRedirect;
}
}
package com.example.demo.pojo1;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
/**
* * **********@Insert : @int (입력)***********
* http://localhost:8000/member/memberInsert.gd
* http://localhost:8000/lecture/lectureInsert.gd
* http://localhost:8000/notice/noticeInsert.gd
*
*
* * ******@Update : @int ***********
* http://localhost:8000/member/memberUpdate.gd
* http://localhost:8000/lecture/lectureUpdate.gd
* http://localhost:8000/notice/noticeUpdate.gd
*
*
* *******@Delete : @int ***********
* http://localhost:8000/member/memberDelete.gd
* http://localhost:8000/lecture/lectureDelete.gd
* http://localhost:8000/notice/noticeDelete.gd
*
* ==============================
* select(dispatcher(forward)) - false
* select - forward - false
* ********@Select : List<Map> - dispatcher **********
*
* http://localhost:8000/member/memberSelect.gd
* http://localhost:8000/lecture/lectureSelect.gd
* http://localhost:8000/notice/noticeSelect.gd
*
*
*/
//앞에 뭐가 오든지간에 접이머가 .gd로 끝나면 내가 간섭할게 라고 해석
@WebServlet("*.gd")
public class FrontMVC extends HttpServlet{
/**
* ㅇㅇ
*/
private static final long serialVersionUID = 1L;
Logger logger = LoggerFactory.getLogger(FrontMVC.class);
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
doService(req,res);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
doService(req,res);
}
protected void doService(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//http://localhost:8000/notice/noticeInsert.gd
String uri = req.getRequestURI(); // >> /notice/noticeInsert.gd
// ===>>> /notice/noticeInsert.gd (도메인 짤라서 옴)
//만약에 이렇게 쓴다면, 배열로 만들 떄 문제가 발생한다.(.gd) 도 포함 그래서 제거해야된다.
logger.info(uri);
String context = req.getContextPath(); //===>>> /x notice/
// /notice/
String command = uri.substring(context.length()+1);
// notice+1(/) 제외한 앞부터 start == noticeInsert.gd란 얘기(substring) 결과값
// >>> notice/noticeInsert.gd 이렇게 나온다 (/)를 없애기 위해 +1 한 것.
// 이제, gd를 제거해야된다.
int end = command.lastIndexOf(".");
// .에 대한 인덱스를 가져와서 noticeInsert.gd
// 점이 있는 위치 정보를 가져온다.(lastIndexOf)가 들어간다.
// command은 uri를 substring했기 떄문에
// noticeInsert.gd이기 떄문에 (.) 기준으로 인덱스를 구하면
//command 재정의한다.
command = command.substring(0,end); // notice/noticeinsert까지만 가져온다 .gd는 제거한다.
String upmu[] = null;
upmu = command.split("/");
//메소드 이름으로 들어간다. (/) 기준으로 나눈다.
NoticeController nc = new NoticeController();
//MemberController mc= new MemberController();
//LectureController lc = new LectureController();
ActionForward af = null;
for(String name : upmu)
{
logger.info(name);
}
///이 지점은 내려가는 방향이다.
if("notice".equals(upmu[0])) {
req.setAttribute("upmu",upmu); // 배열을 보낸다.
af = nc.execute(req, res);//NoticeController클래스로 건너감 - upmu[1]-메소드이름이니까...
}// 3번에 위치하는 부분
//이 지점은 java와 오라클 서버를 경유한 뒤 시점이다.
if(af !=null) {
if(af.isRedirect()) {
res.sendRedirect(af.getPath());
}
else{
RequestDispatcher view = req.getRequestDispatcher(af.getPath());
view.forward(req, res);
}
}/////////// end of if - 응답페이지 호출하기 - 포워드
else if("member".equals(upmu[0])) {
}
else if("lecture".equals(upmu[0])) {
}
}}
////////////////////[[ 어떤 컨트롤러를 태울 것인가?]]//////////////////////
////////////////////[[ 컨트롤을 타고 난 뒤에 내가 할일은?]]//////////////////////
// 해당 업무에 대응하는 컨트롤러에서 결정된 페이지 이름을 받아온다.
// 위에서 결정된 true 혹은 false 값에 따라 sendRedirect() 와 forward를 통해
// 응답 페이지를 호출해준다. - FrontMVC의 역할이다.
예시
* * **********@Insert : @int (입력)***********
* http://localhost:8000/member/memberInsert.gd
* http://localhost:8000/lecture/lectureInsert.gd
* http://localhost:8000/notice/noticeInsert.gd
*
*
* * ******@Update : @int ***********
* http://localhost:8000/member/memberUpdate.gd
* http://localhost:8000/lecture/lectureUpdate.gd
* http://localhost:8000/notice/noticeUpdate.gd
*
*
* *******@Delete : @int ***********
* http://localhost:8000/member/memberDelete.gd
* http://localhost:8000/lecture/lectureDelete.gd
* http://localhost:8000/notice/noticeDelete.gd
*
* ==============================
* select(dispatcher(forward)) - false
* select - forward - false
* ********@Select : List<Map> - dispatcher **********
*
* http://localhost:8000/member/memberSelect.gd
* http://localhost:8000/lecture/lectureSelect.gd
* http://localhost:8000/notice/noticeSelect.gd
두 번쨰로 중요한 부분은 doService라는 사용자정의 메소드를 만들어서 doGet(req,res) + doPost(req,res)로 오든지간에 doService(req,res)로 호출한다.
다음은 url을 배열로 바꾸는 작업이다.
//http://localhost:8000/notice/noticeInsert.gd
String uri = req.getRequestURI(); // >> /notice/noticeInsert.gd
// ===>>> /notice/noticeInsert.gd (도메인 짤라서 옴)
//만약에 이렇게 쓴다면, 배열로 만들 떄 문제가 발생한다.(.gd) 도 포함 그래서 제거해야된다.
logger.info(uri);
String context = req.getContextPath(); //===>>> /x notice/
// /notice/
String command = uri.substring(context.length()+1);
// notice+1(/) 제외한 앞부터 start == noticeInsert.gd란 얘기(substring) 결과값
// >>> notice/noticeInsert.gd 이렇게 나온다 (/)를 없애기 위해 +1 한 것.
// 이제, gd를 제거해야된다.
int end = command.lastIndexOf(".");
// .에 대한 인덱스를 가져와서 noticeInsert.gd
// 점이 있는 위치 정보를 가져온다.(lastIndexOf)가 들어간다.
// command은 uri를 substring했기 떄문에
// noticeInsert.gd이기 떄문에 (.) 기준으로 인덱스를 구하면
//command 재정의한다.
command = command.substring(0,end); // notice/noticeinsert까지만 가져온다 .gd는 제거한다.
String upmu[] = null;
upmu = command.split("/");
만약에 http://localhost:8000/notice/noticeInsert.gd 호출한다면,
String uri = req.getRequestURI();
를 통해서 도메인을 제외한 url를 가져오고. (/notice/noticeInsert.gd)
String context = req.getContextPath();
를 통해서 ContextRoot를 가져온다. 여기선 (/notice/)이다.
String command = uri.substring(context.length()+1);
이렇게 하면 context.length()+1
는 /notice/noticeInsert.gd 여기서 앞에 /를 제외하기 위해 +1를 했다.
(결과값: notice/noticeInsert.gd)
다음은 .gd를 지워주기 위해 lastIndexOf를 사용할 것이다.
그리고 배열로 어떻게 만들까? split("/") 이렇게 하면 배열타입으로 반환한다. 그럼 url기준 notice/noticeInsert
이니깐 0번방엔 notice | noticeInsert가 들어간다.
로그를 찍었을 떄 결과가 이렇게 나온다.
(2/2)
NoticeController nc = new NoticeController();
//MemberController mc= new MemberController();
//LectureController lc = new LectureController();
ActionForward af = null;
for(String name : upmu)
{
logger.info(name);
}
///이 지점은 내려가는 방향이다.
if("notice".equals(upmu[0])) {
req.setAttribute("upmu",upmu); // 배열을 보낸다.
af = nc.execute(req, res);//NoticeController클래스로 건너감 - upmu[1]-메소드이름이니까...
}// 3번에 위치하는 부분
//이 지점은 java와 오라클 서버를 경유한 뒤 시점이다.
if(af !=null) {
if(af.isRedirect()) {
res.sendRedirect(af.getPath());
}
else{
RequestDispatcher view = req.getRequestDispatcher(af.getPath());
view.forward(req, res);
}
}/////////// end of if - 응답페이지 호출하기 - 포워드
else if("member".equals(upmu[0])) {
}
else if("lecture".equals(upmu[0])) {
}
}}
여기서 notice
는 0번방의 컨트롤 계층의 이름이다. 즉 이 부분에서 조건을 분기하는 것이다.
설계 관점이 아쉽다.(xxxController) 에서부터 메소드를 가질 수 없었나?
af는 ActionForwrd를 선언한 이유는 무엇일까?
이후에 if문을 통해서 af가 true이면 sendRedirect를 하고 af가 false이면 forward를 진행한다.
아쉬운점
xxxController에서부터 메소드를 가질 수는 없었나?
메소드마다 req,res에 대한 객체 주입을 처리할 수 없는 구조이다.
package com.example.demo.pojo1;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class NoticeController implements Action {
Logger logger = LoggerFactory.getLogger(NoticeController.class);
NoticeLogic nLogic = new NoticeLogic();//이른
@Override
public ActionForward execute(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
String upmu[] = (String[])req.getAttribute("upmu");
// 여기서 setAttribute를 받는다.
// 이 부분에서 하나 얻을 수 있는 부분은 java와 서블릿간 대화를 할 때도 setAttribute를 진행한다.
if("noticeList".equals(upmu[1])) {//select
logger.info("noticeList");
List<Map<String ,Object>> nList = null;
}
else if("noticeInsert".equals(upmu[1])) {//insert (여기서 디비와 비벼지는 부분이다)
logger.info("noticeInsert");
int result = 0;
}else if("noticeUpdate".equals(upmu[1])) {//update
logger.info("noticeUpdate");
int result = 0;
}else if("noticeDelete".equals(upmu[1])) {//delete
logger.info("noticeDelete");
int result = 0;
}
return null;
}
}
NoticeLogic nlogic = new NoticeLogic(); 으로 이른인스턴스화를 진행했다. 왜? NullPointException이 발생할 수 있어서
우선 여기서 조건에 대한 분기를 진행한다. String upmu[] = (String[])req.getAttribute("upmu"); 이 부분을 살펴보면, upmu라는 배열을 받아서 String[] 배열 형태로 다시 저장하고 있다.
select
if("noticeList".equals(upmu[1])) {//select
logger.info("noticeList");
List<Map<String ,Object>> nList = null;
}
insert
else if("noticeInsert".equals(upmu[1])) {//insert (여기서 디비와 비벼지는 부분이다)
logger.info("noticeInsert");
int result = 0;
}
update
else if("noticeUpdate".equals(upmu[1])) {//update
logger.info("noticeUpdate");
int result = 0;
}
delete
else if("noticeDelete".equals(upmu[1])) {//delete
logger.info("noticeDelete");
int result = 0;
}
result는 어디서 가져왔는가? NoticeLogic에서 return 값임
package com.example.demo.pojo1;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class NoticeLogic {
Logger logger = LoggerFactory.getLogger(NoticeLogic.class);
public List<Map<String,Object>> noticeList(){
logger.info("noticeList");
List<Map<String,Object>> nList = new ArrayList<>();
return nList;
}
public int noticeInsert(){
logger.info("noticeInsert");
int result = 0;
return result;
}
public int noticeUpdate(){
logger.info("noticeUpdate");
int result = 0;
return result;
}
public int noticeDelete(){
logger.info("noticeDelete");
int result = 0;
return result;
}
}
noticeList, noticeInsert, noticeUpdate, noticeDelete 전부 배열[1] 값이다.
이 부분이 디비와 비벼지는 부분이며, 추후에 SELECT문을 할 시 로직에서 nList를 하고 있다.
모든 리턴값은 디비로부터 꺼낸 값을 성공했을떄 리턴값이며, 아직 연동하지 않았기 때문에 값을 알 수 없다.
ActionForward의 활용 방법은 뭘까?
ActionForward의 인스턴스로 전변의 담긴 값을 사용할 수 있다. 컨트롤 계층을 타고 난 뒤
처리를 담당하는 Java클래스를 경유하고 나서 반환값으로 받은 정보를 Jsp 페이지에 유지하거나 또는 페이지 처리를 해야한다.
전변 path에는 어떤 정보를 담을 생각인가?
isRedirect는 왜 boolean으로 했나?