Repository: Slo-plo/Slo-plo
Pull request #33: [Feat] 지역 선택 슬라이드바 구현 #27
Author: login: moongmoongch
Created: 2025-05-10T09:15:35Z | Merged: 2025-05-10T10:03:06Z

## 관련 이슈 번호

<!-- PR이 해결하는 이슈 번호를 입력하세요. -->
<!-- 예시: 'fixes #123' 또는 'closes #456' -->
fixes #14 
closes #27 

## 설명

<!-- 이 PR에서 구현한 내용과 변경 사항을 간략히 설명하세요. -->
<!-- 예시: 로그인 버튼 클릭 시 화면이 전환되는 버그를 수정했습니다. -->
1. 봉사활동 모아보기 메인화면 UI 수정
     - 아이디 네이밍 수정
     - 위치 아이콘 수정 (추후 추가될 지도상의 맵핀 아이콘과 겹칠 수 있을 것 같아, ic_volunteer_map_pin.xml로 설정해두었습니다.)
     - 텍스트뷰 길이 제한
     - 아이템 배경 색 뷰 홀더에서 item background 속성으로 수정

2. 바텀 시트 구현
     - 저는 에뮬레이터에서만 확인이 가능해서, 스마트폰에서 요소들이 너무 작다면 말씀해주세요!
     - 지역은 추후 정리해서 추가 예정
     - 지역 선택 버튼 기능은 모아보기 화면 만들 때 같이 구현하겠습니다.

## 변경 사항

<!-- 아래 항목에 해당하는 변경 사항을 체크하여 PR의 주요 변경 사항을 명확하게 전달하세요. -->

- [x]  새로운 기능 추가
<!-- 예시: 새로운 로그인 기능을 추가 -->
- [ ]  버그 수정
<!-- 예시: 로그인 시 발생한 충돌을 수정 -->
- [x]  코드 리팩토링
<!-- 예시: 코드 최적화를 위해 함수 리팩토링 -->
- [ ]  문서 수정
<!-- 예시: [README.md](http://readme.md/) 파일 수정 -->
- [ ]  테스트 코드 추가
<!-- 예시: 로그인 기능에 대한 단위 테스트 추가 -->
- [ ]  기타
<!-- 예시: 새로운 디렉토리 구조로 리팩토링 -->

## 스크린샷 (선택 사항)

<!-- UI 변경 사항이 있다면 스크린샷을 첨부해 주세요. -->
<!-- 예시: 버튼 클릭 시 로그인 화면으로 전환되는 모습을 보여주는 스크린샷 -->

|선택 전|서울 선택|
|---|---|
|<img src = "https://github.com/user-attachments/assets/ec5d8f82-ef87-434b-9c71-bed0f8d6a2af">|<img src = "https://github.com/user-attachments/assets/e3159852-f335-4890-a668-a0fa0d551dde">|





Diff:
diff --git a/app/src/main/java/com/example/slo_plo/RecomendVolunteer.kt b/app/src/main/java/com/example/slo_plo/RecomendVolunteer.kt
deleted file mode 100644
index 1f58823..0000000
--- a/app/src/main/java/com/example/slo_plo/RecomendVolunteer.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.example.slo_plo
-
-data class RecomendVolunteer(
-    val title: String,
-    val description: String
-)
diff --git a/app/src/main/java/com/example/slo_plo/RecommendVolunteer.kt b/app/src/main/java/com/example/slo_plo/RecommendVolunteer.kt
new file mode 100644
index 0000000..066955f
--- /dev/null
+++ b/app/src/main/java/com/example/slo_plo/RecommendVolunteer.kt
@@ -0,0 +1,8 @@
+package com.example.slo_plo
+
+data class RecommendVolunteer(
+    val title: String,
+    val description: String,
+    val location: String,  // 지역 추가
+    val date: String       // 날짜 추가
+)
diff --git a/app/src/main/java/com/example/slo_plo/RecomendVolunteerAdapter.kt b/app/src/main/java/com/example/slo_plo/RecommendVolunteerAdapter.kt
similarity index 51%
rename from app/src/main/java/com/example/slo_plo/RecomendVolunteerAdapter.kt
rename to app/src/main/java/com/example/slo_plo/RecommendVolunteerAdapter.kt
index 8fcd50f..234461a 100644
--- a/app/src/main/java/com/example/slo_plo/RecomendVolunteerAdapter.kt
+++ b/app/src/main/java/com/example/slo_plo/RecommendVolunteerAdapter.kt
@@ -5,16 +5,18 @@ import android.view.ViewGroup
 import androidx.recyclerview.widget.RecyclerView
 import com.example.slo_plo.databinding.ItemRecomendVolunteerBinding
 
-class RecomendVolunteerAdapter(private val recomendVolunteerList: List<RecomendVolunteer>) :
-    RecyclerView.Adapter<RecomendVolunteerAdapter.VolunteerViewHolder>() {
+class RecommendVolunteerAdapter(private val recommendVolunteerList: List<RecommendVolunteer>) :
+    RecyclerView.Adapter<RecommendVolunteerAdapter.VolunteerViewHolder>() {
 
     inner class VolunteerViewHolder(private val binding: ItemRecomendVolunteerBinding) :
         RecyclerView.ViewHolder(binding.root) {
-        fun bind(recomendVolunteer: RecomendVolunteer) {
-            binding.tvTitle.text = recomendVolunteer.title
-            binding.tvDescription.text = recomendVolunteer.description
+        fun bind(recommendVolunteer: RecommendVolunteer) {
+            binding.tvRecommendTitle.text = recommendVolunteer.title
+            binding.tvRecommendDescription.text = recommendVolunteer.description
+            binding.tvRecommendLocation.text = recommendVolunteer.location
+            binding.tvRecommendDate.text = recommendVolunteer.date
             // 아이템의 배경색을 흰색으로 설정
-            binding.root.setBackgroundColor(itemView.context.getColor(R.color.white))
+            //binding.root.setBackgroundColor(itemView.context.getColor(R.color.white))
         }
     }
 
@@ -24,8 +26,8 @@ class RecomendVolunteerAdapter(private val recomendVolunteerList: List<RecomendV
     }
 
     override fun onBindViewHolder(holder: VolunteerViewHolder, position: Int) {
-        holder.bind(recomendVolunteerList[position])
+        holder.bind(recommendVolunteerList[position])
     }
 
-    override fun getItemCount() = recomendVolunteerList.size
+    override fun getItemCount() = recommendVolunteerList.size
 }
diff --git a/app/src/main/java/com/example/slo_plo/VolunteerFragment.kt b/app/src/main/java/com/example/slo_plo/VolunteerFragment.kt
index b2c5e6a..9c81c79 100644
--- a/app/src/main/java/com/example/slo_plo/VolunteerFragment.kt
+++ b/app/src/main/java/com/example/slo_plo/VolunteerFragment.kt
@@ -1,21 +1,25 @@
-package com.example.slo_plo
-
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
-import android.widget.Toast
 import androidx.fragment.app.Fragment
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.DividerItemDecoration
 import com.example.slo_plo.databinding.FragmentVolunteerBinding
+import com.example.slo_plo.databinding.BottomSheetLocationBinding
+import com.google.android.material.bottomsheet.BottomSheetDialog
+import android.widget.ArrayAdapter
+import com.example.slo_plo.RecommendVolunteerAdapter
+import com.google.android.material.bottomsheet.BottomSheetBehavior
+import com.example.slo_plo.RecommendVolunteer
+
 
 class VolunteerFragment : Fragment() {
 
     private var _binding: FragmentVolunteerBinding? = null
     private val binding get() = _binding!!
 
-    private lateinit var recomendVolunteerAdapter: RecomendVolunteerAdapter
+    private lateinit var recommendVolunteerAdapter: RecommendVolunteerAdapter
 
     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?,
@@ -24,18 +28,72 @@ class VolunteerFragment : Fragment() {
         _binding = FragmentVolunteerBinding.inflate(inflater, container, false)
         val view = binding.root
 
-        // 지역 선택 버튼 클릭 이벤트
         binding.btnFindLocation.setOnClickListener {
-            Toast.makeText(requireContext(), "지역 선택 기능은 아직 구현되지 않았습니다.", Toast.LENGTH_SHORT).show()
+            val dialog = BottomSheetDialog(requireContext())
+            val sheetBinding = BottomSheetLocationBinding.inflate(layoutInflater)
+            val dialogView = sheetBinding.root
+
+            // 화면 높이를 가져오기
+            val displayMetrics = resources.displayMetrics
+            val screenHeight = displayMetrics.heightPixels
+            val sheetHeight = (screenHeight * 0.75).toInt()
+
+            dialog.setContentView(dialogView)
+
+            // BottomSheetBehavior 커스터마이징
+            val bottomSheet = dialog.delegate.findViewById<View>(com.google.android.material.R.id.design_bottom_sheet)
+            bottomSheet?.let {
+                val behavior = BottomSheetBehavior.from(it)
+                behavior.state = BottomSheetBehavior.STATE_EXPANDED
+                behavior.isHideable = false
+                behavior.skipCollapsed = true
+                it.layoutParams.height = sheetHeight
+                it.requestLayout()
+
+                behavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
+                    override fun onStateChanged(sheet: View, newState: Int) {
+                        if (newState == BottomSheetBehavior.STATE_DRAGGING) {
+                            behavior.state = BottomSheetBehavior.STATE_EXPANDED
+                        }
+                    }
+
+                    override fun onSlide(sheet: View, offset: Float) {}
+                })
+            }
+
+            // 리스트 연결
+            val regions = listOf("서울", "경기", "인천", "강원", "대전/충청", "대구", "부산/울산", "경상", "광주/전라")
+            val regionMap = mapOf(
+                "서울" to listOf("강남", "강변", "건대입구", "구로", "노원구", "대학로", "동대문", "동촌", "명동", "미아", "버전"),
+                "경기" to listOf("수원", "성남", "용인")
+                // 다른 지역에 대한 리스트 추가
+            )
+
+            val regionAdapter = ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, regions)
+            sheetBinding.listRegion.adapter = regionAdapter
+
+            sheetBinding.listRegion.setOnItemClickListener { _, _, position, _ ->
+                val selected = regions[position]
+                val subRegions = regionMap[selected] ?: emptyList()
+                val subAdapter = ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, subRegions)
+                sheetBinding.listSubregion.adapter = subAdapter
+            }
+
+            sheetBinding.tvRegionClose.setOnClickListener { dialog.dismiss() }
+            sheetBinding.btnSelectRegion.setOnClickListener {
+                // 선택된 지역 처리 로직
+                dialog.dismiss()
+            }
+
+            dialog.show()
         }
 
         // 리사이클러뷰 설정
-        recomendVolunteerAdapter = RecomendVolunteerAdapter(getVolunteerList())
+        recommendVolunteerAdapter = RecommendVolunteerAdapter(getVolunteerList())
         binding.recyclerViewRecommendVolunteer.apply {
             layoutManager = LinearLayoutManager(requireContext())
-            adapter = recomendVolunteerAdapter
+            adapter = recommendVolunteerAdapter
 
-            // 리사이클러뷰의 데이터 아이템 사이에 구분선 추가
             val dividerItemDecoration = DividerItemDecoration(requireContext(), LinearLayoutManager.VERTICAL)
             addItemDecoration(dividerItemDecoration)
         }
@@ -43,17 +101,16 @@ class VolunteerFragment : Fragment() {
         return view
     }
 
-    // 더미 데이터 생성
-    private fun getVolunteerList(): List<RecomendVolunteer> {
+    private fun getVolunteerList(): List<RecommendVolunteer> {
         return listOf(
-            RecomendVolunteer("길거리 청소 봉사", "도심 거리 청소를 함께해요!"),
-            RecomendVolunteer("노인복지센터 지원", "말벗이 되어 드리고 식사 보조도 해요."),
-            RecomendVolunteer("지역 아동센터 미술 수업", "아이들과 창의력 넘치는 시간을 보내요."),
-            RecomendVolunteer("동물 보호소 봉사", "유기동물들과 산책하며 돌봐줘요."),
-            RecomendVolunteer("환경 보호 캠페인", "자연을 지키는 활동에 참여해요."),
-            RecomendVolunteer("이웃 지원 봉사", "독거노인 분들에게 필요한 물품을 전달해요."),
-            RecomendVolunteer("청소년 멘토링", "청소년들에게 진로 상담을 해줘요."),
-            RecomendVolunteer("해변 청소 봉사", "해변에서 쓰레기를 청소해요.")
+            RecommendVolunteer("길거리 청소 봉사", "도심 거리 청소를 함께해요!", "노원구", "5월 12일"),
+            RecommendVolunteer("노인복지센터 지원", "말벗이 되어 드리고 식사 보조도 해요.", "강남구", "6월 12일"),
+            RecommendVolunteer("지역 아동센터 미술 수업", "아이들과 창의력 넘치는 시간을 보내요.", "노원구", "5월 12일"),
+            RecommendVolunteer("동물 보호소 봉사", "유기동물들과 산책하며 돌봐줘요.", "노원구", "5월 12일"),
+            RecommendVolunteer("환경 보호 캠페인", "자연을 지키는 활동에 참여해요.", "노원구", "5월 12일"),
+            RecommendVolunteer("이웃 지원 봉사", "독거노인 분들에게 필요한 물품을 전달해요.", "노원구", "5월 12일"),
+            RecommendVolunteer("청소년 멘토링", "청소년들에게 진로 상담을 해줘요.", "노원구", "5월 12일"),
+            RecommendVolunteer("해변 청소 봉사", "해변에서 쓰레기를 청소해요.", "노원구", "5월 12일")
         )
     }
 
diff --git a/app/src/main/res/drawable/ic_volunteer_map_pin.xml b/app/src/main/res/drawable/ic_volunteer_map_pin.xml
new file mode 100644
index 0000000..0f7ddbb
--- /dev/null
+++ b/app/src/main/res/drawable/ic_volunteer_map_pin.xml
@@ -0,0 +1,23 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="256dp"
+    android:height="228dp"
+    android:viewportWidth="256"
+    android:viewportHeight="228">
+  <path
+      android:pathData="M0.22,168.49a127.52,58.62 0,1 0,255.03 0a127.52,58.62 0,1 0,-255.03 0z"
+      android:fillColor="#93C9EF"/>
+  <path
+      android:pathData="M194.01,72.17C194.01,122.83 128.88,166.25 128.88,166.25C128.88,166.25 63.75,122.83 63.75,72.17C63.75,54.9 70.61,38.33 82.83,26.12C95.04,13.9 111.61,7.04 128.88,7.04C146.15,7.04 162.72,13.9 174.93,26.12C187.15,38.33 194.01,54.9 194.01,72.17Z"
+      android:strokeLineJoin="round"
+      android:strokeWidth="13.7114"
+      android:fillColor="#2B87CA"
+      android:strokeColor="#000000"
+      android:strokeLineCap="round"/>
+  <path
+      android:pathData="M128.88,94.54C141.96,94.54 152.57,83.94 152.57,70.86C152.57,57.78 141.96,47.17 128.88,47.17C115.8,47.17 105.2,57.78 105.2,70.86C105.2,83.94 115.8,94.54 128.88,94.54Z"
+      android:strokeLineJoin="round"
+      android:strokeWidth="13.7114"
+      android:fillColor="#ffffff"
+      android:strokeColor="#000000"
+      android:strokeLineCap="round"/>
+</vector>
diff --git a/app/src/main/res/layout/bottom_sheet_location.xml b/app/src/main/res/layout/bottom_sheet_location.xml
new file mode 100644
index 0000000..9d1d3e2
--- /dev/null
+++ b/app/src/main/res/layout/bottom_sheet_location.xml
@@ -0,0 +1,73 @@
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        android:orientation="vertical"
+        android:padding="16dp">
+
+        <!-- 닫기 버튼 -->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:gravity="start">
+
+            <TextView
+                android:id="@+id/tv_region_close"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="end"
+                android:clickable="true"
+                android:focusable="true"
+                android:padding="8dp"
+                android:text="X 창 닫기"
+                android:textSize="16sp"
+                android:textStyle="bold"
+                android:fontFamily="@font/noto_sans_kr_semi_bold"
+                android:includeFontPadding="false"/>
+        </LinearLayout>
+
+        <!-- 리스트 -->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1"
+            android:orientation="horizontal">
+
+            <ListView
+                android:id="@+id/list_region"
+                android:layout_width="0dp"
+                android:layout_weight="1"
+                android:layout_height="match_parent"
+                android:background="#F0F0F0"
+                android:fontFamily="@font/noto_sans_kr_semi_bold"
+                android:includeFontPadding="false"/>
+
+            <ListView
+                android:id="@+id/list_subregion"
+                android:layout_width="0dp"
+                android:layout_weight="2"
+                android:layout_height="match_parent"
+                android:fontFamily="@font/noto_sans_kr_semi_bold"
+                android:includeFontPadding="false"/>
+        </LinearLayout>
+    </LinearLayout>
+
+    <!-- 버튼: 마진 없이 완전 꽉차게 -->
+    <android.widget.Button
+        android:id="@+id/btn_select_region"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="지역 선택"
+        android:background="#808080"
+        android:textColor="#FFFFFF"
+        android:fontFamily="@font/noto_sans_kr_semi_bold"
+        android:includeFontPadding="false"/>
+
+</LinearLayout>
diff --git a/app/src/main/res/layout/fragment_volunteer.xml b/app/src/main/res/layout/fragment_volunteer.xml
index 8ace884..a820d6b 100644
--- a/app/src/main/res/layout/fragment_volunteer.xml
+++ b/app/src/main/res/layout/fragment_volunteer.xml
@@ -57,7 +57,9 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintHorizontal_bias="0.06"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/btn_find_location" />
+        app:layout_constraintTop_toBottomOf="@id/btn_find_location"
+        android:fontFamily="@font/noto_sans_kr_semi_bold"
+        android:includeFontPadding="false"/>
 
     <!-- 4) RecyclerView -->
     <androidx.recyclerview.widget.RecyclerView
@@ -78,7 +80,7 @@
         android:id="@+id/ic_map"
         android:layout_width="95dp"
         android:layout_height="88dp"
-        android:src="@drawable/ic_nav_volunteer"
+        android:src="@drawable/ic_volunteer_map_pin"
         app:layout_constraintTop_toBottomOf="@id/ic_app_sloplo"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
diff --git a/app/src/main/res/layout/item_recomend_volunteer.xml b/app/src/main/res/layout/item_recomend_volunteer.xml
index e9e90e6..80279e4 100644
--- a/app/src/main/res/layout/item_recomend_volunteer.xml
+++ b/app/src/main/res/layout/item_recomend_volunteer.xml
@@ -1,12 +1,14 @@
 <androidx.constraintlayout.widget.ConstraintLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:padding="12dp">
+    android:padding="12dp"
+    android:background="#FFFFFF">
 
     <TextView
-        android:id="@+id/tvTitle"
+        android:id="@+id/tv_recommend_title"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:text="제목"
@@ -14,15 +16,58 @@
         android:textStyle="bold"
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="parent" />
+        app:layout_constraintEnd_toEndOf="parent"
+        android:maxLines="1"
+        android:fontFamily="@font/noto_sans_kr_semi_bold"
+        android:includeFontPadding="false"/>
 
     <TextView
-        android:id="@+id/tvDescription"
+        android:id="@+id/tv_recommend_description"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:text="설명"
         android:textSize="14sp"
-        app:layout_constraintTop_toBottomOf="@id/tvTitle"
+        app:layout_constraintTop_toBottomOf="@id/tv_recommend_title"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="parent" />
+        app:layout_constraintEnd_toEndOf="parent"
+        android:maxLines="2"
+        android:fontFamily="@font/noto_sans_kr_semi_bold"
+        android:includeFontPadding="false"/>
+
+    <TextView
+        android:id="@+id/tv_recommend_location"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="지역"
+        android:textSize="10sp"
+        android:layout_marginTop="8dp"
+        app:layout_constraintTop_toBottomOf="@id/tv_recommend_description"
+        app:layout_constraintStart_toStartOf="parent"
+        android:fontFamily="@font/noto_sans_kr_semi_bold"
+        android:includeFontPadding="false"/>
+
+    <TextView
+        android:id="@+id/tv_recommed_separator"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text=" | "
+        android:textSize="10sp"
+        android:layout_marginTop="8dp"
+        app:layout_constraintTop_toBottomOf="@id/tv_recommend_description"
+        app:layout_constraintStart_toEndOf="@id/tv_recommend_location"
+        android:fontFamily="@font/noto_sans_kr_semi_bold"
+        android:includeFontPadding="false"/>
+
+    <TextView
+        android:id="@+id/tv_recommend_date"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="날짜"
+        android:textSize="10sp"
+        android:layout_marginTop="8dp"
+        app:layout_constraintTop_toBottomOf="@id/tv_recommend_description"
+        app:layout_constraintStart_toEndOf="@id/tv_recommed_separator"
+        android:fontFamily="@font/noto_sans_kr_semi_bold"
+        android:includeFontPadding="false"/>
+
 </androidx.constraintlayout.widget.ConstraintLayout>


Reviews:
user: login: yangjiae12
body: 수고하셨습니다! 제가 내일 오전까지는 제대로 확인을 못할 거 같아 우선 승인하였는데 뷰 바인딩으로 바꾸는 건 지금 수정해서 머지하셔도 되고 아니면 다음 이슈에서 진행해도 좋을 거 같습니다~
state: DISMISSED
author_association: MEMBER
submitted_at: 2025-05-10T09:31:58Z
user: login: moongmoongch
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-10T09:34:37Z
user: login: yangjiae12
body: 확인했습니다! 수고하셨습니다~
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-10T10:01:21Z

Review comments:
path: app/src/main/java/com/example/slo_plo/VolunteerFragment.kt
user: login: yangjiae12
body: 여기서 FindViewById 쓴 거 뷰 바인딩으로 수정해주세요!
created_at: 2025-05-10T09:30:54Z
author_association: MEMBER
path: app/src/main/java/com/example/slo_plo/VolunteerFragment.kt
user: login: moongmoongch
body: 앗 수정해서 머지하겠습니다!!
created_at: 2025-05-10T09:34:37Z
author_association: COLLABORATOR

PR comments:
user: login: moongmoongch
created_at: 2025-05-10T10:40:00Z
body: 제가 VolunteerFragment 상단에 패키지 선언을 빼먹어서 실행이 제대로 안 되네요!!
package com.example.slo_plo 추가하고 실행해주시면 되겠습니다.. 죄송합니다 (^^;;)
author_association: COLLABORATOR
user: login: yangjiae12
created_at: 2025-05-10T10:44:40Z
body: > 제가 VolunteerFragment 상단에 패키지 선언을 빼먹어서 실행이 제대로 안 되네요!! package com.example.slo_plo 추가하고 실행해주시면 되겠습니다.. 죄송합니다 (^^;;)

Bug 이슈 하나 파서 그것만 추가하고 머지하셔도 돼용 잠시 ruleset 없애둘게요!! 아니면 그냥 각자 추가해서 작업해두 되고요~~
author_association: MEMBER