[팀프로젝트] 5,6주차

이번 데모데이 전 까지는 정산 플로우에 대한 구현이 주요 이슈가 되었다. 정산 플로우를 어떻게 진행해야 할까.. 백엔드와 프론트의 긴 회의가 있었다. 정해진 플로우는 아래와 같다.

 

 

  • '창작자'는 정산을 신청하기 위해 실명, 계좌번호와 통장사본과 함께 '정산 계좌 승인 요청'을 진행한다.
  • '관리자 페이지'에서 해당 요청을 검토하고 승인, 반려한다.
  • 승인 시 창작자는 정산을 신청할 수 있게 된다.
    • 후원 받은 포인트는 '후원자'가 후원을 하게 되면 증가한다.
    • 정산 가능 포인트는 '후원자'가 후원을 한 뒤 7일이 지난 뒤 증가한다.
      • 7일 까지 후원자가 우리 서비스를 통해 환불을 진행 할 수 있기 때문이다.
    • 정산 완료 포인트는 지금 까지 '창작자'가 정산을 요청하고 완료된 포인트이다.

 

이번 스프린트에서는 우아한 테크코스에서 제시한 요구사항도 있었고, 환불을 진행하기 위해 REDIS를 도입하는 등 많은 기술적 도전이 있어서 정리해 보려고 한다.

 

Amazon CloudWatch

  • AWS 리소스와 애플리케이션을 모니터링하는 도구
  • AWS (EC2, RDS, ELB, EBS, S3)를 사용중인 애플리케이션 상태 확인에 쓰인다.
  • 대시보드를 구성하여 수집 정보를 한눈에 볼 수 있다.

Metric

  • EBS, ELB, S3, EC2 지표를 제공
  • Agent를 설치하여 config.json 모니터링 할 메트릭 정보를 설정한다.

Log

  • EC2 인스턴스에 에이전트를 설치하여 모니터링 데이터 확인 가능
  • 설정 파일에 log_stream_name과 log_group_name을 수집 시 구분하기 편하도록 잘 설정해준다.

 

QueryDsl

이번 프로젝트를 진행하면서 QueryDsl를 찍먹해보았다. QueryDsl을 사용하면 쿼리를 자바코드로 작성할 수 있다. 쿼리 문법에 오류를 커파일 시점에 잡을 수 있다는 장점이 있다.

 

이번 프로젝트에서 계좌 등록을 요청한 유저정보를 가져올 때 QueryDsl을 적용해 보았다.

@Override
    public List<Member> findRequestingAccounts() {
        return queryFactory
                .selectFrom(member)
                .join(member.account, account).fetchJoin()
                .where(account.status.eq(AccountStatus.REQUESTING))
                .fetch();
    }

 

스프링 메일 쏘기

후원 완료, 정산계좌 등록 완료, 정산 완료, 환불 인증번호를 이메일을 통해 사용자에게 전달하도록 구현하였다. MimeMessageHelper를 사용하여 HTML형식(with thymeleaf)으로 메일을 작성하였다. 

 

MIME

이메일을 위한 인터넷 표준 포맷이다.

https://dololak.tistory.com/130

 

[HTTP] MIME Type(Multipurpose Internet Mail Extensions)

MIME(Multipurpose Internet Mail Extensions) 이란 MIME은 다목적 인터넷 메일 확장이란 뜻으로 전자우편의 데이터 형식을 정의한 표준 포맷입니다. 전자우편은 7비트 ASCII 코드를 사용하여 전송되기 때문에

dololak.tistory.com

 

삽질) 로고 집어넣기

로컬 서버에서 아래와 같이 reousece에 저장된 로고를 가져와서 이메일 HTML형식을 만들었다. 로컬 서버를 띄우고 테스트를 진행 시 로고가 잘 전달되었다.

inputStream = new ClassPathResource("static/logo.png").getFile();

 

그러나그러나그러나그러나그러나...........

jar파일을 만들어 서버를 배포하면 로고를 찾지 못했다. File not found Exception이 발생한다. getFile()은 파일 시스템을 사용가능하지않을 때, 해당 예외를 발생시킨다.

 

로컬로 구동 시켰을 때는, resource 폴더 안에 있는 파일에 getFile()로 접근이 가능하지만, jar로 만들 때는 접근이 불가능하다. 파일 시스템에서는 해당 jar안의 파일을 찾을 수 없다. 그래서 getFile이 아닌 inputStream을 통해 파일을 읽어온 뒤 처리를 해야한다. 

    private ByteArrayResource getLogo() {
        InputStream inputStream = null;
        try {
            inputStream = new ClassPathResource("static/logo.png").getInputStream();
            return new ByteArrayResource(IOUtils.toByteArray(inputStream));
        } catch (IOException e) {
            e.printStackTrace();
        }

        throw new SendingMailFailedException();
    }

 

  mimeMessageHelper.addInline("tyf-logo", getLogo(),"application/octect-stream");

 

로깅

SLF4J와 Logback

메시지 출력 여부를 로그 레벨을 통해 관리 TRACE < DEBUG < INFO < WRAN < ERROR

레디스

REDIS(REmote Dictionary Server) 메모리 기반의 키-값 구조 데이터 관리 시스템 이다. 모든 데이터를 메모리에 저장하고 조회하기에  빠른 Read, Write 속도를 보장하는 비 관계형 데이터 베이스 이다.

 

이번 프로젝트에서 환불 시 인증번호를 통해 유효성 검사를 진행하였다. 이 때, 인증번호를 관리하기 위해 REDIS를 도입하였다.

소나큐브 & Jacoco

소나큐브는 20개 이상의 프로그래밍 언어에서 버그, 코드 스멜 보안 취약점을 발견할 목적으로 정적 코드 분석으로 자동 리뷰를 수행하기 위한 코드 품질 검사용 오픈 소스 플랫폼이다.

 

레벨 4에서는 소나큐브를 도입했다.

 

 

우리팀에서 만든 배너

 

'우아한테크코스' 카테고리의 다른 글

[테코톡]TCP/IP  (6) 2021.11.09
테스트 실행 시간 줄이기  (3) 2021.09.29
배포인프라 수업 다시보기  (0) 2021.08.04
[팀프로젝트]4주차  (0) 2021.07.27
[팀프로젝트]3주차  (1) 2021.07.22

댓글



Designed by JB FACTORY