Skip to content

Commit ac9113f

Browse files
authored
Merge pull request #49 from What-s-Your-Plan/feat/#48
Embedded Redis 환경 구성
2 parents c3fa633 + 0930aa3 commit ac9113f

File tree

17 files changed

+267
-9
lines changed

17 files changed

+267
-9
lines changed

application/wypl-core/build.gradle

+3
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,8 @@ dependencies {
1616
implementation project(':domain:jpamongo-review-domain')
1717
implementation project(':domain:jpa-calendar-domain')
1818
implementation project(':domain:jpa-member-domain')
19+
implementation project(':domain:redis-embedded-domain')
1920
implementation project(':common')
21+
22+
implementation 'org.springframework.boot:spring-boot-starter-actuator'
2023
}

application/wypl-core/src/main/resources/application.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ spring:
33
name: wypl-core
44
config:
55
import:
6+
- security/application-google.yml
67
- security/application-mongo.yml
78
- security/application-oracle.yml
9+
- security/application-redis.yml
810
- security/application-weather.yml
9-
- security/application-google.yml
1011
activate:
1112
on-profile:
1213
- default

application/wypl-core/src/test/java/com/wypl/wyplcore/auth/AuthMemberServiceImplTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ void success() {
5353
SocialMember mockSocialMember = SocialMember.builder()
5454
.id(1L)
5555
.oauthProvider(OauthProvider.GOOGLE)
56-
.OauthId(OAUTH_ID)
56+
.oauthId(OAUTH_ID)
5757
.build();
5858

5959
given(socialMemberRepository.findByOauthProviderAndOauthId(any(OauthProvider.class), anyString()))

client/aws-s3-client/src/main/java/com/wypl/awss3client/AwsS3StorageService.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ public String fileUpload(final File file) {
3939
*/
4040
public void filesRemove(List<String> fileNames) {
4141
List<DeleteObjectsRequest.KeyVersion> list = fileNames.stream()
42-
.map(DeleteObjectsRequest.KeyVersion::new)
43-
.toList();
42+
.map(DeleteObjectsRequest.KeyVersion::new)
43+
.toList();
4444
DeleteObjectsRequest deleteObjectRequest = new DeleteObjectsRequest(awsS3Properties.getBucket());
4545
deleteObjectRequest.setKeys(list);
4646
amazonS3Client.deleteObjects(deleteObjectRequest);

domain/jpa-member-domain/src/main/java/com/wypl/jpamemberdomain/member/SocialMemberRepository.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77
import com.wypl.jpamemberdomain.member.domain.SocialMember;
88

99
public interface SocialMemberRepository extends JpaRepository<SocialMember, Long> {
10-
Optional<SocialMember> findByOauthProviderAndOauthId(OauthProvider provider, String oauthId);
10+
Optional<SocialMember> findByOauthProviderAndOauthId(OauthProvider oauthProvider, String oauthId);
1111
}

domain/jpa-member-domain/src/main/java/com/wypl/jpamemberdomain/member/domain/SocialMember.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,6 @@ public class SocialMember {
3939
private OauthProvider oauthProvider;
4040

4141
@Column(name = "oauth_id", nullable = false)
42-
private String OauthId;
42+
private String oauthId;
4343
}
4444

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
java {
2+
toolchain {
3+
languageVersion = JavaLanguageVersion.of(17)
4+
}
5+
}
6+
7+
dependencies {
8+
implementation "org.springframework.boot:spring-boot-starter-data-redis"
9+
implementation "com.github.codemonstur:embedded-redis:1.4.3"
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.wypl.redisembeddeddomain;
2+
3+
import java.io.IOException;
4+
5+
import org.springframework.beans.factory.annotation.Value;
6+
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.context.annotation.Profile;
8+
9+
import com.wypl.redisembeddeddomain.redis.*;
10+
11+
import jakarta.annotation.PostConstruct;
12+
import jakarta.annotation.PreDestroy;
13+
import lombok.extern.slf4j.Slf4j;
14+
import redis.embedded.RedisServer;
15+
16+
@Slf4j
17+
@Profile({"default", "local", "test"})
18+
@Configuration
19+
public class EmbeddedRedisConfig {
20+
private static final String OS_NAME = System.getProperty("os.name");
21+
22+
@Value("${spring.data.redis.port}")
23+
private int redisPort;
24+
25+
private RedisServer redisServer;
26+
27+
@PostConstruct
28+
private void start() throws IOException {
29+
RedisAvailablePortFind findAvailablePortUtils = getRedisAvailablePortFind();
30+
31+
int port = findAvailablePortUtils.isRedisRunning(redisPort)
32+
? findAvailablePortUtils.findAvailablePort(redisPort)
33+
: redisPort;
34+
log.info("Embedded Redis Running Port : [{}]", port);
35+
36+
redisServer = new RedisServer(port);
37+
redisServer.start();
38+
}
39+
40+
@PreDestroy
41+
private void stop() throws IOException {
42+
if (redisServer != null) {
43+
redisServer.stop();
44+
}
45+
}
46+
47+
private RedisAvailablePortFind getRedisAvailablePortFind() {
48+
if (OS.MAC.contains(OS_NAME)) {
49+
return new RedisAvailablePortFindForMac();
50+
} else if (OS.WINDOWS.contains(OS_NAME)) {
51+
return new RedisAvailablePortFindForWindows();
52+
} else if (OS.UBUNTU.contains(OS_NAME)) {
53+
return new RedisAvailablePortFindForUbuntu();
54+
} else if (OS.LINUX.contains(OS_NAME)) {
55+
return new RedisAvailablePortFindForLinux();
56+
} else if (OS.DEBIAN.contains(OS_NAME)) {
57+
return new RedisAvailablePortFindForDebian();
58+
}
59+
throw new IllegalArgumentException("Unsupported OS : " + OS_NAME);
60+
}
61+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.wypl.redisembeddeddomain.redis;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public enum OS {
7+
MAC("Mac"),
8+
WINDOWS("Windows 10"),
9+
LINUX("Linux"),
10+
UBUNTU("Ubuntu"),
11+
DEBIAN("Debian"),
12+
;
13+
14+
private final String value;
15+
16+
OS(String value) {
17+
this.value = value;
18+
}
19+
20+
public boolean contains(String osName) {
21+
return osName.contains(value);
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.wypl.redisembeddeddomain.redis;
2+
3+
import java.io.IOException;
4+
5+
public abstract class RedisAvailablePortFind {
6+
public abstract int findAvailablePort(final int redisPort) throws IOException;
7+
8+
public abstract boolean isRedisRunning(final int redisPort) throws IOException;
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.wypl.redisembeddeddomain.redis;
2+
3+
import java.io.IOException;
4+
5+
import lombok.extern.slf4j.Slf4j;
6+
7+
@Slf4j
8+
public class RedisAvailablePortFindForDebian extends RedisAvailablePortFind {
9+
10+
private final RedisAvailablePortFindForMac redisAvailablePortFindForMac = new RedisAvailablePortFindForMac();
11+
12+
@Override
13+
public int findAvailablePort(int redisPort) throws IOException {
14+
return redisAvailablePortFindForMac.findAvailablePort(redisPort);
15+
}
16+
17+
@Override
18+
public boolean isRedisRunning(int redisPort) throws IOException {
19+
return redisAvailablePortFindForMac.isRedisRunning(redisPort);
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.wypl.redisembeddeddomain.redis;
2+
3+
import java.io.IOException;
4+
5+
public class RedisAvailablePortFindForLinux extends RedisAvailablePortFind {
6+
7+
private final RedisAvailablePortFindForMac redisAvailablePortFindForMac = new RedisAvailablePortFindForMac();
8+
9+
@Override
10+
public int findAvailablePort(int redisPort) throws IOException {
11+
return redisAvailablePortFindForMac.findAvailablePort(redisPort);
12+
}
13+
14+
@Override
15+
public boolean isRedisRunning(int redisPort) throws IOException {
16+
return redisAvailablePortFindForMac.isRedisRunning(redisPort);
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.wypl.redisembeddeddomain.redis;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
7+
import org.springframework.util.StringUtils;
8+
9+
import lombok.extern.slf4j.Slf4j;
10+
11+
@Slf4j
12+
public class RedisAvailablePortFindForMac extends RedisAvailablePortFind {
13+
14+
@Override
15+
public int findAvailablePort(final int redisPort) throws IOException {
16+
for (int port = 10000; port <= 65535; port++) {
17+
Process process = executeGrepProcessCommand(port);
18+
if (!isRunning(process)) {
19+
return port;
20+
}
21+
}
22+
throw new IllegalArgumentException("Not Found Available port: 10000 ~ 65535");
23+
}
24+
25+
@Override
26+
public boolean isRedisRunning(final int redisPort) throws IOException {
27+
return isRunning(executeGrepProcessCommand(redisPort));
28+
}
29+
30+
private boolean isRunning(Process process) {
31+
String line;
32+
StringBuilder pidInfo = new StringBuilder();
33+
try (BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
34+
while ((line = input.readLine()) != null) {
35+
pidInfo.append(line);
36+
}
37+
} catch (Exception e) {
38+
log.error(e.getMessage());
39+
}
40+
return StringUtils.hasText(pidInfo.toString());
41+
}
42+
43+
private Process executeGrepProcessCommand(
44+
final int port
45+
) throws IOException {
46+
String command = String.format("netstat -nat | grep LISTEN | grep %d", port);
47+
String[] shell = new String[] {"/bin/sh", "-c", command};
48+
return Runtime.getRuntime().exec(shell);
49+
}
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.wypl.redisembeddeddomain.redis;
2+
3+
import java.io.IOException;
4+
5+
public class RedisAvailablePortFindForUbuntu extends RedisAvailablePortFind {
6+
7+
private final RedisAvailablePortFindForMac redisAvailablePortFindForMac = new RedisAvailablePortFindForMac();
8+
9+
@Override
10+
public int findAvailablePort(int redisPort) throws IOException {
11+
return redisAvailablePortFindForMac.findAvailablePort(redisPort);
12+
}
13+
14+
@Override
15+
public boolean isRedisRunning(int redisPort) throws IOException {
16+
return redisAvailablePortFindForMac.isRedisRunning(redisPort);
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.wypl.redisembeddeddomain.redis;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
7+
import lombok.extern.slf4j.Slf4j;
8+
9+
@Slf4j
10+
public class RedisAvailablePortFindForWindows extends RedisAvailablePortFind {
11+
12+
@Override
13+
public int findAvailablePort(int redisPort) {
14+
for (int port = 10000; port <= 65535; port++) {
15+
if (!isRunning(port)) {
16+
return port;
17+
}
18+
}
19+
throw new IllegalArgumentException("Not Found Available port: 10000 ~ 65535");
20+
}
21+
22+
@Override
23+
public boolean isRedisRunning(int redisPort) {
24+
return isRunning(redisPort);
25+
}
26+
27+
private boolean isRunning(final int port) {
28+
try {
29+
ProcessBuilder builder = new ProcessBuilder("netstat", "-nat");
30+
Process process = builder.start();
31+
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
32+
33+
String line;
34+
while ((line = reader.readLine()) != null) {
35+
if (line.contains("LISTEN") && line.contains(String.valueOf(port))) {
36+
return true;
37+
}
38+
}
39+
} catch (IOException e) {
40+
log.error("Windows Command Error", e);
41+
}
42+
return false;
43+
}
44+
}

settings.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ include ':application:wypl-image'
99

1010
/* Domain Module */
1111
include ':domain'
12-
include ':domain:jpa-common'
12+
include ':domain:jpa-common'
1313
include ':domain:jpa-calendar-domain'
1414
include ':domain:jpa-member-domain'
1515
include ':domain:jpamongo-review-domain'
1616
include ':domain:mongo-common'
17-
17+
include ':domain:redis-embedded-domain'
1818

1919
/* Client Module */
2020
include ':client'

0 commit comments

Comments
 (0)