Java

[Java] - 객체지향적인 Java - DB 연동

dev_SiWoo 2020. 10. 5. 17:49

Java로 어떠한 프로젝트를 설계할 때 단위 별로 컴포넌트화 하는 것이 중요하다.

 

단순하게 DB와 Java를 연동한 이후 CRUD를 구현하는데 있어서도 마찬가지이다.

 

다음은 총 3개의 클래스(VO클래스, DAO클래스, 실행클래스)를 통한 객체지향적인 Java와 DB연동 이후 CRUD 사용을 위한 설계 및 코드이다.

 

#VO 클래스 (Value Object )

read only 속성을 갖는데 Value Object는 관계 데이터 베이스의 레코드에 대응되는 자바 클래스를 의미한다.

형태는 DB의 어느 한 테이블을 구성하는 필드들을 VO 클래스의 Attribute로 선언하고 해당 변수에 접근할 수 있는 Getter, Setter 메소드의 조합으로 클래스가 형성되어진 클래스이다.

 

#DAO 클래스 ( Data Access Object : 데이터 접근 객체 )

데이터 접근을 목적하는 객체이다. 커넥션 같은 것을 하나만 두고 여러 사용자가 DAO의 인터페이스를 사용하여 필요한 자료에 접근 하도록 하는 것이 DAO의 개념이다.

DB에 대한 insert, update, delete, select를 처리한다.

 

 먼저 DB에 다음과 같은 student 테이블이 있다고 할 때 이 student 테이블에 있는 데이터들에 대해서 CRUD를 한다고 생각해보자.

 

 

첫번째로 VO클래스 작성이다.

package chapter15;

public class StudentV0 {
    private int studno;
    private String name;
    private String id;
    private int grade;
    private String jumin;
    private String birthday;
    private String tel;
    private int height;
    private int weight;
    private int major1;
    private int mjaor2;
    private int profno;
    
    
    // Getter and Setter
    
    public String getJumin() {
        return jumin;
    }
    public void setJumin(String jumin) {
        this.jumin = jumin;
    }
    public int getStudno() {
        return studno;
    }
    public void setStudno(int studno) {
        this.studno = studno;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public int getGrade() {
        return grade;
    }
    public void setGrade(int grade) {
        this.grade = grade;
    }
    public String getBirthday() {
        return birthday;
    }
    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public int getHeight() {
        return height;
    }
    public void setHeight(int height) {
        this.height = height;
    }
    public int getWeight() {
        return weight;
    }
    public void setWeight(int weight) {
        this.weight = weight;
    }
    public int getMajor1() {
        return major1;
    }
    public void setMajor1(int major1) {
        this.major1 = major1;
    }
    public int getMjaor2() {
        return mjaor2;
    }
    public void setMjaor2(int mjaor2) {
        this.mjaor2 = mjaor2;
    }
    public int getProfno() {
        return profno;
    }
    public void setProfno(int profno) {
        this.profno = profno;
    }
    
}
 

VO클래스 작성은 상당히 간단하다. 테이블의 필드들을 클래스의 속성으로 선언한뒤 Getter/Setter만 만들어주면된다.

 

 

  다음은 DAO 클래스 작성이다.

우선 DB 연동과 sql 실행에 필요한 기본적인 3개의 객체 Connettion, Statement, Resultset 객체들을 필드로써 선언한다.

전역변수의 역할을 수행하기 위함이다.

 

이후에는 Connetion 객체를 생성자단에서 생성한 뒤 insert, update, delete 등의 다양한 메소드들을 

작성한다.

package chapter15;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.sql.SQLException;


public class StudentDao {
    // DB접속에 필요한 객체들을 필드로 선언한다 : 전역변수로써의 역할을 할 수 있도록 하기위함
    // DB 접속 객체선언
    Connection conn = null;

    // sql 실행할 객체 선언
    Statement stmt = null;

    // sql 실행결과를 담을 객체 선언
    ResultSet rs = null;
    
    //생성자 : 매개변수를 입력받아 Connection 객체를 생성
    StudentDao(String ip, String port, String db, String id, String pwd ){
        try {
            // Maria db 드라이버 로드
            Class.forName("org.mariadb.jdbc.Driver");
            // 데이터베이스 접속
            conn = DriverManager.getConnection("jdbc:mariadb://"+ip+":"+port+"/"+db,id,pwd);
            if(conn != null) {
                System.out.println("DB 접속성공" + conn);
            }

        } catch (Exception e) {
            System.out.println(e.toString());
        }
        
        
    }
    
    public int insert(StudentV0 vo) {
        int r = 0;
        
        // insert 쿼리 
        String sql = "insert into student (studno, name, id, grade, jumin, birthday, tel,"
                + "height, weight, major1, major2, profno) values ("
                + vo.getStudno()+",'"+vo.getName()+"','"+vo.getId()+"',"+vo.getGrade()+",'"+vo.getJumin()+"',"
                + "null, null, null, null, null, null, null)";
        try {
            stmt = conn.createStatement(); // statement 객체생성
            r = stmt.executeUpdate(sql); //insert, update, delete 등에는 executeUpdate함수사용
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        return r;
        
    }
    
    public int update(StudentV0 vo) {
        int r = 0;
        
        //update 쿼리
        String sql = "update student set name ='"+vo.getName()+"' where studno ="+vo.getStudno();
        System.out.println(sql);
        try {
            stmt = conn.createStatement(); // statement 객체생성
            r = stmt.executeUpdate(sql); //insert, update, delete 등에는 executeUpdate함수사용
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        return r;
        
    }
    
    public int delete(StudentV0 vo) {
        int r = 0;
        
        //update 쿼리
        String sql = "delete from student where studno ="+vo.getStudno();
        
        System.out.println(sql);
        try {
            stmt = conn.createStatement(); // statement 객체생성
            r = stmt.executeUpdate(sql); //insert, update, delete 등에는 executeUpdate함수사용
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        return r;
        
    }
    
    //학생 전체 목록 조회
    public List<StudentV0> selelctList(){
        List<StudentV0> list = new ArrayList<StudentV0>();
        
        try {
            stmt = conn.createStatement();
            rs = stmt.executeQuery("select * from student");
            while(rs.next()) {
                StudentV0 vo = new StudentV0();
                vo.setStudno(rs.getInt("studno"));
                vo.setName(rs.getString("name"));
                vo.setId(rs.getNString("id"));
                list.add(vo);
            }
        } catch(Exception e) {}
        return list;
    }
    
    public StudentV0 selectone(int stdnum) {
        StudentV0 vo = new StudentV0();
        
        try {
            stmt = conn.createStatement();
            rs = stmt.executeQuery("select * from student where studno =" + stdnum+";");
            rs.next();
            vo.setStudno(rs.getInt("studno"));
            vo.setName(rs.getString("name"));
            vo.setId(rs.getString("id"));
        } catch( Exception e) {}
        
        return vo;
    }
}
 

 

다음은 위 두 클래스를 실행하는 실행클래스이다.

package chapter15;

import java.util.ArrayList;
import java.util.List;

public class StudentMain {

    public static void main(String[] args) {
        StudentDao dao = new StudentDao("127.0.0.1", "3306", "ai_db", "root", "ai1234");        

        StudentV0 vo = new StudentV0();        
        vo.setStudno(999999);
        vo.setName("홍길동");
        vo.setId("hong");
        vo.setGrade(1);
        vo.setJumin("9406242588727");
        
        //insert 메소드 호출
        int result = dao.insert(vo);
        System.out.println(result);
        if( result >0){
            System.out.println("정상적으로 등록되었습니다.");
        } else {
            System.out.println(" DB 오류 발생");
        }
        
        //update 메소드 호출
        vo.setStudno(999999);
        vo.setName("고길동");
        int r = dao.update(vo);
        if( r >0) {
            System.out.println("수정 성공");
        } else {
            System.out.println("수정 실패");
        }
        
        //delete 메소드 호출
        vo.setStudno(999999);
        int r2 = dao.delete(vo);
        if(r2 > 0 ) {
            System.out.println("삭제 성공");
        } else {
            System.out.println("삭제 실패");
        }
        
        // 전체학생 출력
        List<StudentV0> li = new ArrayList<StudentV0>();
        li = dao.selelctList();
        
        for(int i=0; i<li.size(); i++) {
            System.out.println("학생번호:"+li.get(i).getStudno() +"\t"+ "학생이름 :"+li.get(i).getName() 
                    +"\t"+  "학생아이디 :" + li.get(i).getId()+" \t학년:"+li.get(i).getGrade());
        }
        
        
        System.out.println("-----------------1명만 출력하기----------------");
        //원하는 한명의 학생만 출력
        StudentV0 v2 = new StudentV0();
        v2 = dao.selectone(950115);
        System.out.println("학생번호:" + v2.getStudno() +"\t 학생이름:"+ v2.getName() + "\t 학생아이디 :" + v2.getId());
        v2 = dao.selectone(950315);
        System.out.println("학생번호:" + v2.getStudno() +"\t 학생이름:"+ v2.getName() + "\t 학생아이디 :" + v2.getId());

    }
}
 
 

위 실행클래스를 실행하면 다음과 같은 출력을 얻을 수 있다.

이때 학생 전체를 조회하는 메소드인 selelctList() 를 작성할 떄, 

vo.setGrade()를 추가해주지 않았기 때문에 sql 을 통해 얻어진 학년이 아니라 필드의 디폴트값이 출력된 것이다.

 

추가적으로

r = stmt.executeUpdate(sql); //insert, update, delete 등에는 executeUpdate함수사용하며

executeUpadate() 메소드는 insert, update, delete 등을 수행한 횟수 (int) 를 리턴한다.