경력 개발자의 이직 회고록(시리즈)

======================================================================

======================================================================

======================================================================

목차

  • 개요(들어가기 앞서...)
  • 회사 생활(회고 - 1)
  • 다시 이직(회고 - 2)
  • 회고(회고 - 3)
  • 앞으로

개요(들어가기 앞서...)

하필 글 쓸 때 25년도 1월 1일이다. 의도하지는 않았지만 의도한 걸로 합시다;(뭐, 마무리는 1월 말에 했지만 ㅋㅋ)

이 시리즈를 작성할 때 굉장히 들뜬 마음에, 뿌듯한 마음에 작성했던 기억이 있다. 좋은 회사에 들어가서 내가 생각했던, 목표했던 개발자로 한 걸음 갔다는 생각이기 때문이다. 이 기분과 기운(정보)을 블로그로 공유하고 싶었다. 시리즈 9편 작성 후 어언 4년 가까이 흘렀다. 6개월 후 회사 생활에 대한 경험 및 생각을 작성하고 싶었다. 하지만 일과 사람에 치이다 보니 2년 반이 지났고, 다시 이직하고 1년이 지났다.

트라우마가 있었다. 자신감도 많이 잃었고, 주눅 들었다. 일상에는 크게 지장은 가지 않았지만 어색한 내 자신을 계속 보는 것이 너무 힘들었다. 괜찮다고 매번 내 자신에게 되새기지만, 나를 조이며 나는 내 자신을 계속 괴롭히고 있었다. 

 

회사 생활 (회고 - 1)

회사생활은 전반적으로 만족하지 못했다. 항상 불안감과 무력감이 동반했다. 무력감은 결국 내 자신을 무기력하게 하였다. 이 무기력은 정말 오래갔다. 최근 괜찮아졌지만, 아직 트라우마가 있다. 이 트라우마가 긍정적인 영향도 있지만, 결국 건강하지 못한 트라우마이다. 그때 나는 출근 중에 이등병 때 했던 생각을 똑같이 했다. 그냥 자빠져서 병원에 입원하고 싶네? 이런 생각 말이다. 그래도 버티면 나아질 수 있다고 생각했다. 버티다 보면 나도 발전하고, 주변에서도 인정을 해주기 때문이다. 과거 군대도 같았기 때문에 이런 생각을 했다. 일병 말호봉까지 개같이 일 하니, 결국은 인정받고 잘 적응했다. 버티면 나아지지 않을까 생각했다. 2년이 지나도 나아진 것은 없고, 목표도 잃어버린 무력한 내 자신 밖에 남지 않았다. 

 

크게 세 가지를 생각해본다. 

  • 기본기의 부재
    • 제일 큰 요인인 것 같다 ㅎㅎ 모든 문제의 시작이기 때문이다. 기술에 대한 기본기를 말하는 것이 아니다. 사람으로서의 기본기를 얘기하는 것이다. 의사소통 능력, 문제에 대한 정의 능력, 절충안/최적안을 판단하는 통찰 능력, 구조적인 사고, 전체 흐름 파악, 기민함, 임기응변 등 다양하다. 그냥 쉽게 얘기해서 일 센스가 많이 부족한 것이다. 이쯤 되면 내가 뭔 병신인가? 생각이 든다 ㅋㅋㅋ..
  • 나약한 마음가짐
    • 부드럽고 여유가 있는 사람을 보면 항상 부럽다. 행동이 아니라 마음을 얘기하는 것이다. 마음에 여유가 있는 사람은 외부와의 갈등이 있어도 갈대처럼 대응을 잘할 수 있다. 외부와의 갈등이 있을 때 자신은 꺾이지 않는다. 쓰러져도 다시 일어난다. 자기 회복능력이 정말 탁월하다. 필자는 외부와 갈등이 생겨 쓰러지면 잘 일어나지 못한다. 이미 이런 무력감에 학습되어 있어 그런 것 같다. 이 부분은 유년 시절, 학창 시절 영향도 있는 것 같다. 분명 성인이 돼서 잘 이겨내고, 강해진 줄 알았지만 전혀 아니었다 ㅎㅎ 정리하면 문제가 생겼을 때 회복탄력성이 좋지 못했다.
    • 갈등이 생겼을 때 외부에 도움을 제대로 청하지 않았다. 어차피 도움을 청해봤자, 얘기해 봤자 해결되는 것도 없고, 되려 이슈 인력으로 낙인이 되기 때문이다. 당사자와 얘기해도 해결되지 않는 문제를 제3자한테 얘기해서 해결이 될까? 이런 생각을 했기 때문이다.
    • 지속적인 갈등으로 인해 자존감(심) 다 하락했다. 내 성격이 원래 이랬나? 생각할 정도로 남 눈치를 보고, 내 자신을 계속 자책하는 모습이 있었다. 필자는 남에게 피해를 주기도/받기도 하기 싫어하는 사람인데, 계속 피해를 주는 사람이 됐기 때문이다. 
  • 환경의 문제
    • 도움 받을 수 있는 환경이 전혀 아니었다. 조직장은 파트장한테 업무와 인력 관리를 위임하였다. 파트장과 갈등은 계속됐기 때문에 필자는 고립의 연속이었다. 솔직히 할 말이 너-무 많다. 지금까지 업무를 진행하면서 억울한 것도, 불합리한 것도 정말 많았지만 결국 갈등을 해소하지 못했다. 애초에 이런 구조를 만든 조직장이나, 파트원이 제대로 일할 수 있는 환경을 제공하지 못한 파트장이나, 갈등을 해소하기 위해 주변에 적극적으로 도움을 구하지 못 한 본인이나 똑같다. 
    • 필자는 환경에 정말 취약한 동물이다. 아니 짐승이다. 환경을 조성하지 않으면 하지 않거나, 그 환경에 지배받는 / 영향을 제대로 받는 특징이 있다. 이를 장점으로 여태껏 활용했다. 공부를 해야 하기 때문에 집을 가지 않고 학교 도서관에 억지로 있거나, 일단 영어 공부를 해야 하니, 학원부터 등록하거나, 일단 환경에 나를 던져서 적응해 가는 식이다. 그리고 환경에 영향을 많이 받기 때문에 그 환경에서 벌어지는 모든 일을 학습하고, 모방을 한다. 지금까지의 생존방식이고 어떻게든 생존을 했다. 장점으로 잘 활용했던 것은 내가 환경을 바꾸거나, 내 자신을 던질 수 있었지만, 회사 환경은 그렇지 않았다.
  • 번외로 내 상황은 난국인데 조직의 비전 또한 공감이 되지 않았다.

다시 이직(회고 - 2)

"회고-1"의 이유로 이직한 것도 있지만, 평소에 관심 있던 조직에서 채용이 열린 것도 있다. 

 

만약 이직에 실패했으면 나는 바로 사표 내고 나올 예정이었다. 이미 와이프와 많이 얘기했고, 퇴사하고, 재충전하기로 마음먹었다. IT 이직 시장이 얼어붙었는데도, 그 마음을 먹었다. 

왜 퇴사 결심을 했을까? 심리가 굉장히 불안했다. 우울증 직전까지 간 것 같다(아니 이미 우울증이었을지도..). "저 사람이 나에 대해 안 좋은 생각을 하는 것 같다" 이런 생각과 휴일에 회사 메신저 알림이 오면 항상 놀라거나 집에 오면 유튜브만 쳐보다가 자기 일수였다. 왜 보냐고? 그냥 아무 생각도 하기 싫으니깐. 무력감에 지배됐으니깐. 무력감에 지배되기 때문에 나의 목표는 사라졌다. 아니 잊어버렸다. 그렇게 되니 독서/학습할 이유도 없고, 그냥 시간을 보냈다. 이 무력감은 불안감과 항상 동반됐고, 반강제로 하루 일과가 시작되는 듯한 느낌을 받았다. 심리 상담을 받아도 해결되는 것은 없었다 ㅎㅎ

 

그래도 다행히 이직은 성공했다. 계열 법인 이동은 잘 됐다. 

 

도망친 곳에, 낙원 없다. 필자는 지금도 이 말을 경계하고 있다. 이 꼴이 나지 않으려고 서서히 맨탈을 다시 잡고 있고, 목표도 다시 잘 다듬고 있다. 트라우마는 여전히 남아있어, 제 자신을 다듬기 위해 꽤 많은 시간을 사용하였다. 지금은 많이 좋아졌다. 

회고(회고 - 3)

많이 다쳤지만, 배운 것도 많다. 진짜 일을 하는 법을 배웠다. 왜와 이유를 항상 생각하고, 정말 이 방법이 좋을지? 최적의 판단을 하기 위해 노력하고 있다. 필자의 부족한 점을 인지하고 있기 때문에 이를 기반으로 어떤 목표를 잡아야 할지 갈피도 잡았다. 

아직 많이 부족하다. 지금도 일 하면서 이런 생각을 했겠지?(현재 팀의 일을 잘하는 사람이 있는데, 이 사람이라면 이렇게 생각할 수 있겠네? 혹은 이전 회사에 이 사람이라면 이렇게 업무 했을 때 왜 이렇게 했냐고 한 마디 했겠지?) 생각하며 일을 하고 있다. 

앞으로

앞으로의 목표는 다음과 같다..

다양한 사고가 있는 개발자

  • 다양한 사고가 있고 싶은 이유는 위의 배운 것을 실천하고 싶기 때문이다. 이를 위해서는 경험/기술뿐만 아니라 리더 혹은 기획자 같은 다른 차원/상위자의 시점 필요하다. 당장 생각나는 계획은 조직원 모방과 서적 학습이 있다.
  • 일 잘하는 조직원 모방을 위해서는 조직원의 이슈 코멘트, 행동, 작성 코드 등에 대해 탐구가 필요하다. 어떻게 탐구를 하면 좋을까? 탐구 방법 리스트업 후, 상대의 행적을 기록하고 평가하는 것이 좋을 것 같다. 그전에 나에 대한 객관화 지표도 만들어야 할 것 같다. 일단 모방하고 싶은 조직원은 1~2명 있다.
  • 서적 학습은 기획자 혹은 팀 리더의 사고를 간접적으로 알 수 있는 서적이 좋을 것 같다. 최근 기획 관련 서적을 완독 했는데, 기획의 주된 관점은 문제 정의를 75% 비중을 두고 진짜 문제를 찾기 위해 엄청난 노력을 한다는 것이다. 이와 같이 나의 사고력을 발전할 수 있는 서적을 찾는 것이 중요한 것 같다.
  • 마지막으로 나의 사고를 정리할 수 있는 능력이 필요하다. 내 사고를 구조화하여 적시에 효과적인 표현 및 효율적인 전달이 필요하다. 내 사고력을 어떻게 구조화할 수 있을지? 이는 아직 고민 중이다. 논증에 대한 서적도 보고, 구조적인 사고법을 어떻게 하는지 확인해보고 있다. 논증 서적은 보다 때려치웠는데... 계획을 다시 잡고 어떻게 구조적인 사고를 할지, 논증은 어떻게 업무에 녹일지 고민해 봐야겠다.

상대를 존중할 수 있는 사람

  • 나는 그 사람이 왜 열을 내며 일을 했는지 알고 있다. 그래도 그렇게 주변에 함부로 했으면 안 됐다. 사회는 뿌리는 대로 거두며, 인과 과는 돌고 돈다. 필자는 절대 그렇게 일을 하지 않을 것이다. 그렇게 하지 않아도 일은 진행되기 때문이다. 어떻게든 진행되는 것이 아닌 "좋게 / 잘" 진행될 수 있기 때문이다. 

기회를 줄 수 있는 사람

  • 스스로 의사소통, 의사결정할 수 있도록 기회를 줄 것이다. 모두에게 처음은 있고, 처음은 모두 서툴다. 당연한 것이다. 직접 경험해야지 다음에는 더 좋은 소통과 결정을 할 수 있다. 

갈등 회피

  • 필자는 갈등이 생길 때 절대 회피하는 성향이 아니다. 근데 회사는 달랐다. 다음에 이런 상황이 생기면 어떻게든 발악하고, 부딪칠 것이다. 이런 식으로 물러나는 것은 이번이 마지막이다. 

 

Posted by 동팡

초록...

 

공부의 미래, 인문 서적 리뷰 첫 책으로 당선되었다. 이 책이 정말 높은 가치가 있어서 작성하기보다는 본인의 생각이 조금 바뀌어서 작성하였다. 지금 블로그 주제를 좀 더 확장하였다. 기존에는 개발과 관련된 사항만 기재하였지만, 내 일상의 생각, 인문서적 리뷰를 작성하기로 했다. 이유는 다음과 같다.

  • 내 생각에 대해 V-Log를 남기기로 하였다. 먼저 생각을 글로 쓰고, 해당 내용을 기준으로 V-Log를 촬영하는 게 좋다고 생각한다. 
  • 좋은 책을 꽤 봤던 것 같은데.. 정말 중요한 내용을 제외하고 다 기억이 안 난다... ㅠㅠㅠ "공부의 미래" 서적에서 필자가 읽었던 서적과 관련된 사항을 정말 많이 언급했는데... 간략하게 1 문단이라도 설명할 수 있으면 좋은데 그게 되지 않았다. 

독자 정보

  • 30대 초반 직장인

독서 일자

  • 2023. 05

내용

  • 현대 시대, 지식 습득의 방법이 어떻게 변했는지, 본인이 갖고 있는 지식의 가치가 어떻게 하락하는지
  • 대학과 직업에서 지식의 가치관이 어떻게 변하고 있는지
  • 효율/효과적으로 공부하기 위해서는 어떤 기초 능력이 필요한지, 어떤 마음가짐이 필요한지

대상 독자

  • 요즘 시대에 어떻게 공부를 밀도 있게 할 수 있는지 방향을 알려주는 서적이다. 해당 서적 레퍼런스에서 또는 언급한 키워드를 토대로 심화 학습이 필요 

느낀 점

해당 서적은 네이버-Audioclip(오디오북)에서 처음 접하였다. 오디오 북에서 언급하는 1부 내용이 필자가 생각하는 가치관이 일치하였고, 저자가 설명하는 상황이 필자의 직장의 생태계와 너무 유사하였기 때문에 많이 흥미로웠다. 다만 거기까지였던 게 문제였다. 한 가지 내용 제외하고는 너무 예상했던 내용이었다.. 하하하.. ㅠㅠㅠ

 

[현대시대에서의 지식이란]

정보의 세계화로 인해 누구든지 고수준의 정보와 지식을 습득할 수 있다. 지식의 독점권이 희미해졌다. 지식을 얻기 위한 수단의 경계가 무너졌다. 고수준의 지식을 얻기 위해 더 이상 대학교에 가지 않아도 된다(그러나.. 고수준의 지식을 갖고 있는 인원은 대체로 고학력을 갖고 있고, 고학력을 갖고 있는 인원은 대체로 고수준의 지식을 갖고 있다 ㅋㅋㅋㅋ). 여기서 우리는 지식을 선별할 수 있는 능력만 있으면 된다. 잠깐..? 어떤 직업이라 상당히 유사하다. 개발자다... 지식은 인터넷 전역에 펼쳐있고, 해당 지식을 나누려고 안달 난 사람들이 많고, 대학교를 가지 않아도 컴퓨터공학, 소프트웨어 공학과 관련된 사항 그리고 개발하는 모든 방법을 "인터넷"으로 학습할 수 있다. 책에서 설명하는 이 상황이 필자의 상황을 얘기하는 것 같았고, 지식을 얻기 위한 수단의 경계가 무너짐으로써 제일 수혜 받은 직업이 개발자가 아닐까 생각이 들었다.

 

[브리태니커 vs 위키피디아]

브리태니커는 오프라인 백과사전의 최강자이며, 위키피디아는 누구나 수정할 수 있는 온라인 사전이다. 2005년 네이처 특집 기사에서 위의 사전들의 정확도를 과학 분야에 한해서 비교하였다. 결과는 당연 브리태니커의 승리, 브리태니커는 약 120건, 위키피디아는 약 160건 정도 잘못된 지식을 수록하였다. 우리의 시사점은 그다음이다. 위키피디아는 해당 오류들이 언급되자 수정되었다. 그러면 브리태니커는? 정확히 기억은 안 나지만.. 절판된다는 식으로 얘기하였다. 해당 내용을 토대로 위의 "현대시대에서의 지식이란"의 주장을 뒷받침할 수 있다. 

개발자 세계에서도 위키피디아와 비슷한 세계관이 존재한다. 오픈소스 소프트웨어이다. 예전의 오픈소스 소프트웨어는 안정성과 완성도에 대해 많은 의심을 하였지만, 지금은 상용 소프트웨어 그 이상의 수준을 보여주는.. 이제는 없으면 절대 안 될 존재가 되었다.  

 

 

이런 내용이 있고.. AI와 직업의 가소성을 소개하며, 1부에 제대로 낚여 책을 보게 되었다.

1부는 정말 흥미로운 주제를 얘기했다. 

그러나 2부, 3부는 이미 알고 있는 사항을 얘기하였다.

 

[공부에 필요한 요소]

해당 서적은 공부에 필요한 요소는 창의성, 비판적 사고력, 자기 통제력, 협업 능력, 메타인지를 설명하였다. 

신영준 박사님의 완벽한 공부법 서적으로 창의성, 자기 통제력, 메타인지에 대한 정보는 이미 알고 있는 정보였다. 협업 능력은 사회생활을 하면서 너무나 많이 필요한 능력으로 알고 있었다. 우리의 뇌 구조가 변해서 지식을 왜 얕게 습득하는지를 "생각하지 않는 사람들을" 서적을 통해 소개하였다(이 책 완전 추천). 서적에서 언급한 공부에 필요한 요소는 이미 인지하고 있는 사항이었고, 일부분은 실천하는 사항이다.

그러나 비판적 사고력은 어떻게 해야하는지, 숙달하기 위해서는 무엇을 해야하는지 잘 몰랐다. 해당 서적에서도 잘 설명해 주는데, 정확히 이해를 못 했다. 신영준 박사님의 완공 서적에서도 비판적 사고력을 언급하지만 필자는 제대로 이해를 제대로 못 했다.. 해당 서적에서 비판적 사고력에 대해 잘 얘기했는데 참조한 서적을 대여해서 읽어볼 예정이다. 공부에 필요한 요소에 대한 정보를 아직 습득하지 않은 독자는 해당 서적이 지표 역할을 할 것이다. 이 기점으로 어떤 책을 봐야 하는지, 어떤 능력을 키워야 하는지 이해를 하면 좋을 것 같다.

 

[향후 계획...] 

비판적 사고력 <- 이 주제를 생각하면서 필자의 어린 시절부터 지금까지 생각해 보았다. "나는 왜 이런 사고력 훈련을 하지 않았을까?/못 했을까?" 이런 생각을 더 한 이유는 우리 팀의 리더가 "생각", "고민", "비판적 사고력", "이유"를 제일 많이 언급한다. 일을 할 때 많은 고민과 생각을 많이 해야 하며, 뭘 (선택)하든 이유가 있어야 하고, 비판적인 관점에서 일을 바라보라고 하였다. 이 부분에 대해 고민을 하다 보니 서적의 "비판적 사고력" 항목이 더 눈에 띈 것 같다. 그래서 서적에서 참조한 "생각에 관한 생각" 서적을 볼 예정이다(근데 책이... 한 대 맞으면 즉사할 것 같은 전투력을 갖고 있네?;). 

 

현대시대에서 지식의 가치관이 변하고 있고, 습득하는 수단이 변하였다. 하지만 지식을 습득하기 위한 기초 요소는 예나 지금이나 같다는 것을 얘기해 줬다. 

 

마무리

이 짓을 하는 것도(인문 서적 리뷰) 공부에 한 축이다.. ㅋㅋㅋㅋ

뇌 관련 서적에서 얘기하기를... 단기 기억을 장기 기억으로 전환하기 위한 제일 좋은 방법은 해당 주제로 깊게 생각하고 토론을 하는 것이다. 필자가 하는 것은 깊은 생각은 아니지만 최소한 본인과의 토론은 아닐까 생각한다. 

Posted by 동팡

5월에 끝까지 본 기술 서적이 1권이라니... 이것저것 보다가 겨우 하나 다 봤다.. 

독자 정보

  • 5~10년 차 개발자

독서 일자

  • 2022. 05

내용

  • 실제 TDD를 어떻게 하는지 예제와 함께 설명
  • TDD에 대한 기술적인 설명보다 TDD 개념, 더 좋은 TDD 방법 등을 설명 

별점

  • 4.8 이상: 철학이 존재함, 추천++

대상 독자

  • 개발자

선행 도서

  • -

관련 도서(미디어)

  • [서적] 단위 테스트(생산성과 품질을 위한 단위 테스트 원칙과 패턴)
  • [인강] 이규원의 현실 세상의 TDD : 안정감을 주는 코드 설계 방법

느낀 점

 해당 방법론은 1990년 후반 켄트 백의 익스트림 프로그래밍의 일부이다(근데 왜 난 20년이 지나 공부하는가 ㅡㅡ ㅋㅋㅋㅋㅋ). 우리의 프로젝트에 TDD 방법론 적용은 오버 엔지니어링이라고 생각할 수 있지만, 단위 테스트 코드의 작성을 습관화하는 게 좋지 않을까 생각한다. 

 

해당 서적에서도 TDD 인강에서도 TDD는 불안, 두려움을 지루함으로 바꾸는 방법론이라고 다들 얘기한다. 필자 또한 전적으로 동의한다. 서비스 운영 및 배포를 하면 장애가 항상 수반하는데, 배포했을 때 "과연 장애가 없을까..?", "제대로 배포가 됐을까?"와 같은 불안을 최소화 시켜준다. 이와 같은 작업을 반복하면서 안전한 서비스를 만드는 것이다. TDD가 100% 모든 테스트를 대신하는 것이 아니며, 100% 안전한 서비스를 제공하는 수단이 아니지만 많은 비중을 차지하는 것은 서적과 필자의 경험으로 얘기할 수 있다. TDD에 회의감을 가지는 많은 개발자가 있지만 적당선의 타협을 하면 개발 리소스 감축할 수 있는 효과를 볼 수 있다. 

시간에 따른 변경 비용

간략하게 요약하면 기능 변경에 따른 회귀 테스트를 통해 회귀 버그를 최소화할 수 있다. 회귀 버그로 인해 개발 리소스 비용 증가는 모두가 아는 사실이다(저 보라색 비용을 다들 싫어하더라.. 그래프에는 보라색이 작게 표시 되었지만 실제는 더 크다.) 서스테이닝이 없는 단발성 프로젝트는 엄격한 테스트는 굳이 필요 없지만, 서스테이닝 요하는 서비스는 필수라고 생각한다. 현재 프로젝트는 통합 테스트, 기능 테스트만 제대로 적용됐다. 이 두 개의 테스트로도 효과는 많이 보고 있지만 단위 테스트를 "제대로" 적용하면 더할나위 없다고 본다. 몇 개 로직에 단위 테스트를 적용하여 효과를 봤기 때문에 확언할 수 있다. 

 

해당 서적에서 다독 부분은 다음과 같다.

  • 저자의 글
  • 25장 테스트 격리성 설명
  • 27장 테스트 패턴
  • 32장 TDD 마스터(+)

 

Posted by 동팡

독자 정보

  • 5 ~ 10년 차 개발자

 

독서 일자

  • 2022. 06

 

내용

  • 평범한 신입 개발자들의 좌충우돌 성장기 
  • 아직도 성장하는 개발자의 회고록

 

별점

  • 4.5/5.0(많이 배울 수 있음, 추천++)
  • 객관적으로는 3.8이지만 나사 몇개 빠진 필자의 주관에서는 4.5

 

대상 독자

  • 주니어 개발자
  • 미드레벨, 시니어 개발자(개구리, 당신들도 예외는 없습니다.)

 

선행 도서

  • -

 

관련 도서

  • 오늘부터 개발자
  • 오늘도, 우리는 코딩을 합니다

 

느낀 점

보통의 개발자, 자신들의 이야기이다. 그들의 열정과 간절함을 느낄 수 있었다. 비전공자이지만 자신의 특장점을 잘 살려서 해외에서 개발자가 된 친구, 전략적으로 산업체에서 개발자로 일한 친구, 관련 학과지만 많은 고민 끝에 개발자가된 친구 등.. 해당 친구들의 발자취를 간접적으로 볼 수 있어서 영광이었다. 

 

성장하고 싶은 주니어 개발자, 성장하고 있는 주니어 개발자, 성장했던 시니어 개발자, 모두 이 책을 보면 좋겠다. 올챙이는 다른 올챙이를 보고 간접경험을 충분히할 수 있고, 개구리는 자신의 올챙이 시절 치열함과 열정을 다시 불태울 수 있다. 필자는 크고있는 올챙이지만 어린 올챙이 시절의 간절함을 다시 회고할 수 있는 좋은 기회였다.

 

필자는 5년 계획 했던 목표를 이루고 마음에 와 닿지 않는 10년 목표를 위해 1년을 허비했다. 말마따나 목표를 잘못 잡았으니 목표를 위해 1년동안 움직이지도 않았다(솔직히 정신없기는 했지만 핑계 ㅅㄱ링). 이 책을 보면서 필자는 목표를 다시 잡고 세부 계획을 좀 더 정리하고자 한다. 솔직히 고맙다. 몇개 빠진 나사들을 다시 줍는 시간이었다. 

 

 

Posted by 동팡

독자 정보

  • 5~10년 차 개발자

 

독서 일자

  • 2022. 06

 

내용

  • 비전공자 입장에서 개발자가 되기 위해 무엇을 해야하는지 가이드

 

별점

  • 3.8/5.0(가볍게 읽기 좋음, 추천)

 

대상 독자

  • 개발자를 준비하는 비전공자

 

선행 도서

  • 없음

 

관련 도서

  • 나는 주니어 개발자다

 

느낀 점

비전공자가 멘토도 정보도 없는 상태에서 갈피를 잡을 때 읽으면 좋다고 생각한다. 개발자가 되기 위해 수많은 행위들을 추상적으로 잘 설명한다. 추상적? 왜 추상적이라고 표현했을까? 해당 책의 저자는 방향성 까지만 제공하고 있기 때문이다. 최소한의 필요 정보와 방향성만 제공했으면 충분하다. 독자는 책에서 가이드한 정보를 구체화하고 구체화한 것을 토대로 개발자 준비를 하면된다. 막연하게 개발자가 되고 싶다면 해당 서적을 읽어보는 것을 추천한다(개발자의 처절한 현실도 나름 얘기해준다;; ㅋㅋ?).

 

해당 서적은 포트폴리오 강의를 준비하면서 전지적 취준/비전공자 입장을 헤아리기 위해 선택한 수단 중 한개이다(다른 하나는 비전공자 신입, 실무자 인터뷰). 솔직히 많이 도움이 됐다. 비전공자 입장에서는 진짜 아무 갈피가 없고 시야가 정말 좁을 수 밖에 없겠다는 생각을 많이 했다. 비전공자를 폄하하는게 아니라 현실적으로 제한된 정보를 토대로 개발자가 되기 위해 노력을 해야한다는 전제 자체가 쉽지는 않아보였다. 그래도 이러한 서적 하나하나가 독자들한테 많은 힘이 되는 것 같다.

Posted by 동팡

오랜만에 글 쓰니까 어색하네..;;

 

독자 정보

  • 5 ~ 10년 차 개발자

 

독서 일자

  • 2022. 02

 

내용

  • 데이터 모델링의 전반적인 개요/배경 설명
  • 데이터 모델링의 주체/대상/행위 등과 어카운트 개념을 설명 
  • ER 서브타입, 식별/비식별자 기준 설명
  • 확장성 있는 모델링 설명(이 모델링 별로야...)

 

별점

  • 4.0/5.0(개발자 입장에서 몰랐던 모델링 개념과 스킬을 소개, 짜임새와 스토리가 있음, 추천+)

 

대상 독자

  • 주니어 개발자
  • DB 모델링 경험을 최소 한 번 이상 한 개발자

 

선행 도서

  • DB 모델링 관련 서적 또는 관련 경험을 한번씩 해보는 것을 추천

 

관련 도서

  • -

 

느낀 점

개발자 입장에서 간접적으로 모델링을 경험할 수 있었다. "현재 사용하고 있는 제품의 DB 모델링은 충분한가?", "과거에 했던 모델링의 필요 개선점?", "개선 했을 때 어떤 점을 더 고려하면 좋을까"와 같은 고민으로 해당 서적을 읽었다. 추상적으로만 인지하고 있던 다음의 사항을 명시적으로 이해할 수 있는 기회가 있었다.

  • 주체/대상/행위: 사전에 모델링할 때 인터뷰를 하거나 분석하는 행위들을 객관적으로 얘기를 못 했습니다.  필자가 하는 행위는 모델링할 때 업무 시스템의 "주체/대상/행위"를 추출하는 행위였다.
  • ER 서브타입: 보통의 ER 서브타입을 객체 지향의 Sub/Super로 대강 이해했지만 통합, 분리, 혼합이라는 것을 알게 되었다. 이 부분은 더 공부가 필요하다.
  • 어카운트 개념: 마스터 데이터, 행위 데이터를 동일한 성격으로 묶는 행위이다. 모델링에 어카운트가 있으면 모델링의 유연성을 제공할 수 있고 업무에서는 유연한 엔티티로 한층 더 유연하게 문제를 해결할 수 있다. 우리가 데이터 모델링할 때 공통적인 것은 묶고 엔티티 간의 연관관계를 맺는다. 연관관계를 연결할 때 징검다리가 필요할 때가 있다. 이때 어카운트가 징검다리 역할을 해준다.

개발자는 한번쯤 읽어보면 정말 좋은 책이라고 생각한다.

Posted by 동팡

MySQL 정보

  • 버전: 5.7
  • 트랜잭션 격리 수준: Default(repeatable read)

장애 현상

  • A 트랜잭션에서 T1 테이블에 delete 쿼리 진행할 때 B 트랜잭션에서 T1 테이블에 insert 쿼리가 lock wait 발생

원인-1(첫 번째 분석)

  • delete 쿼리의 실행 계획에서 풀 테이블 스캔 발생
  • Where 절이 pk로 구성되어 있어도 옵티마이저는 풀 테이블 스캔이 유리하다고 판단(풀 테이블 스캔은 멀티 블록 스캔이고 인덱스는 싱글 블록 스캔이니 일정 분기점 이상 부터는 인덱스 스캔보다는 풀테이블 스캔이 유리함)
  • MySQL에서 로우에 락이 잡히는 기준은 스캐닝된 인덱스 레코드[1]

위의 분석으로 알 수 있는 사항은 다음과 같다.

  • T1 테이블의 모든 로우는 락이 잡혔으며
  • 락이 잡혀있는 동안 다른 세션(트랜잭션)에서 T1 테이블의 모든 로우는 delete/update 불가능하다.

근데 insert는 왜 안돼??? 격리 수준을 read committed 했을 때는 insert가 잘 된다.

원인-2(두 번째 분석)

  • 현재 MySQL의 격리 수준은 repeatable read이다.
  • delete 쿼리를 진행할 때 Next-Key-Lock이 잡혔으며[2],
  • Repeatable read에서 Next-key-lock으로 인해 positive infinity 레코드 까지 락이 걸렸고,
  • 해당 락으로 인해 insert에 lock wait이 발생한다.
  • 위의 락으로 본의 아니게 팬텀 로우를 방지한다

기타 특이 사항

  • delete할 때 풀 테이블 스캔이 아닌 유니크 스캔을 할 때 insert에 lock wait이 발생하지 않는다.
  • ㄴ유니크 스캔을 하면 lock wait 발생하지 않는게 웃기지 않나?? Repeatable read에서 팬텀 로우를 막아준다는데 안 막아준다. ㅈㄴ 어불성설이다ㅋㅋㅋㅋㅋㅋㅋㅋ(아 근데 이 부분에서 lock wait 발생하면 동시성 ㅈ됨)
  • read committed 격리 수준일 때 되는 이유는 단순하다. gap lock, next-key-lock이 비활성화 되어 있기 때문이다.
  • 반대 상황도 Lock이 발생한다. 1) insert 2) delete 풀 테이블 스캔

기타 주의 사항

  • 인덱스 조건없이 쿼리하는 경우 테이블 락 발생
  • 2개 이상의 세션에서 동일한 인덱스 키를 사용하여 다른 행의 레코드에 엑세스할 때 락 충돌할 수 있다(동일한 스캔 범위가 있는 경우 lock wait 발생)
  • 인덱스 효율이 좋지 않으면 락 범위가 넓어진다.
  • 아무리 PK/유니크 인덱스를 사용하여도 옵티마이저 판단하에 풀 테이블 스캔으로 테이블 락이 발생할 수 있다(지금 상황).

재연

1. 테이블 생성

mysql> create table test_tt(t1 int primary key auto_increment, t2 int, t3 int); 
Query OK, 0 rows affected (0.09 sec)

2. 테스트 데이터 삽입/조회

mysql> insert into test_tt(t2, t3) values (1,2); Query OK, 1 row affected (0.00 sec) 
... 

mysql> select * from test_tt;
+----+------+------+
| t1 | t2   | t3   |
+----+------+------+
|  1 |    1 |    2 |
|  2 |    1 |    2 |
|  4 |    1 |    2 |
| 31 |    1 |    2 |
| 32 |    1 |    2 |
| 33 |    1 |    2 |
| 34 |    1 |    2 |
| 35 |    1 |    2 |
| 36 |    1 |    2 |
| 37 |    1 |    2 |
| 38 |    1 |    2 |
| 39 |    1 |    2 |
| 40 |    1 |    2 |
| 41 |    1 |    2 |
| 42 |    1 |    2 |
| 43 |    1 |    2 |
| 44 |    1 |    2 |
+----+------+------+
17 rows in set (0.00 sec)

3. 삭제 실행(세션 1, 트랜잭션 시작, 삭제실행)

mysql> explain delete from test_tt where t1 in(31,32,33,34);
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table   | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | DELETE      | test_tt | NULL       | ALL  | PRIMARY       | NULL | NULL    | NULL |    4 |   100.00 | Using where |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set (0.00 sec)

4. 삽입 실행(세션2, 트랜잭션 시작)

mysql> insert into test_tt(t2, t3) values (1,2);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

5. DB 락 현황 조회 결과

mysql> select * from information_schema.innodb_locks;
+--------------+-------------+-----------+-----------+-------------------+------------+------------+-----------+----------+------------------------+
| lock_id      | lock_trx_id | lock_mode | lock_type | lock_table        | lock_index | lock_space | lock_page | lock_rec | lock_data              |
+--------------+-------------+-----------+-----------+-------------------+------------+------------+-----------+----------+------------------------+
| 10586:43:3:1 | 10586       | X         | RECORD    | `mysql`.`test_tt` | PRIMARY    |         43 |         3 |        1 | supremum pseudo-record |
| 10581:43:3:1 | 10581       | X         | RECORD    | `mysql`.`test_tt` | PRIMARY    |         43 |         3 |        1 | supremum pseudo-record |
+--------------+-------------+-----------+-----------+-------------------+------------+------------+-----------+----------+------------------------+
2 rows in set, 1 warning (0.00 sec)
 
mysql> select * from information_schema.innodb_lock_waits;
+-------------------+-------------------+-----------------+------------------+
| requesting_trx_id | requested_lock_id | blocking_trx_id | blocking_lock_id |
+-------------------+-------------------+-----------------+------------------+
| 10586             | 10586:43:3:1      | 10581           | 10581:43:3:1     |
+-------------------+-------------------+-----------------+------------------+
1 row in set, 1 warning (0.00 sec)

 

참고문헌

Posted by 동팡

간단메모 

 

개요

  • KDF(Key Derivation Function)는 에플리케이션/프로토콜 서브 로직 등에서 많이 활용할 수 있다.
  • 사용자 정의 보안 프로토콜에서 Key/IV/Nonce 등의 Secret 값을 만들기 위해 사용한다.
  • 우리가 사용하는 인증서의 비밀번호는 PBKDF를 사용한다(실질적으로 표현하면 인증서에 상응하는 PrivateKey를 암호화하는 키를 생성하기 위한 비밀번호).
  • PBKDF는 패스워드/Hash 기반으로 키를 유도한다.
  • HKDF는 HMAC을 기반으로 키를 유도한다.
  • HKDF는 "extract-then-expand"의 페러다임(2개의 모듈)을 갖고 있다.
  • extract에서는 일반 입력 값으로(엔트로피가 낮은 값으로) 고정 길이의 PRK(의사난수 키) 값을 추출한다.
  • expand에서는 extract에서 발췌한 PRK를 확장한다.

플로우

  1. HKDF-Extract(salt, IKM) -> PRK(의사난수키)
    • salt: HMAC에서 Key로 사용(공개 값 사용 가능)
    • IKM: HMAC 대상 data
    • salt가 null인 경우 아래와 같음
    • byte[] salt = DatatypeConverter.parseHexBinary("0000000000000000000000000000000000000000000000000000000000000000");
      Mac mac = Mac.getInstance("HmacSHA256");
      mac.init(new SecretKeySpec(salt, "RawBytes")); 
      byte[] extract = mac.doFinal(IKM);
  2. HKDF-Expand(PRK, info, L) -> OKM(최종 결과)
    • PRK: Extract의 결과
    • info: salt와 비슷한 아무 값(생략 가능)
    • L: 결과 값의 길이 
    • /*
      The output OKM is calculated as follows:
        N = ceil(L/HashLen)
        T = T(1) | T(2) | T(3) | ... | T(N)
        OKM = first L bytes of T
      where:
        T(0) = empty string (zero length)
        T(1) = HMAC-Hash(PRK, T(0) | info | 0x01)
        T(2) = HMAC-Hash(PRK, T(1) | info | 0x02)
        T(3) = HMAC-Hash(PRK, T(2) | info | 0x03)
        ...
       */
    • 위의 식으로 HMAC 결과 값 만큼 append하여 결과를 출력한다. 
    • 만약 HmacSHA256을 사용하고, 원하는 출력값이 96인 경우 위의 where절을 3번 실행한다.

기타 정보

  • Extract의 salt는 재사용이 가능하며, 없어도 되지만 보안상 추가하는 것이 좋다고 봄.
  • Expand의 "info"는 여러개의 세션 또는 컨텍스트 간에 중복 결과를 방지한다. IKM은 같은 경우가 많으니 info 값을 salt 처럼 활용하는 것 같다.
  • 만약 extarct에서 사용하는 입력 값이 높은 엔트로피를 갖고있으면 extract는 생략할 수 있다.
  • 최종 결과 값 OKM 값이 해시 길이(예:32byte)보다 낮은 경우 PRK를 대신사용할 수 있지만, 권고하지 않음

보안

참고문헌

 

Posted by 동팡

가벼운 마음으로 왔다가 결제까지 해버렸네요...

 

침대는 과학이다(야스오도 과학이다. K3도 과학이다.). 

이쯤되면 에이스는 "과학"을 잘 선택한건지ㅋㅋㅋㅋㅋㅋ

잡설은 뒤로하겠습니다.

 

에이스 침대 동탄점 다녀왔습니다.

에이스 침대 지점은 롯데 백화점에 있는데요. 이번에 새로 지은 백화점이에요. 

보통의 백화점과 달리 백화점이 여백의 미가 있어 정말 좋았습니다(푸드코트, 지하 1층 빼고 ㅡㅡ).

 

제 지론 중 하나인데요. "돈은 아껴도 작업실, 수면실에는 꼭 돈을 투자해야한다." 입니다.

저희 삶의 1/3을 담당하기 때문이죠. 작업실에서는 1/2 ~ 1/3의 시간을 보내고 침실에서는 최소한 1/3의 시간을 보내지요. 

롯백 에이스침대 동탄점

 

그래서 에이스, 시몬스 두개를 고민했습니다.

어렸을 때 부터 많이 들어온 브랜드가 이 두개 밖에 없어요

요즘에 침대 브랜드가 많이 생겼대요. 고급 브랜드 가성비 브랜드... 등등 

근데 진짜였어요. 정말 많은 브랜드가 입점해있습니다. 

 

매장은 좁은데 손님이 많은 에이스 오브 에이스

 

 

정말 가벼운 마음으로 왔는데요.

안내 해주시는 매니저님이 친절하게 설명해주셨어요

되려 다른 곳도 한번 둘러보고 오라고 얘기까지 해주시고 부담을 많이 덜어주셨습니다.

 

침대를 어떻게 보는게 좋은지, 특장점이 대강 무엇인지, 자신한테 맞는 침대는 무엇인지, 침대의 수명은 어떤지, 침대 프레임의 제질?별 추천도, 어떻게 사면 3년 후에 다시와서 침대를 또 구매할 수 있는짘ㅋㅋㅋㅋㅋㅋㅋㅋ

 

여튼 대략적으로 설명해주셨는데요. 근데 스프링 설명은 아직도 이해가 잘 안가요

 

그리고 백화점에서 사면 좋은 점이 있어요

롯데 카드 5%?? 할인 돼요.

아 동탄 롯백 오픈 할인도 있음요.

그리고 이래저래 프로모션도 많아요.

 

아래는 매장 사진이에요~

파란색은 약간 딱딱한놈, 저기 싱글 침대는 딱딱한 놈
우리가 구매한 적당히 :딱딱한 놈, 하이브리드 블루
넌 기억이 안난다 미안

 

주저리 적었는데요(일상 블로깅은 쉽지 않네요.). 정리할게요

 

왜 에이스를 선택했는가?

 - 야스오ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 - 솔직히 침대/침실은 투자해야합니다. 

 - 솔직히 가전/가구는 전문가가 아니면 브랜드 레벨 따라가야해요. 

 

에이스 침대 동탄점 어땠나요?

 - 매니저 형님이 친절했어요

 - 매니저 형님 설명이 좋았어요(스프링 빼고). 딱딱 필요한 것만 잘 얘기해줬어요.

 - 매장은 좀 좁은데, 딱 필요한 것만 비치했어요(메트리스 강도별로). 

 - 백화점 할인도 있어서 좋았어요

 - 프로모션을 잘 챙겨줬어요

 

침대 모델명은?

 - 하이브리드 테크 블루(킹 사이즈) + 국민 프레임

 - 전 적당히 딱딱하고 제 몸에 촥 맞는 그 느낌이 정말 좋았고요

 - 그리고 침대에서 허우적 될 때 힘들지가 않았어요(시몬스는 침대에서 허우적 거릴 때 물속에서 헤엄치는 줄 ㅡㅡ).

 

뽀찌는 뭐 챙김?

 - 많은데??? 

 - 베개 커버

 - 기능성 방수 메트리스 커버

 - 메트리스 스프링 청소 도구

 - 케리어(이벤트 인듯)

 - (매니저 형님 선물) 

 - 더 있을거임 기억이 안남

 

그래서 니 견적가는 얼마임?

 - 그 신혼 카페(혼수 카테고리) 견적가 보다는 더 싼 것 같음

 - 롯데 백화점 구경할 겸 함 ㄱㄱㄱ하셈  

 

 

 

Posted by 동팡

목차

  • 시리즈 소개
  • 개요
  • 라이브러리 소개
  • 데모 - 1
  • 데모 - 2
  • 데모 - 3
  • 데모 - 4
  • 마치며, 다음 시리즈

 

시리즈 소개

본 시리즈는 웹페이지 앞단에서 게시판 페이징을 하는 방법을 소개한다. 즉, JavaScript에서 어떻게 페이징 처리하는지 확인할 수 있다. 피곤하지 않으면 2장 라이브러리 최적화 작업을 진행할 예정이다. 요즘 바빠서 너무 피곤하다... 

  • Pure-JavaSciprt 게시판 페이징 - 1(기본/응용)
  • Pure-JavaSciprt 게시판 페이징 - 2(라이브러리 최적화)

 

개요

[들어가면서...]

웹 페이지에서 제일 많이 사용하는 기능은 단연 게시판이다. 그리고 신입 개발자가 처음에 직면하는 벽이 게시판 페이징 작업이다. 게시판 페이징 작업을 구글링 하여 구현하는 거는 진짜 쉽지 않을 것이다. 게시판 페이징 개발 스타일이 다양해서 이것저것 참고하다가 실패할 것이다. 차라리 책에서 제공하는 게시판 페이징 코드를 활용하는 게 정신 건강에 좋을 것이다. 

 

[게시판 페이징 개발 스타일]

그렇다면 어떻게 개발 스타일이 다를까? 다음과 같다.

  • Java(Spring) / JSP(JSTL) 백단 게시판 페이징 
  • JS 앞단 게시판 페이징

백단 게시판 페이징 스타일은 옛날 스타일이다. 백단에서 게시판 페이징에 필요한 데이터를 가공하여 앞단에 전달, JSP영역에서 JSTL 반복문을 사용하여 게시판 페이징을 구현한다. 단점은 1) 페이지 이동할 때마다 페이지 깜박임, 2) JSP에 종속적인 개발 방법이다. 앞단 게시판 페이징은 REST API가 많이 부각되면서 생기지 않았나 생각한다. 백단 기술 스택에 종속적이지 않고 페이지 깜박이는 현상도 없다. 필자 또한 후자를 소개하고자 한다. 

 

[게시판 페이징 라이브러리]

JS 게시판 페이징 라이브러리는 다양하다. 필자는 JS 개발하면서 2~3개 정도 사용했던 기억이 있다. 웹 페이지 특성상 가시적인 요소가 다분하기 때문에 요구사항이 많다. 이와 같은 요구사항을 모두 충족하는 게시판 페이징 라이브러리는 존재하지 않는다. 비약이 심했지만 진짜 찾다 포기했다. 또한 요구사항 충족을 위한 라이브러리 스터디와 분석이 필요하다. 해당 사항으로 인해 작업 속도가 더 느려질 수 있다. 그래서 결국 필자는 별도의 라이브러리를 개발하여 사용하고 있다. 이유는 단순하다. 외주작업을 혼자 하는데 지랄 같은 요구사항 이행하려면 기능 추가가 가능한 라이브러리가 필요하다. 그리고 실무에서 좀 있다 보면 게시판 페이징 라이브러리를 개발하는 것은 많이 어렵지 않을 것이다. 

 

 

[실무에서 게시판 페이징 디테일]

외주/회사 업무에서 겪은 게시판 페이징 요구사항은 다음과 같다.

  • 체크박스를 이용한 테이블 제어
  • 특정 로우에 이벤트 핸들링
  • 특정 열에 이벤트 핸들링
  • 특정 로우, 열에 이벤트 핸들링
  • 게시판 로우 제어
  • 퍼블리셔와의 템플릿 협업

주로 업무 시스템 개발하는 인원은 이것보다 좀 더 다양한 요구사항을 겪을 것이다. 필자는 다음의 요구사항 때문에 직접 만들기로 결심했다. 실제 개발 결과물이다.

특정 열에 이벤트 핸들링

있을 수 있지만, 각 열에 별개의 이벤트 핸들링을 지원하는 게시판 페이징 라이브러리를 찾지 못했다. 1년 전에 개발한 라이브러리이다.. 기억을 되살리고 테스트하여 시리즈를 연재한다.

 

라이브러리 소개

게시판 페이징을 하기 위한 복잡한 Pure-JS 라이브러리이다. 대단한 기능은 없다. 말마따나 복잡하다. 필자가 봐도 복잡하다. 라이브러리 최적화가 필요하기는 하다.  해당 라이브러리를 사용하기 위한 필수 값이 존재한다. 당연 필수 값은 게시판 페이징에 사용되는 데이터들이다. 데이터들은 백단 API를 이용해서 반환받을 수 있다.

  • total: 게시판 페이징 데이터의 총 로우 수
  • limit: 게시판에 뿌려질 데이터의 개수
  • offset: 게시판 페이지의 위치 
  • datas: 게시판에 뿌려질 데이터 

Oracle 외의 RDBMS를 이용하여 게시판 페이징을 했으면 limit, offset을 알 수 있다. RDBMS에서 limit, offset과 같은 의미고 같은 기능이다. 

 

아 참고로 바빠서 넣지 못한 기능이 페이징 넘버링에 대한 이벤트 바인딩이다. Prev, Next, 페이지 넘버에 대한 이벤트 바인딩은 사용자가 직접 추가해야 한다. 

(라이브러리 최적화 때 이벤트 바인딩 기능을 추가하면 괜찮을 것 같다.) 

 

소개는 짧게 하고 바로 데모를 진행한다. 

 

데모 1: 게시판 페이징 기본

백문이불여일견 JS 피들을 확인한다. 차근차근 진행하기 위해 이벤트 바인딩은 하지 않았다. JS, HTML 영역을 보면 쉽게 이해할 수 있다.

JS 영역

function renderTableList(tableDivEl, pageDivEl, tlbLibOpt) {
    var tblPageEl = new TblPager( tableDivEl, pageDivEl, tlbLibOpt).generateTablePage();
}

HTML 영역

<body>
  <!-- table -->
  <div id="tblArea"></div>
  <!-- //table -->
  <!-- pagination -->
  <div id="pageArea"></div>
  <!-- //pagination -->

</body>

 

설명

  • TEST DATAS는 백단 API에서 데이터를 받았다는 가정이다.
  • div의 id는 꼭 위와 같이 설정한다.
  • tlbLibOpt의 Object Literal은 라이브러리가 지정한 값만 사용해야 한다. 
  • headers를 이용하여 백단 API에서 받은 것을 사용자가 보기 좋게 TH 문구를 바꾼다. header는 tlbLibOpt에 꼭 추가해야 한다. 
  • tlbLibOpt의 변수명을 보면 대강 의미를 이해할 수 있다.

 

데모 2: 게시판 페이징, 이벤트 핸들링 추가

백문이불여일견 JS 피들을 확인한다. 페이지 번호와 Prev, Next에 이벤트 바인딩하였다. 이벤트 바인딩을 사용자가 하기 때문에 중복 코드와 복잡성을 가중한다. JS 피들에서 번호를 누르면 이동되는 것을 확인할 수 있다.

데모 2의 코드 플로우는 다음과 같다(추상화). 

  1. 페이지 DOM 로드 완료 후, 백단 API을 호출한다.
  2. 백단 API에서 받은 데이터를 JS DOM 랜더링 함수에 전달한다.
  3. JS DOM 랜더링 함수는 DOM을 생성/수정한다. 
  4. DOM 랜더링 완료 후 특정 DOM에 이벤트를 추가한다.
  5. 특정 DOM의 이벤트가 발생하면 2번부터 반복한다.

데모 2의 코드 플로우는 다음과 같다(구체화).

  1. 페이지 DOM 로드 완료 후, 게시판 페이징 백단 API을 호출한다.
  2. 백단 API에서 받은 데이터를 게시판 페이징 랜더링 함수에 전달한다.
  3. 랜더링 함수는 게시판 페이징 함수를 호출하여 DOM을 생성/수정한다.
  4. 게시판 항목(DOM) 랜더링 완료 후 페이지 번호, Prev/Next에 이벤트를 추가한다.
  5. 페이지 번호를 누르면 2번부터 반복한다.

 

데모 3: 게시판 페이징, 응용 - 요구사항 진행1

백문이불여일견 JS 피들을 확인한다. 퍼블리셔가 작업한 템플릿에 CSS의 기능을 죽이지 않고 JS 코드를 삽입해야 한다. 또한 고객의 요구사항을 몇 개 이행해야 한다. 이번 데모는 다음과 같은 요구사항을 이행한다.

  • 퍼블리셔가 작업한 템플릿이 적용된 게시판 페이징
  • 특정 로우, 특정 열 데이터 핸들링
  • 특정 열 데이터 핸들링

tlbLibOpt변수에 다음의 사항을 추가하였다.

tlbLibOpt : {
  tableInfo: {
    options: {
      tableClassName: "tableClassName",
      customBeforeThTag: function() { return tableColGroup },
      customThTag: function(headerVal) {
        if ( headerVal === "aaa" ) 
          return { start: "<th><span class='no_arrow'>", end: "</span></th>" }
        else 
           return { start: "<th><span>", end: "</span></th>"}
      },
      customTdBodyTag: function( headerVal, index ) {
        if (index == 2 && headerVal === "bbb") {
          return { start: "<td><span><b>", end: "</td></span></b>" }
        } else {
          return { start: "<td><span>", end: "</td></span>" }
         }
	  },
      customTdBodyValue: function( headerVal, listValue ) {
        if ( headerVal === 'bbb' ) {
          if ( listValue === true) {
            return '성공'
          } else {
            return '실패'
          }
        }

        return listValue
      }
    }
  },
  pageInfo: {
    options: {
      customPrev: {
        start: "<a href='#none'",
        end: "> <<<< </a>",
      },          
      customNext: {
      	start: "<a href='#none'",
        end: "> >>>> </a>",
      },
      customPageNum: {
        totalStart:"<span>",
        start: "<a href='#none'>",
        end: "</a>",
        totalEnd:"</span>"
      }
    }
  }
}

나참 드럽게 복잡하다;;

  • tableClassName: 생성되는 테이블에 class 이름을 추가한다.
  • customBeforeThTag: 테이블의 colgroup을 추가하기 위한 공간이다. <table><colgroup><thead>
  • customThTag: 콜백 함수를 추가했다. headerVal을 활용하여 특정 열에 다른 th 태그를 사용할 수 있다.
  • customTdBodyTag: TD의 특정 열 특정 로우에 특정 태그를 사용할 수 있다.
  • customTdBodyValue: TD의 특정 열 특정 로우에 값을 제어할 수 있다. 
  • customPrev/Next: 뒤로 가기에 특정 태그를 사용할 수 있다(이미지 삽입할 수 있다.).
  • customPageNum: 페이지 넘버링에 특정 태그를 삽입할 수 있다. 

개발자 도구를 활용하여 HTML 태그 랜더링이 어떻게 변했는지 확인할 수 있다. 

 

데모 4: 게시판 페이징, 응용 - 요구사항 진행2

 

백문이불여일견 JS 피들을 확인한다. 데모 3을 베이스로 다음의 추가 요구사항을 이행한다. 

  • 체크 박스 처리
  • 특정 로우, 특정 열 이벤트 바인딩
  • 특정 로우 이벤트 바인딩

 

마치며, 다음 시리즈

인터넷에 돌아다니는 게시판 페이징 테마(CSS)를 사용하여 추가 데모를 시연할 것이다. 또한 데모에서 불편한 사항을 개선할 예정이다. 당장 눈에 보이는 불편한 사항은 다음과 같다.

  • 사용자는 페이징 1~10, Prev, Next DOM의 이벤트 바인딩을 해야한다. 
  • 사용자는 체크 박스의 이벤트 바인딩을 해야한다.
  • 사용자는 테이블 로우 클릭 이벤트 바인딩을 해야한다.
  • 라이브러리에서 제공하는 기타 유틸 함수가 부족하다.

다음 시리즈는 위의 열거한 사항을 기반으로 추가 분석을 실시하여, 라이브러리 최적화 작업을 진행한다. 진행한 결과물에 테마를 입혀 데모를 시연한다. 

 

Posted by 동팡