From 4094ce3b34fa2b6fdb4a38e5ea66838daa7a3472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=8A=B9=EC=9D=B8?= <144124353+seung-in-Yoo@users.noreply.github.com> Date: Thu, 14 Aug 2025 17:40:00 +0900 Subject: [PATCH 01/12] Create README.md --- README.md | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..cea91bb --- /dev/null +++ b/README.md @@ -0,0 +1,184 @@ +# Wayble๐Ÿ™๏ธ + + +**์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ๋งž์ถคํ˜• ๋ฐฐ๋ฆฌ์–ดํ”„๋ฆฌ ์„œ๋น„์Šค Wayble** + +> ๋ชจ๋‘์˜ ํŽธ๋ฆฌํ•œ ์ด๋™์„ ์œ„ํ•œ ๋งž์ถคํ˜• ๊ฒฝ๋กœ ํƒ์ƒ‰ ๋ฐ ์žฅ์†Œ ์ถ”์ฒœ ์„œ๋น„์Šค
+> ์žฅ์•  ์œ ํ˜•๋ณ„ยท์ด๋™ ์ˆ˜๋‹จ๋ณ„ ์ตœ์ ํ™”๋œ ๊ฒฝ๋กœ ์•ˆ๋‚ด์™€ ์ ‘๊ทผ์„ฑ ์ •๋ณด ๊ณต์œ  ํ”Œ๋žซํผ, Wayble์—์„œ ๋งŒ๋‚˜๋ณด์„ธ์š”! +
+ + ์›จ์ด๋ธ”๋ฐœํ‘œ + +### [๐Ÿ› ๏ธWayble ์„œ๋น„์Šค ๋งํฌ ๋ฐ”๋กœ๊ฐ€๊ธฐ](https://wayble.site) +### [๐ŸŽฌWayble ๋…ธ์…˜ ๋งํฌ ๋ฐ”๋กœ๊ฐ€๊ธฐ](https://www.notion.so/wayble-20475cf0b87b806d9473feb579ab23e0) + +### ๐Ÿ“‚ Content +- [๐Ÿ”Ž ํŒ€ ์†Œ๊ฐœ](#ํŒ€-์†Œ๊ฐœ) +- [๐Ÿ”Ž ๊ธฐ์ˆ  ์Šคํƒ](#๊ธฐ์ˆ -์Šคํƒ) +- [๐Ÿ”Ž ์„œ๋น„์Šค ๊ณ ์•ˆ ๋ฐฐ๊ฒฝ](#์„œ๋น„์Šค-๊ณ ์•ˆ-๋ฐฐ๊ฒฝ) +- [๐Ÿ”Ž ์ฃผ์š” ๊ธฐ๋Šฅ](#์ฃผ์š”-๊ธฐ๋Šฅ) +- [๐Ÿ”Ž ์ƒ์„ธ ๊ธฐ๋Šฅ](#์ƒ์„ธ-๊ธฐ๋Šฅ) +- [๐Ÿ”Ž BE ํด๋” ๊ตฌ์กฐ](#BE-ํด๋”-๊ตฌ์กฐ) +- [๐Ÿ”Ž BE ์‹œ์Šคํ…œ ๊ตฌ์„ฑ๋„](#BE-์‹œ์Šคํ…œ-๊ตฌ์„ฑ) +- [๐Ÿ”Ž ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ](#๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค-๊ตฌ์กฐ) +- [๐Ÿ”Ž api ๋ช…์„ธ](#api-๋ช…์„ธ) + + + + + +

+## ๐Ÿ˜Ž ํŒ€ ์†Œ๊ฐœ +> Team +> ๊ธฐ์Šน๋ฏผ ์–‘ํšจ์ธ ์œ ์Šน์ธ ์ด์›์ค€ ์ฃผ์ •๋นˆ + + +| ๊ธฐ์Šน๋ฏผ (Lead) | ์–‘ํšจ์ธ | ์œ ์Šน์ธ | ์ด์›์ค€ | ์ฃผ์ •๋นˆ | +| ---------------------------------------- | ------------------------------------ | -------------------------------------- | ------------------------------------------------ | -------------------------------------- | +| ![profile](https://avatars.githubusercontent.com/u/67568824?v=4) | ![profile](https://avatars.githubusercontent.com/u/144425658?v=4) |![profile](https://avatars.githubusercontent.com/u/144124353?v=4)|![profile](https://avatars.githubusercontent.com/u/202200191?v=4) | ![profile](https://avatars.githubusercontent.com/u/166782961?v=4) +| BE | BE | BE | BE | BE | +| [@KiSeungMin](https://github.com/KiSeungMin) |[@hyoinYang](https://github.com/hyoinYang)|[@seung-in-Yoo](https://github.com/seung-in-Yoo) | [@wonjun-lee-fcwj245](https://github.com/wonjun-lee-fcwj245) |[@zyovn](https://github.com/zyovn) | + +

+ +## ๐Ÿ”Ž ๊ธฐ์ˆ  ์Šคํƒ + +| Category | Stack | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Framework / Runtime | ![Spring Boot](https://img.shields.io/badge/Spring%20Boot-6DB33F?style=for-the-badge&logo=springboot&logoColor=white) ![Java](https://img.shields.io/badge/Java%2017-007396?style=for-the-badge&logo=java&logoColor=white) | +| Programming Language | ![Java](https://img.shields.io/badge/Java%2017-007396?style=for-the-badge&logo=java&logoColor=white) | +| Database / Search | ![Amazon RDS](https://img.shields.io/badge/Amazon%20RDS-527FFF?style=for-the-badge&logo=amazonrds&logoColor=white) ![MySQL](https://img.shields.io/badge/MySQL-4479A1?style=for-the-badge&logo=mysql&logoColor=white) ![Elasticsearch](https://img.shields.io/badge/Elasticsearch-005571?style=for-the-badge&logo=elasticsearch&logoColor=white) | +| Infrastructure | ![AWS EC2](https://img.shields.io/badge/AWS%20EC2-FF9900?style=for-the-badge&logo=amazonec2&logoColor=white) ![AWS S3](https://img.shields.io/badge/AWS%20S3-569A31?style=for-the-badge&logo=amazons3&logoColor=white) ![AWS CloudWatch](https://img.shields.io/badge/AWS%20CloudWatch-FF4F8B?style=for-the-badge&logo=amazoncloudwatch&logoColor=white) ![AWS Route 53](https://img.shields.io/badge/AWS%20Route%2053-232F3E?style=for-the-badge&logo=amazonroute53&logoColor=white) ![Docker](https://img.shields.io/badge/Docker-2496ED?style=for-the-badge&logo=docker&logoColor=white) | +| API / Data | ![T map API](https://img.shields.io/badge/T%20map%20API-FF1515?style=for-the-badge&logo=naver&logoColor=white) ![๊ณต๊ณต๋ฐ์ดํ„ฐํฌํ„ธ](https://img.shields.io/badge/๊ณต๊ณต๋ฐ์ดํ„ฐํฌํ„ธ-005BAC?style=for-the-badge&logoColor=white) | +| Authentication | ![JWT](https://img.shields.io/badge/JWT-000000?style=for-the-badge&logo=jsonwebtokens&logoColor=white) | +| CI/CD | ![GitHub Actions](https://img.shields.io/badge/GitHub%20Actions-2088FF?style=for-the-badge&logo=githubactions&logoColor=white) | +| Version Control | ![Git](https://img.shields.io/badge/Git-F05032?style=for-the-badge&logo=git&logoColor=white) ![GitHub](https://img.shields.io/badge/GitHub-181717?style=for-the-badge&logo=github&logoColor=white) | +
+ + +## ๐Ÿ”† ์„œ๋น„์Šค ๊ณ ์•ˆ ๋ฐฐ๊ฒฝ +### ๐Ÿ“– ํ”„๋กœ์ ํŠธ ๊ฐœ์š” + +WAYBLE์€ ์žฅ์• ์ธยท๊ตํ†ต์•ฝ์ž ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋งž์ถคํ˜• ๊ฒฝ๋กœ ํƒ์ƒ‰, ์ ‘๊ทผ์„ฑ ํ•„ํ„ฐ ๊ธฐ๋ฐ˜ ์žฅ์†Œ ์ถ”์ฒœ, ์ ‘๊ทผ์„ฑ ๋ฆฌ๋ทฐ ๊ณต์œ  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฐ๋ฆฌ์–ดํ”„๋ฆฌ ์ง€๋„ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
+์‚ฌ์šฉ์ž์˜ ์žฅ์•  ์œ ํ˜•๊ณผ ์ด๋™ ์ˆ˜๋‹จ ์„ค์ •์— ๋”ฐ๋ผ ์ตœ์ ํ™”๋œ ๊ฒฝ๋กœ๋ฅผ ์•ˆ๋‚ดํ•˜๊ณ , ๋ˆ„๊ตฌ๋‚˜ ์ ‘๊ทผ์„ฑ ์ •๋ณด๋ฅผ ๋“ฑ๋กยทํ™•์ธํ•˜์—ฌ ๋ชจ๋‘์˜ ์ด๋™๊ถŒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. + +### ๐Ÿšฆ ๊ธฐํš์˜ ์‹œ์ž‘ +์™œ ์žฅ์• ์ธ์€ ์ฃผ๋ณ€์—์„œ ์ž์ฃผ ๋ณด์ด์ง€ ์•Š์„๊นŒ?
+๊ตํ†ต์ˆ˜๋‹จ ์ด์šฉ์˜ ์–ด๋ ค์›€
+์ถฉ๋ถ„ํžˆ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š” ์ƒํ™œ ์ ‘๊ทผ์„ฑ
+๋ถ€์กฑํ•œ ์ด๋™ ํŽธ์˜ ์„œ๋น„์Šค
+์žฅ์• ์ธ ์ธํ„ฐ๋ทฐ์—์„œ ๋‚˜์˜จ ๋ชฉ์†Œ๋ฆฌ
+ +> "๋งค์ผ ๋˜‘๊ฐ™์€ ์‹๋‹น์— ๊ฐ€์š”.", +> "ํ•˜๋ฃจ๊ฐ€ ๊ณ„ํš๋Œ€๋กœ ๋˜์ง€ ์•Š์•„์š”.", +> "์—˜๋ฆฌ๋ฒ ์ดํ„ฐ ์œ„์น˜ ์ •๋ณด๊ฐ€ ๋ถ€์ •ํ™•ํ•ด์„œ ์ด๋™์ด ํž˜๋“ค์–ด์š”." + +๊ธฐ์กด ์ง€๋„ ์„œ๋น„์Šค์—๋Š” ์—˜๋ฆฌ๋ฒ ์ดํ„ฐยท๊ฒฝ์‚ฌ๋กœยท์žฅ์• ์ธ ํ™”์žฅ์‹ค ๋“ฑ ์žฅ์• ์ธ๋“ค์„ ์œ„ํ•œ ํ™•์‹คํ•œ ์ •๋ณด๊ฐ€ ๋ถˆ์ถฉ๋ถ„ํ•˜๊ณ , +์žฅ์•  ์œ ํ˜•๋ณ„ ๊ฒฝ๋กœ ์•ˆ๋‚ด, ์žฅ์• ์ธ๋“ค๋งŒ์˜ ์ ‘๊ทผ์„ฑ ๋ฆฌ๋ทฐ ๊ณต์œ  ๊ธฐ๋Šฅ๋“ฑ ํŽธ์˜์„ฑ์ด ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. + +### ๐Ÿ’ก ์„œ๋น„์Šค ์†Œ๊ฐœ + +**WAYBLE์€** +- ์žฅ์•  ์œ ํ˜•๊ณผ ์ด๋™ ์ˆ˜๋‹จ ์„ค์ •์— ๋”ฐ๋ผ UIยท์•ˆ๋‚ด ์ •๋ณด ์ž๋™ ์ตœ์ ํ™” +- ์ ‘๊ทผ์„ฑ ํ•„ํ„ฐ ๊ธฐ๋ฐ˜ ์žฅ์†Œ ๊ฒ€์ƒ‰ยท์ถ”์ฒœ +- ์žฅ์• ์ธ๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ฐธ์—ฌํ˜• ์ ‘๊ทผ์„ฑ ๋ฆฌ๋ทฐ ๊ณต์œ  +- ์žฅ์• ์ธ์˜ ์ด๋™ ๊ฒฝํ—˜ ๊ฐœ์„  ๋ฐ ๋ง๋ชปํ•˜๋Š” ์‚ฌ์†Œํ•œ ๋ถˆํŽธ ํ•ด์†Œ +๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๋ฐฐ๋ฆฌ์–ดํ”„๋ฆฌ ์ง€๋„ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. + +### ๐ŸŽฏ ์„œ๋น„์Šค ๋ชฉํ‘œ (SERVICE GOALS) + +**์žฅ์•  ์œ ํ˜•ยท์ด๋™ ์ˆ˜๋‹จ๋ณ„ ์ตœ์ ํ™”๋œ ๊ฒฝ๋กœ ํƒ์ƒ‰** + +**์ ‘๊ทผ์„ฑ ํ•„ํ„ฐ ๊ธฐ๋ฐ˜ ์žฅ์†Œ ์ถ”์ฒœ** + +**์žฅ์• ์ธ ์ฐธ์—ฌํ˜• ์ ‘๊ทผ์„ฑ ์ •๋ณด ์ˆ˜์ง‘ยท๊ณต์œ ** + +(์ฑ„์šฐ๊ธฐ) + +

+ +## ๐Ÿ›  ์ฃผ์š” ๊ธฐ๋Šฅ +**1. ์ง€๋„ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๊ฐ€๋Šฅ ์žฅ์†Œ ๊ฒ€์ƒ‰** + +์—˜๋ฆฌ๋ฒ ์ดํ„ฐ, ๊ฒฝ์‚ฌ๋กœ, ์žฅ์• ์ธ ํ™”์žฅ์‹ค ๋“ฑ ์žฅ์• ์ธ๋“ค์ด ํ•„์ˆ˜์ ์œผ๋กœ ์•Œ๊ณ ์‹ถ์–ดํ•˜๋Š” ์ •๋ณด๋“ค๋กœ ์žฅ์†Œ ํ•„ํ„ฐ๋ง +์œ„์น˜ ๊ธฐ๋ฐ˜ ์ถ”์ฒœ + +**2. ๋งž์ถคํ˜• ๊ฒฝ๋กœ ์•ˆ๋‚ด** + +์žฅ์•  ์œ ํ˜•๋ณ„ ๊ฒฝ๋กœ ์ตœ์ ํ™” (ํœ ์ฒด์–ด, ์‹œ๊ฐ์žฅ์• , ์ง€์ ์žฅ์•  ๋“ฑ) + +**3. ์ ‘๊ทผ์„ฑ ๋ฆฌ๋ทฐ ์ž‘์„ฑยท์—ด๋žŒ** + +์ด์šฉ์ž๊ฐ€ ๋‚จ๊ธด ์ ‘๊ทผ์„ฑ ์ค‘์‹ฌ ๋ฆฌ๋ทฐ ํ™•์ธ + +**4. ๋งˆ์ด ํ”Œ๋ ˆ์ด์Šค** + +๋‚˜๋งŒ์˜ ์žฅ์†Œ ์›จ์ด๋ธ”์กด ๋ฆฌ์ŠคํŠธ ์ €์žฅ + +์ €์žฅํ•œ ์žฅ์†Œ๋ณ„ ์›จ์ด๋ธ”์กด ์กฐํšŒ ๋ฐ ์‚ญ์ œ + +(์ฑ„์šฐ๊ธฐ) + +

+ +## ๐Ÿ—ƒ๏ธ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ +๋””๋น„๊ตฌ์กฐ +

+ + +## ๐ŸŒดํด๋” ๊ตฌ์กฐ +``` +wayble-server/ +โ”œโ”€โ”€ java/ +โ”‚ โ””โ”€โ”€ com/ +โ”‚ โ””โ”€โ”€ wayble/ +โ”‚ โ””โ”€โ”€ server/ +โ”‚ โ”œโ”€โ”€ admin/ # ๊ด€๋ฆฌ์ž ๊ด€๋ จ ๊ธฐ๋Šฅ +โ”‚ โ”œโ”€โ”€ auth/ # ์ธ์ฆ ๋ฐ ์ธ๊ฐ€ ๊ด€๋ จ ๊ธฐ๋Šฅ +โ”‚ โ”œโ”€โ”€ aws/ # AWS ์—ฐ๋™ (S3, CloudWatch ๋“ฑ) +โ”‚ โ”œโ”€โ”€ common/ # ๊ณตํ†ต ์œ ํ‹ธ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋“ฑ +โ”‚ โ”œโ”€โ”€ direction/ # ๊ธธ์ฐพ๊ธฐ ๋ฐ ๊ฒฝ๋กœ ์•ˆ๋‚ด +โ”‚ โ”œโ”€โ”€ explore/ # ํƒ์ƒ‰ ๋ฐ ์ถ”์ฒœ ๊ด€๋ จ +โ”‚ โ”œโ”€โ”€ logging/ # ๋กœ๊น… ์„ค์ • +โ”‚ โ”œโ”€โ”€ review/ # ๋ฆฌ๋ทฐ ์ž‘์„ฑ ๋ฐ ์กฐํšŒ +โ”‚ โ”œโ”€โ”€ user/ # ์œ ์ € ๊ด€๋ จ ๊ธฐ๋Šฅ +โ”‚ โ”œโ”€โ”€ wayblezone/ # ์›จ์ด๋ธ”์กด ๊ด€๋ จ ๊ธฐ๋Šฅ +โ”‚ โ””โ”€โ”€ ServerApplication.java +โ”‚ +โ”œโ”€โ”€ resources/ +โ”‚ โ”œโ”€โ”€ data/ # ๋ฐ์ดํ„ฐ ๊ด€๋ จ ๋ฆฌ์†Œ์Šค +โ”‚ โ”œโ”€โ”€ elasticsearch/ # Elasticsearch ๊ด€๋ จ ์„ค์ • +โ”‚ โ”œโ”€โ”€ templates/ # ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ +โ”‚ โ”œโ”€โ”€ application.properties # Spring Boot ํ™˜๊ฒฝ ์„ค์ • +โ”‚ โ”œโ”€โ”€ application_secret.yml # ๋ฏผ๊ฐ ์ •๋ณด ์„ค์ • +โ”‚ โ”œโ”€โ”€ keystore.p12 # HTTPS ์ธ์ฆ์„œ +โ”‚ โ”œโ”€โ”€ logback-spring.xml +โ”‚ โ”œโ”€โ”€ seocho_pedestrian.json # ์„œ์ดˆ๊ตฌ ๋ณดํ–‰์ž ๋ฐ์ดํ„ฐ +โ”‚ โ””โ”€โ”€ wayble_markers.json # ์›จ์ด๋ธ” ๋งˆ์ปค ๋ฐ์ดํ„ฐ +โ”‚ +โ”œโ”€โ”€ test/ # ํ…Œ์ŠคํŠธ ๊ด€๋ จ +โ”‚ +โ”œโ”€โ”€ wrapper/ +โ”œโ”€โ”€ .gitattributes +โ”œโ”€โ”€ .gitignore +โ”œโ”€โ”€ .coderabbit.yml +โ”œโ”€โ”€ application.yml +โ”œโ”€โ”€ build.gradle +โ”œโ”€โ”€ docker-compose.yml +โ”œโ”€โ”€ docker-els.yml +โ”œโ”€โ”€ Dockerfile +โ”œโ”€โ”€ Dockerfile.elasticsearch +โ””โ”€โ”€ gradlew +``` +

+ +## ๐ŸŒ์‹œ์Šคํ…œ ๊ตฌ์„ฑ๋„ +wayble_infra + +

+ +## โ›“๏ธAPI ๋ช…์„ธ + +#### [๐Ÿ› ๏ธWayble ๊ธฐ๋Šฅ๋ช…์„ธ ๋งํฌ](https://www.notion.so/API-21d75cf0b87b80248a0ec55c6134ad20) + +
From bcbd0bc8804d3db886103a857185d7eaac74e463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=8A=B9=EC=9D=B8?= <144124353+seung-in-Yoo@users.noreply.github.com> Date: Thu, 14 Aug 2025 17:47:42 +0900 Subject: [PATCH 02/12] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cea91bb..45c5d3d 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ WAYBLE์€ ์žฅ์• ์ธยท๊ตํ†ต์•ฝ์ž ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋งž์ถคํ˜• ๊ฒฝ๋กœ ํƒ์ƒ‰, - ์žฅ์• ์ธ์˜ ์ด๋™ ๊ฒฝํ—˜ ๊ฐœ์„  ๋ฐ ๋ง๋ชปํ•˜๋Š” ์‚ฌ์†Œํ•œ ๋ถˆํŽธ ํ•ด์†Œ ๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๋ฐฐ๋ฆฌ์–ดํ”„๋ฆฌ ์ง€๋„ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. -### ๐ŸŽฏ ์„œ๋น„์Šค ๋ชฉํ‘œ (SERVICE GOALS) +### ๐ŸŽฏ ์„œ๋น„์Šค ๋ชฉํ‘œ **์žฅ์•  ์œ ํ˜•ยท์ด๋™ ์ˆ˜๋‹จ๋ณ„ ์ตœ์ ํ™”๋œ ๊ฒฝ๋กœ ํƒ์ƒ‰** From 54c4e8f333f5bc3b69688c5ab887b0e1d2ca77e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=8A=B9=EC=9D=B8?= <144124353+seung-in-Yoo@users.noreply.github.com> Date: Thu, 14 Aug 2025 18:19:22 +0900 Subject: [PATCH 03/12] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 45c5d3d..6b18881 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,8 @@ WAYBLE์€ ์žฅ์• ์ธยท๊ตํ†ต์•ฝ์ž ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋งž์ถคํ˜• ๊ฒฝ๋กœ ํƒ์ƒ‰,

## ๐Ÿ—ƒ๏ธ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ -๋””๋น„๊ตฌ์กฐ +์›จ์ด๋ธ”erd +

From 9b7aa4ce83fbb78553d3d64d1124881d9c8c87a6 Mon Sep 17 00:00:00 2001 From: hyoin <144425658+hyoinYang@users.noreply.github.com> Date: Fri, 15 Aug 2025 00:13:08 +0900 Subject: [PATCH 04/12] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6b18881..89c4ef7 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,8 @@ WAYBLE์€ ์žฅ์• ์ธยท๊ตํ†ต์•ฝ์ž ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋งž์ถคํ˜• ๊ฒฝ๋กœ ํƒ์ƒ‰, ์žฅ์•  ์œ ํ˜•๋ณ„ ๊ฒฝ๋กœ ์ตœ์ ํ™” (ํœ ์ฒด์–ด, ์‹œ๊ฐ์žฅ์• , ์ง€์ ์žฅ์•  ๋“ฑ) +๋Œ€์ค‘๊ตํ†ต ๊ฒฝ๋กœ์—์„  ์žฅ์• ์ธ๋“ค์—๊ฒŒ ํ•„์š”ํ•œ ์ •๋ณด(์ง€ํ•˜์ฒ ์—ญ-์—˜๋ฆฌ๋ฒ ์ดํ„ฐ ์œ„์น˜ ๋“ฑ, ๋ฒ„์Šค-์ €์ƒ๋ฒ„์Šค ์—ฌ๋ถ€ ๋“ฑ) ์ œ๊ณต + **3. ์ ‘๊ทผ์„ฑ ๋ฆฌ๋ทฐ ์ž‘์„ฑยท์—ด๋žŒ** ์ด์šฉ์ž๊ฐ€ ๋‚จ๊ธด ์ ‘๊ทผ์„ฑ ์ค‘์‹ฌ ๋ฆฌ๋ทฐ ํ™•์ธ From 698c471f0e21e1a6093ec9b60f4271eb5f8b3c33 Mon Sep 17 00:00:00 2001 From: Jeongbin Joo <166782961+zyovn@users.noreply.github.com> Date: Fri, 15 Aug 2025 03:47:03 +0900 Subject: [PATCH 05/12] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 89c4ef7..8c7753a 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,8 @@ WAYBLE์€ ์žฅ์• ์ธยท๊ตํ†ต์•ฝ์ž ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋งž์ถคํ˜• ๊ฒฝ๋กœ ํƒ์ƒ‰, ์žฅ์•  ์œ ํ˜•๋ณ„ ๊ฒฝ๋กœ ์ตœ์ ํ™” (ํœ ์ฒด์–ด, ์‹œ๊ฐ์žฅ์• , ์ง€์ ์žฅ์•  ๋“ฑ) +์›จ์ด๋ธ” ๋งˆ์ปค (๊ฒฝ์‚ฌ๋กœ, ํœ ์ฒด์–ด ์ถฉ์ „๊ธฐ ๋“ฑ)์„ ํ™œ์šฉํ•˜์—ฌ ์ปค์Šคํ…€ ์ถ”์ฒœ ๊ฒฝ๋กœ ์ œ๊ณต + ๋Œ€์ค‘๊ตํ†ต ๊ฒฝ๋กœ์—์„  ์žฅ์• ์ธ๋“ค์—๊ฒŒ ํ•„์š”ํ•œ ์ •๋ณด(์ง€ํ•˜์ฒ ์—ญ-์—˜๋ฆฌ๋ฒ ์ดํ„ฐ ์œ„์น˜ ๋“ฑ, ๋ฒ„์Šค-์ €์ƒ๋ฒ„์Šค ์—ฌ๋ถ€ ๋“ฑ) ์ œ๊ณต **3. ์ ‘๊ทผ์„ฑ ๋ฆฌ๋ทฐ ์ž‘์„ฑยท์—ด๋žŒ** From f297e27c40e7e2d2419f3f3f27bc82ceb97e40d7 Mon Sep 17 00:00:00 2001 From: hyoin <144425658+hyoinYang@users.noreply.github.com> Date: Fri, 15 Aug 2025 13:04:52 +0900 Subject: [PATCH 06/12] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit erdย ์ด๋ฏธ์ง€ ์ˆ˜์ • --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8c7753a..81f83b4 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,8 @@ WAYBLE์€ ์žฅ์• ์ธยท๊ตํ†ต์•ฝ์ž ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋งž์ถคํ˜• ๊ฒฝ๋กœ ํƒ์ƒ‰,

## ๐Ÿ—ƒ๏ธ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ -์›จ์ด๋ธ”erd +image +

From d6801b13f2734f76e8dff8dc613df341469dfb6f Mon Sep 17 00:00:00 2001 From: hyoin Date: Fri, 15 Aug 2025 18:25:49 +0900 Subject: [PATCH 07/12] =?UTF-8?q?[fix]=20kric=20api=20=EC=9D=91=EB=8B=B5?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wayble/server/common/config/WebClientConfig.java | 1 + .../external/kric/dto/KricToiletRawBody.java | 7 ------- .../external/kric/dto/KricToiletRawItem.java | 11 ++++++++++- .../external/kric/dto/KricToiletRawResponse.java | 2 +- 4 files changed, 12 insertions(+), 9 deletions(-) delete mode 100644 src/main/java/com/wayble/server/direction/external/kric/dto/KricToiletRawBody.java diff --git a/src/main/java/com/wayble/server/common/config/WebClientConfig.java b/src/main/java/com/wayble/server/common/config/WebClientConfig.java index 8a8d438..e9d45cf 100644 --- a/src/main/java/com/wayble/server/common/config/WebClientConfig.java +++ b/src/main/java/com/wayble/server/common/config/WebClientConfig.java @@ -31,6 +31,7 @@ public WebClient tMapWebClient() { public WebClient kricWebClient() { return WebClient.builder() .baseUrl(kricProperties.baseUrl()) + .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(2 * 1024 * 1024)) .build(); } } diff --git a/src/main/java/com/wayble/server/direction/external/kric/dto/KricToiletRawBody.java b/src/main/java/com/wayble/server/direction/external/kric/dto/KricToiletRawBody.java deleted file mode 100644 index 3af1db3..0000000 --- a/src/main/java/com/wayble/server/direction/external/kric/dto/KricToiletRawBody.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.wayble.server.direction.external.kric.dto; - -import java.util.List; - -public record KricToiletRawBody( - List item -) {} diff --git a/src/main/java/com/wayble/server/direction/external/kric/dto/KricToiletRawItem.java b/src/main/java/com/wayble/server/direction/external/kric/dto/KricToiletRawItem.java index ddd6f91..43d676d 100644 --- a/src/main/java/com/wayble/server/direction/external/kric/dto/KricToiletRawItem.java +++ b/src/main/java/com/wayble/server/direction/external/kric/dto/KricToiletRawItem.java @@ -3,6 +3,15 @@ import lombok.Getter; public record KricToiletRawItem( + String railOprIsttCd, + String lnCd, String stinCd, - String toltNum + String grndDvNm, + String stinFlor, + String gateInotDvNm, + String exitNo, + String dtlLoc, + String mlFmlDvNm, + String toltNum, + String diapExchNum ) {} diff --git a/src/main/java/com/wayble/server/direction/external/kric/dto/KricToiletRawResponse.java b/src/main/java/com/wayble/server/direction/external/kric/dto/KricToiletRawResponse.java index b0b3faa..26ecde7 100644 --- a/src/main/java/com/wayble/server/direction/external/kric/dto/KricToiletRawResponse.java +++ b/src/main/java/com/wayble/server/direction/external/kric/dto/KricToiletRawResponse.java @@ -3,5 +3,5 @@ import java.util.List; public record KricToiletRawResponse( - KricToiletRawBody body + List body ) {} \ No newline at end of file From 3bf982ffd82a707bdc25f4fbcd6c5b5c6f9b6ad9 Mon Sep 17 00:00:00 2001 From: hyoin Date: Fri, 15 Aug 2025 18:31:29 +0900 Subject: [PATCH 08/12] =?UTF-8?q?[fix]=20=ED=9C=A0=EC=B2=B4=EC=96=B4=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EC=A2=8C=ED=91=9C=20=EB=A7=90?= =?UTF-8?q?=EA=B3=A0=20string=20=ED=98=95=EC=8B=9D=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/TransportationResponseDto.java | 8 +- .../entity/transportation/Facility.java | 1 - .../entity/transportation/Route.java | 6 + .../entity/transportation/Wheelchair.java | 24 ++++ .../repository/FacilityRepository.java | 7 +- .../repository/WheelchairInfoRepository.java | 15 +++ .../direction/service/FacilityService.java | 103 ++++++++++-------- .../service/TransportationService.java | 15 ++- 8 files changed, 126 insertions(+), 53 deletions(-) create mode 100644 src/main/java/com/wayble/server/direction/entity/transportation/Wheelchair.java create mode 100644 src/main/java/com/wayble/server/direction/repository/WheelchairInfoRepository.java diff --git a/src/main/java/com/wayble/server/direction/dto/response/TransportationResponseDto.java b/src/main/java/com/wayble/server/direction/dto/response/TransportationResponseDto.java index 1cb9c64..aae1bd7 100644 --- a/src/main/java/com/wayble/server/direction/dto/response/TransportationResponseDto.java +++ b/src/main/java/com/wayble/server/direction/dto/response/TransportationResponseDto.java @@ -43,8 +43,8 @@ public record BusInfo( ){} public record SubwayInfo( - List wheelchair, - List elevator, + List wheelchair, + List elevator, Boolean accessibleRestroom ) {} @@ -55,8 +55,8 @@ public record LocationInfo( // ์ง€ํ•˜์ฒ  ์‹œ์„ค ์ •๋ณด ๋ฌถ์Œ (์„œ๋น„์Šค ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ) public record NodeInfo( - List wheelchair, - List elevator, + List wheelchair, + List elevator, Boolean accessibleRestroom ) {} } diff --git a/src/main/java/com/wayble/server/direction/entity/transportation/Facility.java b/src/main/java/com/wayble/server/direction/entity/transportation/Facility.java index c4e62da..88e58c2 100644 --- a/src/main/java/com/wayble/server/direction/entity/transportation/Facility.java +++ b/src/main/java/com/wayble/server/direction/entity/transportation/Facility.java @@ -16,7 +16,6 @@ @Table(name = "facility") public class Facility { @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name="stationName") diff --git a/src/main/java/com/wayble/server/direction/entity/transportation/Route.java b/src/main/java/com/wayble/server/direction/entity/transportation/Route.java index 38caac8..d35c171 100644 --- a/src/main/java/com/wayble/server/direction/entity/transportation/Route.java +++ b/src/main/java/com/wayble/server/direction/entity/transportation/Route.java @@ -6,6 +6,8 @@ import jakarta.persistence.*; import lombok.*; +import java.util.List; + @Entity @Getter @Builder(access = AccessLevel.PRIVATE) @@ -33,4 +35,8 @@ public class Route { @ManyToOne @JoinColumn(name = "end_node_id") private Node endNode; + + // ํœ ์ฒด์–ด ์ •๋ณด + @OneToMany(mappedBy = "route", fetch = FetchType.LAZY) + private List wheelchairs; } diff --git a/src/main/java/com/wayble/server/direction/entity/transportation/Wheelchair.java b/src/main/java/com/wayble/server/direction/entity/transportation/Wheelchair.java new file mode 100644 index 0000000..0a21f44 --- /dev/null +++ b/src/main/java/com/wayble/server/direction/entity/transportation/Wheelchair.java @@ -0,0 +1,24 @@ +package com.wayble.server.direction.entity.transportation; + +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter +@Builder +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "wheelchair") +public class Wheelchair { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "route_id", nullable = false) + private Route route; + + @Column(name = "wheelchair_location", nullable = false) + private String wheelchairLocation; // 1-4 ๋“ฑ + +} diff --git a/src/main/java/com/wayble/server/direction/repository/FacilityRepository.java b/src/main/java/com/wayble/server/direction/repository/FacilityRepository.java index 7fe4a12..d8a12c9 100644 --- a/src/main/java/com/wayble/server/direction/repository/FacilityRepository.java +++ b/src/main/java/com/wayble/server/direction/repository/FacilityRepository.java @@ -6,7 +6,12 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; public interface FacilityRepository extends JpaRepository { - Optional findByNodeId(Long nodeId); + @Query("SELECT f FROM Facility f " + + "LEFT JOIN FETCH f.lifts " + + "WHERE f.id = :nodeId") + Optional findByNodeId(@Param("nodeId") Long nodeId); } diff --git a/src/main/java/com/wayble/server/direction/repository/WheelchairInfoRepository.java b/src/main/java/com/wayble/server/direction/repository/WheelchairInfoRepository.java new file mode 100644 index 0000000..007fd89 --- /dev/null +++ b/src/main/java/com/wayble/server/direction/repository/WheelchairInfoRepository.java @@ -0,0 +1,15 @@ +package com.wayble.server.direction.repository; + +import com.wayble.server.direction.entity.transportation.Wheelchair; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; +import java.util.Optional; + +public interface WheelchairInfoRepository extends JpaRepository { + + @Query("SELECT w FROM Wheelchair w WHERE w.route.routeId = :routeId") + List findByRouteId(@Param("routeId") Long routeId); +} diff --git a/src/main/java/com/wayble/server/direction/service/FacilityService.java b/src/main/java/com/wayble/server/direction/service/FacilityService.java index fbd4450..41bd515 100644 --- a/src/main/java/com/wayble/server/direction/service/FacilityService.java +++ b/src/main/java/com/wayble/server/direction/service/FacilityService.java @@ -2,9 +2,13 @@ import com.wayble.server.direction.dto.response.TransportationResponseDto; import com.wayble.server.direction.entity.transportation.Facility; +import com.wayble.server.direction.entity.transportation.Node; +import com.wayble.server.direction.entity.transportation.Wheelchair; import com.wayble.server.direction.external.kric.dto.KricToiletRawItem; import com.wayble.server.direction.external.kric.dto.KricToiletRawResponse; import com.wayble.server.direction.repository.FacilityRepository; +import com.wayble.server.direction.repository.NodeRepository; +import com.wayble.server.direction.repository.WheelchairInfoRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -17,7 +21,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; +import java.util.Optional; @Service @@ -25,38 +29,44 @@ @RequiredArgsConstructor public class FacilityService { private final FacilityRepository facilityRepository; + private final NodeRepository nodeRepository; + private final WheelchairInfoRepository wheelchairInfoRepository; private final WebClient kricWebClient; private final KricProperties kricProperties; - public TransportationResponseDto.NodeInfo getNodeInfo(Long nodeId){ - Facility facility = facilityRepository.findByNodeId(nodeId).orElse(null); - List wheelchair = new ArrayList<>(); - List elevator = new ArrayList<>(); + public TransportationResponseDto.NodeInfo getNodeInfo(Long nodeId, Long routeId) { + List wheelchair = new ArrayList<>(); + List elevator = new ArrayList<>(); Boolean accessibleRestroom = false; - if (facility != null) { - if (facility.getLifts() != null) { - wheelchair = facility.getLifts().stream() - .map(lift -> new TransportationResponseDto.LocationInfo( - lift.getLatitude(), - lift.getLongitude() - )) - .toList(); + Optional nodeOpt = nodeRepository.findById(nodeId); + + if (nodeOpt.isPresent()) { + Node node = nodeOpt.get(); + + if (routeId != null) { + List wheelchairs = wheelchairInfoRepository.findByRouteId(routeId); + for (Wheelchair wheelchairInfo : wheelchairs) { + String location = wheelchairInfo.getWheelchairLocation(); + if (location != null && !location.trim().isEmpty()) { + wheelchair.add(location.trim()); + } + } } - - if (facility.getElevators() != null) { - elevator = facility.getElevators().stream() - .map(elev -> new TransportationResponseDto.LocationInfo( - elev.getLatitude(), - elev.getLongitude() - )) - .toList(); + + elevator = new ArrayList<>(); + + Facility facility = facilityRepository.findByNodeId(nodeId).orElse(null); + if (facility != null) { + String stinCd = facility.getStinCd(); + String railOprLsttCd = facility.getRailOprLsttCd(); + String lnCd = facility.getLnCd(); + + if (stinCd != null && railOprLsttCd != null && lnCd != null) { + Map toiletInfo = getToiletInfo(facility); + accessibleRestroom = toiletInfo.getOrDefault(stinCd, false); + } } - - // Get toilet information - Map toiletInfo = getToiletInfo(facility); - String stinCd = facility.getStinCd(); - accessibleRestroom = toiletInfo.getOrDefault(stinCd, false); } return new TransportationResponseDto.NodeInfo( @@ -66,11 +76,13 @@ public TransportationResponseDto.NodeInfo getNodeInfo(Long nodeId){ ); } - private Map getToiletInfo(Facility facility){ - String uri = UriComponentsBuilder.fromPath("/api/vulnerableUserInfo/stationDisabledToilet") + + + private Map getToiletInfo(Facility facility) { + String uri = UriComponentsBuilder.fromPath("/openapi/vulnerableUserInfo/stationDisabledToilet") .queryParam("serviceKey", kricProperties.key()) .queryParam("format", "json") - .queryParam("railOprLsttCd", facility.getRailOprLsttCd()) + .queryParam("railOprIsttCd", facility.getRailOprLsttCd()) .queryParam("lnCd", facility.getLnCd()) .queryParam("stinCd", facility.getStinCd()) .toUriString(); @@ -83,25 +95,30 @@ private Map getToiletInfo(Facility facility){ .retrieve() .bodyToMono(KricToiletRawResponse.class) .block(); - - items = response.body().item(); - - } catch(Exception e){ - log.info("์—ญ์‚ฌ ํ™”์žฅ์‹ค api ํ˜ธ์ถœ ์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ: {}: {}", uri, e.getCause()); + + if (response == null || response.body() == null) { + return new HashMap<>(); + } + + items = response.body(); + } catch(Exception e) { + log.error("KRIC API ํ˜ธ์ถœ ์‹คํŒจ: {}", e.getMessage()); return new HashMap<>(); } - // ์—ญ๋ณ„๋กœ ํ™”์žฅ์‹ค ์กด์žฌ ์—ฌ๋ถ€ ์ถ”์ถœ (์ค‘๋ณต ์ œ๊ฑฐ) Map stationToiletMap = new HashMap<>(); - for (KricToiletRawItem item : items) { - String stinCd = item.stinCd(); - int toiletCount = 0; - try { - toiletCount = Integer.parseInt(item.toltNum()); - } catch (NumberFormatException e) { - log.warn("์ง€ํ•˜์ฒ  ์—ญ ํ† ์ด๋ › ๊ฐœ์ˆ˜ ํŒŒ์‹ฑ ์‹คํŒจ. ์ง€ํ•˜์ฒ ์—ญ ๋ฒˆํ˜ธ {}: {}", stinCd, item.toltNum(), e); + if (items != null) { + for (KricToiletRawItem item : items) { + String stinCd = item.stinCd(); + int toiletCount = 0; + try { + toiletCount = Integer.parseInt(item.toltNum()); + } catch (NumberFormatException e) { + log.warn("์žฅ์• ์ธ ํ™”์žฅ์‹ค ์ •๋ณด ํŒŒ์‹ฑ ์‹คํŒจ. stinCd: {}, toltNum: {}", stinCd, item.toltNum()); + } + boolean hasToilet = stationToiletMap.getOrDefault(stinCd, false) || toiletCount > 0; + stationToiletMap.put(stinCd, hasToilet); } - stationToiletMap.put(stinCd, stationToiletMap.getOrDefault(stinCd, false) || toiletCount > 0); } return stationToiletMap; diff --git a/src/main/java/com/wayble/server/direction/service/TransportationService.java b/src/main/java/com/wayble/server/direction/service/TransportationService.java index 50e4759..bf7dc76 100644 --- a/src/main/java/com/wayble/server/direction/service/TransportationService.java +++ b/src/main/java/com/wayble/server/direction/service/TransportationService.java @@ -623,20 +623,27 @@ private List mergeConsecutiveRoutes(List p } } } catch (Exception e) { - log.info("๋ฒ„์Šค ์ •๋ณด ์กฐํšŒ ์‹คํŒจ: {}", e.getMessage()); - } + log.error("๋ฒ„์Šค ์ •๋ณด ์กฐํšŒ ์‹คํŒจ: {}", e.getMessage()); + } } else if (currentType == DirectionType.SUBWAY) { try { if (currentEdge.getStartNode() != null) { - TransportationResponseDto.NodeInfo nodeInfo = facilityService.getNodeInfo(currentEdge.getStartNode().getId()); + TransportationResponseDto.NodeInfo nodeInfo = facilityService.getNodeInfo(currentEdge.getStartNode().getId(), currentEdge.getRoute().getRouteId()); + subwayInfo = new TransportationResponseDto.SubwayInfo( nodeInfo.wheelchair(), nodeInfo.elevator(), nodeInfo.accessibleRestroom() ); + } else { + subwayInfo = new TransportationResponseDto.SubwayInfo( + new ArrayList<>(), + new ArrayList<>(), + false + ); } } catch (Exception e) { - log.info("์ง€ํ•˜์ฒ  ์ •๋ณด ์กฐํšŒ ์‹คํŒจ: {}", e.getMessage()); + log.error("์ง€ํ•˜์ฒ  ์ •๋ณด ์กฐํšŒ ์‹คํŒจ: {}", e.getMessage()); subwayInfo = new TransportationResponseDto.SubwayInfo( new ArrayList<>(), new ArrayList<>(), From f5374385b592ad7b5fe88c66c9ebac9b574945f3 Mon Sep 17 00:00:00 2001 From: hyoin Date: Fri, 15 Aug 2025 21:54:01 +0900 Subject: [PATCH 09/12] =?UTF-8?q?[fix]=20=ED=99=98=EC=8A=B9=20=ED=9A=9F?= =?UTF-8?q?=EC=88=98=20=EB=B3=80=EA=B2=BD,=20=ED=99=98=EC=8A=B9=20?= =?UTF-8?q?=EC=B9=B4=EC=9A=B4=ED=8A=B8=20=EB=A1=9C=EC=A7=81=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 --- .../service/TransportationService.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/wayble/server/direction/service/TransportationService.java b/src/main/java/com/wayble/server/direction/service/TransportationService.java index bf7dc76..802ce0f 100644 --- a/src/main/java/com/wayble/server/direction/service/TransportationService.java +++ b/src/main/java/com/wayble/server/direction/service/TransportationService.java @@ -287,9 +287,9 @@ private List> filterAndSortRoutes(List>comparingInt(this::calculateTransferCount) @@ -723,18 +723,22 @@ private Node findNearestNode(List nodes, double lat, double lon) { private int calculateTransferCount(List steps) { int transferCount = 0; - for (int i = 0; i < steps.size() - 1; i++) { - TransportationResponseDto.Step currentStep = steps.get(i); - TransportationResponseDto.Step nextStep = steps.get(i + 1); - - if (currentStep.mode() != DirectionType.WALK && nextStep.mode() != DirectionType.WALK) { - if (currentStep.mode() == nextStep.mode() && - currentStep.routeName() != null && nextStep.routeName() != null && - !currentStep.routeName().equals(nextStep.routeName())) { - transferCount++; - } else if (currentStep.mode() != nextStep.mode()) { - transferCount++; + DirectionType previousMode = null; + String previousRouteName = null; + + for (TransportationResponseDto.Step step : steps) { + if (step.mode() != DirectionType.WALK && step.mode() != DirectionType.FROM_WAYPOINT && step.mode() != DirectionType.TO_WAYPOINT) { + if (previousMode != null) { + if (previousMode == step.mode() && + previousRouteName != null && step.routeName() != null && + !previousRouteName.equals(step.routeName())) { + transferCount++; + } else if (previousMode != step.mode()) { + transferCount++; + } } + previousMode = step.mode(); + previousRouteName = step.routeName(); } } return transferCount; From efb41065b3c44dce97d02470db60789627d7a598 Mon Sep 17 00:00:00 2001 From: hyoin Date: Fri, 15 Aug 2025 21:55:22 +0900 Subject: [PATCH 10/12] =?UTF-8?q?[refactor]=20api=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EB=A1=9C=EA=B9=85=EC=9D=84=20=EC=9E=90=EC=84=B8=ED=95=98?= =?UTF-8?q?=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/direction/service/FacilityService.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/wayble/server/direction/service/FacilityService.java b/src/main/java/com/wayble/server/direction/service/FacilityService.java index 41bd515..25f9f00 100644 --- a/src/main/java/com/wayble/server/direction/service/FacilityService.java +++ b/src/main/java/com/wayble/server/direction/service/FacilityService.java @@ -65,7 +65,12 @@ public TransportationResponseDto.NodeInfo getNodeInfo(Long nodeId, Long routeId) if (stinCd != null && railOprLsttCd != null && lnCd != null) { Map toiletInfo = getToiletInfo(facility); accessibleRestroom = toiletInfo.getOrDefault(stinCd, false); + } else { + log.error("Facility ์ •๋ณด ๋ˆ„๋ฝ - nodeId: {}, stinCd: {}, railOprLsttCd: {}, lnCd: {}", + nodeId, stinCd, railOprLsttCd, lnCd); } + } else { + log.error("Facility ์ •๋ณด ์—†์Œ - nodeId: {}", nodeId); } } @@ -101,8 +106,12 @@ private Map getToiletInfo(Facility facility) { } items = response.body(); + if (items == null) { + return new HashMap<>(); + } } catch(Exception e) { - log.error("KRIC API ํ˜ธ์ถœ ์‹คํŒจ: {}", e.getMessage()); + log.error("KRIC API ํ˜ธ์ถœ ์‹คํŒจ - stinCd: {}, railOprIsttCd: {}, lnCd: {}, error: {}", + facility.getStinCd(), facility.getRailOprLsttCd(), facility.getLnCd(), e.getMessage(), e); return new HashMap<>(); } From 8553ffa3a77cc9205f45395f29c6fbae60c57ba7 Mon Sep 17 00:00:00 2001 From: hyoin Date: Fri, 15 Aug 2025 21:55:56 +0900 Subject: [PATCH 11/12] =?UTF-8?q?[fix]=20kric=20api=EC=97=90=20=ED=83=80?= =?UTF-8?q?=EC=9E=84=EC=95=84=EC=9B=83=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/wayble/server/common/config/WebClientConfig.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/wayble/server/common/config/WebClientConfig.java b/src/main/java/com/wayble/server/common/config/WebClientConfig.java index e9d45cf..acbbf29 100644 --- a/src/main/java/com/wayble/server/common/config/WebClientConfig.java +++ b/src/main/java/com/wayble/server/common/config/WebClientConfig.java @@ -32,6 +32,10 @@ public WebClient kricWebClient() { return WebClient.builder() .baseUrl(kricProperties.baseUrl()) .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(2 * 1024 * 1024)) + .filter((request, next) -> next.exchange(request) + .timeout(java.time.Duration.ofSeconds(15)) + .retryWhen(reactor.util.retry.Retry.backoff(3, java.time.Duration.ofSeconds(1)) + .filter(throwable -> throwable instanceof org.springframework.web.reactive.function.client.WebClientRequestException))) .build(); } } From 11774c5899fbe6564ae45f84182cba1487e3d49d Mon Sep 17 00:00:00 2001 From: hyoin Date: Fri, 15 Aug 2025 23:50:58 +0900 Subject: [PATCH 12/12] =?UTF-8?q?[fix]=20moveInfo=EC=97=90=20=EB=8F=84?= =?UTF-8?q?=EB=B3=B4=20=EC=9D=B4=EB=8F=99=20=EA=B1=B0=EB=A6=AC=20=EB=B0=98?= =?UTF-8?q?=EC=98=81,=20=ED=99=98=EC=8A=B9=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/TransportationResponseDto.java | 2 +- .../service/TransportationService.java | 20 +++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/wayble/server/direction/dto/response/TransportationResponseDto.java b/src/main/java/com/wayble/server/direction/dto/response/TransportationResponseDto.java index aae1bd7..9ade2ec 100644 --- a/src/main/java/com/wayble/server/direction/dto/response/TransportationResponseDto.java +++ b/src/main/java/com/wayble/server/direction/dto/response/TransportationResponseDto.java @@ -20,7 +20,7 @@ public record Step( DirectionType mode, // ์˜ˆ: START, WALK, SUBWAY, BUS, FINISH @Nullable List moveInfo, // ๊ฐ™์€ Step์œผ๋กœ ์ด๋™ํ•œ ์ •๋ฅ˜์žฅ(Node) ์ •๋ณด (์ค‘๊ฐ„ ์ •๋ฅ˜์žฅ๋งŒ) @Nullable String routeName, - Integer moveNumber, // ๊ฐ™์€ Step(route)๋กœ ์ด๋™ํ•œ ํšŸ์ˆ˜ + Integer moveNumber, // ๊ฐ™์€ Step(route)๋กœ ์ด๋™ํ•œ ํšŸ์ˆ˜ ๋˜๋Š” WALK step์˜ ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ(๋ฏธํ„ฐ ๋‹จ์œ„) @Nullable BusInfo busInfo, // ๋ฒ„์Šค์ผ ๊ฒฝ์šฐ์—๋งŒ ์ƒ์„ฑ, ์ด์™ธ์˜ ๊ฒฝ์šฐ null @Nullable SubwayInfo subwayInfo, // ์ง€ํ•˜์ฒ ์ผ ๊ฒฝ์šฐ์—๋งŒ ์ƒ์„ฑ, ์ด์™ธ์˜ ๊ฒฝ์šฐ null String from, diff --git a/src/main/java/com/wayble/server/direction/service/TransportationService.java b/src/main/java/com/wayble/server/direction/service/TransportationService.java index 802ce0f..ecb9a88 100644 --- a/src/main/java/com/wayble/server/direction/service/TransportationService.java +++ b/src/main/java/com/wayble/server/direction/service/TransportationService.java @@ -277,7 +277,7 @@ private boolean areRoutesIdentical(List route1, } private List> filterAndSortRoutes(List> routes) { - return routes.stream() + return routes.stream() .filter(route -> { // ๋Œ€์ค‘๊ตํ†ต ํฌํ•จ ์—ฌ๋ถ€ ํ™•์ธ boolean hasPublicTransport = route.stream() @@ -590,8 +590,20 @@ private List mergeConsecutiveRoutes(List p String toName = getNodeName(pathEdges.get(j - 1).getEndNode()); if (currentType == DirectionType.WALK) { + int walkDistance = 0; // ๋ฏธํ„ฐ ๋‹จ์œ„ + Node walkStartNode = pathEdges.get(i).getStartNode(); + Node walkEndNode = pathEdges.get(j - 1).getEndNode(); + + if (walkStartNode != null && walkEndNode != null) { + double distanceKm = haversine( + walkStartNode.getLatitude(), walkStartNode.getLongitude(), + walkEndNode.getLatitude(), walkEndNode.getLongitude() + ); + walkDistance = (int) (distanceKm * 1000); // km๋ฅผ m๋กœ ๋ณ€ํ™˜ + } + mergedSteps.add(new TransportationResponseDto.Step( - DirectionType.WALK, null, null, 0, null, null, fromName, toName + DirectionType.WALK, null, null, walkDistance, null, null, fromName, toName )); i = j; continue; @@ -733,6 +745,10 @@ private int calculateTransferCount(List steps) { previousRouteName != null && step.routeName() != null && !previousRouteName.equals(step.routeName())) { transferCount++; + } else if (previousMode == step.mode() && + previousRouteName != null && step.routeName() != null && + previousRouteName.equals(step.routeName())) { + transferCount++; } else if (previousMode != step.mode()) { transferCount++; }