본문 바로가기
JAVA

DataOutputStream, DataInputStream, HashMap으로 로그인, 회원가입 창 구현

by 소힌 2022. 1. 25.

1. 위와같은 간단한 프레임창 구현한 JFrame 상속 받는 Main 파일 

 

mport java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

class Main extends JFrame {
	JTextField id;
	JTextField pw;

	public Main() {
		super("회원가입 및 로그인");
		MemberRepository repo = new MemberRepository();
		JPanel main = new JPanel();
		JPanel sub1 = new JPanel();
		sub1.setLayout(new BoxLayout(sub1, BoxLayout.Y_AXIS));
		JPanel sub2 = new JPanel();
		id = new JTextField(10);
		pw = new JTextField(10);
		JButton join = new JButton("회원가입");
		JButton login = new JButton("로그인하기");
		JLabel answer = new JLabel("");
		sub2.add(answer);
		join.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				repo.join(new Member(id.getText(), pw.getText()));
			}
		});

		login.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				repo.read();
				Member member = new Member(id.getText(), pw.getText());
				answer.setText(repo.login(member));

			}
		});

		setSize(500, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		add(main);
		sub1.add(id);
		sub1.add(pw);
		main.add(sub1, "North");
		sub2.add(join);
		sub2.add(login);
		main.add(sub2, "South");

	}
}

public class Main2 {
	public static void main(String[] args) {
		new Main().setVisible(true);
		MemberRepository repo = new MemberRepository();

	}
}

 

 

2. 입력받은 정보를 저장하고 읽는 Member Repository 클래스

DataInputStream에서 저장된 정보를 읽으면서

임의로 지정한 Member타입의 해쉬맵에 아이디를 Key값으로 비밀번호를 Value값으로 넣어줌 

비밀번호는 중복 가능하지만 아이디는 중복될 수 없기 때문에 key값이 중복되지 않는 HashMap의 특성을 사용하려 함 

 

import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import java.util.HashMap;

public class MemberRepository {
	HashMap<String, String> map;

	public void join(Member member) {
		try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("memberdata.bin", true))) {
			dos.writeUTF(member.getId());
			dos.writeUTF(member.getPw());

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public HashMap<String, String> read() {
		map = new HashMap<>();
		try (DataInputStream is = new DataInputStream(new FileInputStream("memberdata.bin"))) {

			while (true) {
				String id = is.readUTF();
				String pw = is.readUTF();
				map.put(id, pw);
			}

		} catch (EOFException e) {

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(map);
		return map;

	}

	public String login(Member member) {
		String answer;
		if (map.containsKey(member.getId()) && map.get(member.getId()).equals(member.getPw())) {
			answer = "환영합니다 ^^";
		} else {
			answer = "없는 회원입니다!";
		}
		return answer;
	}
}

3. 아이디와 비밀번호라는 필드 값을 가지는 memeber 객체 (둘다 String으로 설정함) 

public class Member {
	private String id;
	private String pw;

	Member() {

	}

	@Override
	public String toString() {
		return "Member [id=" + id + ", pw=" + pw + "]";
	}

	public String getId() {
	
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPw() {
		return pw;
	}

	public void setPw(String pw) {
		this.pw = pw;
	}

	public Member(String id, String pw) {
		super();
		this.id = id;
		this.pw = pw;
	}

}