Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

phpPress, goPress, rubyPress, nodePress에서 폼(양식) 처리하기

플랫 파일 시스템 기반의 웹 사이트를 운영하고 있다면, 사용자들로부터 피드백을 받고 싶어질 것입니다. Disqus를 추가하는 방법도 있지만, 이는 페이지에 JavaScript 코드만 추가하면 되는 간편한 방식일 뿐 여러분이 원하는 바는 아닐 겁니다. 사용자가 직접 이메일을 보낼 수 있고, 관리자가 해당 사용자에게만 답장을 보낼 수 있는 시스템이 필요합니다.

JavaScript만으로 사용자 컴퓨터에서 직접 이메일을 발송하는 시스템을 만들 수도 있습니다. 하지만 그렇게 하면 코드에 노출된 이메일 주소를 스패머들이 쉽게 가져가 다른 스패머에게 팔아넘길 위험이 있습니다. 따라서 이메일 주소는 서버 측에 숨겨두어야 합니다.

이 튜토리얼은 새로운 PressCMS(즉, phpPress, rubyPress, nodePress, goPress)에 이메일 메시지 시스템을 추가하는 방법을 다룹니다. 먼저 프런트엔드부터 시작한 뒤, 각 서버별 백엔드 구현 방법을 살펴보겠습니다. 이미 해당 서버들이 시스템에 설치되어 있다고 가정합니다.

브라우저에서 폼 만들기

프런트엔드 코드는 모든 서버에서 동일하게 사용되므로, 새로 만든 파일들을 각 서버 디렉터리에 복사해야 합니다. 따라서 이 글에서는 서버 디렉터리 기준의 경로로 파일 위치를 설명하겠습니다.

테마에 폼 전용 스타일을 추가하는 대신, 이 폼 스크립트는 모든 요소를 한곳에 모아둡니다. 웹 사이트의 site/parts 디렉터리에 다음 내용으로 questions.html 파일을 생성하세요.

이 코드는 이름(성과 이름), 이메일, 메시지를 입력받는 기본적인 폼을 생성합니다. 정규표현식을 활용해 이름과 이메일 주소의 유효성을 검사합니다. 사용자가 입력한 값이 pattern 속성의 정규표현식과 일치하지 않으면 폼이 제출되지 않으며, title 매개변수에 지정된 안내 메시지와 함께 팝업이 나타나 올바른 입력을 유도합니다. 또한 모든 입력 필드에는 required 속성이 적용되어 빈 폼의 제출을 막습니다. 이것이 프런트엔드에서 반드시 적용해야 할 최소한의 데이터 유효성 검사입니다.

form 요소의 action 속성은 폼 데이터를 제출할 주소를 브라우저에 알려줍니다. method 속성은 데이터를 post 방식으로 전송하도록 지정합니다. 폼 데이터는 서버로 향하는 post 요청의 URL에 담기는데, 이를 쿼리 스트링(Query String)이라고 부릅니다. 서버는 이 쿼리 스트링에 담긴 정보를 처리하게 됩니다.

site/pages 디렉터리에 contact.md 파일을 생성하고 아래 코드를 입력하세요.

저장한 후 서버에서 페이지를 확인할 수 있습니다. 브라우저에서 https://localhost:8081/contact 페이지를 열어보세요.

phpPress, goPress, rubyPress, nodePress에서 폼(양식) 처리하기phpPress, goPress, rubyPress, nodePress에서 폼(양식) 처리하기phpPress, goPress, rubyPress, nodePress에서 폼(양식) 처리하기
연락처 폼 페이지

Contact Us 페이지는 위 그림처럼 표시됩니다. 페이지가 로드되자마자 Name 필드에 포커스가 맞춰지는 점에 주목하세요. 이는 autofocus 속성 덕분입니다. 사용자가 가장 먼저 입력해야 하는 필드에 자동으로 포커스를 맞추는 것은 언제나 좋은 디자인 습관입니다.

메시지 전송 후에는 사용자에게 확인 메시지를 보여주는 것이 좋습니다. site/pages 디렉터리에 messagesent.md 파일을 생성하고 아래 코드를 넣으세요.

메시지가 정상적으로 전송되었음을 알려주는 간단한 안내 문구입니다. 원하는 대로 확장해서 사용할 수 있습니다.

phpPress, goPress, rubyPress, nodePress에서 폼(양식) 처리하기phpPress, goPress, rubyPress, nodePress에서 폼(양식) 처리하기phpPress, goPress, rubyPress, nodePress에서 폼(양식) 처리하기
메시지 전송 확인 페이지

goPress로 폼 처리하기

사용자가 입력한 메시지를 무결성 있게 정화(sanitize)하기 위해 Blue Monday 라이브러리를 사용합니다. 시스템에 이 라이브러리를 설치하려면 다음 명령어를 실행하세요.

이 명령으로 프로그램에서 라이브러리를 사용할 수 있게 됩니다. 필요한 비표준 라이브러리는 이것 하나뿐입니다.

goPressServer.go 파일을 열고 파일 상단의 import () 구문 안에 다음을 추가합니다.

서버에서 이메일을 발송하려면 이 라이브러리들이 필요합니다. goPress.DefaultRoutes( 함수 호출 뒤에 다음 코드를 추가하세요.

이 코드는 /api/message 경로의 post 요청이 들어오면 postMessage() 함수를 실행하도록 설정합니다. 파일 끝에 다음 코드를 추가합니다.

이 두 함수가 브라우저에서 전송된 이메일을 처리하는 핸들러를 구성합니다. /api/message 라우트는 postMessage() 함수를 호출하며, 이 함수는 사용자가 폼에 입력한 정보를 가져와 BlueMonday 라이브러리로 메시지를 정화한 뒤, sendEmail() 함수를 통해 사이트 소유자에게 이메일을 발송합니다. <your email address> 자리에는 본인의 Gmail 주소를, <password> 자리에는 비밀번호를 입력해야 합니다.

goPress.go 파일에서 SetGetRoute() 함수 뒤에 다음 함수를 추가합니다.

이 함수는 SetGetRoute() 함수와 완전히 동일하며, web.Post() 함수를 사용한다는 점만 다릅니다.

이 변경 사항을 적용하면 goPress 서버가 사용자로부터 이메일을 전달받을 수 있게 됩니다.

nodePress로 폼 처리하기

Node에서 이메일을 보내려면 먼저 nodemailer 라이브러리body-parser 라이브러리를 다음 명령어로 설치해야 합니다.

그다음 새 라이브러리를 로드하고 메일러 객체를 설정합니다. nodePress.js 파일 상단, 마지막 라이브러리 로드 구문 뒤에 다음 줄을 추가하세요.

이 코드는 nodemailer 라이브러리를 로드하고 이메일 발송용 재사용 컴포넌트를 설정합니다. <your email name>에는 이메일 주소에서 @ 앞부분을, <your email domain>에는 이메일 도메인(일반 Gmail이라면 gmail.com, 자신의 도메인에 Gmail을 연결했다면 해당 도메인명)을, <your password>에는 이메일 계정 비밀번호를 각각 입력해야 합니다.

nodePress 변수 초기화 코드 뒤에 다음 코드를 추가합니다.

이제 마지막 nodePress.get() 함수 호출 뒤에 다음 코드를 추가하세요.

이것이 /api/message 주소의 핸들러입니다. 이 함수는 폼에서 전송된 정보를 받아 적절한 이메일 메시지를 작성한 뒤, <your email address>에 지정된 주소로 발송합니다. 이메일 전송 후에는 사용자를 /messagesent 페이지로 이동시킵니다. body parser 미들웨어가 URL 파라미터를 request.body 변수에 저장하고 적절히 정화해 줍니다.

이 코드는 2단계 인증이 설정되지 않은 Gmail 계정에서 동작합니다. 2단계 인증을 사용 중이라면 Nodemailer 공식 문서를 참고하여 설정을 진행하세요.

rubyPress로 폼 처리하기

Ruby에서 이메일을 보내려면 다음 명령어로 ruby-gmail 라이브러리를 설치해야 합니다.

Ruby 환경 설정에 따라 명령어 앞에 sudo를 붙여야 할 수도 있습니다. 이제 라이브러리를 로드하기 위해 rubyPress.rb 파일 상단에 다음 줄을 추가합니다.

모든 get 정의 뒤에 다음 코드를 추가하세요.

이 내용을 추가하면 rubyPress 서버도 이메일 폼을 처리할 수 있습니다. <your email address>를 본인의 이메일 주소로, <your password>를 이메일 서버 비밀번호로 변경하면 스크립트가 완성됩니다.

phpPress로 폼 처리하기

마지막으로 수정할 서버는 phpPress입니다. 서버에 이메일 기능을 추가하기 위해 phpmailer 라이브러리를 설치하겠습니다. PHP에서 이메일 작업에 가장 널리 사용되는 라이브러리입니다. phpPress 디렉터리에서 다음 커맨드라인 명령어를 실행하여 설치하세요.

안타깝게도 composer update 실행 시 LightnCandy 라이브러리도 함께 업데이트됩니다. 더 빠르고 사용하기 편리해진다는 점에서는 좋지만, 기존 서버 코드가 깨지게 됩니다. index.php 파일에서 ProcessPage() 함수를 찾아 다음 코드로 교체하세요.

기존 코드와 비교하면 임시 파일을 다룰 필요가 없어졌습니다. 모든 작업이 메모리에서 처리되므로 훨씬 빠릅니다. 이제 index.php 파일 상단, Jade 라이브러리 뒤에 다음 코드를 추가합니다.

이 코드가 phpmailer 라이브러리를 로드합니다. 이제 마지막 $app->get() 함수 뒤에 다음 코드를 추가하세요.

이것이 /api/message 경로의 post 요청 핸들러입니다. 브라우저에서 전송된 폼 데이터를 받아 이메일을 작성하고 발송합니다. PHP는 URL 파라미터를 자동으로 전역 배열 $_POST에 담아줍니다.

<your email address>, <your password>, <your name>은 본인의 이메일 정보에 맞게 교체해야 합니다. Gmail SMTP 서버가 아닌 다른 서버를 사용한다면 $mail->Host 주소도 함께 변경해야 합니다.

마무리

지금까지 PressCMS 사이트에 이메일 폼을 손쉽게 추가하는 방법을 살펴보았습니다. 이 튜토리얼의 다운로드 파일에는 수정 사항이 모두 반영된 서버들이 포함되어 있으므로, 직접 타이핑하는 대신 다운로드해서 사용할 수도 있습니다. 기본적인 오류 처리는 구현해 두었으며, 나머지 부분은 여러분의 과제로 남겨두겠습니다.

여기서 소개한 방식은 폼 데이터를 URL에 담아 post하는 방법입니다. 요즘 많은 사이트는 REST API를 통해 요청 본문(body)에 JSON 문자열 형태로 데이터를 담아 작업을 수행합니다. 이 글의 코드들도 그 방식으로 쉽게 변환할 수 있지만, 이는 여러분의 숙제로 남겨둡니다(혹은 다음 튜토리얼에서 다룰 수도 있습니다). 이제 이 방법을 익혔으니, 여러분의 사이트에 직접 폼을 추가해 보세요. 이런 종류의 커스터마이징은 정말 재미있습니다. 한계는 오직 여러분의 상상력뿐입니다.