![](https://blog.kakaocdn.net/dn/cbvcV7/btr5zPTSFFL/wJr5EWiO9yquPAK06VIXO0/img.png)
자바 추상클래스의 경우, 바로 객체로 만들 수 없어서 클래스가 필요했다.
이처럼 DB도, 오라클이 구현한 JDBC API를 이용할 것이다.
자바를 db server(Oracle)에서 사용하기 위한 드라이버가 jdbc(오라클의 경우 - ojdbc)인 것이다.
Ojdbc 8 다운로드
![](https://blog.kakaocdn.net/dn/8xGO0/btr5zRqDJ70/rp0AjqDHk8PHscBcYgCMJ0/img.png)
![](https://blog.kakaocdn.net/dn/dYieW2/btr5qflLGLW/oFYDxKynqW0FwjKxlmQyk1/img.png)
ojdbc8.jar 다운로드. (jar = java archive)
혹은 오라클을 깔았다면 파일이 이미 깔려있다. (찾으면 됨)
경로는
C:\app\컴퓨터유저이름\product\18.0.0\dbhomeXE\jdbc\lib 안에 존재한다!!
여기서 ojdbc8을 복사해서 이클립스에 넣자.
그 후, 프로젝트에서 오른쪽버튼 - Properties - Java Build Path 클릭.
![](https://blog.kakaocdn.net/dn/DKUSE/btr5AZhB074/E0laHz2jdDtppoUNB1Hc3k/img.png)
오른쪽의 Add JARs...를 누르고 ojdbc8을 추가하고 Apply하자.
![](https://blog.kakaocdn.net/dn/mr2AK/btr5BUmxuE2/T6dAwwJInipuxjCkNV2M10/img.png)
Referenced Libraries가 생겼고, 눌러보면 ojdbc8.jar가 존재한다.
간단히 정리한 jdbc 코딩의 절차는 다음과 같다.
DQL
1. jdbc driver class 등록
2. Connection객체 생성
3. PreparedStatment객체 생성
4. 실행 & ResultSet 리턴받기
5. ResultSet 처리
6. 자원반납 : 생성의 역순으로 반환
DML
1. jdbc driver class 등록
2. Connection객체 생성 & autoCommit false로 설정
3. PreparedStatment객체 생성
4. 실행 & 정수형(처리된 행수) 리턴값
5. 트랜잭션
6. 자원반납 : 생성의 역순으로 반환
Student 접속에서의 member
-- member테이블 생성
create table member(
id varchar2(20),
name varchar2(100) not null,
gender char(1),
birthday date,
email varchar2(500) not null,
point number default 1000,
reg_date TIMESTAMP default SYSTIMESTAMP,
constraint pk_member_id primary key(id),
constraint uq_member_email unique(email),
constraint ck_member_gender check(gender in ('M','F'))
);
자료 생성
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
insert into
member
values(
'honggd','홍길동','M','1999-09-09','honggd@naver.com', default, default);
insert into
member
values(
'sinsa','신사임당','F','1995-05-05','sinsa@naver.com', default, default);
insert into
member
values(
'gogd','고길동','M','1980-02-15','gogd@naver.com', default, default);
insert into
member
values(
'leess','이순신',null,null,'leess@naver.com', default, default);
insert into
member
values(
'jangbg','장보고','F',null,'jangbg@naver.com', default, default);
![](https://blog.kakaocdn.net/dn/bmkZuR/btr5AzpVjWR/r5Zhm4gApkm0YXVWI2Mn80/img.png)
select*from member;로 다음과 같이 정보가 저장된 것을 확인할 수 있다.
이를 commit하고 저장한다.
이런식으로 일단 jdbc를 실행하고, 실제로 오라클에서 db가 변경되는 것 까지 확인할 수 있었다.
실제 jdbc는 다음과 같은 과정을 거쳐서 진행된다.
![](https://blog.kakaocdn.net/dn/bc9HlH/btr5BVyY4Sd/g0T9nyL3hDE56ZsyTMwwi1/img.png)
run에서 view로 전달, view에서 controller로 전달, dao로 전달, dao에서 db로 전달해서 요청.
응답은 반대로 db에서 dao로, dao에서 controller로, controller에서 view로 , view에서 run으로 전달하여 응답한다.
위와 같은 코드를 만들기 위해서 아래와 같이 java 패키징을 실행한다.
run 클래스
|
view클래스
|
vo 클래스
|
Controller 클래스
|
Dao클래스
|
|
|
|
|
|
![](https://blog.kakaocdn.net/dn/z3vpa/btr5vuCsMzl/A8NeJ3x5aFswKzR9rkZbsk/img.png)
member.view.MemberRun.java
package member.run;
import member.view.MemberMenu;
public class MemberRun {
public static void main(String[] args) {
new MemberMenu().mainMenu();
System.out.println("===== 이용해주셔서 감사합니다. =====");
}
}
member.view.MemberMenu.java
package member.view;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Scanner;
import member.controller.MemberController;
import member.model.vo.Member;
/**
* view클래스
* -사용자에게 메뉴 노출
* -사용자 입력값처리
* -메뉴선택시 controller의 메소드 호출(요청)
*/
public class MemberMenu {
Scanner sc=new Scanner(System.in);
MemberController memberController = new MemberController();
public void mainMenu() {
String menu = "\n***** 회원 정보 관리 *****\n"
+ "1. 전체조회\n"
+ "2. 아이디조회\n"
+ "3. 이름검색\n"
+ "4. 회원가입\n"
+ "5. 회원정보변경\n"
+"6. 회원탈퇴\n"
+"0. 프로그램종료\n"+
"************************\n"
+"선택 : ";
while(true) {
System.out.println(menu);
String choice = sc.next();
Member member=null;
int result=0;
switch(choice) {
case "1": break;
case "2": break;
case "3": break;
case "4":
member=inputMember();
System.out.println("member@mainMenu = "+member);
result = memberController.insertMember(member);
System.out.println(result >0?"> 회원가입 성공!":"> 회원가입 실패!");
break;
case "5": break;
//이름, 성별, 생일, 이메일을 한번에 변경할 것.
case "6": break;
case "0": return;
default : System.out.println("잘못 입력하셨습니다.");
}
}
}
/*
* 사용자 입력값을 받아 member객체를 반환
*
* */
private Member inputMember() {
System.out.println("> 회원정보를 입력하세요");
System.out.print("아이디 : ");
String id= sc.next();
System.out.print("이름 : ");
String name=sc.next();
System.out.print("성별(M/F) : ");
String gender = String.valueOf(sc.next().toUpperCase().charAt(0));
System.out.print("생일(ex . 19990909) : ");
String temp = sc.next();
Date birthday=null;
//문자열 -> java.util.Date로 바꿨다가 java.sql.Date로 변환
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
try {
birthday = new Date(sdf.parse(temp).getTime());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.print("이메일 : ");
String email = sc.next();
return new Member(id,name,gender,birthday,email,0,null);
}
}
member.model.vo.Member.java
package member.model.vo;
import java.sql.Date;
import java.sql.Timestamp;
/**
* VO
* -Value Object
* -Database 테이블과 대응한다.
* -field는 테이블의 컬럼과 대응한다.
* -VO객체하나가 테이블의 레코드와 대응한다.
* -
*
*/
public class Member {
private String id;
private String name;
private String gender;
private Date birthday;
private String email;
private int point;
private Timestamp regDate;
/*
이름 널? 유형
-------- -------- -------------
ID NOT NULL VARCHAR2(20)
NAME NOT NULL VARCHAR2(100)
GENDER CHAR(1)
BIRTHDAY DATE
EMAIL NOT NULL VARCHAR2(500)
POINT NUMBER
REG_DATE TIMESTAMP(6)
*/
public Member() {}
public Member(String id, String name, String gender, Date birthday, String email, int point, Timestamp regDate) {
super();
this.id = id;
this.name = name;
this.gender = gender;
this.birthday = birthday;
this.email = email;
this.point = point;
this.regDate = regDate;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getPoint() {
return point;
}
public void setPoint(int point) {
this.point = point;
}
public Timestamp getRegDate() {
return regDate;
}
public void setRegDate(Timestamp regDate) {
this.regDate = regDate;
}
@Override
public String toString() {
return "Member [id=" + id + ", name=" + name + ", gender=" + gender + ", birthday=" + birthday + ", email="
+ email + ", point=" + point + ", regDate=" + regDate + "]";
};
}
member.model.dao.MemberDao.java
package member.model.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import member.model.vo.Member;
/**
* Dao
* Database Access Object
* 전달받은 데이터를 바탕으로 database에 질의(DQL/DML)하는 객체
*/
public class MemberDao {
final String driverClass="oracle.jdbc.OracleDriver";
final String url = "jdbc:oracle:thin:@localhost:1521:xe"; //db접속프로토콜@ip:포트:db명(sid)
final String user = "student";
final String password = "student";
public int insertMember(Member member) {
Connection conn=null;
PreparedStatement pstmt=null;
int result=0; //처리 행 수
String sql = "insert into member values(?, ?, ?, ?, ?, default, default)";
try {
//1. jdbc driver class 등록
Class.forName(driverClass);
//2. Connection 객체 생성 & autoCommit false로 설정
conn=DriverManager.getConnection(url,user,password);
conn.setAutoCommit(false);
//3. PreparedStatement객체 생성 & 미완성 쿼리 값대입
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, member.getId());
pstmt.setString(2, member.getName());
pstmt.setString(3, member.getGender());
pstmt.setDate(4, member.getBirthday());
pstmt.setString(5, member.getEmail());
//4. executeUpdate 실행 & 정수형(처리된 행수)리턴값
result=pstmt.executeUpdate();
//5. 트랜잭션
conn.commit();
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}finally {
//6. 자원반납 : 생성의 역순으로 반환
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
}
member.controller.MemberController.java
package member.controller;
import member.model.dao.MemberDao;
import member.model.vo.Member;
/**
* Controller 클래스
* - MVC패턴의 가장 중추역할
* - view로부터 요청을 받아 dao로 다시 요청을 전달하는 구조.
* - (돌아올때)dao의 처리 결과값을 받아 view로 리턴처리. (응답)
*/
public class MemberController {
private MemberDao memberDao = new MemberDao();
public int insertMember(Member member) {
int result = memberDao.insertMember(member);
return result;
}
}
다음과 같이 구성하고 실행한다.
아직 회원 가입만 만들었으므로, 유관순을 추가해보자.
![](https://blog.kakaocdn.net/dn/cSeCLE/btr5vuCsMzx/VHxQ5xjQIOSXCjBgg2CYy0/img.png)
java에서는 추가되었다고 뜬다. 그럼 실제로 db에도 변경이 되었을까?
![](https://blog.kakaocdn.net/dn/bI64FS/btr5C5H5bsL/19BCxzKLjJefOco5LBvmj1/img.png)
변경되었다. 1번 행에 유관순이 추가된 것을 확인할 수 있다!!
이와 같이 다음시간에는 더 다양한 기능 (삭제, 변경, 조회 등 ) 을 배워볼 예정이다.