항해14기 본과정/항해14기 개발일지

[항해 14기] 개발일지33 (미니 프로젝트 - Sentry, 디자인 패턴 - 어댑터)

스쿼트잘함 2023. 5. 11. 09:43

미니프로젝트 주차 + 디자인 패턴 스터디

 

1. Sentry

1) Sentry

- 코드의 오류를 식별하고 분류하는데 도움이 되는 외부 모니터링 및 에러 로깅 서비스를 제공
- 코드 상에서 errorHandler를 통해 특정 error code(404, 500) 들을 에러로 식별 가능

- Sentry website에서 에러 로그 정보를 조회할 수 있고, DSN주소로 나의 코드와 웹사이트를 연동

 

2) DSN

- DSN은 "Data Source Name"의 약어, 데이터 소스에 대한 연결 정보를 식별하기 위해 사용되는 문자열

- 주로 데이터베이스나 다른 외부 리소스에 연결하기 위해 사용
- DSN은 다양한 데이터 소스 및 프레임워크에서 사용. ex) PHP의 PDO(PHP Data Objects)에서는 데이터베이스에 연결할 때, Python의 SQLAlchemy에서 데이터베이스 연결할 때
- DSN 정보는 비밀로 취급되어 하기 때문에 .env 등에 넣어준다

 

3) 회원가입

- 회원가입 - 원하는 플랫폼으로 프로젝트 제작 - default alert

- I'll create my own alerts later : alert를 설정하지 않는다
- Alert me on every new issue : 새로운 issue가 나올때마다 알림 전송
- When there are more than ~ : n분 동안 unique 한 error가 m번보다 더 생기면 알림 전송

 

4) sentry 설치

- npm i --save @sentry/node
- app.js 세팅

const Sentry = require("@sentry/node");

// init과 requestHandler는 다른 모듈, 미들웨어 코드의 상단에 있어야 함.
Sentry.init({
  dsn: process.env.DSN, // 자신의 dsn을 가져옵니다.
  tracesSampleRate: 1.0,
});
app.use(Sentry.Handlers.requestHandler());

// 기타 모듈, 미들웨어들 코드

// Sentry error handler는 다른 error handler 미들웨어보다 앞에 있어야 함.
app.use(Sentry.Handlers.errorHandler());

// 기타 에러 핸들링 미들웨어 코드

- sentry error event 커스터마이징

Sentry.Handlers.errorHandler({
  shouldHandleError(error) {
    if (
      error.errorCode === 403 ||
      error.errorCode === 404 ||
      error.errorCode === 500
    ) {
      return true;
    }
    return false;
  }
  })

403, 404, 500 에러에 대해서만 에러 이벤트를 발생시켜주어 Sentry project에 반영하게 커스텀. shouldHandleError() 안에서 true를 반환하는 조건일 때 이벤트가 성립한다. 자세한 옵션 설정은 공식 문서에서 확인

 

5) 자세한 세팅은 실전프로젝트 참고

- https://jujiprogram.tistory.com/86

 

 

 

2. 어댑터 패턴

1) 어댑터 패턴
- 서로 호환되지 않는 인터페이스가 있을 때
- 해당 인터페이스들을 건드릴 수 없을때(다른 회사의 코드, 레거시코드, 의존성이 많은 코드 등)
- 위의 경우에 호환성을 맞춰주는 패턴


*인터페이스란?
인터페이스는 객체 또는 시스템이 다른 객체 또는 시스템과 상호 작용하는 방식을 정의하는 추상화된 개념
즉, 인터페이스는 객체 간의 상호 작용을 위한 속성이나 메소드 등을 정의

 

*참조 문서

https://refactoring.guru/ko/design-patterns/adapter

2) 예시

- 주식 시장 모니터링 앱을 제작 중, 해당 앱은 여러 소스에서 주식 데이터를 XML 형식으로 다운로드한 후 클아이언트에게 전송하는 앱

- 타사의 스마트 분석 라이브러리를 통합하여 앱을 개선하기로 결정, 그런데 이 분석 라이브러리는 JSON 형식의 데이터로만 작동
- 위의 분석 라이브러리를 XML과 작동하도록 변경할 수 있으나, 라이브러리에 의존하는 일부 기존 코드가 손상될 수 있는 상태

- 해당 경우 어댑터 패턴을 사용한 계층을 새로 만들어서 해결


3) 구현방식
- 클라이언트와 서비스가 통신하는 방법을 캐치
- 어댑터 클래스 생성 후 클라이언트 인터페이스로 구성
- 호환시킬 서비스 필드를 어댑터에 추가
- 클라이언트의 인터페이스의 모든 메소드를 어댑터 클래스에서 구성(데이터 형식 변환 위주로 처리)

4) Node.js 어댑퍼 패턴 기본 틀

// 외부 모듈
class ExternalModule {
  request(data) {
    // 외부 모듈과 통신하는 로직
  }
}

// 어댑터 클래스
class Adapter {
  constructor() {
    this.externalModule = new ExternalModule();
  }

  // 어댑터 메서드
  sendData(data) {
    this.externalModule.request(data);
  }
}

// 클라이언트 코드
const adapter = new Adapter();
adapter.sendData("전송 선공");
 
//실행결과
Sending request to external module: 전송 선공


5) 장점
- 유연함 : 다양한 클래스나 인터페이스를 호환시킬 수 있음
- 단일책임 원칙 : 한가지 모듈이 한가지 기능을 가짐, 비즈니스 로직 모듈화에 좋음
- 개방폐쇄 원칙 : 기존의 클라이언트 코드를 건드리지 않고 새로운 유형의 프로그램을 도입 가능

6) 단점
- 새로운 인터페이스/클래스를 도입해야 하므로 어댑터 계층이 추가되어 코드가 복잡해질 수 있음
- 추가적인 클래스를 구성해줘야해서 메모리사용량/런타임시간 증가