QnA 형식으로 6개월간 보낸 넥토리얼 일상을 되돌아보는 시간을 가지려고 합니다.
이 글을 작성하던 당시에는 확정되지 않았으나, 마무리를 지어 올리는 지금은 정직원 전환 확정이 되어 기쁜 마음입니다.
넥토리얼 지원을 고민하는 이들에게 도움이 되면 좋겠네요. :D

Q1. 우선 넥토리얼 6개월 간 어땠어? 전반적인 소감이 궁금해.
솔직히 아직도 꿈만 같아. 내가 6개월을 다녔다고? 이런 느낌? 실은 눈 뜨면 아직 4학년 학부생인거 아닐까? ㅋㅋㅋㅋㅋ 물론 졸업증서도 받아버려서 빼도 박도 못하는 사회인이 되었지만 ㅠ
전반적인 소감은 6개월간 정말 많이 배웠다는 것과 그만큼 또 즐거웠다. 6개월간 일하면서 힘든건 단 하나였어. 내가 진행하던 프로젝트가 내 마음처럼 진행되지 않을 때. 나는 빨리 이 프로젝트를 마무리하고, 다음 프로젝트로 넘어가고 싶은데 자꾸만 끝나지 않고, 매 주 주간보고를 적으면서 내가 일주일 간 도대체 뭐 한걸까 싶어서 괴로웠었어.
그래도 대략 5개월이란 시간을 들여서 크롤러를 만들어서 데이터 통합을 자동화했고, 데이터 분석을 위해서 기본적인 공부도 꾸준히 해서 뭔가를 할 수 있을 것만 같은 초심자의 자신감이 생겼어! ㅋㅋㅋㅋㅋ 또한 그 기간동안 팀원분들과 친해졌고, 회사 생활이 조금은 익숙해졌지. 넥다(넥슨 다방)에서 같이 음료 기다리며 서로 대화도 하고, 인턴 초반에는 회식도 자주했었지. 그리고 다른 인턴분들과도 같이 수다떨고, 저녁도 먹고 재밌었어.
대학에서도 다양한 사람을 만나서 신기하고, 그만큼 내 시야가 넓어진다는 느낌이 들었는데 확실히 사회에 발을 담고, 또 큰 기업에서 다양한 부서의 사람들을 만나서 대화를 나누다보니까 여전히 내가 우물 안 개구리란 생각이 들더라고. 더욱 더 분발하고 싶다는 마음이 강하게 들었지.
Q2. 와, 나는 짧게 답해줄거라 생각했는데... 전반적인 소감이 아니라 오늘 할 말 다한거 같은데? ㅋㅋㅋㅋㅋㅋ
ㅎㅎㅎㅎㅎ 어쩌다보니 서론이 길어졌네. 그만큼 좋았다는 거지~

Q3. 6개월 간 너가 진행하던 프로젝트가 뭐였는지 물어봐도 돼?
크게 2개의 프로젝트였어. 나는 우리 팀에 데이터 분석 포지션으로 들어갔고, 그래서 데이터 통합과 데이터 분석을 진행했지.
데이터 통합은 잠깐 말했듯이 크롤링이었어. 웹페이지에 있는 데이터를 ElasticSearch(이하 ES)로 옮겨서 추후 데이터 분석을 ES의 데이터로만 진행하려고 했어. 원래는 데이터가 ES랑 다른 DB들에 저장되어 있었거든. 해당 DB들에 직접 접근해서 데이터를 옮기기에는 여건이 안 되어서 크롤러가 필요했어.
파이썬으로 개발했고, 셀레니움 라이브러리를 이용해서 웹브라우저를 띄워서 상호작용하면서 크롤링하도록 개발했어. 이번 크롤러 개발이 참 뜻 깊었던 것이 내 첫 객체형 프로그래밍 프로젝트였거든. 부끄럽게도 학교에서는 객체지향 프로그래밍 언어인 자바를 배우고는 그 이후엔 다 절차지향 프로그래밍을 했어. 운영체제나 자료구조 등 대부분 C 언어로 수업을 듣고 개발해서 그런 것도 있었지만, 학부생때는 객체지향의 장점을 잘 몰랐거든.
하지만 크롤러 대상의 웹페이지가 대부분 동일한 형식이라 객체 지향형으로 개발하면 추후에 유지보수가 유리할 것이라고 멘토님께서 객체지향 프로그래밍을 해보라고 추천해주셔서 도전하게 되었어. 여러모로 많이 헤맸지만 멘토님께서 코드리뷰도 해주셔서 또 그만큼 많이 배울 수 있었어.
그리고 TDD(Test-Driven Development)도 처음으로 적용했지. 적용했다기에는 많이 어설펐지만 어떤 느낌이고, 왜 사용하는지 많이 와닿더라고. 이렇게 말하고 나니까 5개월 동안 개발한게 짧은 시간은 아니었구나 싶네 ㅎㅎㅎㅎ
Q4. 그러게, 참 많은 것을 도전해봤구나. 그러면 두 번째 프로젝트는 뭐였어?
데이터 분석 프로젝트였는데. 게임 보안 로그를 보면서 그 안에서 유의미한 모델을 만드는 작업이야. 현재 진행 중인 프로젝트이기도 하고. 아직은 데이터를 보고 어떤 유의미한 결과를 만들 수 있을지 살펴보고 있는 과정인데, ES에서 제공하는 anomaly detection 기능을 이용해서 진행해보고 있어.
그리고 전에 생성되어있던 모델이 있어서 해당 모델에 대해 인수인계 받으면서 같이 공부도 했던 것 같아. 데이터 분석이라고 해도 학부생 때 딥러닝 수업을 들은 정도에 불과해서 직접 데이터를 보고 분석한다는 일이 아직은 어색하고 모르는 것도 많아서 열심히 공부하고 있어.
Q5. 그렇구나. 그러면 두 프로젝트를 진행하면서 힘들었던 점 통틀어서 하나를 꼽으라면 어떤 거야?
음... 어려운 질문이네. 첫번째 질문에서 답했듯이 내가 원하는 만큼 프로젝트의 결과가 나오지 않는게 심적으로 참 많이 힘들었는데, 그것 말고 좀 더 구체적인 경우를 찾으면 객체지향형 프로그래밍을 적용하던 과정이라고 해야할까?
앞서 밝혔듯이 학부생 때는 대부분 절차지향형 프로그래밍 언어인 C를 사용하다보니까 처음에는 객체지향 자체가 너무 어색했어. 분명 배운 개념이긴한데, 막상 사용하려니까 감이 안오는거지. 클래스의 상속이니, 오버라이딩이니, 나는 학부생 때 3개월 동안 밖에 안 배웠는 걸?

그래서 관련 문서도 많이 찾아보고, 여러 파이썬 오픈소스를 보면서 클래스가 어떻게 만들어져있고, 활용하는지 찾아봤어. 물론 멘토님께서 코드리뷰 해주시면서 내가 놓치고 있는 부분을 많이 챙겨주셨고, 객체지향 관련 도서도 읽으면서 내 코드를 객체지향적으로 바꾸려고 많이 노력했지. 예를 들어서 최대한 기능을 최소화해서 함수를 만들었고, 클래스 단위도 책임을 최소화하려고 많이 고민했어. 그러다보니 상속을 사용하게 되고, 오버라이딩도 사용하게 되더라고. 안 그러면 코드의 중복이 많아지니까.
6개월 전의 나라면 절대 생각도 못 했을 부분들이었지. 솔직히 그 당시에는 필수 기능들이 돌아가면 된다는 느낌으로 개발했다는 느낌이 강했으니까? 근데 지금은 기능의 확장 등 유지보수의 면에서 계속 고민하게 되니까 그 당시의 마인드가 여러 의미에서 대단했다고 생각해 ㅋㅋㅋㅋㅋㅋ

(그리고 해당 질문이 정직원 전환 축하 파티(?)를 진행하며 멘토님께 들었던 질문의 하위호환인 것 같아서 추가로 덧붙여!)
그리고 실은 멘토님께서는 라이브 서비스를 하나 개발한 건데, 그 중에 가장 기억에 남는게 없냐고 여쭤도 보셨거든. 그 당시에는 딱 이거다 싶은게 없어서, 제대로 답을 못했는데 집에 와서 곰곰히 생각해보니까 그냥 라이브 서비스 개발 자체가 기억에 남는 것 같더라.
TDD 로 개발하다보니까 일부 웹페이지 리소스를 다운(테스트 리소스용)받아서 그거 기반으로 크롤러를 개발했었는데, 실제 웹페이지는 네트워크에 따라 로딩 속도도 다르고, 간혹 제대로 페이지가 불러와지지 않을수도 있잖아? 그런 부분을 내가 임의로 테스트 리소스에 작성하거나 예외처리를 하지 않으면 놓치기 쉽상이더라고. 그래서 막상 개발은 했는데, 실제 크롤러를 돌리니까 로딩을 제대로 대기하지 못해서 에러도 잔뜩 났었지.
그리고 서비스를 지원하는 웹페이지의 성능도 나름 천차만별이여서 애를 먹었어. 크롤러가 여러 나라의 웹페이지를 크롤링했어야 했는데, 그러다보니 나라별로 로딩 속도도 달라서 우리나라 웹사이트 기준으로 개발하다가 막상 적용하면 에러가 나서 다시 수정하곤 했어.
그러다 보니까 결국 유지보수의 유지보수가 되고, 끝이 보이지 않는다는 것을 알았지. 게다가 크롤러를 동시에 많이 돌려서 크롤러를 돌리던 PC 자체의 메모리 부족으로 크롤러들이 강제 종료되어서 당황했던 기억도 있어 ㅋㅋㅋㅋㅋ

그래도... 나는 게임 서비스에 직접 영향을 미치는 업무들이 아니었어서(물론 최악의 최악의 경우에는 영향을 미칠 수 있었으나) 이렇게 나 혼자 헤맨 걸로 끝난거라고 생각해. 실제 서비스를 운영하고 개발하는 분들은 정말 너무 대단하다는 걸 느꼈어.
(그런 의미로 우리 팀 짱 멋있다! 너무 대단해!)
Q6. 객체지향적 프로그래밍과 TDD 개발론을 적용하는데 어려움을 겪었다는 거지?
혹시 어떻게 극복했는지, 아니면 어떤 식으로 잘 적용하기 위해서 노력했는지 조금 더 자세히 말해줄 수 있을까?
셀레니움 라이브러리의 웹드라이버 객체를 상속받아 크롤러 전용 웹드라이버 클래스를 만들어 사용했던 순간에서야 내가 좀 객체지향과 친해졌다는 것을 느낄 수 있었어.
처음 개발할땐 그냥 셀레니움 라이브러리만 사용하려고 했으나, 개발하던 중 웹페이지 새로고침 함수를 커스터마이즈할 일이 생겼어. 하지만 웹드라이버 객체를 두 클래스에서 사용하고 있었고, 두 클래스는 웹드라이버를 활용하는 클래스이지 웹드라이버 기능을 확장하는 클래스는 아니었거든. 그래서 기능을 확장하는 클래스를 셀레니움 라이브러리의 객체를 상속받아서 따로 만들게 되었지.
만약 객체지향 프로그래밍을 하지 않았거나 혹은 여전히 미숙했다면 상속받는 것이 아닌, 하나의 클래스 멤버로 삼아 또 다른 클래스를 만들어 번거롭게 접근하고 개발했을 것 같아. 아니면 그냥 활용하는 클래스에다가 함수를 만들었을지도 모르겠어. (생각만해도 부끄럽다ㅠ) 그렇지만 상속을 이용해서 새로운 클래스를 만듬으로써 클래스의 책임도 줄이고, 보다 더 쉽게 확장할수 있어 유지보수 측면에서 더 나은 구현을 할 수 있었다고 생각해.
그리고 TDD의 경우에는 초반에 테스트 자체에 집중하다보니 단편적인 테스트를 위한 코드를 짜고, 리소스를 생성했어. 리소스 같은 경우에는 크롤링할 대상의 웹페이지 소스코드를 다운받아서 준비했는데, 초반에는 로컬에서 해당 페이지를 띄우기 위해서 프로젝트 디렉토리 위치에 맞게 다 리소스를 수정했었어. 그러다보니 테스트하는 위치가 변경되면 제대로 테스트가 불가하는 등의 유지보수 문제가 생겼지.
결국은 이를 해결하기 위해서 구글링하다가 python의 http.server 를 이용해서 디렉토리 위치와 상관없이 웹페이지를 띄워서 테스트를 할 수 있다는 것을 알았지. 그래서 큰 산을 넘겼다고 생각했는데 여전히 특정 ip 대역(127.0.0.1)을 기준으로 띄우다보니까 해당 ip로 리소스를 수정해야 했어. 또한 테스트 코드를 짜다보니까 테스트 리소스랑 실제 웹페이지의 접근 방식의 차이로 인해서 테스트가 불가한 경우가 생기더라고. 결국은 다시 구글링을 하고 삽질을 통해서 테스트를 위한 웹서버 띄우는 모듈을 따로 만들고, 이를 통해서 테스트 리소스도 수정을 하지 않게끔, 그리고 실제 웹페이지와 동일하게 작동하도록 수정할 수 있었어. (물론 백그라운드의 데이터가 오고가는 부분은 따로 수정했지만.)

여기까지 다 수정하고 나서 멘토님께 코드리뷰를 받으니까 정말 많이 나아졌다고 하시더라고. 그리고 실제로 이 글을 쓰면서 돌아보니까 생각보다 많이 나아진 것 같아서 뿌듯하네! 6개월이 헛되지 않았다!
그러면 이만 기술적인 회고는 줄여보려고 합니다.
벌써 넥토리얼을 통해 정직원이 된지 2개월이 넘어가는데 이제서야 글을 올리게 되네요.
넥토리얼을 궁금해하고, 또 준비하는 모두에게 큰 힘이 되고 싶다는 마음에 글을 쓰기 시작했는데 바쁘다는 핑계로 글을 등록하는 시기가 늦어지고, 혹시 잘못 적은 것이 없을까 꼼꼼하게 확인한다는 핑계로 더더욱 늦어져버린 것 같습니다.
그래도 이 글을 정리하면서 스스로도 돌아볼 수 있어서 좋았습니다.
부디 넥토리얼을 포함해 여러 인턴 과정을 준비하는 분들께 도움이 되었으면 좋겠습니다!

드디어 게시글 올렸다!!
'일상' 카테고리의 다른 글
2022 회고 (0) | 2023.01.01 |
---|---|
2021 회고 (0) | 2022.02.06 |
JetBrains Student License / Educational Pack 연장하기 (2) | 2021.12.29 |
실업 크레딧 제도 알아보기 (0) | 2021.08.26 |
40대 이하 코로나 백신 예약하기 (feat. 본인인증 과정, 10부제) (0) | 2021.08.16 |