λκΈ°
λ΄κ° μ¬μλ μ νλνλ EFUB μ€ν μΉ΄μΉ΄μ€ν‘ λ°©μμ μ°μ°ν λ€μκ³Ό κ°μ κ³΅κ³ λ₯Ό λ³΄κ² λμλ€.
λλ μκ³λ₯Ό μ μ§ν΄μΌνλ λνμμ΄λ―λ‘.. λμ΄ κΈν κ²λ μμμ§λ§ λμ μ 곡과 κ΄λ ¨ν μ§μ(λ₯λ ₯)μ λ°ννλ©΄μ λμ λ² μ μλ€λ©΄ μ΄λ³΄λ€ λ μ’μ κΈ°νλ μμ κ²μ΄λΌκ³ μκ°νλ€! μ¬μ€ μΈμ£Ό κ°λ°μ μ²μμ΄κ³ μμ§ μꡬμ¬νλ λΆλΆλͺ νκ³ μ ν΄μ§ 짧μ κΈ°ν λ΄μ κ²°κ³Όλ₯Ό λ΄μΌνκΈ°μ 'μ μκ° μμ μμ±νμ§ λͺ»νλ©΄ μ΄λ‘νμ§', 'μ ν΄λΌ μ μμκΉ'μ λν κ±±μ λ μ½κ° μμμ§λ§, νλ‘ νΈμλ μΉκ°λ°μ λ΄κ° μλΉν μ΅μν λΆμΌμ΄κ³ λλ λλ₯Ό 'μν΅μ μνλ κ°λ°μ' , 'κ°μ΄ μμ νκ³ μΆμ κ°λ°μ' μ λλ‘ γ γ γ γ γ μΈμνκ³ μμκΈ° λλ¬Έμ ν° κ±±μ μ΄ λμ§λ μμλ€! π
μ£Όμ λ 'λμ΄μ΄ μ μ κ±΄κ° μλ£λΆκ· ν' μ κ΄λ ¨λ κ²μ΄λ€. νμ μ»΄ν¨ν° 곡ν μ 곡μλ€κ³Όλ§ μν΅μ ν΄μκΈ°μ μμ λ€λ₯Έ μ 곡μ κ°μ§ μ¬λλ€κ³Ό ν¨κ» νλ‘μ νΈλ₯Ό μ§νν΄λ³΄κ³ μΆλ€λ μꡬλ μμλ€. κΈμ¬λ 60λ§μ μ λμ΄κ³ , 쑰건 λ° μꡬμ¬ν λ±μ λμ΄λκ° κ·Έλ κ² λμ보μ΄μ§ μμμ νμΎν κ°λ°μ Accept νλ€!
λ νΌλ°μ€
λ νΌλ°μ€λ‘ 보λ΄μ£Όμ μΉ μ¬μ΄νΈλ λ€μκ³Ό κ°μλ€. μ μ μ μνΈμμ© κ°λ₯ν μΈν°λν°λΈν μμλ€μ΄ λμ λμλ€.
https://news.kbs.co.kr/special/somyeol/index.html#/chp3
QGISμ§λ¦¬ λ°μ΄ν°λ₯Ό κΈ°λ° μΈν°λν°λΈ μ§λ ꡬμΆ
νΉν κ·Έμ€μμ QGISμ μ§λ¦¬ λ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ μΈν°λν°λΈν μ§λλ₯Ό ꡬμΆνλ κ²μ λ©μΈ κΈ°λ₯μΌλ‘ μꡬ λ°μλ€.
μ΄ 3κ°μ μ§λλ₯Ό λ§λ€μ΄μΌ νλλ°
1. μ£Όμ κ° λ¬΄μμ΄κ³ μ΄λ€ λ°μ΄ν°λ₯Ό μ 곡λ°λμ§
2. μ΄λ₯Ό μ΄λ€μμΌλ‘ 보μ¬μ£Όμ΄μΌνλμ§
μ μ΄μ μ λ§μΆμ΄μ λ€μκ³Ό κ°μ κΈ°νμλ₯Ό μ λ¬ λ°μλ€.
https://www.qgistutorials.com/ko/docs/leaflet_maps_with_qgis2leaf.html
QGIS μ λ΄μ₯λ μ§λλ₯Ό Web μμΌλ‘ import ν νμκ° μμλλ°,
첫λ²μ§Έ λ μ¬λ¦° λ°λ‘λ ν΄λΉ SW λ΄μ qgis2leaf λλ qgis2webμ΄λΌλ νλ¬κ·ΈμΈμ΄ μλ€κ³ λ€μ΄μ μ νν 리μΌμ λ°λ₯΄λ©΄ μλμ²λΌ Leaflet Map HTML λ‘ λ³νν μ μμ κ²μ΄λΌκ³ μκ°νλ€.
νμ§λ§ QGIS κ° μ€μΉλμ΄ μλ κΈ°νμ λΆκ»μ μνμ°©μ€λ₯Ό λ§μ΄ κ²ͺμΌμκ³ λ¬΄μμ΄ λ¬Έμ μλμ§ λ³νμ΄ μ μλμλ μ΄λ €μμ λλΌμ μ λ€λ₯Έ λ°©λ²μ λ μ¬λ €λ³΄κΈ°λ‘ νλ€.
λλ²μ§Έλ‘λ QGIS μ체μμ μ 곡νλ .jeojson λ°μ΄ν°μ leaflet API λ₯Ό κ²°ν©νμ¬ μ체μ μΌλ‘ μ§λλ₯Ό κ°λ°νλ κ²μ΄λ€.
leaflet μ체μμ GeoJSON λ°μ΄ν°λ₯Ό νμ©ν΄μ μ§λλ‘ λ³΄μ¬μ£Όλ μ»΄ν¬λνΈλ₯Ό μ 곡νκ³ μμ΄μ
React μμ ν΄λΉ λΌμ΄λΈλ¬λ¦¬ μ¬μ©ν΄μ 맡μ 컀μ€ν°λ§μ΄μ§ν μ μμ κ²μ΄λΌκ³ μκ°νλ€.
μ΄λ₯Ό μν΄μ κΈ°νμ λΆκ» QGIS μ΄ν리μΌμ΄μ μ νμ©νμ¬ μ체μ μΌλ‘ κ°κ³΅ν΄μ£Όμ .geojson λ°μ΄ν°λ₯Ό λ°μλ€.
features λΌλ κ°μ²΄ λ°°μ΄μ λ΄κΈ΄ κ°μ²΄ νλνλκ° μ§μ λ¨μ νλνλλ₯Ό μλ―Ένλ€.
1. κ° λ°μ΄ν° ν¬μΈνΈμ κ²½κ³, μλ£ μ 보λ₯Ό λ΄κ³ μλ .geojson
{
"type": "FeatureCollection",
"name": "sgg_mhc_4326_fin",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { "sgg_cd": "11010", "sgg_nm": "μ’
λ‘ꡬ", "sd_nm": "μμΈνΉλ³μ", "pro_num": 12, "gen_num": 5, "etc_num": 0, "pop_rate": 8.6, "pop_rate2": 12.2, "pro_rate": 70.59, "sum": 17 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 126.974965506626646, 37.629025846322392 ], [ 126.979932541642896, 37.628551385741844 ], [ 126.986578589226838, 37.613972040206576 ], [ 126.98666961211083, 37.60402408418873 ], [ 126.976720448663031, 37.597900773419852 ], [ 126.989222005235973, 37.591257335444396 ], [ 127.000983830349256, 37.592321896606414 ], [ 127.008637970768916, 37.580459930712074 ], [ 127.014833342262051, 37.58233145639781 ], [ 127.018090672138015, 37.577566726827079 ], [ 127.023138495286972, 37.578020879003603 ], [ 127.02335824789148, 37.571907275493935 ], [ 126.990150966911386, 37.568136140900691 ], [ 126.97320520035349, 37.569318939391493 ], [ 126.966697705086418, 37.565819760343544 ], [ 126.953558194879776, 37.578748855890005 ], [ 126.958173167115675, 37.580984573579705 ], [ 126.95903333886244, 37.595059021840669 ], [ 126.95771415697908, 37.598367077095006 ], [ 126.953061091977574, 37.598758628935428 ], [ 126.94900026132089, 37.624335133915118 ], [ 126.95864765352961, 37.629500235655868 ], [ 126.960723745696427, 37.629776396868195 ], [ 126.975084766
...
}
νλμ μ§μμ λ©ν° ν΄λ¦¬κ³€ νμ λ°μ΄ν°λ‘ ννμ΄ λλλ°, μ¬λ¬κ°μ ν΄λ¦¬κ³€(λν)μ΄ λͺ¨μΈ κ³΅κ° λ°μ΄ν° νμ μ΄λΌκ³ μ΄ν΄ν΄μ£Όλ©΄ μ½λ€!
νλμ μ§μμ΄ μ μ¬λ¬κ°μ ν΄λ¦¬κ³€μ ν¬ν¨νκ³ μλμ§ λ¬»λλ€λ©΄, λ€μκ³Ό κ°μ΄ νλμ ꡬλΆλλ μ§μμ λν΄μ μ¬λ¬κ°μ μ¬μ ν¬ν¨ν μ μκΈ° λλ¬Έμ΄λ€.
2. κ° λ°μ΄ν° ν¬μΈνΈμ μ€μ¬μ μ λ΄μ .geojson
{
"type": "FeatureCollection",
"name": "sgg_mhc_4326_point",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { "sgg_cd": "11010", "sgg_nm": "μ’
λ‘ꡬ", "sd_nm": "μμΈνΉλ³μ", "pro_num": 12, "gen_num": 5, "etc_num": 0, "pop_rate": 8.6, "pop_rate2": 12.2, "pro_rate": 70.59, "sum": 17 }, "geometry": { "type": "Point", "coordinates": [ 126.977172562038376, 37.59499549178458 ] } },
...
}
λ νΌλ°μ€λ‘ μ£Όμ μΉμλ μ§λ μμμ λ§μ°μ€λ‘ ν΄λ¦νλ©΄, μ΄μ μ΄ ν΄λΉ μ§λμ μ€μ¬μΌλ‘ λ§μΆ°μ§λ κΈ°λ₯μ΄ μλ€.
μ΄λ₯Ό ꡬννκΈ° μν΄μλ μ€μ¬μ μ’νκ° νμνλ€.
λ¬Έμ μν©
κ·Έλ¬λ λκ°μ§ λ¬Έμ μν©μ΄ λ°μνλ€.
첫λ²μ§Έλ μ²μμ 보λ΄μ£Όμ ¨λ .geojson μ μ§μ λ€κ°ν(ν΄λ¦¬κ³€)μ΄ λ무 볡μ‘ν μνμ¬μ λ λλ§ νλ €κ³ νλ©΄, μλ°μ€ν¬λ¦½νΈ λ λλ§ μμ§μ΄ λͺ»λ²ν°κ³ heap limit Allocation failed λ₯Ό λ΄λ λ¬Έμ κ° μμλ€.
보λ΄μ£Όμ λ°μ΄ν°μ ν μ§μλΉ κΌμ§μ μ’νκ° λͺκ°μΈμ§μ‘°μ°¨ μ μ μμ μ λλ‘ λ§μμ μ΄κΈ°μ μ§λ λ‘λνλλ°μλ μκ°μ΄ λ무 μ€λκ±Έλ¦¬κ³ λΆνκ° μκΈ°λ κ² κ°λ€κ³ νλ¨νμκ³ , geojson λ°μ΄ν°κ° μ§κΈλ³΄λ€ λ κ°λ²Όμ μ§λ€λ©΄ λ λλ§μ΄ κ°λ₯ν κ² κ°λ€κ³ μκ°μ΄ λ€μ΄ κΈ°νμλΆκ» QGIS λ₯Ό νμ©νμ¬ λ°μ΄ν°λ₯Ό μ‘°κΈ λ κ°μνν΄μ£Όμ€ μ μμμ§ λΆνλλ Έλ€.
κΈ°νμλΆκ»μ μ΄μ¬ν λΌμΈ λ¨μνλ₯Ό ν΄μ£Όμ λμ λ°μ΄ν° ν¬κΈ°κ° λ§μ΄ μ€μ΄λ€μκ³ κ·Έ κ²°κ³Ό λ λλ§μ μ±κ³΅νλ κ°κ²©μ€λ¬μ΄ κ²°κ³Όλ₯Ό λΌ μ μμλ€! γ γ
κ·Έλ¬λ λ λ€λ₯Έ λ¬Έμ κ° μμλ€.
λλ²μ§Έλ μ΄ λκ°μ λ°μ΄ν°κ° λ°λ‘ λΆλ¦¬λμ΄ μ 곡λ μν©μ΄λΌ λκ°μ λ°μ΄ν°λ₯Ό λͺ¨λ λΆλ¬μ€κΈ°μλ λΆνμνκ² λ°μ΄ν°κ° κ²Ή
μΉλ λΆλΆμ΄ λ§κ³ κ°λ°λ λκ°μ λ°μ΄ν°λ₯Ό νμ©ν΄μΌν΄μ μ‘°κΈ λ 볡μ‘ν κ²μ΄μλ€.
κ·Έλμ νλμ μ§μ κ°μ²΄ μμ λ€μ΄κ° μ μλλ‘ λ°μ΄ν°λ₯Ό λ³ν©νλ μ½λλ₯Ό μμ±νλ€.
data_combiner.py
import json
def merge_geojson(point_filepath, multipolygon_filepath, output_filepath):
# 첫 λ²μ§Έ GeoJSON νμΌ μ½κΈ° (Point λ°μ΄ν°)
with open(point_filepath, 'r', encoding='utf-8') as file:
point_data = json.load(file)
# λ λ²μ§Έ GeoJSON νμΌ μ½κΈ° (MultiPolygon λ°μ΄ν°)
with open(multipolygon_filepath, 'r', encoding='utf-8') as file:
multipolygon_data = json.load(file)
# MultiPolygon λ°μ΄ν°μ features κ°μ Έμ€κΈ°
multipolygon_features = multipolygon_data['features']
# Point λ°μ΄ν°λ₯Ό sgg_cdλ₯Ό keyλ‘ νλ λμ
λλ¦¬λ‘ λ³ν
point_features = {feature['properties']['sgg_cd']: feature for feature in point_data['features']}
# MultiPolygon λ°μ΄ν°μ κ° featureμ λν΄ lat, lng μΆκ°
for feature in multipolygon_features:
sgg_cd = feature['properties']['sgg_cd']
if sgg_cd in point_features: # λμΌν sgg_cdλ₯Ό κ°μ§ Point λ°μ΄ν°κ° μμΌλ©΄
point_feature = point_features[sgg_cd]
# MultiPolygon featureμ propertiesμ lat, lng μΆκ°
feature['properties']['lat'] = point_feature['geometry']['coordinates'][1]
feature['properties']['lng'] = point_feature['geometry']['coordinates'][0]
# λ³ν©λ λ°μ΄ν° μμ±
merged_data = {
"type": "FeatureCollection",
"name": multipolygon_data['name'],
"crs": multipolygon_data['crs'],
"features": multipolygon_features
}
# JSON νμΌλ‘ μ μ₯
with open(output_filepath, 'w', encoding='utf-8') as file:
json.dump(merged_data, file, ensure_ascii=False, indent=4)
print("Combined data saved to", output_filepath)
# νμΌ κ²½λ‘ μ€μ
#point_filepath = 'sgg_menhos_point_4326.geojson'
#multipolygon_filepath = 'sgg_menhos_4326.geojson'
#output_filepath = 'sgg_menhos_combined_4326.geojson'
point_filepath = './mhc/sgg_mhc_4326_point.geojson'
multipolygon_filepath = './mhc/sgg_mhc_4326.geojson'
output_filepath = './mhc/sgg_mhc_combined_4326.geojson'
# λ³ν© ν¨μ νΈμΆ
merge_geojson(point_filepath, multipolygon_filepath, output_filepath)
κ·Έ κ²°κ³Ό properties μμ μ€μ¬μ (lat,lng)κ³Ό μ§μ μ 보λ₯Ό νλ²μ λ΄μ λ€μκ³Ό κ°μ λ°μ΄ν°λ₯Ό λ§λ€μ΄λΌ μ μμλ€.
{
"type": "FeatureCollection",
"name": "sgg_mhc_4326_fin",
"crs": {
"type": "name",
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
},
"features": [
{
"type": "Feature",
"properties": {
"sgg_cd": "11010",
"sgg_nm": "μ’
λ‘ꡬ",
"sd_nm": "μμΈνΉλ³μ",
"pro_num": 12,
"gen_num": 5,
"etc_num": 0,
"pop_rate": 8.6,
"pop_rate2": 12.2,
"pro_rate": 70.59,
"sum": 17,
"lat": 37.59499549178458,
"lng": 126.97717256203838
},
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[
126.97496550662665,
37.62902584632239
],
[
126.9799325416429,
37.628551385741844
],
[
126.98657858922684,
37.613972040206576
],
[
126.98666961211083,
37.60402408418873
],
[
126.97672044866303,
37.59790077341985
],
[
126.98922200523597,
37.591257335444396
],
[
127.00098383034926,
37.592321896606414
],
[
127.00863797076892,
37.580459930712074
],
[
127.01483334226205,
37.58233145639781
],
[
127.01809067213802,
37.57756672682708
],
[
127.02313849528697,
37.5780208790036
],
[
127.02335824789148,
37.571907275493935
],
[
126.99015096691139,
37.56813614090069
],
[
126.97320520035349,
37.56931893939149
],
[
126.96669770508642,
37.565819760343544
],
[
126.95355819487978,
37.578748855890005
],
[
126.95817316711567,
37.580984573579705
],
[
126.95903333886244,
37.59505902184067
],
[
126.95771415697908,
37.598367077095006
],
[
126.95306109197757,
37.59875862893543
],
[
126.94900026132089,
37.62433513391512
],
[
126.95864765352961,
37.62950023565587
],
[
126.96072374569643,
37.629776396868195
],
[
126.97508476644904,
37.63118349820025
],
[
126.97496550662665,
37.62902584632239
]
]
]
]
}
},
...
}
μ§λ κ°λ°
μ΄λ¬ν λ°μ΄ν°λ₯Ό λ°νμΌλ‘ μ§λλ₯Ό κ°λ°νλ κ²μ ν¬κ² μ΄λ ΅μ§ μμλ€!
리νλ μΈ‘μμ λμμ΄ λλ μΉμ ν API λ€μ λ§μ΄ μ 곡ν΄μ£Όκ³ μμκΈ° λλ¬Έμ΄λ€.
.geojson ννμ λ°μ΄ν° μλ£λ₯Ό 리νλ Map API μ μ λ¬νλ©΄ μ΄λ₯Ό μμμ ν΄μν΄μ μ§λμμ μ§μ κ²½κ³λ₯Ό κ·Έλ €μ€λ€.
<GeoJSON
style={mapStyle}
data={geoJsonData}
onEachFeature={onEachDistrict}
/>
const SelectBox = () => {
const [selectedSiDo, setSelectedSiDo] = useState('');
const [selectedSiGunGu, setSelectedSiGunGu] = useState('');
const SiDoOptions = [
...new Set(geoJsonData.map((district) => district.properties.sd_nm)),
].sort();
// index μΆκ°ν κ°μ²΄ λ°°μ΄
const SiDoOption = SiDoOptions.map((district, index) => ({
value: index,
label: district,
}));
// μ νν μλμ μΌμΉνλ μꡰꡬ λͺ©λ‘ μΆμΆ
const SiGunGuOptions = geoJsonData.filter(
(district) => district.properties.sd_nm === selectedSiDo
);
// unique ν μꡰꡬ λͺ©λ‘ μΆμΆ
let SiGunGuOption = [
...new Set(SiGunGuOptions.map((district) => district.properties.sgg_nm)),
].sort();
SiGunGuOption = SiGunGuOption.map((district, index) => ({
value: index,
label: district,
}));
useEffect(() => {
const searchResults = geoJsonData.filter(
(district) =>
district.properties.sd_nm === selectedSiDo &&
district.properties.sgg_nm === selectedSiGunGu
);
if (searchResults.length) {
// κ²μ κ²°κ³Όκ° μ‘΄μ¬νλ€λ©΄
setSiDoName(searchResults[0].properties.sd_nm);
setSiGunGuName(searchResults[0].properties.sgg_nm);
setPercentage(searchResults[0].properties.pro_rate);
setProCnt(searchResults[0].properties.pro_num);
setGenCnt(searchResults[0].properties.gen_num);
setEtcCnt(searchResults[0].properties.etc_num);
setSearchPosition({
lat: searchResults[0].properties.lat,
lng: searchResults[0].properties.lng,
});
}
}, [selectedSiGunGu]);
// κ° μ§μ λλ λ μ΄μ΄μ λν νΉμ± μ€μ
const onEachDistrict = (district, layer) => {
layer.options.fillColor = getColor(district.properties.pro_rate); // μ μ κ±΄κ° μ λ¬Έ μμ λΉμ¨(0κ³Ό 100 μ¬μ΄μ κ°)μ λ°λ₯Έ λ μ΄μ΄ μ μ€μ
const sido = district.properties.sd_nm;
const sigungu = district.properties.sgg_nm;
const percentage = district.properties.pro_rate; // μ μ κ±΄κ° μ λ¬Έ μμ λΉμ¨
const pro_num = district.properties.sum; // λ μ΄μ΄μ μ λ¬Έ μμ μ
const gen_num = district.properties.gen_num;
const etc_num = district.properties.etc_num;
const clickedLat = district.properties.lat; // λ μ΄μ΄μ lat μ€μ
const clickedLng = district.properties.lng; // λ μ΄μ΄μ lng μ€μ
layer.on({
mouseover: highlightFeature,
mouseout: resetHighlight,
click: (e) => {
L.DomEvent.stopPropagation(e); // λ€λ₯Έ μ΄λ²€νΈμ μΆ©λ λ°©μ§
setSiGunGuName(sigungu);
setSiDoName(sido);
setPercentage(percentage);
setProCnt(pro_num);
setGenCnt(gen_num);
setEtcCnt(etc_num);
setSearchPosition({ lat: clickedLat, lng: clickedLng }); // κ²μμμΉ μ€μ
},
});
}
// κ²μν μ§μ μμΉλ‘ μ§λ μ΄λ, λ§μ»€λ‘ νμ
const SearchMarker = () => {
const map = useMap();
// νλ©΄μμ ν΄λ¦ν μ’νλ‘ μ€μ¬μ μ΄λ
console.log(searchPosition.lat, searchPosition.lng);
map.setView([searchPosition.lat, searchPosition.lng], 10);
// positionμ΄ nullκ°μ΄λ©΄ λ§μ»€λ₯Ό νμνμ§ μκ³ , nullκ°μ΄ μλλ©΄ λ§μ»€λ₯Ό 보μ¬μ€λ€
return <Marker position={searchPosition} icon={icon} />;
};
κ³Όμ
κΈ°νλλ‘ κ°λ°ν μ΄ν, κΈ°νμλκ» μ€νμ, CSS, λ΄μ© λ³κ²½ λ± μ§μμ μΌλ‘ νΌλλ°±μ λ°μ μμ μ κ±°μΉλ μμ μ λ°λ³΅νμλ€.
μ΄ κ²°κ³Όλ¬Ό
λ€μμ μΈμ£Ό κ°λ° μ΄ κ²°κ³Όλ¬Όμ΄λ€!
https://interactive-web-gules.vercel.app/#/
κΈ°ν μꡬ μ¬ν
- openGraph νκ·Έλ₯Ό μ΄μ©ν μΈλ€μΌ μ€μ
- λͺ¨λ°μΌ μ μν
νκΈ°
μ΄μ©λ©΄ μ§λ¦¬μ κ°λ°μ μ΅ν©νλ, νμμ μμ£Όνμ§ μλ μ΅μνμ§ μμ λΆμΌμ μΉ κ°λ°μ΄μλ€κ³ μκ°νλ€.
κ·Έλ¬λ μ€κ°μ€κ° μκΈ°λ λ¬Έμ μν©λ€μ μμΈμ μ μ°Ύμμ ν΄κ²°νκ³ , κ³Όκ±°λ³΄λ€ λ§μ΄ μ±μ₯ν λ΄ μμ μ νμΈν μ μλ κ² κ°λ€!
무μλ³΄λ€ κΈ°νμ λΆκ³Όμ μΌλ―Έκ° μ λ§ μ’μλ κ² κ°λ€! γ γ λλΆμ μΈμ£Ό μμ μ΄μ§λ§ λΆλ΄ λλΌμ§ μκ³ νΈνκ² μμ ν μ μμλ€!
κ°λ°μ λ§μΉκ³ νλ¬ μ λκ° μ§λ¬μκΉ? κΈ°νμ λΆκ» μ°λ½μ΄ μλλ° μ λ§ κΈ°μκ²λ μμμ νμ ¨λ€κ³ νλ€! μμμΉ λͺ»νκ² κΈ°μμΌμ΄ μκ²Όκ³ κ΅μ₯ν λΏλ―ν κ²½νμ΄μλ€. λ°₯μ μ¬μ£Όμ λ€κ³ νμ μ μ΄νμ μ°λ¨λμμ λ§μλ μ°μ΄μ§μ κ°μ λ¨Ήμλ€. γ γ π