Sentry๋ ์ค์๊ฐ ์ค๋ฅ ์ถ์ ์์คํ ์ผ๋ก, ์น์ฌ์ดํธ, ๋ชจ๋ฐ์ผ ์ฑ, ๊ฒ์ ๋ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ํ๋ ์๋ฌ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ๋ถ์ํด์ฃผ๋ ๋๊ตฌ์ ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๋ฌธ์ ๋ฐ์์ ์ฆ๊ฐ์ ์ผ๋ก ์ธ์งํ๊ณ , ๋น ๋ฅด๊ฒ ํด๊ฒฐํ ์ ์์ด ์๋น์ค ํ์ง์ ํฅ์์ํค๋ ๋ฐ ํฐ ๋์์ ์ค๋๋ค.
Sentry ์ฌ์ฉ์ ์ฃผ์ ์ฅ์ ๐
1. ์ค์๊ฐ ์ค๋ฅ ๋ชจ๋ํฐ๋ง
์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์ฆ์ ์๋ฆผ์ ๋ฐ์ ์ ์์ด, ์ฆ๊ฐ์ ์ธ ๋์์ด ๊ฐ๋ฅํฉ๋๋ค.
2. ์์ธํ ์๋ฌ ๋ฆฌํฌํธ
์๋ฌ ๋ฐ์ ์์ ์ ์คํ ํธ๋ ์ด์ค(stack trace)์ ํจ๊ป, ์๋ฌ๊ฐ ๋ฐ์ํ ํ๊ฒฝ ์ ๋ณด(์ด์์ฒด์ , ๋ธ๋ผ์ฐ์ , IP, OS ๋ฑ)๋ฅผ ์ ๊ณตํ์ฌ ์๋ฌ๋ฅผ ๋น ๋ฅด๊ฒ ํ์
ํ๊ณ ๋์ํ ์ ์์ต๋๋ค.
3. ๋ฆด๋ฆฌ์ฆ ์ถ์
Sentry๋ ๋ฆด๋ฆฌ์ฆ ๋ฒ์ ์ ์ถ์ ํ์ฌ ์ด๋ ๋ฒ์ ์์ ์๋ฌ๊ฐ ๋ฐ์ํ์๋์ง ํ์
ํ๋๋ฐ ๋์์ ์ค๋๋ค.
4. ํ์๊ณผ์ ํ์
์๋ฌ๋ฅผ ํ์๊ณผ ๊ณต์ ํ๊ณ , ์๋ฌ ์ฒ๋ฆฌ ์ํฉ์ ์
๋ฐ์ดํธํ์ฌ ํ์๋ค์ด ํ์ฌ ์ํฉ์ ์ฝ๊ฒ ํ์
ํ ์ ์๋๋ก ๋์ต๋๋ค.
Sentry์ ๋จ์ ๐ญ
1. ๋น์ฉ
Sentry๋ ๋ฌด๋ฃ ํ๋์ ์ ๊ณตํ์ง๋ง, ๋ฌด๋ฃ ํ๋์ ์ผ์ ์์ค์ ์๋ฌ ๋ณด๊ณ ๋ง ๊ฐ๋ฅํ๊ณ , ๋ณด๊ณ ๋์ด ๋ง์์ง์๋ก ๋น์ฉ์ด ์ฆ๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ๋๊ท๋ชจ ํ๋ก์ ํธ์์๋ ๋น์ฉ ๋ถ๋ด์ด ํด ์ ์์ต๋๋ค.
2. ๋ณต์ก์ฑ
Sentry๋ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ์ด๋ฅผ ์ต๋ํ ํ์ฉํ๊ธฐ ์ํด์๋ ์๊ฐ์ ๋ค์ฌ Sentry๋ฅผ ์ดํดํ๊ณ ์ค์ ํด์ผ ํฉ๋๋ค. ์ด๋ ํนํ Sentry๋ฅผ ์ฒ์ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์์๊ฒ๋ ๋ถ๋ด์ด ๋ ์ ์์ต๋๋ค.
3. ๋ฐ์ดํฐ ๋ณด์
Sentry๋ ์๋ฌ ์ ๋ณด๋ฅผ ํด๋ผ์ฐ๋์ ์ ์ฅํ๋ฏ๋ก, ์ค์ํ ๋ฐ์ดํฐ๊ฐ ์ธ๋ถ์ ๋
ธ์ถ๋ ์ ์๋ ์ํ์ด ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Sentry๋ ๋ฐ์ดํฐ ๋ณด์์ ์ํ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ์ด๋ฅผ ์ค์ ํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ฌ์ฉ์์ ์ฑ
์์
๋๋ค.
4. ์ค์๊ฐ ๋ชจ๋ํฐ๋ง ํ๊ณ
Sentry๋ ์ค์๊ฐ์ผ๋ก ์๋ฌ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ๋ณด๊ณ ํ์ง๋ง, ์ด๋ ์๋ฒ ์ํ๋ ์ธํ๋ผ ๋ฌธ์ ๋ฑ ๋ชจ๋ ์ข
๋ฅ์ ๋ฌธ์ ๋ฅผ ํ์
ํ๋ ๊ฒ์ ์๋๋๋ค. ๋ฐ๋ผ์ Sentry๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํด์ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ๊ฑฐ๋ ํด๊ฒฐํ ์ ์๋ ๊ฒ์ ์๋๋๋ค.
* ํด๋น ๋ฐฉ๋ฒ์ Angular Framework(Version 9)์ ์ ์ฉํ์ฌ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
npm install npm install @sentry/angular@^6 @sentry/browser^6 @sentry/integrations^6
์์๊ฐ์ด install์ ์งํํ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด package.json์ ์์ฑ๋ฉ๋๋ค.
"@sentry/angular": "^6.19.7",
"@sentry/browser": "^6.19.7",
"@sentry/integrations": "^6.19.7",
์ฐ์ Sentry๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด์ ๊ฐ์ธ DSN์ ์๊ณ ์์ด์ผ ํฉ๋๋ค.
Angular ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ฉด์ ํ๋ก๋์ ํ๊ฒฝ์์ ๋ฐ์ํ๋ ์๋ฌ๋ฅผ ์ ์ํ๊ฒ ๊ฐ์งํ๊ณ ๋ชจ๋ํฐ๋งํ๋ ค๋ฉด Sentry๋ฅผ ํตํ ์๋ฌ ํธ๋ํน์ ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ฅผ ์ํด์๋ main.ts ํ์ผ์์ Sentry๋ฅผ ์ด๊ธฐํํด์ฃผ์ด์ผ ํฉ๋๋ค. ์๋๋ ์ด๊ธฐํ ๊ณผ์ ์ ๋ด์ ์์ ์ฝ๋์ ๋๋ค.
// main.ts
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
// Sentry SDK ์ค์น
import * as Sentry from '@sentry/angular';
import { Angular as AngularIntegration } from '@sentry/integrations';
if (environment.production) {
// Sentry ์ด๊ธฐํ
Sentry.init({
dsn: 'YOUR_SENTRY_DSN', // Sentry ๊ณ์ ์์ ๋ฐ๊ธ๋ฐ์ DSN ์
๋ ฅ
// ๊ธฐํ ์ต์
์ค์ ๊ฐ๋ฅ
});
enableProdMode();
}
platformBrowserDynamic().bootstrapModule(AppModule)
.catch(err => console.error(err));
์ด ์์ ์ฝ๋์์๋ environment.production์ด true์ผ ๋๋ง Sentry๋ฅผ ์ด๊ธฐํํ๋๋ก ์ค์ ๋์ด ์์ต๋๋ค. ์ด๋ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ Sentry๋ฅผ ์ด๊ธฐํํ์ง ์๊ณ , ํ๋ก๋์ ํ๊ฒฝ์์๋ง ํ์ฑํ๋๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ๋ํ, Sentry์ ๊ณ์ ์ ์์ฑํ๊ณ ํ๋ก์ ํธ๋ฅผ ๋ฑ๋กํ ํ์ ๋ฐ๊ธ๋ฐ์ DSN์ YOUR_SENTRY_DSN ๋ถ๋ถ์ ์ ๋ ฅํด์ฃผ์ ์ผ ํฉ๋๋ค.
๊ฐ๋ฐ ํ๊ฒฝ์์ Sentry๋ฅผ ํ ์คํธํ๊ธฐ ์ํด์ if๋ฌธ ๋ฐ์์ Sentry๋ฅผ ์ด๊ธฐํ ์์ผ์ฃผ์๋ฉด ๋ฉ๋๋ค.
์ด๋ ๊ฒ ์ค์ ํ๋ฉด Angular ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋ Sentry๊ฐ ์ด๊ธฐํ๋์ด ๋ชจ๋ ์๋ฌ๋ฅผ ๊ฐ์งํ๊ณ Sentry ์๋ฒ๋ก ์ ์กํ ์ ์๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ํ๋ก๋์ ํ๊ฒฝ์์ ๋ฐ์ํ๋ ์์ธ ์ํฉ์ ๋น ๋ฅด๊ฒ ํ์ ํ๊ณ ๋์ํ ์ ์์ต๋๋ค.
// main.component.html
<button (click)="createNewError()">Sentry Error Log Test</button>
// main.compoent.ts
import * as Sentry from '@sentry/angular';
createNewError() {
alert('Sentry Error Log Test...');
throw new Error('Sentry Error Log Test...');
// ์ง์ Sentry๋ก Error๋ฅผ ๋ณด๊ณ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ
Sentry.captureException(error)
}
์์ ๊ฐ์ด ์ค์ ํ ํ ๋ฒํผ์ ํด๋ฆญํ๊ฒ ๋๋ฉด
์์ ๊ฐ์ด Sentry์ Error ๋ก๊ทธ๊ฐ ๋จ๋๊ฒ์ ํ์ธํ์ค ์ ์์ต๋๋ค.
์ด์ธ์๋ ์ง์ Error๋ก๊ทธ๋ฅผ ๋ณด๋ด๊ณ ์ถ์ ๊ฒฝ์ฐ captureException๋ผ๋ Sentry์์ ์ ๊ณตํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.
Sentry๋ Front-End ๊ฐ๋ฐ์๋ค์ด ์ ํ๋ฆฌ์ผ์ด์
์ ์๋ฌ์ ์ฑ๋ฅ ์ด์๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ๋๋ฒ๊น
ํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ์
๋๋ค.
์๋๋ Sentry์์ Front-End ๊ฐ๋ฐ์๋ค์ด ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ์ฃผ์ ๊ธฐ๋ฅ์
๋๋ค.
โ
์๋ฌ ํธ๋ํน:
Sentry๋ ์๋์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ฐ์ํ ์๋ฌ๋ฅผ ํธ๋ํนํ์ฌ ๋์๋ณด๋์์ ์ธ๋ถ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋๋ก ๋์์ค๋๋ค.
โ
์ค์๊ฐ ์๋ฆผ:
Sentry๋ ์๋ฌ๊ฐ ๋ฐ์ํ ๋ ์ค์๊ฐ์ผ๋ก ์๋ฆผ์ ์ ๊ณตํ์ฌ ๋น ๋ฅด๊ฒ ๋์ํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋๋ก ๋์์ค๋๋ค.
โ
์ฑ๋ฅ ๋ชจ๋ํฐ๋ง:
์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ ์ด์๋ฅผ Sentry์์ ๋ชจ๋ํฐ๋งํ์ฌ ํ์ด์ง ๋ก๋ฉ ์๊ฐ, API ํธ์ถ ์๊ฐ ๋ฑ์ ์ฑ๋ฅ ์งํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
โ
์ธ์
ํธ๋ํน:
Sentry๋ ์ฌ์ฉ์ ์ธ์
์ ํธ๋ํนํ์ฌ ํน์ ์ฌ์ฉ์๊ฐ ๊ฒช๋ ๋ฌธ์ ๋ฅผ ์ดํดํ๊ณ ๋๋ฒ๊น
ํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
โ
ํ๊ฒฝ ๊ตฌ๋ถ:
๋ค์ํ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋ ๋ Sentry๋ ์๋ฌ๋ฅผ ๊ตฌ๋ถํ๊ณ ํธ๋ํนํ์ฌ ๊ฐ๋ฐ, ์คํ
์ด์ง, ํ๋ก๋์
๋ฑ์์ ๋ฐ์ํ ์๋ฌ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
โ
์ฌ์ฉ์ ํผ๋๋ฐฑ ์์ง:
Sentry๋ ์ฌ์ฉ์๋ค๋ก๋ถํฐ ๋ฐ์ํ ์๋ฌ์ ๋ํ ํผ๋๋ฐฑ์ ์์งํ์ฌ ๊ฐ์ ์ ํ์ฉํ ์ ์๋๋ก ๋์์ค๋๋ค.
โ
Integrations:
Sentry๋ ๋ค์ํ ํตํฉ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ๋ค๋ฅธ ๊ฐ๋ฐ ๋๊ตฌ์ ์ฐ๋ํ ์ ์์ต๋๋ค.
โ
์์ฑ ๋ฐ ๋ผ๋ฒจ๋ง:
Sentry์์๋ ์๋ฌ์ ๋ํด ์์ฑ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ผ๋ฒจ์ ์ง์ ํ์ฌ ํจ๊ณผ์ ์ผ๋ก ๋ถ๋ฅํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
Sentry๋ฅผ ํ์ฉํ๋ฉด ๊ฐ๋ฐ์๋ค์ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๊ณ ์ง์์ ์ผ๋ก ๊ฐ์ ํ ์ ์์ต๋๋ค.
์ด ๋๊ตฌ๋ ๋น ๋ฅด๊ณ ์ ํํ ๋๋ฒ๊น
์ ๊ฐ๋ฅ์ผํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ๋ฐ ํฐ ๋์์ด ๋ฉ๋๋ค. Front-End ๊ฐ๋ฐ์๋ก์ Sentry๋ฅผ ์ ๊ทน ํ์ฉํ์ฌ ๋์ ํ์ง์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ๊ณตํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ถ๊ฐ์ ์ผ๋ก ์ ์ฉํ ๊ธฐ๋ฅ
์ ์์์ ์ฐธ๊ณ ํ๋ค๋ฉด ๊ฐ๋ฐ์๊ฐ ์ด๋ป๊ฒ ๋ฐ์ํ Error์ธ์ง ์ ๋ชจ๋ฅผ ๊ฒฝ์ฐ ์ ์ฉํ๊ฒ Error๋ฅผ ์บ์นํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ผ ๊ฒ ๊ฐ๋ค.