From d68640b50c5ca2c74378eb6b032f2655cfd70904 Mon Sep 17 00:00:00 2001 From: Whitedoggy Date: Fri, 10 Oct 2025 15:36:33 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat/OPS-392:=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20&=20ElasticSearch=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20&=20=EC=9D=BC=EB=B6=80=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/prod-server.yml | 1 + .github/workflows/test-server-cd.yml | 1 + build.gradle | 3 + .../auth/handler/OAuth2SuccessHandler.java | 4 +- .../ApiV1MemberSearchController.java | 43 +++++++ .../dto/res/ResBodyForSearchMember.java | 16 +++ .../domain/member/entity/MemberDocument.java | 21 ++++ .../repository/MemberSearchRepository.java | 10 ++ .../member/service/MemberSearchService.java | 18 +++ .../domain/member/service/MemberService.java | 19 ++- .../elasticSearch/ElasticSearchConfig.java | 28 +++++ src/main/resources/application-dev.yml | 6 + src/main/resources/application-server.yml | 3 + src/main/resources/application-test.yml | 5 + src/main/resources/ngram.json | 18 +++ .../MemberSearchControllerTest.java | 108 ++++++++++++++++++ 16 files changed, 301 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/tuna/zoopzoop/backend/domain/member/controller/ApiV1MemberSearchController.java create mode 100644 src/main/java/org/tuna/zoopzoop/backend/domain/member/dto/res/ResBodyForSearchMember.java create mode 100644 src/main/java/org/tuna/zoopzoop/backend/domain/member/entity/MemberDocument.java create mode 100644 src/main/java/org/tuna/zoopzoop/backend/domain/member/repository/MemberSearchRepository.java create mode 100644 src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberSearchService.java create mode 100644 src/main/java/org/tuna/zoopzoop/backend/global/config/elasticSearch/ElasticSearchConfig.java create mode 100644 src/main/resources/ngram.json create mode 100644 src/test/java/org/tuna/zoopzoop/backend/domain/member/controller/MemberSearchControllerTest.java diff --git a/.github/workflows/prod-server.yml b/.github/workflows/prod-server.yml index 22ec476a..657468bd 100644 --- a/.github/workflows/prod-server.yml +++ b/.github/workflows/prod-server.yml @@ -109,6 +109,7 @@ jobs: -e JWT_ACCESS_TOKEN_VALIDITY="${{secrets.JWT_ACCESS_TOKEN_VALIDITY}}" \ -e JWT_REFRESH_TOKEN_VALIDITY="${{secrets.JWT_REFRESH_TOKEN_VALIDITY}}" \ -e FRONT_REDIRECT_DOMAIN="${{secrets.FRONT_REDIRECT_DOMAIN}}" \ + -e ELASTIC_HOST="${{secrets.PROD_ELASTIC_HOST}}" \ ghcr.io/${{ github.repository }}/zoopzoop:latest diff --git a/.github/workflows/test-server-cd.yml b/.github/workflows/test-server-cd.yml index 92334abf..81e5a393 100644 --- a/.github/workflows/test-server-cd.yml +++ b/.github/workflows/test-server-cd.yml @@ -86,6 +86,7 @@ jobs: -e JWT_ACCESS_TOKEN_VALIDITY="${{secrets.JWT_ACCESS_TOKEN_VALIDITY}}" \ -e JWT_REFRESH_TOKEN_VALIDITY="${{secrets.JWT_REFRESH_TOKEN_VALIDITY}}" \ -e FRONT_REDIRECT_DOMAIN="${{secrets.FRONT_REDIRECT_DOMAIN}}" \ + -e ELASTIC_HOST="${{secrets.TEST_ELASTIC_HOST}}" \ ghcr.io/${{ github.repository }}/zoopzoop:latest # 헬스체크 diff --git a/build.gradle b/build.gradle index 5ce7ae5a..4508c3a0 100644 --- a/build.gradle +++ b/build.gradle @@ -125,6 +125,9 @@ dependencies { // Awaitility (비동기 테스트 지원) testImplementation 'org.awaitility:awaitility:4.2.0' + + // Elastic Search + implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch' } dependencyManagement { diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/auth/handler/OAuth2SuccessHandler.java b/src/main/java/org/tuna/zoopzoop/backend/domain/auth/handler/OAuth2SuccessHandler.java index 2e076056..69b834a2 100644 --- a/src/main/java/org/tuna/zoopzoop/backend/domain/auth/handler/OAuth2SuccessHandler.java +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/auth/handler/OAuth2SuccessHandler.java @@ -91,7 +91,7 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo // 확장 프로그램에서 로그인 했을 경우. if ("extension".equals(source)) { authResult.put(customState, accessToken, sessionId); - response.sendRedirect(redirect_domain + "/extension/success"); + response.sendRedirect("https://" + redirect_domain + "/extension/success"); response.flushBuffer(); return; } @@ -132,7 +132,7 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo // 로그인 성공 후 리다이렉트. // 배포 시에 프론트엔드와 조율이 필요한 부분일 듯 함. - response.sendRedirect(redirect_domain + "/api/auth/callback"); + response.sendRedirect("https://" + redirect_domain + "/api/auth/callback"); } // 보안을 좀 더 강화하고자 한다면 CSRF 토큰 같은 걸 생각해볼 수 있겠으나, // 일단은 구현하지 않음.(개발 과정 중에 번거로워질 수 있을 듯 함.) diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/member/controller/ApiV1MemberSearchController.java b/src/main/java/org/tuna/zoopzoop/backend/domain/member/controller/ApiV1MemberSearchController.java new file mode 100644 index 00000000..8612b270 --- /dev/null +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/member/controller/ApiV1MemberSearchController.java @@ -0,0 +1,43 @@ +package org.tuna.zoopzoop.backend.domain.member.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.tuna.zoopzoop.backend.domain.member.dto.res.ResBodyForSearchMember; +import org.tuna.zoopzoop.backend.domain.member.entity.MemberDocument; +import org.tuna.zoopzoop.backend.domain.member.service.MemberSearchService; +import org.tuna.zoopzoop.backend.domain.member.service.MemberService; +import org.tuna.zoopzoop.backend.global.rsData.RsData; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("api/v1/member") +public class ApiV1MemberSearchController { + private final MemberSearchService memberSearchService; + private final MemberService memberService; + + @GetMapping("/search") + public ResponseEntity>> searchMembers( + @RequestParam String keyword + ) { + List memberDocuments = memberSearchService.searchByName(keyword); + List memberDtos = memberDocuments.stream() + .map(ResBodyForSearchMember::new) + .toList(); + return ResponseEntity + .status(HttpStatus.OK) + .body( + new RsData<>( + "200", + "검색 조건에 맞는 사용자들을 조회 했습니다.", + memberDtos + ) + ); + } +} diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/member/dto/res/ResBodyForSearchMember.java b/src/main/java/org/tuna/zoopzoop/backend/domain/member/dto/res/ResBodyForSearchMember.java new file mode 100644 index 00000000..69f103ce --- /dev/null +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/member/dto/res/ResBodyForSearchMember.java @@ -0,0 +1,16 @@ +package org.tuna.zoopzoop.backend.domain.member.dto.res; + +import org.tuna.zoopzoop.backend.domain.member.entity.MemberDocument; + +public record ResBodyForSearchMember( + int id, + String name +) { + public ResBodyForSearchMember(int id, String name) { + this.id = id; + this.name = name; + } + public ResBodyForSearchMember(MemberDocument memberDocument){ + this(memberDocument.getId(), memberDocument.getName()); + } +} \ No newline at end of file diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/member/entity/MemberDocument.java b/src/main/java/org/tuna/zoopzoop/backend/domain/member/entity/MemberDocument.java new file mode 100644 index 00000000..2add439f --- /dev/null +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/member/entity/MemberDocument.java @@ -0,0 +1,21 @@ +package org.tuna.zoopzoop.backend.domain.member.entity; + +import jakarta.persistence.Id; +import lombok.Getter; +import lombok.Setter; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; +import org.springframework.data.elasticsearch.annotations.Setting; + +@Document(indexName = "member") +@Setting(settingPath = "ngram.json") +@Getter +@Setter +public class MemberDocument { + @Id + private int id; + + @Field(type = FieldType.Text, analyzer = "ngram_analyzer", searchAnalyzer = "standard") + private String name; +} diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/member/repository/MemberSearchRepository.java b/src/main/java/org/tuna/zoopzoop/backend/domain/member/repository/MemberSearchRepository.java new file mode 100644 index 00000000..5278c300 --- /dev/null +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/member/repository/MemberSearchRepository.java @@ -0,0 +1,10 @@ +package org.tuna.zoopzoop.backend.domain.member.repository; + +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; +import org.tuna.zoopzoop.backend.domain.member.entity.MemberDocument; + +import java.util.List; + +public interface MemberSearchRepository extends ElasticsearchRepository { + List findByNameContaining(String name); +} diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberSearchService.java b/src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberSearchService.java new file mode 100644 index 00000000..049c9751 --- /dev/null +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberSearchService.java @@ -0,0 +1,18 @@ +package org.tuna.zoopzoop.backend.domain.member.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.tuna.zoopzoop.backend.domain.member.entity.MemberDocument; +import org.tuna.zoopzoop.backend.domain.member.repository.MemberSearchRepository; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class MemberSearchService { + private final MemberSearchRepository memberSearchRepository; + + public List searchByName(String name) { + return memberSearchRepository.findByNameContaining(name); + } +} diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberService.java b/src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberService.java index 34ab5088..0727cf60 100644 --- a/src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberService.java +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberService.java @@ -10,8 +10,10 @@ import org.tuna.zoopzoop.backend.domain.datasource.repository.DataSourceRepository; import org.tuna.zoopzoop.backend.domain.datasource.repository.TagRepository; import org.tuna.zoopzoop.backend.domain.member.entity.Member; +import org.tuna.zoopzoop.backend.domain.member.entity.MemberDocument; import org.tuna.zoopzoop.backend.domain.member.enums.Provider; import org.tuna.zoopzoop.backend.domain.member.repository.MemberRepository; +import org.tuna.zoopzoop.backend.domain.member.repository.MemberSearchRepository; import org.tuna.zoopzoop.backend.global.aws.S3Service; import java.io.IOException; @@ -23,6 +25,7 @@ @RequiredArgsConstructor public class MemberService { private final MemberRepository memberRepository; + private final MemberSearchRepository memberSearchRepository; private final S3Service s3Service; private final TagRepository tagRepository; private final DataSourceRepository dataSourceRepository; @@ -83,7 +86,16 @@ public Member createMember(String name, String profileUrl, String key, Provider .providerKey(key) .provider(provider) .build(); - return memberRepository.save(member); + + Member saved = memberRepository.save(member); + + // ElasticSearch용 document 생성. + MemberDocument doc = new MemberDocument(); + doc.setId(saved.getId()); + doc.setName(saved.getName()); + memberSearchRepository.save(doc); + + return saved; } //사용자 이름 수정 @@ -94,6 +106,11 @@ public void updateMemberName(Member member, String newName){ } member.updateName(generateUniqueUserNameTag(newName)); memberRepository.save(member); + + MemberDocument doc = new MemberDocument(); + doc.setId(member.getId()); + doc.setName(member.getName()); + memberSearchRepository.save(doc); } @Transactional diff --git a/src/main/java/org/tuna/zoopzoop/backend/global/config/elasticSearch/ElasticSearchConfig.java b/src/main/java/org/tuna/zoopzoop/backend/global/config/elasticSearch/ElasticSearchConfig.java new file mode 100644 index 00000000..0c007429 --- /dev/null +++ b/src/main/java/org/tuna/zoopzoop/backend/global/config/elasticSearch/ElasticSearchConfig.java @@ -0,0 +1,28 @@ +package org.tuna.zoopzoop.backend.global.config.elasticSearch; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.elasticsearch.client.ClientConfiguration; +import org.springframework.data.elasticsearch.client.elc.ElasticsearchConfiguration; +import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; + +@Slf4j +@Configuration +@EnableElasticsearchRepositories(basePackages = "org.springframework.data.elasticsearch.repository") +public class ElasticSearchConfig extends ElasticsearchConfiguration { + + @Value("${spring.data.elasticsearch.host}") + private String host; + + @Value("${spring.data.elasticsearch.port}") + private int port; + + @Override + public ClientConfiguration clientConfiguration() { + log.info("Connecting to Elasticsearch at {}:{}", host, port); + return ClientConfiguration.builder() + .connectedTo(host + ":" + port) + .build(); + } +} \ No newline at end of file diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 82d651d3..81bccdda 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -15,6 +15,9 @@ spring: host: localhost port: 6379 timeout: 6000 + elasticsearch: + host: localhost + port: 9200 security: oauth2: @@ -28,6 +31,9 @@ app: seed: enabled: true +front: + redirect_domain: http://localhost:3000 + sentry: send-default-pii: true environment: local diff --git a/src/main/resources/application-server.yml b/src/main/resources/application-server.yml index 8eee5d11..d4945079 100644 --- a/src/main/resources/application-server.yml +++ b/src/main/resources/application-server.yml @@ -14,6 +14,9 @@ spring: port: 6379 timeout: 6000 password: ${REDIS_PASSWORD} + elasticsearch: + host: ${ELASTIC_HOST} + port: 9200 cache: #Spring Cache를 사용하기 위한 Redis type: redis diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index 220e4820..9326bf48 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -8,6 +8,11 @@ spring: password: driver-class-name: org.h2.Driver + data: + elasticsearch: + host: localhost + port: 9200 + jpa: hibernate: ddl-auto: create-drop diff --git a/src/main/resources/ngram.json b/src/main/resources/ngram.json new file mode 100644 index 00000000..edac1535 --- /dev/null +++ b/src/main/resources/ngram.json @@ -0,0 +1,18 @@ +{ + "analysis": { + "analyzer": { + "ngram_analyzer": { + "tokenizer": "ngram_tokenizer", + "filter": ["lowercase"] + } + }, + "tokenizer": { + "ngram_tokenizer": { + "type": "ngram", + "min_gram": 2, + "max_gram": 3, + "token_chars": ["letter", "digit"] + } + } + } +} \ No newline at end of file diff --git a/src/test/java/org/tuna/zoopzoop/backend/domain/member/controller/MemberSearchControllerTest.java b/src/test/java/org/tuna/zoopzoop/backend/domain/member/controller/MemberSearchControllerTest.java new file mode 100644 index 00000000..df611362 --- /dev/null +++ b/src/test/java/org/tuna/zoopzoop/backend/domain/member/controller/MemberSearchControllerTest.java @@ -0,0 +1,108 @@ +package org.tuna.zoopzoop.backend.domain.member.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.test.context.support.TestExecutionEvent; +import org.springframework.security.test.context.support.WithUserDetails; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.web.servlet.MockMvc; +import org.tuna.zoopzoop.backend.domain.member.entity.Member; +import org.tuna.zoopzoop.backend.domain.member.enums.Provider; +import org.tuna.zoopzoop.backend.domain.member.repository.MemberRepository; +import org.tuna.zoopzoop.backend.domain.member.repository.MemberSearchRepository; +import org.tuna.zoopzoop.backend.domain.member.service.MemberSearchService; +import org.tuna.zoopzoop.backend.domain.member.service.MemberService; + +import static org.hamcrest.Matchers.containsString; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@ActiveProfiles("test") +@AutoConfigureMockMvc +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class MemberSearchControllerTest { + @Autowired + private MemberService memberService; + + @Autowired + private MemberRepository memberRepository; + + @Autowired + private MemberSearchService memberSearchService; + + @Autowired + private MemberSearchRepository memberSearchRepository; + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @BeforeAll + void setUp() { + Member member1 = memberService.createMember( + "검색테스트조건1", + "url", + "9123", + Provider.KAKAO + ); + Member member2 = memberService.createMember( + "검색테스트조건2", + "url", + "9234", + Provider.GOOGLE + ); + Member member3 = memberService.createMember( + "검색테스트조건3", + "url", + "9345", + Provider.GOOGLE + ); + } + + @Test + @WithUserDetails(value = "KAKAO:9123", setupBefore = TestExecutionEvent.TEST_METHOD) + @DisplayName("사용자 이름 검색 테스트 - 성공(200)") + void searchMemberSuccess() throws Exception { + String keyword1 = "조건1"; + String keyword2 = "조건2"; + String keyword3 = "조건3"; + String keyword4 = "틀림"; + mockMvc.perform(get("/api/v1/member/search") + .param("keyword", keyword1)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status").value("200")) + .andExpect(jsonPath("$.msg").value("검색 조건에 맞는 사용자들을 조회 했습니다.")) + .andExpect(jsonPath("$.data").isArray()) + .andExpect(jsonPath("$.data[0].name", containsString(keyword1))); + + mockMvc.perform(get("/api/v1/member/search") + .param("keyword", keyword2)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status").value("200")) + .andExpect(jsonPath("$.msg").value("검색 조건에 맞는 사용자들을 조회 했습니다.")) + .andExpect(jsonPath("$.data").isArray()) + .andExpect(jsonPath("$.data[0].name", containsString(keyword2))); + + mockMvc.perform(get("/api/v1/member/search") + .param("keyword", keyword3)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status").value("200")) + .andExpect(jsonPath("$.msg").value("검색 조건에 맞는 사용자들을 조회 했습니다.")) + .andExpect(jsonPath("$.data").isArray()) + .andExpect(jsonPath("$.data[0].name", containsString(keyword3))); + mockMvc.perform(get("/api/v1/member/search") + .param("keyword", keyword4)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status").value("200")) + .andExpect(jsonPath("$.msg").value("검색 조건에 맞는 사용자들을 조회 했습니다.")) + .andExpect(jsonPath("$.data").isArray()) + .andExpect(jsonPath("$.data.length()").value(0)); + } +} From 7d97388e4abb848536ddc700f1c75f4474a8728b Mon Sep 17 00:00:00 2001 From: Whitedoggy Date: Fri, 10 Oct 2025 15:45:20 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat/OPS-392:=20CI=20=EC=9B=8C=ED=81=AC?= =?UTF-8?q?=ED=94=8C=EB=A1=9C=EC=9A=B0=EC=97=90=20ElasticSearch=20?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=BB=A8=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=84=88=20=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/test-server-ci.yml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-server-ci.yml b/.github/workflows/test-server-ci.yml index 153b0789..866d569b 100644 --- a/.github/workflows/test-server-ci.yml +++ b/.github/workflows/test-server-ci.yml @@ -23,9 +23,8 @@ jobs: env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - - # CI 작업이 실행되는 동안 RabbitMQ 서비스 컨테이너를 함께 실행 services: + # CI 작업이 실행되는 동안 RabbitMQ 서비스 컨테이너를 함께 실행 rabbitmq: image: rabbitmq:3-management ports: @@ -37,6 +36,16 @@ jobs: --health-timeout 5s --health-retries 5 + # CI 작업이 실행되는 동안 ElasticSearch 서비스 컨테이너 함께 실행 + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:8.18.5 + ports: + - 9200:9200 + options: >- + --env discovery.type=single-node + --env xpack.security.enabled=false + --env ES_JAVA_OPTS=-Xms512m -Xmx512m + steps: # 1. 소스 코드 체크아웃 - name: Checkout source code @@ -73,6 +82,8 @@ jobs: SPRING_RABBITMQ_HOST: localhost SPRING_RABBITMQ_USERNAME: guest SPRING_RABBITMQ_PASSWORD: guest + SPRING_DATA_ELASTICSEARCH_HOST: localhost + SPRING_DATA_ELASTICSEARCH_PORT: 9200 KAKAO_CLIENT_ID: ${{ secrets.OAUTH_KAKAO_CLIENT_ID }} GOOGLE_CLIENT_ID: ${{ secrets.OAUTH_GOOGLE_CLIENT_ID }} GOOGLE_CLIENT_SECRET: ${{ secrets.OAUTH_GOOGLE_CLIENT_SECRET }} From c6b4d02da4598982d452086fe7f659293927dd30 Mon Sep 17 00:00:00 2001 From: Whitedoggy Date: Fri, 10 Oct 2025 15:46:59 +0900 Subject: [PATCH 3/5] =?UTF-8?q?feat/OPS-392:=20CI=20=EC=9B=8C=ED=81=AC?= =?UTF-8?q?=ED=94=8C=EB=A1=9C=EC=9A=B0=EC=97=90=20ElasticSearch=20?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=BB=A8=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=84=88=20=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20#2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/test-server-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-server-ci.yml b/.github/workflows/test-server-ci.yml index 866d569b..36cb6d37 100644 --- a/.github/workflows/test-server-ci.yml +++ b/.github/workflows/test-server-ci.yml @@ -44,7 +44,7 @@ jobs: options: >- --env discovery.type=single-node --env xpack.security.enabled=false - --env ES_JAVA_OPTS=-Xms512m -Xmx512m + --env ES_JAVA_OPTS="-Xms512m -Xmx512m" steps: # 1. 소스 코드 체크아웃 From 1833a577e3fb550bcbef17e551245527b82b4bdc Mon Sep 17 00:00:00 2001 From: Whitedoggy Date: Fri, 10 Oct 2025 16:03:10 +0900 Subject: [PATCH 4/5] =?UTF-8?q?feat/OPS-392:=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/auth/handler/OAuth2FailureHandler.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/auth/handler/OAuth2FailureHandler.java b/src/main/java/org/tuna/zoopzoop/backend/domain/auth/handler/OAuth2FailureHandler.java index cb8f6dc5..f9ce1e20 100644 --- a/src/main/java/org/tuna/zoopzoop/backend/domain/auth/handler/OAuth2FailureHandler.java +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/auth/handler/OAuth2FailureHandler.java @@ -29,7 +29,8 @@ public void onAuthenticationFailure(HttpServletRequest request, String source = request.getParameter("source"); if("extension".equals(source)){ - String redirectUrl = redirect_domain + "/extension/callback " + String redirectUrl = + "https://" + redirect_domain + "/extension/callback " + "?success=false" + "&error=" + URLEncoder.encode(exception.getMessage(), "UTF-8"); response.sendRedirect(redirectUrl); @@ -37,7 +38,7 @@ public void onAuthenticationFailure(HttpServletRequest request, } String redirectUrl = - redirect_domain + "/auth/callback" + "https://" + redirect_domain + "/auth/callback" + "?success=false" + "&error=" + URLEncoder.encode(exception.getMessage(), "UTF-8"); From 188e01a602c4fa4a2ae8b13f7bb802a7a973d6f6 Mon Sep 17 00:00:00 2001 From: Whitedoggy Date: Fri, 10 Oct 2025 16:10:53 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat/OPS-392:=20Docker-compose=EC=97=90=20e?= =?UTF-8?q?lastic-search=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=ED=95=AD?= =?UTF-8?q?=EB=AA=A9=20=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index fe3f28db..981efe7f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,5 +13,19 @@ services: volumes: - rabbitmq-data:/var/lib/rabbitmq + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:8.18.5 + container_name: local-elasticsearch + ports: + - "9200:9200" + environment: + discovery.type: single-node + xpack.security.enabled: "false" + ES_JAVA_OPTS: "-Xms512m -Xmx512m" + restart: unless-stopped + volumes: + - elasticsearch-data:/usr/share/elasticsearch/data + volumes: rabbitmq-data: + elasticsearch-data: