채팅은 회원제 서비스.
웹 소켓을 이용하기 때문에 실시간 채팅이 된다.
1) kr.spring.talk.vo - TalkRoomVO , TalkVO , TalkMemberVO 클래스 생성
2) kr.spring.talk.dao - TalkMapper 인터페이스 생성
[필요한 메서드]
목록에서 페이지처리를 하지는 않는데, 할 수 있는 구조로 만들어 놓긴 할거다.
나중에 너무 많다 싶으면 알아서 처리하면 된다. (count까지 만들어놓음)
"채팅방 멤버 등록" 부분에서 원칙적으로 mybatis는 파라미터가 한개여야 하기 때문에 원래는 Map으로 처리해야한다.
하지만, 3.x버전으로 넘어오면서 어노테이션으로 여러개의 파라미터 명시 가능해졌다.
3) kr.spring.talk.service - TalkService 인터페이스 생성 (TalkMapper 인터페이스에 명시한 메서드 내용 붙여넣기)
"채팅방 번호 생성" 메서드 지움. "채팅방 생성" 의 내부에서 처리하기 때문
"채팅방 멤버 등록"메서드 지움. "채팅방 멤버 읽기" 내부에서 같이 처리
4) kr.spring.talk.service - TalkServiceImpl 클래스 생성
implements 해주고, 빨간 밑줄 마우스 오버해서 add 해주면 된다.
5) kr.spring.talk.controller - TalkController
필요한 작업: 채팅방 목록, 채팅방 생성, 채팅 메시지 처리
6) tiles-def - talk.xml 생성(board.xml 붙여넣기 후 수정)
그 후 Appconfig 가서 코드 추가해줘야한다.
1) 로그인 인터셉터 부분 추가 - 로그인이 되었을 경우에만 실행되게끔 설정해줌
2) 타일스 설정 부분 추가
7) views - talk 폴더 생성 - talkList.jsp 생성
[마이페이지의 채팅 버튼 클릭시 목록페이지 이동]
8) talk - talkRoomWrite.jsp 생성 (채팅방 생성)
- 스크립트를 이용해서 자동생성하게 될거다. 자동생성을 원하지 않으면 체크를 해제하면 된다.
9)css 수정
10) src/main/resources - static - js 폴더 - message.talk.js 생성
[사전 작업]
1. MemberMapper.java 인터페이스에 채팅 관련 코드 추가해야함!!!!
- "채팅 회원이름 검색"
2. MemberService 클래스에 메서드 한줄 붙여넣기
3. MemberServiceImpl 클래스에 코드 추가
4. TalkController에 "채팅 회원 검색"부분 코드 추가
사전 작업 끝...
[회원 정보 검색]
<1> 채팅방 개설자의 아이디와 같지 않은 아이디만 표시하려고 한다.
기본적으로 채팅방 개설자의 아이디가 sky라면, 검색했을때 sky, sky1(다른 회원)이 나올 것이다.
그래서, 채팅방 개설자의 아이디는 이미 member_list 배열에 저장되어 있으므로, 이를 활용하여 배열에 없는 아이디일때만 표시되도록 한다.
"choco"로 로그인 된 상태에서 c를 검색하면 c가 포함된 id들이 보여지고, choco는 제외된 모습이다.
[검색된 회원 선택 , 채팅방 이름 생성 방식, 채팅방 이름 생성 기능]
자동 생성 체크 시 >
한번 검색해서 member_list에 들어간 id는 검색할 때 제외되고 표시된다.
제일 처음 순서로 채팅방 개설자 id가 들어간다.
수동 > 체크박스에 체크를 안할 경우 수동 입력 가능(회원 검색해도 채팅방 이름에 포함 안된다)
자동생성으로 회원을 검색하고, 체크를 해제할 경우 채팅방 이름 칸에 그대로 이름이 남아있다.
11) kr.spring.talk.dao - TalkMapper.xml 생성
BoardMapper.xml 복사후 kr.spring.talk.dao에 붙여넣고 이름 TalkMapper.xml로 변경해주기
<mapper>태그 안에 다 지우고 namespace 변경해주기
12) TalkMemberVO 작성해주고, TalkMapper 인터페이스 sql문 작성, TalkServiceImpl의 insertTalkRoom 메서드 코드 추가
, TalkVO 코드 추가, TalkController의 "전송된 데이터 처리" 부분,"초대한 회원의 id 구하기" 코드 추가 ,
message.talk.js의 "채팅방 생성 전송"부분 코드 추가 , talkController의 채팅 멤버 초대 문구 설정.
[TalkRoomVO에 있는 TalkVO객체와 TalkMemberVO 매핑]
조인해서 다른 테이블에 있는 걸 사용하려면 매핑해야한다.
채팅방 목록 수정
TalkMapper.java에 메서드 추가
TalkServiceImpl의 insertTalkRoom메서드의 "입장 메시지 처리"부분 코드 추가
TalkMapper.xml에 <sql id="talkSub">코드 설명 >>>>
두번쨰 Join : 목록에 마지막(최근) 채팅을 띄워서 보여주게끔하기 위해 조인
- @{member}@를 같이 등록했는데 그걸 ''로 안보이게 처리해준다.
- message라고 알리아스 처리
- sptalk_member에 m알리아스 처리를 했는데, WHERE 절의 m.mem_num은 sptalk_member에 있는 mem_num이다.
"talkSub" include해주기
[TalkMapper.xml 채팅 멤버 읽기, 채팅 메시지 읽기 추가 ]
채팅메시지 읽기 부분 >>
html 불허하기 위해 CDATA 추가
만약, 채팅을 하다가 친구를 초대할 경우 그 전의 대화도 보여지는 문제가 생긴다.
초대된 회원은 등록된 시점부터 대화가 보여야 하기 때문에 이런식으로 대화방을 만들 경우 전체 코드를 수정해야 한다.
sptalk_member테이블에 날짜 컬럼이 있는데 회원이 언제 추가되었는지 알기 위해 확장성을 고려하여 넣어두었다.
[TalkService에 mapper에 있던 메서드 추가해주기]
채팅하기 기능
talk.xml에 코드 추가
talk 폴더 - talkDetail.jsp 생성
TalkMapper.java의 insertTalkRead 메서드 sql작성
TalkController에서 "채팅 메시지 읽기"부분 코드 추가
TalkServiceImple 의 insertTalk 메서드 코드 추가
message.talk.js "채팅하기" 코드 추가
채팅은 엔터치면 전송되기 때문에 엔터를 하려면 shift+엔터 하게 된다.
message.talk.js의 채팅메시지 등록 부분
TalkController 채팅 메시지 등록.
상대방이 채팅을 읽는 순간 sptalk_read 테이블에서 읽은 채팅 정보들이 지워져야 한다.
지워지면서 읽은걸로 인식한다.
웹소켓
kr.spring.websocket 패키지 생성 - socketHandler내려받아서 넣어주기
웹소켓 사용할 경우 AppConfig.java도 수정해줘야 한다.
- implements WebSocketConfigurer 해주고, 오류나면 add 해주기 .
- registerWebSocketHandlers메서드가 자동 생성된다.(웹소켓 셋팅)
채팅방 이름 변경하기
'학원 > spring' 카테고리의 다른 글
23.01.10 Spring boot Tiles (0) | 2024.01.10 |
---|