Programming/Servlet & JSP

[환경설정] Eclipse의 Web Project와 DB(MySQL) 연결하기

코딩하는 포메라니안 2022. 3. 26. 23:39

1. DB(MySQL)-connector 설치 및 등록

1. mysql-connector 설치

- mysql에서 각 언어마다 연결해주는 connector를 제공하고 있으니, 가져다 쓰자!

 

https://mvnrepository.com/artifact/mysql/mysql-connector-java

 

 

 

원하는 버전 선택 후, jar파일 클릭해서 다운받기

 

 

 

2. 웹프로젝트의 lib에 등록

WEB-CONTENT > WEB-INF > lib에 다운 받은 jar파일을 복사 & 붙여넣기하면 연결이 끝난다.

 

 


 

2. DB와 통신하는 JAVA코드 작성

*웹 프로젝트 뿐만 아니라, 일반 Java파일과 연결할 때도 같은 코드를 사용한다.

*객체 지향을 위해, 코드를 분리해서 적었지만 DB관련 코드를 한 곳에 다 작성해서 사용해도 된다.

 

 

프로젝트의 파일 구조

 

 

 

프로젝트의 결과 화면

- main.jsp에서 실행하기

 

 

 

 

 

 

1. MySQL Workbench를 열고, 아래 코드를 작성&실행하기

 

- "testdb"의 이름을 가진 데이터베이스 생성

- name과 age를 가진 "data"라는 테이블을 생성

create database testdb;
use testdb;

drop table if exists data;

create table data(
    name varchar(40) NOT NULL PRIMARY KEY,
    age int NOT NULL
);

--test용 = 데이터가 잘 들어갔는지 확인
select * from data;

 

 

 

2. DB와 연결하기 위한 클래스 생성 : DBUtil.java

- 이 부분은 굳이 생성할 필요 없이, DB를 사용할 때마다 작성해도 된다.

- 코드 중복을 줄이기 위해, 클래스를 생성했다.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBUtil {
	private final String driverName = "com.mysql.cj.jdbc.Driver";
	private final String url = "jdbc:mysql://localhost/testdb?serverTimezone=UTC";//database이름 = testdb
	private final String user = "rootid";//자신의 workbench 아이디
	private final String pass = "rootpass";//자신의 workbench 비번
	
	private static DBUtil instance = new DBUtil();
	
	private DBUtil(){
		//1. DB Driver를 로딩
		try {
			Class.forName(driverName);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public static DBUtil getInstance() {
		return instance;
	}
	
	public Connection getConnection() throws SQLException {
		//2. DB(MySQL)에 접속하기
		return DriverManager.getConnection(url, user, pass);
	}
	
    //DB작업 후, 여러 클래스 close할 때 사용
	public void close(AutoCloseable... closeables) {
		for(AutoCloseable c : closeables) {
			if(c!=null) {
				try {
					c.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}

 

 

 

3. 주고 받을 데이터 형태 클래스로 만들기 : Data.java

- 굳이 클래스를 안 만들고, 데이터만 주고 받아도 됨.

package com.test.dto;

public class Data {
	private String name;
	private int age;
	
	public Data() {//기본 생성자
		
	}
	
	public Data(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
}

 

 

 

4. Database 작업을 하는 클래스 생성 : testDao.java

- DAO(Data Access Object)라고 부름

 

 

PreparedStatement 메서드

1) execute() : 그 외 구문들 => boolean 반환

2) executeQuery() : select 구문 => ResultSet 반환

3) executeUpdate() : insert, update, delete 구문 => int 반환(영향 받은 튜플 개수)

 

package com.test.dao;

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

import com.test.dto.Data;
import com.test.util.DBUtil;

public class testDao {

	static DBUtil dbUtil = DBUtil.getInstance();
	
	public static void insertData(Data data) throws SQLException {
		Connection conn = null;
		PreparedStatement pstmt = null;
		try {
        	//3. sql문 실행
			conn = dbUtil.getConnection();
			StringBuilder d = new StringBuilder();
			d.append("insert into data \n");
			d.append("values(?, ?)");
			pstmt = conn.prepareStatement(d.toString());
			pstmt.setString(1, data.getName());
			pstmt.setInt(2, data.getAge());
			pstmt.executeUpdate();//insert실행
		} finally {
			dbUtil.close(pstmt, conn);
		}
	}

	public static ArrayList<Data> selectAllData() throws SQLException {
		ArrayList<Data> list = new ArrayList<>();
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			conn = dbUtil.getConnection();
			pstmt = conn.prepareStatement("select * from data");
			rs = pstmt.executeQuery();//select실행
			
			while(rs.next()) {
				Data data = new Data();
				data.setName(rs.getString("name"));
				data.setAge(rs.getInt("age"));
				list.add(data);
			}
		}finally {
			dbUtil.close(rs, pstmt, conn);
		}
		
		return list;
	}
}

 

 

 

5. DAO를 실행시키는 Controller 클래스 생성 : testservlet.java

package com.test.servlet;

import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.RequestDispatcher;
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 com.test.dao.testDao;
import com.test.dto.Data;

@WebServlet("/testservlet")
public class testservlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	private static testDao dao = new testDao();
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String order = request.getParameter("action");
		String url;
		switch(order) {
		case "insert":
			url = doInsert(request, response);
			response.sendRedirect(url);
			break;
		case "list":
			url = doList(request, response);
			RequestDispatcher dispatcher = request.getRequestDispatcher(url);
			dispatcher.forward(request, response);
			break;
		}
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");//한글깨짐 방지
		doGet(request, response);
	}

	private String doInsert(HttpServletRequest request, HttpServletResponse response) {
		Data data = new Data();
		data.setName(request.getParameter("name"));
		data.setAge(Integer.parseInt(request.getParameter("age")));
		try {
			dao.insertData(data);
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("db insert중 에러!");
		}
		return "testservlet?action=list";
	}
	
	private String doList(HttpServletRequest request, HttpServletResponse response) {
		try {
			request.setAttribute("list", dao.selectAllData());
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return "list.jsp";
	}
}

 

 

 

6. 화면 작성

1) 데이터 넣기 : main.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>
	여기는 main.jsp입니다.
	<form method="POST" action="testservlet">
		<input type="hidden" name="action" value="insert">
		이름 :<input type="text" name="name"/><br>
		나이 :<input type="number" name="age"/>
		<input type="submit" value="등록"/>
	</form>
</body>
</html>

 

 

2) 데이터 전체 보기 : list.jsp

<%@page import="com.test.dto.Data"%>
<%@page import="java.util.ArrayList"%>
<%@ 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>
<%
ArrayList<Data> list = (ArrayList<Data>)request.getAttribute("list");
for(Data data : list){
%>
이름 : <%= data.getName() %><br>
나이 : <%= data.getAge() %><br>
<%
}
%>
</body>
</html>