쌍용교육(JAVA)/SpringBoot

쌍용교육 -JSP수업 104일차 ch15SpringPage(15)

구 승 2024. 7. 15. 11:10

TalkController.java

//전송된 데이터 처리
	@PostMapping("/talk/talkRoomWrite")
	public String talkRoomSubmit(TalkRoomVO vo, HttpSession session) {
		
		log.debug("<<채팅방 생성>> :" + vo);
		
		MemberVO user = (MemberVO)session.getAttribute("user");
		
		//채팅 멤버 초대 문구 설정
		vo.setTalkVO(new TalkVO());
		vo.getTalkVO().setMem_num(user.getMem_num());
		vo.getTalkVO().setMessage(user.getId()+"님이 ");
		
		talkService.insertTalkRoom(vo);
		
		
		return "redirect:/talk/talkList";
	}

초대한 사람, 초대받은 사람 2명이 값으로 들어간다.

TalkMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper   
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"   
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
<mapper namespace="kr.spring.talk.dao.TalkMapper"> 
	<resultMap type="talkRoomVO" id="talkMap">
		<result property="talkVO.message" column="message"/>
		<result property="talkVO.chat_date" column="chat_date"/>
		<result property="talkMemberVO.room_name" column="room_name"/>
	</resultMap>
	
	<sql id="talkSub">
		FROM sptalkroom r JOIN sptalk_member m USING(talkroom_num)
		LEFT OUTER JOIN (SELECT 
							talkroom_num, 
							mem_num,
							COUNT(*) room_cnt
						FROM sptalk_read
						WHERE mem_num=#{mem_num}
						GROUP BY talkroom_num, mem_num) e
		USING(talkroom_num)
		LEFT OUTER JOIN (SELECT
							talk_num,
							<![CDATA[
							REPLACE(REPLACE(						
								REPLACE(message,'<','&lt;'),'>','&gt;'),'@{member}@','') message,							
							]]>
																	<!-- @{}@는 welcome 메시지 -->
							chat_date,
							talkroom_num
						FROM sptalk WHERE talk_num IN (SELECT
														MAX(talk_num)talk_num
													   FROM sptalk
													   GROUP BY talkroom_num))
		USING(talkroom_num)
		WHERE m.mem_num = #{mem_num}
		<if test="keyword != null and keyword !=''">
			AND room_name LIKE '%' || #{keyword} || '%'
		</if>										
	</sql>
	
	<!-- 채팅방 전체/검색 개수 -->
	<select id="selectRowCount" parameterType="map" resultType="integer">
		SELECT
			COUNT(*)
		<include refid="talkSub"></include><!-- 바로 위에서 만든 talkSub를 사용한다. -->
	
	</select>
	
	<!-- 채팅방 목록 -->
	<select id="selectTalkRoomList" parameterType="map" resultMap="talkMap">
	
		SELECT
			*
		FROM (SELECT
				a.*,
				rownum rnum
			  FROM (SELECT
			  		  *
			  		<include refid="talkSub"></include>
			  		ORDER BY chat_date DESC)a)
		<![CDATA[
		WHERE rnum >= #{start} AND rnum <= #{end}
		]]>	  		
		
	</select>
</mapper>

talkserviceImpl

	@Override
	public List<TalkRoomVO> selectTalkRoomList(Map<String, Object> map) {
		return talkMapper.selectTalkRoomList(map);
	}

	@Override
	public Integer selectRowCount(Map<String, Object> map) {

		return talkMapper.selectRowCount(map);
	}

TalkController.java

/*===================
	 * 채팅방 목록
	 ====================*/
	@GetMapping("/talk/talkList")
	public String chatList(@RequestParam(defaultValue = "1") 
								int pageNum, String keyword, HttpSession session, Model model) {
		MemberVO user = (MemberVO)session.getAttribute("user");
		
		Map<String,Object> map = new HashMap<String, Object>();
		map.put("keyword",keyword);
		map.put("mem_num",user.getMem_num());
		
		int count = talkService.selectRowCount(map);
		//페이지 처리
		PagingUtil page = new PagingUtil(null,keyword,pageNum,count
										,30,10,"talkList");
		
		List<TalkRoomVO> list = null;
		if(count > 0) {
			map.put("start",page.getStartRow());
			map.put("end",page.getEndRow());
			list = talkService.selectTalkRoomList(map);
			
		}
		model.addAttribute("count",count);
		model.addAttribute("list", list);
		model.addAttribute("page",page.getPage());
		return "talkList";
	}

채팅방이 생김

 TalkController 내용추가

//초대한 회원의 id 구하기
	private String findMemberId(TalkRoomVO vo,MemberVO user) {
		String member_id = "";
		long[] members = vo.getMembers();
		for(int i=0;i<members.length;i++) {
			String temp_id = memberService.selectMember(members[i]).getId();
			//초대한 사람의 아이디는 제외
			if(!user.getId().equals(temp_id)) {
				member_id += temp_id;
				if(i < members.length-1) member_id += ", ";
			}
		}
		return member_id;
	}

82라인의 내용추가

님이 이후로 내용을 넣어줌

vo.getTalkVO().setMessage(user.getId()+"님이 "+findMemberId(vo, user)+"님을 초대했습니다.@{member}@");
	/*===================
	 * 채팅 메시지 처리
	 ====================*/
	@GetMapping("/talk/talkDetail")
	public String talkDetail(long talkroom_num, Model model,HttpSession session) {
		
		
		return "talkDetail";
	}

까지 만들고

talkMapper.xml

	<!-- 채팅 멤버 읽기 -->
	<select id="selectTalkMember" parameterType="long" resultType="talkMemberVO">
		SELECT
			mem_num,
			id,
			room_name
		FROM sptalk_member
		JOIN spmember
		USING(mem_num)
		WHERE talkroom_num=#{talkroom_num}
	</select>

 TalkServiceImpl

	@Override
	public List<TalkMemberVO> selectTalkmember(Long talkroom_num) {
		
		return talkMapper.selectTalkmember(talkroom_num);
	}

 TalkController 내용추가

아까 메서드 선언만 해둔 곳 내용추가

/*===================
	 * 채팅 메시지 처리
	 ====================*/
	@GetMapping("/talk/talkDetail")
	public String talkDetail(long talkroom_num, Model model,HttpSession session) {
		String chatMember = "";
		String room_name ="";
		
		MemberVO user = (MemberVO)session.getAttribute("user");
		
		List<TalkMemberVO> list = talkService.selectTalkmember(talkroom_num);
		for(int i=0; i<list.size(); i++) {
			TalkMemberVO vo = list.get(i);
			//로그인한 회원의 채팅방 이름 셋팅
			if(user.getMem_num() == vo.getMem_num()) {
				room_name = vo.getRoom_name();
		}
			//채팅 멤버 저장
			if(i>0) chatMember += ",";
			chatMember += list.get(i).getId();
		}
		//채팅 멤버 id
		model.addAttribute("chatMember",chatMember);
		//채팅 멤버수 
		model.addAttribute("chatCount",list.size());
		//로그인한 회원의 채팅방 이름
		model.addAttribute("room_name",room_name);
		
		return "talkDetail";
	}

tile-def => talk.xml

	<definition name="talkDetail" extends="myPage">
		<put-attribute name="title" value="채팅하기"/>
		<put-attribute name="body" value="/WEB-INF/views/talk/talkDetail.jsp"/>
	</definition>

views/talk => talkDetail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 채팅 메시지 처리 시작 -->
<script src="${pageContext.request.contextPath}/js/jquery-ui.min.js"></script>
<script src="${pageContext.request.contextPath}/js/message.talk.js"></script>
<div id="talkDetail" class="page-main">
	<h1 id="chatroom_title"><span id="chatroom_name">${room_name}</span> 채팅방
		<input type="button" value="채팅방이름 변경" id="change_name">
	</h1> 
	<div class="align-right">
		<input type="button" value="멤버추가" id="opener">
	    <input type="button" value="방탈출" id="delete_talkroom">
	    <input type="button" value="목록" onclick="location.href='talkList'">
	</div>    
	<p>
		채팅 멤버 : 
		<span id="chat_member">${chatMember}</span><span id="chat_mcount">(${chatCount}명)</span>
	</p>    
	<div id="chatting_message"></div>
	<form id="detail_form">
		<input type="hidden" name="talkroom_num" id="talkroom_num" value="${param.talkroom_num}">	
	    <textarea rows="5" cols="40" name="message" id="message"></textarea>
		<div id="message_btn">
			<input type="submit" value="전송">
		</div>
	</form>
</div>
<!-- 채팅 메시지 처리 끝 -->

mapper,service,serviceImpl Controller 부분에서 
selectTalkMember 메서드가 Member가 아니라 member로 되어있어서 에러가 난다. 대문자로 고친후 다시 실행하면