[java] 즉석복권 프로그램 #1

yed·2021년 8월 20일

memberVO

  • 회원번호, 아이디, 비밀번호, 전화번호, 계좌, 포인트

memberDAO

  • public abstract int insert(MemberVO vo);
    회원정보 등록-1명의 데이터 입력받고 저장결과 반환

  • public abstract MemberVO select(String id, String pw);
    회원 정보 조회-전체 회원 중에 입력된 id와 pw가 일치한 회원의 정보를 반환(로그인 시 사용)

  • public abstract MemberVO select(String id);
    회원아이디로 조회-전체 회원 데이터 중에 입력된 id가 일치한 회원의 정보를 반환(비밀번호 변경 시 사용)

  • public abstract int updatePw(String id, String before, String after);
    회원 비밀번호 변경-아이디와 일치한 회원의 비밀번호를 입력된 데이터로 수정하고 저장결과 반환

  • public abstract int updateInfo(String id, String phone, String account);
    회원 정보 수정-아이디와 일치한 회원의 전화번호와 계좌번호를 입력된 데이터로 수정하고 저장결과 반환

  • public abstract int delete(String id, String pw);
    회원정보 삭제(탈퇴)-아이디와 비밀번호를 입력받아 일치한 회원의 데이터를 삭제하고 저장결과 반환

  • public abstract int savePoint(int member_no, int before, int point);
    특정 회원의 포인트에 포인트를 적립(+)해 데이터 수정 후 결과 반환

  • public abstract int sendPoint(int member_no, int before, int point);
    특정 회원의 포인트에서 특정 포인트만큼 송금(-)해 데이터 수정 후 결과 반환


회원가입

private int memberSignUp() {
	String id=txtid.getText();
	String pw=txtpw.getText();
	String phone=txtphone.getText();
	String account=txtaccount.getText();
		
	//하나라도 입력되지 않았을 경우
	if(id.equals("")||pw.equals("")||phone.equals("")||account.equals("")) {
		txtAreaLog.setText(">>회원 정보를 입력하세요.");
		return -1;
	}
	MemberVO vo=new MemberVO(0, id, pw, phone, account, 0);
	//시퀀스 0(db에서 카운트), 포인트는 0으로 시작
	int result=dao.insert(vo);
		
	if(result==1) {
		txtAreaLog.setText(">>회원가입 성공!");
	}else {
		txtAreaLog.setText(">>회원정보 등록에 실패했습니다.");
		return -1;
	}	
	return 0;
}//end memberSignUp()

로그인

//새로운 프레임에서 복권 및 회원정보 진행
String id=txtLoginId.getText();
String pw=txtLoginPw.getText();

if(id.equals("")||pw.equals("")) {
	txtAreaLog.setText(">>아이디와 비밀번호를 입력하세요.");
	return;
}

//member테이블과 정보가 id,pw와 일치한 데이터가 있으면
MemberVO vo=dao.select(id, pw);
			
if(vo!=null) {
	PlayFrame lottoFrame=new PlayFrame(vo);//로그인한 회원정보 전달
	lottoFrame.setVisible(true);
				
	//lotto프레임 실행되면 메인으로 복귀(로그인 초기화)
	frame.getContentPane().remove(currentComponent);
	frame.revalidate();
	frame.repaint();
	txtAreaLog.setText("");
	frame.getContentPane().add(mainPanel, BorderLayout.CENTER);
	currentComponent=mainPanel;		
}else {
	txtAreaLog.setText(">>존재하지 않는 회원 정보입니다.");
	return;
}

마이페이지

public MemberVO select(String id) {
	MemberVO vo=null;
	Connection conn=null;
	PreparedStatement pstmt=null;
	ResultSet rs=null;
	
	try {
		conn=DriverManager.getConnection(URL, USER, PASSWORD);
		pstmt=conn.prepareStatement(SQL_SELECT_ID);
		pstmt.setString(1, id);
		
		rs=pstmt.executeQuery();
		
		if(rs.next()) {
			int no=rs.getInt(COL_MEMBER_NO);
			String member_id=rs.getString(COL_ID);
			String member_pw=rs.getString(COL_PW);
			String phone=rs.getString(COL_PHONE);
			String account=rs.getString(COL_ACCOUNT);
			int point=rs.getInt(COL_POINT);
				
			vo=new MemberVO(no, member_id, member_pw, phone, account, point);
			System.out.println(TABLE_NAME+"테이블에서 1행을 조회했습니다.");
		}
			
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		try {
			rs.close();
			pstmt.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	return vo;
}

DecimalFormat

숫자에 형식(format)을 만들어주는 클래스.
DecimalFormat df = new DecimalFormat("###,###");
123,456처럼 3자리마다 ,를 찍어주는 형식을 지정한다.
df.format()으로 String 변수에 넣으면 됨

회원정보 변경

private int updatePassword(MemberVO vo) {
	String beforePw=txtBeforePw.getText();
	String afterPw=txtAfterPw.getText();
		
	if(beforePw.equals("")||afterPw.equals("")) {
		txtAreaLog.setText(">>현재 비밀번호 또는 변경할 비밀번호를 입력하세요.");
		return -1;
	}
	
	if(beforePw.equals(vo.getMember_pw())) {
		//현재비밀번호와 입력된 현재비밀번호가 일치하면
		int result=dao.updatePw(vo.getMember_id(), beforePw, afterPw);
		if(result==1) {
			txtAreaLog.setText(">>비밀번호 변경 성공!");
		}else {
			txtAreaLog.setText(">>비밀번호 변경에 실패했습니다.");
			return -1;
		}
	}else {
		txtAreaLog.setText(">현재 비밀번호가 틀렸습니다.");
		return -1;
	}
	
	return 0;
}//end updatePassword()
private int updateMemberInfo(MemberVO vo) {
	String phone=txtUpdatePhone.getText();
	String account=txtUpdateAccount.getText();
	
	if(phone.equals("")||account.equals("")) {
		txtAreaLog.setText(">>변경할 전화번호와 계좌번호를 입력하세요.");
		return -1;
	}
	int result=dao.updateInfo(vo.getMember_id(), phone, account);
	if(result==1) {
		txtAreaLog.setText(">>회원정보 변경 성공!");
	}else {
		txtAreaLog.setText(">>회원정보 변경에 실패했습니다.");
		return -1;
	}
	return 0;
}//end updateMemberInfo

회원 탈퇴

private int deleteMemberInfo(MemberVO vo) {
	//입력받은 id와 pw가 테이블에 존재한다면 쿼리 실행 후 종료
	String id=txtId.getText();
	String pw=txtPassword.getText();
		
	if(id.equals("")||pw.equals("")) {
		lblLog.setText("아이디와 비밀번호를 입력하세요.  ");
		return -1;
	}
		
	if(id.equals(vo.getMember_id())&&pw.equals(vo.getMember_pw())) {
		int result=dao.delete(id, pw);
		if(result!=1) {
			lblLog.setText("회원정보 삭제에 실패했습니다.  ");
			return -1;
		}
	}else {
		lblLog.setText("아이디 혹은 비밀번호가 틀렸습니다.  ");
		return -1;
	}
	
	return 0;
}

System.exit(0); 모든창 종료
dispose(); 현재창만 종료

integrity constraint (SCOTT.MEMBER_FK) violated - child record found
회원정보를 삭제하려고 하니 에러가 뜬다. 회원번호를 외래키로 가지고 있는 테이블때문인데 회원 계정이 삭제되면 해당 회원이 사용한 데이터도 삭제되어야함.
해당 외래키 컬럼에 제약조건 ON DELETE CASCADE ENABLE를 추가해서 종속된 데이터까지 삭제되게 해주기.

당첨금 수령

private int sendToPoint(MemberVO vo) {
	String temp_p=txtSendPoint.getText();
	String account=txtAccount.getText();	
	int point=0;
	
	if(temp_p.equals("") || account.equals("")) {
		lblLog.setText("송금할 포인트와 계좌번호를 입력하세요.  ");
		return -1;
	}
	
	try {
		point=Integer.parseInt(temp_p);
		if(point<=0) {
			lblLog.setText("포인트는 1P 이상부터 송금할 수 있습니다.  ");
			return -1;
		}
	} catch (NumberFormatException e) {
		lblLog.setText("포인트는 0 이상의 정수만 입력하세요.  ");
		return -1;
	}
	
	if(vo.getMember_account().equals(txtAccount.getText())) { 
		int result=dao.sendPoint(vo.getMember_no(), vo.getMember_point(), point);
		if(result==0) {
			lblLog.setText("잔액 부족!!  ");
			return -1;
		}else if(result!=1) {
			lblLog.setText("당첨금 수령에 실패했습니다.  ");
			return -1;
		}
	}else {
		lblLog.setText("기존 계좌번호를 입력해주세요.  ");
		return -1;
	}
	return 0;
}

변수를 다른 프레임(or 창)으로 넘겨주는 방법

나같은 경우 센터패널만 바뀌고 탑패널과 바텀패널은 고정되는 UI다. 바뀌는 센터패널에서도 메인에서 만들어진 탑패널과 바텀패널을 사용하고 싶었음.

1. getter/setter 메소드 이용하기

  • 넘겨줄 변수와 같은 변수를 받을 프레임에 전역변수로 선언한다.
    private JTextArea txtAreaLog;
  • 객체를 받아오는 setter 메소드를 만든다.
public void setTextArea(JTextArea txtAreaLog) {
	this.txtAreaLog = txtAreaLog;
}
  • 새로운 프레임 인스턴스를 생성하고나서 set메소드로 객체를 넘겨준다.
    ((UpdatePane) updatePanel).setTextArea(txtAreaLog);
    클래스가 JPanel을 상속받고 있어서 메소드를 인식하지 못해 형변환을 해주었다.

2. 생성자 이용하기

생성자에서 txtAreaLog를 매개변수로 받아오고 인스턴스 생성 시 변수를 넘겨준다. 그리고 생성자안에 this.txtAreaLog = txtAreaLog;를 사용하면 됨.

profile
6개월 국비과정 기록하기

0개의 댓글