diff --git a/back/build.gradle.kts b/back/build.gradle.kts index a15b578..2125f6f 100644 --- a/back/build.gradle.kts +++ b/back/build.gradle.kts @@ -34,6 +34,9 @@ dependencies { // Redis implementation("org.springframework.boot:spring-boot-starter-data-redis") + // Embedded Redis + implementation("com.github.codemonstur:embedded-redis:1.4.3") + // Session implementation("org.springframework.session:spring-session-data-redis") diff --git a/back/src/main/java/com/back/global/config/EmbeddedRedisConfig.java b/back/src/main/java/com/back/global/config/EmbeddedRedisConfig.java new file mode 100644 index 0000000..b729e66 --- /dev/null +++ b/back/src/main/java/com/back/global/config/EmbeddedRedisConfig.java @@ -0,0 +1,52 @@ +package com.back.global.config; + +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import redis.embedded.RedisServer; + +import java.io.IOException; + +/** + * 로컬 및 테스트 환경 임베디드 Redis 설정 + * - test 프로필에서만 활성화 + */ +@Configuration +@Profile("test") +public class EmbeddedRedisConfig { + + @Value("${spring.data.redis.port}") + private int redisPort; + + private RedisServer redisServer; + + @PostConstruct + public void startRedis() { + try { + redisServer = new RedisServer(redisPort); + redisServer.start(); + System.out.println("========================================"); + System.out.println("Embedded Redis started on port " + redisPort); + System.out.println("========================================"); + } catch (IOException e) { + System.err.println("Embedded Redis start failed: " + e.getMessage()); + System.err.println("This is OK if external Redis is already running"); + } + } + + @PreDestroy + public void stopRedis() { + try { + if (redisServer != null && redisServer.isActive()) { + redisServer.stop(); + System.out.println("========================================"); + System.out.println("Embedded Redis stopped"); + System.out.println("========================================"); + } + } catch (Exception e) { + System.err.println("Error stopping embedded Redis: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/back/src/main/resources/application-test.yml b/back/src/main/resources/application-test.yml index a1dda1c..c968928 100644 --- a/back/src/main/resources/application-test.yml +++ b/back/src/main/resources/application-test.yml @@ -1,4 +1,8 @@ spring: + data: + redis: + host: localhost + port: 6379 datasource: url: jdbc:h2:mem:db_test;MODE=PostgreSQL; username: sa @@ -10,4 +14,8 @@ spring: h2: console: enabled: true - path: /h2-console \ No newline at end of file + path: /h2-console +management: + health: + redis: + enabled: false \ No newline at end of file diff --git a/back/src/main/resources/application.yml b/back/src/main/resources/application.yml index 1c33588..98ca4ea 100644 --- a/back/src/main/resources/application.yml +++ b/back/src/main/resources/application.yml @@ -1,10 +1,10 @@ spring: application: name: back - autoconfigure: - exclude: - - org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration - - org.springframework.boot.autoconfigure.session.SessionAutoConfiguration + #autoconfigure: + # exclude: + # - org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration + # - org.springframework.boot.autoconfigure.session.SessionAutoConfiguration config: import: optional:file:.env[.properties] flyway: diff --git a/back/src/test/java/com/back/domain/user/controller/UserAuthControllerTest.java b/back/src/test/java/com/back/domain/user/controller/UserAuthControllerTest.java index 252c0cf..a2caaa0 100644 --- a/back/src/test/java/com/back/domain/user/controller/UserAuthControllerTest.java +++ b/back/src/test/java/com/back/domain/user/controller/UserAuthControllerTest.java @@ -13,7 +13,6 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; -import org.springframework.mock.web.MockHttpSession; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; @@ -122,8 +121,9 @@ void t3() throws Exception { .andExpect(jsonPath("$.email").value(email)) .andReturn(); - MockHttpSession session = (MockHttpSession) result.getRequest().getSession(false); - assertThat(session).isNotNull(); + var jsessionid = result.getResponse().getCookie("JSESSIONID"); + assertThat(jsessionid).isNotNull(); + assertThat(jsessionid.getValue()).isNotBlank(); } @Test @@ -144,14 +144,11 @@ void t4() throws Exception { @Test @DisplayName("성공 - 게스트 로그인") void t5() throws Exception { - MvcResult result = mvc.perform(post(BASE + "/guest").with(csrf())) + mvc.perform(post(BASE + "/guest").with(csrf())) .andExpect(status().isOk()) .andExpect(jsonPath("$.email").exists()) .andExpect(jsonPath("$.role").value("GUEST")) - .andReturn(); - - MockHttpSession session = (MockHttpSession) result.getRequest().getSession(false); - assertThat(session).isNotNull(); + .andExpect(cookie().exists("JSESSIONID")); } @Test @@ -178,10 +175,11 @@ void t7() throws Exception { .andExpect(status().isOk()) .andReturn(); - MockHttpSession session = (MockHttpSession) loginRes.getRequest().getSession(false); + var jsessionid = loginRes.getResponse().getCookie("JSESSIONID"); + assertThat(jsessionid).isNotNull(); mvc.perform(get(BASE + "/me") - .session(session)) + .cookie(jsessionid)) .andExpect(status().isOk()) .andExpect(jsonPath("$.email").value(email)); } @@ -200,12 +198,12 @@ void t8() throws Exception { .andExpect(status().isOk()) .andReturn(); - MockHttpSession session = (MockHttpSession) loginRes.getRequest().getSession(false); - assertThat(session).isNotNull(); + var jsessionid = loginRes.getResponse().getCookie("JSESSIONID"); + assertThat(jsessionid).isNotNull(); mvc.perform(post(BASE + "/logout") .with(csrf()) - .session(session)) + .cookie(jsessionid)) .andExpect(status().isOk()); } } \ No newline at end of file