Skip to content

Commit 7da2f14

Browse files
committed
Fix: 최신 코드 병합 충돌 제어
2 parents 2730b09 + 5c7222a commit 7da2f14

26 files changed

+675
-530
lines changed

.github/workflows/deploy.yml renamed to .github/workflows/backend-cd.yml

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: deploy
1+
name: backend-cd
22
on:
33
push:
44
paths:
@@ -61,7 +61,7 @@ jobs:
6161
- name: set lower case owner name
6262
run: |
6363
echo "OWNER_LC=${OWNER,,}" >> ${GITHUB_ENV}
64-
64+
6565
6666
- name: 빌드 앤 푸시
6767
uses: docker/build-push-action@v3
@@ -71,12 +71,18 @@ jobs:
7171
tags: |
7272
ghcr.io/${{ env.OWNER_LC }}/${{ env.DOCKER_IMAGE_NAME }}:${{ needs.makeTagAndRelease.outputs.tag_name }},
7373
ghcr.io/${{ env.OWNER_LC }}/${{ env.DOCKER_IMAGE_NAME }}:latest
74-
75-
74+
75+
7676
deploy:
7777
runs-on: ubuntu-latest
7878
needs: [ buildImageAndPush ]
79+
env:
80+
OWNER: ${{ github.repository_owner }}
7981
steps:
82+
- name: set lower case owner name
83+
run: |
84+
echo "OWNER_LC=${OWNER,,}" >> ${GITHUB_ENV}
85+
8086
- name: AWS SSM Send-Command
8187
uses: peterkimzz/aws-ssm-send-command@master
8288
id: ssm
@@ -88,7 +94,18 @@ jobs:
8894
working-directory: /
8995
comment: Deploy
9096
command: |
97+
# 0. env 변수 확인
98+
echo "OWNER_LC = ${{ env.OWNER_LC }}"
99+
100+
# 1. 최신 이미지 pull
91101
docker pull ghcr.io/${{ env.OWNER_LC }}/catfe-backend:latest
102+
103+
# 2. 기존 컨테이너 종료 및 제거
92104
docker stop catfe-backend 2>/dev/null
93105
docker rm catfe-backend 2>/dev/null
94-
docker run -d --name catfe-backend -p 8080:8080 ghcr.io/${{ env.OWNER_LC }}/catfe-backend:latest
106+
107+
# 3. 새로운 컨테이너 실행
108+
docker run -d --name catfe-backend -p 8080:8080 ghcr.io/${{ env.OWNER_LC }}/catfe-backend:latest
109+
110+
# 4. dangling 이미지 삭제
111+
docker rmi $(docker images -f "dangling=true" -q)

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ out/
4040
db_dev.mv.db
4141
db_dev.trace.db
4242
.env
43+
.env.*
4344

4445
### Terraform ###
4546
/infra/terraform/.terraform

Dockerfile

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,14 @@ WORKDIR /app
88
COPY build.gradle.kts .
99
COPY settings.gradle.kts .
1010

11+
# 종속성 설치
1112
RUN gradle dependencies --no-daemon
1213

1314
# 소스코드 복사
1415
COPY src src
1516

16-
# .env 복사
17-
COPY .env .env
18-
1917
# 애플리케이션 빌드
20-
RUN gradle build --no-daemon
18+
RUN gradle build --no-daemon -x test
2119

2220
# 두 번째 스테이지 : 실행 스테이지
2321
FROM container-registry.oracle.com/graalvm/jdk:21
@@ -26,7 +24,9 @@ WORKDIR /app
2624

2725
# 첫 번째 스테이지에서 빌드된 JAR 파일 복사
2826
COPY --from=builder /app/build/libs/*.jar app.jar
29-
COPY --from=builder /app/.env .env
27+
28+
# 빌드 컨텍스트의 .env(backend-cd 작업에서 빌드된 .env)를 컨테이너 안으로 복사
29+
COPY .env .env
3030

3131
# 실행할 JAR 파일 지정
3232
ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-jar", "app.jar"]
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.back.domain.chat.dm.controller;
2+
3+
public class PrivateChatWebSocketController {
4+
}

src/main/java/com/back/domain/chat/dto/ChatMessageDto.java

Lines changed: 0 additions & 51 deletions
This file was deleted.

src/main/java/com/back/domain/chat/dto/ChatPageResponse.java

Lines changed: 0 additions & 43 deletions
This file was deleted.

src/main/java/com/back/domain/chat/controller/ChatApiController.java renamed to src/main/java/com/back/domain/chat/room/controller/RoomChatApiController.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
package com.back.domain.chat.controller;
1+
package com.back.domain.chat.room.controller;
22

3-
import com.back.domain.chat.dto.ChatPageResponse;
4-
import com.back.domain.chat.service.ChatService;
3+
import com.back.domain.chat.room.dto.RoomChatPageResponse;
4+
import com.back.domain.chat.room.service.RoomChatService;
55
import com.back.global.common.dto.RsData;
66
import com.back.global.security.CustomUserDetails;
77
import io.swagger.v3.oas.annotations.Operation;
@@ -18,22 +18,22 @@
1818
@RestController
1919
@RequiredArgsConstructor
2020
@RequestMapping("/api")
21-
@Tag(name = "Chat API", description = "채팅 메시지 조회 관련 API")
22-
public class ChatApiController {
21+
@Tag(name = "RoomChat API", description = "스터디룸 채팅 메시지 조회 관련 API")
22+
public class RoomChatApiController {
2323

24-
private final ChatService chatService;
24+
private final RoomChatService roomChatService;
2525

2626
// 방 채팅 메시지 조회 (페이징, 특정 시간 이전 메시지)
2727
@GetMapping("/rooms/{roomId}/messages")
28-
@Operation(summary = "채팅방 메시지 목록 조회", description = "특정 채팅방의 이전 메시지 기록을 페이징하여 조회합니다.")
29-
public ResponseEntity<RsData<ChatPageResponse>> getRoomChatMessages(
28+
@Operation(summary = "스터디룸 채팅방 메시지 목록 조회", description = "특정 채팅방의 이전 메시지 기록을 페이징하여 조회합니다.")
29+
public ResponseEntity<RsData<RoomChatPageResponse>> getRoomChatMessages(
3030
@PathVariable Long roomId,
3131
@RequestParam(defaultValue = "0") int page,
3232
@RequestParam(defaultValue = "20") int size,
3333
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime before,
3434
@AuthenticationPrincipal CustomUserDetails userDetails) {
3535

36-
ChatPageResponse chatHistory = chatService.getRoomChatHistory(roomId, page, size, before);
36+
RoomChatPageResponse chatHistory = roomChatService.getRoomChatHistory(roomId, page, size, before);
3737

3838
return ResponseEntity
3939
.status(HttpStatus.OK)

src/main/java/com/back/domain/chat/controller/ChatWebSocketController.java renamed to src/main/java/com/back/domain/chat/room/controller/RoomChatWebSocketController.java

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
package com.back.domain.chat.controller;
1+
package com.back.domain.chat.room.controller;
22

33
import com.back.domain.studyroom.entity.RoomChatMessage;
4-
import com.back.domain.chat.dto.ChatMessageDto;
4+
import com.back.domain.chat.room.dto.RoomChatMessageDto;
55
import com.back.global.security.CustomUserDetails;
66
import com.back.global.websocket.dto.WebSocketErrorResponse;
7-
import com.back.domain.chat.service.ChatService;
7+
import com.back.domain.chat.room.service.RoomChatService;
88
import io.swagger.v3.oas.annotations.tags.Tag;
99
import lombok.RequiredArgsConstructor;
1010
import org.springframework.messaging.handler.annotation.DestinationVariable;
@@ -18,10 +18,10 @@
1818

1919
@Controller
2020
@RequiredArgsConstructor
21-
@Tag(name = "Chat WebSocket", description = "STOMP를 이용한 실시간 채팅 WebSocket 컨트롤러 (Swagger에서 직접 테스트 불가)")
22-
public class ChatWebSocketController {
21+
@Tag(name = "RoomChat WebSocket", description = "STOMP를 이용한 실시간 채팅 WebSocket 컨트롤러 (Swagger에서 직접 테스트 불가)")
22+
public class RoomChatWebSocketController {
2323

24-
private final ChatService chatService;
24+
private final RoomChatService roomChatService;
2525
private final SimpMessagingTemplate messagingTemplate;
2626

2727
/**
@@ -35,7 +35,7 @@ public class ChatWebSocketController {
3535
*/
3636
@MessageMapping("/chat/room/{roomId}")
3737
public void handleRoomChat(@DestinationVariable Long roomId,
38-
ChatMessageDto chatMessage,
38+
RoomChatMessageDto chatMessage,
3939
SimpMessageHeaderAccessor headerAccessor,
4040
Principal principal) {
4141

@@ -51,25 +51,26 @@ public void handleRoomChat(@DestinationVariable Long roomId,
5151
String currentUserNickname = userDetails.getUsername();
5252

5353
// 메시지 정보 보완
54-
chatMessage.setRoomId(roomId);
55-
chatMessage.setUserId(currentUserId);
56-
chatMessage.setNickname(currentUserNickname);
54+
RoomChatMessageDto enrichedMessage = chatMessage
55+
.withRoomId(roomId)
56+
.withUserId(currentUserId)
57+
.withNickname(currentUserNickname);
5758

5859
// DB에 메시지 저장
59-
RoomChatMessage savedMessage = chatService.saveRoomChatMessage(chatMessage);
60+
RoomChatMessage savedMessage = roomChatService.saveRoomChatMessage(enrichedMessage);
6061

6162
// 저장된 메시지 정보로 응답 DTO 생성
62-
ChatMessageDto responseMessage = ChatMessageDto.builder()
63-
.messageId(savedMessage.getId())
64-
.roomId(roomId)
65-
.userId(savedMessage.getUser().getId())
66-
.nickname(savedMessage.getUser().getNickname())
67-
.profileImageUrl(savedMessage.getUser().getProfileImageUrl())
68-
.content(savedMessage.getContent())
69-
.messageType(chatMessage.getMessageType())
70-
.attachment(null) // 텍스트 채팅에서는 null
71-
.createdAt(savedMessage.getCreatedAt())
72-
.build();
63+
RoomChatMessageDto responseMessage = RoomChatMessageDto.createResponse(
64+
savedMessage.getId(),
65+
roomId,
66+
savedMessage.getUser().getId(),
67+
savedMessage.getUser().getNickname(),
68+
savedMessage.getUser().getProfileImageUrl(),
69+
savedMessage.getContent(),
70+
chatMessage.messageType(),
71+
null, // 텍스트 채팅에서는 null
72+
savedMessage.getCreatedAt()
73+
);
7374

7475
// 해당 방의 모든 구독자에게 브로드캐스트
7576
messagingTemplate.convertAndSend("/topic/room/" + roomId, responseMessage);
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.back.domain.chat.room.dto;
2+
3+
import java.time.LocalDateTime;
4+
5+
public record RoomChatMessageDto(
6+
// WebSocket Request
7+
String content,
8+
String messageType,
9+
Long attachmentId,
10+
11+
// WebSocket Response
12+
Long messageId,
13+
Long roomId,
14+
Long userId,
15+
String nickname,
16+
String profileImageUrl,
17+
AttachmentDto attachment,
18+
LocalDateTime createdAt
19+
) {
20+
21+
// 첨부파일 DTO (나중에 파일 기능 구현 시 사용)
22+
public record AttachmentDto(
23+
Long id,
24+
String originalName,
25+
String url,
26+
Long size,
27+
String mimeType
28+
) {}
29+
30+
// 텍스트 채팅 요청 생성 헬퍼
31+
public static RoomChatMessageDto createRequest(String content, String messageType) {
32+
return new RoomChatMessageDto(
33+
content,
34+
messageType,
35+
null, // attachmentId - 텍스트 채팅에서는 null
36+
null, // messageId
37+
null, // roomId
38+
null, // userId
39+
null, // nickname
40+
null, // profileImageUrl
41+
null, // attachment
42+
null // createdAt
43+
);
44+
}
45+
46+
// 필드 업데이트
47+
public RoomChatMessageDto withRoomId(Long roomId) {
48+
return new RoomChatMessageDto(content, messageType, attachmentId, messageId, roomId, userId, nickname, profileImageUrl, attachment, createdAt);
49+
}
50+
51+
public RoomChatMessageDto withUserId(Long userId) {
52+
return new RoomChatMessageDto(content, messageType, attachmentId, messageId, roomId, userId, nickname, profileImageUrl, attachment, createdAt);
53+
}
54+
55+
public RoomChatMessageDto withNickname(String nickname) {
56+
return new RoomChatMessageDto(content, messageType, attachmentId, messageId, roomId, userId, nickname, profileImageUrl, attachment, createdAt);
57+
}
58+
59+
// Response용 생성자
60+
public static RoomChatMessageDto createResponse(
61+
Long messageId, Long roomId, Long userId, String nickname,
62+
String profileImageUrl, String content, String messageType,
63+
AttachmentDto attachment, LocalDateTime createdAt) {
64+
return new RoomChatMessageDto(
65+
content, messageType, null, // attachmentId는 request용이므로 null
66+
messageId, roomId, userId, nickname, profileImageUrl, attachment, createdAt
67+
);
68+
}
69+
}

0 commit comments

Comments
 (0)