안녕하세요! 쌀 팔다 개발자하고 있는 김병욱입니다!

오늘은 정말 좋은 소식을 전해드리기 위해 글을 적습니다.
회사를 다니면서 1월부터 10월까지 열심히 적은 책이
드디어 빛을 보게 되었습니다. 

제목은 "오늘부터 개발자"에요!!

제목도 넘나 완벽한...
후후 그래도 아쉬우니깐 표지먼저 구경을 시켜드리자면!!

정말 표지가 너무 이쁘지 않나요?!!
제가 왜 이렇게 앞광고를 하냐면...
막 정말 이 책을 너무 어렵게 적다보니깐 애착이 많은 거 같아요.
회사를 다니면서 정말 시간을 쪼개고 쪼개서 아침마다 책을 적었거든요.

사실 책을 적을지 말지에 대한 고민은 항상 있어왔습니다.

개발자를 시작하고 바로 강의를 시작했던 이유는, 현재 내가 있는 자리에서 사람들에게
좋은 영향력을 주고 싶었기 때문이었습니다.

현재 제 꿈은 아래와 같아요!

"사람들이 느끼는 여러가지 문제들을 해결하여, 사람들에게 더 나은 삶을 주는 것.
이 과정에서 기업이라는 것을 만들고, 더 많은 사람들의 더 큰 문제들을 해결하여 더 큰 임팩트를 주는 것.
기업의 CSR로 UN에서 선정한 SDGS 17가지 문제들에 대해 도전하고 해결해나가는 것"

옛날부터 저는 정말 사람들의 삶이 조금 더 좋아지면 좋겠다고 생각했어요.
쌀가게 할 때도, 비록 작은 쌀가게였지만 "건강한 쌀을 통해 건강한 삶을 제공한다"라는 비전을 가지고 했었어요.

그리고 현재 개발자로서 내가 내 비전에 부합하게 무엇을 할 수 있을까 생각해봤을 때,
제가 개발자를 준비하면서 시행착오를 겪으면서 보낸 시간들을 다른 사람들은 아끼도록 도와드리는 것이었어요!
그럴 수 있다면 내 시간은 굉장히 의미 있을 것이다라고 생각했습니다.

그렇게 시간을 보내고 나니 어느새 하나 둘 취업했다는 연락이 오셨어요. 


제 수업 덕분에 빠르게 개발자로 취업했다는 메시지를 받을 때마다 그 날 하루는 시작부터가 정말 행복했습니다.
그러면서 한 편으로는 아무튼 강의나 수업은 어느정도 개발자를 해봐야겠다고 마음 먹으신 분들이 들으시는 것이니,
그 보다 훨씬 많은 사람들이 개발자라는 직업에 대해 고민만 하다고 포기하지 않으실까 생각이 들었습니다.
아무튼 강의 보다는 아직까지는 책이 훨씬 더 쉽게 접할 수 있는 것이다보니, 더 고민을 하였던거 같습니다.
하지만 현실적인 문제(시간, 역량)등의 문제로 지속적으로 뒤로 미루기만 했었는데요.

그러던 중 어느 날 새벽 4시쯤 잠결에 일어나 이런 연락을 확인하게 되었습니다.

'안녕하세요. 저 프론트엔드 개발자가 꿈인 29살입니다. 저... 엄청 속상한게.. 나이가 많아서 불안해서 빨리취업을 하고 싶어서 알아보고 간 국비학원에서 프론트엔드개발자가 신입을 안뽑으니까 퍼블리셔가 되서 그 후 공부를 해서 프론트엔드개발자가 되는게 낫다고 해서... 그렇게 수업을 듣고 있었는데요. 여기 학원에서 질문을 받아주지 않아요 질문하면 화를 내요... 그래서 다른 학원을 가야하는지 프론트엔드로 아예 준비를 하는게 나은지 너무 고민이 됩니다....'

연락 오신 시간이 새벽 1시셨는데...
글에서 부터 많은 고민들이 느껴졌고, 혹시 몰라 급하게 연락을 드려보니, 그 시간까지 고민으로 잠을 못 이루고 계셨습니다.

상담을 진행 해드리면서, "충분히 하실 수 있다" 이런 사소한 말 한 마디가 누군가에게는 큰 힘이 될 수도  있고,
참 남일 같지 않아 안타까운 마음이 들었습니다. 얼마나 많은 사람들이 이렇게 좌절하고 포기하게 될까.
그렇게 책을 적어야 되겠다고 마음을 먹었습니다. 책을 통해서 더 많은 사람들이 잘못된 정보들에서 벗어나서,
조금 더 쉽게 개발자라는 직업에 도전했으면 했습니다.

주변에서 특별하게 이야기하지만 사실 개발자도 우리가 삶을 살아가는 하나의 직업입니다.
누군가는 거기에 큰 의미를 부여할 수도 있고, 누군가는 생계유지수단으로 개발자라는 직업을 가지고 있을 수 있습니다.

그렇기에 내가 할 직업은 충분히 스스로 선택할 수 있습니다. 대신 하기로 선택 했다면 방향을 잘 잡고 정말 열심히 해서, 확실한 결과(개발자로 취업)를 얻었으면 좋겠습니다. 그런 과정들을 통해서, 개발자가 되서 행복한 것이 아니라 정말 ‘내가 언제든 원한다면 새로운 직업을 가질 수 있구나’라는 자신감을 가질 수 있게 되어 더 행복했으면 좋겠습니다. 내가 나를 사랑해줘야한다는 이 뻔한 말 한 마디가 가끔은 정말 필요한 이야기일 수 있습니다.

아무튼 다시 책 이야기로 돌아와서,
호기롭게 시작했던 마음가짐과는 달리 여러 현실적인 문제들로 인해, 책을 적는 과정어 결코 순탄치만은 않았습니다.... ㅠㅠ
회사일을 해가면서, 그리고 모르는 부분은 다른 개발자분들에게 물어가면서 정말 10개월간의 피, 땀, 눈물이 들어간 책인 거 같아요

사실 중간에 이건 무리야 하면서 포기하려고 몇 번이나 생각했는지 모릅니다.
그때마다 천그루숲에서 대표님과 팀장님이 얼마나 고생이 많으셨는지... 지금 생각해보면 정말 죄송한 것 투성이고,
너무 감사한 것이 많습니다.

결과적으로는 올해 제일 잘한 일 중 하나가 되지 않을까합니다.
몇 번의 교정 작업을 거치면서 정말 이 책이 개발자를 시작하려는 사람에게 큰 도움이 되지 않을까
기대도 많이 가지게 되었습니다.

정말 꼭 개발자에 대해 관심 있는 분들이 모두 읽었으면 할 정도로,
29살에 개발을 공부하던 저에게 꼭 전해주고 싶은 책입니다.

이 책이 개발자를 꿈꾸는 많은 분들에게 더 도움이 되었으면 좋겠습니다.
(혹시 이 책 팔아서 돈 많이 벌려는 거 아니야? 라고 생각하실 수도 있는데... 책을 판매해서 돈을 버는 분들은
정말 일부 베스트셀러 작가분들이시고, 저는 그럴 수도 없고, 그러고 싶지도 않습니다...)

그것이면, 전 정말 만족할 것 같습니다.


현재 텀블벅에서 펀딩 진행 중입니다.
https://tumblbug.com/tomorrow_programmer?ref=discover

주변에 개발자 하시고 싶어하시는 분들이 있다면 많이 추천해주세요!
아참 그리고 11월 중순 전에는 실물책과 함께, 전자책으로 출판되니 해외에서 거주하시는 분들도
충분히 읽으실 수 있습니다!!

책이 출간되면 링크를 추가로 첨부하도록 하겠습니다.

드디어 실물 책도 출간되었습니다!! 

구매 링크 :
https://bit.ly/1000gs_46_yes

 

오늘부터 개발자 - YES24

3,000명 이상의 수강생이 검증한 강의의 액기스만 모은,개발자를 꿈꾸는 당신의 소중한 수백 시간을 줄여줄 ‘개발자 취업 입문 개론’‘프론트엔드, 백엔드, 데이터 사이언티스트’ … 어떤 개

www.yes24.com

감사합니다!!


아 참 그리고 아쉬우니깐... 사실 책 소개 영상도 찍었는데 많은 분들이 보지 않은 거 같아서 ㅎㅎ
같이 첨부해요! (막상 첨부하고 보니 지워야 하나 싶기도 하다...)

 

관련 소개 유튜브 영상 : 
https://youtu.be/TkfhTVVksEA

 

 

요즘은 꽁술을 앱으로 만드는 과정을 진행 중이다.

꽁술은 웹으로 잘 만들어져 있는데,
https://app.ggongsul.net
그냥 웹뷰로 감싸서 올리니 문제가 발생했다. 바로 카카오로그인 때문이다.


웹뷰를 띄운 상태에서 카카오로그인을 누르면 새로운 웹이 뜨면서 그때 이후부터는 안드로메다로 가버린다.
이것을 해결하기 위해 많은 글들을 찾아보고 시도를 해보았는데,

 

안드로이드 하이브리드앱 웹뷰 WebView 에서 카카오톡 로그인 (앱) 사용하기

카카오톡 로그인 Javascript SDK 로 개발했을 때, 안드로이드 모바일 브라우저에서는 자동으로 '카카오톡 앱'이 호출된다. 문제는 하이브리드앱으로 '웹뷰'를 패키징한 형태로 서비스를 하게 될때는

kokohapps.tistory.com

아무튼 부자연스러운 액션들을 초례하게 되고 점점 더 사이즈가 커져버리는 것 같았다.
그래서 결론적으로는 로그인 부분만 앱으로 만든 뒤 웹뷰를 뛰우기로 결론 내렸다.

현재 react native를 써서 로그인 부분을 만들고 있고 카카오톡은 쉽게 잘 붙였으나,
IOS 때문에 애플로그인을 붙이는 과정에서 이슈가 발생했다....(이건 정말 갑질 아닌가 흑)

정말 쉽게 뚝딱 뚝딱 따라해서 붙였는데, 작동을 안한다.... ㅠㅠ 작동을 안해......... 왜 안해.......
너무 오랜 시간 삽질을 하다가 발견하게 되어서 공유한다 ㅠㅠ

애플 로그인 관련해서는 많은 글들이 있는데, 나는 보통 블로그를 보고 따라하다 보니 계속 아래와 같은 코드로 작업을 진행했다.

const onAppleButtonPress = async () => {
    try {
      const responseObject = await appleAuth.performRequest({
        requestedOperation: AppleAuthRequestOperation.LOGIN,
        requestedScopes: [AppleAuthRequestScope.EMAIL],
      });
      console.log('responseObject:::', responseObject);
      const credentialState = await appleAuth.getCredentialStateForUser(
        responseObject.user,
      );
      if (credentialState === AppleAuthCredentialState.AUTHORIZED) {
        console.log('user is authenticated');
      }
    } catch (error) {
      console.log(error);
      if (error.code === AppleAuthError.CANCELED) {
        console.log('canceled');
      } else {
        console.log('error');
      }
    }
  };


별 다르게 이슈가 있을 부분도 없는데 계속 별 다른 동작 없이
typeerror evaluating '_reactNativeAppleAuthentication.AppleAuthRequestOperation.LOGIN
이 에러를 마주하게 되었다.

그래서 도대체 왜 안되라고 분노하고 있을 때... 공식 문서에서 업데이트 된 부분을 찾았다.

async function onAppleButtonPress() {
  // performs login request
  const appleAuthRequestResponse = await appleAuth.performRequest({
    requestedOperation: appleAuth.Operation.LOGIN,
    requestedScopes: [appleAuth.Scope.EMAIL, appleAuth.Scope.FULL_NAME],
  });

  // get current authentication state for user
  // /!\ This method must be tested on a real device. On the iOS simulator it always throws an error.
  const credentialState = await appleAuth.getCredentialStateForUser(appleAuthRequestResponse.user);

  // use credentialState response to ensure the user is authenticated
  if (credentialState === appleAuth.State.AUTHORIZED) {
    // user is authenticated
  }
}

 

변경된 부분이 있었다. 

requestOperataion 부분과 requestedScopes 부분 그리고 AppleAuthCredentialState.AUTHORIZED 부분도 변경되었다.
이것을 공식문서와 같이 변경하니깐 곧바로 해결되었다. ㅠㅠ

나처럼 삽질 하는 사람이 있을 것 같아서 짧은 글로 남겨준다. 

회사마다 db를 살리기 위한, 또 잘 활용하기 위한
여러가지 방법들을 활용하고 있다.

db를 실시간으로 따라가는 slave db를 두는 것은 물론이고,
3시간 마다 스냅샷을 찍고, 필요한 데이터쿼리를 해보기 위한 db를 따로 두는 등 기존에 쌓여진 데이터를 잘 활용하는 것도 너무나도 중요하고 기존의 데이터를 지키는 것도 너무나도 중요하다.

db를 실시간으로 따라가는 것은
mysql replication 설정으로 가능하다.

하지만 해당 부분이 깨지게 되면 굉장히 귀찮게 체크해줘야할 부분이 많다.
이미 설정되어 있다는 가정하에 체크해볼 것을 체크해보자.

master db 현재 설정된 replication 확인

  • mysql 접속
  • show processlist\G
  • => 현재 replication된 정보들을 볼 수 있음

slave db 접속

  • mysql 접속
  • show slave status\G
  • => 현재 master를 따라가고 있는 replication의 상태를 볼 수 있음
  • 여기서 보이는 에러 로그를 확인하고 google에 검색하여 해결

여기서 에러 로그가 보인다면 해결이 필요

=> 이런 에러를 접하게 되었다.

[해결 방법]

Relay log를 읽어오는 과정에서 오류가 있었던 것으로 보아 현재 slave 에 생성된 Relay log 파일이 깨진것으로 보임. 그렇기에 relay log를 master로 부터 다시 읽어오면 됨. 

참고 블로그:
[황제펭귄의 IT](http://egloos.zum.com/darkit/v/215603)

오잉 근데 우리 시스템에는 
MASTER_AUTO_POSITION is active 
때문에 따로 change master 경로를 변경하는게 불가하였다.

결국 reset slave를 해준 뒤 문제 있던 부분을 바꿔주려고 했으나
그냥 start slave를 해주면서 해결되었다!

mysql> stop slave;
mysql> reset slave;
mysql> start slave;

참고 하였던 좋은 블로그 글들을 공유하면서 총총
[[MySQL] MySQL Replication 구성하기](https://gangnam-americano.tistory.com/12)

'서버' 카테고리의 다른 글

Error: Unknown command: cask 에러를 만났을 때  (3) 2021.03.13
Graphql이란  (0) 2020.09.26
nslookup 이란  (0) 2020.08.31
초보자를 위한 REST API  (0) 2020.06.21
Docker란(도커란)  (0) 2020.06.02

최종 업데이트 
- 2022. 09. 05 (패스트캠퍼스 수정) 

부트캠프 관련 글을 하나씩 적어보려고 한다. 사실 어떤 부트캠프가 좋은지, 
나는 그렇게 추천을 하지 않는 편이다. 왜냐하면 결국 어떤 부트캠프이든 본인이 하지 않으면 소용 없고,
본인이 스스로 하는지에 따라서 달려 있다고 말해주고 싶다. (그리고 무엇보다 사람마다 느끼는 것이 모두 다르다보니
추천을 해주었다가 맞지 않을 수도 있기 때문이다.)

나 역시도 여러 부트캠프를 찾아다니고, 수업을 듣고 했지만 최종 내린 결론은 
'내 포트폴리오 내가 만들고, 내가 가고 싶은 회사 지원해서 간다' 였다.
결국 부트캠프를 가는 이유는 온전히 개발만을 집중할 수 있는 공부 환경만을 기대하고 갔으면 좋겠다.

[꼭 부트캠프를 가야하나요? :: 쌀 팔다 개발자] https://daeguowl.tistory.com/170 

 

꼭 부트캠프를 가야하나요?

수업을 진행하다보면, 나도 부트캠프 출신이고 하다보니 꼭 부트캠프를 가야지만 개발자를 할 수 있냐? 라는 질문을 많이 듣는다. 가장 최근에 들어온 질문은 아래와 같다. "안녕하세요. 튜터님!

daeguowl.tistory.com

해당 글이 도움이 되었으면 좋겠다.

결국 스스로 공부하기 쉽지 않은 사람들이 공부할 수 있도록 도와주는 곳 정도로 생각해야지,
'부트캠프를 가면 나 무조건 취업이야!'라고 생각하면 정말 시간과 돈을 모두 날려보내기 십상이다.
(그 많은 사람들이 부트캠프를 나오고 있는데, 모두 취업이 되고 있을까??)

아무튼 그럼에도 불구하고 내가 이 글에서 부트캠프를 다룰려는 이유는
비전공자가 해당 부트캠프의 소개글을 보았을 때, 제대로 해석할 수 없는 경우가 많기 때문이다.
그래서 나는 이 글에서 개발자의 입장에서, 그리고 개발 입문자 교육을 하고 있는 입장에서 해당 부트캠프에서 소개 해놓은 것들을
알기 쉽게 풀어서 적고자 한다. 

먼저 내가 참여 혹은 알아 보았던 부트캠프는 아래와 같다. 해당 부트캠프들은 비교적 자세하게 소개할 수 있을 것 같다.
- 코드스테이츠 : pre 온라인 과정 참여 & 실제 회사에서 코드스테이츠를 통해 입사하신 분들이 있음
- 코드스쿼드 : 함께 개발을 공부했던 친구와 함께 상담 참여 & 친구는 코드스쿼드를 다님
- 패스트캠퍼스 : 해당 부트캠프 직접 참여(웹프로그래밍스쿨) / 현재는 무료 부트캠프(국비지원교육)인 메가바이트 스쿨 신규 개설 (2021년~) & 스쿨 졸업 후 멘토로 활동 중
- 스파르타코딩클럽 : 개발자 취업 이후 수강생들의 문의로 상담 참여, 이후 스파르타에서 멘토로 활동 중
- 위코드 : 개발자 취업 이후 수강생들의 문의로 상담 참여, 회사 내 위코드를 수료 후 입사하신 분이 있음
- 바닐라코딩 : 함께 개발을 공부했던 친구와 함께 상담 참여 & 개발자 취업 이후 수강생들의 문의로 상담 다시 진행

기타 부트캠프 및 무료 지원 교육기관들
- 팀노바
- 우아한 테크코스
- 서울 42
- SSAFY 삼성 SW 아카데미
- 네이버부스트캠프
- 멋쟁이 사자처럼
- 일팔공캠프

새롭게 신설되고 있는 부트캠프들도 많기 때문에 모두 다룰 수는 없지만 댓글로 요청시 최대한 같이 다뤄보려고 한다.

무엇을 비교하면 좋을지, 비교 기준들에 대해서 생각을 해보았다.
크게 비교 기준은 아래와 같다.

과정 : 웹프론트엔드, 백엔드, 안드로이드, iOS, 풀스택등 어떤 과정을 집중적으로 수업하고, 혹은 과정을 선택할 수 있는지
배우는 것 : 개발언어 및 관련 프레임워크
수강 기간 : 얼마만큼 긴 시간 동안 수강을 필요로 하는지
코스 모집 : 몇개월 단위로 수강생을 모집하고 있는지
장소 : 오프라인(교육장소), 온라인 등
비용 : 금액적으로 얼마만큼의 비용이 들어가는지 (이 부분은 상담을 받아봐야 정확한 경우가 많아, 대략적인 비용만 제시)
기타 : WIN-WIN 제도와 같은 다른 참고사항이 있는지

아무튼 표가 보기가 좋으니 표로 정리해보았다.

(다른 것이 있으면 언제든지 댓글 부탁드립니다. 되도록 실시간 업데이트 하도록 하겠습니다.)

그리고 이제 하나 하나 차근 차근 말로 풀어 써보려고 한다.

1. 코드 스테이츠 (https://www.codestates.com/)

코드스테이츠의 경우 한국에서 가장 처음 오픈한 곳이다. 처음 내가 pre과정을 온라인으로 들었던 곳이기도 하다. (과거에는 pre과정을 온라인 으로 수강 후 실제 전일제 부트캠프를 3개월 참여하는 형태였다.) 아무튼 실제 우리 회사에서도 코드스테이츠 출신분들이 많으셔서,
실제로 코드스테이츠를 나온 후에 개발자로 취업하시는 분들이 적진 않은 것 같다. 실제 코드스테이츠를 들어가보면, 

수료 이후 6개월 이내 취업자가 82% 이고 평균 초봉이 3,226만원이라고 이야기하고 있다. 아마 그 동안 많은 기수들을 거치면서 데이터가 꽤나 많이 쌓였으니 어느정도는 정확한 데이터가 아닐까 한다. 아무튼 현재는 소프트웨어엔지니어링 부트캠프라고 하여 프론트엔드/ 백엔드를 나누지 않고 교육을 진행한다. (프론트엔드 , 백엔드 모두 배운다는 것은 좋아보이지만 실제 취업할 때는 프론트엔드, 백엔드로 나누어서 취업하므로 준비를 더 잘 해야한다.) 그렇게 javascript 언어를 바탕으로 프론트엔드는 React, 백엔드는 Node로 교육을 받고, 취업할 때는 본인이 더 적합하다고 생각하는 곳으로(백엔드든 프론트엔드든) 지원한다. 
WE-WIN 제도를 통해서, 당장에 돈이 없어도 부트캠프를 수강할 수 있다. 뭐 계약 사항이 나쁘다고 이야기하는 글들을 많이 보았는데, 아무튼 나는 이런 선택지를 하나 더 준 시도가 매우 좋다고 본다. 부트캠프 교육 과정을 통해 3개월만 더 빨리 취업을 한다고 하면, 3개월 동안의 월급 + 경력은 1,000만원 이상의 값어치를 할 것이다. 
현재는 전면 온라인으로 전환하여 Zoom을 통해서 수업을 진행한다. 

2. 코드스쿼드 (https://codesquad.kr/)

코드스쿼드의 경우 나와 함께 1월달, 2월달을 온라인으로 들었던 친구가 선택했던 부트캠프이다. 과거 NHN NEXT라는 네이버에서 운영하는 소프트웨어 인재 육성 교육기관에서 멘토로 활동하셨던 3분이 만드신 부트캠프이다. 각각의 마스터(멘토)분들이 3개의 분야 (IOS/ 웹프론트엔드/ 백엔드)로 나누어서 교육을 진행한다. 나 역시도 친구와 함께 상담을 받기 위해 찾아갔던 곳이기도 하다. 강남역과 양재역 사이에 자체 공간을 운영하고 있어서, 해당 공간에서 교육을 진행하기에 독립된 공간에서 집중하여 학습할 수 있다.
긴 주입식 교육시간보다는 각 step별로 나누어진 미션을 매주 풀어가면서 성장해가도록 자체 교육프로그램을 운영하고 있다. 수강하였던 친구는 이런 교육 프로그램이 굉장히 장점이면서도, 아무것도 모르고 시작하였던 본인에게는 따라가기가 쉽지 않았다고 이야기했을 정도로, 아주 조금이라도 개발 지식을 쌓고 시작하는 것을 추천한다. 실제 코드스쿼드에서도 마스터즈코스(실제 부트캠프)과정 전에 코코아과정(프리코스)라고 하여 5주 정도 학습할 수 있는 프로그램도 동시에 운영 중이다. 

무엇보다 정말 장점인 것은 다른 부트캠프들에 비해 가격이 저렴하고, 매월 월단위 결제로 빠르게 취업하게 되거나 혹시 맞지 않아서 그만두게되는 경우 다른 부트캠프에서는 위약금을 묻거나, 돌려받는 금액이 기간에 비해서 굉장히 작게 산출될 수 있는데, 그런 것이 아니라 한 달 단위로 본인이 더 해갈지 말지를 결정하면 되기에 이런 부분은 정말 수강생분들을 생각해서 운영하는 것 같다.

상반기 하반기 딱 2회만 모집을 하기 때문에, 수강생들의 경쟁이 그만큼 치열하며 실제 코드스쿼드 수강을 하기 위한 경쟁이 치열하기 때문에 미리 공부를 하여 어느정도 지식을 쌓인 상태여야, 수강할 수 있으리라 생각한다. (현재까지 그런 지는 모르겠지만 친구는 면접을 진행하였었다.) 

유튜브에 마스터즈 코드에 대한 영상이 있어서 함께 첨부한다. 

 

3. 패스트캠퍼스 스쿨 과정 (현재 운영X) 

과거에 내가 들었던 과정은 패스트캠퍼스 웹프로그래밍 스쿨 과정이었다. 현재는 코로나로 인해서인지, 더 이상 패스트캠퍼스에서 스쿨 과정을 운영하고 있지 않아서, 많은 부분을 이야기하는 것은 의미가 없어보인다. 개인적으로는 성수에 패스트캠퍼스 자체 공간으로 운영하고 있고, 가격도 다른 부트캠프에 비해 저렴한 편이며, 12개월 무이자 할부를 지원하고 있어서 좋았다.(나는 12개월 무이자 할부로 결제하고, 4개월만 낸 뒤 취업 후에 갚아 나가기 시작했다.)
다만 결국 본인이 원하는 것이 무엇이였는지에 따라서 부트캠프의 만족도가 많이 변하게 되는 것 같다.
나는 굉장히 만족하면서 들었는 것에 비해 생각보다 만족하지 못한 경우도 있었다.
패스트캠퍼스 스쿨 과정에 대해서는 나의 블로그에 잘 정리해놓았으니 같이 첨부한다.

 

'패스트캠퍼스' 카테고리의 글 목록

29살, 늦은 나이로 새롭게 개발자에 도전하여 현재는 백엔드 개발자로 활동 중입니다.

daeguowl.tistory.com

빨리 다시 패스트캠퍼스 스쿨 과정 만들어주세요!!

추가 ) 패스트캠퍼스 무료 부트캠프인 메가바이트 스쿨에서 멘토로 활동하고 있어 내용을 업데이트 하고자 한다.

 

내일배움아카데미 : K-Digital Traning 메가바이트 스쿨 | 패스트캠퍼스

패스트캠퍼스에서 국비지원으로 '무료' 수강하는 기업연계 취업 부트캠프

fastcampus.co.kr

패스트캠퍼스는 스쿨 사업(부트캠프)을 꽤 오래 전인 2016년부터 한 걸로 알고 있는데, 2021년도부터 내일배움카드만 있으면 들을 수 있는 K-Digital Training 국비지원교육으로 전액 무료로 지원하고 있다고 한다. 이에 서비스명도 ‘메가바이트 스쿨(Megabyte School)’로 개편됐다. 스쿨 다닐 때도 커리큘럼이나 강사진, 프로젝트 내용에 꽤나 만족했었는데, 국비지원으로 전액 무료로 제공한다니… 아주 좋은 기회라고 생각된다.

특히, 스쿨 수료생분들이 최대 7~8년차로 멘토로도 많이 활동하고 있고, 나도 시간이 될 때 멘토로 참여하고 있다. 메가바이트 스쿨 운영 담당자랑 얘기를 나눴는데, 교육 과정에 대한 열의와 진심이 느껴진달까? 국비지원교육으로 전액 지원하더라도 교육생의 시간을 투자하는 교육이니 이전 스쿨의 강점은 살리고, 단점은 보완해서 교육생에게 꼭 필요한 교육을 전달하고자 하는 마음이 느껴졌다. 

특이한 건 각종 부트캠프를 패스트캠퍼스에서 많이 진행하고 있다보니 최종 프로젝트로 프론트엔드 개발 과정, 백엔드 개발 과정, UXUI 디자인 과정이 만나서 협업 프로젝트를 진행한다고 한다. 프로젝트 주제도 파트너사 기업에서 정해준 거라 실제 서비스에 반영되는 경우도 있다고 했다. (실제로 개발자로 취업 시, 협업 역량이나 커뮤니케이션 스킬을 중요시 하는데 굉장히 좋은 기회라고 생각한다.)

교육 기간동안 패스트캠퍼스 온라인 강의도 보조학습물로 제공하고, 수료만 하면 6개월간 패스트캠퍼스의 모든 온라인 강의를 맘껏 들을 수 있다고 한다. 실무에서 유명한 분들이 강의를 찍어 온라인 콘텐츠로 굉장한 강점이 있는 패스트캠퍼스로 알고 있고, 지속적으로 콘텐츠 수도 많아지고 퀄리티도 높아지고 있던데.. 국비지원교육임에도 유료 스쿨 과정 때보다 혜택이 꽤나 좋아 추천하고 싶다.

 

4. 스파르타코딩클럽 항해99(https://hanghae99.spartacodingclub.kr/)

사실 스파르타코딩클럽과는 인연이 깊다. 개발자가 된 이후, 수강생분들이 스파르타코딩클럽이 어떻냐고 질문을 계속 주셔서,
한 번 수강생의 입장으로 스파르타에 상담을 받으러 갔다가, 대표님과도 이야기를 하게 되었다.
"우리가 취미로 테니스나, 복싱을 배우듯이 개발도 취미로 배울 수 있습니다."와 같이 정말 직장인들이 취미로 개발을 배울 수 있도록 도와주는 것을 목표로 하셨다. 그렇게 정말 우연찮은 계기로, 나도 스파르타코딩클럽에서 오프라인튜터로 활동하게 되었다. 
직장인이 들을 수 있는 오프라인 과정의 경우, 8주 과정으로 퇴근 후 주 2회 혹은 주말 주 1회로 8주 동안 개발에 대한 전체적인 지식들을 조금씩 배워서 하나의 프로젝트를 만들도록 되어 있다. 보통 한 반에 수강생 8명과 개발자 튜터 1분으로 구성되어 함께 해나간다. 커리큘럼도 초보자들이 배우기에 나쁘지 않고, 튜터님이 이끌어서 가주니 정말 개발을 취미로 한번 배워볼까하는 분들에게는 추천하고 싶다. (떄마침 코로나 단계가 풀리면서 오프라인 과정도 모집하고 있다.)

아무튼 지금은 부트캠프를 이야기하는 중이니, 스파르타에서 그 이후에 출시한 것이 항해99라고 하여, 실제 99일동안 몰입하여 개발자로 취업할 수 있는 부트캠프 과정을 운영한다. 내가 수강생분들에게도 스파르타를 추천하는 이유 중에 하나는, 아마 합리적인 가격 떄문인 것 같다. 그래도 아직까지는 다른 부트캠프에 비해 저렴한 비용 (400만원, 반액 선불, 반액 후불시 500만원)에 부트캠프를 수강할 수 있다는 것은 정말 큰 장점인 것 같다. 그리고 무엇보다 온라인임에도 불구하고 빠르게 게더타운을 도입하여, 온라인임에도 최대한 수강생분들이 오프라인 처럼 들을 수 있도록 도와주고 있다. 
스파르타 블로그에 게더타운에 대한 글이 있으니 한 번 읽어보면 좋을 것 같다. 

 

게더타운(Gather.town) 사용법, 이것만 읽으시면 됩니다!

우리에게 너무도 익숙해져 버린 줌(Zoom). 재택근무, 원격수업이 일상에 자리 잡으며 많은 사람들이 줌, 구글 미트(Google Meet)와 같은 화상회의 플랫폼을 이용하고 있는데요. 하지만 동시에 이러한

spartacodingclub.kr:443

과정은 프론트엔드, 백엔드 과정으로 나누어지며 백엔드의 경우 java혹은 node.js 중 선택할 수 있다. 

5. 위코드(https://wecode.co.kr/ )

위코드는 내가 개발자가 된 뒤에 한 번 상담을 받기 위해 찾아갔던 곳이기도 하지만, 실제 다노에서 일할 때도 위코드에서 수강하신 분들이 인턴으로 들어오셔서 이야기를 들어볼 수 있었다. 
일단 위코드의 가장 큰 장점은 위워크라는 공간에서 3개월 동안 집중해서 개발을 공부할 수 있다. 위워크의 경우 정말 공간 자체가 굉장히 좋고 24시간 언제든지 출입 가능하기에 본인의 일정에 맞추어서, 낮과 밤 상관없이 개발 공부를 계속 해나갈 수 있다. (그렇다보니 비용이 비싼데, 해당 공간 3개월 이용권이 포함된 가격이라고 하면 위코드의 수업 비용이 그렇게 크지 않다고 볼 수도 있다.) 그리고 조금 특이한 게 3개월 중 마지막 1개월의 기업 협업이라고 하여 실제 현업에서 한 달동안 인턴 개발자로 활동해 볼 수 있다. 이것은 사실 취업하지 못하면 경험하지 못하는 경험이다 보니 수강생분들에게 큰 도움이 되리라 생각한다. 

그리고 무엇보다 모집 주기가 2개월 단위 모집에서 현재는 1개월 단위로 모집을 하고 있어서, 본인이 원하는 시기에 맞추어서 학습하기가 쉬울 것 같다. 다른 부트캠프의 경우 모집 주기가 길어 시기를 놓치게 되면 또 한 동안 기다려야 하는 반면에, 현재는 1개월 단위로 모집하고 있는 것이 본인이 원하는 시기에 부트캠프를 듣고자 하는 분들에게는 큰 장점이 되리라 생각한다.

각 분야의 멘토님들이 상시 상주하고 있기 때문에 질문을 편하게 할 수 있다는 것도 큰 장점일 것 같다.
과정은 프론트엔드 / 백엔드 과정이 나누어져서 진행한다. 

위코드 수강생분들의 후기를 첨부하면서 마무리한다.

 

프리미엄 코딩부트캠프 위코드, 3개월로 완성되는 코딩 실무 커리큘럼

wecode(위코드)의 부트캠프를 통해 개발자로서 커리어를 시작하세요.

wecode.co.kr

 

6. 바닐라코딩 (https://www.vanillacoding.co/)

바닐라코딩은 내가 개발을 시작할 때 바닐라코딩 신년회?에 신청하여 참석한 적이 있는데, 그 전에 기수분들과 이미 개발자로 취업하신 분들이 한 곳에 어우러져서 노는 모습이 참 인상 깊었다. 바닐라코딩 자체가 많은 인원 보다는 소수의 인원을 개발자로 키워내는 곳이다 보니 더욱 끈끈하게 뭉치게 되는 것 같다. 

바닐라코딩은 실리콘벨리에서 개발자를 하시던 대표님이 직접 15명 정도의 수강생을 선발하여, 실제 취업까지 이끌어가시고 있다. 그렇다보니 정말 일단 이 부트캠프를 듣는 것의 경쟁자체가 치열할 정도로... 수강하는 것 자체가 쉽지 않다. 1년에 2번의 기수를 모집하기에 더욱 어려운 것 같다. 자체 공간을 가지고 있어서 해당 기간 정말 개발에만 몰입하여 수강할 수 있다.

그리고 실제 개발자로 취업한 선배들도 퇴근 이후에 멘토로 수강생분들을 돕기 위해 오니, 여러 좋은 이야기들도 들을 수 있으리라 생각한다.
실제 수강생분들도 좋은 곳에 많이 취업을 하고 있는 것 같다.

과정은 웹프론트엔드와 백엔드를 모두 통합하여 수업하고 있다. 또 신기한 것은 바닐라코딩에서는 매 기수마다 취업현황을 공개하고 있는데, 관련 블로그를 첨부하면서 마무리한다.

바닐라코딩을 수강하고자 한다면 미리 준비를 많이 해야할 것 같다. 

 

그 어느 때보다 뜨거운 부트캠프 9기 취업 현황. 🔥

바닐라코딩 부트캠프 역사 이래에 가장 뛰어난 성과를 보이고 있는 부트캠프 9기의 취업 현황을 공개합니다!

medium.com


이 밖에도 부트캠프들이 많다.
다만 현재 내가 어느정도 알고, 유명하며, 소개할 수 있는 부트캠프들을 위주로 정리하였다.

결국 내 생각은 변함없다. 위에 부트캠프를 꼭 가야하나요?라는 글에서 적었던 것처럼
아무리 좋은 부트캠프라도 본인이 하지 않으면 결과가 없으며, 본인 스스로 잘 해나갈 수 있다면 
꼭 비싼 돈을 주고 부트캠프를 갈 이유도 없다.

꼭 부트캠프를 가지 않더라도 생각보다 주변에 여러분을 도와줄 수 있는 개발자분들은 많다.(나를 포함하여)
아무튼 이런 부트캠프들이 많이 생겨나서, 비전공자들도 개발자로 입문할 수 있는 기회들을 많이 주고 있다는 것은
비전공자 입장에서는 선택지가 많아지고 수업의 질이 높아지기에 긍정적으로 생각한다.

본인이 선택한 분야, 그리고 본인의 시기에 맞는 부트캠프를 잘 선택하여
시간과 돈 모두 날리는 일이 없었으면 한다.


최대한 현재 알려져 있는 정보들과 제가 알고 있는 정보들을 나열하는 형태로 정리하고자 하였는데, 
혹시 문제가 있거나 변경된 부분이 있다면 댓글 주시면 따로 수정하도록 하겠습니다.!

m1 맥북프로를 구매하였다.(1TB, 16G ram) 
기존에 256 ssd로 앱개발을 위한 xcode등을 설치하니 너무 너무 ssd가 부족하여,
매번 남은 ssd가 10g 이내로 왔다갔다 하였다.... 

너무 스트레스 받았지만 m1x가 나올 때까지 기다려야지 있었는데,
쿠팡에서 m1을 정말 저렴하게 판매하고 있기에  이건 꼭 사야해 하면서 get했다!! 
맥북프로 m1 1TB, 16G ram인데 쿠폰할인 카드할인을 해서 무려 200만원!!!! (정말 절대적인 가성비 노트북이 되어버렸다...)

m1이 성능 좋다고 해서 엄청 기대를 했는데,
pycharm에서 기존 인텔 cpu 맥북에 비해 너무나도 버벅였다..
정말 너무 버벅여서 멘탈이 털리고 있었는데... 
pycharm에도 m1 버전을 지원하도록 새롭게 나왔다는 것을 알았다.

https://www.jetbrains.com/ko-kr/pycharm/download/#section=mac

 

다운로드 PyCharm: JetBrains가 만든 전문 개발자용 Python IDE

 

www.jetbrains.com

여기서 Apple silicon 버전을 다운 받으면 된다. 

 

그랬더니 버벅이던게 정말 1도 없어졌다!!

혹시라도 누군가에게 도움이 될까해서 적어놓는다.
속이 넘나 편안해졌다. 

m1 좋아요...!!

'자취생활' 카테고리의 다른 글

특이한 캔들워머 구매했어요!  (0) 2020.10.04

주니어 개발자의 새벽배송 개발기

커머스는 우리가 생각하는 것보다 훨씬 더 복잡하다.
단순히 상품을 진열하고 구매하는 것을 벗어나서, 실제 구매가 이루어진 후의
상품 출고 과정과 고객분들의 후기, 그리고 교환과 반품과 같은 CX처리까지...

이 모든 과정이 끝나야지 정말로 커머스의 한 사이클을 돌았다고 이야기할 수 있다. 

물론 사람이 진열할 상품을 고르고, 가격을 설정하고, 상품을 보내고, CX상담을 하고 하지만
이 모든 것들을 가능하게 하는 로직이 바탕이 되어야 한다. 발생할 수 있는 모든 케이스에 대해서 로직 처리가 되어있다 보니
커머스의 서버는 방대해질 수밖에 없다.

2019년 7월 22일 입사부터 2021년 7월 22일!

다노에 입사한 지 어느덧 2년이라는 시간이 지났다. 그 과정 속에서 나는 더 성장을 한 것인지, 정체되어 있었는지 잘 모르겠다.
가끔은 잘하고 있다는 생각이 들 때도 있었고, 또 어쩔 때는 다른 개발자들과 비교하며 정체되어 있다는 느낌을 받기도 했다. 

뭐 이유야 어찌 되었든 나는 필요에 의해 개발을 하고 있는 사람이고, 개발 그 자체를 즐기진 못하고 있다.
(물론 내가 개발을 못 한다는 이야기는 아니다.) 

개발이 정말 나의 적성에 딱 맞으면 좋겠지만, 애당초 잘 맞지 않을 것이라는 것을 예상하고 들어왔고,
나름 내가 개발자로서 목표하였던 것들을 성취하면서 성장해 나가고 있는 것 같다.

어느덧 2년 넘게 바라보았던 다노샵 서버에 이제는 너무 큰 애정이 생겨버렸다.
수 없이 마주 하였던 버그들을 수정하고, 수많은 신규 피처들을 붙이면서 다노샵은 점점 고도화되어 가고 있다.

처음 다노샵은 카페 24에서 시작하였었다.
그러다가 카페 24에서 자체에서 운영하는 독립몰로 옮기기 위해 정말 노력하셨던 분들이 있었고,
나는 그 옮겨놓은 독립몰 큰 틀 안에서 새로운 것들을 지속해서 만들어 나갔다.
아무튼 처음 입사 때부터 사수분과 둘이서 다노샵 서버 전체를 다 보았고 유지보수 및 피처개발을 해나갔다.
(이런 경험은 쉽게 쌓을 수 없다고 생각한다. 정말 감사하다고 느낀다.)

큰 이슈가 없으면 기존 것을 최대한 활용하고 발전시켜 새로운 기능들을 붙여나갔다.
(지금 다노샵 독립몰은 정말 정말 다양한 기능들이 추가되어있다. 이게 카페 24 혹은 고도몰을 활용하지 않고 독립몰을 활용하는 이유이기도 할 것이다.)

새벽배송 관련 서비스 오픈은 작년부터 SCM팀에서 진행하고 싶었던 일이기도 하였고, 다노샵을 이용하는 나라는 고객 입장에서도 너무나도 도입되면 좋겠다고 생각한 배송 서비스였지만 여러 가지 회사 사정들과 급한 이슈들로 인해 뒤로 미뤄져 갔다.

아무튼 시간이 흘러 다노샵도 새벽배송을 도입하기로 결정이 되었고,
해당 피처 작업을 맡아서 진행한 스토리를 좀 적어보려고 한다.

새벽배송? 일단 무엇을 해야 할까? 너무나도 막막한 부분이지만,
SCM팀의 리더분의 이야기는 심플했다.

"이미 배송 협력사에서 시스템이 다 갖추어져 있어서 저희는 기존에 나오던 금일 출고될 상품들의 엑셀 파일에서
새벽배송 관련된 row만 한 줄 추가되면 됩니다."

이것을 믿고, 새벽배송 TF팀은 희망을 가졌다.(서버1, 프론트1, 디자이너1, PM1, QA1)

"그래. 새벽배송이 가능한 고객분들에게는 주소랑 연락처 이외에 새벽배송 관련된 정보를 더 받자. 그리고 그걸 서버 쪽에서 핸들링해서 출고 파일 뽑을 때 추가해주자"

오 ...!! 쏘 심플하다!!! 정말 저거면 된다고?! 생각하며 시작한 새벽배송은
DUE 자체도 1달 정도로 길지 않았다.

그렇게 출사표를 던졌다.(이때까지만 하더라도 거이 새벽배송은 서버 쪽만 건들면 되는 거 아닌가 라는 내부적인 생각도 있었다. 우리 TF팀조차도..)

진지하게 적은 출사표

(다노는 정말 응원도 많이 해준다 ㅎㅎ)

하지만 과연 그랬을까....??? 일단 가장 큰 문제는 현재 다노샵에서는 현재 주문서에서 주소지를 받고 변경할 수 있는 구조인데, 그렇다면 만약에 고객이 새벽배송만 가능한 상품을 가지고 주문서로 간 뒤, 새벽배송 불가능 주소지를 입력하게 되면 그 주문서에서 "이 상품은 새벽배송만 가능한 상품입니다"와 같은 알람이 뜬 뒤에 주문서를 탈주해야 하는 시나리오였다.

주문서에서 주소를 받아 최종 결제를 진행한다.


결국 고객 경험에서 매우 좋지 못한 FLOW였고 이것을 위해 최소한 장바구니 단계에서 혹은 제품 상세페이지 단계에서 주소지를 넣도록 하기 위한 조치가 필요했다. (그 이유 때문이었는지 새벽배송을 하는 다른 업체들을 참고해보아도 모두 그렇게 하고 있었다.)

결국 그러기 위해서는, 주문서, 장바구니 쪽 모두 대대적인 손을 봐야 하는 상황에 직면하였다. 뿐만 아니라 제품 상세 페이지에서도 새벽배송이 가능한지 여부등을 정확히 안내해야 될 필요성이 있었고 이것은 나의 주문 목록에서도 마찬가지였다. 그리고 추가적으로 중요한 것은 새벽배송이 도입되게 되면서 기존에 택배로만 가던 우리 배송 체계가 변경되고, 새벽배송지인지 혹은 일반 택배 배송지인지에 따라서 출고 날짜가 다를 수 있다는 것이었다.... (주문 마감시간부터 택배사 휴일, 출고 가능 날짜까지 모두 다르다)

WOW..... 기존에 출고 예정일을 안내해주는 로직 역시 매우 복잡한 상태였는데 이제는 이것을 새벽배송까지 추가하여 정확히 안내해야 한다는 것이 쉽지 않았다. 또한 제일 큰 문제는 ... 고객들에게 일괄적으로 안내되는 출고일과 실제 출고일이 전혀 다를 수 있는 것이었다.

기존에 CX에서 나왔던 이슈 중에 한 가지는
고객님은 제품 상세페이지에서 분명 이 날짜에 배송이 된다고 하여서 구매를 하였는데 실제로는 그렇지 못했다는 것이다.
하지만 이 부분은 해당 시기에 고객님께 어떻게 안내되었는지 알아내기가 쉽지 않았고, CX처리 역시 쉽지 않았다.

그나마 매일매일 SCM팀이 출고작업을 진행해주었기 때문에 그동안 큰 이슈가 없었지만 (아무튼 다 출고가 되니),
고객에게 언제로 안내되었고 정확히 언제 출고가 되었는지는 새벽배송을 기점으로 더 중요한 이슈가 되었다.

상세페이지에서는 주소지 상관없이 특정 로직을 따라서 출고 예정일을 안내해주고 있었고, 그 대신 매일 돌아가는 출고 작업 로직 속에는 전체 상품을 가지고 와서 '이 제품은 제주도 배송지라서 제외시켜야 해 혹은 이 등록된 주소지는 주말 수령이 불가능하니깐 제외하자. 오늘 이 상품은 배치 가능 요일이 아니야 등"을 체크하면서 출고 작업의 속도는 나날이 늦어지고 있었다. 

그렇기에 상세에서 고객에게 안내되는 출고 예정일은 정확할 수가 없었고(정확하지 않으면 1~2일 과 같이 애매한 표현을 쓰게 된다.) 이것은 새벽배송이 도입되면서 더욱 복잡하게 될 예정이었다. 고객에게 안내되는 출고일자가 언제였는지 알 수 없기에 배송이 늦어진다 하더라도  CX처리는 불가능했고, 실제 우리 출고가 얼마나 정확하게 이루어지고 있는지 측정될 수도 없었다.

아무튼 다노샵 서버를 개발하고 있는 개발자로서, 이번 새벽배송은 선택의 기로에 선 것과 같았다. 사실 어찌 되었든 고객이 마주하는 결과물은 비슷할 것이기에, 기존의 것에 추가하여서 갈 것인지 아니면 새롭게 판을 만들지...

사실 기존의 것에 추가하여서 가도 기존의 출고 예정일을 뽑는 로직이 더 복잡해지고, 고객에게 안내가 정확히 안 나가고, 기존 배치작업도 더 시간이 오래 걸리고 그것밖에 없지만.....(내 몸도 편할 수 있다!!)
앞으로 다노는 10배 더 성장할 수 있다고 생각하고, 그렇다고 하면 지금이 결정을 내려야 하는 시기가 아닌가라는 생각이 들었다.

그렇게 나는 목표를 좀 다르게 잡았다. (목표를 보면 알겠지만 새벽배송에 대한 목표가 없다.)

 

 

위와 같이 7가지의 objective를 세웠고
아래와 같이 좀 더 구체적으로 하위 목표들을 세웠다.
위를 정확하게 달성하면 새벽배송과 같은 다양한 케이스도 충분히 처리할 수 있었다.

구체적 KR

  1. 출고 작업 간소화
    기존에 여러 개로 나뉘어서 관리되던 출고 작업을 한 군데로 모으는 작업.(출고배치, 출고배치그룹, 오전출고 등등)
    상황에 따른 출고 작업 (특정 상품 제외, 특정 상품만 선택, 제품별 마감시간 적용, 강제 주문 마감시간 설정, 주문 파일만 생성)
  2. 출고 작업 속도 10배 개선
    평소 1시간(오전 오후 출고 모두) 정도 소요되던 출고 배송 관련된 배치작업 ⇒ 5분 이내로 개선(10배는 오버인가...)
  3. 고객에게 명확한 배송일자 안내
    상세페이지 배송 관련된 안내 및 주문서 페이지 배송 관련 안내, 출고 작업, 마이페이지 모두 배송 관련 통일
  4. 출고 예정일과 실제 출고일 간의 간극 파악 및 트레킹
    위에서 통일된 고객에게 안내되는 출고 예정일과 실제 출고일 간의 간극 파악
    매일 마다 슬랙 알림을 추가하여 불편 받는 고객이 없도록 트레킹
  5. 출고 예정일이 늦어진 고객에 대한 CX처리 간소화
    출고 예정일이 늦어진 고객에 대한 알림톡 혹은 일괄 문자 전송 기능 추가
    주소지 변경 기능 ⇒ 고객이 직접 할 수 있으면 CX를 훨씬 줄일 수 있을 것 같다.(상품 준비 중 단계)
  6. SCM팀에서의 업무 효율성 극대화
    매일 출고될 수량에 대한 파악 admin
    배송이 늦어지는 상품에 대한 핸들링 (특정 제품 제외 후 출고 진행 / 특정 제품만 출고 진행)
    배송 준비 중 ⇒ 배송 보류 일괄 처리 등
    출고 마감 일시에 대한 핸들링
    다양한 출고 케이스 핸들링(수량으로 출고 등)
  7. 2주간 사고 0건

하나하나의 objective가 중요했고 꼭 달성해야 하는 목적들이라고 생각했다.

나의 머릿속에 떠나지 않았던 keyword는 
"고객에게 명확하게 출고일에 대해서 안내하고, 그 출고일을 저장해놓고, 그 출고일자에 배치작업이 이루어지면 된다." 였다.

즉 이것을 위해서 

  1. 먼저 고객의 주소지에 따라서 명확하게 출고일자가 안내되어야 하며
  2. 구매할 당시에 해당 출고일자를 저장해놓고
  3. 출고 배치는 오늘 날짜에 돌아야 하는 것들만 뽑아서 돌린다.

이렇게 되면 기존에 전체 상품을 대상으로 돌아가던 출고 배치가 더 이상 그럴 필요 없이 오늘 돌아가기로 한 주문건들만
그대로 돌려버리면 되니 속도도 충분히 개선될 수 있을 것 같았다.

아무튼 새벽배송 때문에 시작하게 되었지만, 다노샵 전반적인 출고 관련된 로직을 다 변경하는 작업을 하게 되었다.

그중에서 제일 중요한 로직은 바로 

  1. 고객의 주소지에 따라서 명확하게 출고일자를 안내되어야 한다 였다.

이것은 상품은 배송하는 업체마다, 혹은 상품에서 새벽인지 일반인지 그리고 휴일 정보 혹은 주문제작 상품, 제주 배송 건인지에 따라서 여러 가지 케이스로 나뉠 수 있었다.

새벽배송이 추가되면서 기존 출고 FLOW가 전체적으로 어떻게 변경되는지 확인해야 했고, 정확한 출고일을 계산하기 위해서 정말 중요한 것은 SCM팀과의 정확한 소통이었다. 나 혼자만의 생각으로 "이 날짜에 출고되어야 해"라고 짠 것이 SCM팀에서 보기에는 전혀 다를 수 있었고, SCM팀에서 바라는 니즈를 명확하게 파악하고, 정확한 출고일이 맞는지 뽑아내는 커뮤니케이션이 정말 중요했다. 

그렇기에 새벽배송을 시작하고 제일 먼저 한 것은 SCM팀과의 회의였다.

SCM팀과의 첫 번째 회의


그게 정말 힘든 일이기도 하였는데, 그래도 2년 동안 다노샵의 전반적인 로직부터 SCM팀과의 협업의 경험들이 그저 시간을 보냈던 것만은 아니었나 보다. 서로 무슨 이야기를 하는지 정확하게 파악할 수 있다는 것부터가 정말 감사했다. 

어떤 것들을 고려해야 하는지, 또 기존에 이미 짜여진 로직들을 어떻게 통합시킬 수 있을지 고민하고, 복잡한 것들을 단순화시키는 과정까지 전체적인 설계를 하는 일은 분명 쉽지 않았지만, 2년 동안 다노샵만을 했었기에 충분히 챌린지 할만했다.

다노샵 현재 모습에서 새벽배송을 추가하는 작업은 정말 그 누구가 와도 나보다 잘할 수는 없다고 자부심을 가졌다.
그리고 그것을 믿고 신뢰해주는 리더와 팀도 있었다.

제품 단위에서 새벽배송이 가능한지 혹은 새벽배송만 가능한지 등을 핸들링하고
각각의 상황에 맞게 출고 형태를 설정할 수 있도록 하였다.

기존에 흩어져 있던 출고 관련된 정보들을 모두 통합하여 새로운 형태의 출고 배치 통합관리를 신설하고, 거기에는 발송업체부터 
출고 형태, 주문 마감시간, 배송 휴일, 배치 가능 요일 등을 설정할 수 있도록 하였다. 

그렇게 상품 단위로 기본 배송, 새벽 배송으로 나누어서 출고 관련된 정보들을 엮어 놓고, 
이것을 바탕으로 정확한 출고 배치 일과 출고 예정일을 뽑는 로직을 구현하였다.
(출고 배치일은 우리가 출고되어야 하는 엑셀 파일을 만들어서 업체에 넘기는 시점이고, 출고 예정일은 해당 업체에서 출고가 되는 시점이다. 
때에 따라서 주문 제작 상품의 경우 다를 수 있다.)

다양한 케이스를 고려해야 했기에 이 로직을 잘 짜는 것이 정말 중요했고, 이 로직을 통해서, 제품 상세부터 장바구니, 주문서, 추후 출고까지 모두 관여하는 메인 로직이었다. 결국 로직이라는 것을 잘 짜기 위해서는 이것을 말로 풀어쓸 수 있어야 한다.

정말 이 로직을 짜기 위해서 화이트보드를 몇 번이나 지우고 새로 그리고 했는지 모르겠다.
분명 '오! 모든 케이스를 다 커버했다' 하고 나왔던 Flow도 갑자기 예외가 나오면서 수정해야 되는 경우가 다반사였다.

갑자기 이 사진들을 보는데 눈물이 앞을 가린다.

메인 로직은 아래와 같다.

1. 체크할 날짜를 넣는다.(오늘부터 시작)

2. 택배사 휴일인지 파악한다. (택배사 휴일은 새벽, 일반, 업체 발송에 따라 다르다.)
=> 휴일인 경우 하루를 추가하여 1번부터 다시 시작한다.

3. 오늘이 배치 가능한 요일인지 파악한다.
=> 배치 가능 요일은 배송 형태 혹은 제주 산간 , 주말 수령 가능 여부에 따라서 달라질 수 있다.
=> 불가할 경우 하루를 추가하여 1번부터 다시 시작

4.  체크하는 날짜가 오늘이면 주문 마감 시간을 확인한다.
=> 주문 마감 시간이 지났으면 하루를 추가하여 1번으로 시작한다. 

5. 배치 날짜와 출고일을 1차 FIX 하고 일반과 주문 제작 상품에 따라서 다르게 핸들링 처리한다.
- 이미 제작이 되어있는 일반 상품의 경우 출고 익일날 휴일인지 확인하고 그렇다면 1번부터 다시 시작
- 주문 제작 상품의 경우 배치 날짜는 FIX하고 출고 예정일을 대상으로 익일날 휴일인지 확인하며 출고예정일을 조정

6. 최종 배치 예정일과 출고 예정일 FIX

정말 간단해 보이는 이 로직을 만들기 위해 다양한 케이스들을 만들어서 테스트하고, 수정하고를 수없이 반복했다. 물론 이 로직도 완벽하지 않을 수 있고, 어떤 케이스가 또 생기느냐에 따라서 수정해야 할 수도 있지만 아무튼 이제는 다노샵의 출고 관련된 안내 및 실제 출고 작업은 모두 이 로직으로 통합되었다.

물론 여기서 끝이 아니었다.
이 로직을 바탕으로 세트 상품들은 어떻게 출고 작업을 진행할지 SCM팀과 논의하여, 하위 구성품들의 출고일을 바탕으로 새롭게 출고일을 계산하는 로직을 추가하고, 특정 케이스(장기간 휴무일이 있거나, 택배사 이슈 등)에 따라서 더 상위에서 핸들링할 수 있는 케이스들을 추가해주었다.

그리고 이 로직을 바탕으로 다노샵의 메인 로직들을 수정하였다. 제품의 상세페이지에서는 고객의 주소지를 모르니깐 일반적인 출고 예정일을 안내하며, 실제 고객이 장바구니에서 주소지를 입력하는 순간부터는 정말 정확한 출고일을 안내하여, 주문이 완료될 때는 그 안내된 출고 관련된 정보를 DB에 저장하였다.(물론 가상 계좌입금에 대해서는 실제 입금되는 시점에 또 핸들링되어야 했다...)

그렇게 되고 나니 정말 좋은 점은, 일단 우리가 오늘 보내야 하는 배치작업 및 출고 작업에 대해서 미리 파악하고, 
핸들링할 수 있는 것이었다. 

배송 업체별로 한번에 보는 출고 관련 정보 

결국 생각만 하던 실제 우리 다노에서 얼마나 출고를 잘 관리하고 있는지, 오차 없이 출고되는지 확인할 수 있게 되었고,
이때 따라서 CX처리도 훨씬 정확하게 처리할 수 있게 되었다.

그리고 무엇보다 중요한 출고배치작업!! 
과연 10배 성능 향상은 가능했을까??

평소 한 번 전체 주문건들을 대상으로 돌면 20분 ~ 30분 걸리던 작업은 ...
무려 1분 안에 끝나게 되었다!!!!!!!!!!!!!!!!!!!

전체 출고작업이 1분 안에 클리어 되었다!!


기존에 출고 배치 작업에서 체크하던 부분들을 전혀 체크해줄 필요가 없어졌기에 속도가 훨씬 더 향상될 수 있었다.
아무튼 기대한 것 이상이었다.

또한 다양한 케이스에 맞추어서 출고 배치 작업을 핸들링할 수 있도록 하였다.
특정 상품들만 출고를 진행한다던지, 특정 상품을 제외하고 출고를 진행할 수도 있고,
주문 마감 시간을 임의로 설정한다던지, 혹은 특정 수량만큼만 출고를 진행하고 싶다던지
그냥 출고 파일만 뽑아본다던지 등등
SCM팀에서 이야기한 다양한 요구 조건에 따라서 출고 배치를 등록할 수 있도록 하였다.

그렇게 위에서 이야기했던 Objective 중 몇 가지를 달성했을까?

1번 달성!
2번 달성!
3번 달성!
4번 달성!
5번 달성!
6번 달성!
7번은 달성을 위해 출고 작업이 많이 변경되는 만큼 서버 쪽 먼저 라이브 하여, 실제 SCM팀에서 테스트를 진행해주고 계시고 있고
아직 프런트 쪽이 라이브 전이라 더 파악해봐야 하지만, 테스트하면서 이슈들을 미리 잡고 있기에 달성할 수 있다고 믿고 있다...!!

새벽 배송과 관련된 작업이었지만,
목적을 새벽 배송에 두지 않았고, 다노샵 전반적인 출고 관련된 작업을 개선하기 위해 
목적을 잡았던 것은 정말 신의 한 수였다.

생각보다 스쿱도 커지면서 실제 고객 라이브 일정이 조금 밀리긴 했지만 아무튼 온전히 한 달 이상 이 작업만을 생각하면서
몰입할 수 있었던 시기인 거 같다. 

사실 사수분이 퇴사하시고 이런 큰 작업을 혼자서 진행하면서 압박도 많이 받았다. 이제는 정말 내가 실수해도 뒤에서 
봐줄 수 있는 사람이 없었기에 더더욱 실수하지 않도록 신경 써서 개발하여야 하였다.

그리고 막상 라이브하고 나니 허무하기도 했다. 정말 많은 부분 개선하였지만, 
실제로 성능이 개선되었을 것을 느끼는 사람은 매일매일 출고 작업을 진행하는 SCM팀이 전부였고,
내가 이것을 위해서 얼마나 많은 고민을 하고 노력했는지 공감해줄 수 있는 사람이 부재하는 것은 생각보다
크게 다가왔다.(실제로 공감하기 위해서는 비슷한 이해도를 가진 사람이 있어야 하는 것 같다.)

누군가에게 인정이나 칭찬을 바라고 했던 작업은 아니었지만,
사수분이 계셨다면, 분명 내가 했던 작업들에 대해서 진심으로 공감하고, 얼마나 노력을 해주었는지
알아주셨을 텐데... 뭔가 지금 내가 했던 작업을 얼마나 노력했는지 알아줄 수 있는 사람이 없고,
나도 언젠가 다노를 떠나게 되면 이건 그냥 나의 기억 속에서만 존재하겠지라고 생각하니 허무하기도 하였다.

아무튼, 다른 사람들이 몰라 준다고 해도,
내가 알고 있고, 정말 열심히 했다.

이 글은 무언가, 
스스로에게 수고했다고 적어놓는 글이다.

새벽남 이제 bye bye!

 

PS. 그리고 항상 개발의 마지막은 고객 반응이다...

SCM팀 대화 몰래보기

 

스크롤에 따른 이미지, 아이콘 회전시키기

친한 동생이 사이트에 적용하고 싶은 기능이 있었다.

스크롤을 하는 것에 따라서 사이트의 중간에 이미지를 하나 놔두고 
회전시키고 싶다는 것이다.

관련 참고 사이트는 : [NONFICTION 논픽션](https://nonfiction.kr/)

이것이었고,

관련해서 일단 image를 하나 넣어서
해당 이미지를 특정하고

<style>
    #id {
        position:fixed;
        bottom: 200px;
        margin: auto;
        z-index: 100;
    }
</style>

이렇게 head에 스타일을 준 뒤에 
회원을 줄 수 있는 스크립트를 추가해주었다.

<script>

    function scrollRotate() {
        let image = document.getElementById("id");
	    image.style.transform = "rotate(" + window.pageYOffset/2 + "deg)";
    }

	window.addEventListener('scroll',scrollRotate);

</script>

이렇게 해서 해결!
생각보다 간단하게 해결해서 나처럼 고생하는 사람들이 있을 것 같아 공유한다.

참고 link: [Frontend Shorts: How to rotate the element on scroll with JavaScript - DEV Community](https://dev.to/foundsiders/frontend-shorts-easily-rotate-the-element-on-scroll-with-javascript-1g4p)

테스트 코드의 작성은 한편으로 굉장히 크게 다가왔다.
아는 지인 개발자 분에게 들었는데, 아예 테스트 코드가 없으면
개발을 한 게 아니라고 본다고 하였다.

그렇다보니 스스로 테스트코드에 대해서 관심을 가졌으나,
직접 사용해보지 못하고 있었다.(물론 나의 학습 부족이 제일 컸다.)

앞으로는 이런 부분에 대해서 더 이상 미루지 않고
학습해서 부딪쳐보기로 하였다.

django에서 혹은 개발에서 테스트의 종류는 크게 3가지로 분류하고 있다.
참고 ( [Django 튜토리얼 파트 10: Django 웹 어플리케이션 테스트하기 - Web 개발 학습하기 | MDN](https://developer.mozilla.org/ko/docs/Learn/Server-side/Django/Testing))

  1. unit test(유닛테스트)
    1. 독립적인 class와 function 단위의 테스트
  2. Regression test(버그 수정 테스트)
    1. 발생하였던 버그에 대한 수정 테스트
  3. Integration test(통합테스트)
    1. 유닛 테스크를 완료한 각각의 독립적인 컴포넌트들이 함께 결합하여 수행하는 동작을 검증한다. 각 컴포넌트들의 내부적인 동작까지는 검증할 필요가 없다.
    2. 해석해보면 비즈니스 로직에 대한 검증인거 같다

구조 

app / tests /



__init__.py

test_models.py

test_forms.py

test_views.py

=> app아래에 tests라는 폴더를 만들고

해당 폴더 아래에 test관련된 파일들을 만든다.

 

실행

from django.test import TestCase



class YourTestClass(TestCase):

    @classmethod

    def setUpTestData(cls):

        print("setUpTestData: Run once to set up non-modified data             for all class methods.")

        pass


    def setUp(self):

        print("setUp: Run once for every test method to setup clean data.")

        pass

기본적으로 TestCase를 상속받아 만든 클래스는 2개의 메쏘드를 정의한다.

  • setUpTestData() 는 클래스 전체에서 사용되는 설정을 위해서 테스트 시작 때 딱 한 번만 실행됩니다. 테스트 메쏘드가 실행되면서 수정되거나 변경되지 않을 객체들을 이곳에서 생성할 수 있습니다.
  • setUp() 은 각각의 테스트 메쏘드가 실행될 때마다 실행됩니다. 테스트 중 내용이 변경될 수 있는 객체를 이곳에서 생성할 수 있습니다 (모든 테스트 메쏘드는 방금 막 생성된 ("fresh") 오브젝트를 입력받게 됩니다).

 

test코드 작성

from django.test import TestCase





class YourTestClass(TestCase):

    

    @classmethod

    def setUpTestData(cls):

        member = Member.objects.create(name='byeonguk')


    def test_name_label(self):

        first_member =Member.objects.get(name='byeonguk').first_name

        self.assertEquals(first_name, 'first name')


    def test_age_bigger_19(self):

        age = Member.objects.get(name='byeonguk').age

        check_age = age > 19

        self.assertTrue(check_age)

  • 체크해주는 함수
  • self.assertEquals => 생각한 값과 같은지 체크해주는 함수
  • self.assertTrue(True) => () 안의 값이 True인지 체크
  • self.assertFalse(False) => () 안의 값이 False인지 체크

 

test코드 실행

python3 manage.py test

 

test코드 더 많은 정보 출력하기

python3 manage.py test --verbosity 2
  • verbosity 는 기본적으로 1이며, 0,1,2,3으로 조절가능

 

test코드 일부만 실행하기

  • 테스트 중 일부만 실행하려면 패키지, 모듈, TestCase 서브클래스, 메서드의 전체 경로를 지정해주면 됩니다.
# Run the specified module

python3 manage.py test catalog.tests





# Run the specified module

python3 manage.py test catalog.tests.test_models





# Run the specified class

python3 manage.py test catalog.tests.test_models.YourTestClass





# Run the specified method

python3 manage.py test catalog.tests.test_models.YourTestClass.test_one_plus_one_equals_two

 

일단 어느정도 정리는 하였으니깐, 이제는 직접 작성해보면서 테스트를 해봐야겠다.

 

 

 

이런 모델이 있다.

class section_products(models.Model):
    products_list = models.ManyToManyField(Product, verbose_name="관련 상품")


이렇게 되면 products를 생성할 때 
section_products_prdocuts_list라는 모델이 하나 더 생성된다.

그래서 하나의 해당 객체를 가지고 와서 관련된 products_list를 뽑아와서 order하고 싶을 때,

section_products = SectionProducts.objects.get(id=10)

section_products.products_list.all().order_by('-id') 

=> 이렇게 하면 연결된 Product의 id로 정렬되어서 나온다.

 

하지만 내가 원하는 것은 새로 생성된 section_products_prdocuts_list의 

id로 정렬하는 것!

 

많은 구글링을 통해 해결하였다.

section_products.products_list.all().order_by('section_products_products_list.id') 로 해결

관련 글 : [python - How can I sort by the id of a ManyToManyField in Django? - Stack Overflow](https://stackoverflow.com/questions/1904978/how-can-i-sort-by-the-id-of-a-manytomanyfield-in-django)

 

brew를 통해 자바 개발 킷을 설치하는 도중
아래와 같은 에러를 만났다.

terminal에서 
brew cask install adoptopenjdk8 명령어를 입력했는데
Error: Unknown command: cask 와 같은 에러가 나왔다.

구글링 해본 결과 사용방법이 변경되었다고 한다.

brew install --cask adoptopenjdk8 로 변경해서 입력하면 잘 해결된다.

관련 스택오브플로우

stackoverflow.com/questions/30413621/homebrew-cask-option-not-recognized

 

Homebrew cask option not recognized?

I am following an online resource for installing two Mac utilities http://www.economyofeffort.com/2014/08/11/beyond-ctrl-remap-make-that-caps-lock-key-useful/ Here is the pertinent section: Instal...

stackoverflow.com

 

'서버' 카테고리의 다른 글

mysql replication 설정  (0) 2021.09.08
Graphql이란  (0) 2020.09.26
nslookup 이란  (0) 2020.08.31
초보자를 위한 REST API  (0) 2020.06.21
Docker란(도커란)  (0) 2020.06.02

내가 이번에 출시한 서비스는 웹서비스이다.
음 ... 요즘 앱의 접근성이 높지 않고,
(사실 내가 아직 앱을 만들지 못하는 것이 가장 큰 문제였지만)
우리가 원하는 결제 핸들링을 하기 위해서는 
당장에 인앱 결제들을 이용하면 불가능했다.(혜택을 받지 않으면 결제 이월)

추가적으로 빠르게 실험해야하는 테스트 환경에서,
다운 받아야지만 사용할 수 있는 앱을 만드는 것이 과연
옳은 일인가에 대한 의문도 들었다. 

아무튼 여차저차 이유로 React를 활용하여 웹으로 만들었는데,
결국에는 또 고객들이 편하게 웹서비스를 이용하게 할 것인가?
에 대한 문제에 부딪쳤다.

앱은 한번 다운만 받으면 쉽게 들어올 수 있지만,
웹은 그렇지 않으니 다음 번에 이용할 때는 또 어떻게 찾아서
들어와야 하는지에 대한 의문점들이 제기되었다.

이 부분에 대해서 참 아이러니 하지만 우리는 분명 
빠르게 개발하고 결제 핸들링을 우리가 하기 위해, 웹을 결정하였지만
개발자로서, 뭔가 내가 지금 당장 앱을 만들지 못해 그렇다라는 자괴감도 들었다.

뭐 아무튼 그건 다른 이야기이고, 
해결책을 찾아야 했다. 

그러다가 아래의 화면과 마주하게 되었다.

(참고 : bookmark.js 샘플영상 - https://youtu.be/M9c2qZWKf7M)

"오오오오??"

사실 크롬이나 사파리에서 제공하는
"홈 화면에 추가" 버튼만 잘 활용한다고 하면, 우리 아이콘을 각각의 모바일 사용자의 바탕화면에 추가할 수 있고, 그러면 정말 앱처럼 편하게 접근할 수 있게 되는 것 이기에(우리는 테스트하면서 이미 그렇게 하고 있었다.)

이것을 어떻게 하면 좀 더 편하게 추가하게 할 수 있을까 고민하다가 위의 글을 보게 된 것이다.

그렇게 나의 구글링이 시작되었다.
찾다보니 굉장히 많은 글을을 보게 되었는데,
아래에 해당 글들을 링크 걸어 본다.

[그누보드 QA - 모바일웹 '홈 화면에 추가하는 방법을 찾고 있습니다.](https://sir.kr/qa/309652)

사실 나와있는 대부분의 해결책이 네이버app을 활용한 바로가기 추가 버튼이었는데, 이 경우 네이버 app이 설치되어 있지 않다면 무용지물이 된다는 단점이 있었다.

그리고 어느 새 특정 키워드가 반복되고 있다는 것을 알 수 있었다.
"PWA를 활용해야 한다."

음 ... 새로운 것을 원천적으로 싫어하는 나에게는 굉장히 큰 허들이 아닐 수 없었다. PWA가 뭐야??
하지만 서비스 출시가 당장 눈 앞에 닥쳐 있기에...
누워서 찾아보던 나는 어쩔 수 없이 다시 책상에 앉았다.

그렇게 PWA에 대해서 찾아보기 시작했는데,
그 중에 처음 PWA에 대한 이해와 허들을 낮추어준 영상을 첨부한다.

[PWA가 뭔가요? (+모바일 앱의 종류) - YouTube](https://www.youtube.com/watch?v=NMdnzvPsGu8

 

추가 첨언하자면 PWA는 progressive web app으로,
웹앱을 좀 더 네이티브하게 활용할 수 있도록 발전시킨 기술이라고 할 수 있다.

이미 만들어진 우리 웹서비스에 간단하게 PWA를 적용하면,
이를 통해 우리는 훨씬 더 쉽게 고객들의 화면에 우리아이콘을 설치할 수 있도록 하고(이를 통해 완벽하진 않지만 거이 앱처럼 구동하도록 보인다.) 상단의 웹 URL창을 없애고, PUSH 알림까지 보낼 수 있도록 되는 것이다.

추가적으로 인터넷이 불안정하여 해당 서비스에 접근할 수 없을 때는 미리 캐시 해놓은 데이터들을 뿌려주어서 해결할 수 있도록 한 점 또한 매우 참신했다.

와 사실 정말 ... 더 이상 플레이스토어나 앱 스토어를 필요하지 않도록 만드는 기술이 아닌가 싶다. 오히려 고객들이 귀찮게 앱을 다운 받지 않아도 되고, 편하게 바로가기 아이콘을 설치해서 앱처럼 이용할 수 있다고 하면, 훨씬 그 허들도 낮을 뿐더라 앱을 업데이트해야지만 개선되었던 부분들 역시 웹이기에 바로 바로 적용된 다는 장점까지 있으니, PWA는 꼭 적용해야 되겠다는 생각이 들었다.

PWA 적용법은 생각보다 너무 너무 간단한데?! (물론 완벽하게 하자면 또 안드로메다로 가야 되겠지만...)  위의 YOUTUBE와 아래 사이트를 참고하면 된다.

[web.dev](https://web.dev/

 

web.dev

Get the web's modern capabilities on your own sites and apps with useful guidance and analysis from web.dev.

web.dev

 

이미 너무나도 잘 나와 있어서 
여기에 대해서 찾아보면서 보게 된 좋은 아티클 등을 공유하면서 마무리하고자 한다.

 

앱스토어의 종말 - https://brunch.co.kr/@bundi/31

 

앱스토어의 종말

프로그레시브 웹 앱 (Progressive Web App)과 앱스토어 | *다음은 아래 글에 대한 번역입니다. https://onezero.medium.com/the-end-of-app-stores-is-rapidly-approaching-b972da395097 앱스토어의 종말 프로그레시브 웹 앱 (Prog

brunch.co.kr

 

Progressive 웹 앱이 드디어 iOS에서도! | Sophie writes code - https://sophiedophie.github.io/2018/04/23/progressive-web-app-ios/

 

Progressive 웹 앱이 드디어 iOS에서도! | Sophie writes code

Articles 섹션에서는 영어공부 & 정보 습득을 위해 저에게 필요한 글들을 번역해서 공유합니다.혹시 문제가 된다면 저에게 연락해주세요! seohee.sophie.kwon@gmail.com이 글은 ‘Progressive Web Apps on iOS are he

sophiedophie.github.io

 

iOS 13 및 14, iPhone 및 iPad의 PWA (Progressive Web Apps) - https://love2dev.com/pwa/ios/

 

Progressive Web Apps (PWA) on iOS 13 & 14, iPhone & iPad

Progressive Web Apps are great solutions for business success despite the iOS 13 & 14 not supporting all modern web platform features. Learn why PWAs are better than native apps for your business

love2dev.com

 

위의 글들을 보면 알 수 있지만 구글에 비해 애플은 아직 PWA에 대해서 굉장히 소극적으로 대응하고 있고 이 때문에 간단하게 구글에서는 띄울 수 있었던 web app download 권유를 사파리에서는 할 수 없다.

developer.mozilla.org/ko/docs/Web/Progressive_web_apps

추가적으로 IOS에서 해당 기능을 쓰기 위한 방법들

[javascript-PWA : 프로그래밍 방식으로 트리거하는 방법 : "홈 화면에 추가"? iOS Safari-스택 오버플로](https://stackoverflow.com/questions/51160348/pwa-how-to-programmatically-trigger-add-to-homescreen-on-ios-safari)

 

[iOS 사용자가 Ember에 프로그레시브 웹 앱을 설치하도록 장려-DockYard](https://dockyard.com/blog/2017/09/27/encouraging-pwa-installation-on-ios)

 

[iOS PWA를 네이티브 앱처럼 느끼게하는 6 가지 팁 | 모바일의 Netguru 블로그](https://www.netguru.com/codestories/pwa-ios)

 

카카오 인앱 브라우저 => 외부 브라우저 띄우기

 

[카카오, 네이버 인앱에서 외부 브라우저 띄우는 방법 정리 [Android/iOS]](https://www.burndogfather.com/201)


이제 이 부분을 개선하기 위해 전 다시 가봅니당 총총...

기본적인 templates에서 vue 구조 사용하기

기본적인 vue구조
<script type="text/javascript">
new Vue({
      el: '#starting',
      delimiters: ['{{','}}'],
      props : {
            {test: ''}
        },
      data: {
        articles: [],
        loading: true,
        currentArticle: {},
        message: null,
      },
      mounted: function() {
      },
      methods; {
      },
      components: {
      }
 })
</script>


vue.js에서 el은 id를 의마한다. => react에서는 id=root를 사용해서 지정해주는 것과 같다.
따라서 제일 상단에 id로 해당 staring을 지정해줘야 한다.

<div id="staring">
	<v-app>
    </v-app>
</div>

props는 상위 컴포넌트에서 하위 컴포넌트로 state를 넘길 때 사용한다.
아래와 같이 사용하면 된다.
하위 컴포넌트에서는 props : 에 받는 인자들을 적어주면 되고,
상위에서는 해당 컴포넌트를 쓸 때 같이 적어주면 된다.

# 상위
# 사용할 컴포넌트를 지정해주고
data : { 
	'test': ''
}
components: {
	'products' : Products
}


# 코드라인 (같이 state을 넘겨준다.)
<products :test='test'> </products>




#하위 Products 컴포넌트
# props에 받은 state를 적어주면 data에 따로 test model을 지정해주지 않아도 쓸 수 있다.
# 단 해당 변경점을 상위 컴포넌트로 다시 전달하려고 하면 function을 걸어주어야 한다.

props : {
	'test' : ''
}

dlimiters는 아래의 data를 사용할 때 사용할 태그를 정의한다.
예를 들면 dlimiters를 [[ , ]] 로 지정해놓았다면

<div>
	[[ test ]]
</div>

와 같이 하면 아래 지정해놓은 data test를 화면에 쓸 수 있다.

methods 는 사용할 함수를 지정할 수 있다.

# 함수 지정

methods : {
	sayHello(){
    	alert('안녕이라고 말해')
    }
	
}



# 코드 내에서 사용
<v-btn
	@click="sayHello">

</v-btn>

 

추가적으로 지정해놓은 함수를 하위 컴포넌트로 넘길 수도 있다.

# 상위
# 사용할 컴포넌트를 지정해주고
data : { 
	'test': ''
}
components: {
	'products' : Products
}
methods : {
	sayHello(){
    	alert('안녕이라고 말해')
    }	
}



# 코드라인 (같이 state을 넘겨준다.)
<products :test='test' @say-hello="sayHello"> </products>




#하위 Products 컴포넌트
# $emit을 통해 상위 컴포넌트에서 내려준 해당 함수를 하위 컴포넌트에서 호출 할 수 있다.

props : {
	'test' : ''
}

methods : {
	TestSayHello(param){
    	this.$emit('say-hello', param)
    }
}

좋은 글이 있어서 링크 첨부 :

[NodeJs/VueJs] 상위, 하위 컴포넌트간 데이터 전달 방법

 

[NodeJs/VueJs] 상위, 하위 컴포넌트간 데이터 전달 ᄇ

안녕하세요. 이번에는 Vue 를 사용하면서 저를 많이 혼란스럽게 했던 기능 중 주요 기능인 상위, 하위 컴포넌트간 데이터 전달 방법에 대해 살펴보려고 합니다. 오늘도 미래의 저에게 도움이 될

question0.tistory.com

mounted()를 활용하면 아래  methods에 지정해놓은 함수를 랜더링 이후에 1회 실행한다.

data : { 
	'test': ''
},
components: {
	'products' : Products
},
# 랜더링 이후 해당 함수 1회실행
mounted() {
	sayHello()
},
methods : {
	sayHello(){
    	alert('안녕이라고 말해')
    }	
}

이런 상품 어때요?

 

카테고리 베스트 상품이에요!

 

골든박스상품이에요!

 

 

# 위의 링크들로 구매시 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다

올해 내가 어떤 목표를 세우고,
어떤 challenge를 하고,
어떤 생각을 하면서 살았는지는
하루 하루를 보면 생각보다 보이지 않는다.

그렇지만,
1년이 끝난 뒤에 명확하게 보여진다.
매일 매일은 크게 이루는 것이 없지만,
이 기간이 쌓이면 내가 어떤 일들을 이루었는지 보이게 된다.

예기치 못했던, 여러 일들이 있었지만
또 매년 적을까 말까 고민하지만, 기록해놓지 않으면 반성도, 개선도 할 수가 없기 때문에
그래도 2020년을 마무리 하면서 회고글을 적어 본다.

나에게 2020년은 크게
4가지 분야에서 목표를 가지고 있었다.

  1. 개발자로서 인정받기

  2. 내가 목표한만큼의 수익 창출하기

  3. 건강 챙기기

  4. 새로운 비즈니스 도전하기

그리고 각각의 목표들은 세부 목표들로 나누어졌다.

  1. 개발자로 인정받기

    1. 연봉 협상에서 00 금액만큼 제안 할 수 있는 실력 갖추기

  2. 내가 목표한만큼 수익 창출하기

    1. 이전 사업하면서, 그리고 개발 공부하면서 생겼던 모든 빚 청산하기

    2. 매월 00 금액만큼 수익 창출하기

    3. 돈 쓰는 습관에서 돈을 모으는 습관으로 바꾸기

  3. 건강 챙기기
    1. 철인 풀코스 완주하기
    2. 마라톤 풀코스 완주하기
    3. 바디프로필 촬영하기
  4. 새로운 비즈니스 도전하기

    1. 팀 결성 하기

    2. 새로운 사업 challenge하기

그렇게 책상 앞에 상반기 / 하반기로 나누어진 계획표를 뽑아서 코팅지에
코팅해 붙여놓고, 올 한해가 시작되었다.

1. 먼저 내가 올 한해 하고자 했던 가장 큰 것은 "개발자로서 인정 받기" 였다.

분명 다른 분야에서 개발을 시작했고, 그 동안 다른 일을 해왔던 만큼 내가 다른 것에서 할 수 있는 것은 많다고 생각했지만 그것이 내가 개발자로 일하고 있는 지금에는 별로 유의미하지 않았다.

아무튼 나는 현재 회사에서 "개발자"로 일을 하고 있고, 작년이야 어떻게 운이 좋아
취업을 했다고 하지만 이제는 정말 개발 실력으로, 인정 받고 싶었다. 그냥 쌀 팔다 개발자가 되어서,
강의나 하고 개발은 뒷전이다라는 그런 소리를 듣고 싶지 않았다. 아무튼 나는 스스로 진지하게 개발을 하고 있고, 
개발자로 인정 받고자 하였다.

그리고 그것을 인정받을 수 있는 가장 명확한 수치는 "연봉"이라고 생각하였다.
1년 전에는 그냥 신입이라는 평균에 맞추어서 연봉이 측정되었지만, 아무튼 1년 뒤에는 정말 나의 실력으로
회사에서도 연봉을 측정할 것이고, 그것이 내가 개발자로서 인정을 받았는지, 아닌지가 가장 명확하게
판단 될 거라고 생각하였다.

그렇게 올 한해 개발자로 인정 받기 위해서 어떤 노력들을 했을까?
사수분께 들은 이야기지만, 개발자로 인정 받기 위해서는 2가지 중에 한 가지는 해야 한다고 하였다.

  1. 주어진 업무를 빠르게 파악하고, 정해진 시간 안에, 혹은 더 빠르게 해결하거나

  2. 업무를 조금 느리게 하더라도, 내놓은 결과물이 늦은 게 이해가 될 만큼 잘하거나

그리고 내가 개발을 시작하기 전에 조언을 구했던 개발 5년차의 형님은 이렇게 이야기 해주셨다.

(최근에는 전화해서 왜 그때 개발자 한다고 했을 때 말리지 않았냐고 화냈다 ...)

"신입에게 바라는 것은 시간이 걸리더라도 어떻게든 업무를 해내는 것, 경력에게 바라는 것은 그 업무를 빠르게 문제 없이 해내는 것. 업무를 해내는 것은 가장 기본이다."

그렇다. 일단 회사에서 업무를 한다면 주어진 업무를 잘 해내야하고,
그게 예상한 속도보다 빠르다면,  인정받을 수 있겠구나라고 생각했다.

업무를 빠르게 파악하고, 해결하기 위해서는 제일 큰 것은 바로 회사의 기존 코드를 파악하고 있는 것이다. 모든 코드를 파악하기는 힘들지만, 다노샵 쇼핑몰의 workflow를 따라가면서, 어떤 api들이 호출이 되고, 해당 api에서 어떤 함수들을 처리하고, 장바구니, 구매하기, 구매 완료, 그리고 이후 배송, 반품 등의 전체적인 flow를 따라가면서 정리하였다. 이 작업은 업무시간에는 할 수 없기 때문에 개인적으로 시간을 내어 (보통 주말에 많이 하였다.) 해당 함수들을 반복해서 보았다.

그러다보니, 어느 순간 업무를 바라보았을 때 어디 부분을 어떻게 고치면 되는지 떠오르기 시작하였고, 내가 미리 해당 업무를 시작하기 전에 업무 일정을 조율할 수 있었다. 정말 내가 이렇게 성장 하기까지 옆에서 나의 성장에 맞는 적절한 task를 주면서 가끔은 술도 사주시면서 키워주신 사수분의 영향이 도움이 컸다. 올해 7월에는 조직이 개편되면서, 다노샵 서버 팀에도 다른 멤버들이 생겼지만 그 전까지 2019년 7월부터 2020년 7월까지 1년 동안 아무것도 모르는 신입 하나를 데리고 (말만 잘하는...) 다노샵 서버를 아무 이상 없이 이끌어 가신 것은 정말 ... 지금 생각해도 그저 갓;; 이 글을 보지 않으실 거지만 정말 너무 감사한 거 투성이다.ㅠㅠ
이제서야 느끼는 것이지만 앞에서 사람을 이끌어 간다는 것은 정말 쉽지 않은 일이다.

물론 일을 잘 하기만 했던 것도 아니었다.ㅎㅎ 어느 정도 일이 익숙해졌다고 생각하고 조금 긴장을 늦추었을 때,
큰 이슈를 만들어내기도 하였다. [주니어 개발자의 Django ORM 수난기] daeguowl.tistory.com/171

 

주니어 개발자의 Django ORM 수난기

현재 다노에서 다노샵 서버 개발을 하고 있는 대구올빼미입니다.( 올빼미지만 밤 10시에 자는 건 비밀 ) 그리고 현재 다노샵 서버는 python을 베이스로 django 프레임워크를 활용하여 구성되어 있습

daeguowl.tistory.com

이 밖에 크게 기억에 남는 작업들도 있다.

다노샵 뒤에서 돌아가던 task들이 모두 리눅스의 Cron으로 돌고 있었는데
이것을 모두 celery로 이전하는 작업을 진행하여 뒤에서 돌아가던 업무들의 효율을 높인 것,

SCM팀에서 매일 진행하던 출고 작업을 대폭 개선하여 12시에 정오 출고를 진행하면
항상 점심을 따로 먹고 하던 SCM팀이 크루들과 같은 점심 시간을 가질 수 있도록 한 것

기존 재고 기준들을 변경하여, 하위 실재고를 추가
실제 재고와 동일하게 파악할 수 있도록 한 것,

상품이 품절 되었을 때 예약판매를 진행할 수 있도록 기능을 추가한 것,

마케팅 프로모션 업무를 모두 자동화하여 해당 시간에 일괄 시작될 수 있도록 한 것,

고객들의 택배 관련된 CS를 해결하기 위해 30분 마다 돌아가는 택배 크롤러를 만든 것 등이 있다.

아 참 그리고... 무엇보다 큰 기억에 남는
매거진 리뉴얼 작업 ㅠㅠ (이건 정말 따로 글도 적었다.)

프론트를 한번도 해보지 않은 상황에서, 회사에서 돌아가야 하는 프론트를 만드는 것은,
정말 쉽지 않은 일이었다. 스스로에게도 많은 challenge가 되었고, 나 스스로도 개발자로서 한 단계
더 뛰어오르는 계기가 되었다.

매거진 작업하면서 가장 많이 보았던 짤

 

 

다노 매거진 개편 프로젝트를 완료하며...

올 한해 여러가지 프로젝트를 진행했지만, 정말 나의 피, 땀, 눈물이 들어간 프로젝트를 마무리하며 회고글을 적어보고자 한다. 사건의 발단 : 현재 다노에서는 매주 or 2주 단위로 1on1 이라는 것

daeguowl.tistory.com

아무튼 정말 다양하고 많은 일들을 했지만 내가 올 한해 다노샵 서버 개발자로 일을 하면서, 가장 크게 느낀 것은
임팩트 노트(다노에서의 평가는, 스스로 적는 임팩트노트와, 주변 동료들의 피어리뷰로 이루어진다.)에 적은
마지막 문장이 가장 적합하다. 

"사실 위의 업무들은 스스로의 평가를 위해 나열한 부분이고
개인적으로 생각하는 제가 이룬 가장 큰 성과는 제 스스로 다노샵 
서버개발자로서 다노샵에 애정이 생기고, 다노샵에 에러가 발생하면 가슴이 아프고, 
언제, 어디서, 무엇을 하고 있던지 다노샵에 무슨 일이 생기면 최우선으로 
해결하기 위해 마음으로서 노력하였다는 점입니다."

위의 말은 단순히 좋은 평가를 위해 적은 말이 아닌, 정말 내가 스스로 1년 동안 다노샵 개발을 하면서 가장 크게 변한 점이었다.
에러가 나면 "사수분" 혹은 "내"가 봐야했기에(그렇기에 에러를 봐야하는 핑계로 스마트워치도 구매해서 늘 차고 있었다.)
정말 어딘가를 갈 때는 꼭 노트북을 가지고 다녔고(처음에는 내가 해결 할 수 있던지 없던지는 딱히 중요하지 않았다. 내가 해결하지 못하더라도, 문제를 보고 전파하는 것에 집중했다.) 
처음에는 아무것도 몰랐던 다노샵 서버에도 나의 코드가 점점 많아지고, 내가 만든 기능들이 사람들에게 좋은 임팩트를 미치고,
그렇게 미운정 고운정 보내며 시간을 보내다 보니 어느 순간 저런 마음이 들었다. 그렇게 처음에는 해야되겠다 의무적으로
생각하여서 하였던 일들이 이제는 마음으로서 자연스럽게 되어 있었다.

그렇게 1번의 목표는 과연 이루었을까?
사실 1번의 성공 여부를 측정하는 것이 연봉이라고 생각했지만, 연봉보다 더 중요한 것이 있었다.
바로 주변 동료들의 피어리뷰였다. 임팩트노트의 경우 내 스스로 한 것들을 적는 것이지만, 피어리뷰는 정말 나와 함께 일하는 동료들이
주는 평가였다. 피어리뷰를 받은 것을 바탕으로 CTO님과 이야기 하면서, 
나는 1번의 목표를 이루었다고 스스로 결론 내렸다. 단순히 연봉으로는,
내가 회사에서 인정받고 있다는 것을 판단하기에는 부족했다. 무엇보다, 나와 함께 일한 동료들의

인정이 나에게는 더 중요했던 것이다.

그리고 올 해의 목표치를 설정하는 것에서, 나는 올 한 해도 또 복지가 되는 동료가 되기 위해
더 노력해야 되겠다 다짐했다.

2. 내가 목표한 만큼의 수익창출

그리고 2번 째 목표였던 내가 목표한 만큼의 수익창출
이 목표는... 정말 돈이 없어보니깐 힘들다는 것을 몸소 깨달으면서 생기게 된 목표였다.

분명 쌀 가게를 운영하면서 수익을 창출했었지만, 마무리를 하면서 이것 저것 정산을 하다보니,
금전적으로 넉넉하지 못 했고, 그 상태에서 서울에 올라와 공부하다 보니 정말 많은 빚이 생겼다.... ㅠㅠ

작년 8월 누나에게 마지막으로 돈을 빌리면서(그래도 이렇게 돈을 빌려주는 가족이 있어서 다행이다.)
정말 1년 뒤의 올해 8월에는 다 갚겠다고 약속을 했었다.(사실 이거 자체가 그냥 직장 생활만으로는 절대 불가능 했다.)

정말 운 좋게도, 군대 복학 이후에는 지속적으로 사업을 해왔기에 일반 대학생들에 비해서는 여유로운 편이었고,
딱히 돈에 대해서 크게 고민을 해 본 적이 없었다. 무언가 사고 싶은게 있으면 크게 고민하지 않고 구매하였다.
그랬던 내가 정말 돈에 대해서... 이렇게 힘들어 보기는 처음이었다. 결국 절대 하면 안 된다는 카드깡?(갤럭시 폴드를 카드로 6개월 할부로
구매한 뒤, 현금으로 팔아서 사용하였다.. 정말 갖고 싶었던 폴드였는데, 기계는 없고 매달 돈이 나가는 것이 정말 너무 슬펐다.)
까지 하게 되었다.

그리고 그 동안 사업을 하면서도 돈보다는 더 큰 비전을 항상 쫒아야 한다고, 생각했다.
그런데 돈이 없으니깐, 아무것도 할 수가 없었다. 돈 때문에 고민하는 것이 얼마나 스트레스인지, 이제서야 알게 된 것이다.

그리고 권도균 대표님의 이야기가, 내 뼈를 때렸다.

"돈 보다 중요한 가치들은 너무나도 많다. 하지만 그 중요한 가치들을 온전치 추구하기 위해서는 돈이 필요하다."

그렇게, 나는 나의 생존을 위해, 그리고 돈 보다 더 중요한 가치를 위해 돈을 벌어야 되겠다 생각했다.
아무튼 약속은 했고, 올해 계획에 넣었다. 그래서 내가 할 수 있는 일들을 찾았다.
단순히 돈은 버는 행위 자체를 떠나서 내가 좋아하고 의미있는 일들을 하면서 수익 역시 창출하고 싶었다.

그렇게 나는 매주 일요일 스파르타 코딩클럽 튜터 활동을 하였다.

원래는 퇴근 후 매주 2회 하던 것으로 처음 시작하였는데, 회사 업무가 어떻게 될지 몰라
굉장히 부담스러웠다. 그래서 한번 진행한 뒤 부터는 주말로 변경하여서 지속적으로 튜터 활동을 하였다.

튜터 활동을 하면서 나 역시도, 수업 내용 자체가 어렵진 않았지만 남들에게 설명할 수 있도록
개발 수업 준비를 해야하였고, 또 수업을 진행하면서 다양한 분야의 사람들과 이야기 할 수 있어서 
좋은 영향을 받을 수 있었다.

그렇게 올해 3월부터 매거진을 진행하게 된 9월까지 나는 총 6개월간 3개 기수, 24분의 튜터 활동을 지속하였다.
(매주 일요일은 튜터활동으로 시간이 순삭되었다.)

다들 개발에 대한 열정이 대단하셨다. 6시간 내리 수업을 하고도, 남아서 개발을 더 하셨다. 나에게도 굉장히 큰 자극이 되었다.

몇 몇 분은 아직도 연락을 주고 받으면서, 지내고 있다.
분명 수업을 가르치러 갔는데, 돌아보니 내가 더 많이 배웠다. 너무 좋은 추억이다.

그리고 탈잉 수업을 지속했다. 개발자를 처음 준비하면서 너무 고생했었기에, 누군가가 개발자를 하고 싶어하시는 분이 있으면, 나와 같은 시행착오를 겪지 않았으면 했고, 내 수업이 도움이 되었으면 했다. 그렇게 스파르타 코딩클럽이 없는 격주 토요일 저녁에는 탈잉 수업을 진행했다. (그래서 나에게 휴일은 격주 토요일 박에 없었다.ㅠㅠ) 정규 시간은 6시 ~ 9시까지 3시간이었는데, 하나라도 더 알려드리기 위해 노력하다 보니, 항상 30분 ~ 1시간씩 넘기 일쑤 였다. 그래도, 이런 내 마음이 전해졌는지 많은 분들에게 정말 과한 평가를 받았다. 탈잉에서 우수 튜터로 뽑히기도 하였다.

그리고 주말에 시간이 되서 듣지 못한다는 분들을 위해 해당 수업을 그대로 온라인으로 옮겨 인프런에서도 수업을 오픈하였다.
인프런에서는 "개발자 취업 입문 개론"이라는 이름으로 수업을 진행하고 있다. 

 

비전공자를 위한 개발자 취업 개론 - 인프런

개발자 취업 입문 개론 수업입니다. 평생 한 직업만 하실 게 아니라면, 꼭 한번은 개발자를 도전해 보시길 추천드려요! 비전공자 혹은 현재 다른 업무를 하더라도, 상관없습니다. "쌀 팔다 개발

www.inflearn.com

본격 쌀 파는 강의라고 놀리던 수업이 그래도 많은 분들께 도움이 된 것 같아 기분이 좋다 ㅠㅠ

탈잉과 인프런 모두 후기가 100건이 넘었고, 평점은 4.9점 이상을 유지하고 있다.
그리고 내 수업을 듣고 올해 취업했다고 연락오신 분이 정말 너무 많다. 이런 연락을 받을 때 마다, 
내가 조금이라도 좋은 영향을 끼친 것 같아서, 너무 행복하다.

이런 연락을 받을 때 마다, 정말 너무 감사하다.


사실 내가 한 것은, 방향만 잡아 준 것이지, 이 분들이 개발자로 취업하기 위해 얼마나 노력 하셨는지,
생각만해도 정말 대단하다. 나는 항상 수업 때, 수업을 들을 때마다, 실제 개발 공부를 해가면서 궁금한 게 더 많을 것이라고, 
취업 전까지는 항상 편하게 연락을 하시라고 이야기 드리고(대신 취업하시면 밥을 사달라고...) 지금도 매일 한 두분씩은 상담을
도와드리고 있다.

사실 탈잉과 인프런에서 하고 있는 개발자 취업 입문 수업은, 수익 창출보다는 
나의 꿈 중 하나인 많은 사람들에게 선한 영향력을 끼치는 것의 일환으로, 현재 내가 할 수 있는 일 중에서
선한 영향력을 끼치기 위해 하고 있다.

그리고 올해 6월, 7월 2달의 시간을 정말 힘들게 하였던... 마이비스킷에서의
비전공자를 위한 IT기초지식 수업 촬영... 이렇게 공식적으로 올라가는 수업을 처음 촬영 해보았는데, 마이비스킷에서 원하는 퀄리티가 상당히 높아서, 애를 많이 먹었다ㅠㅠ 가격적인 부분(정말 저렴히 하고 싶다)에서 나의 영향력이 거이 미칠 수가 없어서, 사실상 촬영 이후 제대로 신경을 쓰지 못 했다. 정말 많은 시간을 들여서, 힘들게 혼자서 수업 만들고, 촬영하고, 편집하고 모든 것을 하였지만 들였던 시간에 비해서 수익을 창출하지도, 많은 분들에게 임팩트를 미치지도 못했다. 항상 잘 될 수 없으니, 그리고 동영상 편집 기술을 익혔으니, 또 긍정적으로 생각하면서 넘어 간다. 

그나마, 스튜디오 같은 장면을 만들기 위해, 2달 동안 나의 방은 저런 형태로 있었다.....

 

온라인 취미 클래스-개발자와 커뮤니케이션이 술술 풀리는 비전공자를 위한 IT지식

개발분야 (프론트엔드,백엔드) 개발 분야 (프론트엔드, 백엔드) 개발 분야 (프론트엔드, 백엔드) 2

www.mybiskit.com

아무튼 계약 기간도 정해져 있었던 것이라, 마지막에는 그나마 없었던 휴가까지 모두 써가면서 완성하였다.
그래도 나에게는 새로운 주제로, 새롭게 공부하면서 도전하였던 것 중 한 개이다. 

그렇게 나는 2번의 목표를 이루었을까? 
일단 누나와 약속하였던, 8월보다 앞당겨 7월에 누나 빚을 포함한 그 동안 가지고 있었던 모든 빚을 청산할 수 있었다.
그렇게 나를 따라 괴롭히던 모든 것들을 성실하게 처리한 것의 결과로, 현재 나의 신용등급은 1등급, 점수제로 변경된 신용도 점수에는 1000점을 기록하는 기염을 토하였다...ㅎㅎㅎ(뭔가 잘못되지 않았을까 생각한다)

물론 내가 계획한 것 만큼의 수익은 창출하지 못 하였지만,
제일 중요했던 1번(개발자로 인정 받기)을 이루기 위해서, 더 이상의 시간을 전략적으로 투자하지 않고
빚을 청산한 문제를 해결한 뒤에는 이외의 시간들은 모두 개발에 투자하였다.

3. 건강 챙기기

건강은 항상 살아가면서 굉장히 중요한 이슈이다. 건강에 대해서는 나의 생각은 명확하다.
옛날에 워낙 고도 비만으로 살아가면서, 상처도 많이 받았기에 나는 고등학교 때부터 15년동안 지속적으로 다시 돌아가지 않기 위해 노력을 하고 있다.
사실 다이어트라기 보다는, 규칙적으로 먹고, 과식하지 않고, 꾸준히 운동하기라고 볼 수 있고
나중에 내가 결혼을 하더라도, 사랑하는 사람과 정말 건강하게 오래 살고 싶기 때문에(행복한 가정을 꾸리는 것이 굉장히 큰 인생 목표 중 하나이기에) 나는 건강하고 싶다. 그리고 좋은 컨디션을 항상 유지하고 싶다.

그것을 확인하는 일환으로, 올해 3개의 목표를 세웠다.
제일 먼저 마라톤 풀코스 완주하기 => 개인적으로는 작년 하프 철인대회(수영 1.9km, 사이클 90km, 러닝 20km)에서 뛰었던 20km가 
가장 긴 거리였기에, 마라톤 풀코스를 한번 도전해 보고 싶었다. 사실 나 같은 경우 위에 이야기 했던대로, 건강을 유지하는 것이 그 목적이기 때문에 따로 해당 대회를 나가기 위해 준비한다기 보다는 평소 언제 뛰더라도 나의 체력이 저정도는 되었으면 하였다.

물론 알다시피 올해는 코로나로 인해, 5월에 접수하였던 풀코스 경기가 취소되어서, 개인적으로 풀코스 까지는 아니지만 30km를 뛰는 것으로 만족하였다. (더 뛸 수 있지만 다음 번 대회에서 42.195km를 뛰기 위해 뛰지 않은 것으로 생각하기로 하였다.)

그리고 올해 9월 예정 되었던 철인 풀코스 경기... 
철인 경기는 올림픽, 하프, 풀코스로 나누어진다. 
보통 우리가 철인 경기를 한다고 하면 대부분 올림픽 코스이다. 올림픽 코스는 수영 1.5km / 사이클 40km / 러닝 10km 로 이루어져있다.
대략적으로 시간은 3시간~4시간이 걸린다. 여기까지는 평소에 운동을 하였던 사람이라면 도전 할 수 있다.(사실 수영만 끝나고 나면, 사이클은 천천히 자전거타고, 러닝은 걸어도 된다.)

그리고 그 다음이 하프이다. 수영 1.9km / 사이클 90km / 러닝 20km 로 이루어져있다. 완주한다고 가정했을 때
보통 시간은 7시간에서 8시간정도 걸린다. 이때부터는 약간 재미없다... 생명을 깍아 먹는 듯한 느낌을 받으면서 
도전해야 한다. 더 이상 즐겁게 할 수 있는 대회가 아니다. 건강하게, 즐겁게 운동하기를 바라는 나에게는 여기까지가 딱 도전적이고 
알맞다. (사실 올림픽이 제일 적당하다.) 아무튼 하프를 작년에 도전하여서 완주하였고, 올해의 목표는 풀코스였다.

풀코스는 딱 하프의 2배인데, 수영 3.8km / 사이클 180km /  러닝 42.195km로 이루어져있다. (적으면서 내가 이걸 도전하겠다고,
마음 먹은 것에 대해서 후회하고 있다.) 완주 한다고 가정했을 때 (포기하는 사람이 정말 수두룩하다.) 14시간 ~ 17시간정도 걸린다.
풀코스는 새벽 6시에 출발해서 밤 12시까지 진행된다. ㅎㅎㅎㅎ 이때부터는 그냥 내 생명이 1년은 준다고 생각한다.
그리고 참가비도 무려 70만원이나 한다. 적지 않은 돈까지 내면서, 생명을 깍아 먹는 운동을 한다는게 이해가 되지 않는다.
그렇지만 아무튼 철인 사이에서는 풀코스까지 해야지 정말 철인이다라고 하는 이야기가 있고,
나는 올해 도전하고자 하였다. 다행인지 불행인지, 돈까지 다 내놓은 경기가 역시나 코로나 때문에 취소되었다. 
취소가 되었는데 왜 환불해주지 않고 이월시키는지 이해가 되지 않는다. 자연스럽게 내년의 목표로 넘겼다 ㅠㅠ 

그리고 마지막 3번 째 목표는 바디프로필 찍기였다.
근데 이것도 참 할 말이 많은데... 아무튼 결론적으로는 12월에 촬영하기로 하였던 3달 전 탈장 수술을 받으면서,
2달 이상을 운동을 아예 할 수가 없게 되었다. 철인을 같이 하는 형님들과 같이 촬영을 하기로 했던 것이라,
취소 할 수도 없었고 형님들도 그냥 사진이라도 와서 찍고 가라고 해서 정말 사진을 촬영하러 갔다...
이날 만큼 내가 싫었던 적이 없다. ㅠㅠ 평소 몸보다도 2달 넘게 쉬며, 몸이 더 나빠져 있었고, 운동을 하지 못해 
살까지 붙어 있었다. 바디프로필을 촬영하며 배가 나온채로 촬영한 사람은 나밖에 없을 것이다. ㅠㅠ
그렇게 나는 그냥 프로필 사진을 찍었다... 아무튼 기록으로 남겨놓아야 내년에 비교할 수 있기에, 작게라도 올려놓는다. 

왜 3장이나 올려야 사진이 안 작아지는지 모르겠다...

그래도 살이 많이 찌지 않은 것에 위로하면서, 내년에는 꼭 제대로 바디프로필을 찍어보고 싶다.
아무튼 수술도 잘 마무리하고 지금은 어느정도 건강을 되찾았으니 이것도 50%는 성공으로 하기로 했다.

4. 새로운 비즈니스 도전하기

내가 지금 개발자를 하는 이유는, 나중에 소프트웨어 쪽으로 창업을 하고자 함이고,
나는 나중에 나의 직업이 꼭 기업가였으면 한다.(기업을 통해서 나의 자아실현을 하고, 사회에도 좋은 영향을 미치고 싶다.)
그럴거면 지금 바로 창업하지 왜 개발해? 라며 누군가는 이런 내가 잘못 되었다고,
이야기하지만 어디에도 정답은 없다. 스티븐잡스가 이야기했던 것처럼, 내가 지금 하고 있는 것들이 점들로 찍혀서,
나중에 다 이어지리라고 생각한다. 

옛날에는 일찍 사업을 해서 성공하고 싶었으나, 실패를 하면서 내 실력이 얼마나 중요한지,
알게 되었다. 그리고 일찍 사업을 해서 성공하고 싶다는 생각은 변해서 나중에 내가 새로운 사업을 시작하고자 했을 때,
나는 잘하고 싶었다. 그러기 위해서는 기회가 되면 지속적으로 challenge하고 학습해야 한다고 생각한다.

올해 나의 비즈니스적으로 목표하였던 것은 
팀결성하기와, 새로운 사업 challenge하기 였다.

올 해 초기에는 팀이 없었기에, 되도록 개발을 하지 않고 도전해 볼 수 있는 것들 위주로
도전하였다. (사업 검증 후 개발)

그 중에 올 해 가장 먼저 도전하였던 사업은 바로 "은밀하게 위대하게" 였다.
바로 본인이 가고 싶어 하는 회사의 재직자와 1:1로 매칭하여 궁금한 것들을 해결 할 수 있도록 하는 것이 목표였다.
예를 들면 내가 "다노"를 오고 싶어한다면, "다노"의 재직자와 만나 미리, 다노에 대해서 궁금한 것들을
현직자를 통해 들을 수 있도록 하는 것이었다.

은밀하게 위대하게 랜딩페이지


크레이터링크를 통해 간단한 랜딩사이트를 만들어서 페이스북에 광고도 태우며 도전했지만,
결과는 좋지 못 하였다. 나는 보통 내가 필요하다고 생각하는 것들을 좀 더 구체화시켜서 도전해보는 편인데,
나에게 필요한 것이 다른 사람들에게도 꼭 필요한 것은 아니다. 개발하기에 앞서서,
먼저 시장 검증을 한 것은 정말 잘 한 일이라고 생각한다. => 시장 검증 후 DROP하였다.

그리고 다음 아이디어는 정말 간단하게 시도해본 "메모리즈 프로젝트"
이건 실제 라이브까지도 되지 못 했고, 이런 저런 핑계로 간단한 프로토타입 정도까지만 만들었다.
모바일 추모관을 생각하면 제일 비슷할 것 같다. 간단한 설명이 담긴 첨부

 

메모리즈 프로젝트 ver0.1

메모리즈 프로젝트의 ver 0.1을 마무리하였다. 스파르타 코딩클럽 마지막에는 3주동안 프로젝트 기간이 있다. 그 기간동안 각자 만들고 싶었던 프로젝트를 진행한다. 튜터를 진행하면서, 조금 욕

daeguowl.tistory.com

위의 2개는 간단하게 혼자서 해본 것이고,
그 이후부터는 좀 더 개발에 집중하기 위해서 팀을 꾸려서 도전하였다.(혼자 할 때는 보통 개발 전에 시장검증이 중요했기에 
시장 검증 전에는 최대한 개발을 지양하였고, 팀을 꾸린 이후에는 개발에만 집중할 수 있어서 개발 실력을 늘리는 것에 좋았다.)


먼저 비사이드(비사이드는 사이드 프로젝트를 하고 싶어하는 다양한 분야의 사람들을 모아주는 플랫폼)를 통해서
결성된 서울숲도비들팀에서 만들었던 매일 매일 학습한 것을 기록할 수 있는 WILT(윌트)이다.

앱을 학습하고 싶다는 목적으로 참여하였던 윌트는 결국 나의 욕심 때문에
벌려 놓았던 일들과 겹치게 되었다. 학습까지 하면서 할 수 있는 시간이 나지 않았고,
팀에는 피해가 가지 않기 위해, 기존에 하던 백엔드로 넘어가게 되었다. 뭔가 회사에서 하던 업무가 하나가 더 늘어난 
기분이었다. 후... 아무튼 일만 너무 많이 벌려놔서 많은 부분 참여를 못하고, 초기에 목표하였던 바를 달성하지 못 하였지만
그래도 끝끝내 마무리하여 라이브까지 할 수 있었다. 

윌트는 현재 IOS와 Android에서 다운받을 수 있다.

 

윌트(WILT) - 학습 기록, 공유, TIL - Google Play 앱

What I Learned Today, WILT와 함께 매일 매일 배우는 즐거움을 쌓아가보세요. 그날 그날 뭘 공부했는지 기록하고, 다른 사람들의 기록도 살펴 볼 수 있어요. [배운 내용 기록하기] • 오늘 배운 내용을 T

play.google.com

 

‎WILT - What I Learned Today

‎What I Learned Today, WILT와 함께 매일 매일 배우는 즐거움을 쌓아가보세요. 그날 그날 뭘 공부했는지 기록하고, 다른 사람들의 기록도 살펴 볼 수 있어요. [배운 내용 기록하기] • 오늘 배운 내용

apps.apple.com


그리고 현재는 대구에서 사업을 하면서 알았던 형님들, 그리고 함께 다노를 다녔던 재건님과
아주 재미있는 프로젝트를 하고 있다.(BLC Company라는 멋진 이름도 있다.)

주류 문화를 개선하는게 목표이고, 아이디어의 이름은 "꽁술"이다.

해당 부분에서 나는 웹프론트엔드 쪽을 개발하고 있는데, 매거진을 시작한 9월부터 현재까지 
정말 출근 전, 출근 후, 주말을 상관하지 않고 계속 개발을 하고 있다. 개발을 선택하고 그렇게 행복을 잃었다.
쉴 때도 무엇을 하고 쉬어야 할지 모르겠고, 이제는 개발을 할 때가 그냥 제일 마음이 편하다.
크리스마스 이브, 크리스마스, 신년인 오늘도 개발을 하고 있다...(난 외롭지 않다.ㅠㅠㅠㅠ)

1월 라이브를 목표로 달리고 있는데, 현재 70%정도 완성되었다.
이것도 라이브가 되면 아래에 링크를 첨부하고자 한다.

이것도 다양한 비즈니스에 challenge하고 
이제는 어느정도 안정적인 팀도 결정하였으니, 어느 정도는 성공하였다고 본다.




그렇게 시간을 보내다 보니 2020년 올 한해가 갔다.
매년 정말 치열하게 살기 위해 노력하지만, 올 한 해는 스스로 이루고자 하는 것들도 많았고,
굉장히 도전을 많이 했던 한 해였다. 하지만 내년에는 더 이루고자 하는게 문제다...

내년에는 좀 더 자세히 나의 목표들을 세분화 하고,
평가하고, 반성하고, 이루기 위해 노력해야 되겠다.

내년이 기대가 된다. (아니 이것을 2021년 1월 1일날 적고 있으니, 올해가 되겠네)
올해가 매우 기대가 된다.

그동안 서버만 하다가 회사 프로젝트로 다노 매거진을 개편하는 업무를
진행하게 되었다.

관련 글 : daeguowl.tistory.com/185

 

다노 매거진 개편 프로젝트를 완료하며...

올 한해 여러가지 프로젝트를 진행했지만, 정말 나의 피, 땀, 눈물이 들어간 프로젝트를 마무리하며 회고글을 적어보고자 한다. 사건의 발단 : 현재 다노에서는 매주 or 2주 단위로 1on1 이라는 것

daeguowl.tistory.com

처음 사용해보는 React로 웹을 개발하고 나니 SPA(single page application)라는 말을 듣게 되었다.

즉 한 페이지에서 각각의 컴포넌트들만 랜더링 되면서 사용된다는 것인데,
처음에는 이게 무슨 말인지도 몰랐다.

여러 페이지를 이동하는 것 같은데, 왜 싱글 페이지라고 할까...??

즉 react의 경우 build 된 이후의 파일을 보면 body 부분이
<body></body>로 텅 비어있고, js로 이 body부분을 변경해 가면서
rendering 된다는 것이다.

다만 이렇게 되면 우리의 사이트를 크롤링해가는 봇들이,
우리 사이트를 빈사이트로 인식하게 된다.

매우 큰 이슈다...

여러 부분의 단점이 있지만 일단 크게 와닿는 부분은 
해당 페이지가 rendering 되기 전의 정보를 가져가다 보니,
공유하기 등을 하였을 때 해당 페이지의 링크만 공유되는 불상사가 일어났다.

정말 간단하게는 대표 이미지와 description을 정해놓고 meta tag에 넣어주면 된다.

간단하게는 이렇게 대표 이미지와 글을 넣어 놓을 수 있다.

사실 이렇게만 해도 대부분의 회사에서는 해결이 될텐데, 문제는 특정 상품의 링크를 공유했을 때
해당 부분이 나왔으면 좋겠다는 것이다.(제품별로)

사실 다노샵처럼 여러 제품이 있는 경우가 아니라면 
각각의 특정 페이지별로 SSR하는 것은 이미 잘 만들어진 러이브러리들이 많다.

react-helmet이라는 라이브러리인데, 이정도의 SEO가 필요하다면,
아래 글을 참고 하면 된다.

velog.io/@byseop/SPA%EC%97%90%EC%84%9C-%EC%84%9C%EB%B2%84%EC%82%AC%EC%9D%B4%EB%93%9C-%EB%A0%8C%EB%8D%94%EB%A7%81%EC%9D%84-%EA%B5%AC%EC%B6%95%ED%95%98%EC%A7%80-%EC%95%8A%EA%B3%A0-SEO-%EC%B5%9C%EC%A0%81%ED%99%94%ED%95%98%EA%B8%B0

 

SPA에서 서버사이드 렌더링을 구축하지 않고 SEO 최적화하기

얼마 전 create-react-app 기반의 SPA 프로젝트에서 빠른시간내에 SEO를 적용해야 하는 일이 있었습니다. 제가 아는것은 SPA의 SEO는 next.js 혹은 gatsby 를 이용하여 개발하거나, 직접 서버사이드 렌더링(Se

velog.io


아무튼 내가 하고 싶은 것은 각각의 제품별로 SEO를 진행하고 싶은 것이었다.
(일단 여기서 다룰 것은 링크를 공유했을 때 각각의 제품에 맞는 제품명과 사진을 가져가서 보여주는 것이었다.)

확인해보니 쿠팡과 gmarket은 잘 구현되어 있다.

다노의 경우 위의 대표링크를 공유했을 때처럼 제품을 공유해도 SSR이 되어 있지 않아서,
default로 meta tag에 설정해놓은 이미지와 설명이 나오고 있었다.

사실 여러가지 방법들이 있겠지만, 
프론트개발자분들은 너무 리소스가 없으셨고,
서버단에서 이 문제라도 해결할 수 있는 방법이 없을까 모색하였다.

일단 크롤러 봇이 프론트의 build된 코드에 접근해 버리는 순간
어떤 방법을 써도 SSR을 하는 것이 어려웠다.

그래서 프론트의 build된 코드로 접근하기 전에 붙어 있는 nginx에서
봇인지를 판단해서 우리가 만들어 놓은 페이지로 redirect를 하면 되지 않을까?라는 
아이디어를 내놓게 되었다.

전체적인 그린 그림은 아래와 같다.

검정색은 일반적인 흐림이라면, 빨간색은 봇이 들어올 때의 움직임을 표현하였다.
일단 봇이 user-agent를 잡아서 봇인 경우, build된 코드로 넘기지 않고 서버의 새로운 api 로 redirect 시키는 것이다.

그리고 그 api는 서버에서 원하는 meta tag를 넣은 templates를 rendering 시켜주자고 
계획을 세웠다.

이렇게 게획을 세우고 나니, 한번 해봐도 될 것 같다는 생각이 들어 바로 진행하였다.

먼저 django에 rendering 해줄 수 있는 templates를 하나 만들었다.
(현재 다노에서는 python과 django로 서버를 구성하고 있다.)

간단하게 표현하면 아래와 같다.

# product_info로 rendering할 때 data를 넘겨줄 예정

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
	<meta property="og:title" content="{{ product_info.title }}"/>
        <meta property="og:image" content="{{ product_info.image }}"/>
        <meta property="og:description" content="{{ product_info.description }}"/>
        <title>Title</title>
    </head>
    <body>
        
    </body>
</html>


(회사마다 어떤 걸 SEO하고 싶은지는 다를 수 있으니 가장 기본에 충실한 것만 여기서 표현하고자 한다.)

이렇게 rendering 해줄 수 있는 templates를 하나 만들고 이제 해당 templates를 rendering 해줄 수 있는 
view를 만들었다. 이것도 매우 간단하다.

class ProductSeoView(View):

    def get(self, request, **kwargs):

        product_id = int(request.GET.get('product_no', -1))
        
        # 각자 SEO하고자 하는 코드를 적으면 된다. 아래코드는 예시로 표현하였다.

        product = Product.objects.get(id=product_id)
        title = product.title
        description = product.description
        image = product.image
        url = product.url

	product_info = {
            'title': title,
            'description': description,
            'image': image,
            'url': url,
        }

        return render(request, 'seoproduct.html', {'product_info': product_info})

(해당 코드는 예시로 적은 코드이다)

view 역시 굉장히 간단하다. 
제품 번호를 받아서 거기에 맞는 제품 정보를 가지고 와서, product_info에 넣고, 해당 템플릿을 랜더링 시켜주는 것이다.

그럼 해당 view로 요청이 왔을 때 아까 위해서 만든 템플릿이 해당 product_info 정보를 받아서 랜더링 되게 된다.

이제 해당 view를 띄어줄 수 있도록 url만 하나 뚫어주면 된다.
기존 요청 오는 api아래에 seo라는 api 하나만 더 뚫어주면 된다.

# 기존 product view
re_path(r'^/product?$', ProductView.as_view(), name='product_view'),

# product seo를 위한 view
re_path(r'^seo/product?$', ProductSeoView.as_view(), name='product_seo_view'),


이렇게 되면 서버쪽은 모두 준비가 되었다.

그럼 runserver를 돌린 뒤에 해당 api로 요청을 보내보면 빈페이지가 나와 있어야 한다.
그리고 추가적으로 소스코드를 보면 meta tag에 해당 내용이 담겨 있어야 한다.

이것만 확인 되었으면 이제는 프론트 nginx의 설정을 건드려야 한다.

프론트 서버의 nginx conf파일을 변경하자.
회사마다 모두 다를 것이라고 생각하기 때문에 포인트만 잡고자 한다.

여기서 하고자 하는 것은 바로 카카오톡 봇을 파악해서,
바로 위의 SEO를 위한 서버 URL로 redirect 시키는 것이다.

프론트 서버의 nignx의 location 설정을 변경시켜주면 된다.

location /product { 
	# 여기는 잡고자 하는 bot의 user_agent를 모두 넣으면 된다.
	# 지금 여기서는 kakao talk만을 기준으로 한다.

    if ($http_user_agent ~* "kakaotalk-scrap") { 
      	 rewrite ^/(.*)$ [api_server_url]/seo/$1 permanent;
    }
    
}

=> 프론트의 build된 코드를 서빙하는 것이 아니라 봇일 경우 api_server의 nginx로 seo라는 경로를 앞에 추가하여 
보내도록 하였다.

이렇게 한 뒤에는
nginx -t
nginx -s reload를 통해서 nignx를 다시 load시켜준다.

이제 테스트를 진행해보자!!

카카오톡에 seo를 진행하였던 링크를 복사해서 붙여 넣으면 된다.
그러면 카카오봇이 해당 사이트의 정보를 가지고 오기 위해 접근할 것이다.
(혹시라도 있을 캐시를 삭제해주는 것이 좋다. 카카오 dev에서 삭제가 가능하다)

그리고 프론트 nignx의 로그를 보면

GET /product?product=486 HTTP/1.1" 301 194 "-" "facebookexternalhit/1.1; kakaotalk-scrap/1.0;

오 get요청이 왔고 301로 제대로 redirect 되었다는 표시가 나온다!

이제 서버쪽 nignx의 로그를 보면

seo/product/?product_no=526 HTTP/1.1" 200 "https://danoshop.net/product/?product_no=526 "facebookexternalhit/1.1; kakaotalk-scrap/1.0

기존에 danoshop 요청 url이 seo라는 url로 붙어서 다시 들어온 것을 볼 수 있다.

그래서 그 결과는 과연 어떻게 되었을까?

기존에는

이렇게 상품을 공유해도 default 이미지가 나오던 것이
각각의 상품에 맞게 잘 나온다!!

이렇게 이쁘게 잘 되어 나온다!


이것으로 1차 목표하였던 카카오톡에 개별 링크를 공유했을 때
default meta tag가 아닌 각각의 사진과 text가 나오도록 작업을 진행하였다.
프론트 개발자분들의 리소스가 부족한 상황에서
서버 개발자인 내가 할 수 있는 부분에서 개선을 해보았다.

다만 작업을 하면서 추가적으로 고려해야 하는 부분도 발견하였다.
바로

[높은 페이지랭크를 가진 URL은 검색결과에서 더 상위에 노출 것입니다. 따라서 높은 페이지랭크를 가진 URL을 구입하여 컨텐트만 광고페이지로 이동시키는 부적절한 사례가 증가하고 있습니다. 이 때문에 구글은 302를 자주 사용하거나 부적절하게 사용할 경우 기존 사이트랭크에 상당한 패널티를 부여합니다.]

출처: https://nsinc.tistory.com/168 [NakedStrength]

의 글이다. 봇들이 접근할 때, 302로 redirect시키는 경우 평가를 안 좋게 한다는 글도 보았다.
그리고 이미 구글봇은 js를 읽을 수 있다고 하니, 따로 해당 부분을 적용할 필요는 없어 보인다.

따라서 각자의 상황에 맞게 해결을 하면 될 것 같다.

이렇게 해결을 한 글은 없는 것 같아
누군가에게는 도움이 되었으면 하면서 글을 남긴다.

+ Recent posts