인프런 강의 학습/MVC 프레임워크_나프1탄

인프런 MVC 프레임워크는 내손에 22일차 : MVC01_9~10 회원리스트 가져오기, 회원리스트 보기

현호s 2021. 6. 6. 17:36
반응형

# MVC01_9~10 회원리스트 가져오기(묶고(VO)-담고(List)), 회원리스트 보기

## member 테이블 unique key 설정

  • 현재 사용중인 member 테이블은 아래와 같이 생성했다.
create table member (
	num int primary key auto_increment,
	id varchar(20) not null,
	pass varchar(20) not null,
	name varchar(30) not null,
	age int not null,
	email varchar(30) not null,
	phone varchar(30) not null
)
  • 여기서 id에 UNIQUE KEY 설정.
  • PRIMARY KEY 의 경우 중복을 허용하지 않고, NULL도 허용하지 않는 것이다.
create table member (
	num int primary key auto_increment,
	id varchar(20) not null,
	pass varchar(20) not null,
	name varchar(30) not null,
	age int not null,
	email varchar(30) not null,
	phone varchar(30) not null,
	unique key(id)
)
  • 입력값에 대한 유효성 검사는 프론트에서 자바스크립트 또는 제이쿼리를 이용한다.

## MemberListController.java Servlet 생성

  • kr.bit.controller 우클릭 > New > Servlet 클릭
  • Servlet 이름 MemberListController로 설정, URL Mapping의 경우 /memberList.do 로 설정 후 Service만 체크 후 Finish.

### finally

  • try ~ catch 문에서 finally의 경우 에러 존재유무에 관계 없이 실행.
  • 그래서 해당 부분에 db connection을 종료시켜주는 함수를 넣어준다.

### ArrayList 이용한 리스트 작업

  • ArrayList에 회원 데이터를 담기 위해 먼저 rs.next(); 를 통해서 데이터 존재 유무를 파악(rs.next()가 True인 경우) .
  • 아래와 같이 코드 작업 진행.
// 회원(VO) 전체 리스트(ArrayList) 가져오기
	public ArrayList<MemberVO> memberList() {
		String SQL = "select * from member";
		getConnect();
		ArrayList<MemberVO> list = new ArrayList<MemberVO>();
		
		try {
			ps = conn.prepareStatement(SQL);		
			rs = ps.executeQuery();	// rs -> 커서
			
			while (rs.next()) {
				int num = rs.getInt("num");
				String id = rs.getString("id");
				String pass = rs.getString("pass");
				String name = rs.getString("name");
				int age = rs.getInt("age");
				String email = rs.getString("email");
				String phone = rs.getString("phone");
				
				// 묶고
				MemberVO vo = new MemberVO(num, id, pass, name, age, email, phone);
				
				// 담고
				list.add(vo);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			dbClose();
		}
		
		return list;
	}

## Member 테이블의 회원 리스트 보기

  • 아래와 같이 list 가져올 Controller 코드 작업 진행
package kr.bit.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

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.bit.model.MemberDAO;
import kr.bit.model.MemberVO;

@WebServlet("/memberList.do")
public class MemberListController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) 
							throws ServletException, IOException {
		// 1. 클라이언트 요청 받기 (memberList.do)
		MemberDAO dao = new MemberDAO();
		
		// 2. 회원 전체 리스트 가져오기(Model 연동)
		ArrayList<MemberVO> list = dao.memberList();
		
		// 3. 회원 전체 리스트를 HTML로 만들어서 응답하기
		System.out.println(list);
	}
}

### MIME TYPE 설정

  • 응답되는 데이터안에 한글이 존재하는 경우에는 인코딩 필요.
  • 서버가 클라이언트한테 어떤 타입을 전달할지 알려주는 것.
  • response.setContentType("text/html;charset=utf-8");
  • 아래와 같이 작업하여 결과물 확인 가능.
package kr.bit.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

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.bit.model.MemberDAO;
import kr.bit.model.MemberVO;

@WebServlet("/memberList.do")
public class MemberListController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) 
							throws ServletException, IOException {
		// 1. 클라이언트 요청 받기 (memberList.do)
		MemberDAO dao = new MemberDAO();
		
		// 2. 회원 전체 리스트 가져오기(Model 연동)
		ArrayList<MemberVO> list = dao.memberList();
		
		// 3. 회원 전체 리스트를 HTML로 만들어서 응답하기
		// 응답되는 데이터 안에 한글이 존재할 경우 -> 인코딩 필요.
		response.setContentType("text/html;charset=utf-8");	// MIME-TYPE		
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head>");
		out.println("<meta name='viewport' content='width=device-width, initial-scale=1'>");
		out.println("<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css'>");
		out.println("<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js'></script>");
		out.println("<script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js'></script>");
		out.println("</head>");
		out.println("<body>");
		out.println("<table border='1' class='table table-bordered'>");
		out.println("<thead>");
		out.println("<tr>");
		out.println("<th>번호</th>");
		out.println("<th>아이디</th>");
		out.println("<th>비밀번호</th>");
		out.println("<th>이름</th>");
		out.println("<th>나이</th>");
		out.println("<th>이메일</th>");
		out.println("<th>전화번호</th>");
		out.println("</tr>");
		out.println("</thead>");
		out.println("<tbody>");
		
		for (MemberVO vo : list) {
			out.println("<tr>");
			out.println("<td>" + vo.getNum()+ "</td>");
			out.println("<td>" + vo.getId()+ "</td>");
			out.println("<td>" + vo.getPass()+ "</td>");
			out.println("<td>" + vo.getName()+ "</td>");
			out.println("<td>" + vo.getAge()+ "</td>");
			out.println("<td>" + vo.getEmail()+ "</td>");
			out.println("<td>" + vo.getPhone()+ "</td>");
			out.println("</tr>");
		}
		
		out.println("</tbody>");
		out.println("<tr>");
		out.println("<td colspan='7' align='right'>");
		out.println("<a href='member/memberRegister.html'>회원가입</a>");
		out.println("</tr>");
		out.println("</td>");
		out.println("</table>");
		out.println("</body>");
		out.println("</html>");
	}
}

## 리다이렉트(sendRedirect)

  • MemberInsertController 의 MemberInsert 성공에 따른 경로 수정.
  • 이렇게 해주면 회원가입 후 회원리스트 목록으로 이동.
package kr.bit.controller;

import java.io.IOException;
import java.io.PrintWriter;

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.bit.model.MemberDAO;
import kr.bit.model.MemberVO;

@WebServlet("/memberInsert.do")
public class MemberInsertController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) 
							throws ServletException, IOException {
		
		request.setCharacterEncoding("utf-8");
		// 1. 파라미터 수집(VO)
		String id = request.getParameter("id");
		String pass = request.getParameter("pass");
		String name = request.getParameter("name");
		int age = Integer.parseInt(request.getParameter("age"));
		String email = request.getParameter("email");
		String phone = request.getParameter("phone");
		
		// 파라미터 수집(VO)
		// MemberVO vo = new MemberVO(id, pass, name, age, email, phone);
		MemberVO vo = new MemberVO();		
		vo.setId(id);
		vo.setPass(pass);
		vo.setName(name);
		vo.setAge(age);
		vo.setEmail(email);
		vo.setPhone(phone);
		
		//System.out.println("vo : " + vo);	// vo.toString() 이 생략되어있는 것.
		// Model과 연동하는 부분
		MemberDAO dao = new MemberDAO();
		int cnt = dao.memberInsert(vo);
		PrintWriter out = response.getWriter();
		// 가입 성공
		if ( cnt > 0 ) {
			//out.println("insert success");	
			// 다시 회원 리스트 보기로 가야함.
			response.sendRedirect("/MVC01/memberList.do");
			
		// 가입 실패 -> 예외 객체를 만들어서 WAS에게 던지자.
		} else {
			throw new ServletException("not insert");
			
		}
	}
}
반응형