모도리는 공부중

21.03.04. SPRING - 본문

K-디지털 빅데이터 분석서비스 개발자과정 20.11.02~21.04.12/JAVA

21.03.04. SPRING -

공부하는 모도리 2021. 3. 4. 14:09
728x90
반응형

개발자는 모르겠으면 구글링을 잘해서 내가 모르는 부분에 대해 공부하고 잘 호라용하는게 중요하다. 모른다? 찾아라. 인터넷에 답이 있다. 다들 그렇게 공부하면서 성장한 것이니 앞으로 모르는 개념이 나오면 꼭 검색하도록 하자.

 

 

데이터베이스에 부하를 줄이고 유동적으로 관리하는 것을 커넥션 풀이라고 부른다.

여러개의 커넥션을 모아놓은 것은 팩토리라고 부른다.

jdbc에서는 connection이라고 불렀던 용어를 myBatis에서는 SqlSession이라고 부른다.

session은 클라이언트와 서버간의 고유한 연결라인이다. 이것을 sql에서 가져다 쓰는 것인데 이제부터 우리가 배우는 것은 myBatis이므로 connection이라는 단어 대신 SqlSession이라는 단어를 사용할 것이다.

 

 

 

 InputStream은 xml파일을 읽어오는 빨대. 이런 빨대를 자바에서는 stream이라고 부른다. 

 

	@Override
	public List<MemberVO> memberList() {
		
		SqlSession session = sqlSessionFactory.openSession();
		
//		String SQL = "select * from membl"; ← 이제 이 쿼리는 여기에 쓸 수 없다. MemberMapper.xml에서 작성.
//		그럼 mapper에 있는 sql을 어떻게 연결할 것인가? mapper에서 sql문을 select태그로 감싸주면 된다.
//		select로 감쌌으니 id를 부여할 수 있다. 그 id를 이용해서 연결하는데, id값은 보통 method이름을 그대로 부여하는게 일반적이다.
		
		// selectList : db에서 여러개의 데이터를 가지고 오는 작업
		List<MemberVO> list = session.selectList("memberList"); // mapper에서 MemberVO로 넘겨주었으니 vo list로 값을 받는다.
		session.close(); // session 반납
		return list;
	}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.smhrd.mybatis.MemberMapper"> <!-- namespace로 mapper가 중복되지 않도록 구분 -->

	<!-- sql문을 select태그로 감싸서 id값을 주면 MemberDAOImpl에 있는 memberList메소드와 연결할 수 있다. -->
	<!-- resultType은 select태그 안에 있는 결과값을 어떻게 표시할 것인지 나타낸다. -->
	<!-- resultType을 MemberVO타입으로 묶어주는데 이것은 패키지 안에 있으므로 경로를 전부 작성해주어야 한다. -->
	<select id="memberList" resultType="kr.smhrd.model.MemberVO">
		select * from memtbl
	</select>
	
</mapper>

 

MemberFrontController

package kr.smhrd.frontcontroller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.smhrd.controller.Controller;
import kr.smhrd.controller.MemberInsertController;
import kr.smhrd.controller.MemberListController;

@WebServlet("*.do")
public class MemberFrontController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 1. 클라이언트의 요청정보를 확인하기
		String reqUrl = request.getRequestURI(); // 클라이언트가 요청한 url정보를 얻어와서 reqUrl변수에 담아준다. 
//		System.out.println(reqUrl);
		
		// Context Path = ?
		String ctx = request.getContextPath();
//		System.out.println(ctx); // Context Path인 /mvc만 잘라내기
		
		String command = reqUrl.substring(ctx.length()); // /memberList.do만 잘라오려면 어떻게 해야할까?
		System.out.println(command);
		
		// 2. 해당 요청에 따른 분기 작업(HandlerMapping) : if ~ else ~
		Controller controller;
		if (command.equals("/memberList.do")) {
//			MemberListController controller = new MemberListController(); ← 이것의 부모타입인 Controller를 상단에 미리 선언
			controller = new MemberListController();
			controller.requestHandler(request, response);
			
		} else if (command.equals("/memberInsert.do")) {
//			MemberInsertController controller = new MemberInsertController();
			controller = new MemberInsertController();
		}
	}

}

컨트롤러쪽 코드를 작성해준다.

이제 그 컨트롤러와 연관된 각각의 컨트롤러 클래스들을 수정한다. (MemberListController)

package kr.smhrd.controller;

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

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

import kr.smhrd.model.MemberDAO;
import kr.smhrd.model.MemberDAOImpl;
import kr.smhrd.model.MemberVO;
// 유연성이 떨어진다?
public class MemberListController implements Controller {

	@Override
	public String requestHandler(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		MemberDAO dao = new MemberDAOImpl();
		List<MemberVO> list = dao.memberList();
		// ★ 객체 바인딩
		request.setAttribute("list", list);
		// 컨트롤러님 forward할 다음 페이지는 memberList.jsp입니다.
		return "WEB-INF/view/memberList.jsp";
	}

}

※객체 바인딩 : 특정 객체를 특정 메모리에 값을 저장하고 다른 객체가 그 값을 쓰기 위한 방법
(특정 객체에 설정 : setAttribute/ 설정 객체 가져오기:getAttribute)※

 

forward할 페이지를 frontcontroller에게 알려주어야 하니 return값으로 해당 jsp페이지를 알려준다. 그리고 이제 return이 생겼으니 더 이상 void가 아니므로 메소드 리턴 설정을 String으로 변경. 최상위 인터페이스 Controller에도 String으로 변경해준다. (Controller)

package kr.smhrd.controller;

import java.io.IOException;

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

public interface Controller {
	// void -> String
	public String requestHandler(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException;
	
}

 

이제 forward할 페이지를 listController가 알려주었으니 프론트컨트롤러가 그 역할을 수행할 수 있도록 코드를 작성해준다. (MemberFrontController)

		// 2. 해당 요청에 따른 분기 작업(HandlerMapping) : if ~ else ~
		Controller controller;
		String nextView = null;
		if (command.equals("/memberList.do")) {
//			MemberListController controller = new MemberListController(); ← 이것의 부모타입인 Controller를 상단에 미리 선언
			controller = new MemberListController();
			nextView = controller.requestHandler(request, response);
			// forward(RequestDispatcher)
			RequestDispatcher rd = request.getRequestDispatcher(nextView);
			rd.forward(request, response);
			

 

이제 실행해보면,

잘 나오는 것을 볼 수 있다.

 

부트스트랩을 이용하면 css를 간편하게 적용할 수 있다. 테이블에

728x90
반응형
Comments