[Java] 회원가입, 로그인 시스템 구현하기

이슬기·2023년 10월 23일
0

project

목록 보기
1/42

기능

  1. 로그인 화면(step5.LoginForm 참고 / 혼공자 p.577 예제 보기(아이디,비밀번호 검사하기)
    • ID 입력창, PW 입력창, ID와 PW 찾기 버튼, 로그인 버튼, 회원가입 버튼
    • 로그인 화면이 먼저 띄워진다.
    • 회원가입을 하지 않았다면 회원가입 버튼을 눌러 회원가입 화면이 열린다.
    • 로그인 시, ID와 PW를 틀렸다면 "ID나 PW가 틀렸습니다" 출력 후, 기존 입력한 값 리셋.
  2. 회원가입 화면(step5.DeptManager / step6.MemberShipView참고)
    • 필수정보와 선택정보를 구분한다.
      - 필수정보: 아이디, 아이디 중복확인(버튼), 비밀번호, 비밀번호 확인, 이름, 성별, 생일
      - 선택정보: 취미
    • 회원가입 UI에 입력된 값을 DB에 저장하고, 완료되면 회원가입 창은 닫히고 로그인 화면이 열린다.
  3. DB 구현을 위한 화면(step6.ZipCodeView / BoardVO참고 + CustomerManager / bclass.step1.FMain / BoardDao)
    • 회원들의 VO class를 따로 만들어 private으로 입력한 개인정보를 담는다.
    • private을 public으로 꺼내 사용할 수 있도록 Map 컬렉션 프레임워크를 사용한다.
    • getter, setter를 활용한다.

우선, 3개의 클래스로 나누어 Login, Join, MemberVO 클래스를 구성한다. 이후, view도 따로 클래스를 만들 예정이다.

에러 발생 1

Login 클래스 선언부에

Join join = new Join(this);

선언 후,

@Override
    public void actionPerformed(ActionEvent e) {
        Object obj = e.getSource();
        //회원가입 버튼을 누르면 회원가입 창이 뜨도록 연결
        if(obj == jButton_join) {
        		join.initDisplay();				
        }
        
    }

회원가입 버튼을 누르면 Join 클래스의 회원가입 창이 뜨도록 연결시키기 위해 join.initDisplay();를 호출하였으나 창이 아예 안 뜨는 에러 발생


Join 클래스는 아래와 같이 Login을 선언한 후, 생성자로 초기화 함.

public class Join extends JDialog implements ActionListener{
    //선언부    
    Login login = null;
    //생성자
    public Join(){
        initDisplay();
    }
    public Join(Login login) {
    	this.login = new Login();
	}

에러 해결 1

처음에 아예 화면이 아무것도 뜨지 않는 것인 줄 알았는데 잠시 시간이 지나고 나서 보니 Exception in thread "main" java.lang.StackOverflowError가 발생했다. 스택오버플로우는 지정한 메모리 사이즈에 비해 훨씬 많은 메모리를 사용하게 되어 발생하는 에러다.

여기서 드는 의문)

  • 많은 메모리를 사용해서 스택오버플로우가 발생했다면 왜 바로 콘솔창에 출력되지 않았을까?

그 이유는 Login클래스와 Join클래스가 핑퐁으로 서로 일을 주고 받고 미루고 있다는 생각이 들었다.
이를 토대로 찾아본 결과, Join 클래스에서 Login을 선언하고 Join 생성자 안에서 초기화를 할 때, new를 사용했기 때문이었다. new를 사용함으로써 계속 새로운 객체를 만들게 되어 무한 루프를 돌게 되는 것이다.

public class Join extends JDialog implements ActionListener{
    //선언부    
    Login login = null;
    //생성자
    public Join(){
        initDisplay();
    }
    public Join(Login login) {
    	this.login = login();
	}

위처럼 this.login = login();으로 변경하면 무한 루프가 돌지 않고 에러를 해결할 수 있다.

에러발생 2

로그인 창에서 회원가입 버튼 눌렀을 때, 회원가입 창아이디와 비밀번호를 모두 입력하세요 안내 메시지가 뜬다. 로그인 창의 안내 메시지는 뜨지 않도록 변경해야한다.

👇변경 전 코드

@Override
    public void actionPerformed(ActionEvent e) {
    	id = jTextField_id.getText();
		pass = new String(jPasswordField_pw.getPassword());
		
        Object obj = e.getSource();
        //회원가입 버튼을 누르면 회원가입 창이 뜨도록 연결 - 에러 발생(Join을 인스턴스화 하면 창이 아예 뜨지 않음)
        if(obj == jButton_join) {
        	join.initDisplay();	
        }
        //로그인 하기
        //1)아이디나 비밀번호만 입력했을 때 "아이디와 비밀번호를 모두 입력하세요." 출력 
        //2)DB 연결 - 등록된 아이디나 비밀번호가 틀렸을 경우 "입력한 정보가 틀렸거나 회원가입 정보가 없습니다." 문구 출력
        //3)로그인 후 , 게시판으로 이동
        String nickName = id;
        if("".equals(id) || "".equals(pass)) {
        	JOptionPane.showMessageDialog(this, "아이디와 비밀번호를 모두 입력하세요.", "ID/PW 미기입", 0);
        } /*else if(DB 연결 - 비밀번호 일치하지 않을 경우) {
        	JOptionPane.showMessageDialog(this, "입력한 정보가 틀렸거나 회원가입 정보가 없습니다.", "ID/PW 에러", 0);        	
        }*/ else {
        	JOptionPane.showMessageDialog(this, nickName+"님. 환영합니다.", "로그인 성공", 1);
        	setVisible(false); //로그인 화면 종료
        	//게시판 이동
        }
    }

회원가입 버튼 누를 때의 action로그인 하는 action을 분리해서 코드를 작성하다보니 회원가입 버튼을 누르면 로그인 action에서 아이디와 비밀번호를 누르지 않은 경우로 받아들인다.

에러 해결 2

회원가입 버튼 누르면 회원가입 창을 띄우는 action은 간단하기 때문에 로그인 action통합하여 같은 조건식 내에서 action이 처리되도록 변경하였다.

👇변경 후 코드

@Override
   public void actionPerformed(ActionEvent e) {
   	id = jTextField_id.getText();
		pass = new String(jPasswordField_pw.getPassword());
		
       Object obj = e.getSource();
       //회원가입 버튼 누르면 회원가입 창 연결 + 로그인 하기
       //1)회원가입 버튼을 누르면 로그인 창은 꺼지고 회원가입 창이 켜짐
       //2)아이디나 비밀번호만 입력했을 때 "아이디와 비밀번호를 모두 입력하세요." 출력 
       //3)DB 연결 - 등록된 아이디나 비밀번호가 틀렸을 경우 "입력한 정보가 틀렸거나 회원가입 정보가 없습니다." 문구 출력
       //4)로그인 후 , 게시판으로 이동
       String nickName = id;
       if(obj == jButton_join) {
       	JOptionPane.showMessageDialog(this, "회원가입 창으로 이동합니다.", "회원가입 안내", 1);
       	join.initDisplay();	
       	this.setVisible(false);
       } else if("".equals(id) || "".equals(pass)) {
       	JOptionPane.showMessageDialog(this, "아이디와 비밀번호를 모두 입력하세요.", "ID/PW 미기입", 0);
       } /*else if(DB 연결 - 비밀번호 일치하지 않을 경우) {
       	JOptionPane.showMessageDialog(this, "입력한 정보가 틀렸거나 회원가입 정보가 없습니다.", "ID/PW 에러", 0);        	
       }*/ else {
       	JOptionPane.showMessageDialog(this, nickName+"님. 환영합니다.", "로그인 성공", 1);
       	setVisible(false); //로그인 화면 종료
       	//게시판 이동
       }
   }

231024) 추가로 해야 할 것.
1. Login 클래스에서 회원가입 버튼 눌렀을 때, Join클래스의 회원가입 창 열기(완)
2. Join 클래스에서 등록 버튼 눌렀을 때, Login 클래스의 로그인 창 열기
(완)
3. 회원가입 - 로그인, 비밀번호 중복확인 버튼 안 눌렀을 시 -> 중복확인 하세요 창 띄우기
4. 로그인 창에서 회원가입 버튼 눌렀을 때 - 아이디와 비밀번호를 모두 입력하세요 안내창 뜨는 거 없애기(완)

231026) 추가로 해야 할 것.
1. DB 연동 코드를 짜긴 했으나 제대로 DB가 연동됐는지 확인.
2. DB 연동됐다면 오라클 테이블에 입력해 둔 아이디동일한 것을 회원가입 아이디창에 입력했는데 왜 사용가능한 아이디라고 뜨는지 확인.

0개의 댓글

관련 채용 정보