'2012/04'에 해당되는 글 2건

  1. 2012.04.15 PHP 단상
  2. 2012.04.13 JSON data로부터 간단히 모델 클래스를 구현하기

PHP 단상

Project 2012.04.15 23:30

PHP: 잘못된 디자인의 프랙탈 


PHP를 정말로 증오하는 분이 쓴 글을 국내의 블로거가 번역한글인데 , 최근에 읽은 블로그 중 가장 재미있어서 나도 PHP의 단상을 몇가지 적어본다.

 먼저 나또한 위의 글을 전적으로 동의한다. PHP개발을 하며 나타나는 알수없는 버그들등에 고생을 한 경험이 있어서 PHP가 얼마나 거지같은지 깊이 공감을 한다.
 하지만 왜 언어 랭킹을 보면 항상 저자가 좋아하는 Python보다 높은 순위에 있으며 , 그 인기가 10년가까이 지속되고 있는지 생각해볼필요는 있을것같다.

1. PHP는 왜 그렇게 많이 쓰이는가?

- 먼저 PHP는 환경설정이 정말 간단하다.
윈도우라면 XAMP , 맥이라면 MAMP , 리눅스라면 LAMP 로 검색해서 나오는 패키지를 인스톨하면 끝이다.
다른 환경설정 필요없이 그냥 설치하고 htdocs에 php를 넣어두기만 하면 끝이다.
물론 실제 서비스때는 apache,php설정등을 바꿔줘야하지만 다른 언어에서 그것에 비하면 정말 생각할것이 없다.

- 빠른 개발속도
당신이 프레임워크를 이용하든, 그냥 통짜 php로 개발을 하든 무엇을 이용하든 익숙한 개발방법이 있다면 하나의 화면을 구현하는데 정말 별로 시간이 걸리지 않는다. 내 경험상 자바로 개발할때보다 4배이상은 빠르게 개발할수 있다고 말할수 있다.

- 낮은 학습곡선
PHP는 정말 누구나(개나소나) 쉽게 배울수 있다.
귀찮은 부분은 다빼버린 언어 설계때문에 (그로인해 심각한 결함들도 있지만) 그냥 생각한대로
쓰면 왠만하면 결과가 나온다.
또 PHP프레임워크는 배우기가 정말 쉽기 때문에 다른언어의 프레임워크보다 쉽게 이용할수가 있다.
(어려우면 안쓴다)

- 풍부한 라이브러리
게시판,블로그,홈쇼핑등의 많은 레퍼런스및 오픈소스가 있으며 필요한 함수나 소스코드는 검색만 하면 나올정도로
도처에 널려있다.(C&P가 많아서 문제,중복되는 기능의 함수가 많아서 문제이긴 하지만)

2. 그리고 현실적인 이유들

- 개발자를 구하기 쉽다.
학습곡선이 낮은만큼 PHP개발자는 도처에 널려있다.
컴퓨터 전공이 아닌 많은사람들이 웹페이지를 만드려고 처음 개발을 시작해서 접하는것이 html 다음이 php이기에
정말 많은 사람들이 php를 알고있다.(커뮤니티의 수준이 낮다고 하는것도 비슷한것이 원인)

- 대부분의 웹사이트들은 규모가 작다
대부분의 웹사이트들은 우리가 생각하는만큼 많은 유저를 대상으로 만들지 않아도 된다.
게다가 개발에 들어가는 돈과 시간도 일주일,100만원수준의 사이트가 대부분.
홈쇼핑에 무회원 계좌이체, 수동결제확인이면 회원관리에 그렇게 보안을 신경쓰지 않아도 되는 경우도 많다.

- 유지보수비용이 상대적으로 적다.
위의 경우와 낮은 학습곡선을 생각한다면 , 대부분의 작은 사이트에서 php소스코드를  수정하는일은 그리 전문적은 지식을 갖지않은 사람도 조금만 공부한다면 할수 있다. (신기능 개발은 무리일지 몰라도)


- 대부분의 PHP개발자는 PHP만 하지 않는다.
PHP만 알아서 먹고살수 있느냐 한다면 대부분의 경우 아니라고 말할수 있다.(JAVA라면 가능)
보통 php개발자는 mysql도 알아야하고 Javascript도 알아야하고, html도알아야하고 css도알아야하고 상황에따라 디자인도해야하는 경우도 많이 있다.이런상황에서 다른언어를 써보라고? 아마 납기 못맞추고 야근하기 쉽상일듯.


3. 결론

내 생각은 앞으로도 PHP의 인기는 계속될것이다. IT업계에서 누구나 항상 좋은 조건의 좋은환경에서 개발할수 있는 것이 아니기 때문에 , 위의 막장처럼 보이는 환경에서 많은사람이 일할것이고 그들은 PHP를 선택해 개발할경우가 많을것으로 보이기 때문이다. (적어도 python보다는)
 
물론 주력언어로 PHP를 쓴다고 한다면 도시락 싸들고 말릴것이다.
PHP를 깊게 파려고하는 당신 왜 이 단순한 언어를 더 공부하려고 하나요?



 
 

Trackback 0 : Comment 0

JSON data로부터 간단히 모델 클래스를 구현하기

Project 2012.04.13 16:30


코어데이터는 데이터를 다루기 위한 굉장히 편리한 도구이지만 데이터의 영속성이 필요하지 않은 경우에는

일부러 코어데이터를 쓰지 않아도 간단히 데이터 모델을 구현할 방법은 많이 있다.


모델클래스를 작성하고 JSON Data로부터 해당 데이터를 바인딩시키는 간단한 코드를 소개한다.

먼저 모델클래스이다.

보다시피 프로퍼티와 초기화 메소드를 하나 지정해둔다.


@interface User : NSObject


@property (nonatomic,strong) NSString *userId;

@property (nonatomic,strong) NSString *userName;

@property (nonatomic,strong) NSNumber *age;

@property (nonatomic,strong) NSString *imagePath;


-(id)initWithDictionary:(NSDictionary *)aDict;


@end

NSObject의 카테고리클래스중 하나인 NSKeyValueCoding은 유용한 메소드를 많이 가지고 있는데

그중 setValuesForKeysWithDictionary: 을 이용하면 dictionary로부터 자동으로 property값들을 세팅할수가 있다.

조심해야할 부분은 이름이 다르거나 가지고 있지 않은 프로퍼티일경우 예외를 내기 때문에

valueForUndefinedKey과 setValue: forUndefinedKey: 를 구현해두어야한다.

#import "User.h"


@implementation User

@synthesize userId,userName,age,imagePath;


-(id)initWithDictionary:(NSDictionary *)aDict

{

    self = [self init];

    if (self != nil) {

        if (aDict) {

            [self setValuesForKeysWithDictionary:aDict];

        }

    }

    return self;

}


- (id)valueForUndefinedKey:(NSString *)key

{

    NSLog(@"undefined key : %@",key);

    return  nil;

}


-(void)setValue:(id)value forUndefinedKey:(NSString *)key

{

    NSLog(@"undefined key : %@",key);

}


-(NSString *)description

{

    NSString *desc = @"";

    for (NSString *key in [PropertyUtil propertyNames:[self class]]) {

        desc = [desc stringByAppendingFormat:@"%@ : %@ ,",key,[self valueForKey:key]];

    }

    return desc;

}


@end

데이터초기화는 아래 한줄이면 된다.

User *user =  [[User alloc] initWithDictionary:jsonValue];



너무 간단한 코드들이라 특별히 이해하는데는 어렵지 않을듯하다.



p.s

직접구현한 모델일경우 프로퍼티내용을 description으로 표시하기가 귀찮을경우가 많은데 아래의 코드를 이용하면 클래스로부터 프로퍼티 이름을 배열로 받을수 있다.

#import <objc/runtime.h>

+ (NSArray *) propertyNames: (Class) class

    NSMutableArray *propertyNames = [[NSMutableArray alloc] init];

    unsigned int propertyCount = 0;

    objc_property_t *properties = class_copyPropertyList(class, &propertyCount);

    

    for (unsigned int i = 0; i < propertyCount; ++i) {

        objc_property_t property = properties[i];

        const char * name = property_getName(property);

        [propertyNames addObject:[NSString stringWithUTF8String:name]];

    }


    return [propertyNames copy];

}



Trackback 0 : Comment 0