PHP에 HTML을 심다, XHP의 실험

142025년 08월 29일3

몇 주 후, XHP 개발에 참여한 소수의 엔지니어들이 작은 회의실에 모였다. 공기는 기대와 긴장감으로 팽팽했다. 조던 워크는 동료들 앞에 서서, 며칠 밤을 새워 만든 첫 번째 프로토타입을 공개할 준비를 하고 있었다.

“우리가 해결하려던 문제를 다시 한번 보시죠.”

조던은 스크린에 기존 방식의 PHP 코드를 띄웠다. 문자열을 이어 붙여 HTML을 만드는, 모두에게 익숙하고 고통스러운 그 코드였다.

// Before: 기존 방식
function render_comment($comment) {
  $safe_name = htmlspecialchars($comment['author_name']);
  $safe_text = htmlspecialchars($comment['text']);
  
  echo '<div class="comment-wrapper">' .
         '<img src="' . $comment['author_avatar_url'] . '">' .
         // ... 복잡하고 오류 나기 쉬운 코드 ...
       '</div>';
}

“보시다시피, 가독성이 떨어지고, 태그를 닫는 걸 잊기 쉬우며, 모든 변수에 일일이 보안 함수를 적용해야 하는 번거로움이 있습니다.”

숨을 한번 고른 조던이 키보드를 눌러 화면을 전환했다. 스크린에 나타난 코드를 본 엔지니어들의 눈이 커졌다.

// After: XHP 방식
function render_comment(:comment $comment_data) {
  return
    <div class="comment-wrapper">
      <img src={$comment_data->authorAvatarUrl} />
      <div class="comment-body">
        <strong>{$comment_data->authorName}</strong>
        <span>{$comment_data->text}</span>
      </div>
    </div>;
}

그것은 PHP도, HTML도 아닌 기묘한 혼종이었다. 분명 PHP 함수 안인데, 그 안에 HTML 태그들이 마치 원래부터 그 자리에 있었던 것처럼 자연스럽게 녹아 있었다. 변수들은 따옴표나 연결 연산자 없이, 그저 중괄호 {} 안에 담겨 있었다.

“이것이 XHP입니다.”

조던이 설명하기 시작했다. “이 코드는 더 이상 문자열이 아닙니다. PHP가 이해하고 분석할 수 있는 객체(Object)입니다. 이 <div>는 이제 ‘div 객체’인 셈이죠.”

회의실에 있던 톰이 날카로운 질문을 던졌다.
“좋아 보이긴 하네요, 조던. 하지만 만약 개발자가 실수로 마지막 </div>를 빼먹으면 어떻게 되죠? 기존 방식과 똑같이 레이아웃이 깨지는 거 아닙니까?”

훌륭한 지적이었다. 조던은 말없이 코드 에디터로 돌아가 </div> 태그를 지웠다. 그리고 코드를 실행했다.

결과는 놀라웠다. 웹페이지가 깨지는 대신, 컴파일러가 즉시 붉은색 에러 메시지를 뿜어냈다.

[XHP Fatal Error] Syntax error: unclosed tag 'div' on line 5

엔지니어들 사이에서 나지막한 탄성이 터져 나왔다. 페이지가 사용자에게 도달하기 전에, 개발 단계에서부터 실수를 잡아주는 것이다. 마치 워드프로세서가 철자가 틀리면 빨간 밑줄을 그어주는 것과 같았다.

“보안 문제는 어떻게 해결했습니까?” 톰이 다음 질문을 던졌다.

“XHP는 중괄호 안에 들어온 모든 것을 자동으로 ‘안전한 텍스트’로 간주하고 처리합니다.”

조던은 악성 스크립트가 담긴 사용자 이름을 authorName 변수에 넣어 코드를 다시 실행했다. 브라우저 화면에는 경고창이 뜨는 대신, <script>alert('해킹!')</script> 라는 문자열이 아무런 해를 끼치지 못하고 그대로 표시될 뿐이었다. 개발자가 더 이상 htmlspecialchars 같은 함수를 기억하고 있을 필요가 없어진 것이다.

회의실의 공기는 순식간에 바뀌었다. 의심과 긴장감은 사라지고, 경이로움과 흥분이 그 자리를 채웠다. 그들은 지금 목격하고 있었다. 프로그래밍 언어의 문법을 확장하여 UI를 만드는 새로운 가능성을.

조던 워크는 동료들의 들뜬 반응을 보면서도, 마음속으로는 이미 다음 단계를 그리고 있었다.

‘그래, PHP에서의 실험은 성공적이야. 하지만 진짜 전쟁터는 브라우저 안, 자바스크립트의 세계다. 이 철학, 이 개념을 과연 그 혼돈의 땅에도 심을 수 있을까?’

XHP의 성공은 끝이 아니라, 더 거대한 도전을 향한 시작에 불과했다.