Study!/JSP.

[JDBC 응용] 학생 Table , Query로 접근하기

해태봉 2021. 12. 21. 17:30

🛠Tools

Oracle 18C XE (sqlplus),

Eclips 2021-12,

JDK-java SE 8,

Server - apache Tomcat 9.0

 

📰테이블 작성.

create table student(
name   varchar2(15)  not  null,
value   varchar2(15),
code   number
);

 

이번 Program의 요구사항은 다음과 같습니다.

  1. 입력
    1. Code를 입력받아 각 Code별로 Value항목이 달라집니다.
      1. 학생 : 이름,학번
      2. 교수 : 이름,과목
      3. 관리자 : 이름 , 부서
  2. 검색
    1. 이름검색 (1개의 글자가 포함된 모든 레코드 검색)
    2. 코드검색
    3. 전체검색
  3. 수정
    1. 이름을 통해서 Code와 Value를 수정합니다.
  4. 삭제
    1. 이름이 일치한 레코드를 삭제합니다.
  5. 종료

📢 참고사항. 기본적으로 DTO와 DAO의 Class 형식을 지켜서 작성합니다. 저같은 경우엔 총 3번의 수정을 통해 Program의 확장성을 넓히고자 하였으며, 각 기능별로 Method를 세분화하여 사용하려 노력하였습니다.

또한, SQL문은 전부 prepardStatment로 처리하였습니다.

핵심적인 Method들을 제외한 총합 코드 길이가 많아 전부 포스팅에 담기엔 가독성이 안좋아서 Git 주소로 대체합니다. 

  https://github.com/madbo2/JSP-Study/tree/main/Student_improvement

 

GitHub - madbo2/JSP-Study

Contribute to madbo2/JSP-Study development by creating an account on GitHub.

github.com

 

 

Code 파헤치기 

📢 Table에 있는 code,value,name 은 각 항목별로 따로 입력받는 Method를 작성하였습니다. 아래 참조

더보기
private int chooseInput() {
		System.out.print(
				"****************\r\n" + 
				"  1. 이름검색\r\n" + 
				"  2. 코드검색\r\n" + 
				"  3. 전체검색\r\n" + 
				"  4. 이전으로\r\n" + 
				"****************\r\n" + 
				"  번호선택 : ");
		int select = sc.nextInt();
		
		return select; 
	}
	private int codeInput() {
		System.out.print("****************\r\n"
				+ "   1. 학생\r\n"
				+ "   2. 교수\r\n"
				+ "   3. 관리자\r\n"
				+ "   4. 이전메뉴\r\n"
				+ "****************\r\n"
				+ "   번호선택 : ");
		int code = sc.nextInt();
		
		return code;
	}
	
	private String nameInput(String msg) {
		System.out.print(msg + "이름 입력 : ");
		String name = sc.next();
		return name;
	}
	private String valueInput(int code) {
		if(code==1) {
			System.out.print("학번 입력 : ");
		} else if (code==2) {
			System.out.print("과목 입력 : ");
		} else {
			System.out.print("부서 입력 : ");
		}
		return sc.next();
	}

 

📜 InsertArticle Method

더보기
private void insertArticle() {
		int code = codeInput(); 			// 확장성을 위한 입력 메소드 작성
		if(code==4) {
			return;
		} else if(code <1 || code >4) {
			System.out.println("잘못된 선택입니다");
			return;
		}
		
		String name = nameInput("");
		String value = valueInput(code);
		
		StudentDTO dto = new StudentDTO(name, value, code);
		
		StudentDAO dao = new StudentDAO();
		
		boolean check = dao.insert(dto);		//결과창 출력을 위한 Boolean
		
		
		if(check) {
			System.out.println(name + "님의 정보가 추가 되었습니다.");
		}else {
			System.out.println("정보 추가에 실패하였습니다.");
		}
		
	}

📜 SelectArticle Method

더보기
private void selectArticle1() {
		int select = chooseInput();
		
		if(select == 4) {
			System.out.println("이전 메뉴로 돌아갑니다.");
		} else if(select <1 || select >4) {
			System.out.println("잘못된 선택입니다. 이전메뉴로 돌아갑니다");
			return;
		}
		
		StudentDTO dto = null;
		
		if(select == 1) {
			dto = new StudentDTO();
			System.out.println("검색할 이름 입력 : ");
			dto.setName(sc.next());
		} else if (select == 2) {
			int code = codeInput();
			if(select ==4) {
				System.out.println("이전 메뉴로");
				return;
			} else if( select <1 || select > 4) {
				System.out.println("잘못된 선택입니다.");
				return;
			}
			dto = new StudentDTO();
			dto.setCode(code);
		}
		StudentDAO dao = new StudentDAO();
		
		List<StudentDTO> list = dao.select(dto);
		
		if(list == null) {
			System.out.println("검색 결과가 없습니다.");
		} else {
			for(StudentDTO d : list) {
				System.out.print("이름 : " + d.getName() + "\t");
				if(d.getCode() == 1) {
					System.out.println("학번 : " + d.getvalue());
				}else if(d.getCode() == 2) {
					System.out.println("과목 : " + d.getvalue());
				}else if(d.getCode() == 3) {
					System.out.println("부서 : " + d.getvalue());
				}
			}
		}
	}

📜 UpdateArticle Method

더보기
private void updateArticle2() {
		String name  = nameInput("수정할 ");
		
		StudentDAO dao = new StudentDAO();
		
		StudentDTO dto = dao.selectOne(name); // 1개의 레코드만검색하는 메소드
		
		if(dto == null) {
			System.out.println("검색 실패 이전메뉴로 돌아갑니다.");
			return;
		}
		System.out.println(dto.getName()+"님의 정보");
		System.out.println(valueString(dto.getCode())+dto.getvalue());
		
		int code = codeInput();
		
		if(code == 4) {
			return;
		}else if(code < 1 || code > 4) {
			System.out.println("잘못된 선택!..이전 메뉴로..");
			return;
		}
		
		String value = valueInput(code);
		
		dto.setValue(value);
		dto.setCode(code);
		
		int su = dao.update(dto);
		
		if(su!=0) {
			System.out.println(name + "님의 정보가 성공적으로 수정되었습니다.");
		} else {
			System.out.println("수정 작업에 실패하였습니다.");
		}
		
	}
    private String valueString(int code) {
		if(code == 1) {
			return "학번 : ";
		} else if (code==2) {
			return "과목 : ";
		} else {
			return "부서 : ";
		}
	}

📜 DeletArticle Method

더보기
	private void deleteArticle() {
		String name = nameInput("");
		
		StudentDTO dto = new StudentDTO(name);
		StudentDAO dao = new StudentDAO();
		
		boolean check = dao.delete(dto);
		
		if(check) {
			System.out.println(name + "님의 정보가 삭제 되었습니다.");
		}else {
			System.out.println("정보 삭제에 실패하였습니다.");
		}
		
	}

 

 

📜 StudentDTO.java

더보기
package student.StudentDTO;

import java.util.Scanner;

public class StudentDTO {
Scanner sc = new Scanner(System.in);
	
	private String name;
	private String value;
	private int code;
	
	public StudentDTO() {
		
	}
	
	public StudentDTO(int code) {
		this.code = code;	
	}
	
	public StudentDTO(String name) {
		this.name = name;
	}
	public StudentDTO(String name, String value, int code) {
		this.name = name;
		this.value = value;
		this.code = code;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	public void setValue(String value) {
		this.value = value;
	}
	public void setCode(int code) {
		this.code = code;
	}
	
	public String getName() {
		return name;
	}
	public String getvalue() {
		return value;
	}
	public int getCode() {
		return code;
	}
}

📜 StudentDAO() [ 생성자 , 드라이버 로딩 ]

더보기
public StudentDAO() {
		try {
			Class.forName("oracle.jdbc.OracleDriver");
		} catch(ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

📜 StudentDAO.getConnection [ DB와 연결 ]

더보기
	private void getConnection() {
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String user = "c##jsp";
		String password = "oracle";
		
		try {
			con = DriverManager.getConnection(url, user, password);
		} catch(SQLException e) {
			e.printStackTrace();
		}
	}

📜 StudentDAO . Insert Method

더보기
public boolean insert(StudentDTO dto) {
		boolean check = false;
		
		String sql = "insert into student values(?,?,?)";
		
		
		try {
			this.getConnection();
			ps = con.prepareStatement(sql);
			ps.setString(1, dto.getName());
			ps.setString(2, dto.getvalue());
			ps.setInt(3, dto.getCode());
			if(ps.executeUpdate() != 0 ) {
				check = true;
			}
		} catch (SQLException e ) {
			e.printStackTrace();
		} finally {
			try {
				if(ps!=null) ps.close();
				if(con !=null) con.close();
			} catch(SQLException e) {
				e.printStackTrace();
			}
		}
		return check;
	}

📜 StudentDAO  . select Method

더보기
public List<StudentDTO> select(StudentDTO dto){
		List<StudentDTO> list = new ArrayList<StudentDTO>();
		
		String sql = null;
		
		if(dto == null) {
			sql = "select * from student";
		} else if(dto.getName() != null) {
			sql = "select * from student where name like ?";
		} else {
			sql = "select * from student where code = ?";
		}
		
		try {
			this.getConnection();
			ps = con.prepareStatement(sql);
			if(dto != null) {
				if(dto.getName() != null) {
					ps.setString(1,"%"+ dto.getName() + "%");
				} else {
					ps.setInt(1, dto.getCode());
				}
			}
			rs = ps.executeQuery();
			while(rs.next()) {
				String name = rs.getString("name");
				String value = rs.getString("value");
				int code = rs.getInt("code");
				
				StudentDTO dt = new StudentDTO(name, value, code);
				list.add(dt);
			}	
		}catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				if(rs != null) rs.close();
				if(ps != null) ps.close();
				if(con != null) con.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}
		if(list.isEmpty()) {
			list = null;
		}
		return list;
	}

📜 StudentDAO . Delete Method

더보기
public boolean delete(StudentDTO dto) {
		boolean check = false;
		
		String sql = "delete from Student where name=?";
		
		try {
			this.getConnection();
			ps = con.prepareStatement(sql);
			ps.setString(1, dto.getName());
			if(ps.executeUpdate() != 0 ) {
				check = true;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if(ps!=null) ps.close();
				if(con !=null) con.close();
			} catch(SQLException e) {
				e.printStackTrace();
			}
		}
		return check;
	}

📜 StudentDAO . Update Method

더보기
	public int update(StudentDTO dto) {
		String sql = "update Student set code=? , value=? where name = ?";
		
		int su = 0;
		
		try {
			this.getConnection();
			ps = con.prepareStatement(sql);
			ps.setInt(1, dto.getCode());
			ps.setString(2, dto.getvalue());
			ps.setString(3, dto.getName());
			su = ps.executeUpdate();
			
		} catch (SQLException e ) {
			e.printStackTrace();
		}finally {
			try {
				if(ps!=null) ps.close();
				if(con !=null) con.close();
			} catch(SQLException e) {
				e.printStackTrace();
			}
		}
		return su;
	}

 

 

필수적인 Method들은 이렇게 있습니다.

 

여담.💦

더보기

이 코드들을 작성하면서 기능의 구현만이 아닌 여러가지를 고민해 볼 필요가 있다고 생각했습니다.

Class를 세분화하고, Method들도 세분화하기에 그 Method들을 이용하면서 접근지정자들은 어떻게 설정할 지, 반환값의 유무, 객체를 생성할 때 굳이 모든 데이터를 집어넣을 필요가 있을지, 예외처리 등 여러 요소들을 생각하면서 작성함으로써 정말 다양하게 생각할 수 있었고, 수많은 방법들 중 가장 효율적이라고 생각되는 그런 코드들을 작성하게 되더라구요. 코딩을 함에 있어서 좋은 경험이었던 것 같아요.