Repository: KEA-ChunSam/PlayUs-search-service
Pull request #15: Cs 245 chore/sentry 도입
Author: login: yechan-kim
Labels: name: 예찬
name: ⚙️ chore
description: 모듈, 빌드, CI/CD  등
Created: 2025-05-11T18:08:03Z | Merged: 2025-05-12T01:19:37Z

## ✅ PR 유형
어떤 변경 사항이 있었나요?

- [ ] 새로운 기능 추가
- [ ] 버그 수정
- [ ] 리팩토링
- [ ] 코드에 영향을 주지 않는 변경사항(주석, 개행 등등..)
- [ ] 문서 수정
- [x] 빌드 부분 혹은 패키지 매니저 수정
- [ ] 테스트 코드 추가

---

## ✏️ 작업 내용
- [x] Elastic Search 의존성 추가
- [x] Sentry 설정
![image](https://github.com/user-attachments/assets/19f5d2a1-1db1-45de-842c-75aec22f4947)

- [x] Slack WebHook 구현
![image](https://github.com/user-attachments/assets/1b59f5bc-39c4-4980-ac53-87fa047740ce)



---

## 🔗 관련 이슈
- closes #14

---

## 💡 추가 사항
- Elastic Search만 사용할 것으로 예상이 되기 때문에, Elastic Search 의존성을 추가하고 이외의 의존성 및 설정은 삭제하였습니다.
-  Sentry 관련된 환경변수를 주입하지 않을 경우 빌드가 되지 않으니, 꼭 Notion에 있는 Sentry 환경 변수를 넣어주시기 바랍니다.
- `prod`나 `dev` 프로필일 경우에만 Sentry가 활성화하도록 설정해 두었으니, 개발하실 때 참고하시기 바립니다.

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

- **신규 기능**
    - Sentry 및 Slack을 통한 오류 모니터링과 알림 기능이 추가되었습니다.
    - Elasticsearch를 데이터 소스로 사용하는 환경으로 전환되었습니다.

- **버그 수정**
    - 일부 패키지 선언의 오타가 수정되었습니다.

- **설정 및 문서**
    - MySQL 및 JPA 설정이 제거되고, Elasticsearch, Sentry, Slack, 로그 관련 설정이 추가되었습니다.
    - 로그백(Logback) 기반의 새로운 로깅 설정 파일이 도입되었습니다.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Linked issue #14: CS-245 Chore/Sentry 도입
### 상위 작업 (Epic, 보라색 번개) Ticket Number

CS-22

### 이슈 내용 (Description)

Sentry와 Slack Webhook을 도입합니다.

### 담당자 이름

김예찬

### 상세 내용 (Details)

- About Details


### 체크리스트 (Tasks)

- [ ] Sentry 도입
- [ ] Slack WebHook 구현


### 참조 (References)

- Reference1


Diff:
diff --git a/build.gradle b/build.gradle
index 345f23d..9a6f322 100644
--- a/build.gradle
+++ b/build.gradle
@@ -29,16 +29,11 @@ ext {
 
 dependencies {
 	// Spring
-	implementation 'org.springframework.boot:spring-boot-starter-webflux'
+	implementation 'org.springframework.boot:spring-boot-starter-web'
 	implementation 'org.springframework.boot:spring-boot-starter-validation'
 
 	// DB
-//	implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc'
-//	implementation 'org.springframework.boot:spring-boot-starter-data-redis-reactive'
-
-	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
-	implementation 'mysql:mysql-connector-java:8.0.33'
-	implementation 'org.springframework.boot:spring-boot-starter-data-redis'
+	implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
 
 	// MSA
 
@@ -57,6 +52,10 @@ dependencies {
 
 	// Swagger
 	implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0'
+
+	// Sentry
+	implementation("io.sentry:sentry-logback:7.17.0")
+	implementation("com.github.maricn:logback-slack-appender:1.6.1")
 }
 
 dependencyManagement {
diff --git a/src/main/java/com/playus/search_service/SearchServiceApplication.java b/src/main/java/com/playus/searchservice/SearchServiceApplication.java
similarity index 89%
rename from src/main/java/com/playus/search_service/SearchServiceApplication.java
rename to src/main/java/com/playus/searchservice/SearchServiceApplication.java
index b2478f8..e8bda1a 100644
--- a/src/main/java/com/playus/search_service/SearchServiceApplication.java
+++ b/src/main/java/com/playus/searchservice/SearchServiceApplication.java
@@ -1,4 +1,4 @@
-package com.playus.search_service;
+package com.playus.searchservice;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/src/main/java/com/playus/searchservice/global/sentry/SentryConfig.java b/src/main/java/com/playus/searchservice/global/sentry/SentryConfig.java
new file mode 100644
index 0000000..839cf4a
--- /dev/null
+++ b/src/main/java/com/playus/searchservice/global/sentry/SentryConfig.java
@@ -0,0 +1,29 @@
+package com.playus.searchservice.global.sentry;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+import io.sentry.Sentry;
+import jakarta.annotation.PostConstruct;
+
+@Configuration
+public class SentryConfig {
+
+	@Value("${sentry.dsn}")
+	private String sentryDsn;
+
+	@Value("${sentry.environment}")
+	private String environment;
+
+	@Value("${sentry.servername}")
+	private String serverName;
+
+	@PostConstruct
+	public void initSentry() {
+		Sentry.init(options -> {
+			options.setDsn(sentryDsn);
+			options.setEnvironment(environment);
+			options.setServerName(serverName);
+		});
+	}
+}
diff --git a/src/main/java/com/playus/search_service/global/swagger/SwaggerConfig.java b/src/main/java/com/playus/searchservice/global/swagger/SwaggerConfig.java
similarity index 96%
rename from src/main/java/com/playus/search_service/global/swagger/SwaggerConfig.java
rename to src/main/java/com/playus/searchservice/global/swagger/SwaggerConfig.java
index bf08146..3340465 100644
--- a/src/main/java/com/playus/search_service/global/swagger/SwaggerConfig.java
+++ b/src/main/java/com/playus/searchservice/global/swagger/SwaggerConfig.java
@@ -1,4 +1,4 @@
-package com.playus.search_service.global.swagger;
+package com.playus.searchservice.global.swagger;
 
 import java.util.List;
 
diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml
index 75373c0..6884a94 100644
--- a/src/main/resources/application-dev.yaml
+++ b/src/main/resources/application-dev.yaml
@@ -2,20 +2,21 @@ spring:
   application:
     name: search-service
 
-  datasource:
-    url: ${DB_URL}
-    username: ${DB_USER}
-    password: ${DB_PASSWORD}
-    driver-class-name: com.mysql.cj.jdbc.Driver
+  data:
+    elasticsearch:
+      repositories:
+        enabled: true
+  elasticsearch:
+    uris: ${SPRING_ELASTIC_SEARCH_URL}
 
-  jpa:
-    show-sql: true
-    hibernate:
-      ddl-auto: update
-    database: mysql
-    properties:
-      hibernate:
-        format_sql: true
-        jdbc:
-          time_zone: Asia/Seoul
-        show_sql: true
+sentry:
+  dsn: ${SENTRY_REPOSITORY_DSN}
+  environment: ${SENTRY_ENVIRONMENT}
+  servername: ${SENTRY_SERVERNAME}
+  repository-uri: ${SENTRY_REPOSITORY_URI}
+
+logging:
+  config: classpath:logback-spring.xml
+
+slack:
+  webhook-url: ${SLACK_WEBHOOK_URL}
diff --git a/src/main/resources/application-local.yaml b/src/main/resources/application-local.yaml
index a3e28de..6884a94 100644
--- a/src/main/resources/application-local.yaml
+++ b/src/main/resources/application-local.yaml
@@ -2,20 +2,21 @@ spring:
   application:
     name: search-service
 
-  datasource:
-    url: jdbc:mysql://localhost:3306/playus
-    username: ${DB_USER}
-    password: ${DB_PASSWORD}
-    driver-class-name: com.mysql.cj.jdbc.Driver
+  data:
+    elasticsearch:
+      repositories:
+        enabled: true
+  elasticsearch:
+    uris: ${SPRING_ELASTIC_SEARCH_URL}
 
-  jpa:
-    show-sql: true
-    hibernate:
-      ddl-auto: update
-    database: mysql
-    properties:
-      hibernate:
-        format_sql: true
-        jdbc:
-          time_zone: Asia/Seoul
-        show_sql: true
+sentry:
+  dsn: ${SENTRY_REPOSITORY_DSN}
+  environment: ${SENTRY_ENVIRONMENT}
+  servername: ${SENTRY_SERVERNAME}
+  repository-uri: ${SENTRY_REPOSITORY_URI}
+
+logging:
+  config: classpath:logback-spring.xml
+
+slack:
+  webhook-url: ${SLACK_WEBHOOK_URL}
diff --git a/src/main/resources/application-prod.yaml b/src/main/resources/application-prod.yaml
index 49d2394..6884a94 100644
--- a/src/main/resources/application-prod.yaml
+++ b/src/main/resources/application-prod.yaml
@@ -2,19 +2,21 @@ spring:
   application:
     name: search-service
 
-  datasource:
-    url: ${DB_URL}
-    username: ${DB_USER}
-    password: ${DB_PASSWORD}
-    driver-class-name: com.mysql.cj.jdbc.Driver
+  data:
+    elasticsearch:
+      repositories:
+        enabled: true
+  elasticsearch:
+    uris: ${SPRING_ELASTIC_SEARCH_URL}
 
-  jpa:
-    show-sql: false
-    hibernate:
-      ddl-auto: update
-    database: mysql
-    properties:
-      hibernate:
-        jdbc:
-          time_zone: Asia/Seoul
-        show_sql: false
+sentry:
+  dsn: ${SENTRY_REPOSITORY_DSN}
+  environment: ${SENTRY_ENVIRONMENT}
+  servername: ${SENTRY_SERVERNAME}
+  repository-uri: ${SENTRY_REPOSITORY_URI}
+
+logging:
+  config: classpath:logback-spring.xml
+
+slack:
+  webhook-url: ${SLACK_WEBHOOK_URL}
diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..244cca2
--- /dev/null
+++ b/src/main/resources/logback-spring.xml
@@ -0,0 +1,67 @@
+<configuration>
+    <timestamp key="BY_DATE" datePattern="yyyy-MM-dd"/>
+    <property name="LOG_PATTERN"
+              value="[%d{yyyy-MM-dd HH:mm:ss}:%-4relative] %green([%thread]) %highlight(%-5level) %boldWhite([%C.%M:%yellow(%L)]) - %msg%n"/>
+
+    <appender name="CONSOLE"
+              class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${LOG_PATTERN}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="SENTRY" class="io.sentry.logback.SentryAppender">
+        <maxRequestBodySize>always</maxRequestBodySize>
+        <sendDefaultPii>true</sendDefaultPii>
+        <tracesSampleRate>1.0</tracesSampleRate>
+        <minimumEventLevel>ERROR</minimumEventLevel>
+        <minimumBreadcrumbLevel>DEBUG</minimumBreadcrumbLevel>
+    </appender>
+
+    <springProperty name="SENTRY_REPOSITORY_URI" source="sentry.repository-uri"/>
+    <springProperty name="NAME" source="spring.application.name"/>
+    <springProperty name="ENVIRONMENT" source="sentry.environment"/>
+    <springProperty name="SLACK_WEBHOOK_URI" source="slack.webhook-url"/>
+    <appender name="SLACK" class="com.github.maricn.logback.SlackAppender">
+        <webhookUri>${SLACK_WEBHOOK_URI}</webhookUri>
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>*🚨[${ENVIRONMENT}]-[${NAME}] %d{yyyy-MM-dd HH:mm:ss.SSS} %-4relative [%thread] %-5level %class - %msg &lt;${SENTRY_REPOSITORY_URI}|Go-To-Sentry&gt;*
+                %n
+            </pattern>
+        </layout>
+        <username>Error-Bot</username>
+        <iconEmoji>:robot_face:</iconEmoji>
+        <colorCoding>true</colorCoding>
+    </appender>
+    <appender name="ASYNC_SLACK" class="ch.qos.logback.classic.AsyncAppender">
+        <appender-ref ref="SLACK"/>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>ERROR</level>
+        </filter>
+    </appender>
+
+    <springProfile name="local">
+        <root level="INFO">
+            <appender-ref ref="CONSOLE"/>
+<!--            <appender-ref ref="SENTRY"/>-->
+<!--            <appender-ref ref="ASYNC_SLACK"/>-->
+        </root>
+    </springProfile>
+
+    <springProfile name="dev">
+        <root level="INFO">
+            <appender-ref ref="CONSOLE"/>
+            <appender-ref ref="SENTRY"/>
+            <appender-ref ref="ASYNC_SLACK"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="prod">
+        <root level="INFO">
+            <appender-ref ref="CONSOLE"/>
+            <appender-ref ref="SENTRY"/>
+            <appender-ref ref="ASYNC_SLACK"/>
+        </root>
+    </springProfile>
+
+</configuration>
diff --git a/src/test/java/com/playus/search_service/SearchServiceApplicationTests.java b/src/test/java/com/playus/searchservice/SearchServiceApplicationTests.java
similarity index 87%
rename from src/test/java/com/playus/search_service/SearchServiceApplicationTests.java
rename to src/test/java/com/playus/searchservice/SearchServiceApplicationTests.java
index dedc8bc..6f71a09 100644
--- a/src/test/java/com/playus/search_service/SearchServiceApplicationTests.java
+++ b/src/test/java/com/playus/searchservice/SearchServiceApplicationTests.java
@@ -1,4 +1,4 @@
-package com.playus.search_service;
+package com.playus.searchservice;
 
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 1**

<details>
<summary>🔭 Outside diff range comments (1)</summary><blockquote>

<details>
<summary>src/test/java/com/playus/searchservice/SearchServiceApplicationTests.java (1)</summary><blockquote>

`1-7`: _⚠️ Potential issue_

**`@SpringBootTest` 설정 오류**  
`classes = SearchServiceApplicationTests.class`로 테스트 클래스를 참조 중입니다. 애플리케이션 컨텍스트 로드를 위해 `SearchServiceApplication.class`로 변경하거나 `classes` 속성을 제거하는 것이 좋습니다.

</blockquote></details>

</blockquote></details>

<details>
<summary>♻️ Duplicate comments (1)</summary><blockquote>

<details>
<summary>src/main/resources/application-dev.yaml (1)</summary><blockquote>

`5-23`: **Prod와 동일한 구성 중복**  
application-dev.yaml에 Elasticsearch, Sentry, Logging, Slack 설정이 application-prod.yaml과 완벽히 중복되어 있습니다. 환경별 공통 설정을 별도 파일(e.g., application-common.yaml)이나 `spring.profiles.include`로 분리하여 유지보수성을 높이는 방안을 고려해 보세요.

</blockquote></details>

</blockquote></details>

<details>
<summary>🧹 Nitpick comments (6)</summary><blockquote>

<details>
<summary>src/main/java/com/playus/searchservice/global/swagger/SwaggerConfig.java (1)</summary><blockquote>

`24-42`: **OpenAPI 메타데이터 외부화 제안**  
버전, 제목, 설명 등이 코드에 하드코딩되어 있어 향후 유지보수 시 수정이 번거로울 수 있습니다. `application.yaml` 또는 `@Value`를 활용해 외부 설정으로 관리하는 방안을 검토해보세요.

</blockquote></details>
<details>
<summary>src/main/resources/application-local.yaml (2)</summary><blockquote>

`12-17`: **Sentry 설정 보안 강화 제안**  
`dsn`, `environment`, `servername`, `repository-uri` 값을 Vault나 Spring Cloud Config 등 안전한 비밀 관리 시스템으로 외부화하면 보안성을 높일 수 있습니다.

---

`18-23`: **Slack WebHook 로컬 환경 분리 고려**  
로컬 프로파일에서도 Slack 알림이 전송되면 개발 환경에 불필요한 노티가 발생할 수 있습니다. `application-local.yaml`에서는 WebHook을 비활성화하거나 별도 프로파일로 관리하는 방식을 추천드립니다.

</blockquote></details>
<details>
<summary>src/main/resources/application-prod.yaml (1)</summary><blockquote>

`5-11`: **Elasticsearch 설정 검증 필요**  
`SPRING_ELASTIC_SEARCH_URL` 환경변수가 올바르게 주입되고, 유효한 URI 형식(e.g. http://host:port)을 사용하는지 확인하세요. 필요 시 기본값(fallback)을 지정하거나, 누락 시 애플리케이션 기동을 방지하는 검증 로직을 추가하는 것을 고려해 보세요.

</blockquote></details>
<details>
<summary>src/main/java/com/playus/searchservice/global/sentry/SentryConfig.java (1)</summary><blockquote>

`21-28`: **Sentry 초기화 로깅 추가 제안**  
`Sentry.init` 호출 후 초기화 성공 여부를 로깅해두면, DSN 오류나 환경설정 누락 시 빠른 원인 파악에 도움이 됩니다. 예를 들어 `log.info("Sentry initialized with DSN: {}", sentryDsn);` 같은 로그를 추가해보세요.

</blockquote></details>
<details>
<summary>src/main/resources/logback-spring.xml (1)</summary><blockquote>

`25-35`: **SlackAppender 비동기 큐 정책 제안**  
`ASYNC_SLACK` 사용 시 기본 큐 크기가 작아 메시지 유실 가능성이 있습니다. `queueSize`나 `discardingThreshold` 파라미터를 설정해 보호 정책을 추가하는 것을 권장합니다.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 42055bf4bd002a1ac7a0e35ec9b4bdb95a0e7e9d and 2df587fb21043d35a51e5a8369075d26555a4714.

</details>

<details>
<summary>📒 Files selected for processing (9)</summary>

* `build.gradle` (2 hunks)
* `src/main/java/com/playus/searchservice/SearchServiceApplication.java` (1 hunks)
* `src/main/java/com/playus/searchservice/global/sentry/SentryConfig.java` (1 hunks)
* `src/main/java/com/playus/searchservice/global/swagger/SwaggerConfig.java` (1 hunks)
* `src/main/resources/application-dev.yaml` (1 hunks)
* `src/main/resources/application-local.yaml` (1 hunks)
* `src/main/resources/application-prod.yaml` (1 hunks)
* `src/main/resources/logback-spring.xml` (1 hunks)
* `src/test/java/com/playus/searchservice/SearchServiceApplicationTests.java` (1 hunks)

</details>

<details>
<summary>🔇 Additional comments (13)</summary><blockquote>

<details>
<summary>src/main/java/com/playus/searchservice/global/swagger/SwaggerConfig.java (1)</summary>

`1-1`: **패키지 선언 일관성 확인**  
`com.playus.searchservice`로 언더스코어 제거 후 패키지명이 파일 경로와 일치합니다. 별다른 문제가 없어 보입니다.

</details>
<details>
<summary>build.gradle (3)</summary>

`32-32`: **WebFlux 제거 및 서블릿 기반 전환 확인**  
`spring-boot-starter-web`으로 변경하며 WebFlux 의존성을 제거했습니다. 빌드 전후로 프로젝트 전반에 WebFlux 관련 잔여 코드가 없는지 검증해주세요.

---

`36-36`: **Elasticsearch 의존성 추가 검증 필요**  
`spring-boot-starter-data-elasticsearch`를 추가하면서 관련 설정(`spring.elasticsearch.uris`)과 클러스터 버전 호환성을 확인해야 합니다.

---

`55-58`: **Sentry & Slack Appender 의존성 호환성 검증**  
`io.sentry:sentry-logback:7.17.0` 및 `com.github.maricn:logback-slack-appender:1.6.1`가 Spring Boot `3.4.4`와 호환되는지 확인이 필요합니다.

</details>
<details>
<summary>src/main/java/com/playus/searchservice/SearchServiceApplication.java (1)</summary>

`1-2`: **패키지 선언 일관성 승인**  
`com.playus.searchservice`로 패키지 네이밍을 통일하여 문제없어 보입니다.

</details>
<details>
<summary>src/main/resources/application-local.yaml (1)</summary>

`5-11`: **Elasticsearch 설정 키 및 위치 검증**  
`spring.data.elasticsearch.repositories.enabled`와 `spring.elasticsearch.uris`가 Spring Boot `3.x` 기준으로 올바르게 매핑되었는지 한 번 더 확인해주세요.

</details>
<details>
<summary>src/main/resources/application-prod.yaml (3)</summary>

`12-17`: **Sentry 환경변수 키와 값 확인**  
`sentry.dsn`, `sentry.environment`, `sentry.servername`, `sentry.repository-uri` 프로퍼티가 실제 환경변수 및 `SentryConfig`, Logback 설정과 완전히 일치하는지 검증해야 합니다. 오타나 누락이 없는지 재확인하세요.

---

`18-20`: **Logback 설정 파일 경로 유효성**  
`logging.config: classpath:logback-spring.xml` 경로가 빌드 산출물에 포함된 리소스와 일치함을 확인했습니다. 문제 없어 보입니다.

---

`21-23`: **Slack WebHook URL 주입 검증**  
`SLACK_WEBHOOK_URL` 환경변수가 dev/prod 환경에 올바르게 설정되어 있는지 확인하세요. 로컬(local) 프로파일에서는 주석 처리되므로, 배포 환경에서만 필요합니다.

</details>
<details>
<summary>src/main/resources/logback-spring.xml (4)</summary>

`13-19`: **SentryAppender 최소 이벤트 레벨 확인**  
`<minimumEventLevel>ERROR</minimumEventLevel>` 설정이 의도한 대로 ERROR 이상 이벤트만 캡처하는지, 비즈니스 요구사항에 부합하는지 검증하세요. 필요 시 `WARN` 등으로 조정할 수도 있습니다.

---

`21-24`: **SpringProperty 소스 키 검증**  
`source="sentry.repository-uri"`, `spring.application.name`, `sentry.environment`, `slack.webhook-url` 등이 YAML 파일의 실제 키와 정확히 일치하는지 확인해주세요. 오타로 값이 누락되면 로그 콜백에서 NPE가 발생할 수 있습니다.

---

`43-49`: **local 프로파일 로깅 적절**  
local 프로파일에서 Console만 활성화한 설정이 적절하며, 불필요한 Sentry/Slack 호출을 방지합니다.

---

`51-57`: **dev/prod 프로파일 로깅 적절**  
dev 및 prod 프로파일에 Console, Sentry, Async Slack appenders가 올바르게 적용된 것을 확인했습니다.  



Also applies to: 59-65

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: CHANGES_REQUESTED
author_association: NONE
submitted_at: 2025-05-11T18:12:56Z
user: login: yechan-kim
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-11T18:32:37Z
user: login: coderabbitai[bot]
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-11T18:33:02Z
user: login: coderabbitai[bot]
state: APPROVED
author_association: NONE
submitted_at: 2025-05-11T18:34:56Z
user: login: Minminminwoo
state: APPROVED
author_association: NONE
submitted_at: 2025-05-12T00:38:25Z

Review comments:
diff_hunk: @@ -0,0 +1,29 @@
+package com.playus.searchservice.global.sentry;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+import io.sentry.Sentry;
+import jakarta.annotation.PostConstruct;
+
+@Configuration
+public class SentryConfig {
+
+	@Value("${sentry.dsn}")
+	private String sentryDsn;
+
+	@Value("${sentry.environment}")
+	private String environment;
+
+	@Value("${sentry.servername}")
+	private String serverName;
+
path: src/main/java/com/playus/searchservice/global/sentry/SentryConfig.java
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**SentryConfig 프로파일 제한 필요**  
현재 `SentryConfig`가 모든 프로파일(local, dev, prod)에서 로드되어, local 등에서 필수 환경변수가 없을 경우 애플리케이션 기동이 실패할 수 있습니다. `@Profile({"dev","prod"})` 또는 `@ConditionalOnProperty("sentry.dsn")` 어노테이션을 활용해 dev/prod 프로파일에서만 활성화되도록 제한하세요.

<!-- This is an auto-generated reply by CodeRabbit -->
created_at: 2025-05-11T18:12:55Z
author_association: NONE
diff_hunk: @@ -0,0 +1,29 @@
+package com.playus.searchservice.global.sentry;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+import io.sentry.Sentry;
+import jakarta.annotation.PostConstruct;
+
+@Configuration
+public class SentryConfig {
+
+	@Value("${sentry.dsn}")
+	private String sentryDsn;
+
+	@Value("${sentry.environment}")
+	private String environment;
+
+	@Value("${sentry.servername}")
+	private String serverName;
+
path: src/main/java/com/playus/searchservice/global/sentry/SentryConfig.java
user: login: yechan-kim
body: 환경 변수는 다 넣어주고 있어서 문제가 없을 것 같습니다.
`logback`에서는 해당 옵션을 사용할 수 없어서, 일관된 프로파일 구성과 추후에 테스트를 위해서 해당 설정은 현행을 유지하도록 하겠습니다.
created_at: 2025-05-11T18:32:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,29 @@
+package com.playus.searchservice.global.sentry;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+import io.sentry.Sentry;
+import jakarta.annotation.PostConstruct;
+
+@Configuration
+public class SentryConfig {
+
+	@Value("${sentry.dsn}")
+	private String sentryDsn;
+
+	@Value("${sentry.environment}")
+	private String environment;
+
+	@Value("${sentry.servername}")
+	private String serverName;
+
path: src/main/java/com/playus/searchservice/global/sentry/SentryConfig.java
user: login: coderabbitai[bot]
body: @yechan-kim 네, 이해했습니다. 환경 변수를 모든 환경에서 제공하고 있고, logback과의 일관성 및 테스트를 위해 현재 구성을 유지하시는 이유가 타당합니다. 설명 감사합니다!



(∩^ω^)⊃━☆

---

<details>
<summary>✏️ Learnings added</summary>

```
Learnt from: yechan-kim
PR: KEA-ChunSam/PlayUs-search-service#15
File: src/main/java/com/playus/searchservice/global/sentry/SentryConfig.java:9-20
Timestamp: 2025-05-11T18:33:01.144Z
Learning: PlayUs-search-service 프로젝트에서는 환경 변수가 모든 환경(local, dev, prod)에 제공되며, Sentry 관련 설정은 프로파일 제한 없이 글로벌하게 적용되어 있다. 이는 logback과의 일관성 및 테스트 목적으로 의도적으로 설계된 것이다.
```

> Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure [review instructions](https://docs.coderabbit.ai/guides/review-instructions). You can manage existing learnings in the [app](https://app.coderabbit.ai/learnings).

</details>



<!-- This is an auto-generated reply by CodeRabbit -->
created_at: 2025-05-11T18:33:01Z
author_association: NONE

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-05-11T18:08:10Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

<details>
<summary>📝 Walkthrough</summary>

## Walkthrough

이 변경사항은 프로젝트의 데이터베이스 및 웹 스택을 MySQL/JPA 기반에서 Elasticsearch 기반으로 전환하고, Spring WebFlux에서 전통적인 Spring Web으로 변경합니다. 또한 Sentry와 Slack Webhook을 통한 로깅 및 에러 모니터링 기능이 새롭게 도입되었습니다.

## Changes

| 파일/경로 요약                                                         | 변경 요약                                                                                                 |
|------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------|
| build.gradle                                                           | WebFlux, R2DBC, Redis, JPA, MySQL 등 기존 의존성 제거. Spring Web, Elasticsearch, Sentry, Slack Logback 등 신규 의존성 추가. |
| src/main/resources/application-*.yaml                                  | MySQL/JPA 설정 제거, Elasticsearch 설정 추가. Sentry, Logging, Slack Webhook 관련 설정 추가.              |
| src/main/resources/logback-spring.xml                                  | 신규 Logback 설정 파일 추가. Sentry와 Slack에 대한 로깅 및 에러 알림 설정 포함.                           |
| src/main/java/com/playus/searchservice/global/sentry/SentryConfig.java | Sentry 설정을 위한 신규 Spring Configuration 클래스 추가.                                                 |
| src/main/java/com/playus/searchservice/SearchServiceApplication.java<br>src/main/java/com/playus/searchservice/global/swagger/SwaggerConfig.java<br>src/test/java/com/playus/searchservice/SearchServiceApplicationTests.java | 패키지명 오타(언더스코어 → 점) 수정.                                                                    |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant SpringApp
    participant Sentry
    participant Slack

    User->>SpringApp: 요청 발생
    SpringApp->>SpringApp: 예외 발생
    SpringApp->>Sentry: SentryConfig 통해 에러 전송
    SpringApp->>Slack: Logback Slack Appender로 에러 알림 전송
```

## Assessment against linked issues

| Objective                                             | Addressed | Explanation                                    |
|-------------------------------------------------------|-----------|------------------------------------------------|
| Sentry 도입, Slack WebHook 구현 (#14)                 | ✅        |                                                |

## Poem

> 🐰  
> 새로운 로그의 길을 찾아  
> Sentry와 Slack에 토끼가 뛰어가네!  
> MySQL은 안녕, Elasticsearch 안녕—  
> 에러가 와도 걱정 마,  
> 이제는 알림이 번쩍!  
> 토끼는 안심하고 당근을 먹네.  
> 🥕

</details>

<!-- walkthrough_end -->

<!-- announcements_start -->

> [!TIP]
> <details>
> <summary>⚡️ Faster reviews with caching</summary>
> 
> - CodeRabbit now supports caching for code and dependencies, helping speed up reviews. This means quicker feedback, reduced wait times, and a smoother review experience overall. Cached data is encrypted and stored securely. This feature will be automatically enabled for all accounts on May 16th. To opt out, configure `Review - Disable Cache` at either the organization or repository level. If you prefer to disable all data retention across your organization, simply turn off the `Data Retention` setting under your Organization Settings.
> 
> Enjoy the performance boost—your workflow just got faster.
> 
> </details>

<!-- announcements_end -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=KEA-ChunSam/PlayUs-search-service&utm_content=15):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-11T18:09:11Z
body: ## Test Results
1 tests   1 ✅  0s ⏱️
1 suites  0 💤
1 files    0 ❌

Results for commit 2df587fb.

[test-results]:data:application/gzip;base64,H4sIAMTnIGgC/1WMSQ7CMBAEvxL5zMHbxIHPRMaLNCKJkZcT4u8YQ8C5dXW36kE8Li6Ry8BOA0kF8w9siTpj2CrSinXI+9TynIoxx+KG9/49e43LoXAxhvhtYtl23zv2ug//bY07WePeZcK6Yq5AuPUwKX/ljEphBWhgDvQkxjNVYPkIAFoqJsnzBSw9ndb7AAAA

author_association: NONE
user: login: Minminminwoo
created_at: 2025-05-12T00:38:16Z
body: 고생하셧습니다! Notion에서 Sentry 환경 변수 어디에 있는지 잘 모르겠어서 그런데 알려주시면 감사하겠습니다
author_association: NONE
user: login: yechan-kim
created_at: 2025-05-12T01:19:32Z
body: > 고생하셧습니다! Notion에서 Sentry 환경 변수 어디에 있는지 잘 모르겠어서 그런데 알려주시면 감사하겠습니다

제가 어제 추가를 안 해둬서 지금 추가해 두었습니다!
author_association: CONTRIBUTOR