웹_프론트_백엔드/단과

[단과_JAVA_심화반] 2020.10.08

shine94 2020. 10. 12. 18:18

1. 박스오피스(저번 수업 시간에 미완성한 수정, 삭제, 검색, 목록 완성)

1) 소스코드

** com.lec.java.dao > BoxOfficeDAO.java

package com.lec.java.dao;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

import com.lec.java.vo.BoxOfficeVO;

// Controller
public class BoxOfficeDAO {
	// 추가, 이 메소드를 뷰단에서 사용할 것임!
	/**
	 * 랭킹을 전달하면 해당 랭킹에 삽입<br>
	 * 랭킹을 전달하지 않으면 마지막 줄에 추가
	 * @return boolean
	 */
	public boolean insertOrAppend(BoxOfficeVO vo) throws IOException {
		if(vo.getRating() == 0) {
			// 외부에서 전달받은 순위가 없다면 마지막 줄에 추가
			if(append(vo)) {
				// 추가 성공시
				return true;
			}
			// 추가 실패시
			return false;
			
		} else {
			// 외부에서 전달받은 순위가 있다면 해당 랭킹에 삽입
			BufferedReader br = DBConnector.getReader();
			String line = null;
			int last_rating = 0;
			
			while(true) {
				line = br.readLine();
				if(line == null) {break;}
				last_rating = Integer.parseInt(line.split("\t")[0]);
			}
			// 사용자가 삽입할 랭킹이 마지막 순위보다 크면 삽입 실패
			if(vo.getRating() > last_rating) {return false;}
			
			// 사용자가 삽입할 랭킹이 마지막 순위보다 작으면 삽입 시도
			if(insert(vo)) {
				// 삽입 성공
				return true;
			}
			// 삽입 실패
			return false;
		}
	} // end insertOrAppend()
	
	// append()와 insert()를 사용자가 직접 사용하면 안되기 때문에 private로 보호해줬다!
	// 추가(마지막 줄에)
	private boolean append(BoxOfficeVO vo) throws IOException {
		// 외부에서 전달한 값이 없다면 false를 리턴
		if(vo == null) {return false;}
		
		BufferedReader br = DBConnector.getReader();
		String line = null;
		// 마지막 랭킹을 담을 변수
		int last_ranking = 0;
		
		while(true) {
			line = br.readLine();
			if(line == null) {break;}
			
			// "문자열".split("구분점");
			// 동일한 구분점을 기준으로 각각의 문자열 값을 분리한다.
			// 구분점이 있다는 뜻은 최소 2개 이상의 값이 나온다는 것이므로, 리턴 타입은 배열이다.
			last_ranking = Integer.parseInt(line.split("\t")[0]);
		}
		br.close();
		
		// 해당 경로의 파일 모든 내용을 전부 가져온다(줄바꿈 포함)
		String contents = new String(Files.readAllBytes(Paths.get("src/box_office.txt")));
		
		// 파일의 가장 마지막 문자열 값
		String last_str = contents.substring(contents.length() - 1);
		
		BufferedWriter bw = DBConnector.getAppender();
		
		// 가장 마지막 문자열이 /n이 아니면 줄바꿈 후 데이터 추가
		if(!last_str.equals("\n")) {
			bw.newLine();
		}
		
		// 가장 마지막 문자열의 \n이라면 줄바꿈 없이 데이터 추가
		bw.write((last_ranking + 1) + "\t");		
		bw.write(vo.getFilm_name() + "\t");		
		bw.write(vo.getRelease_date() + "\t");		
		bw.write(vo.getGeust_cnt() + "\t");		
		bw.write(vo.getIncome() + "\t");
		bw.write(vo.getScreen_cnt() + "");
		
		// write는 무조건 문자열이어야 정상적으로 추가된다
		// 만약 문자열이 아니라면 깨진다.

		bw.close();
		return true;
	} // end append()
	
	// 삽입(중간에)
	private boolean insert(BoxOfficeVO vo) throws IOException {
		if(vo == null) {return false;}
		
		BufferedReader br = DBConnector.getReader();
		String contents = "";
		String line = null;
		boolean check = false;
		int inserted_rating = vo.getRating();
		
		while(true) {
			line = br.readLine();
			if(line == null) {break;}
			
			// 사용자가 삽입할 랭킹이 현재 행의 랭킹과 같다면
			if(Integer.parseInt(line.split("\t")[0]) == vo.getRating()) {
				// 기존의 데이터 전, 전달받은 데이터를 삽입
				contents += vo.getRating() + "\t"
							+ vo.getFilm_name() + "\t"
							+ vo.getRelease_date() + "\t"
							+ vo.getGeust_cnt() + "\t"
							+ vo.getIncome() + "\t"
							+ vo.getScreen_cnt() + "\n";
				
				// 삽입을 했는지 안했는지 판단하는 flag
				// 삽입 성공시 true로 변경
				check = true;
			}
			
			// 삽입 성공시
			if(check) {
				// 기존 랭킹에 있던 영화 순위부터 마지막 영화 순위까지 모두 +1 처리
				// line.substring(line.indexOf("\t")) : 순위를 제외한 정보
				contents += ++inserted_rating + line.substring(line.indexOf("\t")) + "\n";
				continue;
			}
			// 삽입 전 혹은 삽입 실패시 기존 데이터를 글대로 누적
			contents += line + "\n";
		}
		br.close();
		
		// 변경된 내용으로 덮어쓰기
		BufferedWriter bw = DBConnector.getWriter();
		bw.write(contents);
		bw.close();
		return true;
		
	} // end insert()
	
	// 수정(영화 제목만 수정 가능)
	public boolean update(String film_name_org, String film_name_new) throws IOException {
		BufferedReader br = DBConnector.getReader();
		String line = "";
		String result = "";
		int ranking = 0;
		boolean update_check = false;
		
		while(true) {
			++ranking;
			line = br.readLine();
			if(line == null) {break;}
			
			if(line.split("\t")[1].equals(film_name_org)) {
				// 순위가 잘린 문자열
				String temp = line.substring(line.indexOf("\t") + 1);
				
				// 영화제목이 잘린 문자열
				result += ranking + "\t" + film_name_new + temp.substring(temp.indexOf("\t")) + "\n";
				update_check = true;
				continue;
			}
			result += line + "\n";
		}
		br.close();
		
		if(!update_check) {return false;}
		
		BufferedWriter bw = DBConnector.getWriter();
		bw.write(result);
		bw.close();
		return true;
	} // end update()
	
	// 삭제
	public boolean delete(String film_name) throws IOException {
		BufferedReader br = DBConnector.getReader();
		String line = "";
		String result = "";
		int ranking = 0;
		boolean delete_check = false;
		
		while(true) {
			++ranking;
			line = br.readLine();
			if(line == null) {break;}
			
			if(line.split("\t")[1].equals(film_name)) {
				ranking--;
				delete_check = true;
				continue;
			}
			result += ranking + line.substring(line.indexOf("\t")) + "\n";
		}
		br.close();
		
		if(!delete_check) {return false;}
		
		BufferedWriter bw = DBConnector.getWriter();
		bw.write(result);
		bw.close();
		return true;
	} // end delete()
	
	// 검색(contains())
	public String select(String keyword) throws IOException {
		BufferedReader br = DBConnector.getReader();
		String line = null;
		String result = "";
		boolean select_check = false;
		
		while(true) {
			line = br.readLine();
			if(line == null) {break;}
			
			if(line.split("\t")[1].contains(keyword)) {
				result += line + "\n";
				select_check = true;
			}
		}
		br.close();
		
		if(!select_check) {
			result = "검색 결과가 없습니다.";
		}
		return result;
	} // end select()
	
	// 목록
	public String selectAll() throws IOException {
		return new String(Files.readAllBytes(Paths.get("src/box_office.txt")));
	} // end selectAll()
}

 

** com.lec.java.box_office > Test.java

package com.lec.java.box_office;

import java.io.IOException;

import com.lec.java.dao.BoxOfficeDAO;
import com.lec.java.vo.BoxOfficeVO;

// View
public class Test {
	public static void main(String[] args) throws IOException {
		BoxOfficeDAO dao = new BoxOfficeDAO();
		
		// 수정 테스트
		//if(dao.update("극한직업", "극한강사" )) {
		//if(dao.update("샤인3", "샤인3수정성공" )) {
//		if(dao.update("없다!!", "수정실패나온다!" )) {
//			System.out.println("수정 성공");
//		} else {
//			System.out.println("수정 실패");
//		}
		
		// 삭제 테스트
//		if(dao.delete("극한강사" )) {
//			System.out.println("삭제성공");
//		} else {
//			System.out.println("삭제실패");
//		}
		
		// 검색 테스트
		//System.out.println(dao.select("1"));
		//System.out.println(dao.select("하트"));
		
		// 목록 테스트
		System.out.println(dao.selectAll());
	} // end main()
} // end class

 

2) 실행결과

① 극한직업이 극한강사로 수정되는지 테스트

② 샤인3이 샤인3수정성공으로 수정되는지 테스트 

③ 수정 실패 테스트

④ 극한강사 삭제 테스트

⑤ 검색 결과가 있을때 테스트

⑥ 검색 결과가 없을때 테스트

⑦ 목록보기 테스트

 

 

2. DB(데이터 저장소)

 : 사용자들의 데이터를 표 형태로 저장하여 관리해주고,

   데이터 유실을 방지하기 위해 다양한 기술과 보안이 반영되어 있다.

 


3. DBMS의 종류
   - Oracle(오늘 수업시간에 배울 DBMS!!)
   - MySQL
   - MariaDB
   - MS_SQL
   - MongoDB

 


4. Oracle 설치(OracleXE11g)

 : 기존 국비과정에서 DB 배우면서 이미 설치된 상태

   [참고] shine94.tistory.com/86?category=853416

 


5. DBMS(DataBase Management System)

--------------------------
  고객 관리 프로그램
--------------------------
           ↑   ↓
--------------------------
         DBMS TOOL
--------------------------
           ↑   ↓
--------------------------
            DBMS
--------------------------

 


6. 계정

   최상위 계정 : sys
   관리자 계정 : system
   일반 계정 : scott, hr, ...

 


7. 오라클 실행(cmd 창에서...!)
   sqlplus sys as sysdba
   Enter password : 설치시 비밀번호 입력 후 엔터(비밀번호는 눈에 안보이지만 입력됨)
   conn system/1234
   [만약 위에 접속 오류시] alter user system identified by 1234;
   alter user hr account unlock;
   alter user hr identified by hr;
   conn hr/hr

 


8. DBMS 툴(DBeaver)

 : 기존 국비과정에서 DB 배우면서 해당 툴 설치 방법도 배움

   [참고] shine94.tistory.com/86?category=853416

 

 

9. JDBC(Java DataBase Connectivity)

 


10. 오라클 드라이버 경로

 : C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib



11. SQL문(쿼리문)
   .sql파일(스크립트 파일)에서만 사용 가능

 

 

12. DB Connection

 : DBeaver 관점, DB 작업이 필요한 프로젝트 클릭 > Create 클릭 > Connection 클릭

> Host는 localhost, Database는 XE, Username와 Password는 아까 unlock 푼 hr 기입

> Add File 클릭

> 오라클 드라이브 경로가 있는 곳으로 이동, 3개의 드라이버 확인 가능, 그 중 ojdbc6.jar 선택 후 열기 클릭

> 추가된 파일 선택 후 OK 클릭

> Test Connection ... 클릭

> 뭔가 다운로드되고 더 다운로드 받으라고 창이 뜸, Download 클릭

> Connection Test가 Connected가 뜨면 연결 성공된 것임, OK 클릭

> Finish 클릭

> 정상적으로 DB와 Connection이 됬다면 Connections에 XE가 확인됨,

   XE를 열어보면 Schermas(계정을 모아놓은 곳)가 보여짐

   우리가 접근할 hr 계정 클릭, tables 클릭해보면 기본으로 제공하는 교육용 테이블들을 확인할 수 있다.

 

 

13. 스크립트 파일 만들기

 : Scripts 우클릭 Create 클릭 > Create New File 클릭, script.sql 파일 생성

> 단축키 F2키 이용, script.sql을 member.sql로 이름 변경

> 테이블 생성

> 생성된 테이블 확인

 

 

14. java에서도 DB 드라이버가 필요, Build Path에서 드라이버 설정하기

 : 드라이버 설정할 프로젝트 선택 후 우클릭 > Build Path 클릭 > Configure Build Path.. 클릭

> Libraries 선택 > 아까 선택한 오라클 드라이버 선택 후 열기 > ojdbc6.jar 확인 후 Apply and Close 클릭

> DB 드라이브의 Build Path가 정상적으로 설정되었다면 Referenced Libraries에서 확인할 수 있다.

 

 

15. JDBC 예제

1) 소스 코드

** com.lec.java.jdbc.vo > MemberVO.java

package com.lec.java.jdbc.vo;

public class MemberVO {
	private String member_id;
	private String member_pw;
	
	public MemberVO() {;}
	
	public String getMember_id() {
		return member_id;
	}
	public void setMember_id(String member_id) {
		this.member_id = member_id;
	}
	public String getMember_pw() {
		return member_pw;
	}
	public void setMember_pw(String member_pw) {
		this.member_pw = member_pw;
	}
}


** com.lec.java.jdbc.dao > DBConnector.java

package com.lec.java.jdbc.dao;

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

public class DBConnector {
	public static Connection getConnection() {
		Connection conn = null;
		
		try {
			String url = "jdbc:oracle:thin:@localhost:1521:XE";
			String user = "hr";
			String pw = "hr";
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, user, pw);
		} catch (ClassNotFoundException e) {
			System.out.println("DBConnection 오류 : " + e);
		} catch (SQLException sqle) {
			System.out.println("DB 연결 오류 : " + sqle);
		} catch (Exception e) {
			System.out.println("오류 : " + e);
		}
		return conn;
	}
}


** com.lec.java.jdbc.dao > MemberDAO.java

package com.lec.java.jdbc.dao;

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

import com.lec.java.jdbc.vo.MemberVO;

public class MemberDAO {
	Connection conn;		// 연결해준다.
	PreparedStatement pstm;	// 쿼리문 날린다.
	ResultSet rs;			// 결과 담는다.
	
	// 아이디 중복검사
	public boolean checkId(String id) {
		String query = "SELECT COUNT(*) FROM TBL_MEMBER WHERE MEMBER_ID = ?";
		boolean check = false;
		
		try {
			conn = DBConnector.getConnection();
			pstm = conn.prepareStatement(query);
			pstm.setString(1, id);
			rs = pstm.executeQuery();
			
			// 행
			rs.next();
			
			// 열
			if(rs.getInt(1) == 1) {
				check = true;
			}
		} catch (SQLException e) {
			System.out.println("아이디 중복검사 오류(checkId(String id))" + e);
		} finally {
			try {
				if(rs != null) {rs.close();}
				if(pstm != null) {pstm.close();}
				if(conn != null) {conn.close();}
			} catch (SQLException e) {
				// 외부저장소를 닫을때, 오류가 발생하면 무조건 강제종료 시켜야함!
				// 그렇기 때문에 RuntimeException 발생시켜줘야함!
				throw new RuntimeException(e.getMessage());
			}
		}
		return check;
	} // end checkId()
	
	// 로그인
	public boolean login(String id, String pw) {
		String query = "SELECT COUNT(*) FROM TBL_MEMBER WHERE "
				+ "MEMBER_ID = ? AND MEMBER_PW = ?";
		boolean check = false;
		
		try {
			conn = DBConnector.getConnection();
			pstm = conn.prepareStatement(query);
			pstm.setString(1, id);
			pstm.setString(2, pw);
			rs = pstm.executeQuery();
			rs.next();
			
			if(rs.getInt(1) == 1) {
				check = true;
			}
		} catch (SQLException e) {
			System.out.println("로그인 실패(아이디 및 패스워드를 확인해주세요!)" + e);
		} finally {
			try {
				if(rs != null) {rs.close();}
				if(pstm != null) {pstm.close();}
				if(conn != null) {conn.close();}
			} catch (SQLException e) {
				// 외부저장소를 닫을때, 오류가 발생하면 무조건 강제종료 시켜야함!
				// 그렇기 때문에 RuntimeException 발생시켜줘야함!
				throw new RuntimeException(e.getMessage());
			}
		}
		return check;
	} // end login()
	
	// 회원가입
	public boolean join(MemberVO member) {
		String query = "INSERT INTO TBL_MEMBER (MEMBER_ID, MEMBER_PW) VALUES(?, ?)";
		boolean check = false;
		
		try {
			conn = DBConnector.getConnection();
			pstm = conn.prepareStatement(query);

			pstm.setString(1, member.getMember_id());
			pstm.setString(2, member.getMember_pw());
			
			if(pstm.executeUpdate() == 1) {
				check = true;
			}
			/*
			 * 여기에 왜 ResultSet을 쓰지 않은 이유??
			 * 결과값이 없기 때문에!!
			 * */
		} catch (SQLException e) {
			System.out.println("회원가입 실패 : " + e.getMessage());
		} finally {
			try {
				if(rs != null) {rs.close();}
				if(pstm != null) {pstm.close();}
				if(conn != null ) {conn.close();}
			} catch (SQLException e) {
				// 외부저장소를 닫을때, 오류가 발생하면 무조건 강제종료 시켜야함!
				// 그렇기 때문에 RuntimeException 발생시켜줘야함!
				throw new RuntimeException(e.getMessage());
			}
		}
		return check;
	} // end join()
}


** com.lec.java.jdbc.index > Member.java

package com.lec.java.jdbc.index;

import com.lec.java.jdbc.vo.MemberVO;
import com.lec.java.jdbc.dao.MemberDAO;

public class Member {
	public static void main(String[] args) {
		MemberDAO dao = new MemberDAO();
		MemberVO vo = new MemberVO();
		
		// 회원가입 예제
		//vo.setMember_id("shine94");
		//vo.setMember_pw("1234");
		
		//if(dao.join(vo)) {
		//	System.out.println("회원가입 성공");
		//} else {
		//	System.out.println("회원가입 실패");
		//}
		
		// 로그인 예제
		// 1. 아이디와 비밀번호가 일치할때
		//if(dao.login("shine94", "1234")) {
		//	System.out.println("로그인 성공");
		//} else {
		//	System.out.println("로그인 실패");
		//}
		// 2. 아이디와 비밀번호가 일치하지 않을때
		//if(dao.login("shine", "12")) {
		//	System.out.println("로그인 성공");
		//} else {
		//	System.out.println("로그인 실패");
		//}
		
		// 아이디 중복검사
		// 1. 일치한 아이디가 있을때
		//if(dao.checkId("shine94")) {
		//	System.out.println("일치한 아이디가 있습니다.");
		//} else {
		//	System.out.println("일치한 아이디가 없습니다.");
		//}
		// 2. 일치한 아이디가 없을때
		if(dao.checkId("shine")) {
			System.out.println("일치한 아이디가 있습니다.");
		} else {
			System.out.println("일치한 아이디가 없습니다.");
		}
	} // end main()
} // end class

 

2) 실행결과

① 회원가입 테스트

② 로그인 성공 테스트

③ 로그인 실패 테스트

④ 아이디 중복 있을때 테스트

⑤ 아이디 중복 없을때 테스트