Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

Everything has an expiration date

[inflearn] 20240120 [스프링-프레임워크] - 23강 필기 본문

[Inflearn]/자바 스프링 프레임워크(renew ver.)

[inflearn] 20240120 [스프링-프레임워크] - 23강 필기

Jelly-fish 2024. 1. 21. 00:56

23강 - 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번 미만까지만 구매를 할 수 있도록 구매 횟수 제한.


출처 : inflearn [스프링-프레임워크 (renew)] - 23강


`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;

}

 


출처 : inflearn [스프링-프레임워크 (renew)] - 23강


DAO 메소드 수정 중, 중복된 코드 반복 확인 (`①, ②, ④`)

 

모든 메소드를 확인해 보면...

① 드라이버 로딩 → ② DB 연결 → ③ SQL 작성 및 전송 → ④ 자원 해제

의 과정을 거치고 있는 것을 확인할 수 있다.

 

이때, 개발자가 직접 소스를 수정하는 ③ SQL 작성 및 전송에 대한 파트 외

☆ ① 드라이버 로딩, ② DB 연결, ④ 자원 해제 에 대한 부분은 코드 자체가 계속해서 반복되고 있다는 것을 확인할 수 있다.

 

이에 대한 것을 개선하기 위해, Spring 에서는 `JDBC 템플릿` 을 제공하고 있다. 

이를 다음 시간에 살펴보도록 하자...