Skip to content

Commit ec41123

Browse files
committed
feat: 채팅 기능 기본 구성 추가 (#112)
1 parent 01d08e6 commit ec41123

File tree

10 files changed

+172
-40
lines changed

10 files changed

+172
-40
lines changed

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,10 @@ dependencies {
6464
testImplementation 'org.springframework.boot:spring-boot-starter-test'
6565
testImplementation 'org.springframework.security:spring-security-test'
6666
developmentOnly 'org.springframework.boot:spring-boot-devtools'
67+
//웹소켓
6768
implementation 'org.springframework.boot:spring-boot-starter-websocket'
69+
implementation 'org.webjars:stomp-websocket:2.3.3-1'
70+
implementation 'org.webjars:sockjs-client:1.1.2'
6871
}
6972

7073
jar {

src/main/java/shop/fevertime/backend/api/AlarmApiController.java renamed to src/main/java/shop/fevertime/backend/api/ChatApiController.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,20 @@
55
import org.springframework.messaging.simp.SimpMessageSendingOperations;
66
import org.springframework.stereotype.Controller;
77
import org.springframework.web.bind.annotation.RequestBody;
8+
import shop.fevertime.backend.dto.ChatMessageDto;
89
import shop.fevertime.backend.dto.MessageDto;
910

1011
@Controller
1112
@RequiredArgsConstructor
12-
public class AlarmApiController {
13+
public class ChatApiController {
1314

1415
private final SimpMessageSendingOperations messagingTemplate;
1516

16-
@MessageMapping("/post")
17-
public void addUser(@RequestBody MessageDto dto) {
18-
messagingTemplate.convertAndSend("/topic/feed/"+ dto.getUserId(), dto);
17+
@MessageMapping("/chat/message")
18+
public void addUser(@RequestBody ChatMessageDto messageDto) {
19+
if (ChatMessageDto.MessageType.ENTER.equals(messageDto.getType()))
20+
messageDto.setMessage(messageDto.getSender() + "님이 입장하셨습니다.");
21+
messagingTemplate.convertAndSend("/sub/chat/room/" + messageDto.getRoomId(), messageDto);
1922
}
2023

2124
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package shop.fevertime.backend.api;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
5+
import org.springframework.stereotype.Controller;
6+
import org.springframework.web.bind.annotation.*;
7+
import shop.fevertime.backend.domain.ChatRoom;
8+
import shop.fevertime.backend.dto.ChatRoomDto;
9+
import shop.fevertime.backend.dto.response.ResultResponseDto;
10+
import shop.fevertime.backend.repository.ChatRoomRepository;
11+
import shop.fevertime.backend.security.UserDetailsImpl;
12+
import shop.fevertime.backend.service.ChatRoomService;
13+
14+
import java.util.List;
15+
16+
@RequiredArgsConstructor
17+
@RestController
18+
@RequestMapping("/chat")
19+
public class ChatRoomApiController {
20+
21+
private final ChatRoomRepository chatRoomRepository;
22+
private final ChatRoomService chatRoomService;
23+
24+
/**
25+
* 채팅방 목록 조회 API
26+
*/
27+
//반환값 dto로 변경해야함
28+
@GetMapping("/rooms")
29+
public List<ChatRoom> getRooms() {
30+
return chatRoomService.getAllRooms();
31+
}
32+
33+
/**
34+
* 채팅방 생성 API
35+
*/
36+
@PostMapping("/room")
37+
public ResultResponseDto createRoom(@RequestBody ChatRoomDto chatRoomDto,
38+
@AuthenticationPrincipal UserDetailsImpl userDetails) {
39+
chatRoomService.createRoom(chatRoomDto, userDetails.getUser());
40+
return new ResultResponseDto("success", "채팅 방이 생성되었습니다.");
41+
}
42+
43+
/**
44+
* 채팅방 삭제 API
45+
*/
46+
@DeleteMapping("/room/{roomId}")
47+
public ResultResponseDto deleteRoom(@PathVariable Long roomId,
48+
@AuthenticationPrincipal UserDetailsImpl userDetails) {
49+
chatRoomService.deleteRoom(roomId, userDetails.getUser());
50+
return new ResultResponseDto("success", "채팅 방이 삭제되었습니다.");
51+
}
52+
53+
}

src/main/java/shop/fevertime/backend/config/StompHandler.java

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

src/main/java/shop/fevertime/backend/config/WebSocketConfig.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,14 @@
1313
@EnableWebSocketMessageBroker // EnableWebsocket 알아보기. , 자료구조 Queue, STOMP 검색해서 통신 방법 알아보기
1414
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { // websoket.io, 만약 댓글을 10만명이 달게 된다면?, port를 잡는다. 확장이 어렵다.
1515

16-
private final StompHandler stompHandler; // jwt 토큰 인증 핸들러
17-
1816
@Override
1917
public void configureMessageBroker(MessageBrokerRegistry registry) {
20-
registry.enableSimpleBroker("/topic"); // 메모리 기반 메세지 브로커가 해당 api를 구독하고 있는 클라이언트에게 메세지를 전달한다.
18+
registry.enableSimpleBroker("/sub"); // 메모리 기반 메세지 브로커가 해당 api를 구독하고 있는 클라이언트에게 메세지를 전달한다.
2119
registry.setApplicationDestinationPrefixes("/pub"); // 서버에서 클라이언트로부터의 메세지를 받을 api를 prefix 설정한다.
2220
}
2321

2422
@Override
2523
public void registerStompEndpoints(StompEndpointRegistry registry) { // 클라이언트에서 websoket을 연결할 api를 설정한다.
26-
registry.addEndpoint("/websocket").setAllowedOrigins("https://api.fevertime.shop", "https://www.fevertime.shop", "http://localhost:8080", "http://localhost:63342").withSockJS();
27-
}
28-
29-
@Override
30-
public void configureClientInboundChannel(ChannelRegistration registration) {// channel: 데이터가 흘러 들어오는 공간, 채널에 대한 필터, 패턴 매칭, 조건 확인
31-
registration.interceptors(stompHandler); //핸들러 등록
24+
registry.addEndpoint("/ws-stomp").setAllowedOrigins("https://api.fevertime.shop", "https://www.fevertime.shop", "http://localhost:8080", "http://localhost:63342").withSockJS();
3225
}
3326
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package shop.fevertime.backend.domain;
2+
3+
import lombok.Getter;
4+
import lombok.NoArgsConstructor;
5+
import shop.fevertime.backend.dto.ChatRoomDto;
6+
7+
import javax.persistence.*;
8+
9+
@Getter
10+
@NoArgsConstructor
11+
@Entity
12+
public class ChatRoom extends BaseTimeEntity {
13+
14+
@Id // ID 값, Primary Key로 사용하겠다는 뜻입니다.
15+
@GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령입니다.
16+
@Column(name = "room_id")
17+
private Long id;
18+
19+
@Column // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
20+
private String name;
21+
22+
@ManyToOne(fetch = FetchType.LAZY)
23+
@JoinColumn(name = "user_id")
24+
private User user;
25+
26+
public ChatRoom(ChatRoomDto chatRoomDto, User user) {
27+
this.name = chatRoomDto.getName();
28+
this.user = user;
29+
}
30+
31+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package shop.fevertime.backend.dto;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
6+
@Getter
7+
@Setter
8+
public class ChatMessageDto {
9+
//메세지 타입 : 입장, 채팅
10+
public enum MessageType {
11+
ENTER, TALK
12+
}
13+
private MessageType type; //메세지 타입
14+
private String roomId;
15+
private String sender;
16+
private String message;
17+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package shop.fevertime.backend.dto;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
6+
@Getter
7+
@Setter
8+
public class ChatRoomDto {
9+
private String name;
10+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package shop.fevertime.backend.repository;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
import org.springframework.stereotype.Repository;
5+
import shop.fevertime.backend.domain.ChatRoom;
6+
import shop.fevertime.backend.domain.User;
7+
8+
@Repository
9+
public interface ChatRoomRepository extends JpaRepository<ChatRoom, Long> {
10+
ChatRoom findByIdAndUser(Long roomId, User user);
11+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package shop.fevertime.backend.service;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import lombok.extern.slf4j.Slf4j;
5+
import org.springframework.data.domain.Sort;
6+
import org.springframework.stereotype.Service;
7+
import org.springframework.transaction.annotation.Transactional;
8+
import shop.fevertime.backend.domain.ChatRoom;
9+
import shop.fevertime.backend.domain.User;
10+
import shop.fevertime.backend.dto.ChatRoomDto;
11+
import shop.fevertime.backend.repository.ChatRoomRepository;
12+
13+
import java.util.List;
14+
15+
@Slf4j
16+
@RequiredArgsConstructor
17+
@Service
18+
public class ChatRoomService {
19+
20+
private final ChatRoomRepository chatRoomRepository;
21+
22+
//반환값 dto로 바꿔야함
23+
public List<ChatRoom> getAllRooms() {
24+
return chatRoomRepository.findAll(Sort.by(Sort.Direction.DESC, "createdDate"));
25+
}
26+
27+
@Transactional
28+
public void createRoom(ChatRoomDto chatRoomDto, User user) {
29+
chatRoomRepository.save(new ChatRoom(chatRoomDto, user));
30+
}
31+
32+
@Transactional
33+
public void deleteRoom(Long roomId, User user) {
34+
ChatRoom chatRoom = chatRoomRepository.findByIdAndUser(roomId, user);
35+
chatRoomRepository.delete(chatRoom);
36+
}
37+
38+
}

0 commit comments

Comments
 (0)