우선, 3개의 클래스로 나누어 Login, Join, MemberVO 클래스를 구성한다. 이후, view도 따로 클래스를 만들 예정이다.
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();
}
처음에 아예 화면이 아무것도 뜨지 않는 것인 줄 알았는데 잠시 시간이 지나고 나서 보니 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();으로 변경하면 무한 루프가 돌지 않고 에러를 해결할 수 있다.
로그인 창에서 회원가입 버튼 눌렀을 때, 회원가입 창과 아이디와 비밀번호를 모두 입력하세요 안내 메시지가 뜬다. 로그인 창의 안내 메시지는 뜨지 않도록 변경해야한다.

👇변경 전 코드
@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에서 아이디와 비밀번호를 누르지 않은 경우로 받아들인다.
회원가입 버튼 누르면 회원가입 창을 띄우는 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 연동됐다면 오라클 테이블에 입력해 둔 아이디와 동일한 것을 회원가입 아이디창에 입력했는데 왜 사용가능한 아이디라고 뜨는지 확인.