'전체'에 해당되는 글 128건

  1. 2007.02.25 컨퍼런스와 사람들 (21)
  2. 2007.02.22 데이터 마이그레이션 수행속도 높이기 (8)
  3. 2007.02.22 기간별 프로그램 제어 1시간 57분 (6)
  4. 2007.01.30 전화기가 젖을 정도의 긴장 (6)
  5. 2007.01.12 자질 갖추기 (6)

컨퍼런스 준비 때문에 하루 밀린 업무를 하기 위해 사무실에 나왔습니다. 삼일간 무리했던 탓인지 집중하기가 쉽지 않네요. 졸린 틈을 타서 블로그들을 돌아보니 그 사이 몇몇 글들이 올라왔습니다. 참 부지런들 하네요.

이번 컨퍼런스에서는 지난 2년간 오픈소스를 공부하면서 느꼈던 "오픈소스와 개발자의 성장"이란 주제로 발표를 했습니다. 많은 면에서 부족한 발표였을텐데 듣는 분들의 반응이 좋아 행복했습니다. 함께 발표했던 파란매직님에게 이번 발표가 좋은 경험이 되었기를 바래봅니다. 사전에 약속하지도 않은 여자 목소리 흉내는 정말이지 압권이였습니다.

컨퍼런스에 참여하는 건 함께하는 다양한 사람들의 열정에 전염될 수 있고, 자기를 돌아보는 계기 되며, 또 다른 목표를 세우게 함과 동시에 보고 싶던 사람들을 한꺼번에 만날 수 있는 기회가 되어 좋은 것 같습니다. 말이 나온 김에 만났던 분들을 잊지 않게 좀 적어둘까 합니다.

  • 응원해 주신 OpenSeed와 AJN의 친구분들께 감사를 드려야겠네요. 기선님, 성일님, 맥스님, 영회님, 토비님, Ripper님, 따지크님, .... 에구 너무 많아서 다 인사드리기가..
    특히 기선님 애써 받은 구글컵 선물로 주셔서 감사.. :)
  • 우진님 일부러 찾아와 주셔서 정말 감사했습니다. 오랜만에 뵈었는데도 여전히 그냥 마음이 통한다는 느낌이여서 더욱 반가웠구요.
  • 엄청난 번역 실력으로 번역의 진도를 늦추는 데 큰 공헌을 하신 박재호님도 집접 뵈어 좋았습니다. 저 같은 사람을 위해 살살 좀 번역해달라고 부탁드렸는데, 들어주시면 큰일나는 거 아시죠? :)
  • 원석님. 예전 스프링 세미나에 참석하셨을 때 누군지 몰라봤었는데, 토론세션에서 다시 만나 정말 반가웠습니다. GlassFish와 관련해서 좀 더 많은 얘기를 나눴으면 했는데, 자바인의 밤 행사 장소에서 아무리 찾아봐도 안계시더군요. 메일로 다시 연락드리겠습니다.
  • 블로그로만 뵙다가 만나서 인사를 나눴던 승규님, Ologist님.. 모두 반가웠구요, Ologist님. 후기에 저도 끼워주셔서 고맙습니다.
  • 매년 컨퍼런스때만 뵈어 아쉬운 JCO의 옥상훈님, 양수열님, 고덕한님, 김태완님, 최상훈님, 허광남님.. 모두 반가웠습니다. 태완님. 견우 직녀처럼 1년에 한번씩 뵈니 회사 옮긴것도 모르죠 --+, 앞으론 가끔씩이라도 연락을 하고 살도록 해요.


코끼리 형님이랑 종하랑 강기자님을 못 보고 내려온게 많이 아쉽습니다. 그래도 만나고 싶었던 분들, 인사를 나누고 싶었던 분들, 그리고 언젠가 동료로 함께 일하게 될지도 모를 많은 자바 개발자 분들을 알게 되어 뿌듯한 하루였습니다.

상훈님이 열심히 기획중인 오픈소스 관련 일들이 가시화되는데 도움을 드려야 할 것 같고, Glassfish에 참여하기 위해 원석님한테 도움을 많이 받아야겠다는 막연한 생각으로 주절주절 써간 오늘 글을 마무리 해야 겠네요. 피곤해서 글도 잘 안나갑니다. 갑자기 술자리에서 토비님이 한 얘기가 떠오르네요. 오픈소스 분야의 블루오션은 각종 오픈소스를 조합한 어플리케이션 영역이라는 ... 하이버네이트 번역이 끝나는 대로, 오픈소스 프로젝트에 적극적으로 몸담아보려 하는 생각을 수정해야 할지도 모르겠습니다.

발표자료는 OpenSeed 포럼에 올렸습니다. 참고하세요.

컨퍼런스목차 앞에서 한컷.

사용자 삽입 이미지

행사장을 뒤로 하고 또 한컷 : Ripper/물개/토비/영회/파란매직 님

사용자 삽입 이미지
신고
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.

현재 수업 모듈의 개발이 진행 중인데요, 정치적 상황으로 논리 모델 자체가 와장창 바뀌는 경우가 많아 데이터 마이그레이션을 자주 실행하게 되었습니다. 처음 개발한 마이그레이션 프로그램이 최적화를 많이 고민하지 않아서 17 시간이 걸렸는데요, 자주 수행하기 위해 최적화 작업을 수행했습니다. 최적화 작업 이후 100만건 수준의 데이터를 마이그레이션하는 시간이 20분으로 줄어들었습니다. 거의 1/50로 수행시간이 줄어들었네요. 최적화에 사용한 기본원리는 한계는 없다는 믿음과 굳어있는 머리를 깨는 것. ^^* 마이그레이션은 특정 시간에 작업을 멈추고 진행하기 때문에 메모리 옵션을 최대한 주고 실행한다는 점에 착안해서 캐쉬를 적극 활용하는 방법을 사용한 것입니다.

수강신청 데이터 마이그레이션을 샘플로 살펴보겠습니다. 마이그레이션 로직은 2단계로 나누어집니다. 우선 Legacy DB에서 수강신청이력 데이터를 모두 읽어온 다음, 각각의 수강신청 이력 데이터별로 변경된 스키마에 맞춰 값을 입력하고 마이그레이션이 끝난 개설강의, 학생, 코드(학기, 수강신청유형, 등등)의 정보를 찾아와 관계를 재설정하여 입력합니다. 그런 다음 수강신청이력 중 패턴을 분석해서 수강신청 데이터로 남아야 할 것을 찾아낸 다음 그것을 다시 수강신청 데이터로 변환하여 관계를 재 설정한 후 입력합니다.


사용자 삽입 이미지


수행되는 쿼리들을 분석해보면 처음에 Legacy에서 읽어올 때 select 문은 1번밖에 실행되지 않습니다. 그러나 각 데이터 별로 관계 설정을 위해 특정 조건에 맞는 개설강의, 학생, 코드를 찾아와서 연결해주는 쿼리가 반복적으로 호출되고 있음을 확인할 수 있습니다. 모두 5개의 코드 값을 참고 하기 때문에 패턴검사를 통과한 수강신청 데이터가 20만개라고 볼때 실행되는 쿼리는 select 1 + 100만 * (select 7 + insert 1) + 20만 * (select 7 + insert 1) 개가 됩니다. 즉, 840만건의 select 문과 120만건의 insert 문이 실행되는 거죠.

여기서 가장 문제가 되는 것이 840만건에 이르는 select 문입니다. Legacy에서 읽어오는 단 1개의 select 문이나, 개발DB로 실제로 데이터를 넣어주는 insert 문은 생략할 수 있는 부분이 아니기 때문에 그 select 문이 튜닝 대상이 됩니다. DB I/O 자체를 줄이는게 목적인거죠.

수술전
for (Map<String, Object> 리거시수강신청이력데이터 : 리거시수강신청이력데이터들) {
    수강신청이력 saHist = new 수강신청이력();
    saHist.set학생(학생Dao.get학생By학번(리거시수강신청이력데이터.get("학번"))
}

위에 색깔이 표시된 학생Dao 사용에 의해 for 문에 입력된 데이터의 갯수만큼 발생하는 select 문을 어떤 방법으로 없앨 수 있을까요? 아래와 같이 전체 학생 정보를 한번에 읽어와서 Map에 담아두고 이용하면 됩니다.

private void initStudentMap() {
  studentMap = new HashMap<Integer, Student>();
  List<Student> students = studentDao.getAll();
  for (Student student : students) {
   Student fakeStudent = new Student();
   fakeStudent.setStudId(student.getStudId());
   studentMap.put(student.getStudNo(), fakeStudent);
  }
 }

이제 앞의 문제코드는 for 문 밖에서 전체 학생정보를 읽어오는 1번의 쿼리만 DB에 날아가고, for 문 내부에서는 Map을 이용해서 메모리에 있는 학생 정보를 적당한 키 값으로 가져오는 방식으로 변경되었습니다.

수술후
initStudentMap();
for (Map<String, Object> 리거시수강신청이력데이터 : 리거시수강신청이력데이터들) {
    수강신청이력 saHist = new 수강신청이력();
    saHist.set학생(studentMap.get(리거시수강신청이력데이터.get("학번"))
}

같은 원리로 ehCache와 같은 라이브러리를 쓰는 방법도 있습니다. 사용방법은 초기화하는 부분을 빼면 Map과 별 차이가 없습니다.

또 하나의 팁은 하이버네이트를 이용하기 때문에 발생하는 문제를 해결하는 것인데요, DAO를 적정한 주기로 flush하고 clear 해줘야 합니다.

public static final int STEP=20;
public void migration() {
 initLegacyMap();
 int cnt = 0;
 List<Map<String, Object>> mapForStud = new ArrayList<Map<String,Object>>();
 for (Map<String, Object> map : maps) {
  cnt++;
  // do migration
  if (cnt%STEP == 0) studyApplyDao.flushAndClear();
 }
}

예전에 for 문을 잘못 사용하는 방법을 예로 들며 동일한 배정문이 for 문 안에 있을 때 그것 밖으로 빼내서 1번만 수행하도록 하는 코드 샘플을 본 기억이 나네요. 불필요한 Select 문을 Map이나 Cache를 이용해서 제거하는 원리는 그것과 다르지 않습니다.

사용자 삽입 이미지
불필요한 Select 문을 없애서 DB I/O 비용을 줄이는 것과, 적절한 주기로 하이버네이트 세션을 flush & Clear 해주는 이 단순한 조작만으로도 마이그레이션 수행 시간이 1/50로 줄어든다는 사실이 놀랍네요. 덕분에 저와 동료분들의 소중한 작업 시간이 조금 더 확보되었습니다. :)

이제 migration_all 태스크만 실행하면 저희 시스템에서 사용하는 모든 리거시 데이터가 개발자 PC의 PostgreSQL이나, 개발 서버의 Sybase로 자동으로 1시간 내에 마이그레이션 되니까요.

물론 아직도 개선할 여지가 어딘가에 남아 있을 거라는 사실은 잘 알고 있습니다. 히딩크처럼 늘 배고파 하며 살아야 하는 개발자의 숙명이기도 하죠. 하지만 이정도 속도면 처음의 불편함을 해소하는데 충분하기 때문에, 추가적인 성능 향상에 대한 필요성이 제기되면 그 때 다시 고민해보도록 하죠.
신고
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.
Whiteship님께서 TDD Helper라는 재미있는 유틸리티를 연습삼아 개발하고 있습니다. 그분의 지치지 않는 열정과 실력향상을 위해 꾸준하게 내딛는 발걸음은 나태해지고 싶어하는 못난 제게 늘 좋은 자극이 됩니다.

사용자 삽입 이미지
재밌겠다는 생각이 들어 TimeTrek 이라는 시간 측정 프로그램을 하나 다운 받아서 제 작업 속도를 측정해봤습니다. 마침 쉽게 끝날 수 있는 컴포넌트 개발을 시작하던 참이였거든요.

새 프로젝트를 하나 만들어서, 저희 프로젝트 절차별로 작업 단위를 만들어 Punch In 하고 개발에 들어갑니다. 중간 중간에 작업 단위가 끝나면 Punch Out하고, 다시 신규 작업을 입력하고 Punch In 하기를 반복.

순수하게 전체 개발에 소요된 시간은 1시간 57분이 측정되었습니다. 측정 기준을 분 단위로 조정하고, 보고서 보기를 눌러서 어디에 얼만큼의 시간이 걸렸는지를 살펴봤습니다.

- 도메인 모델 설계/구현, ERD 반영, Enum구현, JPA 어노테이션 매핑, XML 설정 : 15분
- 코드 생성기로 BL/DAO/CTRL/Support/UI를 생성하고 관련 XML 설정/테스트 : 5분
- 자동생성하지 않는 UI 부분 추가, Context 정보 처리 구현 : 20분
- 검색을 위한 DAO/BL 추가구현, 테스트 시나리오/데이터, 테스트 프로그램 : 20분
- 도메인 모델에 Transient 메소드 추가, 테스트 : 10분
- BL에 비즈니스 메소드 구현 및 테스트/리팩토링해서 Util로 빼내기/테스트 : 12분
- 배포 후 서버에서 사용 테스트 : 5분
- Ctrl에 Validation 로직 추가 / 사용 테스트 / UI 표준 검토 및 조정 : 19분
- Wiki에 완료보고서 작성 / 스케쥴에 완료 표시 : 11분

사용자 삽입 이미지

사용자 삽입 이미지

중간에 동료의 이슈를 해결해주고, 짧은 회의, 알고 지내던 분의 메신저 공격이 있어서 실제로 걸린 시간은 4시간입니다. 오후 1시에 시작해서 5시에 끝을 냈으니까요.

단순한 CRUD여서 더 쉽게 처리할 수 있었는데, 약간의 도메인 로직이 있었고 다른 컴포넌트에서 불러 쓸 메소드를 만들고 문서화 하는데 시간이 좀 걸렸네요. 이번에 시간 측정을 해보니 아직도 UI 작업에 불필요한 노가다를 반복하고 있는 걸 확인할 수 있었습니다. 코드 생성기를 개발할 때, 비표준 화면들 때문에 그리드만 컬럼을 자동생성하고 생성/수정 화면은 틀만 생성하도록 한 것이 원인입니다. 생성/수정 화면의 입력 컬럼과 필수 입력에 대한 Ctrl단의 Validation 코드도 자동생성할 수 있도록 코드 생성기의 기능을 확장하는게 좋을 것 같습니다.

이런 단순한 작업은 1시간 내에 처리할 수 있도록 좀 더 가다듬어야 할 필요성을 깨닫게 해준 재미난 놀이였습니다.

[추가글 - 2006/03/08]
Ajaxian을 읽다가 발견한 사이트인데요, http://www.toggl.com/ 이라고 타임 트렉킹을 Web 2.0 트렌드에 맞춰 개발한 사이트가 있네요. 샘플을 만들어 이용해보니 꽤 유용했습니다. 좋은 아이디어네요.

사용자 삽입 이미지

신고
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.
마이그레이션을 돌리고 있는데 데이터가 많아서 끝날려면 꽤 시간이 걸릴 것 같네요. 모처럼 여유 시간이 나서 블로그에 주절 주절 글이나 남겨볼까 하고 들렀습니다.

올해 목표로 삼은 것 중 하나가 영어 회화입니다. 작년 프로젝트 발표회 때 외국인 총장님이 구현 기술이 뭐냐고 물었을 때 유창하게 대답하지 못하고 "자바" 란 한마디로 끝냈던 날의 창피함을 기억하기 때문이고, 올해 말이나 내년 초에 스프링 컨퍼런스에 다녀올까 하고 생각을 하고 있기 때문입니다.

회화 학원을 다닐까, 혼자 공부할까.. 여러 가지 방법을 고민하다가 선택한 것이 롱맨의 "레디 투 고"라는 프로그램입니다. 총 4단계로 나눠지는 1년짜리 커리큘럼인데요, 롱맨이라는 이름에 호기심을 느껴 샘플 CD를 신청했다가 캘리 란 이름을 가진 선생님과 전화 통화를 한 뒤 제대로 낚여서 구매했습니다. 꽤 큰 목돈이 들었기 때문에 그 돈이 아까워서라도 열심히 하지 않을까 생각합니다.

각 단계 전에 레벨 테스트, 매달 성과 테스트, 단계가 끝나고 나면 토익 시험을 치룹니다. 영어 공부를 안한지 너무 오래인지라 기초 단계도 90점 밖에 얻지 못했습니다. 그래서 기초부터 시작하고 있어요.

각 단계는 교재와 혼자 공부할 수 있도록 도와주는 플래시 강좌가 담긴 CD/오디오/테이프가  주어집니다.  오랜 영어 교육 노하우를 가진 롱맨의 제품답게 구성은 괜찮습니다. 너무 바빠 공부를 소홀히 한 날이면 어떻게 알고 담당선생님에게 전화가 옵니다. 오늘은 영어 통화를 안했네요? 하구.. 자기가 공부한 내용을 실험해볼 수 있게 각 나라에서 온 원어민들과 30분간 일주일에 3번 통화하게 되어 있거든요.

오늘은 샘이라는 캐나다 분과 통화를 했습니다.  뭐 아직 기초적인 단계라 일상적인 질문들을 주고 받는데요, 30분이란 시간이 생각보다 꽤 깁니다. 전화 통화가 끝나면 긴장해서 흘린 땀으로 전화기가 다 젖을 정도입니다. 점점 긴장해서 흐르는 땀이 적어져서, 이런 저런 실험을 해볼 용기가 빨리 생겨나면 좋겠네요.

제가 요즘 블로그에 자주 글을 남기지 않는 건 다른 중요한 일들에 우선 순위가 밀리기 때문입니다. 2월에 있을 자바개발자컨퍼런스에서 오픈소스를 주제로 1시간 동안 얘기할 준비도 하고 있구요, 분량이 몇배나 늘어난 하이버네이트 책도 열심히 번역하고 있습니다. 오픈씨드 멤버와 함께하고 있는 공부도 계속 진행하고 있고, 말씀드린 것처럼 영어 공부도 조금씩 하고 있습니다. 물론 제일 중요한 일에서도 최고의 생산성을 보일 수 있도록 훈련을 하고 있구요. 바쁘게 하루를 보내다 보니 예전의 집중력이 조금씩 돌아오는 느낌이 들어서 정말 기분 좋습니다. 이곳에서 집중력이 떨어졌던 것이 너무 안이하게 살았기 때문이 아닌가 반성하게 되네요.

사용자 삽입 이미지

간만에 맥북을 부팅한 기념으로 사진 한방. ^^*
신고
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.
TAG 목표, 반성

자질 갖추기

이전글/2007 2007.01.12 17:42
오늘 개인적인 감정을 업무 중에 공개적으로 드러내는 실수를 했습니다. 그런 실수를 거의 안하는 편이라고 생각했는데, 요즘 맡은 일에 대한 책임감이 부담으로 바뀌어서 정상적인 상태가 아니였던 것 같습니다. 추위를 많이 타는 편이 아니라고 생각했는데 대전의 겨울은 춥습니다. 제가 추위에 강했던 게 아니라, 예전에 있던 곳들이 상대적으로 덜 추웠던 곳이였던 거죠. 감정을 일에 드러내지 않을 만큼의 단련은 되어있다고 생각했지만, 그 전에는 그렇게 감정을 드러낼 만큼의 스트레스를 받지 않았던 겁니다. 냉정한 가면을 쓰지 않고 감정을 드러낼 만큼 동료들과 인간적으로 가까워져 버린 것도 원인인 것 같습니다.

오늘 토비님과의 대화를 통해 좋은 깨달음을 얻었습니다. 책임감과 부담감이 스트레스로 쌓여서 부정적인 모습으로 드러나지 않도록 하기 위해 스스로 단련해야 할 부분이 무엇인지를 진지하게 고민해봐야 할 것 같습니다. 그리고 프로젝트와 그 프로젝트를 함께 완성해 나가는 동료들의 역할 모델에 대해서도 사전적인 정의가 아니라, 나만의 철학을 갖기 위한 시간을 가져볼까 합니다. 오늘과 같은 실수를 두번 하지 않기 위해서요.

요즘 기뻐 할만한 일이 2가지가 있습니다.
첫번째는 추정의 정확도입니다.  매일 아침 해야 할 일을 노트에 기록하고 있는데, 6시 전후가 되면 정확히 하기로 했던 일들이 마무리되고 있습니다. 컨디션이 나빴던 날에도 계획대로 일이 마무리 되는 것을 보면 업무 집중력을 유지하고 스스로의 생산성에 대한 파악이 된 것 같아 뿌듯합니다. 다음 주부터는 목표를 조금 더 높게 잡아볼 생각입니다.

두번째는 테스트에 대한 스스로의 확신입니다. 사실 이전에는 일정이 바쁘거나 하면 단위 테스트를 생략하고, 개발부터 시작하는 일이 많았습니다. 최근에 개발한 모든 컴포넌트는 테스트가 필요한데 생략한 것이 없습니다. 그리고 다른 사람이 맡은 컴포넌트에 테스트가 없으면 그걸 자신있게 지적해 줄 수 있게 되었습니다. 꽤 바쁜 일정이였는데 말이죠. TDD가 좋다고 떠들면서도 실천하지 않아 내심 부끄러운 마음이 많았는데, 테스트의 중요성에 대해 진심으로 공감하기까지 딱 1년의 시간이 걸린 것 같습니다.

이번 주에 1 오버파에 2 버디를 기록했으니, 평균적으로 보면 조금 향상된 거겠죠? 요즘 스스로를 많이 다그치고 살아서 오늘은 조금 관대해져 볼까 합니다. 사람이 어떻게 완벽할 수 있겠습니까. 이런 저런 실수도 하고 사는거지요. 다행히 실수를 목격한 팀원들과 가족처럼 지내고 있으니, 그분들께도 솔직히 말하고 사과하면 다 받아주실 것 같습니다. 토비형처럼요. ^^*

이번 주는 너무 부담이 많았는데, 다음 주에는 좀 더 즐거운 마음으로 업무에 몰입할 수 있을 것 같네요. 주변에 좋은 분들이 너무 많아서 행복에 겨운 물개였습니다.
신고
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.
TAG 반성
1 ··· 12 13 14 15 16 17 18 ··· 26 

글 보관함

카운터

Total : 226,917 / Today : 16 / Yesterday : 4
get rsstistory!

티스토리 툴바