Skip to content

Commit 9458018

Browse files
authored
feat: 채팅 관련 엔티티 및 DDL 작성 (#395)
* feat: 채팅 관련 엔티티 생성 * feat: 채팅 관련 테이블의 DDL 작성 * fix: DDL 콤마 누락 문제 해결 * feat: chat_participant 테이블에서 chat_room, site_user 간 고유 키 생성 * chore: ChatReadStatus 엔티티에 UK 제약조건 추가 * fix: JPA가 UK 제약 조건 생성 시 컬럼을 찾지 못하는 문제 해결 - 명시적으로 컬럼 이름을 지정한다. * chore: UK 제약 조건 이름 변경 * chore: isGroup, hasAttachment 필드에 기본값 생성 - 데이터 타입을 primitive type으로 지정 - Column 어노테이션 제거 (App level과 DB level 간 일관성 보장) - DDL에 기본값 설정 * chore: hasAttachment 컬럼 제거 * chore: flyway 파일 버전 수정
1 parent d71fd0d commit 9458018

6 files changed

Lines changed: 232 additions & 0 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.example.solidconnection.chat.domain;
2+
3+
import com.example.solidconnection.common.BaseEntity;
4+
import jakarta.persistence.Column;
5+
import jakarta.persistence.Entity;
6+
import jakarta.persistence.FetchType;
7+
import jakarta.persistence.GeneratedValue;
8+
import jakarta.persistence.GenerationType;
9+
import jakarta.persistence.Id;
10+
import jakarta.persistence.ManyToOne;
11+
import lombok.AccessLevel;
12+
import lombok.Getter;
13+
import lombok.NoArgsConstructor;
14+
15+
@Entity
16+
@Getter
17+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
18+
public class ChatAttachment extends BaseEntity {
19+
20+
@Id
21+
@GeneratedValue(strategy = GenerationType.IDENTITY)
22+
private Long id;
23+
24+
@Column(nullable = false)
25+
private Boolean isImage;
26+
27+
@Column(nullable = false, length = 500)
28+
private String url;
29+
30+
@Column(length = 500)
31+
private String thumbnailUrl;
32+
33+
@ManyToOne(fetch = FetchType.LAZY)
34+
private ChatMessage chatMessage;
35+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.example.solidconnection.chat.domain;
2+
3+
import com.example.solidconnection.common.BaseEntity;
4+
import jakarta.persistence.CascadeType;
5+
import jakarta.persistence.Column;
6+
import jakarta.persistence.Entity;
7+
import jakarta.persistence.FetchType;
8+
import jakarta.persistence.GeneratedValue;
9+
import jakarta.persistence.GenerationType;
10+
import jakarta.persistence.Id;
11+
import jakarta.persistence.ManyToOne;
12+
import jakarta.persistence.OneToMany;
13+
import java.util.ArrayList;
14+
import java.util.List;
15+
import lombok.AccessLevel;
16+
import lombok.Getter;
17+
import lombok.NoArgsConstructor;
18+
19+
@Entity
20+
@Getter
21+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
22+
public class ChatMessage extends BaseEntity {
23+
24+
@Id
25+
@GeneratedValue(strategy = GenerationType.IDENTITY)
26+
private Long id;
27+
28+
@Column(nullable = false, length = 500)
29+
private String content;
30+
31+
private long senderId;
32+
33+
@ManyToOne(fetch = FetchType.LAZY)
34+
private ChatRoom chatRoom;
35+
36+
@OneToMany(mappedBy = "chatMessage", cascade = CascadeType.ALL)
37+
private List<ChatAttachment> chatAttachments = new ArrayList<>();
38+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.example.solidconnection.chat.domain;
2+
3+
import com.example.solidconnection.common.BaseEntity;
4+
import jakarta.persistence.Column;
5+
import jakarta.persistence.Entity;
6+
import jakarta.persistence.FetchType;
7+
import jakarta.persistence.GeneratedValue;
8+
import jakarta.persistence.GenerationType;
9+
import jakarta.persistence.Id;
10+
import jakarta.persistence.ManyToOne;
11+
import jakarta.persistence.Table;
12+
import jakarta.persistence.UniqueConstraint;
13+
import lombok.AccessLevel;
14+
import lombok.Getter;
15+
import lombok.NoArgsConstructor;
16+
17+
@Entity
18+
@Getter
19+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
20+
@Table(uniqueConstraints = {
21+
@UniqueConstraint(
22+
name = "uk_chat_participant_chat_room_id_site_user_id",
23+
columnNames = {"chat_room_id", "site_user_id"}
24+
)
25+
})
26+
public class ChatParticipant extends BaseEntity {
27+
28+
@Id
29+
@GeneratedValue(strategy = GenerationType.IDENTITY)
30+
private Long id;
31+
32+
@Column(name = "site_user_id")
33+
private long siteUserId;
34+
35+
@ManyToOne(fetch = FetchType.LAZY)
36+
private ChatRoom chatRoom;
37+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.example.solidconnection.chat.domain;
2+
3+
import com.example.solidconnection.common.BaseEntity;
4+
import jakarta.persistence.Column;
5+
import jakarta.persistence.Entity;
6+
import jakarta.persistence.GeneratedValue;
7+
import jakarta.persistence.GenerationType;
8+
import jakarta.persistence.Id;
9+
import jakarta.persistence.Table;
10+
import jakarta.persistence.UniqueConstraint;
11+
import lombok.AccessLevel;
12+
import lombok.Getter;
13+
import lombok.NoArgsConstructor;
14+
15+
@Entity
16+
@Getter
17+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
18+
@Table(uniqueConstraints = {
19+
@UniqueConstraint(
20+
name = "uk_chat_read_status_chat_room_id_chat_participant_id",
21+
columnNames = {"chat_room_id", "chat_participant_id"}
22+
)
23+
})
24+
public class ChatReadStatus extends BaseEntity {
25+
26+
@Id
27+
@GeneratedValue(strategy = GenerationType.IDENTITY)
28+
private Long id;
29+
30+
@Column(name = "chat_room_id")
31+
private long chatRoomId;
32+
33+
@Column(name = "chat_participant_id")
34+
private long chatParticipantId;
35+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.example.solidconnection.chat.domain;
2+
3+
import com.example.solidconnection.common.BaseEntity;
4+
import jakarta.persistence.CascadeType;
5+
import jakarta.persistence.Entity;
6+
import jakarta.persistence.GeneratedValue;
7+
import jakarta.persistence.GenerationType;
8+
import jakarta.persistence.Id;
9+
import jakarta.persistence.OneToMany;
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
import lombok.AccessLevel;
13+
import lombok.Getter;
14+
import lombok.NoArgsConstructor;
15+
16+
@Entity
17+
@Getter
18+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
19+
public class ChatRoom extends BaseEntity {
20+
21+
@Id
22+
@GeneratedValue(strategy = GenerationType.IDENTITY)
23+
private Long id;
24+
25+
private boolean isGroup = false;
26+
27+
@OneToMany(mappedBy = "chatRoom", cascade = CascadeType.ALL)
28+
private List<ChatParticipant> chatParticipants = new ArrayList<>();
29+
30+
@OneToMany(mappedBy = "chatRoom", cascade = CascadeType.ALL)
31+
private List<ChatMessage> chatMessages = new ArrayList<>();
32+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
CREATE TABLE chat_room
2+
(
3+
id BIGINT AUTO_INCREMENT PRIMARY KEY,
4+
is_group BOOLEAN NOT NULL DEFAULT false,
5+
created_at DATETIME(6) NOT NULL,
6+
updated_at DATETIME(6) NOT NULL
7+
);
8+
9+
CREATE TABLE chat_participant
10+
(
11+
id BIGINT AUTO_INCREMENT PRIMARY KEY,
12+
site_user_id BIGINT NOT NULL,
13+
chat_room_id BIGINT NOT NULL,
14+
created_at DATETIME(6) NOT NULL,
15+
updated_at DATETIME(6) NOT NULL,
16+
CONSTRAINT FK_CHAT_PARTICIPANT_CHAT_ROOM_ID FOREIGN KEY (chat_room_id) REFERENCES chat_room (id),
17+
CONSTRAINT FK_CHAT_PARTICIPANT_SITE_USER_ID FOREIGN KEY (site_user_id) REFERENCES site_user (id),
18+
CONSTRAINT UK_CHAT_PARTICIPANT_CHAT_ROOM_ID_SITE_USER_ID UNIQUE (chat_room_id, site_user_id)
19+
);
20+
21+
CREATE TABLE chat_message
22+
(
23+
id BIGINT AUTO_INCREMENT PRIMARY KEY,
24+
content VARCHAR(500) NOT NULL,
25+
sender_id BIGINT NOT NULL,
26+
chat_room_id BIGINT NOT NULL,
27+
created_at DATETIME(6) NOT NULL,
28+
updated_at DATETIME(6) NOT NULL,
29+
CONSTRAINT FK_CHAT_MESSAGE_CHAT_ROOM_ID FOREIGN KEY (chat_room_id) REFERENCES chat_room (id),
30+
CONSTRAINT FK_CHAT_MESSAGE_SENDER_ID FOREIGN KEY (sender_id) REFERENCES chat_participant (id)
31+
);
32+
33+
CREATE TABLE chat_attachment
34+
(
35+
id BIGINT AUTO_INCREMENT PRIMARY KEY,
36+
is_image BOOLEAN NOT NULL,
37+
url VARCHAR(500) NOT NULL,
38+
thumbnail_url VARCHAR(500),
39+
chat_message_id BIGINT NOT NULL,
40+
created_at DATETIME(6) NOT NULL,
41+
updated_at DATETIME(6) NOT NULL,
42+
CONSTRAINT FK_CHAT_ATTACHMENT_CHAT_MESSAGE_ID FOREIGN KEY (chat_message_id) REFERENCES chat_message (id)
43+
);
44+
45+
CREATE TABLE chat_read_status
46+
(
47+
id BIGINT AUTO_INCREMENT PRIMARY KEY,
48+
chat_room_id BIGINT NOT NULL,
49+
chat_participant_id BIGINT NOT NULL,
50+
created_at DATETIME(6) NOT NULL,
51+
updated_at DATETIME(6) NOT NULL,
52+
CONSTRAINT FK_CHAT_READ_STATUS_CHAT_ROOM_ID FOREIGN KEY (chat_room_id) REFERENCES chat_room (id),
53+
CONSTRAINT FK_CHAT_READ_STATUS_CHAT_PARTICIPANT_ID FOREIGN KEY (chat_participant_id) REFERENCES chat_participant (id),
54+
CONSTRAINT UK_CHAT_READ_STATUS_CHAT_ROOM_ID_CHAT_PARTICIPANT_ID UNIQUE (chat_room_id, chat_participant_id)
55+
);

0 commit comments

Comments
 (0)