JAVA 회원가입부터 로그인까지 SWING 예제
이전에 작성한 https://zzarungna.com/1275(로그인), https://zzarungna.com/1276(회원가입) 소스를 그대로 가져와 합치는 예제를 만들어 보았습니다.
프로그램은 자바 프로젝트 Hello라는 이름으로 만들었으며 회원가입은 SignUp.java, 로그인 구현은 SwingLogin.java로 만들었습니다. 먼저 이전에 작성했던 소스를 그대로 가져와 확장하는 방식으로 회원가입과 로그인 기능을 연결했습니다.
실행된 프로그램 화면에서 회원가입 버튼을 추가했으며 레이아웃 구조를 변경하고 싶지 않아 비밀번호 찾기 버튼까지 추가했습니다.
회원가입 버튼을 누르게 되면 이전에 작성한 회원가입 창이 표시되게 되며 이곳에 iloveyou라는 계정으로 가입을 진행해 보겠습니다.
회원가입 버튼을 통해 회원 가입을 완료합니다.
회원 가입을 하게 되면 텍스트 파일에 계정과 비밀번호만 텍스트 파일에 저장되도록 작성 하였으며 경로는 C 드라이브 java_member 폴더에 member.txt 파일을 하나 만들어 놓으시면 됩니다. 소스 상 파일이 있는지 체크하여 없으면 폴더와 파일을 만들면 되는데 소스에 해당 내용을 추가하지 않았기에 폴더와 파일을 직접 만들어야 합니다.
프로그램상 회원가입을 하게 되면 c드라이브 java_member 폴더에 member.txt 파일에 회원 가입 시 작성한 아이디와 비밀번호가 텍스트 파일에 기록되게 됩니다.
계정에 18good이 들어간 이유가.. split("\\|"); 문자를 자를 때 역슬러쉬가 두 개 들어가야 스플릿 함수가 작동해 조금 헤매서 그런 것이니 이해해 주세요.
방금 가입한 아이디로 로그인을 시도해 보시면 가입한 아이디와 비번이 틀린 경우 로그인 실패, 성공한 경우 로그인 성공이 표시되게 됩니다.
SwingLogin.java
package test;
// test 패키지 지우시고 패키지 만드신거 추가 하시면 됩니다.
import java.awt.*;
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.*;
public class SwingLogin extends JFrame{
private JPanel loginPanel = new JPanel(new GridLayout(4,4));
private JLabel idLabel = new JLabel("아이디 ");
private JLabel pwLabel = new JLabel("비밀번호 ");
private JTextField idText = new JTextField();
private JPasswordField pwText = new JPasswordField();
private JButton loginBtn = new JButton("로그인");
private JButton idSearchBtn = new JButton("아이디 찾기");
private JButton pwSearchBtn = new JButton("비밀번호 찾기");
private JButton memberbtn = new JButton("회원가입");
public SwingLogin() {
super("로그인 창!");
this.setContentPane(loginPanel);
loginPanel.add(idLabel);
loginPanel.add(pwLabel);
loginPanel.add(idText);
loginPanel.add(pwText);
loginPanel.add(loginBtn);
loginPanel.add(idSearchBtn);
loginPanel.add(pwSearchBtn);
loginPanel.add(memberbtn);
//라벨 가운데 정렬
idLabel.setHorizontalAlignment(NORMAL);
pwLabel.setHorizontalAlignment(NORMAL);
//현재 프레임 창 가운데 정렬 setSize를 먼저 해주어야 정상적으로 프레임이 가운데 정렬이 됨!
setSize(350,150);
this.setLocationRelativeTo(null);
this.setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//로그인 버튼을 눌렀을때
loginBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String id = idText.getText().trim();
String pw = pwText.getText().trim();
String login = "";
if(id.length()==0 || pw.length()==0) {
JOptionPane.showMessageDialog(null, "아이디 또는 비밀번호를 입력 하셔야 됩니다.", "아이디나 비번을 입력!", JOptionPane.DEFAULT_OPTION);
return;
}
//텍스트 파일에 저장된 모든 글자를 가져온다 | 구분자로 아이디와 비번이 맞는게 있다면 로그인 시켜주면 된다.
try{
BufferedReader reader = new BufferedReader(new FileReader("C:\\java_member\\member.txt"));
String str;
ArrayList<String> txtmember = new ArrayList<>();
while ((str = reader.readLine()) != null) {
txtmember.add(str);
}
reader.close();
//memberlist에 아이디와 비밀번호 저장하기
HashMap<String,String> memberlist = new HashMap<>();
for(int i=0; i<txtmember.size(); i++) {
// | 구분자 기준으로 잘라난 텍스트를 memberlist에 넣어주기.
String[] tempresult = txtmember.get(i).toString().split("\\|");
memberlist.put(tempresult[0],tempresult[1]);
}
//txt 파일에서 가져온 아이디 비번과 입력한 아이디 비번이 맞는지 확인
for ( String key : memberlist.keySet() ) {
if(id.equals(key.trim()) && pw.equals(memberlist.get(key))) {
//로그인성공!
login = "성공";
}
}
}catch(Exception errmsg){
errmsg.printStackTrace();
}
if(login.equals("성공")) {
JOptionPane.showMessageDialog(null, "로그인 성공", "로그인 확인!", JOptionPane.DEFAULT_OPTION);
return;
}else {
JOptionPane.showMessageDialog(null, "로그인 실패", "계정 정보를 확인해 주세요.", JOptionPane.DEFAULT_OPTION);
}
}
});
//아이디 비밀번호 찾기 버튼을 눌렀을때
idSearchBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "아이디 비번 찾기 기능~~", "아이디/비밀번호 찾기", JOptionPane.DEFAULT_OPTION);
}
});
//회원가입 버튼을 눌렀을때
memberbtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SignUp signup = new SignUp();
signup.setVisible(true);
}
});
}
public static void main(String[] args) {
new SwingLogin();
}
}
SignUp.java
package test; //패키지 만드신거로 바꾸시면 됩니다.
import java.awt.*;
import java.awt.event.*;
import java.io.BufferedWriter;
import java.io.FileWriter;
import javax.swing.*;
public class SignUp extends JDialog{
private JPanel signUpPanel = new JPanel(new GridLayout(11, 0));
private JTextField idText = new JTextField("아이디");
private JPasswordField pwText = new JPasswordField();
private JPasswordField pwCheckText = new JPasswordField();
private JTextField nameText = new JTextField("이름");
private JTextField birthYearText = new JTextField("생일 년도");
private String[] birthMonthContent = {"생일 월","1","2","3","4","5","6","7","8","9","10","11","12"};
private JComboBox<String> birthMonthList = new JComboBox<>(birthMonthContent);
private JTextField birthDayText = new JTextField("생일 일자");
private JTextField phoneNumberText = new JTextField("핸드폰 번호");
private JButton signUpbtn = new JButton("회원가입");
private JLabel pwlabel = new JLabel("비밀번호");
private JLabel pwChecklabel = new JLabel("비밀번호 확인");
private boolean membershipProgress = false;
public SignUp() {
this.setTitle("회원가입");
this.signUpPanel.add(idText);
this.signUpPanel.add(pwlabel);
this.signUpPanel.add(pwText);
this.signUpPanel.add(pwChecklabel);
this.signUpPanel.add(pwCheckText);
this.signUpPanel.add(nameText);
this.signUpPanel.add(birthYearText);
this.signUpPanel.add(birthMonthList);
this.signUpPanel.add(birthDayText);
this.signUpPanel.add(phoneNumberText);
this.signUpPanel.add(signUpbtn);
this.setContentPane(signUpPanel);
this.setSize(300,500);
this.setLocationRelativeTo(null);
FocusEvent();
checkValue();
}
//텍스트 필드에 있는 값을 체크하고 지우기 위한 메소드
private void FocusEvent() {
idText.addFocusListener(new FocusListener() {
public void focusLost(FocusEvent e) {
if(idText.getText().trim().length()==0) {
idText.setText("아이디");
}
}
public void focusGained(FocusEvent e) {
if(idText.getText().trim().equals("아이디")) {
idText.setText("");
}
}
});
nameText.addFocusListener(new FocusListener() {
public void focusLost(FocusEvent e) {
if(nameText.getText().trim().length()==0) {
nameText.setText("이름");
}
}
public void focusGained(FocusEvent e) {
if(nameText.getText().trim().equals("이름")) {
nameText.setText("");
}
}
});
birthYearText.addFocusListener(new FocusListener() {
public void focusLost(FocusEvent e) {
if(birthYearText.getText().trim().length()==0) {
birthYearText.setText("생일 년도");
}
}
public void focusGained(FocusEvent e) {
if(birthYearText.getText().trim().equals("생일 년도")) {
birthYearText.setText("");
}
}
});
birthDayText.addFocusListener(new FocusListener() {
public void focusLost(FocusEvent e) {
if(birthDayText.getText().trim().length()==0) {
birthDayText.setText("생일 일자");
}
}
public void focusGained(FocusEvent e) {
if(birthDayText.getText().trim().equals("생일 일자")) {
birthDayText.setText("");
}
}
});
phoneNumberText.addFocusListener(new FocusListener() {
public void focusLost(FocusEvent e) {
if(phoneNumberText.getText().trim().length()==0) {
phoneNumberText.setText("핸드폰 번호");
}
}
public void focusGained(FocusEvent e) {
if(phoneNumberText.getText().trim().equals("핸드폰 번호")) {
phoneNumberText.setText("");
}
}
});
}
//회원 가입할때 모든 값이 입력되었는지 체크하기 위한 메소드
private void checkValue(){
signUpbtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(idText.getText().trim().length()==0 || idText.getText().trim().equals("아이디")) {
JOptionPane.showMessageDialog(null, "아이디를 입력해 주세요.", "아이디 입력", JOptionPane.WARNING_MESSAGE);
idText.grabFocus();
return;
}
if(pwText.getText().trim().length()==0) {
JOptionPane.showMessageDialog(null, "비밀번호를 입력해 주세요.", "비밀번호 입력", JOptionPane.WARNING_MESSAGE);
pwText.grabFocus();
return;
}
if(pwCheckText.getText().trim().length()==0) {
JOptionPane.showMessageDialog(null, "비밀번호 확인을 입력해 주세요.", "비밀번호 확인 입력", JOptionPane.WARNING_MESSAGE);
pwCheckText.grabFocus();
return;
}
if(!(pwText.getText().trim().equals(pwCheckText.getText().trim()))) {
JOptionPane.showMessageDialog(null, "비밀번호가 같지 않습니다.!!", "비밀번호 확인", JOptionPane.WARNING_MESSAGE);
return;
}
if(nameText.getText().trim().length()==0 || nameText.getText().trim().equals("이름")) {
JOptionPane.showMessageDialog(null, "이름을 입력해 주세요.", "이름 입력", JOptionPane.WARNING_MESSAGE);
nameText.grabFocus();
return;
}
if(birthYearText.getText().trim().length()==0 || birthYearText.getText().trim().equals("생일 년도")) {
JOptionPane.showMessageDialog(null, "생년월일의 생일 년도를 입력해 주세요.", "생일 년도 입력", JOptionPane.WARNING_MESSAGE);
birthYearText.grabFocus();
return;
}
if(birthMonthList.getSelectedIndex()==0) {
JOptionPane.showMessageDialog(null, "생년월일의 월을 선택해 주세요.", "월 입력", JOptionPane.WARNING_MESSAGE);
birthMonthList.grabFocus();
return;
}
if(birthDayText.getText().trim().length()==0 || birthDayText.getText().trim().equals("생일 일자")) {
JOptionPane.showMessageDialog(null, "생일 일자를 입력해 주세요.", "생일 일자 입력", JOptionPane.WARNING_MESSAGE);
birthDayText.grabFocus();
return;
}
if(phoneNumberText.getText().trim().length()==0 || phoneNumberText.getText().trim().equals("핸드폰 번호")) {
JOptionPane.showMessageDialog(null, "핸드폰 번호를 입력해 주세요.", "핸드폰 번호 입력", JOptionPane.WARNING_MESSAGE);
phoneNumberText.grabFocus();
return;
}
/** 컴퓨터 C드라이브에 java_member 폴더 만들고 member.txt 파일 만드시면 됩니다. **/
//회원가입시 텍스트 파일을 하나 만들어서 아이디와 비번을 저장 하자. 한줄 뛰고 아이디|비밀번호 텍스트 파일에 차곡 차곡 저장하기~ | 는 아이디랑 패스워드 구분하기 위해 사용
String txt = idText.getText()+"|"+pwText.getText();
txt+="\n";
String fileName = "C:\\java_member\\member.txt" ;
try{
BufferedWriter fw = new BufferedWriter(new FileWriter(fileName, true));
// 파일안에 문자열 쓰기
fw.write(txt);
fw.flush();
// 객체 닫기
fw.close();
}catch(Exception errmsg){
errmsg.printStackTrace();
}
//여기까지 왔다면 모든 값을 입력하고 선택하는 것이 완료되었으니 회원가입 과정이 완료.
membershipProgress = true;
JOptionPane.showMessageDialog(null, "회원 가입이 완료 되었습니다.","회원 가입 완료.", JOptionPane.WARNING_MESSAGE);
setVisible(false);
}
});
}
//메인 클래스에서 다이얼로그 회원가입 창 데이터를 가져오기 위한 get 메소드 선언
public String getIdText() {
return this.idText.getText().trim();
}
public String getPwText() {
return this.pwText.getText().trim();
}
public String getPwCheckText() {
return this.pwCheckText.getText().trim();
}
public String getNameText() {
return this.nameText.getText().trim();
}
public String getBirthYearText() {
return this.birthYearText.getText().trim();
}
public String getBirthMonthContent() {
return this.birthMonthList.getSelectedItem().toString();
}
public String getBirthDayText() {
return this.birthDayText.getText();
}
public String getPhoneNumberText() {
return this.phoneNumberText.getText().trim();
}
public boolean memberCheck() {
return membershipProgress;
}
}
소스를 간단히 작성하다 보니 미구현된 기능이 많이 있습니다. 아이디 찾기, 비밀번호 찾기 기능도 없으며 DB가 아닌 TXT 파일을 이용해 회원가입 시 아이디와 비밀번호만 저장되도록 작성 하였습니다. 게다가 C 드라이브에 java_member 폴더와 member.txt 파일도 미리 만들어 둬야 에러 없이 작동하니 미완성된 코드라는 생각이 많이 듭니다.
이전에 댓글로 요청하신 분이 따로 있어 예전 소스를 그대로 가져와 회원가입 로그인 기능과 연결하고 간단하게 로그인 여부만 체크하도록 간단히 작성 하였습니다. 아이디 찾기, 비밀번호 찾기, 나머지 회원 정보가 저장되는 소스가 필요하신 분이 있다면 댓글 남겨 주시면 나중에 시간을 내어 완성하도록 하겠습니다.