안경잡이개발자

728x90
반응형

  공부 목적으로 MongoDB를 이용하시는 분들은 Atlas 회사의 MongoDB 서비스를 가장 많이 사용합니다. 이번 포스팅에서는 Atlas 회사의 무료 MongoDB를 사용하는 방법에 대해서 소개하도록 하겠습니다.

 

  ▶ Atlas MongoDB 사이트: https://www.mongodb.com/cloud/atlas

 

  사이트에 접속하면 다음과 같이 회원가입을 하여 시작하라는 메시지가 등장합니다.

 

 

  무료로 회원가입을 한 이후에 바로 MongoDB 서비스를 이용할 수 있습니다.

 

 

  가입을 하자마자 바로 하나의 데이터베이스를 생성하라고 나옵니다. 그냥 기본 설정 그대로 만들어 주시면 됩니다. 아마 기본적인 클라우드 제공 서비스로는 AWS가 선택되어 있을 겁니다.

 

 

  나머지 설정 또한 기본 설정으로 진행하면 무료로 서비스에 가입할 수 있습니다.

 

 

  클러스터를 생성한 이후에 약간의 시간이 지나면 다음과 같이 초기화가 완료됩니다.

 

 

  이후에 다음과 같이 [CONNECT] 버튼을 눌러서 DB 접속 User 계정을 만들 수 있습니다.

 

 

  다음과 같이 접속을 위한 계정명과 비밀번호를 설정합니다.

 

 

  이후에 실제로 MongoDB에 접속하기 위한 방법을 명시합니다.

 

 

  다음과 같이 Application에서 접속할 수 있도록 [Connect Your Application] 버튼을 누릅니다.

 

 

  결과적으로 다음과 같이 개발 환경에 따른 접속 문자열을 얻을 수 있습니다.

 

 

  또한 지금 이 상태로는 DB에 접속할 수 없습니다. 다시 뒤로 가서 마지막으로 방화벽 설정을 해주세요. 기본적으로 MongoDB에 접속할 수 있는 IP를 직접 입력하는 식으로 연결할 수 있습니다.

 

 

  이제 아까 복사한 접속 문자열(String)을 이용하여 접속할 수 있습니다.

728x90
반응형

728x90
반응형

  크롬(Chrome) 브라우저로 지메일(Gmail)을 이용하시는 분들은 Streak이라는 확장 프로그램을 이용해 내가 보낸 메일을 상대방이 읽었는지 추적할 수 있습니다.

 

Streak 공식 사이트: https://www.streak.com/

 

  저는 이미 Streak을 설치한 상태입니다. 설치가 아직 안 된 분들은 설치 버튼을 눌러서 설치를 진행하시면 됩니다.

 

 

  설치가 된 이후에 크롬 브라우저로 Gmail에 접속하시면 다음과 같이 알림 창이 나오실 거예요. 이처럼 처음 접속할 때는 Streak을 이용하도록 설정하시면 됩니다. 로그인을 하시면 바로 Streak을 이용할 수 있게 됩니다.

 

 

  이제 Streak과 Gmail이 연동되었습니다. 이제 [보낸 편지함]에 [모든 추적된 메일]이라는 항목이 추가되었습니다.

 

 

  이제 Gmail을 이용해 보내는 메일은 자동으로 추적됩니다.

 

 

  결과적으로 메일을 보낸 이후에 [모든 추적된 메일] 탭으로 이동하시면, 다음과 같이 보낸 메일에 대한 추적 여부를 확인할 수 있습니다. 대표적인 정보로는 상대방이 몇 번 읽었는지 알 수 있습니다.

 

 

  실제로, 해당 메일을 상대방이 읽었을 때에는 다음과 같이 언제 상대방이 읽었는지 등에 대한 정보가 출력되는 것을 확인할 수 있습니다.

 

728x90
반응형

728x90
반응형

  갑자기 여러분이 서울에 있다고 해봅시다. 오늘 오후 6시까지 부산에 있는 어떤 기관으로 증빙 서류를 반드시 제출해야 하는데, 지금이 오전 10시다! 그럴 땐 어떻게 해야 할까요?

 

  저는 지금까지 등기 우편만 보내보았는데요. 지금 당장 보내야 할 때는 퀵 서비스라는 것을 이용할 수 있습니다. 저는 이런 게 있다고 들어보기만 했습니다. 실제로 이용해 본 적은 이번이 처음이에요. 그래서 정보를 공유하고자 글을 남깁니다. 어떤 업체를 이용하라고 추천하지는 않을게요. 그냥 구글에 퀵 서비스 업체를 검색하면 많이 나옵니다.

 

 

  예를 들어 제가 강남역 근처에 있고, 부산에 있는 곳으로 우편을 보내야 한다면. 강남역 근처에 있는 퀵 서비스 업체에 연락을 하시면 됩니다. 혹은 몇몇 퀵 서비스 업체는 이미 전국 단위로 퍼져 있고, 콜 센터가 따로 있기 때문에 그냥 전화하면 알아서 가까운 기사님과 연결해줍니다. 따라서 그냥 바로 전화한 뒤에 요건만 말하시면 됩니다.

 

  그리고 일반적으로 서울에서 완전 지방권으로 물건을 보내는 경우에도, 대략 5만원 안으로 해결된다는 특징이 있습니다.

728x90
반응형

728x90
반응형

  네이버 메일은 기본적으로 수신 여부를 알려줍니다. 물론 G-Mail의 Streak처럼 매우 정밀하게 언제 몇 번 읽었는지 등은 알려주지 않지만, 수신 여부만 알면 될 때 유용하게 사용할 수 있습니다.

 

  바로 메일을 작성한 뒤에 [보내기] 버튼을 눌러서 메일을 보내보겠습니다.

 

 

  보낸 이후에는 [보낸 메일함] 옆에 있는 [수신확인] 버튼을 눌러 자신이 보낸 메일에 대한 [수신확인]을 할 수 있습니다.

 

 

  그러면 바로 오른쪽에 [읽지 않음] 혹은 언제 일었는지 나오게 됩니다.

 

 

(+ 참고 사항 )

 

  참고로 그냥 [보낸 메일함]에 있는 [읽음] 표시는 자기 자신이 읽었는지에 대한 여부입니다. 우리가 보낸 메일의 상대방이 읽었는지 확인하기 위해서는 [수신확인]에서 확인하셔야 해요!

 

 

728x90
반응형

728x90
반응형

  PHP에서 에러 로그(Log)를 남기는 방법은 간단합니다. 다음과 같은 코드를 이용하면 됩니다. 두 번째 파라미터인 3의 의미는 파일의 뒤쪽에 이어서 내용을 작성하겠다는 의미입니다. 그리고 세 번째 파라미터에는 로그 파일의 위치가 들어갑니다.

 

error_log ('{남기고자 하는 로그 메시지}', 3, "/var/log/apache2/php_error.log");

 

  자세한 내용은 다음의 경로에서 확인할 수 있습니다.

 

https://www.php.net/manual/en/function.error-log.php

 

  또한 경우에 따라서는 permission denied 오류가 발생하면서 로그를 기록하지 못할 수도 있습니다. 그럴 때는 권한 설정을 진행하면 됩니다. 좋은 방법은 아니지만, 대충 무조건 허용해도 괜찮을 때는 777 권한을 주면 됩니다.

 

 

  그래서 결과적으로는 다음과 같은 형태로 로그를 남길 수 있습니다.

 

 

  또한 실시간으로 로그를 테스트 하는 경우 다음과 같이 실시간 출력이 가능합니다.

 

tail -f {파일 이름}

 

 

728x90
반응형

728x90
반응형

  일반적으로 안드로이드 어플리케이션을 개발할 때에는 인 앱 결제(IAP) 기능을 구현해야 할 때가 많습니다. 다만 이러한 인 앱 결제 기능을 구현할 때 알아 두어야 할 점이 있습니다. 그것은 바로 클라이언트가 제대로 카드 결제를 수행했는지의 여부입니다. 실제로 카드 결제를 하지 않고, 서버로 API만 호출하는 방식의 해킹 기법이 존재하기 때문입니다.

 

  따라서 서버는 클라이언트로부터 상품 ID(Product ID)와 구매 토큰(Purchase Token)을 전달 받도록 개발을 해야 합니다. 그래서 그 구매 토큰이 유효한지 여부를 확인하여, 구매 토큰이 유효할 때만 해당 구매자의 캐시를 증가시키는 등의 작업을 수행해야 합니다. 구매 토큰은 실제로 결제 처리를 했을 때 클라이언트가 발급 받을 수 있으므로, 서버 측에서 이러한 구매 토큰을 이용해 구글 구매 보고서 API에 접근해 해당 사용자의 결제가 사실인지 확인하는 것입니다.

 

  구매 토큰이 유효한지 여부를 확인하는 과정이 없으면, 실제로 카드 결제를 하지 않은 악성 사용자가 의도적으로 API를 호출하여 부당한 이득을 취할 수 있으므로 유의하셔야 합니다.

 

  결과적으로, 서버 API를 개발할 때는 구글 개발자 권한으로 결제 보고서에 접근할 수 있어야 합니다. 이를 위해 결제 보고서를 가져오는 Google API를 이용합니다. 따라서 사전에 개발자 콘솔에서 설정을 해야 할 필요가 있습니다.

 

  PHP에서의 예제 소스코드는 다음과 같습니다. Google API를 위한 SDK가 설치되어 있어야 합니다.

 

$client = new Google_Client();
$client->setAuthConfig('/home/ubuntu/IAP.json'); // 구글 개발자 인증 설정
$client->addScope('https://www.googleapis.com/auth/androidpublisher');
$service = new Google_Service_AndroidPublisher($client);
$package_name = "{어플리케이션 패키지 이름}";
$product_id = $this->input_check('product_id');
$purchase_token = $this->input_check('purchase_token');
if($product_id == "" || $purchase_token == "") {
	// 상품 ID와 구매 토큰은 반드시 전달 받아야 합니다.
	exit;
}
try {
	$list = $service->inappproducts->listInappproducts($package_name);
	$amount = -1;
	$purchased_price = -1;
	foreach ($list as $key => $value) {
		// 상품 ID를 기준으로 검색하여 상품을 얼마에 구매했는지 확인
		if($list[$key]['sku'] == $product_id) {
			$str = $list[$key]['listings']['en-US']['title'];
			$purchased_price = $list[$key]['defaultPrice']['priceMicros'];
			$amount = preg_replace("/[^0-9]*/s", "", $str);
			break;
		}
	}
	if($amount == null || $purchased_price == null) {
		// "구글 개발자 콘솔 오류입니다. 관리자에게 문의하세요."
		exit;
	}
	// 구매 가격은 Micro가 기준
	$purchased_price /= 1000000;
	// 구글 API 레퍼런스: https://developers.google.com/android-publisher/api-ref/purchases/products
	$purchase = $service->purchases_products->get($package_name, $product_id, $purchase_token);
	// 해당 주문의 구매 상태와 구매 타입을 확인
	$purchase_state = $purchase->getPurchaseState();
	$purchase_type = $purchase->getPurchaseType();
	$order_id = $purchase->getOrderId();
	if($purchase_state == '1') {
		// 결제 취소 된 주문 내역입니다.
		exit;
	}
	// 이전에 처리 된 토큰인지 확인
	$data['order_no'] = $order_id;
	result= $this->model_member->check_buy($data);	// 포인트 구매 내역 DB 쿼리를 요청합니다.
	if($result != 0) {
		$this->output->set_status_header(403); // 이미 처리 된 주문 내역입니다.
		exit;
	}
	// 이전에 처리 된 적 없는 토큰인 경우 결제 완료
	if($purchase_type == '0') { // 테스트 결제일 때는 purchase_type 값이 0임.
		// 테스트 결제 완료
	}
	else if($purchase_type == null) { // 진짜 결제일 때는 purchase_type 값이 전달되지 않음.
		// 진짜 결제 완료
	}
} catch (Exception $e) {
	$this->output->set_status_header(505); // 상품 ID 혹은 구매 토큰 값이 바르지 않습니다.
	exit;
}

 

  유의할 점은 실제 배포 때와 테스트 때의 구매 타입(Purchase Type)의 값이 다르다는 것입니다. 테스트(Test) 환경에서 결제를 할 때는 purchaseType의 값이 0으로 날아오지만, 실제 배포 환경에서는 purchaseType의 값이 null입니다. 따라서 일반적인 일회성 결제인 경우 purchaseType이 0인지, null인지에 따라서 다르게 처리해주시면 됩니다.

 

 

728x90
반응형

728x90
반응형

  특정한 PHP 라이브러리를 설치할 때 다음과 같은 오류를 만날 수 있습니다. 이는 흔히 PHP AWS SDK를 설치하시는 분이 만날 수 있는 오류인데요. PHP AWS SDK는 simplexml이라는 이름의 확장 프로그램(Extension)을 사용합니다. 그래서 simplexml이 설치되어 있지 않은 분들은 다음과 같은 오류가 출력되는 것입니다.

 

the requested PHP extension simplexml is missing from your system.

 

 

  이 때는 PHP의 XML 라이브러리를 설치하시면 됩니다.

 

① 최신 버전의 PHP를 사용하는 경우

 

sudo apt install php-xml

 

② PHP 5.6을 사용하는 경우

 

sudo apt install php5.6-xml

 

 

  이후에 다시 라이브러리를 설치하고, Apache 웹 서버를 재시작 해주면 오류 없이 동작합니다.

728x90
반응형

728x90
반응형

  간혹 Composer를 이용하여 라이브러리(Library)를 설치하는 경우 다음과 같은 오류에 마주칠 수 있습니다.

 

proc_open(): fork failed - Cannot allocate memory

 

 

  이 때는 다음과 같이 메모리 제한(Memory Limit) 값을 조정하여 업데이트를 수행해주시면 됩니다.

 

sudo php -dmemory_limit=750M composer.phar update

 

728x90
반응형

728x90
반응형

  일반적으로 재직 증명서는 [국민연금 가입 여부]를 이용하여 대신 증명할 수 있습니다.

 

  ▶ 국민연금 웹 사이트: http://www.nps.or.kr/jsppage/main.jsp

 

 

  이후에는 다음과 같이 [공인 인증서 로그인]을 할 수 있습니다.

 

 

  이제 다음과 같이 약관에 동의하고 증명서를 발급할 수 있습니다.

 

 

  다음과 같이 원하는 가입 내역을 선택하여 [프린터 발급]을 할 수 있습니다.

 

728x90
반응형

728x90
반응형

  MySQL을 이용할 때 특정한 컬럼(Column)에 데이터를 삽입할 때 다음과 같은 경고가 나올 때가 있습니다.

 

Data truncated for column ~

 

  'Data Truncated' 경고 메시지는 데이터의 일부분이 잘렸을 때 나오는 메시지입니다. 해당 경고 메시지가 발생하는 원인은 매우 다양하지만, 일반적으로 자료형의 범위를 벗어나는 큰 데이터를 삽입했을 때 해당 경고가 발생합니다.

 

  저는 기존의 TEXT 자료형으로 설정했던 컬럼에 65535 바이트 이상의 크기를 가지는 문자열을 삽입하여 '데이터 잘림'이 발생했습니다. 따라서 다음과 같이 MEDIUMTEXT 자료형으로 크기를 키워서 문제를 해결했습니다.

 

ALTER TABLE {테이블명} MODIFY {컬럼명} MEDIUMTEXT;

 

728x90
반응형