YeaLow
article thumbnail
Published 2022. 9. 29. 14:31
Java 고객관리 프로그램 만들기 Java

인터넷에서 mybatis, mysql-connector 다운로드

settings -> org.eclipse.jdt.core.prefs 세팅

eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.8

src /CustomerGUI.java 전체적인 레이아웃 세팅 및 조건식 만들기

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
import java.util.regex.Pattern;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.EtchedBorder;
import javax.swing.table.DefaultTableModel;

public class CustomerGUI {
	JFrame f;
	// North 영역 (조회조건, 버튼)
	private JTextField sName, sAge, sJumin;
	private JButton btnSelect;
	// Center 영역
	private JTable table;
	// West 영역
	private JTextField tfIdx, tfName, tfAge, tfEmail, tfJumin;
	// South 영역
	private JButton btnInsert, btnDelete;
	
	public CustomerGUI() {
		showFrame();
	}
	
	public void showFrame() {
		f = new JFrame("고객 관리 프로그램");
		f.setBounds(500, 300, 900, 300);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// -------- North 영역 (조회조건) ----------
		JPanel pNorth = new JPanel();
		f.add(pNorth, BorderLayout.NORTH);
		pNorth.setBorder(new EtchedBorder(EtchedBorder.RAISED, null, null));
		pNorth.setLayout(new GridLayout(0, 4, 0, 0));
		
		// 조회조건 sName 입력 패널
		JPanel panelName = new JPanel();
		pNorth.add(panelName);
		
		panelName.add(new JLabel("이름"));
		sName = new JTextField(10);
		panelName.add(sName);
		sName.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				if(e.getKeyCode() == KeyEvent.VK_ENTER) select(); 
			}
		});
		
		// 조회조건 sAge 입력 패널
		JPanel panelAge = new JPanel();
		pNorth.add(panelAge);
		
		panelAge.add(new JLabel("나이"));
		sAge = new JTextField(10);
		panelAge.add(sAge);
		
		sAge.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				if(e.getKeyCode() == KeyEvent.VK_ENTER) select(); 
			}
		});
		
		// 조회조건 sJumin 입력 패널
		JPanel panelJumin = new JPanel();
		pNorth.add(panelJumin);
		
		panelJumin.add(new JLabel("주민번호"));
		sJumin = new JTextField(10);
		panelJumin.add(sJumin);
		
		btnSelect = new JButton("조회");
		pNorth.add(btnSelect);
		
		sJumin.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				if(e.getKeyCode() == KeyEvent.VK_ENTER) select(); 
			}
		});
		
		// -------- West 영역 (회원 정보 입력 영역) ----------
		JPanel pWest = new JPanel(new GridLayout(5, 0, 0, 0));
		f.add(pWest, BorderLayout.WEST);
		
		// 번호(IDX) 패널
		JPanel pIdx = new JPanel(new FlowLayout(FlowLayout.RIGHT));
		pWest.add(pIdx);
		pIdx.add(new JLabel("번 호"));
		tfIdx = new JTextField(10);
		tfIdx.setEditable(false); // 번호 입력 불가능하도록 잠금
		pIdx.add(tfIdx);
		
		// 이름(NAME) 패널
		JPanel pName = new JPanel(new FlowLayout(FlowLayout.RIGHT));
		pWest.add(pName);
		pName.add(new JLabel("이 름"));
		tfName = new JTextField(10);
		pName.add(tfName);
		
		// 나이(AGE) 패널
		JPanel pAge = new JPanel(new FlowLayout(FlowLayout.RIGHT));
		pWest.add(pAge);
		pAge.add(new JLabel("나 이"));
		tfAge = new JTextField(10);
		pAge.add(tfAge);
		
		// 이메일(EMAIL) 패널
		JPanel pEmail = new JPanel(new FlowLayout(FlowLayout.RIGHT));
		pWest.add(pEmail);
		pEmail.add(new JLabel("E-Mail"));
		tfEmail = new JTextField(10);
		pEmail.add(tfEmail);
		
		// 주민번호(JUMIN) 패널
		JPanel pJumin = new JPanel(new FlowLayout(FlowLayout.RIGHT));
		pWest.add(pJumin);
		pJumin.add(new JLabel("주민번호"));
		tfJumin = new JTextField(10);
		pJumin.add(tfJumin);
		
		// ------------------- CENTER 영역 (회원 정보 표시 영역) ---------------------
		// 스크롤바 기능 추가를 위해 JScrollPane 객체 생성 후
		// 프레임에 추가한뒤, JTable 객체는 JScrollPane에 추가
		JScrollPane scrollPane = new JScrollPane();
		f.add(scrollPane);
		
		table = new JTable();
		scrollPane.setViewportView(table);
		
		// 컬럼 제목을 표시하기 위해 DefaultTableModel 객체 생성
		// 배열을 사용하여 제목을 생성한 뒤 Model 객체에 추가
		String[] columnNames = {"번 호", "이 름", "나 이", "E-Mail", "주민번호"};
		DefaultTableModel dtm = new DefaultTableModel(columnNames, 0);
		table.setModel(dtm);
		
		// ------------------- SOUTH 영역 (버튼 영역) ---------------------
		JPanel pSouth = new JPanel();
		f.add(pSouth, BorderLayout.SOUTH);
		
		btnInsert = new JButton("회원추가");
		btnDelete = new JButton("회원삭제");
		
		pSouth.add(btnInsert);
		pSouth.add(btnDelete);
		
		// 조회 버튼 클릭 시 select() 메서드 호출
		btnSelect.addActionListener(e -> select());
		// 회원 추가 버튼 클릭 시 insert() 메서드 호출
		btnInsert.addActionListener(e -> insert());
		// 회원 삭제 버튼 클릭 시 delete() 메서드 호출
		btnDelete.addActionListener(e -> delete());
		f.setVisible(true);
	}
	
	public void select() {
		
		CustomerDAO dao = new CustomerDAO();
		Map<String, String> param = new HashMap<String, String>();
		param.put("NAME", sName.getText());
		param.put("AGE", sAge.getText());
		param.put("JUMIN", sJumin.getText());
		
		
		
				
				
				
		Vector<Vector> data = dao.select(param);
		
		DefaultTableModel dtm = (DefaultTableModel)table.getModel();
		
		// 현재 표시된 회원목록 초기화
		dtm.setRowCount(0);
		
		for(Vector rowData : data) {
			dtm.addRow(rowData);
		}
		
	}
	// 유효성
	public boolean validCheck() {
		// 이름 입력 확인
//		tfName.getText().equals("")
		if(tfName.getText().length() == 0) {
			// alert
			JOptionPane.showMessageDialog(
					f, "이름 입력 필수!", "입력 오류!", JOptionPane.WARNING_MESSAGE);
			return false;
		} 
		// 나이 입력 확인
		if(tfAge.getText().length() == 0 ) {
			JOptionPane.showMessageDialog(
					f, "나이 입력 필수!", "입력 오류!", JOptionPane.WARNING_MESSAGE);
			return false;
		}
		// 이메일 입력 확인
		if(tfEmail.getText().length() == 0 ) {
			JOptionPane.showMessageDialog(
					f, "이메일 입력 필수!", "입력 오류!", JOptionPane.WARNING_MESSAGE);
			return false;
		}
		// 주민번호 입력 확인
		if(tfJumin.getText().length() == 0 ) {
			JOptionPane.showMessageDialog(
					f, "주민번호 입력 필수!", "입력 오류!", JOptionPane.WARNING_MESSAGE);
			return false;
		}
		
		// 만약, 입력 항목에 대한 양식 체크시 => 정규 표현식 활용
		// ex) 나이 입력에 대한 숫자 양식 체크
		String pattern = "^[0-9]{1,3}$"; // 숫자 1~3자리 체크하는 패턴
		if(!Pattern.matches(pattern, tfAge.getText())) {
			JOptionPane.showMessageDialog(
					f, "나이 숫자 3자리 이하 입력 필수!", "입력 오류!", JOptionPane.WARNING_MESSAGE);
			return false;
		}
		
		return true;
	}
	
	// 회원 추가
	public void insert() {
		
		// 유효성 체크 
		// => 유효성 체크 후 insert할 수 없는 상황일때 insert() 메서드 종료
		if(!validCheck()) return; 
			
		String name = tfName.getText();
		String age = tfAge.getText();
		String email = tfEmail.getText();
		String jumin = tfJumin.getText();
	
		CustomerDTO dto = new CustomerDTO("", name, age, email, jumin);
		CustomerDAO dao = new CustomerDAO();
		
		boolean isSuccess = dao.insert(dto);
		
		if(isSuccess) {	// 작업 성공시
			JOptionPane.showMessageDialog(
					f, "회원 추가 성공", "성공", JOptionPane.INFORMATION_MESSAGE);
			select();
			
		} else { // 작업실패시
			JOptionPane.showMessageDialog(
					f, "회원 추가 실패", "실패", JOptionPane.ERROR_MESSAGE);
		}
		
	}
	// 삭제
	public void delete() {
		// InputDialog를 사용하여 삭제할 회원번호(idx)를 입력받아
		// CustomerDAO의 delete()메서드에 전달하여 회원 삭제 작업 요청
		// => 삭제 결과를 boolean  타입으로 리턴받아
		// 		삭제 성공/실패를 MessageDialog 로 출력
		// => 삭제 성공일 경우 회원 목옥 갱신
		String idx = JOptionPane.showInputDialog(f,"삭제할 회원 번호를 입력하세요.");
		
		System.out.println(idx);
		
		// 취소, X => 메서드 종료
		if(idx == null) return;
		
		// 입력 번호가 없을 경우 (널스트링 또는 길이 0) 오류 메세지 출력
		if(idx.length() == 0) {
			JOptionPane.showMessageDialog(f, "번호 입력 필수!", "입력 오류!", JOptionPane.WARNING_MESSAGE);
			return;
		}
		
		// IDX값이 1부터 증가되므로 0 데이터도 오류 메세지 출력
		if(idx.equals("0")) {
			JOptionPane.showMessageDialog(f, "번호는 1이상 입력!", "입력 오류!", JOptionPane.WARNING_MESSAGE);
			return;
		}
		
		
		CustomerDAO dao = new CustomerDAO();
		boolean isDeleteSuccess = dao.delete(idx);
		
		if(isDeleteSuccess) {
			JOptionPane.showMessageDialog(f, "회원 삭제 성공", "성공", JOptionPane.INFORMATION_MESSAGE);
			// 회원목록 갱신 => select() 메서드 호출
			select();
		} else {
			JOptionPane.showMessageDialog(f, "회원 삭제 실패", "실패", JOptionPane.ERROR_MESSAGE);
		}
		
	}
	
	public static void main(String[] args) {
		new CustomerGUI();
	}

}

src/CustomerDTO.java 생성

public class CustomerDTO {
	private String idx;
	private String nm;
	private String age;
	private String email;
	private String jumin;
	
	public CustomerDTO() {}

	// Alt + Shift + S -> O
	public CustomerDTO(String idx, String nm, String age, String email, String jumin) {
		this.idx = idx;
		this.nm = nm;
		this.age = age;
		this.email = email;
		this.jumin = jumin;
	}

	// Getter / Setter 정의 (Alt + Shift + S -> R)
	public String getIdx() {
		return idx;
	}

	public void setIdx(String idx) {
		this.idx = idx;
	}

	public String getNm() {
		return nm;
	}

	public void setNm(String nm) {
		this.nm = nm;
	}

	public String getAge() {
		return age;
	}

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

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getJumin() {
		return jumin;
	}

	public void setJumin(String jumin) {
		this.jumin = jumin;
	}

	// 데이터 확인용 toString 오버라이딩 (Alt + Shift + S -> S)
	@Override
	public String toString() {
		return "CustomerDTO [idx=" + idx + ", nm=" + nm + ", age=" + age + ", email=" + email + ", jumin=" + jumin
				+ "]";
	}
	
}

src/CustomerDAO.java

import java.util.List;
import java.util.Map;
import java.util.Vector;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import sql.SqlMapClient;

public class CustomerDAO {

	private SqlSessionFactory sqlSessionFactory = SqlMapClient.getSqlSession();
	
	// 조회
	public Vector select(Map<String,String> param) {
		SqlSession session = sqlSessionFactory.openSession();
		List<CustomerDTO> data = session.selectList("Customer.select", param); // namespace.id
		
		Vector rData = new Vector();	// 최종적으로 return 할 데이터
		
		for(CustomerDTO dto : data) {
			Vector rowData = new Vector();
			
			rowData.add(dto.getIdx());
			rowData.add(dto.getNm());
			rowData.add(dto.getAge());
			rowData.add(dto.getEmail());
			rowData.add(dto.getJumin());
			
			rData.add(rowData);
		}
		
		return rData;
		
	}
	
	// 추가
	public boolean insert(CustomerDTO dto) {
		SqlSession session = sqlSessionFactory.openSession();
		int insertCnt = session.insert("Customer.insert", dto); // namespace.id, parameter (DTO)
		session.commit();
		session.close();
		return insertCnt > 0 ? true : false;
	}
	
	// 삭제
	public boolean delete(String idx) {
		SqlSession session = sqlSessionFactory.openSession();
		int deleteCnt = session.delete("Customer.delete", idx);
		session.commit();
		session.close();
		return deleteCnt > 0? true :false;
		
	}
	
	
	
	
}

 

src/sql/sql.xml

사실 String 처리로 되어있어서 'name'이 찍어야 나온다 

다음에는 이런 처리까지 마무리 하여 올리도록 노력 하겠다

profile

YeaLow

@YeaLow

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!