TIL

[JDBC] 이름, 전화번호 입력 받고 출력하는 프로그램 : DAO, DTO 클래스 / Statement 인터페이스 활용

온풀 2022. 4. 3. 22:41

문제

○ TBL_MEMBER 테이블을 활용하여
   이름과 전화번호를 여러 건 입력받고, 전체 출력하는 프로그램을 구현한다.
   단, 데이터베이스 연동이 이루어져야 하고,
   MemberDAO, MemberDTO 클래스를 활용해야 한다.
   
실행 예)

이름 전화번호 입력(2) : 오이삭 010-2222-2222
>> 회원 정보 입력 완료~!!! 
이름 전화번호 입력(3) : 임소민 010-3333-3333
>> 회원 정보 입력 완료~!!! 
이름 전화번호 입력(4) : .

-------------------------------
전체 회원 수 : 3명
-------------------------------
번호 이름 전화번호
1 이호석 010-1111-1111
2 오이삭 010-2222-2222
3 임소민 010-3333-3333

 

DBConn

package com.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConn
{
    private static Connection dbConn;

    public static Connection getConnection() throws ClassNotFoundException, SQLException
    {
        if (dbConn == null)
        {
            String url = "jdbc:oracle:thin:@localhost:1521:xe";
            String user = "scott";
            String pwd = "tiger";

            Class.forName("oracle.jdbc.driver.OracleDriver");

            dbConn = DriverManager.getConnection(url, user, pwd);
        }

        return dbConn;
    }

    public static Connection getConnection(String url, String user, String pwd) throws ClassNotFoundException, SQLException
    {
        if (dbConn == null)
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");

            dbConn = DriverManager.getConnection(url, user, pwd);
        }

        return dbConn;
    }

    public static void close() throws SQLException
    {
        if (dbConn != null)
        {
            if (!dbConn.isClosed())
            {
                dbConn.close();
            }
        }

        dbConn = null;
    }

}

MemberDTO

package com.test;

public class MemberDTO
{
    // 주요 속성 구성
    private String sid, name, tel;

    // getter / setter 구성
    public String getSid()
    {
        return sid;
    }

    public void setSid(String sid)
    {
        this.sid = sid;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String getTel()
    {
        return tel;
    }

    public void setTel(String tel)
    {
        this.tel = tel;
    }
}

MemberDAO

/*==================
 MemberDAO.java 
==================*/

// 데이터베이스에 액세스 하는 기능
// → DBConn 활용(전담 계층)

// 데이터를 입력하는 기능 → INSERT

// 인원 수 확인하는 기능 
// 즉, 대상 테이블(TBL_MEMBER)의 레코드 카운팅 기능 → SELECT

// 전체 리스트를 조회하는 기능
// 즉, 대상 테이블(TBL_MEMBER)의 데이터를 조회하는 기능 → SELECT

package com.test;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import com.util.DBConn;

public class MemberDAO
{
    // 주요 속성 구성 → DB 연결 객체
    private Connection conn;

    // 생성자 정의(사용자 정의 생성자)
    public MemberDAO() throws ClassNotFoundException, SQLException
    {
        conn = DBConn.getConnection();
    }

    // 메소드 정의 → 데이터를 입력하는 기능 → INSERT
    public int add(MemberDTO dto) throws SQLException
    {
        // 반환할 결과값을 담아낼 변수(적용된 행의 갯수)
        int result = 0;

        // 작업 객체 생성
        Statement stmt = conn.createStatement();

        // 쿼리문 준비(insert)
        String sql = String.format("INSERT INTO TBL_MEMBER(SID, NAME, TEL)"
                + " VALUES(MEMBERSEQ.NEXTVAL, '%s', '%s')", dto.getName(), dto.getTel());
        // Q. MemberDTO 객체 생성한 것도 아닌데 『dto.』 으로 어떻게 갖다 쓰는 거지?
        //    MemberDTO 타입의 dto 를 매개변수로 받는 메소드. 
        //    그 dto 객체의 getName() 메소드, getTel() 메소드 --> 모두 String 반환
        //    인스턴스 생성 구문이 필요 없나???
        // A. (충희오빠 답변-오빠가 확인한 것)
        //    같은 프로젝트 내에 있어서 import 없이 처리되는 것

        // 작업 객체를 활용하여 쿼리문 실행(전달)
        result = stmt.executeUpdate(sql);

        // 사용한 리소스 반납
        stmt.close();

        // 최종 결과값 반환
        return result;

    }// end add()

    // 메소드 정의 → 전체 인원 수 확인하는 기능 → SELECT
    public int count() throws SQLException
    {
        // 결과값으로 반환하게 될 변수 선언 및 초기화
        int result = 0;

        // 작업 객체 생성
        Statement stmt = conn.createStatement();

        // 쿼리문 준비
        String sql = "SELECT COUNT(*) AS COUNT FROM TBL_MEMBER";

        // 생성된 작업 객체를 활용하여 쿼리문 실행
        ResultSet rs = stmt.executeQuery(sql);

        // ResultSet 처리 → 반복문 구성 → 결과값 수신
        if (rs.next())
        {
            result = rs.getInt(1);
        }

        // 리소스 반납
        rs.close();
        stmt.close();

        // 최종 결과값 반환
        return result;
    }// end count()

    // 메소드 정의 → 전체 리스트를 조회하는 기능 → select
    public ArrayList<MemberDTO> lists() throws SQLException 
    {
        // 결과값으로 변환할 변수 선언 및 초기화
        ArrayList<MemberDTO> result = new ArrayList<MemberDTO>();

        // 작업 객체 생성
        Statement stmt = conn.createStatement();

        // 쿼리문 준비 
        String sql = "SELECT SID, NAME, TEL FROM TBL_MEMBER ORDER BY SID";

        // 생성된 작업 객체를 활용하여 쿼리문 실행
        // → select → executeQuery() → ResultSet 반환 → 일반적으로 반복 처리
        ResultSet rs = stmt.executeQuery(sql);

        // ResultSet 처리 
        while (rs.next())
        {
            MemberDTO dto = new MemberDTO();

            dto.setSid(rs.getString("SID"));
            dto.setName(rs.getString("NAME"));
            dto.setTel(rs.getString("TEL"));

            result.add(dto);
        }

        // 리소스 반납
        rs.close();
        stmt.close();

        // 최종 결과값 반환
        return result;
    }// end lists()
}// end class MemberDAO

MemberMain

package com.test;

import java.util.Scanner;

import com.util.DBConn;

public class MemeberMain
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);

        try
        {
            MemberDAO dao = new MemberDAO();

            int count = dao.count();

            do
            {
                System.out.printf("이름 전화번호 입력(%d) : ", ++count);
                String name = sc.next();

                // 반복의 조건을 무너뜨리는 코드 구성
                if (name.equals("."))
                {
                    break;
                }

                String tel = sc.next();

                // MemberDTO 객체 생성
                MemberDTO dto = new MemberDTO();

                // 속성값 구성
                dto.setName(name);
                dto.setTel(tel);

                // 데이터베이스에 데이터 입력하는 메소드 호출 → add()
                int result = dao.add(dto);
                if (result > 0)
                {
                    System.out.println(">> 회원 정보 입력 완료~!!! ");
                }

            } while (true);

            System.out.println();
            System.out.println("-------------------------------");
            System.out.printf("전체 회원 수 : %d명\n", dao.count());
            System.out.println("-------------------------------");
            System.out.println("번호    이름    전화번호");

            // 리스트 가져와 출력
            for (MemberDTO obj : dao.lists())
            {
                System.out.printf("%3s %7s %12s\n", obj.getSid(), obj.getName(), obj.getTel());
            }
            System.out.println("-------------------------------");

        } catch (Exception e)
        {
            System.out.println(e.toString());
        }
        finally
        {
            try
            {
                DBConn.close();
                System.out.println("데이터베이스 연결 닫힘~!!!");
                System.out.println("프로그램 종료됨~!!!");

            } catch (Exception e)
            {
                System.out.println(e.toString());
            }
        }
    }
}