Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ dependencies {

// postgre-sql 추가
implementation 'org.postgresql:postgresql:42.7.3'
// mysql-connector 추가
implementation group: 'com.mysql', name: 'mysql-connector-j', version: '8.3.0'

// commons-io
implementation 'commons-io:commons-io:2.14.0'
Expand All @@ -69,11 +71,6 @@ dependencies {

//openfeign
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign:4.1.3'

// Redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
// Redisson
implementation 'org.redisson:redisson-spring-boot-starter:3.23.4'
// Jwt
implementation 'io.jsonwebtoken:jjwt:0.12.6'
}
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/myteam/chat/ChatApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling
@SpringBootApplication
@EnableJpaAuditing
public class ChatApplication {

public static void main(String[] args) {
Expand Down
68 changes: 68 additions & 0 deletions src/main/java/com/myteam/chat/batch/chatroom/ChatRoomSchedule.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.myteam.chat.batch.chatroom;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.myteam.chat.chat.service.ChatRoomReadService;
import com.myteam.chat.chat.service.ChatRoomService;
import com.myteam.chat.kafka.service.TopicManagementService;
import com.myteam.chat.match.match.domain.Match;
import com.myteam.chat.match.match.domain.MatchCategory;
import com.myteam.chat.match.match.service.MatchReadService;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
@Transactional
public class ChatRoomSchedule {

private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

private final TopicManagementService topicManagementService;
private final MatchReadService matchReadService;
private final ChatRoomService chatRoomService;
private final ChatRoomReadService chatRoomReadService;

//매일 새벽 3시
@Scheduled(cron = "0 0 3 * * *")
public void chatRoomCron() {
//채팅방 토픽 삭제
chatRoomReadService.findChatRoomYesterDay().forEach(chatRoom -> {
topicManagementService.deleteTopic("room-" + chatRoom.getId());
});

//채팅방 생성 오늘부터 이틀 뒤 까지
LocalDateTime startOfDay = LocalDateTime.now().toLocalDate().atStartOfDay();
LocalDateTime endOfTomorrow = startOfDay.plusDays(3);
String startStr = startOfDay.format(DATE_TIME_FORMATTER);
String endStr = endOfTomorrow.format(DATE_TIME_FORMATTER);

for (MatchCategory category : MatchCategory.values()) {
if (category.equals(MatchCategory.ESPORTS)) { //ESPORTS는 당일의 마지막경기 ID 기준으로 채팅방을 생성함 (길표님이랑 이야기됌)
matchReadService.findLastEsportsMatchPerDay(startStr, endStr)
.forEach(match -> {
if (!chatRoomReadService.existsById(match.getId())) {
chatRoomService.createChatRoom(match);
}
});
continue;
}

matchReadService.findMatchesTodayAndTomorrow(startStr, endStr, category)
.forEach(match -> {
if (!chatRoomReadService.existsById(match.getId())) {
chatRoomService.createChatRoom(match);
}
});
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ public class ChatRoomController {

private final ChatRoomService chatRoomService;

@PostMapping
public ResponseEntity<Long> createChatRoom(@RequestBody ChatRoomSaveRequest chatRoomSaveRequest) {
return ResponseEntity.ok(chatRoomService.createChatRoom(chatRoomSaveRequest.getRoomId()));
}
// @PostMapping
// public ResponseEntity<Long> createChatRoom(@RequestBody ChatRoomSaveRequest chatRoomSaveRequest) {
// return ResponseEntity.ok(chatRoomService.createChatRoom(chatRoomSaveRequest.getRoomId()));
// }
}
7 changes: 6 additions & 1 deletion src/main/java/com/myteam/chat/chat/domain/Chat.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

import java.time.LocalDateTime;

import com.myteam.chat.global.domain.BaseTime;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
Expand All @@ -14,18 +17,20 @@
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Chat {
public class Chat extends BaseTime {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String sender;

@Column(name = "sender_email")
private String senderEmail;

private String message;

@Column(name = "send_date")
private LocalDateTime sendDate;

@Builder
Expand Down
15 changes: 12 additions & 3 deletions src/main/java/com/myteam/chat/chat/domain/ChatRoom.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package com.myteam.chat.chat.domain;

import java.time.LocalDateTime;

import com.myteam.chat.global.domain.BaseTime;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import lombok.AccessLevel;
Expand All @@ -9,14 +14,18 @@

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class ChatRoom {
@Entity(name = "chat_room")
public class ChatRoom extends BaseTime {

@Id
private Long id;

@Column(name = "start_time")
private LocalDateTime startTime;

@Builder
public ChatRoom(Long id) {
public ChatRoom(Long id, LocalDateTime startTime) {
this.id = id;
this.startTime = startTime;
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
package com.myteam.chat.chat.repository;

import java.time.LocalDate;
import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import com.myteam.chat.chat.domain.ChatRoom;

public interface ChatRoomRepository extends JpaRepository<ChatRoom, Long> {

@Query("SELECT c FROM chat_room c WHERE c.startTime < :startOfDay")
List<ChatRoom> findChatRoomYesterDay(@Param("startOfDay") LocalDate startOfDay);

boolean existsById(Long id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.myteam.chat.chat.service;

import java.time.LocalDate;
import java.util.List;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.myteam.chat.chat.domain.ChatRoom;
import com.myteam.chat.chat.repository.ChatRoomRepository;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class ChatRoomReadService {

private final ChatRoomRepository chatRoomRepository;

public List<ChatRoom> findChatRoomYesterDay() {
return chatRoomRepository.findChatRoomYesterDay(LocalDate.now());
}

public boolean existsById(Long id) {
return chatRoomRepository.existsById(id);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.myteam.chat.chat.domain.ChatRoom;
import com.myteam.chat.chat.repository.ChatRoomRepository;
import com.myteam.chat.kafka.service.TopicManagementService;
import com.myteam.chat.match.match.domain.Match;

import lombok.RequiredArgsConstructor;

Expand All @@ -19,8 +20,9 @@ public class ChatRoomService {
private final ChatRoomRepository chatRoomRepository;
private final TopicManagementService topicManagementService;

public Long createChatRoom(Long id) {
ChatRoom chatRoom = chatRoomRepository.save(ChatRoom.builder().id(id).build());
public Long createChatRoom(Match match) {
ChatRoom chatRoom = chatRoomRepository.save(
ChatRoom.builder().id(match.getId()).startTime(match.getStartTime()).build());
topicManagementService.createTopic(ROOM_TOPIC + chatRoom.getId(), 3, (short)1);
return chatRoom.getId();
}
Expand Down
62 changes: 62 additions & 0 deletions src/main/java/com/myteam/chat/global/config/PrimaryConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.myteam.chat.global.config;

import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
@EnableJpaRepositories(
basePackages = "com.myteam.chat.chat",
entityManagerFactoryRef = "primaryEntityManager",
transactionManagerRef = "primaryTransactionManager"
)
public class PrimaryConfig {

@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}

@Bean
@Primary
public LocalContainerEntityManagerFactoryBean primaryEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(primaryDataSource());
em.setPackagesToScan("com.myteam.chat.chat");

HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setShowSql(true);
vendorAdapter.setGenerateDdl(true);
em.setJpaVendorAdapter(vendorAdapter);

Map<String, Object> prop = new HashMap<>();
prop.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
prop.put("hibernate.hbm2ddl.auto", "update");
prop.put("hibernate.format_sql", true);
em.setJpaPropertyMap(prop);

return em;
}

@Bean
@Primary
public PlatformTransactionManager primaryTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(primaryEntityManager().getObject());
return transactionManager;
}
}
58 changes: 58 additions & 0 deletions src/main/java/com/myteam/chat/global/config/SecondDBConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.myteam.chat.global.config;

import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
@EnableJpaRepositories(
basePackages = "com.myteam.chat.match",
entityManagerFactoryRef = "secondEntityManager",
transactionManagerRef = "secondTransactionManager"
)
public class SecondDBConfig {
@Bean
@ConfigurationProperties(prefix = "spring.second-datasource")
public DataSource secondDataSource() {
return DataSourceBuilder.create().build();
}

@Bean
public LocalContainerEntityManagerFactoryBean secondEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(secondDataSource());
em.setPackagesToScan("com.myteam.chat.match");

HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setShowSql(true);
vendorAdapter.setGenerateDdl(true);
em.setJpaVendorAdapter(vendorAdapter);

HashMap<String, Object> prop = new HashMap<>();
prop.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
prop.put("hibernate.hbm2ddl.auto", "none");
prop.put("hibernate.format_sql", true);
em.setJpaPropertyMap(prop);

return em;
}

@Bean
public PlatformTransactionManager secondTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(secondEntityManager().getObject());
return transactionManager;
}
}
Loading