2023.06.23 수업
교재 : 자바 웹 개발 워크북
● 복습
※ 간단정리
비즈니스 로직에 의해 만들어진 것 : 영속적임
영속적인 데이터를 모델이라고함
* DB의 자료는 변하지 않아야하기 때문에 VO를 활용
서비스에서 DTO가 활동
* 비즈니스로직
컨트롤러가 요청을 받아 서비스에게 전달하여 서비스에서 처리하여 다시 컨트롤러에 보내줌
서비스에서 처리하는 로직(VO, DTO 활용)
※ 설정
* JSTL 활용
- WEP-INF아래 lib에 JSTL라이브러리 있는지 확인하기
* 웹 서블릿 방식 이용(추후 웹 xml방식 이용)
* 같은 프로젝트안에 name과 urlPatterns이 같으면 충돌
urlPatterns = value(주소가 하나일 경우)
- 파일 todo/list를 검색
프로젝트를 선택하고 상단 메뉴의 Search > File 클릭하여 원하는 단어 검색
- w1 패키지의 Controller에 name과 urlPatterns에 w1 붙이기(중복 방지)
* 개발하는 동안 포트는 80으로 설정
- 하단의 servers 더블클릭 > overview > ports의 HTTP/1.1 포트번호 변경
-> 포트번호가 안보임
http://localhost/todo/list으로 접속
- 포트번호를 통해 컴퓨터 2대의 역할
* cmp에 ipconfig 검색
ipconfig(windows용) : 내 컴퓨터 실제 주소 가져옴
실제주소 :
1. 사설 IP : 회사 같은 건물 안에서의 가상주소(192 or 172~~)
2. 공인 IP
구글에 what is my ip 검색
- 게이트웨이 : 네트워크로 들어오는 시작점, 출입구
* cmd에서 확인한 IP4주소를 검색하면 내가 작성한 페이지 확인 가능
* 객체와 객체가 상호작용한다
= 객체와 객체가 메시지를 교환한다
= 한 객체에서 상대편 객체의 메소드를 요청한다
* 상수프로그래밍
- 데이터는 final표시
-> 수정할때는 final 지우기
● 홈페이지 만들기
2023.06.26 - [백엔드/JSP & Servlet] - 12 게시판 만들기
12 게시판 만들기
2023.06.22 수업 ● 웹MVC와 JDBC의 결합 - DAO를 구성한 후 서비스 객체와 컨트롤러 객체를 연동해서 최종적으로 실행 가능한 웹 애플리케이션을 제작해야함 ▶ 실습 - 모든 기능이 동작하는 웹 어플
dustj0824.tistory.com
이어서
▷ 목록기능 구현
TodoListController 복습
- doGet 구현
- 로그기록(log4j2)
- TodoService객체 이용
▷ TodoService의 목록 기능 구현
- jdbcex 기준(w1과 구분)
- DAO -> Service -> Controller의 순서대로 진행 (List에 의한 흐름)
* TodoService에 listAll() 메소드 추가
- TodoDAO에서 가져온 TodoVO의 목록을 TodoDTO로 변환하여 반환하기
- TodoDAO의 selectAll로부터 받아옴
package org.zerock.jdbcex.service;
import java.util.List;
import java.util.stream.Collectors;
import org.modelmapper.ModelMapper;
import org.zerock.jdbcex.dao.TodoDAO;
import org.zerock.jdbcex.domain.TodoDTO;
import org.zerock.jdbcex.domain.TodoVO;
import org.zerock.jdbcex.util.MapperUtil;
import lombok.extern.log4j.Log4j2;
@Log4j2
public enum TodoService {
INSTANCE;
/// 멤버변수
private TodoDAO dao;
private ModelMapper modelMapper;
/// 생성자
// 모델 설정에 따른 모델객체 생성
TodoService() {
dao = new TodoDAO();
modelMapper = MapperUtil.INSTANSE.get();
}
public void register(TodoDTO todoDTO) throws Exception {
TodoVO todoVO =
modelMapper.map(todoDTO, TodoVO.class);
log.info(todoVO);
// int를 반환하므로 이를 이용해서 예외처리
dao.insert(todoVO); // dao의 insert에 todoVO를 넘김
}
// 0623 listAll() 추가
public List<TodoDTO> listAll() throws Exception {
List<TodoVO> voList = dao.selectAll();
log.info("voList...");
log.info(voList);
// voList를 복사
List<TodoDTO> dtoList = voList.stream()
.map(vo -> modelMapper.map(vo, TodoDTO.class))
.collect(Collectors.toList());
log.info(dtoList);
return dtoList;
}
}
* 데이터는 상수로 보고 받기
DB에서 넘어온 순수 자료대로 VO객체에 넣기 : voList
DTO에서 변경 : dtoList
DAO : 데이터베이스를 상대함
* list는 반복이 있는 자료
반복을 처리하는 방법 stream
stream은 시작과 끝을 내부적으로 알고있음
* 간단한 처리는 stream 활용
- voList의 크기만큼 루프를 돈다.
* 복잡한 처리는 for루프 활용
* stream 은 while next로 생각하고
modelMapper에 의해 vo객체가 dto로 넘어감
* map() : stream에 의해 자료하나(vo) 가져와라
- map은 키로 구분이 되어있음
- voList의 한개(vo)를 가져옴
- modelMapper의 map은 처리하는 기능
* collect(Collectors.toList()) : 결과를 데이터를 리스트로 바꾸는 toList() 형태로 쌓기(저장하기)
collect 시작부터 끝까지 반복하기
-> map하나 읽을때마다 List로 저장됨
* 인라인
익명함수 / 람다함수
▷ TodoListController 수정
- HttpServletRequest의 setAttribute()를 이용해서 TodoService의 객체가 반환하는 테이터를 저장하고 RequestDispatcher를 이용하여 JSP로 전달
- 예외 직접처리
package org.zerock.jdbcex.controller;
import java.io.IOException;
import java.util.List;
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 org.zerock.jdbcex.domain.TodoDTO;
import org.zerock.jdbcex.service.TodoService;
import lombok.extern.log4j.Log4j2;
@WebServlet(name = "todoListControllerjdbcex", urlPatterns = "/todojdbcex/list")
@Log4j2 // log4j2 사용메소드를 이용해서 작동
public class TodoListController extends HttpServlet {
private TodoService todoService =
TodoService.INSTANCE; // enum상수클래스의 생성자
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
log.info("todoController // todo List.........");
// 0623 추가
try {
List<TodoDTO> dtoList = todoService.listAll();
req.setAttribute("dtoList", dtoList);
req.getRequestDispatcher("/WEB-INF/todo/list.jsp").forward(req, res);
} catch(Exception e) {
log.error(e.getMessage());
throw new ServletException("list error");
}
}
}
- req에 정보 담기(키 값을 만들어줌), jsp에서 데이터를 읽기 위함
- setAttribute() : 키와 값으로 이루어짐
- getRequestDispatcher("처리할 주소")
- getMessage() : 에러가 난 이유를 메시지로 보여줌
- throw new : 에러 만들기, 예외가 호출자로 돌아감
▷ WEP-INF에 todo폴더에 list.jsp 파일 수정
- 컨트롤러에서 dtoList로 키를 설정했으므로 items="${ dtoList }" 으로 키 이름 수정
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>제목은 여기에</title>
</head>
<body>
<h1>List Page</h1>
<c:forEach var="dto" items="${ dtoList }" >
<li>${ dto }</li>
</c:forEach>
</body>
</html>
▷ 등록기능 구현
- Todo의 등록기능은 GET방식으로 화면을 보고 POST방식으로 처리하고 처리 후 목록화면으로 redirect하는 PRG패턴임
* TodoService의 등록기능
- register()메소드는 파라미터로 TodoDTO를 받아 TodoVO로 변환하고 저장
▷ TodoRegisterController의 구현
서블릿 만들기
org.zerock.jdbcex.controller
TodoRegisterController
- doGet/doPost 모두 구현
- get 방식으로 호출되는 경우 register.jsp 파일을 통해 입력화면을 보여줌
- post에서는 TodoDTO를 구성하고 최종적으로 TodoService의 register()를 호출
-> 정상적으로 등록될 경우 get 방식으로 리다이렉트하여 바로 목록화면으로 이동
package org.zerock.jdbcex.controller;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
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 org.zerock.jdbcex.domain.TodoDTO;
import org.zerock.jdbcex.service.TodoService;
import lombok.extern.log4j.Log4j2;
/**
* Servlet implementation class TodoRegisterController
*/
@WebServlet(name = "todoRegisterControllerjdbcex", value = "/todojdbcex/register")
@Log4j2
public class TodoRegisterController extends HttpServlet {
// todoService 초기화(외부에서 접근하면 안됨)
private TodoService todoService = TodoService.INSTANCE;
private final DateTimeFormatter DATE_FOMATTER
= DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 양식(쓰기) 화면 요청
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
log.info("/todo/register - GET... ");
String goUrl = "/WEB-INF/todo/register.jsp";
req.getRequestDispatcher(goUrl).forward(req, res);
}
// 양식 처리
// 처리 후 redirect 하기
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
TodoDTO todoDTO = TodoDTO.builder()
.title(req.getParameter("title"))
.dueDate(LocalDate.parse(req.getParameter("dueDate"),DATE_FOMATTER))
.build();
log.info("/todo/register POST...");
log.info(todoDTO);
// db등록을 위해 TodoService 호출
try {
todoService.register(todoDTO);
} catch (Exception e) {
e.printStackTrace();
}
// 데이터 등록을 마쳤으므로 /todo/list로 이동
// 화면만 변경하면 되므로 sendRedirect 이용
String goUrl = "/todo/list";
res.sendRedirect(goUrl);
}
}
▷ register.jsp 수정
1. action 수정
2. div 추가
- title / dueDate 를 post 방식으로 전송
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Todo 등록</title>
</head>
<body>
<form action="/todo/register" method="post">
<div>
<input type="text" name="title" placeholder="내용을 입력해주세요" />
</div>
<div>
<input type="date" name="dueDate" .>
</div>
<div>
<button type="reset">reset</button>
<button type="submit">등록</button>
</div>
</form>
</body>
</html>
'백엔드 > 웹 개발' 카테고리의 다른 글
방문자 기억 - (세션/쿠키) (0) | 2023.06.28 |
---|---|
14 게시판 만들기 (0) | 2023.06.27 |
12 게시판 만들기 (0) | 2023.06.26 |
11 게시판 만들기( JDBC 구현 ) (0) | 2023.06.23 |
10 (JDBC 프로그래밍 준비) (0) | 2023.06.23 |