[크래프톤 정글 3기] 1/26(금) TIL

ClassBinu·2024년 1월 26일
0

크래프톤 정글 3기 TIL

목록 보기
98/120

머리를 자른지 2달이 넘었음.
앞이 안 보이기 시작하니 오전에는 머리를 자르고 옴.

멘토님 과제

"내가 만든 기능을 잘 만들었다" 라는 논리를 각자 1개씩만 만들어오기

메일 전송 모듈

@Injectable()
export class MailService {
  private trnaspoter: nodemailer.Transporter;

  constructor() {
    this.trnaspoter = nodemailer.createTransport({
      service: 'gmail',
      host: 'smtp.gmail.com',
      port: 587,
      secure: false,
      // requireTLS: true,
      auth: {
        user: process.env.MAIL_USER,
        pass: process.env.MAIL_PASS,
      },
    });
  }

  async sendMail(to: string, subject: string, html: string) {
    const mailOptions = {
      from: process.env.MAIL_USER,
      to,
      subject,
      html,
    };
    try {
      await this.trnaspoter.sendMail(mailOptions);
    } catch (error) {
      console.error(error);
      throw new Error('Error sendMail');
    }
  }

  async sendWelcomeMail(to: string, username: string) {
    const subject = `[스토리파이] ${username}님, 환영합니다!`;
    const html = `
      <div>
        <h1>${username}님, 환영합니다!</h1>
        <p>스토리파이에 가입해 주셔서 고맙습니다.</p>
      </div>
    `;
    try {
      await this.sendMail(to, subject, html);
    } catch (error) {
      console.error(error);
      throw new Error('Error sendWelcomeMail');
    }
  }

  async sendResetPasswordMail(to: string, username: string, token: string) {
    const subject = `[스토리파이] ${username}님, 비밀번호를 재설정하세요`;
    const html = `
      <div>
        <h1>비밀번호 재설정</h1>
        <p>아래 링크를 클릭해서 비밀번호를 재설정하세요.(링크 유효 시간: 24시간)</p>
        <a href="http://127.0.0.1:3000/reset-password/${token}">Reset password</a>
      </div>
    `;
    try {
      await this.sendMail(to, subject, html);
    } catch (error) {
      console.error(error);
      throw new Error('Error sendResetPasswordMail');
    }
  }
}

잘 구현했다고 생각하는 이유

  1. 함수의 재활용성이 높음
    sendMail이라는 메일을 발송하는 기본 함수를 회원가입 시 메일을 발송하는 함수, 비밀번호를 재설정할 때 메일을 발송하는 특정 이벤트 함수에 반복적으로 사용하고 있어 코드 중복을 줄임.

  2. 라이브러리 교체 시 간단
    만약 노드 메일러가 아닌 다른 라이브러리로 교체하는 경우에는 하위의 각 이벤트 별 함수는 손대지 않고 기본 메일 발송 함수인 sendMail 함수와 내부 의존성만 바꾸면 됨.

  3. 함수가 이해하기 편함
    각 이벤트 함수는 subjecthtml로 구성되어 있어서 함수가 어떤 메일을 보내는지 직관적으로 알 수 있음.

  4. 함수를 사용하기 편함
    각 이벤트 단위로 함수를 나누어서 서비스 로직에서는 메일 제목, 본문을 작성할 필요 없이 이벤트에 해당하는 함수를 호출하기만 하면 특정 이벤트의 메일을 발송할 수 있음.

  5. 개방 폐쇄 원칙을 준수하고 있음
    새로운 이벤트 메일 발송 함수를 추가할 때 기존 코드의 수정 없이 추가할 수 있음.

LangChain

실시간으로 스트리밍 되는 것처럼 웹 페이지에서도 받을 수 있나?

GPT API 가격

입출력 각각 1K 기준

GPT 3.5 Turbo: 0.003$ (한화 4원)
GPT-4: 0.09$ (한화 120원)
GPT-4 Turbo: 0.04$ (한화 53원)

Bug

순환 의존성

Ai와 Story에서 서로 쌍방의 모듈을 의존한 경우 의존성이 undefined로 인식되는 문제가 있음.

forwardRef() 사용해서 순환 의존성 해결 가능
근데 이건 좋은 방법은 아닌 듯?

현재 문제는 불필요한 의존성을 해결해서 순환 의존성을 해결했음.

0개의 댓글