ohsaam / chatjava Goto Github PK
View Code? Open in Web Editor NEWJFrame + Socket Programming
JFrame + Socket Programming
회원가입 시 입력 필드를 다 입력하지 않아도 자동 가입되는 이슈
[설계1]
우선 기존에 회원가입 창을 가지고 있던 MemberShipView을 이용하여 값을 받아옴 -> 해결
패스워드 입력시 : 값들이 입력되는데 캡슐화로 ( *** ) 바꾼다.
등록 눌렀을 때 -> 회원가입이 완료 되었습니다 하고 창 닫기 -> 완료
else if (obj == jbtn_ins)
{
JOptionPane.showMessageDialog(this,"등록이 완료되었습니다.","INFO", JOptionPane.INFORMATION_MESSAGE);
dispose();
}
[설계2]
값을 읽어 들여 --> 새로은 VO을 만들어서 ---> VO & 디비를 연동한다. MemberDTO 사용
MemberShipView 클래스에서만 사용하면 된다. -> 전역변수로 선언 -> List? or Map? -> 나는 List로 구현하면 될 것 같다.
구성[DB 고려]
이걸 기준으로 Sample DataBase 설계
여기 까지 VO를 만들고 -> 예제 샘플 값을 입력 완료 했다.
그렇게 되면 여기서 어떻게 해야 될까? -> 보완할 점이 필요하다.
Gender는 남자/여자(스크롤)로 되어 있다. 그 값을 어떻게 가져 올 것인가?
ZipCode & Address에서도 값을 어떻게 가져올 것이가에대한 고민을 해야 된다.
회원가입창에서 -> 회원정보로 넘어 올 때 어떻게 매핑 하는지가 제일 중요하다.
현재까지 디비 연동 완료
회원정보까지 디비 넘기는 것 구현 완료
로그아웃 구현
앞으로 해야 될 것.
로그아웃 구현
본격적으로 소켓통신 공부 시작
우선 아이디와 비밀번호를 입력하면, 디비에 넘기는데 여기서 추가로 해야 될 부분은 닉네임을 추출하여 소켓과 연동시켜야한다.
그리고 디비랑 서버와 소통할 수 있는 DAO를 설계하여 (프로토콜도 설계 예정) 구현하자.
기존의 메신저 소켓 기능을 수정 할 필요성은 없다. 단, 닉네임을 어떻게 추출해서 디비에 넘길지가 문제다.
LoginForm은 CONFIRM을 누르면 -> 디비연동(DBConnection)이 됐음(로그로 DB연결 완료)로 sql 연동 -> 회원가입(MembershipView)로 넘어간다.
[등록 눌렀을 경우]
delete from member;
create table member(
username varchar2(15),
password varchar2(15),
nickname varchar2(15)
);
nickname을 추가 했는데 nullpointexception이 나옴 -> 미치고 팔짝 뛰겠음 -> username을 세션값으로 넘겨줬는데 해당 부분을 바꾼다면?
Cannot invoke "String.length()" because "username" is null 이런 에러가 발생함
단위 테스트 했는데 --> 로그인쪽 화면 구현에선 문제가 없음 --> MemberListFrame아니면 MemberDao문제 --> 아니면 로그인 시 세션으로 넘기는 username일지도? 내 추측은 후자다.
해결완료 -> DTO가 문제여서 조건을 걸었던 부분들이 전부 문제가 되었다. 해당 부분 삭제
소켓 연동은 성공 했으나 해당 오류가 발생했다. 필자가 판단하여 봤을 때
닉네임이 넘어오지 않아서
java.util.NoSuchElementException
at java.base/java.util.StringTokenizer.nextToken(StringTokenizer.java:347)
해당 오류가 발생했다. 그렇다면 server/ serverThead /clientThread 모두 닉네임을 연동 시켜야한다.
-> 그래서 SocketClient의 this를 통해 ->
SocketClient sc = null;
public SocketClientThread(SocketClient socketClient) {
this.sc =socketClient;
}
하여 sc.nickname 을 사용했는데 연동이 안 된다.
s===>전체
s===>부산
s===>전남
s===>대구
대구
java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:480)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:413)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:508)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:203)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:33)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:510)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:681)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:229)
at com.util.DBConnectionMgr.getConnection(DBConnectionMgr.java:57)
at com.chat.ZipCodeView.refreshData(ZipCodeView.java:117)
at com.chat.ZipCodeView.actionPerformed(ZipCodeView.java:149)
at java.desktop/javax.swing.JTextField.fireActionPerformed(JTextField.java:525)
at java.desktop/javax.swing.JTextField.postActionEvent(JTextField.java:740)
at java.desktop/javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:856)
at java.desktop/javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1810)
at java.desktop/javax.swing.JComponent.processKeyBinding(JComponent.java:2947)
at java.desktop/javax.swing.JComponent.processKeyBindings(JComponent.java:2995)
at java.desktop/javax.swing.JComponent.processKeyEvent(JComponent.java:2909)
at java.desktop/java.awt.Component.processEvent(Component.java:6403)
at java.desktop/java.awt.Container.processEvent(Container.java:2266)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5001)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4833)
at java.desktop/java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1952)
at java.desktop/java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:883)
at java.desktop/java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1150)
at java.desktop/java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:1020)
at java.desktop/java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:848)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4882)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2780)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4833)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:775)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:747)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:744)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
at oracle.net.ns.NSProtocol.connect(NSProtocol.java:361)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:966)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:292)
... 47 more
2023.10.19일 오류 발생 해결 아직 못함 -> Oracle 다시 깔아야 하는가?
해당 부분 참고
--> ??로 해결 시도 --> 아직도 해결이 안된다. --> 디비 연동은 되었음 --> sql과 DTO가 열 맞는 것으로 예상 --> 나눠져있던 이벤트 처리를 하나로 바꿈 --> 등록 누르면 ---> 해결 완료
java.sql.SQLSyntaxErrorException: ORA-00942: 테이블 또는 뷰가 존재하지 않습니다
에러 발생 --> 해결방법은?
내 생각은 등록을 눌렀을 때 이 정보를 가지고 -> 클래스 매핑이 안 되서 그럼 -> 그래서 전역변수로 해서 this로 넘겨 봤는데 같이 창은 창이 뜨고 해결이 안된다. --> 방향성이 안 맞음
그렇다면 테이블 또는 뷰를 생성해서 연동시켜야함 --> 테이블 또는 뷰를 MemberListFrame으로 설정함(GUI) --> 지금 DTO로 연동은 되는데 ListFrame에 담기지 않는다.
MemberShipView 값들을 받아와 MemberListFrame으로 설정하는것이 중요한 포인트
로그인까지 이벤트 처리 완료 --> 하지만 문제는 데이블 또는 뷰가 존재하지 않습니다. 에러만 해결하면 된다. MemberListFrame에서 어떻게 처리하느냐가 관건
애초에 처음에 우편번호 찾기 할 때 에러가 발생함 --> 이 부분을 먼저 처리 후 디비 연동 및 사용 할 것 .
그래서 MemberListFrame / 및 MemberDTO / DAO 전부 수정 완료
-> 이제 매핑하는거만 남았다. --> 간단하지만 디비 스키마 만들었고 , 그걸 토대로 데이터 저장 창까지 구현은 다 했다.
다음 단계는 회원가입을 통해 -> 회원정보에 디비 연동하여 구현 하는 것이다. 계속 이 지점에서 머물고 있는 것 같지만, 이전에는 행/정보 입력 칸이 비어 있어서 아예 구현이 안됐다..
그러면 회원가입창인 MemberShipView 보고 / MemberListFrame 둘 사이에 관계를 구현하면 될 것 같다. (쉽게 얘기하면 붙이는 걸 어떤식으로 할꺼냐의 문제다)
멤버쉽뷰를 -> This를 통해서 Frame에 넘긴다? 구체적으로 회원가입 창 등록을 눌렀을 때 디비 정보(아이디/패스워드)가 MemberListFrame여기로 넘어가야한다.
rs에서 에러가 계속적으로 발생함 "PASSWORD": 부적합한 식별자 -> 에러 해결 --> 테이블 설정들어가서 --> 테이블 업데이트 했음
해당 부분 필자가 toad에 테이블 조건을 primary key로 잘 못 줘서 delete 후 -> 다시 테이블 생성함 -> 해결
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.