Skip to content

Commit cfbf03f

Browse files
authored
Merge pull request #151 from Wayble-Project/feature/hyoin
[FIX] kric api의 안정성 강화, 환승 횟수 로직 정교화 및 횟수 제한 강화
2 parents 1ccdb70 + b7085b4 commit cfbf03f

File tree

13 files changed

+377
-78
lines changed

13 files changed

+377
-78
lines changed

README.md

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
# Wayble🏙️
2+
3+
4+
**사용자를 위한 맞춤형 배리어프리 서비스 Wayble**
5+
6+
> 모두의 편리한 이동을 위한 맞춤형 경로 탐색 및 장소 추천 서비스 <br>
7+
> 장애 유형별·이동 수단별 최적화된 경로 안내와 접근성 정보 공유 플랫폼, Wayble에서 만나보세요!
8+
<br>
9+
10+
<img width="731" height="508" alt="웨이블발표" src="https://github.com/user-attachments/assets/567f7e5c-ea57-41aa-8988-fa64cbed6fd2" />
11+
12+
### [🛠️Wayble 서비스 링크 바로가기](https://wayble.site)
13+
### [🎬Wayble 노션 링크 바로가기](https://www.notion.so/wayble-20475cf0b87b806d9473feb579ab23e0)
14+
15+
### 📂 Content
16+
- [🔎 팀 소개](#팀-소개)
17+
- [🔎 기술 스택](#기술-스택)
18+
- [🔎 서비스 고안 배경](#서비스-고안-배경)
19+
- [🔎 주요 기능](#주요-기능)
20+
- [🔎 상세 기능](#상세-기능)
21+
- [🔎 BE 폴더 구조](#BE-폴더-구조)
22+
- [🔎 BE 시스템 구성도](#BE-시스템-구성)
23+
- [🔎 데이터베이스 구조](#데이터베이스-구조)
24+
- [🔎 api 명세](#api-명세)
25+
26+
27+
28+
29+
30+
<br><br>
31+
## 😎 팀 소개
32+
> Team
33+
> 기승민 양효인 유승인 이원준 주정빈
34+
35+
36+
| 기승민 (Lead) | 양효인 | 유승인 | 이원준 | 주정빈 |
37+
| ---------------------------------------- | ------------------------------------ | -------------------------------------- | ------------------------------------------------ | -------------------------------------- |
38+
| ![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)
39+
| BE | BE | BE | BE | BE |
40+
| [@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) |
41+
42+
<br><br>
43+
44+
## 🔎 기술 스택
45+
46+
| Category | Stack |
47+
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
48+
| 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) |
49+
| Programming Language | ![Java](https://img.shields.io/badge/Java%2017-007396?style=for-the-badge&logo=java&logoColor=white) |
50+
| 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) |
51+
| 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) |
52+
| 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) |
53+
| Authentication | ![JWT](https://img.shields.io/badge/JWT-000000?style=for-the-badge&logo=jsonwebtokens&logoColor=white) |
54+
| CI/CD | ![GitHub Actions](https://img.shields.io/badge/GitHub%20Actions-2088FF?style=for-the-badge&logo=githubactions&logoColor=white) |
55+
| 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) |
56+
<br>
57+
58+
59+
## 🔆 서비스 고안 배경
60+
### 📖 프로젝트 개요
61+
62+
WAYBLE은 장애인·교통약자 사용자를 위해 맞춤형 경로 탐색, 접근성 필터 기반 장소 추천, 접근성 리뷰 공유 기능을 제공하는 배리어프리 지도 서비스입니다. <br>
63+
사용자의 장애 유형과 이동 수단 설정에 따라 최적화된 경로를 안내하고, 누구나 접근성 정보를 등록·확인하여 모두의 이동권을 보장합니다.
64+
65+
### 🚦 기획의 시작
66+
왜 장애인은 주변에서 자주 보이지 않을까? <br>
67+
교통수단 이용의 어려움 <br>
68+
충분히 보장되지 않는 생활 접근성 <br>
69+
부족한 이동 편의 서비스 <br>
70+
장애인 인터뷰에서 나온 목소리 <br>
71+
72+
> "매일 똑같은 식당에 가요.",
73+
> "하루가 계획대로 되지 않아요.",
74+
> "엘리베이터 위치 정보가 부정확해서 이동이 힘들어요."
75+
76+
기존 지도 서비스에는 엘리베이터·경사로·장애인 화장실 등 장애인들을 위한 확실한 정보가 불충분하고,
77+
장애 유형별 경로 안내, 장애인들만의 접근성 리뷰 공유 기능등 편의성이 제공되지 않습니다.
78+
79+
### 💡 서비스 소개
80+
81+
**WAYBLE은**
82+
- 장애 유형과 이동 수단 설정에 따라 UI·안내 정보 자동 최적화
83+
- 접근성 필터 기반 장소 검색·추천
84+
- 장애인들을 기반으로 한 참여형 접근성 리뷰 공유
85+
- 장애인의 이동 경험 개선 및 말못하는 사소한 불편 해소
86+
를 목표로 하는 배리어프리 지도 플랫폼입니다.
87+
88+
### 🎯 서비스 목표
89+
90+
**장애 유형·이동 수단별 최적화된 경로 탐색**
91+
92+
**접근성 필터 기반 장소 추천**
93+
94+
**장애인 참여형 접근성 정보 수집·공유**
95+
96+
(채우기)
97+
98+
<br><br>
99+
100+
## 🛠 주요 기능
101+
**1. 지도 기반 접근 가능 장소 검색**
102+
103+
엘리베이터, 경사로, 장애인 화장실 등 장애인들이 필수적으로 알고싶어하는 정보들로 장소 필터링
104+
위치 기반 추천
105+
106+
**2. 맞춤형 경로 안내**
107+
108+
장애 유형별 경로 최적화 (휠체어, 시각장애, 지적장애 등)
109+
110+
웨이블 마커 (경사로, 휠체어 충전기 등)을 활용하여 커스텀 추천 경로 제공
111+
112+
대중교통 경로에선 장애인들에게 필요한 정보(지하철역-엘리베이터 위치 등, 버스-저상버스 여부 등) 제공
113+
114+
**3. 접근성 리뷰 작성·열람**
115+
116+
이용자가 남긴 접근성 중심 리뷰 확인
117+
118+
**4. 마이 플레이스**
119+
120+
나만의 장소 웨이블존 리스트 저장
121+
122+
저장한 장소별 웨이블존 조회 및 삭제
123+
124+
(채우기)
125+
126+
<br><br>
127+
128+
## 🗃️데이터베이스 구조
129+
<img width="920" height="443" alt="image" src="https://github.com/user-attachments/assets/2e9969cf-1ab1-4502-a262-285c3daf142c" />
130+
131+
132+
<br><br>
133+
134+
135+
## 🌴폴더 구조
136+
```
137+
wayble-server/
138+
├── java/
139+
│ └── com/
140+
│ └── wayble/
141+
│ └── server/
142+
│ ├── admin/ # 관리자 관련 기능
143+
│ ├── auth/ # 인증 및 인가 관련 기능
144+
│ ├── aws/ # AWS 연동 (S3, CloudWatch 등)
145+
│ ├── common/ # 공통 유틸, 예외 처리 등
146+
│ ├── direction/ # 길찾기 및 경로 안내
147+
│ ├── explore/ # 탐색 및 추천 관련
148+
│ ├── logging/ # 로깅 설정
149+
│ ├── review/ # 리뷰 작성 및 조회
150+
│ ├── user/ # 유저 관련 기능
151+
│ ├── wayblezone/ # 웨이블존 관련 기능
152+
│ └── ServerApplication.java
153+
154+
├── resources/
155+
│ ├── data/ # 데이터 관련 리소스
156+
│ ├── elasticsearch/ # Elasticsearch 관련 설정
157+
│ ├── templates/ # 템플릿 파일
158+
│ ├── application.properties # Spring Boot 환경 설정
159+
│ ├── application_secret.yml # 민감 정보 설정
160+
│ ├── keystore.p12 # HTTPS 인증서
161+
│ ├── logback-spring.xml
162+
│ ├── seocho_pedestrian.json # 서초구 보행자 데이터
163+
│ └── wayble_markers.json # 웨이블 마커 데이터
164+
165+
├── test/ # 테스트 관련
166+
167+
├── wrapper/
168+
├── .gitattributes
169+
├── .gitignore
170+
├── .coderabbit.yml
171+
├── application.yml
172+
├── build.gradle
173+
├── docker-compose.yml
174+
├── docker-els.yml
175+
├── Dockerfile
176+
├── Dockerfile.elasticsearch
177+
└── gradlew
178+
```
179+
<br><br>
180+
181+
## 🌐시스템 구성도
182+
<img width="5638" height="3182" alt="wayble_infra" src="https://github.com/user-attachments/assets/9a8bc6f5-bfd9-44d2-b5c2-96c9fdf374e0" />
183+
184+
<br><br>
185+
186+
## ⛓️API 명세
187+
188+
#### [🛠️Wayble 기능명세 링크](https://www.notion.so/API-21d75cf0b87b80248a0ec55c6134ad20)
189+
190+
<br>

src/main/java/com/wayble/server/common/config/WebClientConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ public WebClient tMapWebClient() {
3131
public WebClient kricWebClient() {
3232
return WebClient.builder()
3333
.baseUrl(kricProperties.baseUrl())
34+
.codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(2 * 1024 * 1024))
35+
.filter((request, next) -> next.exchange(request)
36+
.timeout(java.time.Duration.ofSeconds(15))
37+
.retryWhen(reactor.util.retry.Retry.backoff(3, java.time.Duration.ofSeconds(1))
38+
.filter(throwable -> throwable instanceof org.springframework.web.reactive.function.client.WebClientRequestException)))
3439
.build();
3540
}
3641
}

src/main/java/com/wayble/server/direction/dto/response/TransportationResponseDto.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public record Step(
2020
DirectionType mode, // 예: START, WALK, SUBWAY, BUS, FINISH
2121
@Nullable List<MoveInfo> moveInfo, // 같은 Step으로 이동한 정류장(Node) 정보 (중간 정류장만)
2222
@Nullable String routeName,
23-
Integer moveNumber, // 같은 Step(route)로 이동한 횟수
23+
Integer moveNumber, // 같은 Step(route)로 이동한 횟수 또는 WALK step의 경우 거리(미터 단위)
2424
@Nullable BusInfo busInfo, // 버스일 경우에만 생성, 이외의 경우 null
2525
@Nullable SubwayInfo subwayInfo, // 지하철일 경우에만 생성, 이외의 경우 null
2626
String from,
@@ -43,8 +43,8 @@ public record BusInfo(
4343
){}
4444

4545
public record SubwayInfo(
46-
List<LocationInfo> wheelchair,
47-
List<LocationInfo> elevator,
46+
List<String> wheelchair,
47+
List<String> elevator,
4848
Boolean accessibleRestroom
4949
) {}
5050

@@ -55,8 +55,8 @@ public record LocationInfo(
5555

5656
// 지하철 시설 정보 묶음 (서비스 내부에서 사용)
5757
public record NodeInfo(
58-
List<LocationInfo> wheelchair,
59-
List<LocationInfo> elevator,
58+
List<String> wheelchair,
59+
List<String> elevator,
6060
Boolean accessibleRestroom
6161
) {}
6262
}

src/main/java/com/wayble/server/direction/entity/transportation/Facility.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
@Table(name = "facility")
1717
public class Facility {
1818
@Id
19-
@GeneratedValue(strategy = GenerationType.IDENTITY)
2019
private Long id;
2120

2221
@Column(name="stationName")

src/main/java/com/wayble/server/direction/entity/transportation/Route.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import jakarta.persistence.*;
77
import lombok.*;
88

9+
import java.util.List;
10+
911
@Entity
1012
@Getter
1113
@Builder(access = AccessLevel.PRIVATE)
@@ -33,4 +35,8 @@ public class Route {
3335
@ManyToOne
3436
@JoinColumn(name = "end_node_id")
3537
private Node endNode;
38+
39+
// 휠체어 정보
40+
@OneToMany(mappedBy = "route", fetch = FetchType.LAZY)
41+
private List<Wheelchair> wheelchairs;
3642
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.wayble.server.direction.entity.transportation;
2+
3+
import jakarta.persistence.*;
4+
import lombok.*;
5+
6+
@Entity
7+
@Getter
8+
@Builder
9+
@AllArgsConstructor(access = AccessLevel.PROTECTED)
10+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
11+
@Table(name = "wheelchair")
12+
public class Wheelchair {
13+
@Id
14+
@GeneratedValue(strategy = GenerationType.IDENTITY)
15+
private Long id;
16+
17+
@ManyToOne(fetch = FetchType.LAZY)
18+
@JoinColumn(name = "route_id", nullable = false)
19+
private Route route;
20+
21+
@Column(name = "wheelchair_location", nullable = false)
22+
private String wheelchairLocation; // 1-4 등
23+
24+
}

src/main/java/com/wayble/server/direction/external/kric/dto/KricToiletRawBody.java

Lines changed: 0 additions & 7 deletions
This file was deleted.

src/main/java/com/wayble/server/direction/external/kric/dto/KricToiletRawItem.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,15 @@
33
import lombok.Getter;
44

55
public record KricToiletRawItem(
6+
String railOprIsttCd,
7+
String lnCd,
68
String stinCd,
7-
String toltNum
9+
String grndDvNm,
10+
String stinFlor,
11+
String gateInotDvNm,
12+
String exitNo,
13+
String dtlLoc,
14+
String mlFmlDvNm,
15+
String toltNum,
16+
String diapExchNum
817
) {}

src/main/java/com/wayble/server/direction/external/kric/dto/KricToiletRawResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
import java.util.List;
44

55
public record KricToiletRawResponse(
6-
KricToiletRawBody body
6+
List<KricToiletRawItem> body
77
) {}

src/main/java/com/wayble/server/direction/repository/FacilityRepository.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@
66
import java.util.Optional;
77

88
import org.springframework.data.jpa.repository.JpaRepository;
9+
import org.springframework.data.jpa.repository.Query;
10+
import org.springframework.data.repository.query.Param;
911

1012
public interface FacilityRepository extends JpaRepository<Facility, Long> {
11-
Optional<Facility> findByNodeId(Long nodeId);
13+
@Query("SELECT f FROM Facility f " +
14+
"LEFT JOIN FETCH f.lifts " +
15+
"WHERE f.id = :nodeId")
16+
Optional<Facility> findByNodeId(@Param("nodeId") Long nodeId);
1217
}

0 commit comments

Comments
 (0)