본문 바로가기
백엔드/웹 개발

13 게시판 만들기

by study_yeon 2023. 6. 27.

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