-
Notifications
You must be signed in to change notification settings - Fork 0
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
The head ref may contain hidden characters: "feat/#8/\uCC44\uD305\uBC29-\uAD6C\uD604"
Conversation
새로운 필드를 추가한다면, 마지막 메시지 내용 , 전송 시각, 읽지 않은 메시지 수 , 메시지 읽음 여부, 읽은 시간 등등의 필드를 추가해서 로직을 짜보면 좋을 것 같아요! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
build.gradle
Outdated
implementation 'org.springframework.boot:spring-boot-starter-data-redis' | ||
|
||
// MongoDB | ||
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
몽고디비 의존성 같은 경우는 기존에 이미 추가가 되어 있습니다!
따라서 위에 30번 라인 부분은 제거해주시면 감사하겠습니다!
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Setter의 경우 무분별한 객체 수정이 가능하기 때문에 사용을 지양하는 편입니다!
Setter를 사용하기 보다는 필요한 변수만 update하는 메서드를 따로 구현해주세요!
There was a problem hiding this comment.
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; |
There was a problem hiding this comment.
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로 지정해주는 방식으로 통일하는 것이 개발, 관리 측면에서 좋을 것 같다고 생각합니다!
There was a problem hiding this comment.
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; | ||
// | ||
// |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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를 추가해 해결했습니다!
@Getter | ||
@NoArgsConstructor | ||
@AllArgsConstructor | ||
public class PublishMessageResponseDto { |
There was a problem hiding this comment.
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 { |
There was a problem hiding this comment.
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 { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
여기도 마찬가지로 BaseTimeEntity를 상속해주세요!
1. 무슨 이유로 코드를 변경했나요?
2. 어떤 위험이나 장애를 발견했나요?
위 서비스를 구현하기 위해서 즉, 더 좋은 퀄리티를 위해 ChatRoom혹은 ChatMessage 도메인에 필드를 추가해야 할 것 같습니다.
3. 관련 스크린샷을 첨부해주세요.
4. 완료 사항
지금까지 작성한 도메인으로 단순한 일대일 채팅방 구현은 어렵지 않습니다.
5. 추가 사항