기본 콘텐츠로 건너뛰기

Java(JSP)와 PHP 의 주관적인 고찰 및 비교

얼마전 친구의 회사에서 사이트 개발 외주를 하는데 PHP와 Java에 대해 이야기를 했다고 한다. 

그 웹 에이전시에서는 Java가 좋고 PHP는 DB연결 없는 간단한 홈페이지나 게시판 정도밖에 안된다는 이야기를 했다. 

개인적으로 난 아직도 ASP를 쓰기 때문에 Java와 PHP에서는 중립이지만, 에이전시에서 그 얘길 했다는 얘기를 듣고 분개를 했다... 
이유는 

말도 안되는 내용으로 친구에게 잘못된 정보를 준 것도 그렇지만, 이렇게 당연하게 한국에서만 세계의 흐름에 역행하는 행동을 하기 때문이다. 

글로벌을 꿈꾸는 사람들은 제발 기술정보를 구글에서 검색하길 바란다. 
국내 블로거들이 자기의 생각을 어필하는 정도를 진실이라 생각하지 말기를 바란다. 
그건 개인의 의견일 뿐 중론이라고 볼 수가 없고, 
만약, 국내 웹 에이전시와 공공 SIer들에 특화된 범위를 정한다면 대부분 Java를 택할 테니 그런 제한된 영역에서만 이야기 한다면 괜찮다. 대신 상관없는 사람들에게 이게 세계 트렌드니 뭐니 하면서 잘못된 정보를 주지 말기를 바란다. 


W3Tech라고 알 만한 사람들은 다 아는 서비스에서 낸 웹서비스 통계이다. 
전 세계에서 개인이 아닌 사이트 1000만 이상의 사이트 데이터의 통계이다. 

내용을 보면 PHP가 82%정도를 차지한다. 
누가 대세를 JSP라고 했던가..

JSP를 찬양하는 분들의 반박은 언제든 환영한다. 대신 국내 개인 블로거의 개인의견 링크를 걸지 마시고 통계나 기술적인 근거자료를 보여주시기 바란다. 

JSP찬양자는 JSP가 퍼포먼스가 좋다는 이야기를 한다.. 
그럼 이 내용도 참고하기 바란다. 


이건 단지 자신의 CMS솔루션을 강조하기 위해 다른 언어와 비교한 사이트이다. 
즉, 언어에 중립적인 실측치를 보여주는 사례이다. 
실측치 정보들이 있으니 잘못된 정보가 아닐 것이다. 
PHP는 캐싱을 한 경우 살짝 더 우위에 있다. 
그래도 이거나 저거나 고만고만하다.

하지만, 이런 전제라면 내용은 다를 수 있다. 
대규모 시스템으로 만들어 시스템의 제약이 없는 상황에서 받아들일 수 있는 세션은 JSP가 많다. 
그 이유는 시스템의 메모리를 풀로 사용해서 세션처리를 할 MW(Middle ware)가 있기 때문이다. 

PHP는 그런MW대신 Connection Pool, Cache Pool등을 활용한다면, 
단위 CPU, Memory당 처리량 및 처리속도는 JSP에 비해 압도적일 수 있다. 
왜냐하면 위의 벤치마크에서도 볼 수 있듯이 PHP는 메모리를 JSP의 1/20정도로 시작할 수 있기 때문이다. 

여기에 memcached, nginx등의 보조 엔진을 올린다면 퍼포먼스는 압도적으로 올릴 수 있다. 
하지만 JSP나 .Net에서도 이 엔진들을 사용할 수 있다.

Java나 PHP는 모두 C에서 파생된 것이라는 사실을 모두들 알 것이다.


하지만 개발된 언어를 구동시키기 위한 준비과정이 다르다. 

Jsp는 기본적으로

 Apache + Tomcat + JVM(optional) + Spring or Struts + JDBC or iBatis + DBMS 

의 조합을 기준으로 한다.
뭐, 이중에 Apache뺴고 Tomcat으로만 올릴 수 있다던가 하는 옵션들은 있지만, 결국 서비스 모델은 이렇게 된다.
PHP는

 Apache + PHP + DBMS

심플하다..
심플하니 뭔가 문제가 있는거 아니냐?
라는 이야기가 있는데, 
보안이나 성능이나 거의 비슷하다. 결국 보안문제로 JSP도 Tomcat만 쓰지않고 앞에 Apache의 보안성을 이용하고 있다. 
결국 JSP가 PHP에 비해 메모리를 20배 정도 먹고 시작하는 이유가 바로 여기있다. 

PHP는 대규모의 서비스의 경우 성능이슈가 있기 때문에 성능을 보조할 만한 서버들을 따로 올리기도 한다. 
Web Cache를 위해 nginx 등의 웹캐시 서버를 올리거나, DB캐싱을 위해 memcached를 올리기도 한다. 이는 PHP라고해서 하는게 아니라 JSP라고 해도 웹캐싱으로 nginx를 올리기도 하고 MySQL을 연결할 때 memcached를 쓰기도 한다. 결국 조건은 같다....

그럼 도대체 왜 우리나라는 유독JSP를 강조하는 것일까?

모든 것은 역사를 알면 한눈에 와 닿을 수 있다. 

여기서부터는 저의 개인적인 사견이므로 다를 수 있기 때문에 태클 사양입니다. 

우리나라는 2000년대 초반 국가의 IT부양정책으로 Java 교육 + 해외 취업을 무상 또는 초저가에 지원을 해주었습니다. 이 때 PHP는 제 기억에 없네요.. 
이 때 1년에 1만명 이상 Java개발자가 나왔고, 이들이 해외로 취업을 나갔습니다. 
여러가지 이유로 결국 해외에서 돌아온 자바 개발자들은 국내에 정착을 하게 되었고, 이들이 현재 대부분의 SI 및 Web Agency의 주 개발자가 되어 자바를 밀고 있는 것입니다. 

두 번째 이유는, 
..... 업체들의 논란의 여지가 있으므로 여기에 안적겠습니다. 
이권 문제가 있습니다. 

세 번째 이유는,
MVC때문이라고 이야기를 하지만, MVC는 방법론의 한가지이고, C#에서는 MVP라는 MVC와 유사 개발 방법론을 지원하고 있습니다. 그리고 수 년 전부터 PHP의 Framework에서도 MVC는 지원되고 있었습니다. Java개발자 분들은 잘 모르시기 때문에 Java에서만 지원되는 개발 방식이라고 생각하신 듯 합니다. 


참고로 MVC 개발 방법론은 1979년 팔로알토사의 Trygve Reenskaug란 사람에 의해서 고안되어 실장되었습니다. 

결론으로 이야기 하자면, 
그렇게 Java(JSP)가 좋다는데 왜 Facebook은 그렇게 커졌음에도 불구하고 PHP를 고집하는 것일까요? 왜 구글은 Java를 안쓰고 독자의 Go라는 언어로 개발하고 있을까요? 왜 MS는 Java를 안쓰고 C#을 고집하는걸까요? 
페이스북은 PHP만으로도 NoSQL을 연결할 수 있고, 대부분의 C코드를 그대로 사용할 수 있어 Java의 힘을 빌릴 이유가 없는 것이죠. 게다가 커질수록 빠른 확장 및 가벼운처리로 가격대 성능비가 좋은 언어를 버릴 수가 없기 때문이겠죠.. Go는 C에 가까워 퍼포먼스가 나는 언어이기 때문일테고(정확한 근거는 아님), MS는 닷넷을 밀어야 하기 때문에 닷넷을 쓰는거죠..

결국, 글로벌 메이저 서비스 업체는 거의 쓰지 않는 Java가 정말 좋다고 하는 이유는 일개 작은 국가인 대한민국이란 나라의 정부 프레임웍이기 때문인가요? 
정말 쓸데가 없는 정부 프레임웍에 대해서도 할말은 많지만, 다음 기회에 철저하게 언급하도록 하죠. 

진정 개발자 분들에게 묻고 싶습니다. 
당신은 당신의 철학을 가지고 당신이 개발 언어를 선택해서 사용하고 있습니까?

제가 여기에 글을 올리는 이유는 아직도 국내 블로그에서 개인이 올리는 글만으로 진실이라 판단하시는 분들이 많기에 이런 반박글도 올려봅니다. 
개인적으로 Java를 싫어하지 않습니다. 단지 Java가 최고라고 하면서 타 언어를 무시하는 사람들 때문에 지식을 공개하는 것 뿐입니다. 어떠한 언어를 선택해도 좋습니다. 단지 타 언어를 비방하지 말고 자신의 소신을 어필하시기 바랍니다. 


Do not login your server any more! Free server management tool! http://giipweb.littleworld.net

Subscribe and publish your links as a book with friends 
My Favorite Link Share
http://link.littleworld.net

댓글

  1. 소신이라....
    전 자바 개발자였지만 JSP는 좋아하지 않았습니다. ㅎ
    솔직히 저는 ASP, PHP, JSP 모두 싫어했습니다.

    현재의 REST API나 GraphQL 백엔드에 여러 프론트를 붙이는
    트렌드가 되서 다행입니다 .
    모든 스크립트 언어들이 사라지길 바라는게 제 소신입니다.

    답글삭제
    답글
    1. 자동으로 댓글이 달리던게 언제부터 승인해야 하는걸로 바뀌었나.. 이제 보고 승인했습니다. ^^;;;

      제가 제일 못하는게 프론트엔드라.. 부럽습니다. ㅠㅡㅠ
      프론트가 약해서 개발자를 포기한지 벌써 거의 20년이 되어가고 있습니다만;;

      삭제
  2. PHP와 JSP에 대해서 자세하고 객관적이고 전문적인 글 같습니다. 온라인 시험출제 및 자동채점 플랫폼을 개발해서 서버에 설치할 계획을 가지고 있습니다. 학생들이 스마트폰으로 서버 웹에 접속하여 시험을 보고 제출하는 겁니다. 시험을 처음 시작할 때만 좀 데이터가 왔다갔다하고 시험 보는 중에는 서버와 시간 동기화만 합니다. 시험 시간 동안 한 2천명이 동시 접속한 상태일 수도 있을 것 같은데요. PHP나 JSP 어떤 것으로 플랫폼을 구성하는 것이 나을까요?

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

Alter table 에서 modify 와 change 의 차이 :: SQL Server

두 개의 차이를 모르는 경우가 많아서 정리합니다.  modify는 필드의 속성값을 바꿀때 사용하구요.. change는 필드명을 바꿀떄 사용합니다.  alter table tbbs modify bNote varchar(2000) NULL; alter table tbbs change bNoteOrg bNoteNew varchar(2000) NULL; change에는 원래 필드와 바꾸고 싶은 필드명을 넣어서 필드명을 바꾸는 것이죠~ 더 많은 SQL Server 팁을 보려면  https://github.com/LowyShin/KnowledgeBase/tree/master/wiki/SQL-Server giip :: Control all Robots and Devices! Free inter-RPA orchestration tool! https://giipasp.azurewebsites.net/

책에서는 안 알려주는 대규모 트래픽을 위한 설계

음성 버전 :  https://www.youtube.com/watch?v=ZZlW6diG_XM 대규모 트래픽을 커버하는 첫 페이지 만드는 법..  보통 DB를 연결할 때 대규모 설계는 어떻게 하시나요?  잘 만들었다는 전제 하에 동접 3000명 이하는  어떤 DBMS를 사용해도 문제 없이 돌아갑니다.  여기서 이미 터졌다면 이 콘텐츠를 보기 전에 DB의 기초부터 보셔야 합니다.  아.. 개발 코드가 터졌다구요? 그럼 개발자를 때리셔야지요..  만약 3000명을 넘겼다면? 이제 Write/Read를 분리해서  1 CRUD + n개의 READ Replica를 만들겠죠?  보통 Read Replica는 5개가 최대라고 보시면 됩니다.  누가 연구한 자료가 있었는데...  6번째 레플리카를 만든느 순간 마스터가 되는 서버의 효율 저하 때문에  5번째에서 6번쨰로 올릴때의 성능이 급격히 줄어든다는 연구 결과가 있습니다.  때문에 Azure에서도 replica설정할 때 5대까지 밖에 설정 못하게 되어 있지요.  유저의 행동 패턴에 따라 다르긴 하지만,  1 CRUD + 5 Read Replica의 경우 동접 15000명 정도는 커버 합니다.  즉, 동접 15000명 에서 다시 터져서 저를 부르는 경우가 많지요..  이 때부터는  회원 DB, 게시판DB, 서비스DB, 과금 DB 등등 으로 성격, 서로의 연관도에 따라 나누기 시작합니다.  물리적으로 DB가 나눠지면 Join을 못하거나 Linked Table또는 LinkDB등의 연결자를 이용해서 JOIN이 되기도 합니다.  그에 따라 성능 차이가 생기지만 가장 중요한 포인트는  서로 다른 물리적 테이블의 JOIN은 인덱스를 타지 않는다!  라는 것입니다. 즉, JOIN할 테이블들을 최소한으로 만든 뒤에 JOIN을 걸지 않으면 NoSQ...

BI의 궁극판! Apache Drill을 써보자!

사실 Apache Drill 은 BI(Business Intelligence)라고 부르는 것 보다는 단순 데이터 연결 엔진이다. https://drill.apache.org/ 하지만 내가 왜 극찬을 하느냐면.. DBA로서 항상 문제가 되어왔던게, 이기종 데이터의 변환이나 처리였다. 포맷을 맞추는데 엄청난 시간이 걸리고, 데이터 임포트 실패가 무수하게 나고.. 한 번 잘못 데이터를 추출하면 다시 조정, 변환, 추출하는데 시간이 많이 걸린다. 그런데! Apache Drill은 그냥 RDB를 CSV랑 연결해서 조인해서 통계를 낼 수 있다. 그것도 표준 SQL을 사용하여! 예를 들어, CSV의 세 번째 컬럼이 price 이고, 물건의 판매이력을 PG사에서 CSV로 출력 받았다. 우리 DB와의 검증을 위해서는 수동으로 Import를 한 뒤에 포맷이 안맞아 잘리는 데이터가 있다면 다시 맞춰주고, 재 임포트를 수십 번, 그리고 나서 겨우 들어간 데이터를 조인하여 빠진 데이터를 분간한다. 숫자가 적다면 개발자가 개발로 처리할 수도 있지만, 건수가 하루에 300만건 짜리라면.. 한 달 온 파일은 9천만 건이다. 프로그램으로 고작 처리하는 것이 초당 500건. 거의 20만초, 에러 없이 약 56시간.. 에러가 생기면 다시 56시간.. ㅠㅡㅠ 이런게 현실이기 때문에 쿼리 말고는 방법이 없다. apache drill 의 진면목을 보자! 이번에는 좀 범용 적인 MySQL DB와 붙여 보자. . 난 이번에는 Mac에서 작업을 했기 때문에 그냥 다운 받아서 풀었음.. https://drill.apache.org/download/ 여기서 자기 OS에 맞는 버전을 받아서 설치하시길.. 압축을 풀고 나면 MySQL 커넥터를 붙여야 한다. https://dev.mysql.com/downloads/connector/j/5.1.html 여기서 다운로드 이런 커넥터 들을 붙일 때마다 콘피그를 수정해 줘야 하지만, 몇 번만...