190611_Day42 <기존 코드 대입> 어제에 이어서...


M

  • DAO , 데이터를 가지고 Calculator

V

C

  • 요청분석
  • 데이터 얻기
  • 모델호출
  • 뷰호출
  • 유효성검사

<작업순서>

어제에 이어서 개선하고, 추가하자!

  1. 입력폼 : X버튼 클릭시 '메인뷰'로 이동

  2. 입력폼 : 입력버튼 클릭시

    • '입력폼에 입력한 데이터들 얻어와서 하나로 모으기 '
    • 데이터 (3개) 얻어오기 => 하나의 변수명으로 저장하기
    • 알맞은 모델호출 (Insert)
      • boolean insert (Person p)
    • 입력이 잘 되었을 때 메인뷰로 이동
      • => 이동 전 전체 Person의 정보 얻어오기
      • => 알맞은 모델 호출 (selectAll)
      • => 얻어 온 정보를 메인뷰에 출력
      • => Main뷰 클래스에 출력하는 메소드 정의 (예 : displayTable)
  3. 메인뷰 : 수정버튼 클릭시

    • 모델호출에 필요한 수정번호(사용자로부터) 얻기

      • 방법1) JTable에 선택된 행의 번호 얻기
      • 방법2) JOptionPane에 입력창을 통한 입력된 번호 얻기
    • 이동 전 수정 폼에 출력될 내용 (DB로부터) 조회 : 모델호출

      • => Person select (int no)
    • 메인뷰 => 수정폼 이동

  4. 수정폼 : 수정버튼 클릭시

    • 데이터 (2개) 얻어오기
      • 하나의 변수명으로 저장하기
    • 알맞은 모델호출(update)
      • boolean update (Person p)
    • 수정이 잘 되었을 때 메인뷰로 이동
      • 이동 전 전체 Person의 정보 얻어오기
        • 알맞은 모델호출 (selectAll)
      • 정보 (수정 후 결과) 를 메인뷰 (JTable)에 출력
        • Main뷰 클래스에 출력하는 메소드 정의 ( 예 : displayTable)
  5. 메인뷰 : 삭제버튼 클릭시

    • JOptionPane의 inputDialog를 통해 삭제할 번호 입력

    • 알맞은 모델(DAO) 호출 (delete)

      • boolean delete (int no)
    • 수정이 잘 되었을 때 메인뷰로 이동

      • 이동 전 전체 Person의 정보 얻어오기
        • 알맞은 모델호출 (selectAll)
      • 정보 (삭제 후 결과) 를 메인뷰 (JTable)에 출력
        • Main뷰 클래스에 출력하는 메소드 정의 ( 예 : displayTable)
      • 삭제가 잘 되지 않았을 때
        • 실패메시지 출력
  6. 유효성검사

    • 사용자가 입력한 데이터를 대상으로!
    • 입력폼, 수정폼에서 빈값에 대한 체크
    • 입력폼, 수정폼에서 나이에 숫자값 체크
    • 삭제번호 입력 -> 숫자값 체크
  7. 기타

    • 입력폼의 TextField 초기화

      • InputForm에 메소드 추가 : void initText(){

                                                 예:  tf_job.setText("");
                                       }
                                        ---> 입력폼 호출시
                                        ---> 입력폼: 취소버튼 클릭시
        • 수정폼의 취소버튼 클릭시 : 처음 출력된 데이터를 다시 출력
        • ---> UpForm에 메소드 추가 : void initText(){
                                                     예:  tf_job.setText("학생");
                              }
        • JTable범위밖의 데이터가 출력될때 ==> 스크롤바의 위치(포커스)를 하단으로 이동.

DAO

package j0611.model.dao;

import java.sql.Statement;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Properties;

import j0610.model.dto.Person;

public class PersonDAO
{
    Connection conn;
    Statement stmt;
    ResultSet rs;

    Properties pro;


public PersonDAO()
{
    try
    {
        pro = new Properties();
            pro.load(new FileReader("conn/conn.properties"));
            Class.forName(pro.getProperty("driver"));
    }catch (Exception e) {
        e.printStackTrace();
    }
}
//public boolean insert(자바빈즈) {}
public boolean insert(Person p) {
//또는public void insert(Person p) {}
  connect();

  try {
    stmt = conn.createStatement();
      String sql="insert into person (no,name,age,job) values "
              //+ "(1, '홍길동' , 13 , '학생' )";
             + "(person_seq.nextval, '"+p.getName()+"' , "+p.getAge()
              +" , '"+p.getJob()+"' )";
      System.out.println("추가SQL==> "+ sql);
      stmt.executeUpdate(sql);//DB에게 입력요청
      return true;

  } catch (SQLException e) {
    e.printStackTrace();
  } finally {
      disconnect();
  }

  return false;

}//insert

//또는 public boolean update(자바빈즈) {}
public boolean update(Person p) {
   connect();    

   try {
    stmt = conn.createStatement();
       System.out.println("수정할 Person>>>"+ p);
       //String sql="update person set age=16, job='학생2' where no=3";
       String sql="update person set age="+p.getAge()+", job='"+p.getJob()+
                   "' where no="+p.getNo();
       System.out.println("수정 SQL>>>"+ sql);
       int t = stmt.executeUpdate(sql);//수정요청!!
       System.out.println("수정된 행의 갯수>>>"+ t);
       if(t==1)//수정이 성공하였다면 
         return true;
   } catch (SQLException e) {
       e.printStackTrace();
   } finally {
       disconnect();
    }

   return false;
}//update
//또는public void update(Person p) {}

//public void delete(프라이머리 키) {}
public boolean delete(int no) {
   connect();

   try {
    stmt = conn.createStatement();
       //String sql="delete from person where no=3";
       String sql="delete from person where no="+no;
       int t = stmt.executeUpdate(sql);//(삭제)실행요청
       if(t==1) {
           return true;
       }
    } catch (SQLException e) {
    e.printStackTrace();
    }finally {
        disconnect();
    }

   return false;
}//delete
//또는 public void delete(int no) {}

//public void select(프라이머리 키) {}
public Person select(int no) {//한 개의 Person정보 얻어오기 --> 수정폼
  connect();

  try {
    stmt = conn.createStatement();
      String sql="select name,age,job from person where no="+no;
      rs = stmt.executeQuery(sql);

      if(rs.next()) {//조회된 행이 있다면
          //DB로 부터 데이터 얻기  : rs.get~()
           //rs.getString("name");
           //rs.getString("age");//"13"
           //rs.getInt("age");// 13
           //rs.getString("job");

          Person p = new Person( no, rs.getString("name"),
                                 rs.getInt("age"),
                                 rs.getString("job")); 
        return p;  
      }//else {
          //특정 번호 없음!!
      //}
   } catch (SQLException e) {
    e.printStackTrace();
   } finally {
       disconnect();
   }

  return null;//번호에 일치하는 Person정보를 얻지 못했을때
}//select


public ArrayList<Person> selectAll() {//모든 Person 정보 얻어오기
  connect();    
  ArrayList<Person> list = new ArrayList<Person>();//(Person)데이터 담는 바구니

  try {
    stmt = conn.createStatement();
      String sql="select no,name,age,job from person order by no";
      rs =stmt.executeQuery(sql);
       while(rs.next()) {
         /*  
          int no= rs.getInt("no");//rs.get~() ==> DB로 부터 데이터 얻기
          String name = rs.getString("name");
          int age = rs.getInt("age");
          String job = rs.getString("job");

          //4개의 변수를 하나의 변수로 저장
          Person p = new Person(no, name, age, job);
                             //p.getNo()
          list.add(p);
             //list.get(0)
             //list.get(0).getNo()
         */

           list.add(new Person(rs.getInt("no"), rs.getString("name"),
                               rs.getInt("age"), rs.getString("job")));
       }
    } catch (SQLException e) {
       e.printStackTrace();
     }finally {
       disconnect();
     }
  return list;    
}//selectAll


private void connect() {
      try {
        conn = DriverManager.getConnection(pro.getProperty("url"),pro);
                                           //pro.getProperty("user"),  
                                           //pro.getProperty("pwd"));

    } catch (SQLException e) {
        e.printStackTrace();
    }   
  }//connect

private void disconnect() {
      try {
            //연결끊기(DB자원반환)
            if(conn != null)conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
}//disconnect


}//PersonDAO

DTO

package j0610.model.dto;

public class Person
{
    // 속성정의
    private int no;
    private String name;
    private int age;
    private String job;

    public Person()
    {

    }

    public Person(int no, String name, int age, String job)
    {
        this.no = no;
        this.name = name;
        this.age = age;
        this.job = job;
    }

    public int getNo()
    {
        return no;
    }

    public void setNo(int no)
    {
        this.no = no;
    }

    public String getName()
    {
        return name;
    }

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

    public int getAge()
    {
        return age;
    }

    public void setAge(int age)
    {
        this.age = age;
    }

    public String getJob()
    {
        return job;
    }

    public void setJob(String job)
    {
        this.job = job;
    }

    @Override
    public String toString()
    {
        return "Person [no=" + no + ", name=" + name + ", age=" + age + ", job=" + job + "]";
    }

//    @Override
//    public String toString() {        
//        return no+": ["+name+","+age+","+job+"]";
//    }

}// class Person

Controller

package j0610.control;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;

import javax.swing.JOptionPane;
import javax.swing.JTable;

import j0610.model.dao.PersonDAO;
import j0610.model.dto.Person;
import j0610.view.InputForm;
import j0610.view.MainView;
import j0610.view.UpForm;

public class Controller implements ActionListener
{
    /*
     * <컨트롤러의 역할>★ - 전체 프로그램에 대한 흐름 제어!! 1. 사용자 요청 분석 (예: 어떤 버튼을 눌렀는지) 2. 사용자 입력 데이터
     * 얻어오기 (예: 입력폼 또는 수정폼을 통해 입력된 데이터) 3. ★모델객체생성(예: PersonDAO) - 메소드호출 - 결과값 (리턴값)
     * 얻기, 저장, 판단 4. 페이지(뷰) 이동 (예: 메인(JTable) ----> 입력폼)
     * 
     * 선택사항) 유효성 검사(valid check) <=== 사용자가 입력한 데이터에 대한!!
     * 
     */

    // 뷰등록
    MainView mainView;
    InputForm form;
    UpForm upForm;

    public Controller()
    {
        // 객체생성
        mainView = new MainView();
        mainView.displayTable(new PersonDAO().selectAll());
        form = new InputForm();
        upForm = new UpForm();

        eventUp();
    }// 생성자

    private void eventUp()
    {// 이벤트 소스 등록
        // 메인뷰
        mainView.bt_insert.addActionListener(this);
        mainView.bt_update.addActionListener(this);
        mainView.bt_del.addActionListener(this);
        mainView.bt_exit.addActionListener(this);

        // 입력폼
        form.bt_submit.addActionListener(this);
        // form == JFrame == Window
        form.addWindowListener(new WindowAdapter()
        {
            // class 무명 extends WindowAdapter{ }
            @Override
            public void windowClosing(WindowEvent e)
            {// 윈도우 프레임 우측상단X버튼 클릭시
                form.setVisible(false);
                mainView.setVisible(true);
            }
        });

        // 수정폼
        upForm.bt_submit.addActionListener(this);
        upForm.addWindowListener(new WindowAdapter()
        {
            // class 무명 extends WindowAdapter{ }
            @Override
            public void windowClosing(WindowEvent e)
            {// 윈도우 프레임 우측상단X버튼 클릭시
                upForm.setVisible(false);
                mainView.setVisible(true);
            }
        });

    }// eventUp

    @Override
    public void actionPerformed(ActionEvent e)
    {
        Object ob = e.getSource();// action이벤트를 발생시킨 이벤트 소스의 주소 얻기

        if (ob == mainView.bt_insert)
        {// 1.메인뷰 : 입력버튼 ==> 분석: 입력폼요청!!
            // 4.메인뷰 ---> 입력폼 이동!!
            mainView.setVisible(false);
            form.setVisible(true);
        } else if (ob == form.bt_submit)
        {// 1.입력폼: 입력버튼 ==> 분석: DB입력 요청!!

            // 2. 입력데이터 얻기
            String name = form.tf_name.getText();
            String age = form.tf_age.getText();
            String job = form.tf_job.getText();

            // 세개의 변수를 p변수로 정의하기(한개의 변수명으로 정의하기)
            Person p = new Person(0, name, Integer.parseInt(age), job);

            // 3. 모델 객체생성
            PersonDAO dao = new PersonDAO();
            if (dao.insert(p))
            {// 입력성공
                // 메인뷰에 출력할 (DB로부터) 전체 데이터 얻기
                ArrayList<Person> list = dao.selectAll();
                // Person []perArr = (Person[]) list.toArray();
                mainView.displayTable(list);

                // 입력폼 ----> 메인뷰
                form.setVisible(false);
                mainView.setVisible(true);
            }
        } else if (ob == mainView.bt_update)
        {
            // 1. 메인뷰: 수정버튼클릭시 ---> 수정폼 요청

            int row = mainView.table.getSelectedRow();

            if (row == -1)
            {// 선택된 행이 없다면
                // JOptionPane.showMessageDialog(mainView, "수정할 행을 선택!!");
                mainView.showMsg("수정할 행을 선택!!");
                return;
            }

            // System.out.println("선택된 행 인덱스>>>"+ row);
            // 2.
            Object value = mainView.table.getValueAt(row, 0);
            // 0 column: 번호표현
            // System.out.println("선택된 번호>>>"+ value);
            int no = Integer.parseInt(value.toString());
            // 3 <---- "3"

            upForm.upNo = no;// 수정폼 멤버에 '번호'저장

            // 3.
            PersonDAO dao = new PersonDAO();
            Person p = dao.select(no);
            // DB조회값 ----> 수정폼 전달
            /*
             * p.getName() upForm.tf_name.setText(); p.getAge() upForm.tf_name.setText();
             * p.getJob() upForm.tf_name.setText();
             */
            upForm.tf_name.setText(p.getName());
            upForm.tf_age.setText(p.getAge() + "");
            // tf_age.setText(13); (X) tf_age.setText("13"); (O)
            upForm.tf_job.setText(p.getJob());

            // 4.
            mainView.setVisible(false);
            upForm.setVisible(true);
        } else if (ob == upForm.bt_submit)
        {
            // 1. 수정폼: 수정버튼 클릭시 ----> DB수정 요청시

            // 2.
            String age = upForm.tf_age.getText();
            String job = upForm.tf_job.getText();

            // upForm.upNo//수정폼 멤버에 저장된 '번호' 찾기

            Person p = new Person();// 기본생성자 : (no=0, name=null, age=0, job=null)
            p.setAge(Integer.parseInt(age));// : (no=0, name=null, age=20, job=null)
            p.setJob(job);// : (no=0, name=null, age=20, job="장군")
            p.setNo(upForm.upNo);// : (no=4, name=null, age=20, job="장군")
            // Person p = new Person(upForm.upNo, null,Integer.parseInt(age), job);//오버로딩
            // 생성자

            // 3.
            PersonDAO dao = new PersonDAO();
            if (dao.update(p))
            {// 수정이 잘되었다면 ---> JTable에 수정내용을 반영
                mainView.displayTable(dao.selectAll());// 내용 갱신

                upForm.setVisible(false);
                mainView.setVisible(true);
            }

        } else if (ob == mainView.bt_del)
        {
            // 1.메인폼 : 삭제버튼 클릭시 ----> DB삭제 요청시

            // 2.(삭제할 번호)데이터 얻기
            String no = mainView.showInput("삭제할 번호:");

            // 3.
            PersonDAO dao = new PersonDAO();
            if (dao.delete(Integer.parseInt(no)))
            {
                mainView.showMsg("삭제성공!!");
                mainView.displayTable(dao.selectAll());
            } else
            {
                mainView.showMsg("삭제실패!!");
            }

        } else if (ob == mainView.bt_exit)
        {
            System.exit(0);
        }

    }// actionPerformed

    public static void main(String[] args)
    {
        new Controller();
    }

}
궁금상자 
DTO VO
    두개 이상의 속성을 묶어주는 역할에서는 동일함, 
    DB에서 묶어주는것 VO
    뷰에서 항목들 모아서 전달하는것이 DTO
    정도로 어제 했갈렸던것을 정리!

+ Recent posts