안녕하세요 워누입니다😀

오늘 포스팅은 STS에서 새 프로젝트 생성 시 JAVA 11을 고를 수 없었던 

이상한 오류가 발생되어 기록을 남겨보고자 합니다😂

 

우선 오류 화면은 다음과 같습니다!

 

 

 

새로운 프로젝트 하나를 따기 위해서 "Spring Starter Project"를 클릭했으나..

 

 

Java Version 선택 옵션이 17과 21만 존재하더군요. 

기본 옵션은 아래 링크에서 작성한 것처럼 제대로 세팅되어 있는 상황이었구요!

 

https://seoneu.tistory.com/51

 

[JAVA/Spring Boot] STS4 기본 설정 및 첫 프로젝트 띄우기

안녕하세요 워누입니다! 지난 포스팅에 이어 이번에는 STS4 기본 설정 후 첫 프로젝트를 띄워보고자 합니다. 우선 STS4를 실행해주세요! 첫번째로 세팅할 것은 JRE 설정입니다! 이제 상단 매뉴에서

seoneu.tistory.com

 

STS를 밀고 다시 설치해보아도, Java 환경변수를 다시 설정해주어도 동일하게 11버전은 안되더라구요.

(17/21은 잘만 선택되는데 말이죠)

 

구글에 검색해도 해당 이슈에 대한 현상이 나오지 않아 여러모로 불편하던 중

Spring 공식 사이트에서 2.7.x 버전의 지원 종료에 대한 내용을 볼 수 있었습니다.

(https://spring.io/projects/spring-boot#support)

 

 

이것 때문인지 아닌지는 모르겠지만 여튼 저는 STS에서 11버전을 사용할 수 없는 상태입니다.

일단 boot 3.x 버전을 공부해보기 위해서라도 17 이상을 설치해보긴 하겠지만 

여러모로 레거시에 대한 서비스 종료가 너무 빠르게 진행된다는 건 아쉽긴 하네요ㅜㅜ

 

혹시 저와 같은 문제를 겪고 계시거나 문제를 해결하신 분이 있다면 댓글로 달아주시면 감사하겠습니다😂

(저는 결국 해결 못하고 맥에 설치한 인텔리제이로 프로젝트를 진행해보겠습니다...😅)

안녕하세요 워누입니다.

 

학교 과제와 기말고사, 그리고 회사를 퇴사하는 등 이슈가 많아서 한동안 블로그를 방치해버렸습니다..😂😂

이제 종강도 했고, 퇴사도 했으니 블로그를 다시 꾸준하게 작성해볼까 합니다!

그럼 바로 본론으로 진행해볼게요~

.

오늘은 PHP에서 API를 활용하여 다른 서버(URL)로 파일을 전송하는 방법을 포스팅하겠습니다!

 

이전 포스팅 중 PHP로 이미지를 업로드하는 방법이 있었죠?

 

https://seoneu.tistory.com/29

 

[PHP] 이미지 파일 업로드하기!

안녕하세요 워누입니다! 오늘은 PHP로 이미지 파일을 업로드하는 방법을 포스팅하도록 하겠습니다! 거두절미하고 바로 가보도록 하죠~ . 여러분들도, 저도 인터넷에서 사진이나 문서 파일을 웹

seoneu.tistory.com

 

해당 페이지에서 언급했었던 것처럼 다른 서버로 파일을 전송할 때  "multipart/form-data" 설정을 반드시 해주어야 한다고 했었는데요, 이 설정이 무엇을 의미하는지 간략하게라도 알아야 제가 쓴 코드를 보고 이해하거나 직접 작성하실 때 이해를 하기 쉽겠죠?

 

위 페이지에서 포스팅한 내용 중 클라이언트 측의 샘플 코드를 잠깐 보겠습니다!

<!DOCTYPE html>
<html>
<head>
</head>
<title>파일 업로드 테스트</title>
<body>
<form name="reqform" method="post" action="fileUploadResult.php" enctype="multipart/form-data"> 
 <p>이미지 파일 업로드 테스트</p>
 <hr> <br>
 <input type="file" name="imgFile" /><br>
 <input type="submit" value="업로드" />
</form>
</body>
</html>

 

해당 소스에서 form 데이터 내 input type을 "file"로 설정했었던 적이 있었죠?"file" 속성은 말 그대로 파일 업로드를 위해 설정하는 속성인데요, 이를 form 데이터에 담아 서버 측으로 전송하는 원리입니다. 이 때, form 태그의 enctype을 "multipart/form-data"로 지정했었습니다. 

 

"multipart/form-data"로 보내는 이유를 알려면 먼저 HTTP 통신 원리와 Content-type을 알아야 합니다.

 

간략하게 설명을 드리자면 통신 원리는 매우 간단해요!

스펙에 맞게 클라이언트와 서버가 문자로 구성된 데이터를 송수신하는 것이라고 생각해주시면 됩니다. 파일을 전송한다고 해서 jpg 파일이나 txt 파일 자체가 전송되는게 아니라 파일 역시도 문자의 형태로 전송되는 것이고, 이러한 문자의 형태를 스펙에 맞추어 서버에 송신하는 것 뿐이거든요.  이미지, 텍스트, 동영상 파일 모두 문자열로 이루어져 있는데 확인하고 싶으신 분들은 아무 이미지 파일이나 동영상 파일 등을 메모장 등 텍스트 편집기로 열어보세요!

 

Content-Type은 Body에 전송되는 메세지(데이터)의 타입을 정의하는 속성으로 HTTP 요청 Header에서 정의합니다. 이 중에서 파일을 송신할 때 사용하는 속성값이 바로 "multipart/form-data" 형식인 것이지요. 

 

관련해서 참고하기 좋은 블로그가 있어서 공유해봅니다! 

https://velog.io/@shin6403/HTTP-multipartform-data-%EB%9E%80

 

상세 내용은 위에서 보시고 핵심인 PHP 코드를 같이 볼까요?

<?php
header("Content-Type:text/html; charset=utf-8;"); 

// 요청 데이터(API 요구 사항에 맞게 파라미터 설정)
$value_1 = "value";				// key_1에 대한 value 
$value_2 = "value";				// key_2에 대한 value


// 파일 절대 경로 설정 (예시)
$fileDir = "C:/Bitnami/wampstack-7.2.14-0/apache2/htdocs/img/test.jpg";

// 요청자 검증을 위한 암호화 데이터(수정 금지).
$userId = "ID";
$userPwd = "Password";
$EncryptBase64 = base64_encode($userId.":".$userPwd);

// 요청 데이터를 배열 형식으로 최초 set.
$data = array(
	'key_1' => $value_1,
	'key_2' => $value_2,
	'fileDir' => $fileDir,	// 파일경로
	'fileContents' => file_get_contents($fileDir)	// 파일 내용
);	

// 배열 형식의 데이터를 multipart/form-data 형식으로 변환
$postData = setMultipartFormData($data);

// 요청 API Header 정보(Api-Key 값은 전달받은 값 그대로 사용.)
$headers = array(
	'Content-Type: multipart/form-data;boundary=^*******^',
	'Content-Length: '.strlen($postData), 
	'Authorization: Basic '.$EncryptBase64
);

// 요청 URL 
$postUrl = "https://";

// 응답 파라미터 변수 선언 및 초기화
$response = "";

// API 호출 및 응답 데이터 저장
$response = reqPost($postData, $postUrl, $headers); 
	
// 응답 데이터 print
echo "Response : " . $response;

// api 요청
function apiCall($data, $url, Array $headers){
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_HEADER, true);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);	
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);		//connection timeout 30
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);	
	curl_setopt($ch, CURLOPT_POST, true);			// API 호출 시 method를 post로 지정
	curl_setopt($ch, CURLOPT_POSTFIELDS, $data);	// Data 
	$response = curl_exec($ch);
	curl_close($ch);	 
	return $response;
}

// multipart/form-data 형식으로 변환하는 함수
function setMultipartFormData($arrayData){
	
	$fileData = $arrayData['fileContents'];
	$boundary = "^*******^";
	$data = "";
	unset($arrayData['fileContents']);

	foreach ($arrayData as $name => $content) {
		$data .= '--' . $boundary . '\r\n'
		. 'Content-Disposition: form-data; name="' . $name . '\"\r\n\r\n'
        . $content . '\r\n';
	}
		
	// 파일 데이터 저장
	$data .= '--' . $boundary . '\r\n'
		. 'Content-Disposition: form-data; name="file"; filename="' . $arrayData['fileDir'] . '"' . '\r\n'
		. 'Content-Type:application/octet-stream' . '\r\n\r\n';
	$data .= $fileData . '\r\n';
	$data .= "--" . $boundary . '--\r\n';

	return $data;
   }
?>

 

** 주의사항 : 요청 필드는 제가 임의로 작성해서 Key_1, Key_2 등으로 만든 것이지만 실제로는 API 명세서에서 요구하는 필드를 입력하여야 합니다. 일반적으로 파일 절대 경로나 파일명을 요구하므로 fileDir이라는 필드를 만들었지만 이는 제가 임의로 작성한 코드이므로 API 명세에 따라 수정이 필요합니다. 

또한 예시 코드로 작성하다보니 인증 방식 역시 HTTP 기본 인증 방식인 Basic Authorization을 선택하여 만들었습니다. 실제 코드를 작성하실 때 API 명세에 별도 암호화 방식을 요구할 수 있으니 주의하셔야 합니다.

 

이렇게 예시 코드를 작성해 보았는데요,

위에서 언급했던 "multipart/form-data" 파라미터는 $headers에 담아 HTTP header 정보에 담았습니다!

 

이중 가장 자세히 보아야 할 부분은 제가 임의로 만든 setMultipartFormData 함수입니다!

 

배열로 세팅한 $data를 매개변수로 받아 key-value 데이터와 파일 내용을 분리해서 다시 세팅하는 형태로 구성되어 있는데요, 굳이 이러한 과정을 거치는 이유는 multipart/form-data 형식을 준수하기 위함입니다!

 

우선 첫째로 $boundary 변수는 header에 Content-type=multipart/form-data 지정 시 함께 지정한 boundary와 같은 값을 가져야 합니다. 이유는 boundary가 HTTP 요청 Body 데이터 중 파일 데이터를 구분하기 위한 역할을 가지기 때문입니다. 

 

둘째로 $boundary 양 옆으로 "--" 기호와 "\r\n" 이스케이프 시퀀스를 넣어 놓았는데요,

먼저 "--" 기호는 body의 끝을 알리는 구분자이며 "\r\n" 이스케이프 시퀀스는 Header와 Body, Body 데이터 간의 구분을 위해 넣었다고 생각하시면 됩니다!

 

...?

이해가 되지 않는 부분들이 생기실 거에요..!

여기선 요청 Body 데이터만 세팅하는데 왜 또 header/body를 구분하느냐 말이죠??

 

이유는 body의 내용을 보시면 이해되실 거에요!!

body 데이터에서 Content-Disposition을 지정해주었죠? 이는 HTTP 응답 Header의 한 종류로 브라우저에 Content가 웹페이지로 나타낼지, 다운로드될지 정하는 속성이에요. 즉, $headers에 담은 HTTP 요청 Header 정보가 아닌 응답 Header 정보와 구분하기 위해 "\r\n"을 두번 써서 구분하는 것이랍니다 ㅎㅎ 

Body 데이터 간 구분은 "\r\n"을 한번 써서 구분합니다!

 

이외 자세한 HTTP 통신 규약은 아래 사이트를 참고해주세요!

https://www.donnywals.com/uploading-images-and-forms-to-a-server-using-urlsession/

 

추가적으로 응답 헤더 정보인

Content-Disposition, application/octet-stream에 대한 자세한 내용은 각각 아래 페이지를 참고해주세요!

 

Content-Disposition :

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition

 

Content-Disposition - HTTP | MDN

In a regular HTTP response, the Content-Disposition response header is a header indicating if the content is expected to be displayed inline in the browser, that is, as a Web page or as part of a Web page, or as an attachment, that is downloaded and saved

developer.mozilla.org

Content-Type: application/octet-stream : https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types

 

MIME 타입의 전체 목록 - HTTP | MDN

다음은 일반적인 확장자로 정렬된, 문서 타입과 관련된 MIME 타입의 포괄적인 목록입니다.

developer.mozilla.org

 

참고해야할 사이트가 많지만 찾아보면 분명 도움이 되실 내용들입니다!

.

제가 위에 작성한 코드들은 자바로 작성되어 있던 샘플과 위 페이지를 참고하여 만든 것으로,

필요하신 분들은 가져가서 작성해주셔도 무방합니다만 그냥 복사-붙여넣기하는 방식은 본인에게 제일 좋지 않은 개발습관이에요!

몇몇 분들께서 제 코드를 가져다가 본인이 작성한 코드라고 말하다가 신고되었다고 댓글로 알려주신 사례가 꽤나 적지 않네요..물론 바로 지워주시긴 하셨지만..

 

저 역시도 초급 개발자이다보니 많은 웹 페이지와 서적들을 보고 공부하느라 내용이 틀릴 수도 있으니 만약 제가 작성한 내용을 보시고 틀린 부분이 있다면 지적해주세요 ㅎㅎ

 

오늘 포스팅은 여기서 마치도록 할게요!

긴글 읽어 주셔서 감사합니다~~😃😃😃

안녕하세요 워누입니다. 

 

너무 오랜만에 tistory 블로그를 작성해보네요 ㅎㅎ

오늘은 그동안 바쁘다는 핑계로 이리저리 미루다가 드디어 PHP8을 설치하고 체험해보는 내용으로 포스팅해보겠습니다!

 

PHP로 개발을 하려면 웹 서버인 아파치, PHP 언어, DB를 사용한다면 MySQL 등 여러가지를 설치해야 하는데요, 

요즘에는 여러 회사들에서 이를 하나로 묶어

WAMP(Windows+Apache+MySQL+PHP), WAPP(Windows+Apache+PostgreSQL+PHP), MAMP(MacOS+Apache+MySQL+PHP) 등을 출시해서 서버부터 언어, DB를 한번에 통합으로 설치할 수 있게 배포하고 있습니다!

 

저는 윈도우로 사용할 예정이라 Bitnami사에서 제공하는 WAMP 스택으로 설치해보겠습니다. 

.

사실 Bitnami에서 제공하는 WAMP는 제가 PHP 관련해서 짧게나마 소개했었는데요!

 

https://seoneu.tistory.com/16

 

PHP 맛보기

안녕하세요 워누입니다! . 직장에 다닌다는 핑계로, tistory를 방치하고 있었네요..ㅜ 그래도 나름 자료가 유용했는지 방문자님들이 계셔서 감사한 마음입니다ㅎㅎ . 저는 직장에서 주로 PHP를 쓰

seoneu.tistory.com

 

오늘은 Bitnami 사이트에서 설치하는 방법을 제대로 소개해드리도록 해볼게요 ㅎㅎ

우선, Bitnami 사이트로 이동해서 통합버전 파일을 다운받아야겠죠?

 

https://bitnami.com/stack/wamp/installer

 

Install WAMP, Download WAMP

show MD5 4b221c61594ee6098ddc156acef7efc4 SHA1 799d7f122a3236f648effd6c4de77e3fcdf91a41 SHA256 a816b29ac59df47c1e9ceef4b546086ba40b7922446f603baa6d533c0d19e202

bitnami.com

 

저는 검색했지만 이 글을 보고 PHP8 설치하시려는 분은 위 사이트 클릭해서 바로 들어가세요 ㅎㅎ

.

여튼 위 사이트를 들어가면 아래와 같이 화면이 나올겁니다!

8월 22일 기준 가장 최신 버전은 PHP 8.0.9 입니다!

(PHP 메이저버전을 차용한듯 합니다.)

 

저는 최신버전인 8.0.9를 바로 다운로드 하겠습니다.

버전이 업데이트된다면 새로운 버전 다운받으셔도 될 것 같아요..!

.

주황색 다운로드 버튼을 클릭하면 아래 화면이 나오는데요,

 

Bitnami 커뮤니티에 의견을 제시하거나, 뉴스레터를 굳이 전달받지는 않을거라 

"No thanks, just take me to the download" 버튼을 클릭해서 다운로드를 진행하면 됩니다.

.

.

다운로드가 완료되면 exe 파일을 바로 실행해줍니다!

클릭하면 아래와 같이 설치 시작 화면을 볼 수 있어요

 

묻지도 따지지도 않고 "Next" 버튼을 클릭합니다!

 

다음 화면은 컴포넌트 선택화면인데요,

PHP하면 유명한 라라벨(Laravel) 프레임워크, 젠드(Zend) Framework 등 여러가지가 있네요ㅎㅎ

 

저는 바로 "Next" 버튼 눌러주겠습니다!

(필요없는 기능이라고 생각되면 빼셔도 상관은 없답니다 ㅎㅎ)

.

설치 경로를 설정할 수 있는데요,

저는 D 드라이브에 공간이 넉넉해서 "D:\Bitnami\wampstack-8.0.9-0"로 경로를 바꿨어요!

 

경로를 지정해줬다면 "Next" 버튼을 클릭합니다!

.

데이터베이스 비밀번호를 설정하는 화면이네요!

자신만의 비밀번호를 설정하고 "Next"를 클릭합니다. 

.

DB 포트 설정입니다.

저는 이미 사용하는 DB의 포트가 각각 3306, 3307로 설정되어 있어서 3308로 지정되어 있구요!

아마 각자 DB포트 설정에 따라 번호가 지정될거에요!

.

그대로 "Next" 버튼을 클릭해줍니다.

 여기서는 그냥 "Next" 버튼을 클릭해주세요!

설치 직전 화면입니다!!

준비가 되었다면 "Next" 버튼 클릭!

자 이제 설치를 시작합니다!

설치하는 동안 다른 거 잠깐 하고 오셔도 될거 같네요 ㅎㅎ

 

설치하던 도중 아파치 경고창이 떴습니다!

어차피 개인용으로 사용할 거라 둘다 체크하고 "엑세스 허용"하면 될거 같아요.

 

설치가 마무리되었습니다!

체크박스에 체크를 하고 "Finish" 버튼을 클릭해볼까요?

 

인터넷 브라우저에 이렇게 뜨면 설치 완료입니다!

 

설치 경로인 "D:\Bitnami\wampstack-8.0.9-0" 폴더도 정상적으로 세팅되었네요!

마지막으로, PHP 버전을 확인해봐야겠죠?

웹서버에 phpinfo() 함수를 걸어봅시다.

 

<?php
phpinfo();
?>

 

위 소스코드를 "phpinfo.php" 라는 파일명으로 저장한 후 브라우저에서 실행해보면.. 

정상 설치되었네요! 

이제 PHP8을 제대로 사용해보도록 하겠습니다!

간간히 PHP7과 PHP8 비교해보는 포스팅도 올려보도록 해볼께요 ㅎㅎ

 

오늘 포스팅은 여기서 마무리하도록 하겠습니다!

안녕하세요 워누입니다. 

오늘은 PHP에서 사용하는 비교연산자 중 헷갈릴만한 요소를 포스팅해보고자 합니다!

.

우선 소스부터 함께 보시죠!

.

:: 소스코드 - equalTest.php ::

<?php 

$int5 = 5;				// 정수형 숫자 5
$str5 = '5';				// 문자열 5

if ($int5 == $str5){		
	echo "true"."<br>";
} else {
	echo "false"."<br>";
}

if ($int5 === $str5){
	echo "true"."<br>";
} else {
	echo "false"."<br>";
}
?>

위 소스코드는 숫자 5와, 문자열 5를 비교하여 같으면 true, 다르면 false를 출력하는 소스코드입니다. 

아래 결과를 보기 전 결과가 어떨지  미리 생각해보아요~

.

결과는 어떤지 이제 한번 보도록 하죠!

.

:: 결과화면 ::

equalTest.php 실행화면

 

비교연산자 중 '==' 으로 비교한건 true가 나오고, '===' 으로 비교한건 false가 나왔네요! 

이유는 '=='으로 비교할 땐 값의 일치여부만 판단하지만,

'==='으로 비교하게 되면 자료형의 일치여부까지도 판단하기 때문인데요!

즉, 변수 int5와 str5의 값은 동일하게 '5'이므로 '=='으로 비교하였을 땐 같다고 판단하여 true를,

'==='으로 비교하였을 땐 자료형이 각각 정수, 문자열로 서로 다르기에 false를 출력하였습니다!

.

그렇다면 부정을 의미하는 !=, !==은 어떤지 같이 살펴 볼까요?

 

:: 소스코드 - equalTest2.php ::

<?php 

$int5 = 5;				// 정수형 숫자 5
$str5 = '5';				// 문자열 5

if ($int5 != $str5){		
	echo "true"."<br>";
} else {
	echo "false"."<br>";
}

if ($int5 !== $str5){
	echo "true"."<br>";
} else {
	echo "false"."<br>";
}

?>

 

이번엔 반대로 다르면 true, 같으면 false를 출력하도록 바꿨습니다.

결과를 바로 보시죠!

 

:: 결과화면 ::

equalTest2.php

 

예상대로 '!='로 비교하였을 땐 두 변수 모두 같은 값을 가지고 있어 false를 출력하였고, 

'!=='으로 비교하였을 땐 두 변수의 자료형이 다르니 true를 출력하였네요!

 

!= 연산자는 값의 다름만을 판별하지만,

!== 연산자는 값은 물론 자료형의 다름까지 판별한다는 점을 알게 되었네요 ㅎㅎ

.

위에서 언급한 '==', '===', '!=', '!==' 비교연산자는 javascript에서도 동일하게 적용된다고 하네요!

php가 웹에 특화된 언어인 만큼 javascript를 같이 사용하시는 분도 많을테니 참고하시면 도움이 될 듯합니다!

 

이번 포스팅도 유용한 글이 되었기를 바라며, 여기서 마무리 하겠습니다!

그럼 2만~

 

안녕하세요 워누입니다!

방통대 학업과 회사 일을 병행하다 보니 꾸준히 포스팅하겠다는 의지가 꺾여버렸네요..

그동안 포스팅해야 하는 내용들을 산더미처럼 쌓아놓고 정작 쓰질 않아 귀찮음이 좀 많이 생겼지만,

이제라도 하나씩 풀어야겠습니다!  

.

오늘 포스팅할 내용은 PHP로 JSON data를 다루는 법을 포스팅하겠습니다! 

PHP에서 JSON data를 처리할 수 있도록 json_encode(), json_decode() 함수를 지원합니다.

 

우선 json_encode() 부터 볼까요? 

.

1. json_encode()

:: php에서 배열 데이터를 json 데이터로 바꿔주는 역할을 합니다. 

사용 방법은 아래와 같이 사용하시면 됩니다!

 

json_encode(변수);

.

그럼 거두절미하고 바로 사용예시부터 볼까요?

:: 소스 코드(example) / jsonEncode.php :: 

<?php

//배열 데이터 생성 
$arrData = array(
	'ID' => 'testID',
	'buyerNm' => 'testName',
	'buyerPhoneNum' => '01012345678',
	'goodsData' => array(
		'goodsNm' => 'testGoods',
		'price' => 1000
	)
);

var_dump($arrData);
echo "<br>";

// json 데이터로 변경
$jsonData = json_encode($arrData); 

var_dump($jsonData);

?>

:: 출력 결과 ::

jsonEncode.php 실행 결과

보이시나요?

배열 데이터가 저장된 arrData를 json_encode()라는 함수 하나만으로 json 데이터 형식으로 변경이 되었습니다!!(박수)

변수의 저장 타입도 배열(array)에서 문자열(string)으로 변경된 것을 알수 있습니다 ㅎㅎ

 

그럼 이번엔 반대의 경우로 가볼까요?

우선 json data 파일을 만들어봅시다. json data 파일을 만드는 방법은 간단합니다!

json data 형식을 툴 아무데서나 작성한 뒤, 확장자를 json으로 저장해주시면 되거든요!!

.

:: json data 파일 (ex.json) ::

{
	"ID":"testID",
	"buyerNm":"testName",
	"buyerPhoneNum":"01012345678",
	"goodsData":{
		"goodsNm":"testGoods",
		"price":1000
	}
}

 

이렇게 작성된 json 파일을 file_get_contents() 함수로 불러와서 사용 예정입니다!

(file_get_contents()에 대한 설명은 아래 링크 참조해주세요!)

https://seoneu.tistory.com/25

 

API 통신할 때 file_get_contents(), curl은 무슨 차이일까?

안녕하세요 워누입니다! 오늘은 제가 회사에서 개발하다가 궁금한 점이 부딪혀서 직접 알아본 내용을 포스팅하고자 합니다. . 상황은 API 호출 시 특정 URL로 form-data를 post로 던지고 그 결과를 받

seoneu.tistory.com

 

그리고 아래와 같이 json data를 json_decode() 함수를 이용해 배열 데이터로 바꾸어봅시다!

json_decode(변수, true)

true..? 왜 들어갔는지는 글 아래에 후술해드릴게요!

간략하게만 설명드리면 json_decode에서 true로 지정이 되지 않으면 다른 파일 형태로 변경되더라구요!

그러니 우선은 꼭 true로 설정해주세요!! 

.

이제 사용 예시를 보여드릴께요!

.

:: 소스 코드(example) / jsonDecode.php :: 

<?php

//json data
$jsonData = file_get_contents("ex.json");
var_dump($jsonData);
echo "<br>";

// 배열 타입으로 변경
$arrData = json_decode($jsonData, true);

var_dump($arrData);

?>

:: 출력 결과 ::

jsonDecode.php 출력 결과

 

어떠신가요? 생각보다 간단하죠??

이렇게 json_encode(), json_decode() 사용 방법을 알아보았습니다!

근데 위에서 제가 json_decode()를 사용할 때, 2번째 매개변수로 true를 반드시 입력해야 한다고 했죠??

그 이유가 무엇인지 jsonDecode.php 파일에 코드를 추가하여 다시 실행해보도록 하겠습니다!

 

:: 소스 코드(example) / jsonDecode.php ::

<?php

//json data
$jsonData = file_get_contents("ex.json");
var_dump($jsonData);
echo "<br>";

$arrData = json_decode($jsonData, true); // true 입력
$arrData2 = json_decode($jsonData); // true 미입력 (false)

var_dump($arrData);  // true 입력한 결과
echo "<br>";
var_dump($arrData2); // true 미입력 결과 (false 결과)

?>

:: 출력 결과 ::

jsonDecode.php 출력 결과

....? 

true 값을 없애니, type이 array가 아닌 object(stdClass)라는 값이 왔네요??

이게 무엇인지 몰라 구글신께 검색하여 object라는 type이 PHP에 따로 있어서 찾아본 결과... 

 

일단 뜻은 흔히 알고 있는 객체(클래스의 '객체'할 때 그 객체가 맞습니다!)를 의미하고, 

stdClass는 PHP에서 일반적으로 쓰이는, 비어있는 클래스를 의미하며 다른 object를 캐스팅할 때 쓴다고 합니다. 

.

정리하면 변수 $arrData2는 stdClass에 캐스팅된 object 타입의 변수라 합니다..

(어려워서 좀더 찾아봐야 알 것 같지만 일반적인 배열이 아닌 object 타입의

클래스 기반 배열이라고 보시면 될 것 같네요.. 이거 때문에 회사에서 시간낭비한건 안비밀..)

 

PHP 개발자 분들 중 혹시 자세히 알고 계신 분이 있다면 댓글로 남겨주세요!! 

저도 더 정리할 수 있는 내용이 있다면 수정해서 올리거나, 댓글로 남기도록 하겠습니다!!

오늘 포스팅은 여기서 마치도록 할게요 ㅎㅎ 그럼 이만!

 

 

안녕하세요 워누입니다! 

오늘은 PHP로 이미지 파일을 업로드하는 방법을 포스팅하도록 하겠습니다!

거두절미하고 바로 가보도록 하죠~

.

여러분들도, 저도 인터넷에서 사진이나 문서 파일을 웹에서 업로드한 경험이 있을 것입니다!

이런 폼을 html에서 제공하는데요,

html 폼에서 파일을 업로드하기 위해서는 <input> 태그 내 type 속성 값으로 "file"을 사용하고, 

<form> 태그에 enctype 속성을 적용하고 값으로 "multipart/form-data"를 지정해야 합니다.

 

아래 예시코드처럼 작성을 해주시면 됩니다. 

(편의를 위해서 구분선을 작성했습니다!)

.

[fileUploadRequest.html]

<!DOCTYPE html>
<html>
<head>
</head>
<title>파일 업로드 테스트</title>
<body>
<form name="reqform" method="post" action="fileUploadResult.php" enctype="multipart/form-data"> 
 <p>이미지 파일 업로드 테스트</p>
 <hr> <br>
 <input type="file" name="imgFile" /><br>
 <input type="submit" value="업로드" />
</form>
</body>
</html>

.

이렇게 html로 요청 폼을 만들었으면 요청을 받는 응답 페이지도 만들어주어야 겠죠?

PHP에서는 파일을 어떻게 받아서 처리하는지 한번 보도록 합시다.

 

바로 PHP 응답 페이지 코드 보시죠!!

.

[fileUploadResult.php]

<?php 

/*********************************************
* 넘어오는 데이터가 정상인지 검사하기 위한 절차
* 실제 페이지에서는 적용 X
**********************************************/

//$_FILES에 담긴 배열 정보 구하기.
var_dump($_FILES);

// php 내부 소스에서 html 태그 적용 - 선긋기
echo "<hr>";

/*********************************************
* 실제로 구축되는 페이지 내부.
**********************************************/

// 임시로 저장된 정보(tmp_name)
$tempFile = $_FILES['imgFile']['tmp_name'];

// 파일타입 및 확장자 체크
$fileTypeExt = explode("/", $_FILES['imgFile']['type']);

// 파일 타입 
$fileType = $fileTypeExt[0];

// 파일 확장자
$fileExt = $fileTypeExt[1];

// 확장자 검사
$extStatus = false;

switch($fileExt){
	case 'jpeg':
	case 'jpg':
	case 'gif':
	case 'bmp':
	case 'png':
		$extStatus = true;
		break;
	
	default:
		echo "이미지 전용 확장자(jpg, bmp, gif, png)외에는 사용이 불가합니다."; 
		exit;
		break;
}

// 이미지 파일이 맞는지 검사. 
if($fileType == 'image'){
	// 허용할 확장자를 jpg, bmp, gif, png로 정함, 그 외에는 업로드 불가
	if($extStatus){
		// 임시 파일 옮길 디렉토리 및 파일명
		$resFile = "./img/{$_FILES['imgFile']['name']}";
		// 임시 저장된 파일을 우리가 저장할 디렉토리 및 파일명으로 옮김
		$imageUpload = move_uploaded_file($tempFile, $resFile);
		
		// 업로드 성공 여부 확인
		if($imageUpload == true){
			echo "파일이 정상적으로 업로드 되었습니다. <br>";
			echo "<img src='{$resFile}' width='100' />";
		}else{
			echo "파일 업로드에 실패하였습니다.";
		}
	}	// end if - extStatus
		// 확장자가 jpg, bmp, gif, png가 아닌 경우 else문 실행
	else {
		echo "파일 확장자는 jpg, bmp, gif, png 이어야 합니다.";
		exit;
	}	
}	// end if - filetype
	// 파일 타입이 image가 아닌 경우 
else {
	echo "이미지 파일이 아닙니다.";
	exit;
}
?>

이렇게 코드를 작성해보았습니다.

.

이전 PHP 포스팅에서 $_POST 필드를 이용해 form 태그의 method가 post인 data를 가져온 것을 볼 수 있습니다. 

즉, $_POST 필드는 요청 시 method 속성의 값이 post 방식인 데이터를 배열 형태로 가져온다는 것을 알 수 있습니다.

 

일반적인 데이터라면 $_POST 필드를 이용해 값을 가져왔겠지만, 파일 데이터는 조금 다릅니다. 

$_FILES라는 필드를 이용해 파일에 대한 데이터 값을 배열로 가져옵니다. 

 

자세한 내용을 설명드리기 위해 var_dump() 함수를 이용해 $_FILES 필드에 담긴 배열 데이터를 모두 print하였습니다. 

(PHP에서 데이터를 체크하기 위해 자주 사용하는 함수이니 꼭 알아두세요!!)

실행된 예시 화면을 보면서 조금 더 상세하게 설명드릴게요ㅎㅎ

.

1) fileUploadRequest.html 실행

fileUploadRequest.html 실행 화면

 

2) fileUploadRequest.html 페이지와 동일 경로 내 img 폴더 임의 생성

img 폴더 생성

 

빈 폴더

** 이미지가 업로드되는지 확인하기 위해 빈 폴더로 생성해 놓았습니다!

 

3) fileUploadRequest.html 페이지에서 "파일 선택" 버튼 클릭 후 첨부할 이미지 선택

첨부할 이미지 선택
"파일 선택" 버튼 옆에 선택한 이미지의 파일명이 체크됨.

 

4) fileUploadRequest.html 페이지에서 "업로드" 버튼 클릭 후 결과 확인

fileUploadResult.php 결과 화면

5) fileUploadResult.php 페이지에서 설정한 경로에 선택한 이미지가 업로드 되었는지 확인.

img 폴더 재확인, 선택한 파일이 업로드된 부분 확인.

.

이런 식으로 테스트가 진행되었습니다. 

 

1-3번 과정은 요청하는 페이지에 대한 과정이니 추가 설명을 생략하고, 바로 4번부터 상세하게 설명을 드리겠습니다. 

 

fileUploadResult.php 소스 내 9번째 라인에서 "var_dump($_FILES);"로 체크한 부분을 통해

파일 데이터가 어떻게 저장되어 넘어오는지 알수 있습니다. 

 

넘어온 데이터 형식을 보면 아래와 같은데요,


array(1) { ["imgFile"]=> array(5) { ["name"]=> string(10) "watch3.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(48) "C:\Bitnami\wampstack-7.2.14-0\php\tmp\phpFC9.tmp" ["error"]=> int(0) ["size"]=> int(367171) } }


imgFile이라는 배열 데이터 안에 name, type, tmp_name, error, size라는 필드들이 또 배열로 들어가 있는 것을 확인 할 수 있습니다. 아래 표를 통해 각 필드에 대한 설명을 드립니다. 

 

Field value
imgFile 요청 시 input 태그 내 name 속성으로 지정한 값을 그대로 받아옴.
Field in "imgFile" name 파일명
type 파일 타입과 확장자명을 받아옴 (구분자: /)
tmp_name 업로드한 파일을 임시로 저장할 폴더와 파일명
error 에러 여부
size 파일 사이즈 (단위: byte)

위 표에 대해서 인지를 하고 fileUploadResult.php 소스를 보시면 조금 더 이해가 되실 겁니다ㅎㅎ

다만 소스 내에서 언급한 것처럼 var_dump로 찍은 데이터는 어디까지나 개발할 때 데이터를 체크하기 위한 용도로 쓰기 때문에 만약 실제로 개발하실 때에는 위 데이터가 실제 서비스하는 페이지에서는 보이지 않게 반드시 주의해주세요!

 

다음부터는 주석을 참고하시면서 이런 의미구나 하고 소스를 이해해주시면 되겠습니다!

 

제작된 샘플 소스의 동작 구조는 임시로 저장된 파일경로를 변수에 담아두고 확장자를 검사해서 이미지 파일이 맞으면 

임시 파일 경로에 두었던 파일을 실제 서버 내 폴더에 업로드하고,

허용된 확장자를 쓰지 않았거나 이미지 파일이 아니라면 실패 처리를 알리는 문자열을 출력하는 형태로 구성됩니다!

 

이 소스에서 중요하게 사용된 함수는 아래 설명을 참고 바랍니다!

 

**

explode : PHP에서 하나의 구분자를 가지고 배열 데이터를 만드는 기능을 제공하는 함수

-> syntax : explode("구분자", "데이터");

 

move_uploaded_file : 임시적으로 업로드된 파일을 새로운 경로로 옮겨주는 기능을 제공하는 함수

-> syntax : move_uploaded_file("업로드한 파일의 임시 위치", "옮길 위치 및 파일명");

**

 

이렇게 제가 작성한 코드와 그에 대한 설명을 담아보았는데요. 

제가 드린 샘플 소스를 그대로 사용해도 좋지만 변형도 해보고,

일부러 다른 파일도 올려서 오류가 어떻게 나는지도 직접 시도해보는 것을 권장합니다!

 

저처럼 초보개발자라면 반드시 이렇게 직접 자신의 코드를 써보고, 설명해보고, 일부러 오류도 내보시면 

실력이 더 많이 향상될 것 같아요 ㅎㅎ

제 코드와 설명도 완벽하지는 않아서 언제나 피드백을 주시면 반영하도록 하겠습니다 ㅎㅎ 

 

오늘 포스팅은 여기서 마치도록 하겠습니다~

그럼 20000!!!

 

안녕하세요 워누입니다! 

오랜만에 tistory 블로그를 작성하네요 ㅎㅎ

회사일과 네이버 블로그를 동시에 병행하다 보니 정신이 없지만, 힘내서 포스팅을 진행해보겠습니다!

이번 포스팅에서는 PHP에서 시간을 표시하는 date() 함수에 대해서 알아보겠습니다. 

 

우선 PHP에서 시간을 표시할 때 아래와 같이 작성합니다. 

 

date(시간 포맷)

시간 포맷이라는 알고 싶은 시간의 단위값(연도 또는 월일, 요일)을 입력합니다. 

어떤 형식인지 아래 표를 같이 보시죠!

(예시 데이터는 2021년 1월 18일을 기준입니다.)

문자 의미 예시
Y 연도를 4자리로 표시 2021
y 연도를 2자리로 표시 21
m 0이 붙은 상태로 월을 표시 01
n 0 없이 월을 표시 1
d 0이 붙은 상태로 일을 표시 18
j 0 없이 일을 표시 18
H 0이 붙은 상태로 시를 표시(24시 표현) 01
G 0 없이 시를 표시(24시 표현) 01
i 0이 붙은 상태로 분을 표시 56
s 0이 붙은 상태로 초를 표시 55
A 오전, 오후를 대문자로 표시 AM
a 오전, 오후를 소문자로 표시 am
D 요일을 세글자로 표시 Mon
l(소문자 엘) 요일을 전체 글자로 표시 Monday
w 요일을 숫자로 표시(0~6, 0:일요일, 6:토요일) 1
M 월을 세글자로 표시 Jan
F 월을 전체 글자로 표시 January
z 올해 1월 1일부터 며칠 지났는지 표시 17

 

각각 대소문자를 구별하고 기능이 다르므로 사용 시 주의하셔야 합니다. 

설명도 다 했으니 이제 예시 데이터를 만들어봅시다!

(date.php라는 파일명으로 아래와 같이 샘플을 작성해봅시다.)

<?php 

//시간 표시 (연도, 월, 일, 시, 분, 초) : 0이 붙어 있는 예시
echo date("Y년 m월 d일 H시 i분 s초")."<br>";

//시간 표시 (연도, 월, 일, 시, 분, 초) : 0이 붙어 있지 않은 예시
echo date("y년 n월 j일 G시 i분 s초")."<br>";

//오전 오후 여부
echo date("A")."<br>";
 
//요일 표기
echo date("D")."<br>";

//올해가 며칠 째인지 표기
echo date("z")."<br>";
?>

결과는 아래와 같이 조회됩니다. 

date.php 실행 결과

생각보다 간단하죠?

date() 함수 안에 괄호에서 큰따옴표(")를 사용하고 그 안에서 문자열로 표기되고, 

표에서 설명한 문자열이 아닌 다른 문자열은 그대로 표기가 되는 것으로 보여집니다. 

.

php를 배우시는 분들이라면, date() 함수를 자유자재로 계속 테스트 해보시길 권장 드립니다. 

 

이번 포스팅에서는 여기서 짧게 마치고, 다음 포스팅에서는 로그(log)라는 파일을 만들어볼건데요,

개발자라면 자신이 만든 프로그램에서 어떠한 이벤트가 발생했을 때 그에 대한 기록들을 남겨두기 때문에 

오늘 포스팅에서 배운 date() 함수를 포함하여 그동안 포스팅을 통해 알려드린 mkdir, fopen, fclose, fwrite 기능을

이용해서 실제 현업에서 써먹는 방법을 간략하게 전달드리도록 하겠습니다!

 

그럼 오늘은 여기서 20000!!

 

 

안녕하세요 워누입니다. 

 

그동안 네이버 블로그에 글을 쓰느라 tistory는 방치를 시켜놨네요 ㅜㅜ 

다행히(?) tistory에도 글을 써야지하고 다짐은 하고 있었는데, 드디어 오늘 포스팅하게 되었습니다 ㅎㅎ 

 

오늘은 지난번에 txt 파일을 생성해보고 읽어오는 것도 해봤으니,

이번에는 파일이 아닌 폴더를 생성하고, 삭제하는 것 기능을 포스팅해볼게요. 바로 시작해봅시다!

.

php에서 폴더를 생성하는 함수는 mkdir입니다!

우선 예제 소스를 보면서 어떻게 사용하는지 감을 잡아봅시다!!

.

<생성할 폴더명을 받을 html 페이지 : mkdir_req.html>

<html>
<head>
 <title> PHP 폴더 만들기 테스트 </title>
</head>
<body>
 <form method="post" action="mkdir_res.php">
  생성할 폴더명 : 
  <input type="text" name="ReqData" value="" /><br>
  <input type="submit" value="Submit" />
 </form>
</body>
</html>

<폴더를 생성하는 php 페이지 : mkdir_res.php>

<?php 

//req html 페이지로부터 전달받은 데이터 저장
$dirName = $_POST["ReqData"];

//폴더 생성
$makeDir = mkdir($dirName, '777');

//폴더 생성 여부 확인
if($makeDir){
	echo $dirName." 폴더 생성 완료!";
}
else {
	echo $dirName." 폴더 생성 실패!";
}

?>

<실행 결과>

mkdir_req.html 페이지

 

mkdir_res.php 페이지
test 폴더 생성

.

html 페이지에서 입력한 'test'라는 이름으로 폴더가 정상적으로 생성된 것을 확인할 수 있네요! 

 

html 페이지는 단순히 생성할 폴더명을 받는 페이지고,

지난번 txt 파일 생성하는 포스팅에서도 한번 언급했으니 넘어가겠습니다.

 

mkdir_res.php 페이지를 보시면 mkdir 함수가 보이실텐데요! 두가지 매개변수($dirName, '777')를 가지고 있습니다! 

mkdir 함수에 들어가는 매개변수는 아래와 같이 설정해주어야 합니다.

 

mkdir(경로 및 생성할 폴더 이름, 퍼미션 설정값)

 

위에서 언급한 매개변수 중 퍼미션(permission)이라 함은 권한을 말하는데요, 3자리의 숫자로 구성됩니다. 

첫번째 자리 두번째 자리 세번째 자리
소유자 권한 그룹 권한 사용자 권한

여기서 소유자는 파일 혹은 폴더 생성하는 사람, 그룹은 소유자가 속한 그룹(혹은 같은 그룹원), 사용자는 폴더를 사용하는 사람(보통 유저)을 의미합니다. 각 권한은 읽기(read), 쓰기(write), 실행(execute)으로 구성됩니다. 

읽기(read) 쓰기(write) 실행(execute)
4 2 1

표를 보면서 정리하면, 읽기 권한을 적용하려면 4, 쓰기 권한을 적용하려면 2, 실행 권한을 적용하려면 1을 입력합니다. 

 

읽기+쓰기 권한을 같이 주고 싶다면 6, 읽기+실행 권한을 같이 주고 싶다면 5,

읽기+쓰기+실행 권한을 모두 주고 싶다면 7을 입력해주시면 됩니다. 

 

윈도우에서는 파일을 오른쪽 버튼 클릭해서 나오는 속성 창에서 보안 항목을 통해 직접 권한을 줄 수도 있습니다. 

.

윈도우 속성 창에서 사용권한 부여

일단 저는 테스트이기도 하고, 보안적으로 문제될 것도 없어서 777로 설정을 하였으나

회사에서는 보안적인 이슈를 위해 755나 744 등으로도 쓰이니 용도에 맞게 권한 설정을 해주시면 될 것 같습니다. 

 

mkdir 함수에 대한 설명은 이정도로 하면 될 것 같습니다ㅎㅎ

이번엔 mkdir 함수로 만든 폴더를 rmdir()이라는 함수로 삭제해보도록 하겠습니다!

 

rmdir 함수는 아래와 같이 사용하면 됩니다! 

rmdir(삭제할 폴더 이름)

정말 단순하죠? 예제 소스도 그냥 단순하게 작성해서 테스트 해보았습니다. 

.

<test 폴더를 삭제하는 php 페이지 :  rmdir.php>

<?php

//폴더 삭제
$removeDir = rmdir('test');

//폴더 삭제 여부 확인
if($removeDir){
	echo "폴더 삭제 완료!";
}
else {
	echo "폴더 삭제 실패!";
}

?>

<실행 결과>

 

rmdir.php 페이지
test 폴더 삭제 확인

.

생성했던 test 폴더가 삭제되고 그동안 블로그에 기재하기 위해 작성하였던 파일들만 남아있네요! 

 

오늘은 이렇게 php로 폴더를 생성하고 삭제하는 방법을 작성해보았는데요! 

다음 포스팅에서는 이전에 포스팅했었던 php로 txt 파일을 생성하는 방법과, 오늘 포스팅한 폴더 생성하는 방법으로 

간단하게 날짜에 맞게 로그파일을 생성하는 방법을 포스팅해보겠습니다!

 

그럼 오늘은 여기서 마무리해볼게요~ 긴 글 읽어주셔서 감사합니다!

+ Recent posts