반응형
오늘 나는 첫 블로그를 작성해보고자 한다.

 

44년을 사는 동안 블로그라는 것을 처음 써 본다.

무얼 써 볼까???

어찌되었든 개발자로서 두번째 인생을 살고 있으니 개발에 대한 주제로 나의 첫 블로그를 만들기로 결심했다.

그럼 처음 글은 어떻게, 어떤 글을 써야 할까...

 

며칠 동안의 심사 숙고 끝에 시작은 이것으로 하려한다.

 

 

내가 개발자로서 취업을 하여 업무로 처음 투입된 프로젝트에 대해 회고

 

 

일단 이런 주제로 지금까지 내가 투입되어 진행했던 프로젝트들을 하나씩 회고 해 볼 생각이다.

 

첫 프로젝트는 대한항공 기내 면세점 사이트 전체 개편 프로젝트이다.

 

https://www.koreanairdfs.com/

 

대한항공 기내면세 SKYSHOP

대한항공 온라인 기내면세입니다. 귀국편에 편리하게 받으세요.

www.koreanairdfs.com

 

물론 내가 입사하고 프로젝트에 투입 될 당시 이 프로젝트는 이미 개발 진척도가 90% 이상이었다.

 

간단한 기술 stack은 아래와 같다.

  • Front - React
  • Back - Spring Boot
  • Admin (Back-office) - Spring Boot + JQuery기반 자사 FrameWork 인 JWork Suite
  • Batch - Spring Boot Batch
  • DB - Oracle
  • ETC - Redis, MyBatis, JPA, Querydsl 등...

협업툴은 slack과 Gitlab, redmine을 사용하였고 IDE는 인텔리제이와 디비버를 사용하였다.

 

나에게 처음 주어진 일은 300개 이상의 알림메세지(App push나 SMS, LMS, 카카오톡 친구톡, e-mail) 등을 각각의 정해진 DB Table에 Template 형태로 저장하는 것이다.

 

물론 변수 처리를 해서 말이다.

 

예를 들면,

[Web발신]
대한항공 SKYSHOP 포인트 소멸 안내
{ 1 }님이 보유하신 { 2 }P
{ 3 } 소멸 예정!

▼보유 포인트 보기▼
https://new-tstskyshop.koreanairdfs.com/login

무료수신거부 080-880-6641

 

이런 Template 형태로 만들어 DB Table에 Insert 하였다.

 

메세지 발송은 핑거푸쉬 서비스를 이용하였다.

 

간락한 프로세스는 아래와 같다.

 

위의 프로세스로 메세지 발송 할 수 있도록 Back과 Batch에서 처리하는 로직을 구현하였다.

 

일부 메세지는 배치로 처리하여 SMS 발송 실패 시 LMS 발송, 혹은 SMS 발송 실패 시 카카오 친구톡 발송 등 다양한 요구 사항이 있었고 그에 따라 Spring Batch에서 Job, Scheduler 등록 등을 구현하였다.

 

Spring Boot Batch는 이제 막 입사하여 신입 개발자로서는 생소한 부분이고 처음 접하는 것이어서 구글링을 통해 공부하였고 많은 시행 착오를 겪으며, 무사히 구현을 끝마쳤다.

 

아래는 Spring Batch에 관해 참고를 많이한 블로그 이다. (혹시 필요한신 분들을 위해 링크 ~~~~)

 

https://jojoldu.tistory.com/324

 

1. Spring Batch 가이드 - 배치 어플리케이션이란?

Spring Batch In Action이 2011년 이후 개정판이 나오지도 않고 (2019.03 기준), 한글 번역판도 없고, 국내 Spring Batch 글 대부분이 튜토리얼이거나 공식 문서 중 일부분을 짧게 번역한 내용들이라 대용량 시

jojoldu.tistory.com

 

public void sendPasswdKaKao(Map<String, Object> member) {
        log.info("======== member Map : {} ", member);
        // 카카오톡 메시지에 추가되는 버튼 리스트
        String buttonStr = null;
        // 입력 받은 단어 배열
        Object[] objectArray = new Object[]{member.get("passwd")};

        // 카카오톡 템플릿 seq
        int kakaoTmplSeq = 2;
        // 카카오톡 템플릿 조회 + 메시지 내용 치환환
        KakaoTmpl kakaoTmpl = this.systemService.getKakaoTmpl(kakaoTmplSeq, objectArray);

        String kakaoType = "AT";
        if ("AT".equals(kakaoType) || "AI".equals(kakaoType)) {
            String temp = null;

            if(member.get("mimCode") != null && member.get("mimCode") != "") {
                String mimCode = member.get("mimCode").toString();
                switch(mimCode) {
                    case "MLJ":
                        temp = "https://new-jinairshop.koreanairdfs.com/login";
                        break;
                    case "HQS":
                    default:
                        temp = "https://new-tstskyshop.koreanairdfs.com/login";
                        break;
                }
            }
            // 카카오톡 메시지에 추가되는 버튼 리스트
            buttonStr = this.systemService.getKakaoSendButtonList(kakaoTmplSeq, temp);
        }

        // 카카오톡 메시지 전송 모델
        KakaoSend kakaoSend = new KakaoSend();
        // 수신자 번호
        kakaoSend.setPhone(String.valueOf(member.get("hdphnNum")));
        // 카카오톡 발송 타입 (AT, AI, FT, FI)
        kakaoSend.setKkoType(kakaoType);
        // 카카오톡 템플릿 코드
        // 카카오톡 발송 에이전트 템플릿 명과 TB_KAKAO_TMPL 테이블의 템플릿명과 메시지 내용이 동일해야 함
        // 알림톡 = 템플릿 코드 필요
        // 친구톡 = 템플릿 코드 불 필요, TB_KAKAO_TMPL insert 시 TMPL_CODE = 0000000
        kakaoSend.setTemplateCode(kakaoTmpl.getTmplCode());
        // 카카오톡 발송 버튼 리스트
        // 카카오톡 발송 에이전트 메시지에 버튼 추가 담당
        kakaoSend.setButtonJson(buttonStr);
        // 광고 사용 여부
        kakaoSend.setAdFlag(kakaoTmpl.getAdMsgYn());
        // 와이드 이미지 사용 여부
        kakaoSend.setWiFlag(kakaoTmpl.getWideImgYn());
        try {
            // 카톡 문자 허용 길이 4000 byte (버튼 리스트 제외)
            this.kakaoService.msgLengthCheck(kakaoTmpl.getTmplCont(), LMS_MSG_ALLOW_LENGTH);
            kakaoSend.setMsg(kakaoTmpl.getTmplCont());

            int sendResult = this.kakaoService.sendKakao(kakaoSend);
            // KAKAO 발송 실패 여부 확인
            if (sendResult != 1) {
                throw new BosValidationMsgException(
                        this.messageSourceAccessor.getMessage("message.send.failure"));
            }

            // TB_KAKAO 테이블 insert 모델
            // 카카오톡 발송 로그용
            Kakao kakao = new Kakao();
            // TB_KAKAO 업무구분
            kakao.setBsnsType(kakaoTmpl.getBsnsType());
            // TB_KAKAO 업무 상세 구분
            kakao.setBsnsDtlType(BsnsDtlType.BSNS_DTL_TYPE_530.getValue());
            // 수신자 전화번호
            kakao.setRecvTelNum(kakaoSend.getPhone());
            // 메시지 내용
            kakao.setKakaoCont(kakaoTmpl.getTmplCont());
            // 카카오톡 발송 타입 (AT, AI, FT, FI)
            kakao.setMsgType(kakaoTmpl.getMsgType());
            // 카카오톡 템플릿 코드명
            kakao.setTemplateCode(kakaoTmpl.getTmplCode());
            // 등록자
            kakao.setRgstAdminId(String.valueOf(member.get("adminId")));
            // 메시지 제목
            kakao.setKakaoTitle(kakaoTmpl.getTmplTitle());
            // 광고 여부
            kakao.setAdmsgYn(kakaoSend.getAdFlag());
            // 와이드 이미지 여부
            kakao.setWideImageYn(kakaoSend.getWiFlag());
            // 카카오톡 템플릿 seq
            kakao.setTmplSeq(kakaoTmpl.getTmplSeq());
            // 카카오톡 발송 에이전트 seq
            kakao.setMsgkey(kakaoSend.getMsgkey());
            // 카카오톡 발송 시간
            kakao.setSendDtm(kakaoSend.getSendDtm());
            // 송신 여부
            // 배치에서 카카오톡 발송 정보 조회 후
            kakao.setSendYn("N");
            // 카카오톡 송신 코드
            // 배치에서 카카오톡 발신 완료 정보 조회 후 UPDATE 예정
            kakao.setKakaoSendCode("0");

            // TB_KAKAO 테이블에 insert
            this.systemService.createKakao(kakao);
        } catch (BosValidationMsgException e) {
            log.error(e.getMessage());
        } catch (Exception e) {
            log.error(e.getMessage());
        }
    }

 

 

 

해당 프로젝트는 나에게 매우 뜻깊은 프로젝트이지만, 아쉽게도 끝무렵에 우리 회사가 아닌 다른 회사에서 프로젝트 마무리가 되고 런칭하였다. (이에 대한 부분은 회사 내부 사정상 더 이상 언급은 하지 않겠다)

 

약 3개월간의 짧은 기간이었지만 너무나 많은 것을 배웠고, 느낀점도 많다.

처음 AS-IS 소스 코드 분석할 당시 막막했던 느낌도, 배치에서 Job 등록하여 문제없이 실행될때 느낀 성취감도 모두 소중한 기억임에는 틀림없을 것이다.

 

이로써 나의 공식적인 첫 프로젝트 회고를 마무리 하겠다.

 

다음 포스팅은...

두번째 프로젝트에 대한 회고를 하겠다.

 

스스로에게 한마디

 

고생했다. 물론 앞으로도 더 많은 고생이 기다리고 있겠지만 넌 해낼 거라고 믿는다~~~~

반응형

'프로젝트 회고' 카테고리의 다른 글

세 번째 프로젝트에 대한 회고  (0) 2024.06.24
두 번째 프로젝트에 대한 회고  (1) 2024.06.15

+ Recent posts