공부의 기록/자바 풀 스택 : 수업내용정리

자바 풀 스택 1/7 오후 기록 032-2

파티피플지선 2025. 1. 7. 18:07

<14:30 5교시>

FoodDao.java

package test.food.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import test.food.dto.FoodDto;
import test.util.DbcpBean;

public class FoodDao {

	public boolean update(FoodDto dto) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		int rowCount = 0;
		try {
			conn = new DbcpBean().getConn();
			//실행할 미완성의 sql 문
			String sql = """
					update food
					set type=?, name=?, price=?
					where num=?
					""";
			pstmt = conn.prepareStatement(sql);
			// ? 에 값을 여기서 바인딩한다.
			pstmt.setString(1, dto.getType());
			pstmt.setString(2, dto.getName());
			pstmt.setInt(3, dto.getPrice());
			pstmt.setInt(4, dto.getNum());
			// sql 문 실행하고 변화된 row 의 갯수 리턴받기
			rowCount = pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (conn != null)
					conn.close();
				if (pstmt != null)
					pstmt.close();
			} catch (Exception e) {
			}
		}
		if (rowCount > 0) {
			return true;
		} else {
			return false;
		}
		
	}
	
	
	public FoodDto getData(int num) {
		FoodDto dto= null;
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			//Connection Pool 로 부터 Connection 객체 하나 가져오기 
			conn = new DbcpBean().getConn();
			//실행할 sql 문 작성
			String sql = """
					select num, type, name, price
					from food
					where num=?
					""";
			pstmt = conn.prepareStatement(sql);
			// ? 에 값 바인딩할게 있으면 여기서 하기
			pstmt.setInt(1, num);
			//sql 문 실행하고 결과를 ResultSet 객체로 리턴받기
			rs = pstmt.executeQuery();
			while (rs.next()) {
				dto=new FoodDto();
				dto.setNum(num);
				dto.setType(rs.getString("type"));
				dto.setName(rs.getString("name"));
				dto.setPrice(rs.getInt("Price"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (Exception e) {
			}
		}
		return dto;
	}
	
	
	public boolean insert(FoodDto dto) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		int rowCount = 0;
		try {
			conn = new DbcpBean().getConn();
			//실행할 미완성의 sql 문
			String sql = """
						insert into food
						(num, type, name, price)
						values (food_seq.nextval, ?,?,?)
					""";
			pstmt = conn.prepareStatement(sql);
			// ? 에 값을 여기서 바인딩한다.
			pstmt.setString(1, dto.getType());
			pstmt.setString(2, dto.getName());
			pstmt.setInt(3, dto.getPrice());
			// sql 문 실행하고 변화된 row 의 갯수 리턴받기
			rowCount = pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (conn != null)
					conn.close();
				if (pstmt != null)
					pstmt.close();
			} catch (Exception e) {
			}
		}
		if (rowCount > 0) {
			return true;
		} else {
			return false;
		}
		
	}
	
	
	public boolean delete(int num) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		int rowCount = 0;
		try {
			conn = new DbcpBean().getConn();
			//실행할 미완성의 sql 문
			String sql = """
					delete from food
					where num=?
					""";
			pstmt = conn.prepareStatement(sql);
			// ? 에 값을 여기서 바인딩한다.
			pstmt.setInt(1, num);
			// sql 문 실행하고 변화된 row 의 갯수 리턴받기
			rowCount = pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (conn != null)
					conn.close();
				if (pstmt != null)
					pstmt.close();
			} catch (Exception e) {
			}
		}
		if (rowCount > 0) {
			return true;
		} else {
			return false;
		}
	}	
	
	public List<FoodDto> getList(){
		List<FoodDto> list = new ArrayList<FoodDto>();
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			//Connection Pool 로 부터 Connection 객체 하나 가져오기 
			conn = new DbcpBean().getConn();
			//실행할 sql 문 작성
			String sql = """
						select num, type, name, price
						from food
						order by num asc
					""";
			pstmt = conn.prepareStatement(sql);
			// ? 에 값 바인딩할게 있으면 여기서 하기
			
			//sql 문 실행하고 결과를 ResultSet 객체로 리턴받기
			rs = pstmt.executeQuery();
			while (rs.next()) {
				FoodDto dto=new FoodDto();
				dto.setNum(rs.getInt("num"));
				dto.setType(rs.getString("type"));
				dto.setName(rs.getString("name"));
				dto.setPrice(rs.getInt("price"));
				list.add(dto);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (Exception e) {
			}
		}
		return list;
	}
}

 

 

insertform.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div class="container">
		<h1>맛집 목록에 추가하기 양식</h1>
		<form action="${pageContext.request.contextPath}/food/insert.jsp">
		<div>
			<label for="type">종류 구분</label>
			<select name="type" id="type">
				<option value="한식">한식</option>
				<option value="중식">중식</option>
				<option value="양식">양식</option>
				<option value="일식">일식</option>
				<option value="기타">기타</option>
			</select>
		</div>
		<div>
			<label for="name">이름</label>
			<input type="text" name="name" id="name"/>
		</div>
		<div>
			<label for="price">가격</label>
			<input type="text" name="price" id="price"/>
		</div>
		<button type="submit">저장</button>
		</form>
		
	</div>
</body>
</html>

 

 

 

insert.jsp

<%@page import="test.food.dao.FoodDao"%>
<%@page import="test.food.dto.FoodDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//폼으로 전송되는 종류, 이름, 가격 추출
	String type=request.getParameter("type");
	String name=request.getParameter("name");
	int price=Integer.parseInt(request.getParameter("price"));
	//Dto 객체에 담기
	FoodDto dto=new FoodDto();
	dto.setType(type);
	dto.setName(name);
	dto.setPrice(price);
	//DB에 저장하기
	FoodDao dao= new FoodDao();
	boolean isSuccess= dao.insert(dto);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div class="container">
		<h3>알림</h3>
		<%if(isSuccess){%>
			<p><strong><%=name %></strong> 맛집 정보를 저장했습니다.</p>
			<a href="list.jsp">목록보기</a>
		<%}else{%>
			<p>데이터 저장 실패</p>
			<a href="insertform.jsp">다시 작성</a>
		<%}%>
	</div>
</body>
</html>

 

delete.jsp

<%@page import="test.food.dao.FoodDao"%>
<%@page import="test.food.dto.FoodDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
	//폼으로 전송되는 번호 추출
	int num=Integer.parseInt(request.getParameter("num"));
	//DB에서 삭제
	FoodDao dao= new FoodDao();
	boolean isSuccess= dao.delete(num);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div class="container">
		<h3>알림</h3>
		<%if(isSuccess){ %>
			<p>
				<strong><%=num %></strong> 맛집의 정보를 삭제 했습니다.
				<a href="list.jsp">확인</a>
			</p>
		<%}else{ %>
			<p>
				삭제 실패!
				<a href="list.jsp">확인</a>
			</p>
		<%} %>
	</div>
</body>
</html>

 

 

update.dto

<%@page import="test.food.dto.FoodDto"%>
<%@page import="test.food.dao.FoodDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//Get 방식 파라미터로 전달되는 회원 번호 추출(updateform.jsp?num=x)
	int num= Integer.parseInt(request.getParameter("num"));
	//num에 해당하는 회원 정보를 MemberDao 객체를 이용해서 얻어온다
	FoodDto dto=new FoodDao().getData(num);
	//아래의 내용으로 응답된다
%>  
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
		<h1>맛집정보 수정 폼</h1>
		<form action="update.jsp" method="post">
			<div>
				<label for="num">번호</label>
				<input type="text" name="num" id="num" value="<%=dto.getNum()%>" readonly/>
			</div>
			<div>
				<label for="type">종류 구분</label>
				<select name="type" id="type" value="<%=dto.getType() %>">
					<option value="한식">한식</option>
					<option value="중식">중식</option>
					<option value="양식">양식</option>
					<option value="일식">일식</option>
					<option value="기타">기타</option>
				</select>
			</div>
			<div>
				<label for="name">이름</label>
				<input type="text" name="name" id="name" value="<%=dto.getName() %>"/>
			</div>
			<div>
				<label for="price">가격</label>
				<input type="text" name="price" id="price" value="<%=dto.getPrice() %>"/>
			</div>
			<button type="submit">저장</button>
			<button type="reset">취소</button>  <!-- 작성하던 내용을 원래 상태로 되돌림 -->
		</form>
	</div>
</body>
</html>

 

 

update.jsp

<%@page import="test.food.dao.FoodDao"%>
<%@page import="test.food.dto.FoodDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%


//1. 폼으로 전송되는 번호, 이름과 주소 추출
	int num=Integer.parseInt(request.getParameter("num"));
	String type=request.getParameter("type");
	String name=request.getParameter("name");
	int price=Integer.parseInt(request.getParameter("price"));
//2. MemberDto 객체에 담기
	FoodDto dto = new FoodDto(num, type, name, price);

//2. DB에 수정하기
	boolean isSuccess=new FoodDao().update(dto);
//3. 응답하기
    
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<script>
		<%if(isSuccess){%>
			//알림창을 띄우고
			alert("정보를 수정했습니다");
			//list.jsp 페이지로 이동
			location.href="list.jsp"
		<%}else{%>
			//알림창을 띄우고
			alert("정보 수정 실패");
			//updateform.jsp 페이지로 이동하면서 num이라는 파라미터명으로 수정할 회원의 번호를 가지고 간다
			location.href="updateform.jsp?num=<%=num%>";
		<%}%>
		
	</script>
</body>
</html>

 

 

 

빼먹거나 오류났거나 복붙하다가 고치지 못한 부분들

dto를 리턴해야하는데 num을 리턴하고 앉아 있었음... 아직도 미숙

 

복붙하다가 addr인거 안바꿔줌..ㅋㅋㅋ
food_seq.nextval()이라고 쓰고 앉았다. 소괄호 왜썼을까 (까먹은거지 뭐)
list.add(dto) 안 써 놓으니까 리스트에서 출력이 안 되는걸 이제야 정말 깨달아버림;

 

 

<15:30 6교시>

선생님이 답 알려주시는거 보고 필요한 내용 메모

 

 

한국에선 java를 많이 쓰고, 서양권에서는 node.js나 php를 많이 쓴다.

 

샘이 보내준 FoodDao

더보기
package test.food.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import test.food.dto.FoodDto;
import test.util.DbcpBean;

public class FoodDao {
	public boolean insert(FoodDto dto) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		int rowCount = 0;
		try {
			conn = new DbcpBean().getConn();
			//실행할 미완성의 sql 문
			String sql = """
				INSERT INTO food
				(num, type, name, price)
				VALUES(food_seq.NEXTVAL, ?, ?, ?)
			""";
			pstmt = conn.prepareStatement(sql);
			// ? 에 값을 여기서 바인딩한다.
			pstmt.setString(1, dto.getType());
			pstmt.setString(2, dto.getName());
			pstmt.setInt(3, dto.getPrice());
			// sql 문 실행하고 변화된 row 의 갯수 리턴받기
			rowCount = pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (conn != null)
					conn.close();
				if (pstmt != null)
					pstmt.close();
			} catch (Exception e) {
			}
		}
		if (rowCount > 0) {
			return true;
		} else {
			return false;
		}
	}
	
	public boolean update(FoodDto dto) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		int rowCount = 0;
		try {
			conn = new DbcpBean().getConn();
			//실행할 미완성의 sql 문
			String sql = """
				UPDATE food
				SET type=?, name=?, price=?
				WHERE num=?
			""";
			pstmt = conn.prepareStatement(sql);
			// ? 에 값을 여기서 바인딩한다.
			pstmt.setString(1, dto.getType());
			pstmt.setString(2, dto.getName());
			pstmt.setInt(3, dto.getPrice());
			pstmt.setInt(4, dto.getNum());
			// sql 문 실행하고 변화된 row 의 갯수 리턴받기
			rowCount = pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (conn != null)
					conn.close();
				if (pstmt != null)
					pstmt.close();
			} catch (Exception e) {
			}
		}
		if (rowCount > 0) {
			return true;
		} else {
			return false;
		}
	}
	
	public boolean delete(int num) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		int rowCount = 0;
		try {
			conn = new DbcpBean().getConn();
			//실행할 미완성의 sql 문
			String sql = """
				DELETE FROM food
				WHERE num=?
			""";
			pstmt = conn.prepareStatement(sql);
			// ? 에 값을 여기서 바인딩한다.
			pstmt.setInt(1, num);
			// sql 문 실행하고 변화된 row 의 갯수 리턴받기
			rowCount = pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (conn != null)
					conn.close();
				if (pstmt != null)
					pstmt.close();
			} catch (Exception e) {
			}
		}
		if (rowCount > 0) {
			return true;
		} else {
			return false;
		}
	}
	
	public FoodDto getData(int num) {
		
		FoodDto dto=null;
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			//Connection Pool 로 부터 Connection 객체 하나 가져오기 
			conn = new DbcpBean().getConn();
			//실행할 sql 문 작성
			String sql = """
				SELECT type, name, price
				FROM food
				WHERE num=?
			""";
			pstmt = conn.prepareStatement(sql);
			// ? 에 값 바인딩할게 있으면 여기서 하기
			pstmt.setInt(1, num);
			//sql 문 실행하고 결과를 ResultSet 객체로 리턴받기
			rs = pstmt.executeQuery();
			if (rs.next()) {
				dto=new FoodDto();
				dto.setNum(num);
				dto.setType(rs.getString("type"));
				dto.setName(rs.getString("name"));
				dto.setPrice(rs.getInt("price"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (Exception e) {
			}
		}
		
		return dto;
	}
	
	public List<FoodDto> getList(){
		
		List<FoodDto> list=new ArrayList<>();
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			//Connection Pool 로 부터 Connection 객체 하나 가져오기 
			conn = new DbcpBean().getConn();
			//실행할 sql 문 작성
			String sql = """
				SELECT num, type, name, price
				FROM food
				ORDER BY num ASC
			""";
			pstmt = conn.prepareStatement(sql);
			// ? 에 값 바인딩할게 있으면 여기서 하기

			//sql 문 실행하고 결과를 ResultSet 객체로 리턴받기
			rs = pstmt.executeQuery();
			while (rs.next()) {
				
				FoodDto dto=new FoodDto();
				dto.setNum(rs.getInt("num"));
				dto.setType(rs.getString("type"));
				dto.setName(rs.getString("name"));
				dto.setPrice(rs.getInt("price"));
				
				list.add(dto);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (Exception e) {
			}
		}
		
		return list;
	}
}

 

주소창에 나타나게 되는 경로들에는 모두 소문자를 써주고,

여러 단어의 조합이라 불가피하다면 언더바(_) 혹은 대쉬(/)를 사용

 

 

 

 

 

<16:30 7교시>

비즈니스 로직(위키피디아 뜻)

 

 

<%@page import="test.food.dao.FoodDao"%>
<%@page import="test.food.dto.FoodDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	
	//폼 전송되는 내용을 읽어와서 
	String type=request.getParameter("type");
	String name=request.getParameter("name");
	int price=Integer.parseInt(request.getParameter("price"));
	//FoodDto 에 담고
	FoodDto dto=new FoodDto();
	dto.setType(type);
	dto.setName(name);
	dto.setPrice(price);
	//DB 에 저장하기 
	boolean isSuccess=new FoodDao().insert(dto);
	//응답하기 
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/food/insert.jsp</title>
</head>
<body>
	<script>
		<%if(isSuccess){%>
			alert("<%=name%> 을(를) 추가 했습니다.");
			location.href="list.jsp";
		<%}else{%>
			alert("추가 실패!");
			location.href="insertform.jsp";
		<%}%>
	</script>
</body>
</html>

 

 

내가 코딩한 내용이 어떻게 클라이언트 화면에 전달되어 나타날지를 예상할 수 있으면 프로그래밍을 잘 할 수 있다.

그러니 기능을 구현하고 나면 소스보기를 눌러서 확인을 해서 제대로 작성되었는지를 확인해야 한다.

 

콘솔창에서 페이지 이동하는 방법

location.href="링크주소" 이런식으로 명령어 치면 된다.

 

 

redirect 응답 : 웹브라우저로 하여금 강제로 특정 페이지로 이동시켜버리는 응답 방식

새로운 경로로 요청을 다시 하라는 응답

 

아래가 리다이렉트 응답의 코드

<%@page import="test.food.dao.FoodDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
	//폼으로 전송되는 번호 추출
	int num=Integer.parseInt(request.getParameter("num"));
	//DB에서 삭제
	FoodDao dao= new FoodDao();
	boolean isSuccess= dao.delete(num);
	//3. redirect 방식의 응답
	//특정 경로로 요청을 다시 하라는 리다이렉트 응답
	//list.jsp=>delete.jsp=>list.jsp 이동이기 때문에 새로고침하는 느낌을 줄 수 있음
	response.sendRedirect("Step02DataBase/food/list.jsp");
%>

 

 

<17:30 8교시> 

 

리다이렉트코드의 context path(Step02DataBase)를 객체를 이용해서 얻어낸 다음 사용하는 방법

<%@page import="test.food.dao.FoodDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
	//폼으로 전송되는 번호 추출
	int num=Integer.parseInt(request.getParameter("num"));
	//DB에서 삭제
	FoodDao dao= new FoodDao();
	boolean isSuccess= dao.delete(num);
	//3. redirect 방식의 응답
	//특정 경로로 요청을 다시 하라는 리다이렉트 응답
	//list.jsp=>delete.jsp=>list.jsp 이동이기 때문에 새로고침하는 느낌을 줄 수 있음
	
	//context path는 HttpServletRequest 객체를 이용해서 얻어낸다.
	String cPath=request.getContextPath();
	response.sendRedirect(cPath+"/food/list.jsp");
%>

 

 

 

 

수정할 때 이전에 선택했던 선택지가 그대로 출력되게 나오는 게 하는 코드

<%@page import="test.food.dao.FoodDao"%>
<%@page import="test.food.dto.FoodDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//수정할 음식번호를 읽어온다. 
	int num=Integer.parseInt(request.getParameter("num"));
	//수정할 음식의 정보를 DB 에서 읽어온다.
	FoodDto dto=new FoodDao().getData(num);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/food/updateform.jsp</title>
</head>
<body>
	<div class="container">
		<h1>음식 수정 양식</h1>
		
		<p><%=false ? "selected" : "" %></p>
		
		<p><%="" %></p>
		
		<p></p>
		
		
		<form action="update.jsp" method="post">
			<div>
				<label for="type">유형</label>
				<select name="type" id="type">
					<option value="">선택</option>
					<option <%=dto.getType().equals("한식") ? "selected":"" %>>한식</option>
					<option <%=dto.getType().equals("중식") ? "selected":"" %>>중식</option>
					<option <%=dto.getType().equals("양식") ? "selected":"" %>>양식</option>
					<option <%=dto.getType().equals("일식") ? "selected":"" %>>일식</option>
					<option <%=dto.getType().equals("기타") ? "selected":"" %>>기타</option>
				</select>
			</div>
		</form>
	</div>
</body>
</html>