-
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] Minigame refact & r2dbc 추가 #21
Changes from all commits
7c8b0c5
cfb0b2e
bb037dc
e28032a
1c21d33
1ccf513
c96908c
9e71b9d
639a9e1
8a702b3
0a66fab
e09f777
5aefa08
aabe58f
0307c29
b83f90b
da96896
fd84733
ed5c0fe
4d5c7b4
962f73b
e2c325a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
package kutaverse.game.minigame.domain; | ||
|
||
|
||
import kutaverse.game.websocket.minigame.dto.GameUpdateDTO; | ||
import lombok.AllArgsConstructor; | ||
import lombok.Builder; | ||
import lombok.NoArgsConstructor; | ||
import lombok.Setter; | ||
import org.springframework.data.annotation.CreatedDate; | ||
import org.springframework.data.annotation.Id; | ||
import org.springframework.data.annotation.LastModifiedDate; | ||
import org.springframework.data.relational.core.mapping.Column; | ||
import org.springframework.data.relational.core.mapping.Table; | ||
|
||
import java.time.LocalDateTime; | ||
|
||
@Table("game_results") | ||
@Builder | ||
@NoArgsConstructor | ||
@AllArgsConstructor | ||
public class GameResult { | ||
@Id | ||
private Long id; | ||
|
||
@Column("player1_id") | ||
private String player1Id; | ||
|
||
@Column("player2_id") | ||
private String player2Id; | ||
|
||
@Column("player1_score") | ||
private int player1Score; | ||
|
||
@Column("player2_score") | ||
private int player2Score; | ||
|
||
@Column("winner_id") | ||
private String winnerId; | ||
|
||
@Column("room_id") | ||
private String roomId; | ||
|
||
@CreatedDate | ||
@Column("created_at") | ||
private LocalDateTime createdAt; | ||
|
||
@LastModifiedDate | ||
@Column("updated_at") | ||
private LocalDateTime updatedAt; | ||
|
||
|
||
public void update(GameUpdateDTO gameUpdateDTO){ | ||
player1Score = gameUpdateDTO.getPlayer1Score(); | ||
player2Score = gameUpdateDTO.getPlayer2Score(); | ||
winnerId = gameUpdateDTO.getWinnerId(); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package kutaverse.game.minigame.repository; | ||
|
||
import kutaverse.game.minigame.domain.GameResult; | ||
import org.springframework.data.repository.reactive.ReactiveCrudRepository; | ||
import org.springframework.stereotype.Repository; | ||
import reactor.core.publisher.Flux; | ||
import reactor.core.publisher.Mono; | ||
|
||
public interface MiniGameReactiveRepository extends ReactiveCrudRepository<GameResult,Long> { | ||
|
||
Flux<GameResult> findByPlayer1Id(String userId); | ||
|
||
Mono<GameResult> findByRoomId(String id); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
package kutaverse.game.minigame.repository; | ||
|
||
import kutaverse.game.minigame.domain.GameResult; | ||
import reactor.core.publisher.Flux; | ||
import reactor.core.publisher.Mono; | ||
|
||
public interface MiniGameRepository { | ||
// 해당 방 게임 결과의 데이터 가져오기 | ||
Mono<GameResult> findByRoomId(String id); | ||
|
||
// 방 생성 시 초기화 | ||
Mono<GameResult> save(GameResult gameResult); | ||
|
||
// 게임 종료 시 방 데이터 변경 | ||
Mono<GameResult> update(GameResult gameResult); | ||
|
||
// 해당 유저 게임 정보 가져오기 | ||
Flux<GameResult> findByPlayerId(String userId); | ||
|
||
// 해당 데이터 삭제 | ||
Mono<Void> delete(Long id); | ||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
package kutaverse.game.minigame.repository; | ||
|
||
import kutaverse.game.minigame.domain.GameResult; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Repository; | ||
import reactor.core.publisher.Flux; | ||
import reactor.core.publisher.Mono; | ||
|
||
@Repository | ||
@RequiredArgsConstructor | ||
public class MiniGameRepositoryImpl implements MiniGameRepository{ | ||
private final MiniGameReactiveRepository mgrRepository; | ||
|
||
@Override | ||
public Mono<GameResult> findByRoomId(String id) { | ||
return mgrRepository.findByRoomId(id); | ||
} | ||
|
||
@Override | ||
public Mono<GameResult> save(GameResult gameResult) { | ||
return mgrRepository.save(gameResult); | ||
} | ||
|
||
@Override | ||
public Mono<GameResult> update(GameResult gameResult) { | ||
return mgrRepository.save(gameResult); | ||
} | ||
|
||
@Override | ||
public Flux<GameResult> findByPlayerId(String userId) { | ||
return mgrRepository.findByPlayer1Id(userId); | ||
} | ||
|
||
@Override | ||
public Mono<Void> delete(Long id) { | ||
return mgrRepository.deleteById(id); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
package kutaverse.game.minigame.service; | ||
|
||
import kutaverse.game.minigame.domain.GameResult; | ||
import kutaverse.game.websocket.minigame.dto.GameResultDTO; | ||
import kutaverse.game.websocket.minigame.dto.GameUpdateDTO; | ||
import reactor.core.publisher.Flux; | ||
import reactor.core.publisher.Mono; | ||
|
||
public interface MiniGameService { | ||
Mono<GameResult> createGameResult(GameResultDTO gameResultDTO); | ||
|
||
Mono<GameResult> updateGameResult(GameUpdateDTO gameUpdateDTO); | ||
|
||
Mono<Void> deleteGameResult(Long id); | ||
|
||
Flux<GameResult> findGameResultsByPlayerId(String playerId); | ||
|
||
Mono<GameResult> findGameResultById(String id); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
package kutaverse.game.minigame.service; | ||
|
||
import kutaverse.game.minigame.domain.GameResult; | ||
import kutaverse.game.minigame.repository.MiniGameReactiveRepository; | ||
import kutaverse.game.minigame.repository.MiniGameRepository; | ||
import kutaverse.game.websocket.minigame.dto.GameResultDTO; | ||
import kutaverse.game.websocket.minigame.dto.GameUpdateDTO; | ||
import lombok.RequiredArgsConstructor; | ||
import lombok.extern.slf4j.Slf4j; | ||
import org.springframework.stereotype.Service; | ||
import org.springframework.transaction.annotation.Transactional; | ||
import reactor.core.publisher.Flux; | ||
import reactor.core.publisher.Mono; | ||
|
||
|
||
@Service | ||
@Slf4j | ||
@RequiredArgsConstructor | ||
public class MiniGameServiceImpl implements MiniGameService{ | ||
private final MiniGameRepository mgrRepository ; | ||
|
||
@Override | ||
public Mono<GameResult> createGameResult(GameResultDTO gameResultDTO) { | ||
GameResult gameResult = gameResultDTO.toEntity(); | ||
return mgrRepository.save(gameResult); | ||
} | ||
|
||
@Transactional | ||
public Mono<GameResult> updateGameResult(GameUpdateDTO gameUpdateDTO){ | ||
return mgrRepository.findByRoomId(gameUpdateDTO.getRoomId()) | ||
.flatMap(gameResult -> { | ||
gameResult.update(gameUpdateDTO); | ||
Comment on lines
+31
to
+32
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 아직 리액티브 프로그래밍이 익숙하지 않아 거의 flatMap에 의존하여 사용하고 있는거 같습니다(거의 무적으로 쓰는듯...). 저번에 말해주신 것처럼 코스트가 크다고 했던 걸로 기억하여 대체할만한 것을 찾아 리팩토링 해보겠습니다. |
||
log.info(String.valueOf(gameUpdateDTO.getPlayer1Score())); | ||
return mgrRepository.save(gameResult); | ||
}); | ||
} | ||
|
||
|
||
@Override | ||
public Mono<Void> deleteGameResult(Long id) { | ||
return mgrRepository.delete(id); | ||
} | ||
|
||
@Override | ||
public Flux<GameResult> findGameResultsByPlayerId(String playerId) { | ||
return mgrRepository.findByPlayerId(playerId); | ||
} | ||
|
||
@Override | ||
public Mono<GameResult> findGameResultById(String id) { | ||
return mgrRepository.findByRoomId(id); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
package kutaverse.game.websocket.minigame.dto; | ||
|
||
import kutaverse.game.minigame.domain.GameResult; | ||
import lombok.AllArgsConstructor; | ||
import org.springframework.data.relational.core.mapping.Column; | ||
|
||
@AllArgsConstructor | ||
public class GameResultDTO { | ||
private String player1Id; | ||
|
||
private String player2Id; | ||
|
||
private String roomId; | ||
|
||
public GameResult toEntity(){ | ||
return GameResult.builder() | ||
.player1Id(player1Id) | ||
.player2Id(player2Id) | ||
.roomId(roomId) | ||
.build(); | ||
} | ||
} |
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.
JPA처럼 엔티티 mapping이 되나요?
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.
찾아보니 매핑이 되는 것으로 확인하였습니다. 매핑은 되나 DDL이 지원되지는 않는 것 같습니다. 만약 DB에 해당 테이블이 있다면 매핑은 됩니다.