오늘은 어제 만들던 프로그램을 마저 만들어본다.
근데 어제 설명을 너무 부족하게 한 것 같아서 나도 이해할 겸 더 자세하게 다뤄봐야겠다.
어제 만들려고 했던 프로그램을 이어서 맏드는 것 뿐만 아니라 그냥 처음부터 다시 정리해보자.
근데 모든 코드를 다 설명하는건 아니고 그냥 중요한 코드들만 설명할 것 이다.
그래도 각 부분의 처음에 전체 코드를 올린다.
만들려는 프로그램은 회원 관리 프로그램으로
전체 회원 조회 / 아이디로 회원 조회 / 이름으로 회원 조회 / 회원 정보 등록 / 회원 정보 수정 / 회원 정보 삭제 / 프로그램 종료 의 기능을 가지고 있다. 하나하나 살펴보자.
혹시 이해가 안된다면 저번 포스팅도 보면 좋을 것 같다. 이 프로그램의 클래스나 패키지에 대해서도 써놓기는 했다. 이 글에서는 생략한다.
가장 먼저 이 프로그램 메뉴부터 만들어보자.
public void main() {
while(true) {
System.out.println("----- 회원 관리 프로그램v2 -----");
System.out.println("1. 전체 회원 조회");
System.out.println("2. 아이디로 회원 조회");
System.out.println("3. 이름으로 회원 조회");
System.out.println("4. 회원 정보 등록");
System.out.println("5. 회원 정보 수정");
System.out.println("6. 회원 정보 삭제");
System.out.println("0. 프로그램 종료");
System.out.print("선택 > ");
int sel = sc.nextInt();
switch(sel) {
case 1:
selectAllMember();
break;
case 2:
selectOneMember();
break;
case 3:
selectMemberName();
break;
case 4:
insertMember();
break;
case 5:
updateMember();
break;
case 6:
deleteMember();
break;
case 0:
System.out.println("프로그램을 종료합니다.");
return;
default:
System.out.println("잘못입력하셨습니다.");
break;
}
}
}//main end
메뉴 코드는 이렇다. 각 기능의 맞춰 코드를 짜줄 것 이다. 충분쓰다.
2가지 클래스를 사용할 것 이다. MemberController와 MemberDao다.
각각의 패키지는 java.controller / java.dao 이다.
// MemberController Class
public void selectAllMember() {
ArrayList<Member> list = new ArrayList<Member>();
list = dao.selectAllMember();
System.out.println("회원번호\t아이디\t비밀번호\t이름\t전화번호\t\t나이\t성별\t이메일\t\t\t주소\t\t\t날짜");
System.out.println("--------------------------------------------------");
for(Member m : list) {
System.out.println(m.getMemberNo()+"\t"+m.getMemberId()+"\t"+m.getMemberPw()
+"\t"+m.getMemberName()+"\t"+m.getPhone()+"\t"+m.getAge()
+"\t"+m.getGender()+"\t"+m.getEmail()+"\t\t"+m.getAddress()+"\t\t"+m.getEnrollDate());
}
}//selectAllMember end
// MemberDao Class
public ArrayList<Member> selectAllMember() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rset = null;
ArrayList<Member> list = new ArrayList<Member>();
String query = "select * from member";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe","jdbc","1234");
pstmt = conn.prepareStatement(query);
rset = pstmt.executeQuery();
while(rset.next()) {
Member m = new Member();
m.setAddress(rset.getString("address"));
m.setAge(rset.getInt("age"));
m.setEmail(rset.getString("email"));
m.setEnrollDate(rset.getDate("enroll_date"));
m.setGender(rset.getString("gender"));
m.setMemberId(rset.getString("member_id"));
m.setMemberName(rset.getString("member_name"));
m.setMemberNo(rset.getInt("member_no"));
m.setMemberPw(rset.getString("member_pw"));
m.setPhone(rset.getString("phone"));
list.add(m);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
rset.close();
conn.close();
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
이 첫번째 구성을 가장 자세히 볼 것이다.
<???이 기호안에 넣으면 왜 안보임>
Controller 클래스에서 하는일은 회원의 ArrayList를 Dao클래스에서 받아와서 출력하는 메소드다. ArrayList[Member]타입의 변수를 선언해서 Dao클래스의 selectAllMember 메소드에서 값을 받는 것 이다. 그래서 dao의 메소드가 ArrayList[Member]를 return하도록 만들어진 것 이다.
이제 중요한 Dao클래스를 보자.
이번 클래스는 하나하나 자세하게 볼 것 이다.
가장 먼저 할 일은 필요한 변수들을 선언하는 것 이다.
Connection conn = null; //DBMS와 연결을 담당하는 객체
PreparedStatement pstmt = null; //query를 전송하고 결과를 받아오는 객체
ResultSet rset = null; //select 수행결과를 가져오는 객체
ArrayList<Member> list = new ArrayList<Member>(); //전체 회원 정보를 저장하고 Controller클래스에 return해줄 자료구조
String query = "select * from member"; //SQL에서 실행할 실행문
메소드를 만들고 가장 처음부터 있는 이 친구들이 변수이다.
어제 포스팅했던 친구랑 다른 친구가있다.
Statement -> PreparedStatement 로 바뀌었다. 이유는 이게 더 빠르고 쓰기도 쉽기 때문이다. Statement에서 상속을 받는 친구인데 얘가 더 빠르고 query쓰기에도 편하고 좋다. 이거쓰자.
그리고 악용해서 정보를 빼내는 것도 막아준다.
Connection은 DBMS와 연결을 담당하는 객체다. 즉 Connection을 사용해서 OracleSql, MySql등과 연결해주는 것 이다.
PreparedStatement는 쿼리를 전송하고 결과를 받아오는 객체다. PreparedStatement를 통해 쿼리 정보가 왔다갔다 한다.
ResultSet은 Select의 수행 결과를 저장하는 객체이다.
ArrayList를 선언한 이유는 ResultSet으로 정보를 저장하고 그 정보를 List에다가 하나씩 넣어서 모든 Row를 저장하기 위해서다. 그리고 Controller 클래스로 보낸다.
String query는 이따가 PreparedStatement로 보낼 쿼리문을 미리 작성한 것 이다.
다음으로 가보자.
Class.forName("oracle.jdbc.driver.OracleDriver");
eclipse 프로젝트에 우클릭 -> properties -> javaBuildPath -> Libraries에서 미리 DBMS드라이버를 등록해놓아야 이 코드가 작동한다. 각자의 DBMS타입에 맞는 드라이버를 넣어주자.
코드로 넣어놓은 드라이버를 등록하는 코드이다.
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe","jdbc","1234");
OracleSql은 1521의 포트번호를 가지고있어서 1521을 넣어준다. 각자의 DBMS에 맞는 포드번호를 넣어주도록하자. 다른 DBMS들이 어떤 port를 사용하고있는지는 모르겠다...
어쨌든 위의 코드를 정리해보자면
conn = DriverManager.getConnection
("접속할 프로그램, ip","접속할 DBMS계정","접속할 DBMS 비밀번호");
의 구성으로 되어있다.
pstmt = conn.prepareStatement(query);
아까 conn이 연결을 담당해준다고 했다. 미리 짜놓았던 query문을 conn을 이용해서 DBMS로 보내고, conn에서 쿼리 객체를 받아오는prepareStatement기능을 이용해서 쿼리문의 결과를 받아오는 것 이다. 그리고 그 값을 아까 만들어줬던 PreaparedStatement 객체에 넣어준다.
이 과정에서 우리가 짜놓은 query문이 문제가없는지 검토한다. 그 이후 값을 처리한다.
rset = pstmt.executeQuery();
이 코드가 수행 결과를 저장한다.
while(rset.next()) {
Member m = new Member();
m.setAddress(rset.getString("address"));
m.setAge(rset.getInt("age"));
m.setEmail(rset.getString("email"));
m.setEnrollDate(rset.getDate("enroll_date"));
m.setGender(rset.getString("gender"));
m.setMemberId(rset.getString("member_id"));
m.setMemberName(rset.getString("member_name"));
m.setMemberNo(rset.getInt("member_no"));
m.setMemberPw(rset.getString("member_pw"));
m.setPhone(rset.getString("phone"));
list.add(m);
}
rset.next코드는 테이블의 모든 값을 가져오는 코드라고 보면 편하다. Row가 5개 있다고 생각하면 처음에 1번째 Row를 조회하고 값이 있다면 True를 반환한다. 총 5변 반환한다는 뜻이다.
어쨌든 rset.next코드를 사용해서 값이 들어있는 만큼 출력해주자.
모든 반복마다 ArrayList에 Member값을 넣어주는 것도 잊지말자.
finally {
try {
rset.close();
pstmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
사용했던 자원들을 잊지말고 반환해주자.
마지막으로 list를 return하는 것 으로 이 메소드는 종료된다.
이런 형식으로 진행되는 것 이다. 이제 하나하나 빠르게 특징만 잡아서 볼 것이다.
// MemberController Class
public void selectOneMember() {
System.out.print("조회할 회원 아이디 입력 : ");
String id = sc.next();
Member m = dao.selectOneMember(id);
if(m==null) {
System.out.println("정보를 조회할 수 없습니다.");
}else {
System.out.println("번호 : "+m.getMemberNo());
System.out.println("아이디 : "+m.getMemberId());
System.out.println("비밀번호 : "+m.getMemberPw());
System.out.println("이름 : "+m.getMemberName());
System.out.println("전화번호 : "+m.getMemberNo());
System.out.println("나이 : "+m.getAge());
System.out.println("성별 : "+m.getGender());
System.out.println("이메일 : "+m.getEmail());
System.out.println("주소 : "+m.getAddress());
System.out.println("가입일 : "+m.getEnrollDate());
}
}//selectOneMember end
//MemberDao Class
public Member selectOneMember(String id) {
//1. 필요한변수 선언
Connection conn = null;
//Statement를 대체할 PreparedStatement
//PreparedStatement는 Statement를 상속해서 구현한 클래스 -> Statement기능 + @
PreparedStatement pstmt = null;
ResultSet rset = null;
Member m = null;
//PreparedStatement는 쿼리문 작성 시 인자부분을 위치홀더(?)로 표시
//위치홀더는 값으로만 사용이 가능(컬럼이름, 테이블이름 으로는 사용이 불가능)
//위치홀더(?) : sql구문에 나타내는 토큰, 실제 sql문이 실행되기전에 반드시 값으로 대체해야함
String query = "select * from member where member_id =?";
try {
//2. 사용할 드라이버 선언
Class.forName("oracle.jdbc.driver.OracleDriver");
//3. Connection 생성
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe","jdbc","1234");
//4. 쿼리문을 수행하고 결과를 받아올 객체생성(Statement -> PreparedStatement)
//객체생성메소드가 preepareStatement() -> 매개변수로 query를 전달
//query를 전달하는 이유는 uqery가 정상인지 문법검사를 수행
pstmt = conn.prepareStatement(query);
//query가 정상이라면 위치홀더를 값으로 대체
pstmt.setString(1, id);//첫번째 위치홀더에 값을 id변수값으로 대체
//5. 쿼리문 수행후 결과 저장
rset = pstmt.executeQuery();
if(rset.next()) {
m = new Member();
m.setAddress(rset.getString("address"));
m.setAge(rset.getInt("age"));
m.setEmail(rset.getString("email"));
m.setEnrollDate(rset.getDate("enroll_date"));
m.setGender(rset.getString("gender"));
m.setMemberId(rset.getString("member_id"));
m.setMemberName(rset.getString("member_name"));
m.setMemberNo(rset.getInt("member_no"));
m.setMemberPw(rset.getString("member_pw"));
m.setPhone(rset.getString("phone"));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
rset.close();
pstmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return m;
}// selectOneMember end
헷갈릴까봐 주석도 넣어뒀다. 나 볼라구... 내가 헷갈릴거같다.
아까와 다른점이 있다면 ptstmSrting이라는 코드가 들어온것과 while이 if 로 바뀐 것 이다.
또 아까는 ArrayList 형을 받아왔는데 이번에는 Member 형태이다. 이외에는 같다고 볼 수 있다.
pstmtString은 설정해준 query문의 변수에 값을넣어주는 것 이다.
pstmt에서 변수는 ?으로 넣어준다.
String query = "select * from member where member_id =?";
아까 선언한 query 코드이다.
그리고
pstmt.setString(1, id);//첫번째 위치홀더에 값을 id변수값으로 대체
이게 값을 넣어주는 코드이다.
if를 사용한 이유는 Member_ID는 unique로 제약조건을 걸어놨기 때문에, 값은 1개 아니면 0개가 나오기 때문이다. 굳이 하나하나 다 조회하는 while을 쓸 이유가 없기 때문이라는 것 이다.
// MemberController Class
public void selectMemberName() {
System.out.print("이름으로 조회할 회원의 이름을 입력 : ");
String searchName = sc.next();
ArrayList<Member> list = dao.selectMemberName(searchName);
if(list.size()==0) { // list.isEmpty() : 리스트가 비어있는지 판단하는메소드 == (list.size()==0);
System.out.println("일치하는 정보가 없습니다.");
}else {
System.out.println("회원번호\t아이디\t비밀번호\t이름\t전화번호\t\t나이
\t성별\t이메일\t\t\t주소\t\t\t날짜");
for(Member m : list) {
System.out.println(m.getMemberNo()+"\t"+m.getMemberId()+"\t"+m.getMemberPw()
+"\t"+m.getMemberName()+"\t"+m.getPhone()+"\t"+m.getAge()
+"\t"+m.getGender()+"\t"+m.getEmail()+"\t\t"+m.getAddress()
+"\t\t"+m.getEnrollDate());
}
}
}//selectMemberName end
어후 진짜 너무길다. 옆으로
//MemberDao Class
public ArrayList<Member> selectMemberName(String searchName){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rset = null;
String addName = "%"+searchName+"%";
ArrayList<Member> list = new ArrayList<Member>();
String query = "select * from member where member_id like ?";
try {
Class.forName("oracle.jdbc.driver.OracleDriver"); //oracle.jdbc.driver.OracleDriver
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe","jdbc","1234");
pstmt = conn.prepareStatement(query);
pstmt.setString(1, addName);
rset = pstmt.executeQuery();
while(rset.next()) {
Member m = new Member();
m.setAddress(rset.getString("address"));
m.setAge(rset.getInt("age"));
m.setEmail(rset.getString("email"));
m.setEnrollDate(rset.getDate("enroll_date"));
m.setGender(rset.getString("gender"));
m.setMemberId(rset.getString("member_id"));
m.setMemberName(rset.getString("member_name"));
m.setMemberNo(rset.getInt("member_no"));
m.setMemberPw(rset.getString("member_pw"));
m.setPhone(rset.getString("phone"));
list.add(m);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
rset.close();
conn.close();
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}//selectMemberName end
이번에는 다 똑같은데 매개변수로 String값 이름을 받아와서 그 이름을 포함하고있는 모든 이름을 출력해주는 메소드이다.
위치홀더 '?'에 Like 비교값인 '-'나'%'을 넣어주기 위해서 그냥 저 비교값까지 한번에 선언해주어야한다. 그래서 필자는 Controller Class에서 이름을 받아오고 비교값까지 포함하도록 한번 더 String을 선언했다.
String addName = "%"+searchName+"%";
String query = "select * from member where member_id like ?";
pstmt.setString(1, addName);
이렇게 만들어준 것 이다.
//MemberController Class
public void insertMember() {
System.out.println(" -------- 회원 정보 입력 ------- ");
System.out.print("아이디 입력 : ");
String memberId = sc.next();
System.out.print("비밀번호 입력 : ");
String memberPw = sc.next();
System.out.print("이름 입력 : ");
String memberName = sc.next();
System.out.print("전호번호 입력 [ex.010.0000.0000] : ");
String phone = sc.next();
System.out.print("나이 입력 : ");
int age = sc.nextInt();
System.out.print("성별 입력 : ");
String gender = sc.next();
System.out.print("이메일 입력 : ");
String email = sc.next();
System.out.print("주소 입력 : ");
sc.nextLine();
String address = sc.nextLine();
Member m = new Member(0, memberId, memberPw, memberName, phone, age, gender, email, address, null);
int result = dao.insertMember(m);
if(result>0) {
System.out.println("정보를 입력했습니다.");
}else {
System.out.println("정보를입력하지 못했습니다!");
}
}//insertMember end
//MemberDao Class
public int updateMember(Member m) {
//1. 필요한 변수 선언
Connection conn = null;
PreparedStatement pstmt = null;
int result = 0;
String query = "update member set member_pw=?, phone=?, email=?, address=? where member_id=?";
try {
//2. 드라이버 선언
Class.forName("oracle.jdbc.driver.OracleDriver");
//3. Connection 생성
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe","jdbc","1234");
//4. PreparedStatement 생성
pstmt = conn.prepareStatement(query);
// 검사 후 값 넣어주기
pstmt.setString(1, m.getMemberPw());
pstmt.setString(2, m.getPhone());
pstmt.setString(3, m.getEmail());
pstmt.setString(4, m.getAddress());
pstmt.setString(5, m.getMemberId());
// 5.
result = pstmt.executeUpdate();
if(result>0) {
conn.commit();
}else {
conn.rollback();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
conn.close();
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}// update end
여기서부터는 DBMS에서 SELECT를 하는게 아니라 INSERT, UPDATE, DELETE를 해주기때문에 ResultSet 대신에 int값으로 return을 받아온다.
int result = 0;
이 변수가 나중에 업데이트를 했는데 안했는지 알려주는 변수가 될 것이다.
pstmt.setString(1, m.getMemberId());
pstmt.setString(2, m.getMemberPw());
pstmt.setString(3, m.getMemberName());
pstmt.setString(4, m.getPhone());
pstmt.setInt(5, m.getAge());
pstmt.setString(6, m.getGender());
pstmt.setString(7, m.getEmail());
pstmt.setString(8, m.getAddress());
위 코드를 이용해 집어넣을 값을 넣어준다.
result = pstmt.executeUpdate();
다음 위 코드로 return값을 받아온다 아까 했던 코드들은 Row를 직접 받아왔지만, INSERT, UPDATE, DELETE는 컬럼이 적용된 수를 리턴하기 때문이다.
if(result>0) {
conn.commit();
}else {
conn.rollback();
}
INSERT가 성공적으로 됐다면 commit해주고 그렇지 않다면 rollback해주자.
//MemberController Class
public void updateMember() {
System.out.print("수정할 회원 아이디 입력 : ");
String memberId = sc.next();
Member m = dao.selectOneMember(memberId);
if(m == null) {
System.out.println("정보를 조회할 수 없습니다.");
}else {
Member member = new Member();
System.out.print("수정할 비밀번호 입력 : ");
member.setMemberPw(sc.next());
System.out.print("수정할 전화번호 입력 : ");
member.setPhone(sc.next());
System.out.print("수정할 이메일 입력 : ");
member.setEmail(sc.next());
sc.nextLine();
System.out.print("수정할 주소 입력 : ");
member.setAddress(sc.nextLine());
member.setMemberId(memberId);
int result = dao.updateMember(member);
if(result>0) {
System.out.println("정보변경 성공");
}else {
System.out.println("정보변경 실패");
}
}
} //updateMember end
public int updateMember(Member m) {
//1. 필요한 변수 선언
Connection conn = null;
PreparedStatement pstmt = null;
int result = 0;
String query = "update member set member_pw=?, phone=?, email=?, address=? where member_id=?";
try {
//2. 드라이버 선언
Class.forName("oracle.jdbc.driver.OracleDriver");
//3. Connection 생성
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe","jdbc","1234");
//4. PreparedStatement 생성
pstmt = conn.prepareStatement(query);
// 검사 후 값 넣어주기
pstmt.setString(1, m.getMemberPw());
pstmt.setString(2, m.getPhone());
pstmt.setString(3, m.getEmail());
pstmt.setString(4, m.getAddress());
pstmt.setString(5, m.getMemberId());
result = pstmt.executeUpdate();
if(result>0) {
conn.commit();
}else {
conn.rollback();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
conn.close();
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}// update end
Controller Class를 봐보자.
Member m = dao.selectOneMember(memberId);
먼저 아까 만들어두었던 1명을 아이디로 조회하는 메소드를 이용해 수정하려는 회원이 있는지부터 확인한다. 만약 없다면 정보를 조회할 수 없다는 메세지를 띄우고 메소드를 종료한다.
if(m == null) {
System.out.println("정보를 조회할 수 없습니다.");
}
그게 아니라면 수정할 정보들을 입력받고 Dao클래스에 전해준다.
else {
Member member = new Member();
System.out.print("수정할 비밀번호 입력 : ");
member.setMemberPw(sc.next());
System.out.print("수정할 전화번호 입력 : ");
member.setPhone(sc.next());
System.out.print("수정할 이메일 입력 : ");
member.setEmail(sc.next());
sc.nextLine();
System.out.print("수정할 주소 입력 : ");
member.setAddress(sc.nextLine());
member.setMemberId(memberId);
int result = dao.updateMember(member);
그리고 DAO클래스에서 업데이트를 하고 int값을 받아와 update가 잘 됐는지 확인해보면 끝이다.
얘가 진짜 쉽다. 코드도 짧다.
//MemberController Class
public void deleteMember() {
System.out.println("회원 정보 삭제");
System.out.print("삭제할 회원 아이디 입력 : ");
String memberId = sc.next();
int result = dao.deleteMember(memberId);
if(result>0) {
System.out.println("삭제완료!");
}else {
System.out.println("일치하는 데이터가 없습니다!");
}
}//deleteMember end
짧아서 너무 좋다
//MemberDao Class
public int deleteMember(String memberId) {
Connection conn = null;
PreparedStatement pstmt = null;
int result = 0;
String query = "delete from member where member_id = ?";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe","jdbc","1234");
pstmt = conn.prepareStatement(query);
pstmt.setString(1, memberId);
result = pstmt.executeUpdate();
if(result>0) {
conn.commit();
}else {
conn.rollback();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
conn.close();
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
얘도 뭐 딱히 설명할게 없다 이제는
그냥 지우고 싶은 회원 아이디 입력하고 지우면 끝이다.
이렇게 프로그램을 짜보면서 sql과 java를 연동하는 방법을 익혀봤다.
아직은 솔직히 헷갈린다.
더 해보면서 익숙해져야겠다.
여기까지 포스팅해야겠다.
안뇽!