@apt.today/react-seoul-icons 1.0.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +141 -216
- package/dist/index.d.mts +164 -79
- package/dist/index.d.ts +164 -79
- package/dist/index.js +2152 -153
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2123 -144
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -4
package/README.md
CHANGED
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
|
|
9
9
|

|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
대한민국 광역자치단체(시/도) 및 기초자치단체(시/군/구) 로고 아이콘을 React 컴포넌트로 제공하는 라이브러리입니다.
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
[데모 페이지](https://myriky.github.io/apt-today-react-seoul-icons/)
|
|
14
14
|
|
|
15
15
|
## 설치
|
|
16
16
|
|
|
@@ -18,296 +18,221 @@
|
|
|
18
18
|
npm install @apt.today/react-seoul-icons
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
또는
|
|
22
|
-
|
|
23
21
|
```bash
|
|
24
22
|
yarn add @apt.today/react-seoul-icons
|
|
25
23
|
```
|
|
26
24
|
|
|
27
25
|
## 사용법
|
|
28
26
|
|
|
29
|
-
###
|
|
27
|
+
### 컴포넌트 직접 사용
|
|
28
|
+
|
|
29
|
+
아이콘을 직접 import해서 React 컴포넌트로 사용합니다.
|
|
30
30
|
|
|
31
31
|
```tsx
|
|
32
|
-
import { GangnamGu,
|
|
32
|
+
import { GangnamGu, Seoul, MapoGu } from "@apt.today/react-seoul-icons";
|
|
33
33
|
|
|
34
34
|
function App() {
|
|
35
35
|
return (
|
|
36
36
|
<div>
|
|
37
|
+
<Seoul width={64} height={64} />
|
|
37
38
|
<GangnamGu className="w-12 h-12" />
|
|
38
|
-
<
|
|
39
|
-
<MapoGu width={48} height={48} />
|
|
39
|
+
<MapoGu style={{ width: 48, height: 48 }} />
|
|
40
40
|
</div>
|
|
41
41
|
);
|
|
42
42
|
}
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
-
###
|
|
46
|
-
|
|
47
|
-
```tsx
|
|
48
|
-
import * as SeoulIcons from "@apt.today/react-seoul-icons";
|
|
45
|
+
### 유틸리티로 동적 조회
|
|
49
46
|
|
|
50
|
-
|
|
51
|
-
return (
|
|
52
|
-
<div>
|
|
53
|
-
<SeoulIcons.GangnamGu width={48} />
|
|
54
|
-
<SeoulIcons.JongnoGu className="w-12 h-12" />
|
|
55
|
-
</div>
|
|
56
|
-
);
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### 동적 아이콘 렌더링 (컴포넌트 이름 기반)
|
|
47
|
+
코드나 이름으로 아이콘을 동적으로 가져올 때는 `utils`를 사용합니다.
|
|
61
48
|
|
|
62
49
|
```tsx
|
|
63
|
-
import
|
|
64
|
-
|
|
65
|
-
const districts = ["GangnamGu", "MapoGu", "JongnoGu"];
|
|
66
|
-
|
|
67
|
-
function App() {
|
|
68
|
-
return (
|
|
69
|
-
<div className="flex gap-4">
|
|
70
|
-
{districts.map((name) => {
|
|
71
|
-
const Icon = SeoulIcons[name as keyof typeof SeoulIcons] as React.FC<
|
|
72
|
-
React.SVGProps<SVGSVGElement>
|
|
73
|
-
>;
|
|
74
|
-
return <Icon key={name} width={48} height={48} />;
|
|
75
|
-
})}
|
|
76
|
-
</div>
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
### 행정구역 코드로 아이콘 가져오기 ⭐
|
|
50
|
+
import { utils } from "@apt.today/react-seoul-icons";
|
|
82
51
|
|
|
83
|
-
|
|
84
|
-
|
|
52
|
+
// 코드로 아이콘 가져오기 (시도 2자리 / 시군구 5자리 자동 판별)
|
|
53
|
+
const SeoulIcon = utils.getIcon(11); // 서울특별시
|
|
54
|
+
const GangnamIcon = utils.getIcon(11680); // 강남구
|
|
85
55
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
56
|
+
// 이름으로 아이콘 검색
|
|
57
|
+
const Icon = utils.findByName("강남구");
|
|
58
|
+
const Icon2 = utils.findByName("강남");
|
|
59
|
+
const Icon3 = utils.findByName("서울특별시 강남구");
|
|
60
|
+
const Icon4 = utils.findByName("서울 강남구");
|
|
89
61
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
{GangnamIcon && <GangnamIcon width={48} height={48} />}
|
|
93
|
-
{JungIcon && <JungIcon width={48} height={48} />}
|
|
94
|
-
</div>
|
|
95
|
-
);
|
|
96
|
-
}
|
|
62
|
+
// 중복 이름(중구 등)은 region 옵션으로 구분
|
|
63
|
+
const JungGu = utils.findByName("중구", { region: "서울" });
|
|
97
64
|
```
|
|
98
65
|
|
|
99
|
-
###
|
|
66
|
+
### 지역별 목록 조회
|
|
100
67
|
|
|
101
68
|
```tsx
|
|
102
|
-
import {
|
|
103
|
-
|
|
104
|
-
// 다양한 형식 지원
|
|
105
|
-
const Icon1 = getIconByName("강남구"); // ✅
|
|
106
|
-
const Icon2 = getIconByName("강남"); // ✅
|
|
107
|
-
const Icon3 = getIconByName("서울특별시 강남구"); // ✅
|
|
108
|
-
const Icon4 = getIconByName("서울 강남구"); // ✅
|
|
69
|
+
import { utils } from "@apt.today/react-seoul-icons";
|
|
109
70
|
|
|
110
|
-
//
|
|
111
|
-
const
|
|
112
|
-
const
|
|
113
|
-
```
|
|
71
|
+
// 시도별 시군구 목록
|
|
72
|
+
const seoulIcons = utils.getByRegion(11); // 코드로
|
|
73
|
+
const gyeonggiIcons = utils.getByRegion("경기"); // 이름으로
|
|
114
74
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
```tsx
|
|
118
|
-
import {
|
|
119
|
-
getAllDistrictInfo,
|
|
120
|
-
getDistrictsByRegion,
|
|
121
|
-
} from "@apt.today/react-seoul-icons";
|
|
75
|
+
// 전체 시도 목록
|
|
76
|
+
const regions = utils.getAllRegions();
|
|
122
77
|
|
|
123
|
-
//
|
|
124
|
-
const
|
|
78
|
+
// 전체 시군구 목록
|
|
79
|
+
const allIcons = utils.getAll();
|
|
125
80
|
|
|
126
|
-
|
|
127
|
-
const seoulDistricts = getDistrictsByRegion("서울");
|
|
128
|
-
|
|
129
|
-
function App() {
|
|
81
|
+
function DistrictList() {
|
|
130
82
|
return (
|
|
131
|
-
<div>
|
|
132
|
-
{
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
<
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
<code>{district.code}</code>
|
|
139
|
-
</div>
|
|
140
|
-
);
|
|
141
|
-
})}
|
|
83
|
+
<div className="grid grid-cols-5 gap-4">
|
|
84
|
+
{seoulIcons.map((icon) => (
|
|
85
|
+
<div key={icon.code} className="flex flex-col items-center">
|
|
86
|
+
<icon.component className="w-12 h-12" />
|
|
87
|
+
<span>{icon.name}</span>
|
|
88
|
+
</div>
|
|
89
|
+
))}
|
|
142
90
|
</div>
|
|
143
91
|
);
|
|
144
92
|
}
|
|
145
93
|
```
|
|
146
94
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
### 아이콘 가져오기
|
|
150
|
-
|
|
151
|
-
| 함수 | 설명 | 반환 타입 |
|
|
152
|
-
| ------------------------------- | ------------------------------- | --------------------------- |
|
|
153
|
-
| `getIconByCode(code)` | 행정구역 코드로 아이콘 가져오기 | `Component \| undefined` |
|
|
154
|
-
| `getIconByName(name, options?)` | 이름으로 아이콘 가져오기 | `Component \| undefined` |
|
|
155
|
-
| `getDistrictInfo(code)` | 행정구역 코드로 정보 가져오기 | `DistrictInfo \| undefined` |
|
|
156
|
-
| `getNameByCode(code)` | 행정구역 코드로 이름 가져오기 | `string \| undefined` |
|
|
157
|
-
| `getAllDistrictInfo()` | 모든 지역 정보 가져오기 | `readonly DistrictInfo[]` |
|
|
158
|
-
| `getDistrictsByRegion(region)` | 특정 시/도의 지역 정보 | `DistrictInfo[]` |
|
|
159
|
-
| `getAllCodes()` | 모든 행정구역 코드 목록 | `number[]` |
|
|
160
|
-
| `isValidCode(code)` | 유효한 코드인지 확인 | `boolean` |
|
|
161
|
-
|
|
162
|
-
### 타입
|
|
95
|
+
### API 응답에서 동적으로 사용
|
|
163
96
|
|
|
164
97
|
```tsx
|
|
165
|
-
import
|
|
166
|
-
RegionCode, // "서울" | "부산" | "대구" | ...
|
|
167
|
-
SeoulGuCode, // 11110 | 11140 | ...
|
|
168
|
-
DistrictInfo, // 지역 정보 객체
|
|
169
|
-
SeoulGuIconComponent, // SVG 컴포넌트 타입
|
|
170
|
-
GetIconByNameOptions, // { region?: RegionCode }
|
|
171
|
-
} from "@apt.today/react-seoul-icons";
|
|
172
|
-
```
|
|
98
|
+
import { utils } from "@apt.today/react-seoul-icons";
|
|
173
99
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
region: RegionCode; // 시/도 (예: "서울")
|
|
180
|
-
regionFullName: string; // 시/도 전체 이름 (예: "서울특별시")
|
|
181
|
-
name: string; // 구 이름 (예: "강남구")
|
|
182
|
-
shortName: string; // 짧은 이름 (예: "강남")
|
|
183
|
-
component: SeoulGuIconComponent; // React 컴포넌트
|
|
100
|
+
// 행정구역 코드를 받은 경우
|
|
101
|
+
function DistrictIcon({ code }: { code: number }) {
|
|
102
|
+
const Icon = utils.getIcon(code);
|
|
103
|
+
if (!Icon) return null;
|
|
104
|
+
return <Icon width={48} height={48} />;
|
|
184
105
|
}
|
|
185
|
-
```
|
|
186
106
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
| `11170` | 용산구 | `YongsanGu` |
|
|
194
|
-
| `11200` | 성동구 | `SeongdongGu` |
|
|
195
|
-
| `11215` | 광진구 | `GwangjinGu` |
|
|
196
|
-
| `11230` | 동대문구 | `DongdaemunGu` |
|
|
197
|
-
| `11260` | 중랑구 | `JungnangGu` |
|
|
198
|
-
| `11290` | 성북구 | `SeongbukGu` |
|
|
199
|
-
| `11305` | 강북구 | `GangbukGu` |
|
|
200
|
-
| `11320` | 도봉구 | `DobongGu` |
|
|
201
|
-
| `11350` | 노원구 | `NowonGu` |
|
|
202
|
-
| `11380` | 은평구 | `EunpyeongGu` |
|
|
203
|
-
| `11410` | 서대문구 | `SeodaemunGu` |
|
|
204
|
-
| `11440` | 마포구 | `MapoGu` |
|
|
205
|
-
| `11470` | 양천구 | `YangcheonGu` |
|
|
206
|
-
| `11500` | 강서구 | `GangseoGu` |
|
|
207
|
-
| `11530` | 구로구 | `GuroGu` |
|
|
208
|
-
| `11545` | 금천구 | `GeumcheonGu` |
|
|
209
|
-
| `11560` | 영등포구 | `YeongdeungpoGu` |
|
|
210
|
-
| `11590` | 동작구 | `DongjakGu` |
|
|
211
|
-
| `11620` | 관악구 | `GwanakGu` |
|
|
212
|
-
| `11650` | 서초구 | `SeochoGu` |
|
|
213
|
-
| `11680` | 강남구 | `GangnamGu` |
|
|
214
|
-
| `11710` | 송파구 | `SongpaGu` |
|
|
215
|
-
| `11740` | 강동구 | `GangdongGu` |
|
|
216
|
-
|
|
217
|
-
## Props
|
|
218
|
-
|
|
219
|
-
모든 컴포넌트는 SVG 요소의 표준 props를 지원합니다:
|
|
220
|
-
|
|
221
|
-
```tsx
|
|
222
|
-
interface IconProps extends React.SVGProps<SVGSVGElement> {}
|
|
107
|
+
// 지역명을 받은 경우
|
|
108
|
+
function DistrictIconByName({ name }: { name: string }) {
|
|
109
|
+
const Icon = utils.findByName(name);
|
|
110
|
+
if (!Icon) return null;
|
|
111
|
+
return <Icon width={48} height={48} />;
|
|
112
|
+
}
|
|
223
113
|
```
|
|
224
114
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
- `className`: CSS 클래스명
|
|
228
|
-
- `style`: 인라인 스타일
|
|
229
|
-
- `width`: 너비
|
|
230
|
-
- `height`: 높이
|
|
231
|
-
- `fill`: 색상 (일부 아이콘은 고정 색상)
|
|
232
|
-
- `onClick`: 클릭 이벤트 핸들러
|
|
115
|
+
## API
|
|
233
116
|
|
|
234
|
-
|
|
117
|
+
### 아이콘 컴포넌트
|
|
235
118
|
|
|
236
|
-
|
|
119
|
+
모든 아이콘 컴포넌트는 `React.SVGProps<SVGSVGElement>`를 지원합니다.
|
|
237
120
|
|
|
238
121
|
```tsx
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
return <GangnamGu className="w-16 h-16 text-blue-500 hover:text-blue-700" />;
|
|
243
|
-
}
|
|
122
|
+
<GangnamGu width={48} height={48} />
|
|
123
|
+
<GangnamGu className="w-12 h-12" />
|
|
124
|
+
<GangnamGu style={{ width: 48 }} />
|
|
244
125
|
```
|
|
245
126
|
|
|
246
|
-
###
|
|
127
|
+
### utils
|
|
247
128
|
|
|
248
|
-
|
|
249
|
-
|
|
129
|
+
| 메서드 | 설명 | 반환 타입 |
|
|
130
|
+
| --- | --- | --- |
|
|
131
|
+
| `utils.getIcon(code)` | 시도/시군구 코드로 아이콘 가져오기 | `IconComponent \| null` |
|
|
132
|
+
| `utils.findByName(name, options?)` | 이름으로 아이콘 검색 | `IconComponent \| null` |
|
|
133
|
+
| `utils.getInfo(code)` | 코드로 상세 정보 가져오기 | `IconInfo \| RegionInfo \| null` |
|
|
134
|
+
| `utils.getByRegion(codeOrName)` | 특정 시도의 시군구 목록 | `IconInfo[]` |
|
|
135
|
+
| `utils.getAllRegions()` | 모든 시도 정보 | `RegionInfo[]` |
|
|
136
|
+
| `utils.getAvailableRegions()` | 아이콘이 있는 시도만 | `RegionInfo[]` |
|
|
137
|
+
| `utils.getRegionsWithIcons()` | 시군구가 있는 시도만 | `RegionInfo[]` |
|
|
138
|
+
| `utils.getAll()` | 모든 시군구 아이콘 정보 | `IconInfo[]` |
|
|
139
|
+
| `utils.isValid(code)` | 유효한 코드인지 확인 | `boolean` |
|
|
250
140
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
141
|
+
### 타입
|
|
142
|
+
|
|
143
|
+
```tsx
|
|
144
|
+
import type { IconComponent, IconInfo, RegionInfo } from "@apt.today/react-seoul-icons";
|
|
145
|
+
|
|
146
|
+
// IconComponent
|
|
147
|
+
type IconComponent = React.ComponentType<React.SVGProps<SVGSVGElement>>;
|
|
148
|
+
|
|
149
|
+
// IconInfo - 시군구 아이콘 정보
|
|
150
|
+
interface IconInfo {
|
|
151
|
+
code: number; // 시군구 코드 (예: 11680)
|
|
152
|
+
regionCode: number; // 소속 시도 코드 (예: 11)
|
|
153
|
+
regionName: string; // 소속 시도명 (예: "서울특별시")
|
|
154
|
+
name: string; // 이름 (예: "강남구")
|
|
155
|
+
shortName: string; // 단축명 (예: "강남")
|
|
156
|
+
componentName: string; // 컴포넌트명 (예: "GangnamGu")
|
|
157
|
+
component: IconComponent;
|
|
256
158
|
}
|
|
257
159
|
|
|
258
|
-
//
|
|
259
|
-
|
|
260
|
-
//
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
160
|
+
// RegionInfo - 시도 정보
|
|
161
|
+
interface RegionInfo {
|
|
162
|
+
code: number; // 시도 코드 (예: 11)
|
|
163
|
+
name: string; // 전체 이름 (예: "서울특별시")
|
|
164
|
+
shortName: string; // 단축명 (예: "서울")
|
|
165
|
+
englishName: string; // 영문명 (예: "Seoul")
|
|
166
|
+
component: IconComponent | null;
|
|
264
167
|
}
|
|
265
168
|
```
|
|
266
169
|
|
|
267
|
-
|
|
170
|
+
## 지원 행정구역
|
|
171
|
+
|
|
172
|
+
### 시도 (광역시/도)
|
|
173
|
+
|
|
174
|
+
| 시도 | 코드 | 컴포넌트명 |
|
|
175
|
+
| --- | --- | --- |
|
|
176
|
+
| 서울특별시 | `11` | `Seoul` |
|
|
177
|
+
| 부산광역시 | `26` | `Busan` |
|
|
178
|
+
| 대구광역시 | `27` | `Daegu` |
|
|
179
|
+
| 인천광역시 | `28` | `Incheon` |
|
|
180
|
+
| 울산광역시 | `31` | `Ulsan` |
|
|
181
|
+
| 경기도 | `41` | `Gyeonggi` |
|
|
182
|
+
|
|
183
|
+
### 시군구
|
|
184
|
+
|
|
185
|
+
- **서울특별시**: 25개 자치구 (강남구, 종로구, 마포구 등)
|
|
186
|
+
- **경기도**: 14개 시 (수원시, 고양시, 용인시, 화성시, 성남시, 안양시, 광명시, 과천시, 구리시, 남양주시, 하남시, 의왕시, 김포시, 파주시)
|
|
187
|
+
- **부산광역시**: 해운대구
|
|
188
|
+
- **대구광역시**: 수성구
|
|
189
|
+
- **인천광역시**: 연수구
|
|
190
|
+
- **울산광역시**: 남구
|
|
191
|
+
|
|
192
|
+
## v1에서 마이그레이션
|
|
193
|
+
|
|
194
|
+
v2에서는 API가 `utils` 네임스페이스로 통합되었습니다.
|
|
195
|
+
|
|
196
|
+
| v1 | v2 |
|
|
197
|
+
| --- | --- |
|
|
198
|
+
| `getSidoIcon(11)` | `utils.getIcon(11)` |
|
|
199
|
+
| `getSigunguIcon(11680)` | `utils.getIcon(11680)` |
|
|
200
|
+
| `getIconByCode(11680)` | `utils.getIcon(11680)` |
|
|
201
|
+
| `getIconByName("강남구")` | `utils.findByName("강남구")` |
|
|
202
|
+
| `getSigunguIconByName("강남구")` | `utils.findByName("강남구")` |
|
|
203
|
+
| `getAllDistrictInfo()` | `utils.getAll()` |
|
|
204
|
+
| `getAllSigunguInfo()` | `utils.getAll()` |
|
|
205
|
+
| `getDistrictsByRegion("서울")` | `utils.getByRegion("서울")` |
|
|
206
|
+
| `getSigunguBySido(11)` | `utils.getByRegion(11)` |
|
|
207
|
+
| `getAllSidoInfo()` | `utils.getAllRegions()` |
|
|
208
|
+
| `type SidoInfo` | `type RegionInfo` |
|
|
209
|
+
| `type SigunguInfo` | `type IconInfo` |
|
|
210
|
+
| `type DistrictInfo` | `type IconInfo` |
|
|
211
|
+
|
|
212
|
+
아이콘 컴포넌트의 직접 import는 변경 없이 동일합니다:
|
|
268
213
|
|
|
269
214
|
```tsx
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
function DistrictList() {
|
|
273
|
-
const districts = getAllDistrictInfo();
|
|
274
|
-
|
|
275
|
-
return (
|
|
276
|
-
<div className="grid grid-cols-5 gap-4">
|
|
277
|
-
{districts.map((district) => (
|
|
278
|
-
<div key={district.code} className="flex flex-col items-center">
|
|
279
|
-
<district.component className="w-12 h-12" />
|
|
280
|
-
<span>{district.name}</span>
|
|
281
|
-
</div>
|
|
282
|
-
))}
|
|
283
|
-
</div>
|
|
284
|
-
);
|
|
285
|
-
}
|
|
215
|
+
// v1과 v2 모두 동일
|
|
216
|
+
import { GangnamGu, Seoul } from "@apt.today/react-seoul-icons";
|
|
286
217
|
```
|
|
287
218
|
|
|
288
219
|
## 라이선스
|
|
289
220
|
|
|
290
221
|
### 아이콘 저작권
|
|
291
222
|
|
|
292
|
-
본 라이브러리의 아이콘은
|
|
223
|
+
본 라이브러리의 아이콘은 각 지방자치단체의 공식 심볼/로고로, 공공누리 제1유형(출처표시)에 따라 자유롭게 이용할 수 있습니다.
|
|
293
224
|
|
|
294
225
|
### 라이브러리 코드
|
|
295
226
|
|
|
296
227
|
본 라이브러리의 소스 코드는 MIT 라이선스를 따릅니다.
|
|
297
228
|
|
|
298
|
-
자세한 내용은 [LICENSE](./LICENSE) 파일을
|
|
229
|
+
자세한 내용은 [LICENSE](./LICENSE) 파일을 참고하세요.
|
|
299
230
|
|
|
300
231
|
## About apt.today
|
|
301
232
|
|
|
302
233
|
이 라이브러리는 [apt.today](https://apt.today) 프로젝트의 일부입니다.
|
|
303
234
|
|
|
304
|
-
**apt.today**는 부동산 정보를 제공하는 서비스로,
|
|
305
|
-
|
|
306
|
-
본 아이콘 라이브러리는 apt.today 서비스에서 서울시 각 행정구의 데이터를 시각적으로 표현하기 위해 개발되었으며, 누구나 자유롭게 사용할 수 있도록 오픈소스로 공개되었습니다.
|
|
307
|
-
|
|
308
|
-
### 관련 프로젝트
|
|
309
|
-
|
|
310
|
-
- 🏢 [apt.today](https://apt.today) - 손 쉽게 찾는 부동산 정보, 오늘의 아파트
|
|
235
|
+
**apt.today**는 부동산 정보를 제공하는 서비스로, 전국 지자체별 고시공고문, 모집공고문, 토지거래허가내역을 비롯한 다양한 아파트 관련 정보를 확인 할 수 있는 플랫폼입니다.
|
|
311
236
|
|
|
312
237
|
## 기여
|
|
313
238
|
|