2021년 목표설정

이미지
기본적으로 작년에 달성하지 못한 것들을 하려고 생각중인데..코로나가 언제까지 이어질지, 한국이나 북해도는 갈 수 있을지..자격증은 응시 가능할지..여러가지가 불확실하다. 2021년은 무엇보다 정신적인 부분과 경제적인 부분에 중점을 두고 조금 더 치열하게 지내보고 싶다. 일본나이로도 30대 마지막 해, 이제 불혹에 접어드는 나이..복잡하지만 심플하게. 육체적목표 : 트라이에슬론 스탠다드 도전하기 정신적 : 자격증2개 도전 + 자체개발 서비스 론칭 가족적 : 가정의 평화를 유지하기 경제적 : 외식과 유흥비를 줄이고 부수입을 늘려서 결과적으로 저축하기 사회적 : 목표세미나를 포함해서 민단과 개인인맥의 활성화와 교류를 촉진하기

[메모] 시간표 출력 프로그램 복습하며 느낀 점

작년에 중간까지 만들다가 중단(다른 일 하게 된 것도 있지만 반쯤은 실력부족으로 인한 포기에 가깝지 않았나) 했던 시간표 출력 프로그램을 다른 개발자가 완성한 소스코드를 보고 느낀점 및 팁을 메모함.
  • 필요한 상수를 const 정의함, 그때그때 변수로 쓰는게 아니라 공통적으로 쓰는 값은 상수로 미리 정의한 후, 클래스 전체에서 사용하게 함. -> 나는 보통 클래스 내부에서 변수로 만들고 그것만 사용하고 말거나 혹은 그 값을 파라메터로 넘기거나 하는데 확실히 이런 부분에서 경험부족이 나오는 듯..
  • MVC패턴에서 View에 값을 보내는 부분과 처리하는 부분을 확실하게 나눌 것. CakePHP에서 Controller와 View(Template) 사이에서 데이터를 전송하는 경우, 기본적인 Class에서는 View에 표시할 데이터만 처리하고 실제적으로 처리를 하는 부분은 별도의 Class를 만들어서 호출하는 형식으로 개발함. 특히 Ajax를 사용해서 값을 전달하고 받아서 처리하는 경우, request의 is메소드로 ajax임을 확인한 후, 처리하는 별도의 함수를 만들어서 호출함. 나 같은 경우에는 기본 Class에 모든 처리를 다 때려넣으려는 경향이 있었고, 그게 Phpspreadsheet 플러그인과 CakePhp 사이에서 충돌이 났던 원인 중 하나이지 않았을까, 라는 생각이 듦.

    public function sheet_output()
    {
         if ($this->request->is('ajax')){
              $this->_roomsheetAjax(); // ファイル出力してAJAXで返す処理
         return;
         }
    }
    public function _roomsheetAjax()
    {
         $this->autoRender = false;
         $this->viewBuilder()->setLayout(false);
         // todo...
    }
  • 출력대상을 최적화 , 필요한 정보만 별도로 해쉬화 해서 키값과 명칭만 가진 배열을 생성함. 모든 데이터를 전부 읽어서 테이블을 만드는 것이 아닌, 키값과 명칭만 가진 해쉬테이블을 생성하고 필요에 따라서 실제데이터에 접근하는 방식이 퍼포먼스가 좋음. 아마 내가 만든 프로그램이 엄청나게 느려서 쓸 수가 없는 수준의 성능이 나왔던 이유가 바로 여기에 있을테지..해쉬테이블을 사용하자, 라는 개념 자체가 머릿속에 없었으니 뭐...ㅠㅠ 기초지식도 없고 개념도 없고 경험도 없고...핵노답이네.

                            • 출력방식 및 순차적인 처리에 관련된 방식이랄까..나는 각 셀을 순차적으로 출력 하려고 해서 필요한 코드가 중복되거나 여기저기 나오는데, 다른 개발자가 작성한 코드를 보면 먼저 출력에 필요한 사전준비를 일괄적으로 한 후에 출력하도록 했음. 예를 들면 템플릿 가져오고 -> 시트를 생성한 후에 -> 시트에 이름을 쭈욱 붙이고 -> 출력 후 -> 불필요한 행을 삭제하고 -> 파일을 생성 하는 식으로 순차적으로 일괄처리 하게끔 코드가 작성되어 있음. 아마도 개발할 때 뭘 해야 하는지 생각하고 만든 코드와 그냥 출력에 급급해서 한줄씩 하드코딩한 코드의 차이가 아닐까 생각이 들었음. 코드를 작성하기 전에 의사코드(슈도코드pseudocode) 를 작성하는 습관을 들이자.
                            • 대용량 데이터 처리 및 파일출력 방법 -> json 으로 파일 혹은 php 로부터 연상배열을 가져와서 blob (바이너리) 으로 변환시킨 후에 자바스크립트를 이용해서 다운로드 시킴

                              // 바이너리로 변환하는 함수
                              function s2ab(s) {
                                  var buf = new ArrayBuffer(s.length);
                                  var view = new Uint8Array(buf);
                                  for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
                                  return buf;
                              }
                              // ajax 처리
                              $.ajax({
                                            url:urlPath,
                                            type:'POST',
                                            data:formData,
                                            cache:false
                                        })
                                        .done(function(data,status)
                                        {   
                                            // phpから連想配列をとってくる
                                            if(status)
                                            {   
                                                // data = JSON.parse(data);
                                                if(data.success){
                                                    var bin = atob(data.sheetdata);
                                                    var ab = s2ab(bin);
                                                    var blob = new Blob([ab], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;' });
                                                
                                                    var link = document.createElement('a');
                                                    link.href = window.URL.createObjectURL(blob);
                                                    link.download = data.downloadname;
                                                    document.body.appendChild(link);
                                                    link.click();
                                                    document.body.removeChild(link);
                                                }
                                            }


                            댓글

                            이 블로그의 인기 게시물

                            [메모] PostgreSQL에서 Insert 하는 경우 자동채번 PK가 중복에러 나는 경우

                            [C# & LINQ] 랜덤으로 데이터를 한 개 추출하는 방법

                            [react-native] uuid 생성이 에러가 날 때 대처법