From 49f3e43d40172c85e43174b0df9e46da51b93579 Mon Sep 17 00:00:00 2001 From: bcjang Date: Wed, 26 Nov 2025 14:09:47 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B8=B0=EB=B3=B8=EA=B5=AC=EC=84=B1=20?= =?UTF-8?q?=EB=8F=99=EC=9E=91=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 + .../com/domain/service/LogoutService.java | 38 +++++++ .../configuration/AuthenticationConfig.java | 8 +- .../global/configuration/MongodbConfig.java | 82 ++++++++++++++ .../global/configuration/MybatisConfig.java | 2 +- .../com/global/configuration/RedisConfig.java | 94 +++++++--------- .../mongodb/repository/MongoRepository.java | 6 + .../service/DataInitializeHistoryService.java | 5 +- .../mongodb/service/HistoryLogService.java | 2 +- .../resources/config/local/application.yml | 105 ++---------------- 10 files changed, 188 insertions(+), 157 deletions(-) create mode 100644 src/main/java/com/domain/service/LogoutService.java create mode 100644 src/main/java/com/global/configuration/MongodbConfig.java create mode 100644 src/main/java/com/mongodb/repository/MongoRepository.java diff --git a/build.gradle b/build.gradle index 3af3d38..af2db9e 100644 --- a/build.gradle +++ b/build.gradle @@ -78,6 +78,9 @@ dependencies { implementation 'redis.clients:jedis:4.3.1' implementation 'org.springframework.boot:spring-boot-starter-data-redis' + // Playwright (브라우저 자동화) + implementation 'com.microsoft.playwright:playwright:1.41.0' + compileOnly 'org.projectlombok:lombok' // PostgreSQL runtimeOnly 'org.postgresql:postgresql' diff --git a/src/main/java/com/domain/service/LogoutService.java b/src/main/java/com/domain/service/LogoutService.java new file mode 100644 index 0000000..881f542 --- /dev/null +++ b/src/main/java/com/domain/service/LogoutService.java @@ -0,0 +1,38 @@ +package com.domain.service; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.logout.LogoutHandler; +import org.springframework.stereotype.Service; + +import com.domain.dao.TokenMapper; + +@Slf4j +@Service +@RequiredArgsConstructor +public class LogoutService implements LogoutHandler { + private final TokenMapper tokenMapper; + + @Override + public void logout(HttpServletRequest request, HttpServletResponse response, org.springframework.security.core.Authentication authentication) { + final String authHeader = request.getHeader("Authorization"); + final String jwt; + if (authHeader == null ||!authHeader.startsWith("Bearer ")) { + return; + } + jwt = authHeader.substring(7); + var storedToken = tokenMapper.findByToken(jwt) + .orElse(null); + if (storedToken != null) { + storedToken.setExpired(true); + storedToken.setRevoked(true); + tokenMapper.updateToken(storedToken); + SecurityContextHolder.clearContext(); + } + + log.info("logout User: {}", authentication.getName()); + } +} diff --git a/src/main/java/com/global/configuration/AuthenticationConfig.java b/src/main/java/com/global/configuration/AuthenticationConfig.java index 116dcd4..87e4153 100644 --- a/src/main/java/com/global/configuration/AuthenticationConfig.java +++ b/src/main/java/com/global/configuration/AuthenticationConfig.java @@ -2,7 +2,6 @@ package com.global.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpMethod; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @@ -51,9 +50,10 @@ public class AuthenticationConfig { })) .authorizeHttpRequests() .requestMatchers( -// "/api/v1/auth/login", -// "/api/v1/auth/register", - "/api/v1/**" + "/api/v1/auth/login", + "/api/v1/auth/register", +// "/api/v1/**", + "/api/v2/**" ).permitAll() // login,register은 언제나 가능 // .requestMatchers(HttpMethod.POST,"/api/v1/**").authenticated() .anyRequest() diff --git a/src/main/java/com/global/configuration/MongodbConfig.java b/src/main/java/com/global/configuration/MongodbConfig.java new file mode 100644 index 0000000..d9affcc --- /dev/null +++ b/src/main/java/com/global/configuration/MongodbConfig.java @@ -0,0 +1,82 @@ +package com.global.configuration; + +import com.mongodb.ConnectionString; +import com.mongodb.MongoClientSettings; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; +import com.mongodb.repository.MongoRepository; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.mongodb.MongoDatabaseFactory; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory; +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.TimeUnit; + + +@Configuration +@EnableMongoRepositories(basePackageClasses = MongoRepository.class, basePackages = "com.mongodb.repository", mongoTemplateRef = "mongodbTemplate") +public class MongodbConfig { + + @Value("${mongodb.host}") + String businessLogHost; + @Value("${mongodb.username}") + String username; + @Value("${mongodb.password}") + String password; + @Value("${mongodb.db}") + String db; + + @Bean(name = "mongodbClient") + public MongoClient mongoStatClient() { + String encodePassword = URLEncoder.encode(password, StandardCharsets.UTF_8); + String auth = username.isEmpty() ? "" : String.format("%s:%s@",username, encodePassword); + String connection; + connection = String.format("mongodb://%s%s/?authSource=%s", auth, businessLogHost, db); + + MongoClientSettings settings = MongoClientSettings.builder() + .applyConnectionString(new ConnectionString(connection)) + // 커넥션 풀 설정 + .applyToConnectionPoolSettings(builder -> { + builder.maxSize(100) // 최대 연결 수 + .minSize(10) // 최소 연결 수 + .maxWaitTime(30, TimeUnit.SECONDS) // 연결 대기 시간 + .maxConnectionLifeTime(0, TimeUnit.MILLISECONDS) // 연결 최대 수명 (0 = 무제한) + .maxConnectionIdleTime(0, TimeUnit.MILLISECONDS); // 연결 최대 유휴 시간 (0 = 무제한) + }) + // 소켓 설정 + .applyToSocketSettings(builder -> { + builder.connectTimeout(10, TimeUnit.SECONDS) // 연결 타임아웃 + .readTimeout(0, TimeUnit.MILLISECONDS); // 읽기 타임아웃 (0 = 무제한) + }) + // 서버 선택 설정 + .applyToServerSettings(builder -> { + builder.heartbeatFrequency(10, TimeUnit.SECONDS) // 하트비트 주기 + .minHeartbeatFrequency(500, TimeUnit.MILLISECONDS); // 최소 하트비트 주기 + }) + // 클러스터 설정 + .applyToClusterSettings(builder -> { + builder.serverSelectionTimeout(30, TimeUnit.SECONDS) // 서버 선택 타임아웃 + .localThreshold(15, TimeUnit.MILLISECONDS); // 로컬 임계값 + }) + .build(); + + return MongoClients.create(settings); + } + + @Bean(name = "mongoFactory") + public MongoDatabaseFactory mongoFactory(@Qualifier("mongodbClient") MongoClient mongoClient) { + return new SimpleMongoClientDatabaseFactory(mongoClient, db); + } + + @Bean(name = "mongodbTemplate") + public MongoTemplate mongodbTemplate(@Qualifier("mongoFactory") MongoDatabaseFactory mongoFactory) { + return new MongoTemplate(mongoFactory); + } + +} diff --git a/src/main/java/com/global/configuration/MybatisConfig.java b/src/main/java/com/global/configuration/MybatisConfig.java index 04e0eba..985b7c3 100644 --- a/src/main/java/com/global/configuration/MybatisConfig.java +++ b/src/main/java/com/global/configuration/MybatisConfig.java @@ -21,7 +21,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; @Configuration -@MapperScan(value = "com.domain.dao.admin", sqlSessionFactoryRef = "SqlSessionFactory") +@MapperScan(value = "com.domain.dao", sqlSessionFactoryRef = "SqlSessionFactory") @EnableTransactionManagement public class MybatisConfig { @Value("${spring.mybatis.mapper-locations}") diff --git a/src/main/java/com/global/configuration/RedisConfig.java b/src/main/java/com/global/configuration/RedisConfig.java index eaa1283..fb6d47d 100644 --- a/src/main/java/com/global/configuration/RedisConfig.java +++ b/src/main/java/com/global/configuration/RedisConfig.java @@ -44,64 +44,56 @@ public class RedisConfig { @Value("${redis.abort-connect}") private boolean abortConnect; - @Value("${spring.profiles.active}") - private String activeProfile; - @Bean public JedisConnectionFactory jedisConnectionFactory() { -// String activeProfile = System.getProperty("active.profile", "local"); - log.info("RedisConfig Active profile: {}", activeProfile); - - if(activeProfile.equals("local") || activeProfile.equals("dev")){ - log.info("RedisConfig local config Set"); - /// Redis Standalone 설정 - RedisStandaloneConfiguration standaloneConfig = new RedisStandaloneConfiguration(); - standaloneConfig.setHostName(host); - standaloneConfig.setPort(port); - if (password != null && !password.isEmpty()) { - standaloneConfig.setPassword(password); - } - - JedisClientConfiguration.JedisClientConfigurationBuilder jedisClientConfig = JedisClientConfiguration.builder(); - jedisClientConfig.connectTimeout(java.time.Duration.ofMillis(asyncTimeout)); // AsyncTimeout - jedisClientConfig.readTimeout(java.time.Duration.ofMillis(syncTimeout)); // SyncTimeout - if (ssl) { - jedisClientConfig.useSsl(); - } - //if (!abortConnect) { jedisClientConfig.blockOnReconnect(false);} - - return new JedisConnectionFactory(standaloneConfig, jedisClientConfig.build()); + log.info("RedisConfig local config Set"); + /// Redis Standalone 설정 + RedisStandaloneConfiguration standaloneConfig = new RedisStandaloneConfiguration(); + standaloneConfig.setHostName(host); + standaloneConfig.setPort(port); + if (password != null && !password.isEmpty()) { + standaloneConfig.setPassword(password); } - log.info("RedisConfig deploy config Set"); - //cluster로 변경 수정 - JedisPoolConfig poolConfig = new JedisPoolConfig(); - poolConfig.setMaxTotal(128); // 연결 풀 설정 - - // Redis 클러스터 진입점 노드만 지정 - RedisClusterConfiguration clusterConfig = new RedisClusterConfiguration(); - clusterConfig.clusterNode(host, port); - clusterConfig.setPassword(password); // 패스워드 설정 - clusterConfig.setMaxRedirects(5); - var builder = JedisClientConfiguration.builder(); - builder.usePooling().poolConfig(poolConfig); - if(ssl){ - builder.useSsl(); + JedisClientConfiguration.JedisClientConfigurationBuilder jedisClientConfig = JedisClientConfiguration.builder(); + jedisClientConfig.connectTimeout(java.time.Duration.ofMillis(asyncTimeout)); // AsyncTimeout + jedisClientConfig.readTimeout(java.time.Duration.ofMillis(syncTimeout)); // SyncTimeout + if (ssl) { + jedisClientConfig.useSsl(); } - JedisClientConfiguration clientConfig = builder.build(); + //if (!abortConnect) { jedisClientConfig.blockOnReconnect(false);} - JedisConnectionFactory factory = new JedisConnectionFactory(clusterConfig, clientConfig); + return new JedisConnectionFactory(standaloneConfig, jedisClientConfig.build()); - factory.afterPropertiesSet(); - - try { - factory.getConnection().ping(); // Redis 서버에 Ping 명령어를 전송해 응답을 확인 - log.info("Successfully connected to Redis server: {}", factory.getHostName()); - } catch (Exception e) { - log.error("Failed to connect to Redis server: {}", e.getMessage()); - } - - return factory; +// log.info("RedisConfig deploy config Set"); +// //cluster로 변경 수정 +// JedisPoolConfig poolConfig = new JedisPoolConfig(); +// poolConfig.setMaxTotal(128); // 연결 풀 설정 +// +// // Redis 클러스터 진입점 노드만 지정 +// RedisClusterConfiguration clusterConfig = new RedisClusterConfiguration(); +// clusterConfig.clusterNode(host, port); +// clusterConfig.setPassword(password); // 패스워드 설정 +// clusterConfig.setMaxRedirects(5); +// var builder = JedisClientConfiguration.builder(); +// builder.usePooling().poolConfig(poolConfig); +// if(ssl){ +// builder.useSsl(); +// } +// JedisClientConfiguration clientConfig = builder.build(); +// +// JedisConnectionFactory factory = new JedisConnectionFactory(clusterConfig, clientConfig); +// +// factory.afterPropertiesSet(); +// +// try { +// factory.getConnection().ping(); // Redis 서버에 Ping 명령어를 전송해 응답을 확인 +// log.info("Successfully connected to Redis server: {}", factory.getHostName()); +// } catch (Exception e) { +// log.error("Failed to connect to Redis server: {}", e.getMessage()); +// } +// +// return factory; } @Bean diff --git a/src/main/java/com/mongodb/repository/MongoRepository.java b/src/main/java/com/mongodb/repository/MongoRepository.java new file mode 100644 index 0000000..34baea3 --- /dev/null +++ b/src/main/java/com/mongodb/repository/MongoRepository.java @@ -0,0 +1,6 @@ +package com.mongodb.repository; + + + +public interface MongoRepository { +} diff --git a/src/main/java/com/mongodb/service/DataInitializeHistoryService.java b/src/main/java/com/mongodb/service/DataInitializeHistoryService.java index 7bc56ce..8fb4be8 100644 --- a/src/main/java/com/mongodb/service/DataInitializeHistoryService.java +++ b/src/main/java/com/mongodb/service/DataInitializeHistoryService.java @@ -37,12 +37,9 @@ public class DataInitializeHistoryService { private final TransactionIdManager transactionIdManager; @Autowired - @Qualifier("mongoIndicatorTemplate") + @Qualifier("mongodbTemplate") private MongoTemplate mongoTemplate; - @Value("${amazon.dynamodb.metaTable}") - private String dynamodbTableName; - public List loadHistoryData(LogGenericRequest logGenericRequest, Class class1) { String startTime = logGenericRequest.getStartDt().toString().substring(0, 10); String endTime = logGenericRequest.getEndDt().toString().substring(0, 10); diff --git a/src/main/java/com/mongodb/service/HistoryLogService.java b/src/main/java/com/mongodb/service/HistoryLogService.java index 011f29d..5e1fd76 100644 --- a/src/main/java/com/mongodb/service/HistoryLogService.java +++ b/src/main/java/com/mongodb/service/HistoryLogService.java @@ -24,7 +24,7 @@ import java.util.List; @Slf4j public class HistoryLogService { @Autowired - @Qualifier("mongoIndicatorTemplate") + @Qualifier("mongodbTemplate") private MongoTemplate mongoTemplate; public List loadHistoryData(HistoryRequest historyRequest, Class class1) { diff --git a/src/main/resources/config/local/application.yml b/src/main/resources/config/local/application.yml index ebadf6f..1c15dfc 100644 --- a/src/main/resources/config/local/application.yml +++ b/src/main/resources/config/local/application.yml @@ -10,9 +10,9 @@ server: spring: datasource: driver-class-name: org.postgresql.Driver - url: jdbc:postgresql://localhost:5432/postgres - username: postgres - password: postgres + jdbc-url: jdbc:postgresql://140.238.22.48:5432/postgres + username: bcjang + password: dlawls051) jpa: hibernate: @@ -107,112 +107,25 @@ excel: file-path: D:\caliverse-api/upload/ - - - -################################################################################################################################################################################################ -# AWS -################################################################################################################################################################################################ -amazon: - dynamodb: -# endpoint: http://localhost:8000/ - - - # metaTable: Metaverse-Live - aws: -# accesskey: "" -# secretkey: "" -# region: "" - accesskey: AKIA4G3CB4Z5T6JUPHJN - secretkey: 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 - - s3: - - - enabled: true - - - - - -################################################################################################################################################################################################ -# RabbitMq -################################################################################################################################################################################################ -rabbitmq: -# url: localhost -# port: 5672 -# username: admin -# password: admin -# ssl: false -# dev - url: 10.20.20.8 - - username: admin - password: admin - - - - - - ################################################################################################################################################################################################ # Mongodb ################################################################################################################################################################################################ mongodb: - host: 10.20.20.8:27017 - business-log: - username: "" - password: "" - - indicator: - username: "" - password: "" - -#local -# host: localhost:27017 -# business-log: -# username: "" -# password: "" -# db: LogDB -# indicator: -# username: "" -# password: "" -# db: IndicatorDB -#live -# host: metaverse-live.7d0do.mongodb.net -# business-log: -# username: metaverseliverw -# password: K1spqwBbHrP2ZSMX -# db: BusinessLog-Db-Live -# indicator: -# username: metaverseliverw -# password: K1spqwBbHrP2ZSMX -# db: BackOffice-Db-Live + host: 140.238.22.48:27017 + username: bcjang + password: dlawls05081) + db: myListBridge ################################################################################################################################################################################################ # "Redis": "127.0.0.1:6379,password=KT-i5#i%-%LxKfZ5YJj6,AsyncTimeout=30000,SyncTimeout=30000,ssl=false,abortConnect=false", ################################################################################################################################################################################################ redis: - prefix: backOffice -# host: localhost -# port: 6379 -# password: KT-i5#i%-%LxKfZ5YJj6 -# async-timeout: 30000 -# sync-timeout: 30000 -# ssl: false -# abort-connect: false - host: 10.20.20.8 + prefix: myListBridge + host: 140.238.22.48 port: 6379 password: KT-i5#i%-%LxKfZ5YJj6 async-timeout: 30000 sync-timeout: 30000 ssl: false abort-connect: false - - -web3: - url: https://eco-system-dev-rollup-admin-api.caliverse.io - - -