Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feat] #9 채팅 도메인 개발 #9

Merged
merged 23 commits into from
Oct 6, 2024
Merged

Conversation

koreaioi
Copy link
Member

@koreaioi koreaioi commented Oct 2, 2024

1. 무슨 이유로 코드를 변경했나요?

  • RedisConfig, WebSocketConfig 의존성 및 설정 추가
  • 도메인 개발

2. 어떤 위험이나 장애를 발견했나요?

  • 채팅 목록 마지막 메시지 표시 구현
  • 채팅 읽음 표시

위 서비스를 구현하기 위해서 즉, 더 좋은 퀄리티를 위해 ChatRoom혹은 ChatMessage 도메인에 필드를 추가해야 할 것 같습니다.


3. 관련 스크린샷을 첨부해주세요.


4. 완료 사항

지금까지 작성한 도메인으로 단순한 일대일 채팅방 구현은 어렵지 않습니다.


5. 추가 사항

@koreaioi koreaioi linked an issue Oct 2, 2024 that may be closed by this pull request
@koreaioi koreaioi self-assigned this Oct 2, 2024
@koreaioi koreaioi added the feat 기능 개발, 구현 label Oct 2, 2024
@seokjun01
Copy link
Collaborator

새로운 필드를 추가한다면, 마지막 메시지 내용 , 전송 시각, 읽지 않은 메시지 수 , 메시지 읽음 여부, 읽은 시간 등등의 필드를 추가해서 로직을 짜보면 좋을 것 같아요!
고생하셨습니다!

Copy link
Member

@hyxklee hyxklee left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

레디스나 웹소켓의 경우는 저도 아직 잘 몰라서 제가 아는 부분에서 제 의견을 남겨 봤습니다!
찬찬히 읽어보시고 적용할 부분은 적용해주시면 감사하겠습니다!
또한 PR 제목의 경우 "[feat] #8 채팅방구현" 이렇게 "/"를 제외하여 작성해주시면 감사하겠습니다!
그리고 해당 pr의 경우 number가 #9 번이니 맞게 수정해주시면 감사하겠습니다!

build.gradle Outdated
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

// MongoDB
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

몽고디비 의존성 같은 경우는 기존에 이미 추가가 되어 있습니다!
따라서 위에 30번 라인 부분은 제거해주시면 감사하겠습니다!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

의존성 제거했습니다!

import java.time.LocalDateTime;

@Builder
@Setter
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Setter의 경우 무분별한 객체 수정이 가능하기 때문에 사용을 지양하는 편입니다!
Setter를 사용하기 보다는 필요한 변수만 update하는 메서드를 따로 구현해주세요!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ChatRoom의 경우 변수를 수정할 경우가 없어 @Setter 제거했습니다

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "room_id")
private Long roomId;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

도메인 객체의 경우 id에 해당하는 변수명은 id로 통일하고, @column 어노테이션을 이용해 DB에 저장되는 컬럼명을 도메인_id로 지정해주는 방식으로 통일하는 것이 개발, 관리 측면에서 좋을 것 같다고 생각합니다!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

감사합니다 반영했습니다

// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
// private LocalDateTime createAt;
//
//
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 해본 작업은 아니라서 될지 안될지는 모르겠지만, 서칭해보니 ObjectMapper 빈에 JavaTimeModule을 등록해 해결한 경우가 꽤 있는 것 같습니다! 아직 시도해보지 않은 방법이라면 시도해 보셔도 좋을 것 같아요!
https://velog.io/@jangcoding/역직렬화-오류-Cacheable-redisTemplate
https://velog.io/@bagt/Redis-역직렬화-삽질기-feat.-RedisSerializer

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

JavaTimeModule과 의존성 설치 모두 해봤는데 해결이 되지 않았습니다...

LocalDateTime을 제외한 PublishMessage를 역직렬화 하고 난 뒤,
LocalDateTime을 가지고 있는 PublishMessageResponseDto를 추가해 해결했습니다!

src/main/java/com/leets/X/domain/chat/entity/ChatRoom.java Outdated Show resolved Hide resolved
@koreaioi koreaioi changed the title Feat/#8/채팅방 구현 Feat #9 채팅방 구현 Oct 3, 2024
@koreaioi koreaioi changed the title Feat #9 채팅방 구현 Feat #9 채팅 도메인 개발 Oct 3, 2024
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class PublishMessageResponseDto {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PublishMessage나 MessageDto의 경우 Serializable 인터페이스를 구현하는 방식이라서 통상적인 DTO와는 구조가 다르가 생각했습니다.
해당 응답 DTO의 경우는 통상적인 DTO로 이해했습니다. 그렇다면 dto 사용에 용이한 record 클래스를 적용하는 것은 어떨까요??
그리고 dto 명의 통일을 위해서 뒷부분에 dto를 넣기 보다는 이름을 봤을 때 어떤 일을 하는지 알 수 있게 MessagePublishResponse 정도로 네이밍을 하는 것도 좋을 것 같습니다!

@Document
@Getter
@Builder
public class ChatMessage {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

그리고 db에 저장되는 엔티티의 경우는 BaseTimeEntity를 상속해주세요!

@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED) // 기본 생성자 접근 레벨 PROTECTED
@Entity
public class ChatRoom {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기도 마찬가지로 BaseTimeEntity를 상속해주세요!

@koreaioi koreaioi merged commit a958aad into main Oct 6, 2024
2 checks passed
@koreaioi koreaioi deleted the feat/#8/채팅방-구현 branch October 6, 2024 12:49
@koreaioi koreaioi changed the title Feat #9 채팅 도메인 개발 [feat] #9 채팅 도메인 개발 Nov 10, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feat 기능 개발, 구현
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[feat] #8 채팅 도메인 개발
3 participants