νμ¬ λ§λ€κ³ μλ μλΉμ€μ λͺ©μ μ 보μ λ°μ΄ν°λ₯Ό μ μ μκ² λ³΄μ¬μ£Όλ κ²μ΄λ€.
κ°λ° μ΄κΈ°μλ μ΄λ κ² λ°μ΄ν°κ° ν΄μ§ λͺ¨λ₯΄κ³ , κ°λ¨νκ² λ§λ€μ΄λ³΄κ³ μ λͺ¨λ λ°μ΄ν°λ₯Ό νλ‘ νΈλ¨μ λͺ¨λ λκ³ κ°λ°μ μμνλ€. (μ²μμλ 100λ©κ° μ λμλ€...)
μ΄λμ λ λ§λ ν, μλ‘μ΄ λ°μ΄ν°λ₯Ό μ£Όμκ³ λ벨λ‘νμ΄μΌ νλλ°, λ°μ보λ κ±°μ 2.8κΈ°κ°μλ€λ...γ γ γ γ γ
λΉμ°ν μλλ λ릴 μλ°μ μλ μμ²λ λ°μ΄ν°μλ€..^^;; geoJSONμ κ²λ,,, κ²λ 컀,,,,,,,,,,
μ΄λ° λ°μ΄ν°λ₯Ό μ²λ¦¬ν΄ λ³Έ μ μ΄ μμΌλ μ’ λΉν©μ€λ¬μμ μλ‘μ΄ λ°©μμ κ³ λ―Όν΄λ³΄κΈ° μμνλ€.
1. λ°±μ€λ λμ
λΉμ°ν κ°μ₯ μ²μ μκ°νλ κ²μ λ°±μ€λ λμ μ΄μλ€. μ΄λ―Έ κΈ°μ‘΄ μ½λλ₯Ό node.jsλ‘ λ§λ€μμΌλ, λ°±μ€λλ node.jsλ‘ λ§λ€λ©΄ μΌλ§ μ걸릴 κ²μ΄λΌλ μκ°κ³Ό, docker νκ²½μ μ΄λ―Έ λμ νλ©΄μ server.jsλ₯Ό ꡬμ±ν΄λμκΈ°μ μ΄λ ΅μ§ μκ² κ΅¬μ±ν μ μμΌλ¦¬λΌ μκ°νλ€. μ€μ λ‘ nodeλ‘ λ°±μ€λ ꡬμ±μ μ²μμ΄μλλ°λ 1μκ° λ΄λ‘ μμ±νλ€. μλλ server.js λ΄μ ꡬμ±ν μ½λ
app.get('/api/geojson', (req, res) => {
const { scenario, hazardtype } = req.query;
try {
// νν°λ§ λ‘μ§
const filteredData = geoJsonData.features.filter(feature => {
const matchesScenario = scenario ? feature.properties.scenario === scenario : true;
const matchesHazardType = hazardtype ? feature.properties.hazard_type.toLowerCase() === hazardtype.toLowerCase() : true;
return matchesScenario && matchesHazardType;
});
res.json({
type: 'FeatureCollection',
features: filteredData,
});
} catch (error) {
console.error('Error filtering geoJSON data:', error);
res.status(500).json({ message: 'Server error' });
}
});
κ·Έλ¬λ ...
μ΄μ κ³Ό λ€λ₯Ό λ° μλ μ²λ¦¬ μλ...!!! κ±°μ 0.9μ΄μμ 1μ΄ μ λ 걸리λλ°, 체κ°μ 1λΆμ΄μμ. μλλ©΄...γ γ
DBλμ
κΉμ§ ν λ§ν λ°μ΄ν°λ λ μλλΌκ³ μκ°ν΄μ DBλ₯Ό ꡬμΆνμ§ μμλλ°, (μ¦, λ°μ΄ν°λ νλ‘ νΈλ¨μ μλκ±°μ)
μ¬μ€μ κ·Έλ λ€λ©΄ ν¬κ² μλ―Έκ° μλ€λ κ²μ΄λ€.
λ¬λΌμ§ μ μ λΌλμ€ λ²νΌ ν΄λ¦μ΄ λΉ λ₯΄λ€λ κ²? γ γ νλ‘ νΈμμ νν°λ§ν΄μ κ°μ Έμ¬λλ λ°μ΄ν° μ²λ¦¬κ° μλ£λ μ΄νμ λΌλμ€ λ²νΌμ΄ λλ Έλλ°, μ΄μ λ°μ΄ν° μ²λ¦¬ μ체λ λ°±μ€λμμ λ΄λΉνλ, λΌλμ€ λ²νΌ μ²λ¦¬ λ‘μ§λ§ μννλ νλ‘ νΈλ λΉ λ₯΄κ² μ΄ κ³Όμ μ μνν μ μκ² λμλ€.
γ γ .. μ§μ§ μλ―Έ μλ€λ λ§μ νλκ±°μ....................
κ·Έλμ κ³ λ―ΌνκΈ° μμνλ€.
ν... DBλ₯Ό μ§μ§ ν΄...?
κ·Έλ¬λ€ λ¬Έλ λ€νΈμν¬ νμ 보λ€κ° νν°λ§ νλ λ‘μ§μ λ°λ³΅μ μΌλ‘ νκ³ μλ€λ μ¬μ€μ μκ² λμλ€. μ κ·Έλ¬λ©΄ νν°λ§νλ κ±Έ ν λ²λ§ νλ©΄ μλλ? κ·Έλμ λ°λ‘ μΊμ±μ΄ λ μ¬λΌμ μ΄λ₯Ό λ¨Όμ ν΄λ³΄κ³ μ νλ€. μμ£Όμμ£Ό λΉ λ₯Έ μλκΉμ§ νμν κ²μ μλκ³ , MVPλ₯Ό λ§λλκ² λͺ©μ μ΄κΈ° λλ¬Έμ.
2. μΉ μ컀μ μΊμ±
2.1 μΉμ컀
λ¨Όμ μΉ μ컀λ₯Ό μ¬μ©ν΄μ λ°μ΄ν° νν°λ§ μμ μ λ©μΈ μ°λ λμμ λΆλ¦¬νλ€. μΉ μ컀λ λ©μΈ μ°λ λμ λ³λλ‘ λ°±κ·ΈλΌμ΄λμμ μ€νλλ μλ°μ€ν¬λ¦½νΈ μ½λλ‘μ, 볡μ‘ν κ³μ° λ° λ°μ΄ν° μ²λ¦¬ μμ μ λ°±κ·ΈλΌμ΄λμμ μνν΄μ€λ€. μ΄ μ½λλ₯Ό μ¬μ©ν¨μΌλ‘μ¨ λ©μΈ μ€λ λμ μ μ μΈν°νμ΄μ€ λ° μνΈμμ©μ μν₯μ μ€μΈλ€. κ·Έλμ λΆ-νΈνκ² λκ»΄μ‘λ λΌλμ€ λ²νΌ λ©μΆ€, λλ¦° μλ΅ λ±μ΄ κ°μ λ μ μλ κ²μ΄λ€.
worker.js μ½λλ₯Ό λ€μκ³Ό κ°μ΄ μμ±νλ€.
onmessage = function(e) {
const { data, scenario, hazardtype } = e.data;
const filteredData = data.features.filter(feature => {
const matchesScenario = scenario ? feature.properties.scenario === scenario : true;
const matchesHazardType = hazardtype ? feature.properties.hazard_type.toLowerCase() === hazardtype.toLowerCase() : true;
return matchesScenario && matchesHazardType;
});
postMessage({ type: 'FeatureCollection', features: filteredData });
};
κ·ΈλΌ μΉ λΈλΌμ°μ λ μ΄λ€ μ°λ λλ€λ‘ ꡬμ±λμ΄ μμκΉ? μΉ λΈλΌμ°μ μ μ£Όμ μ°λ λ ꡬμ±μ λ€μκ³Ό κ°λ€.
- λ©μΈ μ°λ λ (Main Thread)
- μν : μλ°μ€ν¬λ¦½νΈ μ€ν, DOM μ‘°μ, μ€νμΌ κ³μ°, λ λ νΈλ¦¬ μμ± λ° λ μ΄μμ κ³μ°, νμΈν λ±
- νΉμ§: λΈλΌμ°μ μ UI μ λ°μ΄νΈ λ° μ¬μ©μ μνΈμμ© μ²λ¦¬λ₯Ό λ΄λΉν©λλ€. λ¨μΌ μ°λ λλ‘ μλνλ©°, μ΄λ‘ μΈν΄ λΈλ‘νΉ μμ μ΄ λ°μν μ μμ΅λλ€.
- λ λλ¬ νλ‘μΈμ€ (Renderer Process)
- μν : μΉ νμ΄μ§μ λͺ¨λ μ½ν μΈ λ₯Ό λ λλ§ν©λλ€. HTML, CSS νμ±, μλ°μ€ν¬λ¦½νΈ μ€ν, λ μ΄μμ κ³μ°, νμΈν λ±μ ν¬ν¨ν©λλ€.
- νΉμ§: μΌλ°μ μΌλ‘ κ° νλ§λ€ νλμ λ λλ¬ νλ‘μΈμ€λ₯Ό κ°μ§λλ€. λ©μΈ μ°λ λμ νλ ₯νμ¬ μμ μ μνν©λλ€.
- μ»΄ν¬μ§ν° μ°λ λ (Compositor Thread)
- μν : λ μ΄μ΄λ₯Ό λ³ν©νκ³ GPUμ μ λ¬νμ¬ μ΅μ’ νλ©΄μ λ λλ§ν©λλ€.
- νΉμ§: νμ΄μ§μ μ€ν¬λ‘€λ§ λ° μ λλ©μ΄μ μ λΆλλ½κ² μ²λ¦¬ν©λλ€.
- μΉ μ컀 μ°λ λ (Web Worker Thread)
- μν : λ°±κ·ΈλΌμ΄λ μμ μ μνν©λλ€. 볡μ‘ν κ³μ°μ΄λ λ°μ΄ν° μ²λ¦¬ μμ μ λ©μΈ μ°λ λμ λΆλ¦¬νμ¬ μ€νν©λλ€.
- νΉμ§: λ©μΈ μ°λ λμ λ 립μ μΌλ‘ λμνλ©°, λ©μμ§λ₯Ό ν΅ν΄ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μ΅λλ€.
- λ€νΈμν¬ μ°λ λ (Network Thread)
- μν : λ€νΈμν¬ μμ²μ μ²λ¦¬ν©λλ€. HTTP μμ², μΉμμΌ μ°κ²° λ±μ λ΄λΉν©λλ€.
- νΉμ§: λΉλκΈ°μ μΌλ‘ λ€νΈμν¬ μμ μ μννμ¬ λ©μΈ μ°λ λλ₯Ό μ°¨λ¨νμ§ μμ΅λλ€.
- νμΌ IO μ°λ λ (File IO Thread)
- μν : νμΌ μμ€ν μ κ·Όμ μ²λ¦¬ν©λλ€. νμΌ μ½κΈ°, μ°κΈ° λ±μ λ΄λΉν©λλ€.
- νΉμ§: λΉλκΈ°μ μΌλ‘ νμΌ μμ μ μννμ¬ λ©μΈ μ°λ λλ₯Ό μ°¨λ¨νμ§ μμ΅λλ€.
μ΄μ λ°μ΄ν° μ²λ¦¬λ λλ¬μΌλ, μ΄λ κ² λ°μ΄ν° μ²λ¦¬κ³Όμ μ λ°λ³΅νμ§ μλλ‘ ν΄μ λ‘λ© μλλ₯Ό λμ¬λ³΄μ.
2.2 μΊμ±
λ€μκ³Ό κ°μ΄ cache.jsλ₯Ό ꡬμ±νλ€. μΊμλ₯Ό μ¬μ©νλ©΄ μ΄λ¬ν νν°λ§ μμ μ κ° μλ리μ€λ³λ‘ ν λ²μ©λ§ μννλ©΄ μ΄νμλ λ€μ μννμ§ μμλ λλ κ²μ΄λ€.
const cache = new Map();
export function getCachedData(key) {
return cache.get(key);
}
export function setCachedData(key, data) {
cache.set(key, data);
}
2.3 νλ‘ νΈμμ μ μ©
μΊμμ μΉ μ컀λ₯Ό νλ‘ νΈμμ μ μ©νλ€. λ§μ½ μΊμ±λ λ°μ΄ν°κ° μμΌλ©΄ λ°±μ€λμμ νν°λ§ ν ν΄λΌμ΄μΈνΈλ‘ μ μ‘νκ³ , μ΄λ₯Ό μΉμμ»€κ° λ°μ νν°λ§ λ± μΆκ°μ μΈ μμ μ μννλ€. μ΄λ° λ°μ΄ν°λ₯Ό μΊμ±νμ¬ λμΌν μμ² μμ λΉ λ₯΄κ² μλ΅νκ² ν΄μ€λ€.
μ¬μ€ μ¬κΈ°μ λ°±μ€λμμ μ½μ΄μ€λκ² νμ¬ μν©μμλ κ΅³μ΄ νμνμ§ μμ μ μμ§λ§, νμ₯μ±μ μν΄ κ·Έλ₯ λ¨κ²¨λλ€.
import { getCachedData, setCachedData } from './cache.js'
const worker = new Worker('worker.js');
const cacheKey = `${scenario}:${selectedHazardType.toLowerCase()}`;
const cachedData = getCachedData(cacheKey);
if (cachedData) {
console.log('Using cached data');
processFilteredData(cachedData)
}else{
fetch(`http://localhost:5001/api/geojson?scenario=${encodeURIComponent(scenario)}&hazardtype=${encodeURIComponent(selectedHazardType.toLowerCase())}`)
.then(response => {
if (!response.ok) {
console.error('Error fetching filtered geoJSON data:', response.statusText);
return;
}
return response.json();
})
.then(geoJsonData => {
console.log('Filtered Data:', geoJsonData);
if (geoJsonData.features.length === 0) {
console.log('No features found for scenario:', scenario, 'and hazard type:', selectedHazardType);
return;
}
worker.postMessage({ data: geoJsonData, scenario, hazardtype: selectedHazardType.toLowerCase() });
worker.onmessage = function(e) {
setCachedData(cacheKey, e.data);
processFilteredData(e.data); };
worker.onerror = function(e) {
console.error('Error processing data in worker:', e);
};
});
}
}
... μ¬μ€ νλ‘ νΈλ κ±°μ λͺ¨λ₯΄λ μνλ‘ κ°λ°μ μμνλλ°, κ³ λ €ν λΆλΆμ΄ μ λ§ λ§λ€λ κ±Έ λλΌκ³ μλ€... μμ νλ©΄μ λ°°μ°λκΉ μΌλ° γ γ γ