과거 코드 회고록
2023. 4. 5. 11:50ㆍ나의 이야기
나의 첫 Backend 프로젝트 Fitween의 코드를 보면서 많은 심란함을 느꼈다.
API에 대한 지식도 없는 상태에서 만든 코드긴 했고... 돌아가게만 만들었지.. 다시보니 이런 두서없는 코드가 없었다.
그래서 내가 한번씩 내가 만든 코드를 직접 회고하는 회고록을 작성해보려 한다.
FITWEEN MESSAGE CODE
package com.ssafy.api.controller;
import com.ssafy.api.model.ChatMessageForm;
import com.ssafy.api.model.ChatMessage;
import com.ssafy.api.model.ChatRoom;
import com.ssafy.api.model.ChatRoomForm;
import com.ssafy.db.repository.ChatRepository;
import com.ssafy.db.repository.ChatRoomRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.SimpMessageSendingOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
//import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.List;
import java.util.Map;
@RestController
@RequiredArgsConstructor
public class MessageController {
private final SimpMessageSendingOperations sendingOperations;
@GetMapping("/chat/findRoom") //
public String findRoom(String receiverId,String senderId){
String roomnum = findRoomfunc(receiverId,senderId);
if (roomnum==null){
return "-1"; // 만약 이때 REST API에 대한 개념을 알았고, HTTP STATUS CODE를 알았다면
//이때는 202를 리턴해서 처리되지 않았다는것을 알려주면 좋았을거같다.
}
else{
return roomnum; // DTO에 대한 개념이 없어서 String하나만 Return을 했지만
// 이런경우는 DTO를 만들어서 Return을 해주면 나중에
// Spring Swagger API DOCS를 만들때도 편리하게 진행할수 있었을것 같다.
}
}
@GetMapping("/chat/log")
public List<ChatMessage> enter(String roomId){ // API명과 Controller명이 중구난방이다..
return logMessage(roomId); // Url과 API명은 대부분 일치하거나 알아낼수 있게
// 만드는것같다.
}
@GetMapping("/chat/makeRoom")
public String roomnum(String receiverId,String senderId){
String room = findRoomfunc(receiverId,senderId);
if( room==null){
return makeRoom(receiverId,senderId).getRoomId();
}
else{
return room;
}
}
@GetMapping("/chat/roomList")
public List<ChatRoom> RoomList(String userId){
return roomList(userId);
}
//메세지를 읽었을때 메세지들을 전부 0으로 만들어야함
// receiver가 접근했을때 senderId-receiverId 가 매칭된 채팅로그의 1을 0으로 바꾼다다
// 채팅로그에 roomidx와 입장한 유저의 아이디가 receiverId인 모든 로그의 isRead를 0으로 바꾼다.
@PutMapping("/chat/doRead")
public void read(@RequestBody Map<String,String> body){
isReadUpdate(body.get("roomId"),body.get("userId"));
notRead(body.get("senderId"), body.get("userId"),body.get("roomId"));
}
// --> 카카오톡처럼 읽음처리를 구현하지 못했지만 프로젝트가 종료되고 곰곰히 생각해봤을때
// 톡방에 WebSocket연결된 갯수를 기록하게된다면 메세지를 보냈을때 바로 읽음처리가 될수 있게
// 만들수도 있었겠다는 생각을 했다.
// 내가 만든 읽음 처리는 방을 들어와야 읽음이 처리가 되는 구조였다.
//------------여기서부터는 채팅 API지만 누더기 코드라 리뷰하기가 무서워진다-----------------
@MessageMapping("/chat/message")
public void chat(ChatMessage message) {
String roomnum = CheckRoom(message.getSenderId(),message.getReceiverId());
if (roomnum == null){
message.setRoomId(makeRoom(message.getSenderId(), message.getReceiverId()).getRoomId());
}
else{
message.setRoomId(roomnum);
}
ZonedDateTime datetime = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
//LocalDateTime datetime = LocalDateTime.now();
message.setSenddatetime(datetime);
Integer isRead = 1;
// if(subscribe == True){
// isRead = 0
// }
message.setIsRead(isRead);
saveMessage(message.getRoomId(), message.getSenderId(), message.getReceiverId(), message.getMessage(),message.getIsRead());
updateLastChat(message.getRoomId(),message.getMessage(),message.getSenddatetime(), message.getSenderId(), message.getReceiverId());
//notRead(message.getSenderId(), message.getReceiverId(), message.getRoomId());
sendingOperations.convertAndSend("/topic/chat/room/"+message.getRoomId(),message); // 메세지 알림 보내기
sendingOperations.convertAndSend("/topic/chat/wait/"+message.getReceiverId(),message); // 메세지 보내기
//saveMessage(message.getRoomId(), message.getSenderId(), message.getReceiverId(), message.getMessage());
// sendingOperations.convertAndSend("/topic/chat/wait/"+message.getReceiverId(),message);
//
// log.info(chatForm.toString());// 받아온 데이터 확인!
//// // dto(데이터-전달-객체)를 entity(db-저장-객체)로 변경
// ChatMessage chatMessage = chatForm.toEntity();
//// // 리파지터리에게(db-관리-객체) 전달
// ChatMessage saved = chatRepository.save(chatMessage);
// log.info(saved.toString());
//// 저장 엔티티의 id(PK)값 반환!
// return saved.getRoomId()+saved.getReceiverId()+saved.getSenderId();
// sendingOperations.convertAndSend("/topic/chat/room/"+message.getRoomId(),message);
}
//@MessageMapping("/chat/")
//1.senderId 와 receiverId , 채팅메시지 를 받는다
//2.그 senderId,receiverId로 db (chatRoom Table)에서 둘의 대화방이 있는지 검사한다.
//없다면 새로운 대화방을 만든다 (DB까지) -> receiverId로 채팅을 보낸다.
//있다면 그 방에 채팅을 보낸다.
//senderId와 receiverId의 방이 있다면 true 없으면 false 리턴
//senderId -> 보낸 사람 receiverId -> 받는 사람
// chatRoom table에서 senderId와 receiverId가 같이 있는 튜플을 발견하면 그 튜플의 roomId를 리턴
// 없으면 0리턴
//-->나름 로직을 많이 고민한 느낌이 있다... 고생했어 과거의 나..
@Autowired
private ChatRoomRepository chatRoomRepository;
public String CheckRoom(String user1Id, String user2Id){
String roomnum = chatRoomRepository.findByUser1and2(user1Id,user2Id);
if(roomnum == null){
return null;
}
else{
return roomnum;
}
}
public ChatRoom makeRoom(String senderId, String receiverId){
ChatRoom newroom = new ChatRoom();
ChatRoomForm chatRoomForm = new ChatRoomForm();
newroom = newroom.create(senderId,receiverId);
chatRoomForm.setUser1Id(newroom.getUser1Id());
chatRoomForm.setUser2Id(newroom.getUser2Id());
chatRoomForm.setRoomId(newroom.getRoomId());
chatRoomForm.setUser1Nickname(chatRoomRepository.setUserNickname(newroom.getUser1Id()));
chatRoomForm.setUser2Nickname(chatRoomRepository.setUserNickname(newroom.getUser2Id()));
ChatRoom chatRoom = chatRoomForm.toEntity();
//ChatRoom saved = chatRoomRepository.save(chatRoom);
chatRoomRepository.save(chatRoom);
return newroom;
}
@Autowired
private ChatRepository chatMessageRepository;
public void saveMessage(String roomId,String senderId,String receiverId,String message,Integer isRead){
ChatMessageForm chatMessageForm = new ChatMessageForm();
chatMessageForm.setMessage(message);
chatMessageForm.setRoomId(roomId);
chatMessageForm.setSenderId(senderId);
chatMessageForm.setReceiverId(receiverId);
chatMessageForm.setIsRead(isRead);
ChatMessage chatMessage = chatMessageForm.toEntity();
chatMessageRepository.save(chatMessage);
}
public List<ChatMessage> logMessage(String roomId){
List<ChatMessage> logcon = chatMessageRepository.findLogByUser(roomId);
return logcon;
}
public List<ChatRoom> roomList(String user1){
List<ChatRoom> rooms = chatRoomRepository.findRoomByUser(user1);
return rooms;
}
public String findRoomfunc(String user1,String user2){
String roomNum = chatRoomRepository.findByUser1and2(user1,user2);
return roomNum;
}
public void updateLastChat(String roomId,String message,ZonedDateTime dateTime,String senderId,String receiverId){
chatRoomRepository.updateLastChat(roomId,message);
chatRoomRepository.updateLastChatTime(roomId,dateTime);
chatRoomRepository.updateLastSenderId(roomId,senderId);
chatRoomRepository.notReadMessage(senderId,receiverId,roomId);
}
public void notRead(String senderId,String receiverId,String roomId){
chatRoomRepository.notReadMessage(senderId,receiverId,roomId);
}
public void isReadUpdate(String roomId,String receiverdId){
chatMessageRepository.updateIsRead(roomId,receiverdId);
}
//----->> void로 하면 요청의 처리 유무를 확인할 수 없기때문에 HTTP STATUS코드를 활용하여
// 항상 결과를 Client에 전달해줄 필요가 있다..고 생각함
}
// ----------------------------총평--------------------------------
// try-catch 구문을 활용하여 예외처리를 잘 해놓으면 좋았겠지만
// 모두 조건문으로 처리를 해놓은게 조금 아쉬웠다.
// HTTP에 대해 자세하게 알고 REST를 이해하고 있었다면 더 멋진 코드가 되지 않았을까 싶다.
'나의 이야기' 카테고리의 다른 글
첫 단독 개발 미션 (0) | 2023.04.04 |
---|