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) 실행결과
① 회원가입 테스트
② 로그인 성공 테스트
③ 로그인 실패 테스트
④ 아이디 중복 있을때 테스트
⑤ 아이디 중복 없을때 테스트
'웹_프론트_백엔드 > 단과' 카테고리의 다른 글
[단과_JAVA_심화반] 2020.10.06 (0) | 2020.10.07 |
---|---|
[단과_JAVA_심화반] 2020.09.29 (0) | 2020.10.01 |
[단과_JAVA_심화반] 2020.09.24 (0) | 2020.09.26 |
[단과_JAVA_심화반] 2020.09.22 (0) | 2020.09.25 |
[단과_JAVA_심화반] 2020.09.18 (0) | 2020.09.21 |