개인 프로젝트

Toy Project (패스트 캠퍼스 #1)

Ramda 2022. 5. 15. 19:04

ToyProject

패스트캠퍼스 백엔드 국비과정 첫 프로젝트를 진행 했다.

프로젝트의 목표

현재 개발하는 대부분의 애플리케이션은 Oracle, MySQL같은 DBMS를 연동하여 사용자가 입력한 데이터를 저장하고 관리한다. 이번 토이프로젝트에서는 그러한 과정을 직접 만들어보며,
지금까지 공부한 클래스에 대한 설계, String클래스 API, 입출력, SQL, JDBC 프로그램을 점검한다.

프로젝트 설명

사용자가 입력한 회원정보를 데이터베이스에 저장하고 관리하는 회원관리 프로그램을 개발한다.

프로젝트 구현 가이드

  • 테이블 설계
  1. MEMBER 테이블에 저장할 정보는 회원의 아이디, 회원 이름, 전화번호다.
  2. 각 컬럼에 제약 조건을 설정한다.
    • ID 에 기본키 적용
    • 전부 NOT NULL 적용
  • Member Class 구현
  1. 사용자가 입력한 회원 정보를 저장할 수 있도록 private 멤버변수(필드)를 선언한다.
  2. private 멤버 필드에 접근하기 위한 Getter 메소드와 Setter 메소드를 선언하고, Member 객체의 상태를 문자열로 리턴하는 toString() 메소드를 재정의(Overriding)한다.
  • JDBC를 이용한 MemberDAO Class 구현
  1. Connection 객체를 획득하고, 사용한 Connection 객체를 종료(close)하는 Utility 클래스를 작성한다.
  2. MemberDAO 클래스를 작성하고 회원등록, 회원 수정, 회원 삭제, 회원 상세 조회, 회원 목록 검색 기능의 메소드를 각각 구현한다.
  • MamberManager Class 구현
  1. MemberDAO와 사용자가 키보드를 통해 입력한 데이터를 읽어들이는 입력 스트림을 멤버변수(필드)로 선언하고, 멤버번수를 초기화하는 생성자를 작성한다.
  2. 무한루프를 돌면서 사용자가 입력한 메뉴 정보를 읽어들이는 readMenu() 메소드를 구현한다. readMenu() 메소드에서는 사용자가 입력한 숫자에 따라 다음과 같이 분기처리한다.
선택한 번호 | 실행할 기능(호출할 메소드)
1 | 회원 목록(getMemberList())
2 | 회원 등록(insertMember())
3 | 회원 수정(updateMember())
4 | 회원 삭제(deleteMember())
0 | 프로그램 종료
  1. 사용자가 1번 메뉴를 입력했을 때, 회원목록을 출력할 getMemberList() 메소드를 구현한다.
  2. 사용자가 2번 메뉴를 입력했을 때, 회원가입을 처리할 insertMember() 메소드를 구현한다.
  3. 사용자가 3번 메뉴를 입력했을 때, 회원수정을 처리할 updateMember() 메소드를 구현한다.
  4. 사용자가 4번 메뉴를 입력했을 때, 회원삭제를 처리할 deleteMember() 메소드를 구현한다.

구동 프로그램

  • 데이터베이스 : H2 콘솔 사용 작성
  • IDE : 인텔리제이로 하고 싶었으나 이클립스 사용하여 작성

SQL 작성

CREATE TABLE MEMBER (
ID VARCHAR(50) NOT NULL PRIMARY KEY,
NAME VARCHAR(50) NOT NULL,
P_NUM VARCHAR(50) NOT NULL
);

Member Class 작성

public class Member {

    private String ID;
    private String name;
    private String p_Num;

    public Member() {

    }

    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 getP_Num() {
        return p_Num;
    }

    public void setP_Num(String p_Num) {
        this.p_Num = p_Num;
    }

    @Override
    public String toString() {
        return "ID : " + getID() + "NAME : "+getName()+"Phone_Number : "+getP_Num();
    }

}

MemberDAO & JDBCUtility 작성

  • MemberDAO
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;    

public class MemberDAO {

private Connection con = null;
private PreparedStatement stm = null;
private ResultSet rs = null;

private String MEMBER_LIST = "SELECT * FROM MEMBER";
private String MEMBER_INSERT = "INSERT INTO MENBER VALUES(?, ?, ?)";
private String MEMBER_UPDATE = "UPDATE MEMBER SET P_NUM =? WHERE ID =?";
private String MEMBER_DELETE = "DELETE MEMBER WHERE ID=?";
private String MEMBER_SELECT = "SELECT * FROM MEMBER WHERE ID=?";

public List<Member> getMemberList() {
    List<Member> memberList = new ArrayList<>();

    try {
        con = JDBCUtility.getConnection();
        stm = con.prepareStatement(MEMBER_LIST);
        rs = stm.executeQuery();

        while (rs.next()) {
            Member mb = new Member();
            mb.setID(rs.getString("ID"));
            mb.setName(rs.getString("Name"));
            mb.setP_Num(rs.getString("p_Num"));
            memberList.add(mb);
            System.out.println(mb.toString());
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        JDBCUtility.close(rs, stm, con);
    }
    return memberList;

}

public void insertMember(Member mb) {
    try {
        con = JDBCUtility.getConnection();
        stm = con.prepareStatement(MEMBER_INSERT);
        stm.setString(1, mb.getID());
        stm.setString(2, mb.getName());
        stm.setString(3, mb.getP_Num());
        stm.executeUpdate();

    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        JDBCUtility.close(stm, con);
    }
}

public void updateMember(Member mb) {
    try {
        con = JDBCUtility.getConnection();
        stm = con.prepareStatement(MEMBER_UPDATE);
        stm.setString(1, mb.getP_Num());
        stm.setString(2, mb.getID());
        stm.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        JDBCUtility.close(stm, con);
    }
}
public void deleteMember(Member mb) {
    try {
        con = JDBCUtility.getConnection();
        stm = con.prepareStatement(MEMBER_DELETE);
        stm.setString(1, mb.getID());
        stm.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        JDBCUtility.close(stm, con);
    }
}
public boolean selectMember(Member mb) {
    try {
        con = JDBCUtility.getConnection();
        stm = con.prepareStatement(MEMBER_SELECT);
        stm.setString(1, mb.getID());
        stm.executeQuery();

        if(rs.next()) {
            return true;
        }else {
            return false;
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        JDBCUtility.close(stm, con);
    }
    return false;
    }
}
  • JDBCUtility

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

public class JDBCUtility {

public static Connection getConnection() {
    Connection con = null;

    try {
        DriverManager.registerDriver(new org.h2.Driver());
        String memberURL = "jdbc:h2:tcp://localhost/~/test";
        con = DriverManager.getConnection(memberURL, "sa", "");
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return con;
}

public static void close(PreparedStatement stm, Connection con) {
    try {
        stm.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    try {
        con.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }

}

public static void close(ResultSet rs, PreparedStatement stm, Connection con) {

    try {
        rs.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }

    try {
        stm.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }

    try {
        con.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    }
}

MemberManager Class 작성


import java.util.Scanner;

public class MemberManager {

Scanner sc = new Scanner(System.in);
Member mb = new Member();
MemberDAO dao = new MemberDAO();

public void readMenu() {

    System.out.println("1 | 회원 목록(getMemberList())");
    System.out.println("2 | 회원 등록(insertMember())");
    System.out.println("3 | 회원 수정(updateMember())");
    System.out.println("4 | 회원 삭제(deleteMember())");
    System.out.println("0 | 프로그램 종료");

}
public void MemberAllprint() {
    dao.getMemberList();
}

public void MemberInsert() {

    System.out.print("아이디를 입력하세요 (형식 M-00001) : ");
    String ID = sc.next();
    System.out.print("이름을 입력하세요 : ");
    String name = sc.next();
    System.out.print("전화번호를 입력하세요 : ");
    String p_Num = sc.next();

    mb.setID(ID);
    mb.setName(name);
    mb.setP_Num(p_Num);
    dao.insertMember(mb);

}

public void MemberUpdate() {
    System.out.print("수정할 아이디를 입력하세요 (형식 M-00001) : ");
    String ID = sc.next();
    System.out.print("수정할 전화번호를 입력하세요 : ");
    String p_Num = sc.next();
    System.out.println("---> 회원수정에 성공하였습니다.");

    mb.setID(ID);
    mb.setP_Num(p_Num);
    dao.updateMember(mb);
}

public void MemberDelete() {
    System.out.println("삭제할 아이디를 입력하세요 : ");
    String ID = sc.next();
    System.out.println(ID + "회원 삭제에 성공하셨습니다.");

    mb.setID(ID);
    dao.deleteMember(mb);

}

public void ExitProgram() {

    System.out.println("#############################");
    System.out.println("### GOOD-BYE 프로그램 종료 ###");
    System.out.println("#############################");

    }
}

Main Class 작성


import java.util.InputMismatchException;  
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
    System.out.println("#############################");
    System.out.println("### 회원 관리 프로그램 START ##");
    System.out.println("#############################");

    MemberManager mm = new MemberManager();

    while (true) {

        mm.readMenu();

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        try {
            if (!(n >= 0 && n < 6)) {
                throw new InputMismatchException();
            }
        } catch (InputMismatchException e) {
            System.out.println("입력된 값이 잘못되었습니다.");
        }

        if (n == 1) {
            mm.MemberAllprint();
        } else if (n == 2) {
            mm.MemberInsert();
        } else if (n == 3) {
            mm.MemberUpdate();
        } else if (n == 4) {
            mm.MemberDelete();

        } else {
            mm.ExitProgram();

            sc.close();
            break;

        }
    }
}
}

결과 확인

결과를 출력하면 아래와 같이 나온다. 원하는 기능을 실행해보자

2번을 눌러 회원을 등록해보면

테이블에 등록이 완료된다.

2번으로 3명의 회원을 등록시킨 후 3번으로 수정해보자

이렇게 3명의 회원이 등록되어 있다. 강고리의 번호를 010-3333-3333으로 수정해보자

수정이 완료되었다.

이번엔 4번 회원 삭제로 강고리를 삭제해보자

회원 삭제가 완료되었다.

 

이 결과가 정말 DBMS에 반영이 되었는지 확인해보자

H2 DBMS를 보면 적용이된걸 학인할 수 있다.

프로젝트 후기

배운 예제를 계속 반복하다보니 중복되는 내용이 많아서 큰 무리없이 작성하긴 하였다.
진행하면서 "이게 맞는 건가..?"라는 생각이 들때면 프로젝트의 알고리즘을 짜는 단계에서 이것저것 고민을 하고 답이 안나오면 구글에서 검색을 하였다.
많이 부족하고 코드를 막 접하는 단계인 나에겐 많은 걸 배울 수 있는 프로젝트라고 생각한다.
다만, 아직 초짜인 내가 너무 욕심을 부리는 것일 수는 있지만 구글을 찾아보면 어느샌가 거의 따라한 느낌이 강해서 내가 작성한 것인지 남의 것을 따라한 것인지 회의감을 느꼈다.
건방진 생각이고 비효율적이겠지만 언젠가 코드를 처음부터 끝까지 내손으로 작성할 때가 있을 때를 목표로 삼고 열심히 공부해봐야겠다. 화이팅!