diff --git a/build.gradle b/build.gradle index 7327a16..b9eb9d2 100644 --- a/build.gradle +++ b/build.gradle @@ -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' @@ -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' } diff --git a/src/main/java/com/myteam/chat/ChatApplication.java b/src/main/java/com/myteam/chat/ChatApplication.java index cc2e620..e6fb34b 100644 --- a/src/main/java/com/myteam/chat/ChatApplication.java +++ b/src/main/java/com/myteam/chat/ChatApplication.java @@ -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) { diff --git a/src/main/java/com/myteam/chat/batch/chatroom/ChatRoomSchedule.java b/src/main/java/com/myteam/chat/batch/chatroom/ChatRoomSchedule.java new file mode 100644 index 0000000..d70db47 --- /dev/null +++ b/src/main/java/com/myteam/chat/batch/chatroom/ChatRoomSchedule.java @@ -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); + } + }); + } + + } +} diff --git a/src/main/java/com/myteam/chat/chat/controller/ChatRoomController.java b/src/main/java/com/myteam/chat/chat/controller/ChatRoomController.java index de282ae..72c820f 100644 --- a/src/main/java/com/myteam/chat/chat/controller/ChatRoomController.java +++ b/src/main/java/com/myteam/chat/chat/controller/ChatRoomController.java @@ -18,8 +18,8 @@ public class ChatRoomController { private final ChatRoomService chatRoomService; - @PostMapping - public ResponseEntity createChatRoom(@RequestBody ChatRoomSaveRequest chatRoomSaveRequest) { - return ResponseEntity.ok(chatRoomService.createChatRoom(chatRoomSaveRequest.getRoomId())); - } + // @PostMapping + // public ResponseEntity createChatRoom(@RequestBody ChatRoomSaveRequest chatRoomSaveRequest) { + // return ResponseEntity.ok(chatRoomService.createChatRoom(chatRoomSaveRequest.getRoomId())); + // } } diff --git a/src/main/java/com/myteam/chat/chat/domain/Chat.java b/src/main/java/com/myteam/chat/chat/domain/Chat.java index 3134935..c4f0a05 100644 --- a/src/main/java/com/myteam/chat/chat/domain/Chat.java +++ b/src/main/java/com/myteam/chat/chat/domain/Chat.java @@ -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; @@ -14,7 +17,7 @@ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity -public class Chat { +public class Chat extends BaseTime { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -22,10 +25,12 @@ public class Chat { private String sender; + @Column(name = "sender_email") private String senderEmail; private String message; + @Column(name = "send_date") private LocalDateTime sendDate; @Builder diff --git a/src/main/java/com/myteam/chat/chat/domain/ChatRoom.java b/src/main/java/com/myteam/chat/chat/domain/ChatRoom.java index 7576802..3b7569e 100644 --- a/src/main/java/com/myteam/chat/chat/domain/ChatRoom.java +++ b/src/main/java/com/myteam/chat/chat/domain/ChatRoom.java @@ -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; @@ -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; } } diff --git a/src/main/java/com/myteam/chat/chat/repository/ChatRoomRepository.java b/src/main/java/com/myteam/chat/chat/repository/ChatRoomRepository.java index 1298776..f37fd9f 100644 --- a/src/main/java/com/myteam/chat/chat/repository/ChatRoomRepository.java +++ b/src/main/java/com/myteam/chat/chat/repository/ChatRoomRepository.java @@ -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 { + + @Query("SELECT c FROM chat_room c WHERE c.startTime < :startOfDay") + List findChatRoomYesterDay(@Param("startOfDay") LocalDate startOfDay); + + boolean existsById(Long id); } diff --git a/src/main/java/com/myteam/chat/chat/service/ChatRoomReadService.java b/src/main/java/com/myteam/chat/chat/service/ChatRoomReadService.java new file mode 100644 index 0000000..7875d8f --- /dev/null +++ b/src/main/java/com/myteam/chat/chat/service/ChatRoomReadService.java @@ -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 findChatRoomYesterDay() { + return chatRoomRepository.findChatRoomYesterDay(LocalDate.now()); + } + + public boolean existsById(Long id) { + return chatRoomRepository.existsById(id); + } +} diff --git a/src/main/java/com/myteam/chat/chat/service/ChatRoomService.java b/src/main/java/com/myteam/chat/chat/service/ChatRoomService.java index bebe48f..f934c6a 100644 --- a/src/main/java/com/myteam/chat/chat/service/ChatRoomService.java +++ b/src/main/java/com/myteam/chat/chat/service/ChatRoomService.java @@ -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; @@ -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(); } diff --git a/src/main/java/com/myteam/chat/global/config/PrimaryConfig.java b/src/main/java/com/myteam/chat/global/config/PrimaryConfig.java new file mode 100644 index 0000000..5a063df --- /dev/null +++ b/src/main/java/com/myteam/chat/global/config/PrimaryConfig.java @@ -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 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; + } +} diff --git a/src/main/java/com/myteam/chat/global/config/SecondDBConfig.java b/src/main/java/com/myteam/chat/global/config/SecondDBConfig.java new file mode 100644 index 0000000..b25f837 --- /dev/null +++ b/src/main/java/com/myteam/chat/global/config/SecondDBConfig.java @@ -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 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; + } +} diff --git a/src/main/java/com/myteam/chat/match/match/domain/Match.java b/src/main/java/com/myteam/chat/match/match/domain/Match.java new file mode 100644 index 0000000..7790516 --- /dev/null +++ b/src/main/java/com/myteam/chat/match/match/domain/Match.java @@ -0,0 +1,63 @@ +package com.myteam.chat.match.match.domain; + +import java.time.LocalDateTime; + +import com.myteam.chat.global.domain.BaseTime; +import com.myteam.chat.match.team.domain.Team; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity(name = "p_match") +public class Match extends BaseTime { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "home_team_id") + private Team homeTeam; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "away_team_id") + private Team awayTeam; + + private String place; + + @Column(name = "league_name") + private String leagueName; + + @Enumerated(EnumType.STRING) + private MatchCategory category; + + @Column(name = "start_time") + private LocalDateTime startTime; + + @Column(name = "end_time") + private LocalDateTime endTime; + @Builder + public Match(Long id, Team homeTeam, Team awayTeam, String place, String leagueName, MatchCategory category, LocalDateTime startTime, LocalDateTime endTime) { + this.id = id; + this.homeTeam = homeTeam; + this.awayTeam = awayTeam; + this.place = place; + this.leagueName = leagueName; + this.category = category; + this.startTime = startTime; + this.endTime = endTime; + } +} diff --git a/src/main/java/com/myteam/chat/match/match/domain/MatchCategory.java b/src/main/java/com/myteam/chat/match/match/domain/MatchCategory.java new file mode 100644 index 0000000..2a6e726 --- /dev/null +++ b/src/main/java/com/myteam/chat/match/match/domain/MatchCategory.java @@ -0,0 +1,15 @@ +package com.myteam.chat.match.match.domain; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum MatchCategory { + BASEBALL("야구"), + ESPORTS("E스포츠"), + FOOTBALL("축구"), + ALL("전체"); + + private final String text; +} diff --git a/src/main/java/com/myteam/chat/match/match/repository/MatchRepository.java b/src/main/java/com/myteam/chat/match/match/repository/MatchRepository.java new file mode 100644 index 0000000..78c9084 --- /dev/null +++ b/src/main/java/com/myteam/chat/match/match/repository/MatchRepository.java @@ -0,0 +1,29 @@ +package com.myteam.chat.match.match.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import com.myteam.chat.match.match.domain.Match; + +@Repository +public interface MatchRepository extends JpaRepository { + @Query(value = "SELECT * FROM p_match m WHERE m.start_time >= :startOfDay AND m.start_time <= :endOfTomorrow AND m.category = :matchCategory", nativeQuery = true) + List findMatchesTodayAndTomorrow(@Param("startOfDay") String startOfDay, + @Param("endOfTomorrow") String endOfTomorrow, + @Param("matchCategory") String matchCategory); + + @Query(value = + "WITH RankedMatches AS (" + + " SELECT m.*, ROW_NUMBER() OVER (PARTITION BY DATE(m.start_time) ORDER BY m.start_time DESC) AS rn " + + " FROM p_match m " + + " WHERE m.start_time >= :startOfDay AND m.start_time <= :endOfTomorrow " + + " AND m.category = 'ESPORTS'" + + ") " + + "SELECT * FROM RankedMatches WHERE rn = 1", nativeQuery = true) + List findLastEsportsMatchPerDay(@Param("startOfDay") String startOfDay, + @Param("endOfTomorrow") String endOfTomorrow); +} diff --git a/src/main/java/com/myteam/chat/match/match/service/MatchReadService.java b/src/main/java/com/myteam/chat/match/match/service/MatchReadService.java new file mode 100644 index 0000000..a2f9a68 --- /dev/null +++ b/src/main/java/com/myteam/chat/match/match/service/MatchReadService.java @@ -0,0 +1,30 @@ +package com.myteam.chat.match.match.service; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.myteam.chat.match.match.domain.Match; +import com.myteam.chat.match.match.domain.MatchCategory; +import com.myteam.chat.match.match.repository.MatchRepository; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class MatchReadService { + + private final MatchRepository matchRepository; + + public List findMatchesTodayAndTomorrow(String startOfDay, String endOfTomorrow, + MatchCategory matchCategory) { + return matchRepository.findMatchesTodayAndTomorrow(startOfDay, endOfTomorrow, matchCategory.name()); + } + + public List findLastEsportsMatchPerDay(String startOfDay, String endOfTomorrow) { + return matchRepository.findLastEsportsMatchPerDay(startOfDay, endOfTomorrow); + } + +} diff --git a/src/main/java/com/myteam/chat/match/team/domain/Team.java b/src/main/java/com/myteam/chat/match/team/domain/Team.java new file mode 100644 index 0000000..85c7a0c --- /dev/null +++ b/src/main/java/com/myteam/chat/match/team/domain/Team.java @@ -0,0 +1,38 @@ +package com.myteam.chat.match.team.domain; + +import com.myteam.chat.global.domain.BaseTime; + +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity(name = "p_team") +public class Team extends BaseTime { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + private String name; + + private String logo; + + @Enumerated(EnumType.STRING) + private TeamCategory category; + + @Builder + public Team(int id, String name, String logo, TeamCategory category) { + this.id = id; + this.name = name; + this.logo = logo; + this.category = category; + } +} diff --git a/src/main/java/com/myteam/chat/match/team/domain/TeamCategory.java b/src/main/java/com/myteam/chat/match/team/domain/TeamCategory.java new file mode 100644 index 0000000..95379cc --- /dev/null +++ b/src/main/java/com/myteam/chat/match/team/domain/TeamCategory.java @@ -0,0 +1,14 @@ +package com.myteam.chat.match.team.domain; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum TeamCategory { + BASEBALL("야구"), + ESPORTS("E스포츠"), + FOOTBALL("축구"); + + private final String text; +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index c3a19e5..aa367ea 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -4,28 +4,17 @@ spring: datasource: driver-class-name: org.postgresql.Driver - url: jdbc:postgresql://${DB_ENDPOINT}:6543/${DB_NAME}?useSSL=false&serverTimezone=Asia/Seoul + jdbc-url: jdbc:postgresql://${DB_ENDPOINT}:6543/${DB_NAME}?useSSL=false&serverTimezone=Asia/Seoul username: postgres.vicajgpdbhjueqmakcme password: ${DB_PASSWORD} - jpa: - show-sql: false - properties: - hibernate: - format_sql: false - use_sql_comments: false - default_batch_fetch_size: 1000 #??? ?? - jdbc: - time_zone: Asia/Seoul - hibernate: - ddl-auto: update - # create ?????? ???? ?? ?? - # create-drop ?????? ???? ????. ?? ??? ????? - # update ??? ??? ?? (?? DB ?? ??X) - # validate Entity ? ???? ?? ?? ???? ?? - # none ?????? ? ?? ???? ??. - open-in-view: true + second-datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + jdbc-url: jdbc:mysql://${SECOND_DB_ENDPOINT}:3306/${SECOND_DB_NAME}?useSSL=false&serverTimezone=Asia/Seoul + username: playhive + password: ${SECOND_DB_PASSWORD} jwt: - issuer: ${JWT_ISSUER} - secret-key: ${JWT_SECRET_KEY} + issuer: myteam.org + secret-key: 401b09eab3c013d4ca54922bb802bec8fd5318192b0a75f201d8b3727429080fb337591abd3e44453b954555b7a0812e1081c39b740293f765eae731f5a65ed1 +