본문 바로가기
학원수업/3월

03/06 국비 백앤드 개발자 수업 - Spring Pojo

by 코딩마스터^^ 2023. 3. 6.

게시판 구현을 위한 MVC패턴 설계

 

1.리액트 고려한 설계입니까?

 

2.JSON포맷을 지원하는 메소드가 추가되었습니끼?

 

3.파일 업로드와 관련된 공통코드나 라이브러리 선택이 되었나요?

 

4. 유지보수에 편리하게 설계되었습니까?

 

5. MyBatis와 같은ORM솔루션들이 바뀌더라도 전체 설계 틀이 변하지 않도록 다시 말해서 부분적 조립이 가능한 설걔입니까?

 

6. UI솔루션이 변경되더라도 설계에 영향이 가지 않도록 설계가 되었나요?

 

 

board.xml을 두개 만들어 넣었다.

하나는 mybtis.mapper에 넣어놨다.

하나는 WEB-INF안에 넣어놨다.

WEB_INF안에는 절대로 접근이 불가능하다.

https://bongra.tistory.com/242

 

[JSP] WEB-INF 폴더에 관한 정리 ( 웹브라우저에서 WEB-INF 하위 파일(jsp, html, js, css 에 접근이 가능한

다음과 같은 .jsp파일이 2개 있다. 하나는 WEB-INF 하위에 있고 하나는 webapp 하위에 있다. 톰캣을 구동시킨 뒤, 각 파일을 URL을 통해 접근해보자. 우선 webapp 하위에 있는 파일에 접근해보자 접근이

bongra.tistory.com

그럼 이번에는 WEB-INF하위에 있는 .jsp에 접근해보자

접근이 안된다. 왜 접근이 안될까? 대충 설명하면 아래와 같다.

 

webapp 폴더에 있는 녀석들은 따로 비즈니스 로직이 없어도 가상의 결과물을 만들어 직접적으로 뷰를 살펴 볼 수 있다
=> Controller를 통하지 않아도 바로 결과물을 볼 수 있지만, 서버에 올릴 시 보안에는 취약하다.

WEB-INF 폴더의 경우에는 브라우저에서 직접적으로 접근이 불가한 경로이다.
=> Controller를 통해야만 접근이 가능하며, 사용자가 직접 접근이 불가하여 보안성이 높다.

 

이건 jsp뿐만이 아니라, html, js, css와 같은 정적파일들도 포함된다.

 

그래서 WEB-INF안에 있는 js나 css에는 접근을 할 수 없다. 만약 WEB-INF 하위에 .js나 .css를 생성하고

호출을 하면 404에러가 뜰 것이다.

 

그래서 .js나 .css는 webapp하위에 생성하는 게 가장 베스트이다.

 

form 전송 -> Restful API 

ajax ->  XXX.st3?bm+_no=5&bm_title=제목....

 

axios-비동기처리-모듈화 -Node.js기반-import브라우저 require

 

사용자가 입력하면 form method action="XXX.st3" --->서블릿

ActionSupport가 인터셉트 한다.

ModelAndView

ActionServlet은 스트링이 온다...-> 스프링 흉내내기

 

 Object타입이라 ModelAngView가 올 수 있다.

만약 첨부파일이라면 바이너리 파일이 올 수 있다.

 

상세보기는 글 번호를 가져와서 히든으로 해놨다. 그 정해진 값으로 그룹번호가 반영이 되어야ㅐ한다.

경우에 따라서 중간에 끼면 업데이트를 해서 다시 글번호 매겨야 한다.

 

 

마이바티스로 연결해서 오라클 데이터 베이스에 입력할 수 있다.

 

 

 

package com.pojo.step3;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import com.pojo.step2.Board2Controller;

public class ActionSupport extends HttpServlet {
	Logger logger = Logger.getLogger(ActionSupport.class);
	
	protected void doService(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		logger.info("doService호출");
		String uri = req.getRequestURI();
		logger.info(uri);
		String context = req.getContextPath();// GUI -> tomcat -> modules의 path
		logger.info(context);
		String command = uri.substring(context.length() + 1);
		System.out.println(command);
		int end = command.lastIndexOf(".");// 16 - st1잘라내기위해 사용 ~ 확장자 제거
		System.out.println(end);
		command = command.substring(0, end);
		System.out.println(command);
		String upmu[] = null;
		upmu = command.split("/");
		logger.info(upmu[0] + ", " + upmu[1]);// 테스트 URL : http://localhost:9000/board/getBoardList.st2
		req.setAttribute("upmu", upmu);
		
		Object obj = "";
		try {
			obj=HandlerMapping.getController(upmu,req,res);
		} catch (Exception e) {
			logger.info("Exception"+e.toString());
		}
		
		if (obj != null) {// redirect:XXX.jsp or forward:XXX.jsp
			String pageMove[] = null;
			ModelAndView mav=null;
			if (obj instanceof String) {
				if (((String) obj).contains(":")) { // contain은 안에 이거 들어있나 없나 확인하고 T/F로 반환
					logger.info(":포함되어 있어요.");
					pageMove = obj.toString().split(":");
				} else {
					logger.info("포함되어있지 않아요.");
					pageMove = obj.toString().split("/");
				}
				logger.info(pageMove[0] + "," + pageMove[1]);
			}else if(obj instanceof ModelAndView) {
				mav=(ModelAndView)obj;
				pageMove=new String[2];
				pageMove[0]="forward";
				pageMove[1]=mav.getViewName();
			}

			if (pageMove != null) {
				String path = pageMove[1];
				if ("redirect".equals(pageMove[0])) {
					res.sendRedirect(path);
				} else if ("forward".equals(pageMove[0])) {
					RequestDispatcher view = req.getRequestDispatcher("/" + path + ".jsp");
					view.forward(req, res);
				} else {
					path = pageMove[0] + "/" + pageMove[1];
					RequestDispatcher view = req.getRequestDispatcher("/WEB-INF/view/" + path + ".jsp");
					view.forward(req, res);
				}
			} // end for page이동처리에 대한 공통 코드부분
		}
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		logger.info("deGet호출");
		doService(req, res);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		doService(req, res);
	}
}

 

package com.pojo.step3;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import com.pojo.step2.ActionServlet;
import com.util.HashMapBinder;

public class Board3Controller implements Controller3 {
	Logger logger = Logger.getLogger(Board3Controller.class);
	Board3Logic boardLogic=new Board3Logic();
	
	@Override
	public ModelAndView boardList(HttpServletRequest req, HttpServletResponse res) {
		logger.info("boardList 호출");
		List<Map<String,Object>> bList=null;
		Map<String, Object> pMap=new HashMap<>();
		HashMapBinder hmb=new HashMapBinder(req);
		hmb.bind(pMap);
		bList=boardLogic.boardList(pMap);
		ModelAndView mav=new ModelAndView(req);
		mav.setViewName("board3/boardList");
		mav.addObject("bList",bList);
		return mav;
	}
	@Override
	public Object jsonBoardList(HttpServletRequest req, HttpServletResponse res) {
		logger.info("boardList 호출");
		List<Map<String,Object>> bList=null;
		Map<String, Object> pMap=new HashMap<>();
		bList=boardLogic.boardList(pMap);
		req.setAttribute( "bList",bList);
		return "forward:jsonBoardList.jsp";
	}

	@Override
	public Object boardDetail(HttpServletRequest req, HttpServletResponse res) {
		logger.info("boardDetail 호출");
		List<Map<String,Object>> bList=null;
		Map<String, Object> pMap=new HashMap<>();
		HashMapBinder hmb=new HashMapBinder(req);
		hmb.bind(pMap);
		bList=boardLogic.boardList(pMap);
		logger.info(bList);
		req.setAttribute( "bList",bList);
		return "forward:board3/boardDetail";
	}
/*
 * INSERT INTO board_master_t(bm_no, bm_title, bm_writer, bm_reg, bm_hit, bm_group, bm_pos, bm_step, bm_pw)
		VALUES (seq_board_no.nextval, #{bm_title}, #{bm_writer}, to_char(sysdate, 'YYYY-MM-DD'), 0, #{bm_group}, #{bm_pos}, #{bm_step})
 * */
	@Override
	public Object boardInsert(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
		logger.info("boardInsert 호출");
		int result = 1;
		Map<String,Object> pMap=new HashMap<>();
		HashMapBinder hmb=new HashMapBinder(req);
		hmb.bind(pMap);
		result=boardLogic.boardInsert(pMap);
		String path="";
		if(result == 1) {
			path="redirect:/board3/boardList.st3";
		}else {
			path="boardInsertFail.jsp";
			res.sendRedirect(path);
		}
		return path;
	}

	@Override
	public Object boardUpdate(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException {
		logger.info("boardUpdate 호출");
		int result = 0;
		if(result == 1) {
			res.sendRedirect("boardInsertSuccess.jsp");//화면이랑 연결됨
			return null;
		}
		return "redirect:/board3/boardList.st3";
		
	}

	@Override
	public Object boardDelete(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException {
		logger.info("boardDelete 호출");
		int result = 0;
		if(result == 1) {
			res.sendRedirect("boardInsertSuccess.jsp");//화면이랑 연결됨
			return null;
		}
		return "redirect:/board3/boardList.st3";
	}


}
package com.pojo.step3;

import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

public class Board3Logic {
	Logger logger = Logger.getLogger(Board3Logic.class);
	Board3Dao boardDao=new Board3Dao();
	public List<Map<String, Object>> boardList(Map<String, Object> pMap) {
		logger.info("boardList호출"+pMap);
		List<Map<String,Object>> bList=null;
		bList=boardDao.boardList(pMap);
		return bList;
	}
	public int boardInsert(Map<String, Object> pMap) {
		logger.info("boardInsert호출"+pMap);
		int result=0;
		int bm_no=0;
		int bm_group=0;
		bm_no=boardDao.getBNo();
		pMap.put("bm_no", bm_no);
		//Map안에서 꺼내다는건 화면에서 넘어온 값이라는뜻
		if(pMap.get("bm_group")!=null) {
			bm_group=Integer.parseInt(pMap.get("bm_group").toString());
		}
		//댓글쓰기야?
		if(bm_group>0) {
			boardDao.bStepUpdate(pMap);
			pMap.put("bm_pos", Integer.parseInt(pMap.get("bm_pos").toString())+1);
			pMap.put("bm_step", Integer.parseInt(pMap.get("bm_step").toString())+1);
		}
		//새글쓰기야?
		else {
			logger.info("새글쓰기 로직 호출=>"+bm_group);
			bm_group=boardDao.getBGroup();
			pMap.put("bm_group", bm_group);
			pMap.put("bm_pos", 0);
			pMap.put("bm_step", 0);
			
		}
		result=boardDao.boardInsert(pMap);
		return result;
	}

}

 

package com.pojo.step3;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import com.pojo.step2.ActionServlet;

public interface Controller3 {
	
	public Object boardList(HttpServletRequest req, HttpServletResponse res);
	public Object boardDetail(HttpServletRequest req, HttpServletResponse res);
	public Object boardInsert(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException;
	public Object boardUpdate(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException;
	public Object boardDelete(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException;
	public Object jsonBoardList(HttpServletRequest req, HttpServletResponse res);
}
package com.pojo.step3;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

public class HandlerMapping {
	static Logger logger=Logger.getLogger(HandlerMapping.class);


/*
 * @param upmu[](upmu[0]-업무명[폴더명],upmu[1]-메소드명,기능명,페이지이름,분기)
 * @param request -1-1,1-2와는 다르게 인터페이스를 implement하지 않는다.
 * @param response
 * 
 * 질문? 어디서 받아오지?
 * @return Object
 * 
 * 
 *
 * */
 public static Object getController(String[] upmu,HttpServletRequest req,HttpServletResponse res)
 	throws ServletException, IOException{
//	 logger.info(upmu[0]+","+upmu[1]);
	 Controller3 controller=null;
	 String path=null;
	 Object obj=null;
	 ModelAndView mav=null;
	 if("board3".equals(upmu[0])) {
		 controller=new Board3Controller();
		 //게시글 전체 목록
		 if("boardList".equals(upmu[1])) {
			 obj=controller.boardList(req,res);
			 //리턴타입이ModelAndView
			 if(obj instanceof ModelAndView) {
				 return (ModelAndView)obj;
			 }
			 else if(obj instanceof String) {//타입 알아내기 instanceof
				 return (String)obj;
		 }
		 //리턴타입이 스트링
		 }
		 else if("jsonBoardList".equals(upmu[1])) {//Json 포맷 나감-application/json
			 if(obj instanceof ModelAndView) {//타입 알아내기 instanceof
				 return (ModelAndView)mav;
			 }else if(obj instanceof String) {//타입 알아내기 instanceof
				 return (String)obj;
			 }
		 }
		else if("boardInsert".equals(upmu[1])) {//글입력-새글쓰기와 댓글쓰기
			obj=controller.boardInsert(req,res);
			logger.info("boardInsert호출==>boolean : "+obj instanceof String);
			if(obj instanceof String) {//타입 알아내기 instanceof
				 return (String)obj;
			 }	 
				 }
		else if("boardUpdate".equals(upmu[1])) {//글수정-첨부파일 수정 유무 고려하기
			obj=controller.boardUpdate(req,res);
			if(obj instanceof String) {//타입 알아내기 instanceof
				 return (String)obj;
			 }
		}
		else if("boardDelete".equals(upmu[1])) {//글입력-새글쓰기와 댓글쓰기
			obj=controller.boardDelete(req,res);
			if(obj instanceof String) {//타입 알아내기 instanceof
				 return (String)obj;
			 }
			else if("boardDetail".equals(upmu[1])) {//Json 포맷 나감-application/json
				obj=controller.boardDetail(req,res);
				if(obj instanceof ModelAndView) {//타입 알아내기 instanceof
					 return (ModelAndView)mav;
				 }else if(obj instanceof String) {//타입 알아내기 instanceof
					 return (String)obj;
				 }
			 }
		}
	 }//end of 게시판구현
	 //인증관리-나
	 else if ("auth".equals(upmu[0])) {
		 
	 }
	 
	 //회원관리-은재언니 등등..
	 else if ("member".equals(upmu[0])) {
		 
	 }
	 
	 return obj;
	 	
 	}
 }
package com.pojo.step3;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

/*
 * Spring에서 제공되던 ModelAndView를 흉내내보자
 * 1)scope가 request이다.
 * 2)화면 이름을 정해준다.
 * */
public class ModelAndView {
 Logger logger=Logger.getLogger(ModelAndView.class);
 HttpServletRequest req =null;
 private String viewName=null;
 List<Map<String,Object>> reqList=new ArrayList<>();
 public ModelAndView() {}
	 public ModelAndView(HttpServletRequest req) {
		 this.req=req;
 }
	 public void addObject(String name, Object obj) {
		 req.setAttribute(name, obj);
		 Map<String, Object> pMap=new HashMap<>();
		 pMap.put(name, obj);
		 reqList.add(pMap);
	 }
	public String getViewName() {
		return viewName;
	}
	public void setViewName(String viewName) {
		this.viewName = viewName;
	}
}

댓글