Notice
Recent Posts
Recent Comments
Link
Everything has an expiration date
[inflearn] 20240120 [스프링-프레임워크] - 23강 필기 본문
[Inflearn]/자바 스프링 프레임워크(renew ver.)
[inflearn] 20240120 [스프링-프레임워크] - 23강 필기
Jelly-fish 2024. 1. 21. 00:5623강 - JDBC
Java 언어를 사용해서 Database 와 통신하기 위한 방법에 대해서 살펴본다.
23-1 기본 SQL
23-2 JDBC
23-1 기본 SQL
`MEMBER` 테이블 생성
CREATE TABLE MEMBER
( MEMID VARCHAR2(10) CONSTRAINT MEMID_PK PRIMARY KEY
, MEMPW VARCHAR2(10)
, MEMMAIL VARCHAR2(15)
, MEMPURCNUM NUMBER(3) DEFAULT 0
CONSTRAINT MEMPURNUM_CK CHECK (MEMPURCNUM < 3)
);
① PRIMARY KEY : `MEMID`
▶ 중복을 방지하기 위해, PRIMARY KEY 로 설정.
② CHECK : `MEMPURCNUM` (구매 횟수)
▶ 3번 미만까지만 구매를 할 수 있도록 구매 횟수 제한.
`MEMBER` 테이블에 'b' 계정 입력
INSERT INTO MEMBER (MEMID, MEMPW, MEMMAIL)
VALUES ('b', 'bb', 'bbb@gmail.com');
`MEMBER` 테이블에 'memId'가 'b'인 회원 삭제
DELETE
FROM MEMBER
WHERE MEMID='b';
`MEMBER` 테이블의 모든 회원 정보 조회
SELECT *
FROM MEMBER;
`MEMBER` 테이블 삭제
DROP TABLE MEMBER;
23-2 JDBC
① 드라이버 로딩 → ② DB 연결 → ③ SQL 작성 및 전송 → ④ 자원 해제
MemberDao.java
import java.sql.Connection;
import java.sql.PrepareStatement;
import java.sql.ResultSet;
@Repository
public class MemberDao implements IMemberDao
{
// 드라이버 로딩
private String driver = "oracle.jdbc.driver.OracleDriver";
// 연결 url
private String url = "jdbc:oracle:thin:@localhost:1521:xe";
// 오라클 유저 ID, PW
private String userid = "scott";
private String userpw = "tiger";
// 데이터베이스 연결 객체 Conn 선언 (null)
private Connection conn = null;
// PrepareStatement 선언 (null)
private PrepareStatement pstmt = null;
// ResultSet 선언 (null)
private ResultSet rs = null;
....
}
→ `String` 으로 먼저 드라이버를 로딩하기 위해 드라이버의 경로를 문자열로 저장한다.
`oracle.jdbc.driver.OracleDriver`
DAO 인터페이스(`IMemberDao.java`) 수정
IMemberDao.java
package com.bs.lec21.member.dao;
public interface IMemberDao
{
int memberInsert(Member member);
ArrayList<Member> memberSelect(Member member);
int memberUpdate(Member member);
int memberDelete(String memId);
}
MemberDao.java 메소드 수정
① memberInsert(Member member)
private String driver = "oracle.jdbc.driver.OracleDriver";
private String url = "jdbc:oracle:thin:@localhost:1521:xe";
private String userid = "scott";
private String userpw = "tiger";
private Connection conn = null;
private PrepareStatement pstmt = null;
private ResultSet rs = null;
@Override
public int memberInsert(Member member)
{
int result = 0;
try
{
//======================================================================
// ① 드라이버 연결
//======================================================================
Class.forName(driver);
//======================================================================
// ② DB 연결
//======================================================================
// DriverManager 로부터 연결객체 (Connection) 가져오기.
//→ localhost에 있는 데이터베이스로 url을 통해 접근.
//→ 데이터베이스에 접근하기위해서
// 계정 아이디(『userid』), 계정 패스워드(『userpw』) 를 함께 넘겨준다.
conn = DriverManager.getConnection(url, userid, userpw);
//======================================================================
// ③ SQL 작성 및 전송
//======================================================================
String sql = "INSERT INTO MEMBER (MEMID, MEMPW, MEMMAIL)"
+ " VALUES (?, ?, ?)";
pstmt.setString(1, member.getMemId());
pstmt.setString(2, member.getMemPw());
pstmt.setString(3, member.getMemMail());
pstmt = conn.prepareStatement(sql);
result = pstmt.executeUpdate();
} catch (ClassNotFoundException e)
{
e.printStackTrace();
} catch (SQLException e)
{
e.printStackTrace();
} finally
{
//======================================================================
// ④ 자원 해제
//======================================================================
try
{
if (pstmt != null)
pstmt.close();
if (conn != null)
conn.close();
} catch (SQLException e)
{
e.printStackTrace();
}
}
// 『pstmt.executeUpdate()』를 통해
// 변경된 행(record)의 개수(이 메소드의 경우, 입력된 member의 개수) 반환.
return result;
}
MemberService.java 수정
MemberService.java - `memberRegister(Member member)`
package com.bs.lec21.member.service;
import java.util.Iterator;
@Service
public class MemberService implements IMemberService
{
@Autowired
MemberDao dao;
// 회원 정보 등록(입력) 메소드
@Override
public void memberRegister(Member member)
{
int result = dao.memberInsert(member);
// 회원 정보 입력이 제대로 되었다면,
// 변경된 행의 개수(int result)가 넘어올 것이다.
//=====================================================
// ⓐ『result == 0』: 제대로 회원 정보가 등록되지 않음.
// ⓑ『result > 0』(else) : 회원 정보 등록 성공
//=====================================================
//--> 이를 콘솔창에 로그로 출력해 주도록 처리한다.
if (result == 0)
{
System.out.println("Join Fail!!!");
}
else
{
System.out.println("Join Seccess~!!!");
}
}
}
MemberDao.java 메소드 수정
② memberSelect()
@Override
public Member memberSelect(Member member) {
Member mem = null;
try
{
//======================================================================
// ① 드라이버 연결
//======================================================================
Class.forName(driver);
//======================================================================
// ② DB 연결
//======================================================================
conn = DriverManager.getConnection(url, userid, userpw);
//======================================================================
// ③ SQL 작성 및 전송
//======================================================================
String sql = "SELECT * FROM member WHERE memId = ? AND memPw = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, member.getMemId());
pstmt.setString(2, member.getMemPw());
rs = pstmt.executeQuery();
while (rs.next())
{
String memId = rs.getString("memid");
String memPw = rs.getString("mempw");
String memMail = rs.getString("memMail");
int memPurcNum = rs.getInt("memPurcNum");
mem = new Member();
mem.setMemId(memId);
mem.setMemPw(memPw);
mem.setMemMail(memMail);
mem.setMemPurcNum(memPurcNum);
}
} catch (ClassNotFoundException e)
{
e.printStackTrace();
} catch (SQLException e)
{
e.printStackTrace();
} finally
{
//======================================================================
// ④ 자원 해제
//======================================================================
try
{
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
} catch (SQLException e)
{
e.printStackTrace();
}
}
return mem;
}
MemberDao.java 메소드 수정
③ memberUpdate(Member member)
@Override
public int memberUpdate(Member member)
{
int result = 0;
try
{
//======================================================================
// ① 드라이버 연결
//======================================================================
Class.forName(driver);
//======================================================================
// ② DB 연결
//======================================================================
conn = DriverManager.getConnection(url, userid, userpw);
//======================================================================
// ③ SQL 작성 및 전송
//======================================================================
String sql = "UPDATE member SET memPw = ?, memMail = ? WHERE memId = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, member.getMemPw());
pstmt.setString(2, member.getMemMail());
pstmt.setString(3, member.getMemId());
result = pstmt.executeUpdate();
} catch (ClassNotFoundException e)
{
e.printStackTrace();
} catch (SQLException e)
{
e.printStackTrace();
} finally
{
//======================================================================
// ④ 자원 해제
//======================================================================
try
{
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
} catch (SQLException e)
{
e.printStackTrace();
}
}
return result;
}
MemberDao.java 메소드 수정
④ memberDelete(String memId)
@Override
public int memberDelete(Member member)
{
int result = 0;
try
{
//======================================================================
// ① 드라이버 연결
//======================================================================
Class.forName(driver);
//======================================================================
// ② DB 연결
//======================================================================
conn = DriverManager.getConnection(url, userid, userpw);
//======================================================================
// ③ SQL 작성 및 전송
//======================================================================
String sql = "DELETE member WHERE memId = ? AND memPw = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, member.getMemId());
pstmt.setString(2, member.getMemPw());
result = pstmt.executeUpdate();
} catch (ClassNotFoundException e)
{
e.printStackTrace();
} catch (SQLException e)
{
e.printStackTrace();
} finally
{
//======================================================================
// ④ 자원 해제
//======================================================================
try
{
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
} catch (SQLException e)
{
e.printStackTrace();
}
}
return result;
}
DAO 메소드 수정 중, 중복된 코드 반복 확인 (`①, ②, ④`)
모든 메소드를 확인해 보면...
① 드라이버 로딩 → ② DB 연결 → ③ SQL 작성 및 전송 → ④ 자원 해제
의 과정을 거치고 있는 것을 확인할 수 있다.
이때, 개발자가 직접 소스를 수정하는 ③ SQL 작성 및 전송에 대한 파트 외에
☆ ① 드라이버 로딩, ② DB 연결, ④ 자원 해제 에 대한 부분은 코드 자체가 계속해서 반복되고 있다는 것을 확인할 수 있다.
이에 대한 것을 개선하기 위해, Spring 에서는 `JDBC 템플릿` 을 제공하고 있다.
이를 다음 시간에 살펴보도록 하자...
'[Inflearn] > 자바 스프링 프레임워크(renew ver.)' 카테고리의 다른 글
[inflearn] 20240121 [스프링-프레임워크] - 25강 필기 (0) | 2024.01.22 |
---|---|
[inflearn] 20240121 [스프링-프레임워크] - 24강 필기 (0) | 2024.01.21 |
[inflearn] 20240120 [스프링-프레임워크] - 21강 필기 (1) | 2024.01.20 |
[inflearn] 20240114 [스프링-프레임워크] - 20강 필기 (1) | 2024.01.14 |
[inflearn] 20240114 [스프링-프레임워크] - 19강 필기 (1) | 2024.01.14 |