Friday, June 14, 2013

마젠토의 수동 인덱싱 제어

마젠토의 인덱싱 기능은 마젠토의 전체적인 성능을 향상시키는데 큰 역할을 합니다.
인덱싱을 사용함으로써 얻을수 있는 장점은 제품의 데이터와 검색 인덱스는 물론, 속성(attribute), 가격(price), URL 규칙(url rewrite), 재고관리(stock) 까지 많은 부분을 미리 간단한 형식의 데이터로 변환시켜 놓음으로써 페이지의 로딩속도와 전체적인 퍼포먼스를 향상시켜 줍니다.
이러한 인덱스 기능은 관리자 모드에서 손쉽게 조절할수 있지만, 개발자로써 모듈개발이나 마젠토의 기능을 수정할때 이러한 인덱스 기능을 제한적으로 꺼야한다거나 다시 켜야할때 그리고 모든 항목을 자동으로 인덱스해야 할때가 종종 있습니다.
특히 제품을 한번에 왕창 업로드 한다던지, 3rd party와 연계되어 제품정보를 실시간으로 업데이트 시킬때 등등 유용하게 사용되는데요, 그럴때마다 수동으로 마젠토의 관리자 모드로 들어가 직접 인덱스 기능을 컨트롤 할수는 없습니다.
그렇기 때문에 아래의 코드는 간단하지만 모듈이나 크론잡(Cronjob)에서 상당히 유용하게 쓰입니다.

마젠토 인덱스 프로세스의 종류는 9가지 종류가 있는데 관리자 모드에서 System > Index Management에서 인덱싱 제어가 가능하구요, 인덱싱의 종류는 아래 테이블을 참고하세요.













아이디코드프로세스 이름
1catalog_product_attributeProduct Attributes
2catalog_product_priceProduct Prices
3catalog_urlCatalog URL Rewrites
4catalog_product_flatProduct Flat Data
5catalog_category_flatCategory Flat Data
6catalog_category_productCategory Products
7catalogsearch_stockCatalog Search Index
8cataloginventory_stockStock Status
9tag_summaryTag Aggregation Data


위에 나열된 인덱스 프로세스 각각의 아이디와 코드를 사용해서 아래와같이 제어가 가능합니다.

아이디를 사용해 인덱스 프로세스 불러오기
[ccln_php]
// 프로세스 로딩
$process_id = 1; // catalog_product_attribute
$process = Mage::getModel('index/process');
$process->load($process_id);
// reindex
$process->reindexAll();
?>
[/ccln_php]

프로세스 코드를 사용해 인덱스 프로세스 불러오기
[ccln_php]
// 프로세스 로딩: process id - 1
$process = Mage::getModel('index/indexer');
$process->getProcessByCode('catalog_product_attribute');
// reindex
$process->reindexAll();
?>
[/ccln_php]

프로세스를 "Update on Save"나 "Manual Update"로 바꾸기:
("Update on Save/Manual Update"은 마젠토 관리자 모드의 Index Management에서 Index Mode를 바꾸는데 나오는 옵션입니다)
[ccln_php]
// 프로세스 로딩
$process_id = 2; // catalog_product_price
$process = Mage::getModel('index/process');
$process->load($process_id);

// Manual Update
$process->setMode(Mage_Index_Model_Process::MODE_MANUAL);
$process->save();

// Update on Save
$process->setMode(Mage_Index_Model_Process::MODE_REAL_TIME);
$process->save();
?>
[/ccln_php]

Wednesday, April 17, 2013

마젠토의 MVC 아키텍쳐

마젠토의 MVC 아키텍쳐: MVC 아키텍쳐란?


마젠토는 Zend Framework에 기반해 만들어졌기 때문에 MVC(Model - View - Controller) 아키텍쳐를 사용하고 있습니다.
MVC 아키텍쳐는 시스템의 구조를 모델, 뷰, 컨트롤러로 구분 짓습니다.

1. 모델(Model)
모델은 직접적으로 데이터에 접근하고 그 데이터를 사용해서 연산과 처리를 담당합니다.
사용자 인터페이스와는 전혀 무관합니다.

2. 뷰(View)
뷰는 모델과 컨트롤러를 통해 나온 결과물을 렌더링해주는 사용자 인터페이스(UI)를 담당합니다.
하나의 모델에 여러개의 뷰가 존재할수 있으며 목적에 따라 다른 뷰가 사용되기도 하며, 시스템의 로직과는 전혀 관계가 없습니다.

3. 컨트롤러(Controller)
컨트롤러는 사용자로부터 받는 요청(request)을 처리하고 모델과 뷰를 연결시켜주는 역할을 합니다.

위와같이 세가지로 나뉘어 시스템의 연산/논리(logic)구조와 프레젠테이션을 담당하는 UI가 분리되기 때문에 유지, 보수, 관리가 수월하며 front-end developer가 해야하는일과 back-end developer(programmer)가 해야하는 일을 명확하게 구분시켜주기도 합니다.

 

[caption id="attachment_1317" align="aligncenter" width="320"]마젠토의 MVC 프로세스 마젠토의 MVC 프로세스[/caption]

기본적인 마젠토의 MVC 시스템 프로세스는 위의 이미지와 같습니다.
사용자의 브라우저를 통해 웹서버로 보내진 request는:
1. 컨트롤러(Controller)가 받아들여 어떠한 페이지를 불러내야하는지 분석한 다음
2. 모델(Model)이 데이터베이스에서 적절한 데이터를 불러오고
3. 뷰(View)가 모델(Model)이 불러온 데이터를 사용해서 적절한 HTML을 조합해 컨텐츠로 변환시킨 다음 사용자의 브라우저로 보내줍니다.

 

마젠토의 Configuration-Based MVC vs 일반적인 Convention-Based MVC


많은 온라인 플랫폼들이나 웹애플리케이션들이 모델-뷰-컨트롤러로 이어지는 MVC 시스템을 사용하고 있는데 이런 보통의 MVC 시스템은 Convention-Based MVC 시스템이라고 합니다.
반면에 마젠토는 Convention-Based MVC보다는 좀 더 복잡한 Configuration-Based MVC 시스템을 사용하고 있습니다.
보통의 Convention-Based MVC 시스템은 새로운 클래스나 파일이 생성되었을때 자동으로 감지하고 이를 시스템에 반영하는 반면,
마젠토 같은 Configuration-Based MVC 시스템은 새로운 내용을 자동으로 감지하기도 하지만 기본적으로 각각의 모듈내 /etc/config.xml 파일을 사용해서 설정을 해주어야 새로운 내용이나 바뀐내용이 감지됩니다.
마젠토는 모든 기능이 모듈화 되어있어 선택적으로 기능을 더하고 빼는것이 어렵지 않습니다.
다만 각각의 모듈에는 config.xml 파일이 존재하고 config.xml 파일 안에는 모듈의 버전, 모듈에 사용되는 Model과 Model에 사용되는 ResourceModel, Helper, Block, Router, Layout, Event 사용을 위한 Observer, Crontab 등등 여러가지 내용이 포함됩니다.
config.xml 의 내용이 이해하기 쉬운내용은 아니지만 위의 모든것이 기본적으로 요구되지는 않으므로 각 모듈의 기능에 따라 선택적인 설정을 할수 있습니다.
이렇듯 마젠토의 모든 모듈에는 config.xml 파일을 통한 기본적인 설정이 필요하며 이러한 설정들은 마젠토가 Convention-Based MVC 보다는 조금 더 복잡한 Configuration-Based MVC 의 형식을 띄게 만드는 중요한 요소입니다.

Sunday, April 7, 2013

프로그래밍 - 대부분의 학교에서 가르치지 않는 것

프로그래머가 된다는것은 대학 다닐때부터 동경해왔던 바였고, 지금은 나보다 더 나은 실력을 갖춘 프로그래머들을 동경하고 있다.
지난 10년간 프로그래밍을 해왔고 이것을 밥벌이 수단으로 사용하고 있지만 나는 여전히 배우고 있는중이며 조금씩 나아지고 있다.
내가 살면서 몇가지 안돼지만.. 가장 다행으로 여기는 것들중 하나는 내가 좋아하고 사랑하는 프로그래밍을 매일매일 하고 있다는 것이고 이것이 하루하루를 재미있게 만들어주는 중요한 요소이다.

예전에 스티브 잡스(Steve Jobs)가 인터뷰에서 말한적이 있는데:
"It(programming) teaches you how to think"
아마 이것이 내가 프로그래밍을 좋아하고 또 배워야 하는 이유를 가장 잘 대변해 주는거 같다.

이미 시작됐지만, 어차피 이 세상은 소프트웨어가 지배하게 될것이고, 그 소프트웨어를 만들어 내는것은 프로그래밍을 통해서 이루어진다.
아주 미세하더라도 내가 한줄한줄 새로이 써내려가는 코드가 인류의 삶을 바꿔주고 우리가 만나고있는 새로운 세상의 일부를 창조해 낸다는것에 기쁨을 느낀다.

학교에서 프로그래밍을 가르쳐야 한다는 code.org의 youtube 비디오는 미국이 적어도 앞으로 30년동안 여전히 강대국으로 군림할수 있는 올바른 방향을 제시해준다고 생각한다.
사실 미국보다는 한국에 더 필요한 내용이 아닌가 라는 생각도 든다.
말로는 한국이 IT강국이라고 자화자찬하지만 난 한번도 그것에 공감하거나 동의해 본적은 없다. 과연 정말 IT강국인지는 다시한번 생각해봐야하지 않나?

What Most Schools Don't Teach (영문)


같은 비디오 (한글 자막)
대부분의 학교에서 가르치지 않는 것



내가 초등학교에서 GW-BASIC 프로그래밍 언어를 처음으로 접하고 집에서 간단한 스크립트로 컴퓨터 화면에 무언가를 출력시켰을때 느꼈던 놀라움과 경외감은 아직도 내 머리속에 생생하게 남아있다.
하지만 초등학교에서 1주일에 한시간 배우는 내용으로는 한계가 있어 무엇을 깊이 배울수도 없었고 어렸던 탓인지 더 배울 방법을 찾지도 않았던거 같다.
그렇게 프로그래밍은 나에게 잠깐 찾아왔다가 컴퓨터는 곧 게임을 상징하는 기계라는 공식이 성립되어 대학때 까지 프로그래밍에 대해 잊고 살았다.
대학때 시작한 프로그래밍은 그리 쉽지만은 않았고 사실 많은 신입생들이 프로그래밍에 대한 어느정도의 기본지식을 갖추고 있는 상태여서 아무것도 갖추지 않고있던 나는 학교과정을 따라가는데 급급했던거 같다.
요즘은 뭔가를 배우고 싶으면 굳이 학교나 학원을 가지 않더라도 좋은 정보를 인터넷을 통해 찾을수 있고 혼자 독학도 할수 있어 정말 세월이 좋아졌다는 것을 느낀다.

코딩을 독학할수 있는 사이트:
http://www.codecademy.com/ (영문)
http://opentutorials.org/ (한글)

Tuesday, March 26, 2013

Daily AB Workout for Myself

I really do need some daily ab workout.
- 20 bicycle crunches
- 30 second plank
- 40 mountain climber
- 30 raised knee crunches
- 20 Russian twists
- 12 jack-knife sit-ups

ab-workout

Thursday, March 7, 2013

Programming Lectures from Stanford and MIT

These are programming lectures from Stanford University and MIT on Youtube.
These lectures are pretty basic but also very important for building fundamental concepts in computer science.
Now I'm re-taking these classes again online for free. :)
Thanks to Youtube, Stanford and MIT.



28 Lectures on Programming Methodology - Stanford University
https://www.youtube.com/watch?v=KkMDCCdjyW8&list=EC84A56BC7F4A1F852



27 Lectures on Programming Abstraction - Stanford University
https://www.youtube.com/watch?v=kMzH3tfP6f8&list=ECFE6E58F856038C69



27 Lectures on Programming Paradigms - Stanford University
https://www.youtube.com/watch?v=Ps8jOj7diA0&list=EC9D558D49CA734A02



23 Lectures on Introduction to Algorithms - MIT
https://www.youtube.com/watch?v=JPyuH4qXLZ0&list=EC8B24C31197EC371C

Monday, January 21, 2013

마젠토에서 손님의 Store Credit을 더하거나 빼는 방법

Customer Balance/Store Credit은 마젠토 엔터프라이즈 버전에 있는 기능입니다.
Customer Balance나 Store Credit은 마젠토에서 서로 같은 의미로 사용됩니다.
마젠토의 관리자 모드에서는 "Store Credit"이라는 어휘를 사용하지만, 마젠토 코어 코드에서는 "Customer Balance"라는 어휘를 사용합니다.
왜 그렇게 헷갈리게 해놓았는지는 모르지만.. 뭐.. 이유가 있겠죠.

기본적으로 이 기능은 손님이 계정에 스토어 크레딧을 저장해 두었다가 나중에 체크아웃할때 사용할수 있는 기능이며,
사이트 운영자가 손님에게 refund 해줄때도 크레딧카드에 해줄필요 없이 계정에 크레딧으로 돌려주게 되므로 운영자 입장에서는 여러모로 유용하게 사용될수 있습니다.

사실 스토어 크레딧은 마젠토의 관리자 모드에서 수동으로 조정할수 있지만, 여러명의 손님에게 벌크로 스토어 크레딧을 지정해 줄 경우 아래의 코드가 유용하게 사용될것 입니다.

[ccln_php]
// 스토어 크레딧을 주려는 손님의 이메일주소
$customerEmail = "email@email.com";
// 손님에게 주려는 크레딧의 양
$deltaAmount = 100;

// 커스토머 모델 로딩
$customer = Mage::getModel('customer/customer');
$customer->setWebsiteId(Mage::app()->getWebsite()->getId());

// $customer->load($customerId); 로 해도 무관함
$customer->loadByEmail($customerEmail);

if($customer->getId()) {
// 밸런스 모델 로딩
$balance = Mage::getModel('enterprise_customerbalance/balance')->setCustomer($customer);
$balance->setWebsiteId($customer->getWebsiteId());
$balance->loadByCustomer();

// 밸런스 값 세팅
$balance->setAmountDelta($deltaAmount);
// 밸런스 메모 입력
$balance->setUpdatedActionAdditionalInfo('Balance added by php script');
// 밸런스가 책정되면 자동으로 이메일이 보내지지만, 아래와같이 'false'를 세팅해두면 이메일을 보내지 않습니다.
$balance->setNotifyByEmail(false);
// 저장
$balance->save();
}
?>
[/ccln_php]

밸런스의 값을 세팅하는 $balance->setAmountDelta($deltaAmount); 에서 $deltaAmount 의 값은 -100을 지정하는 경우 현재 밸런스에서 100달러를 빼게 되고, 100을 지정하면 100달러를 더하게 됩니다.
그리고 $balance->setNotifyByEmail(false); 를 사용하지 않으면 기본적으로 자동 이메일을 보내게 되니 유념하시기 바랍니다.