우선, 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 연동됐다면 오라클 테이블에 입력해 둔 아이디
와 동일
한 것을 회원가입 아이디
창에 입력했는데 왜 사용가능한 아이디
라고 뜨는지 확인.