외부의 이미지를 자신의 서버경로에 썸네일 만드는 방법
링크
http://82da.com/Ybbs/sample/Ymake_sumnail_remoteimage.php (299) http://82da.com/Ybbs/sample/source/Yfilereader.php?file=Ymake_sumnail_remoteimage.php (284)
안녕하세요
요새 관련 내용이 조금 보이길래 한번 만들어봣습니다.
원리는 외부의 이미지를 소켓으로 읽어와서 내 서버에 저장한다.
그런다음 그 서버에 저장된 이미지로 부터 썸네일을 만든다.
썸네일을 만든후 원본 이미지는 삭제한다.
입니다.
전 그냥 샘플을 만드는 정도로 해봣습니다.
응용하셔서 사용하세요.
예제 : http://82da.com/Ybbs/sample/Ymake_sumnail_remoteimage.php
소스 : http://82da.com/Ybbs/sample/source/Yfilereader.php?file=Ymake_sumnail_remoteimage.php
다음은 소스입니다.
----------------------------------------------------------------------
//썸네일 이미지 사이지 결정하여 썸네일 생성
//$src_file_size, $dest_file_size 이미지 정보를 담은 배열 0은 너비 1은 높이
function Ysumnail_rule($src_file, $dest_file, $src_file_size, $dest_file_size, $image_quality=90, $lib='gd'){
//생성도중 에러가 날수 있는 것들을 체크 하여 return false
if (!is_array($src_file_size) || !is_array($dest_file_size) || empty($src_file_size[0]) || empty($src_file_size[1]) || empty($dest_file_size[0]) || empty($dest_file_size[0])) {
return false;
}
//$lib 확인후 조건에 맞지 않으면 기본값 세팅
if (empty($lib) || ($lib != 'gd' && $lib != 'netpbm')) $lib = 'gd';
$rate = $src_file_size[1] / $src_file_size[0];
$temp[1] = (int)($dest_file_size[0] * $rate);
if ($dest_file_size[1] < $temp[1]) {
$rate = $src_file_size[0] / $src_file_size[1];
$dest_file_size[0] = (int)($dest_file_size[1] * $rate);
}
else{
$dest_file_size[1] = $temp[1];
}
//썸네일의 너비나 높이가 10 미만인것은 만들지 않는다.
if ($dest_file_size[0] < 10 || $dest_file_size[1] < 10) {
return false;
}
//썸네일 이미지가 원본이미지 크기보다 크게 설정되었을 경우, 원본이미지와 동일하게
if ($dest_file_size[0] > $src_file_size[0]) {
$dest_file_size = $src_file_size;
}
if ($lib == 'netpbm') return Ymake_sumnail_netpbm($src_file, $dest_file, $src_file_size, $dest_file_size, $image_quality);
else return Ymake_sumnail_gd($src_file, $dest_file, $src_file_size, $dest_file_size, $image_quality);
}
//섬네일 생성
function Ymake_sumnail_gd($src_file, $dest_file, $src_file_size, $dest_file_size, $image_quality=90){
//생성도중 에러가 날수 있는 것들을 체크 하여 return false
if (empty($src_file) || empty($dest_file) || !is_file($src_file) || !is_array($src_file_size) || !is_array($dest_file_size) || empty($src_file_size[0]) || empty($src_file_size[1]) || empty($src_file_size[2]) || empty($dest_file_size[0]) || empty($dest_file_size[0])) {
return false;
}
//$image_quality 확인후 조건에 맞지 않으면 기본값 세팅
if(!is_numeric($image_quality) || empty($image_quality)) $image_quality = 90;
//원본사이즈보다 썸네일 사이즈가 더 크면 원본사이즈와 같게 썸네일을 생성
if ($dest_file_size[0] > $src_file_size[0]) {
$dest_file_size = $src_file_size;
}
switch($src_file_size[2]) {
case 1: // GIF image
@exec( "gifsicle -I " . $src_file, $tempinfo);
$info = @join(" " , $tempinfo);
//gifsicle rpm이 설치되었을 경우 움직인는 gif도 썸네일 가능하다.
if (preg_match("'(loop forever|loop count)'", $info)) {
@exec( "gifsicle -O " . $image_quality . " --resize " . $dest_file_size[0] . "x" . $dest_file_size[1] . " " . $src_file . " > " . $dest_file );
//퍼미션 변경가능 여부를 가지고 썸네일 생성 실패 판단
return @chmod($dest_file, 0777);
}
else {
$src = @ImageCreateFromGIF($src_file);
}
break;
case 2: // JPEG image
$src = @ImageCreateFromJPEG($src_file); break;
case 3: // PNG image
$src = @ImageCreateFromPNG($src_file); break;
default: // 정해진 이외의 포맷은 return false
return false;
}
if (function_exists("imagecreatetruecolor")) {
// This function requires GD 2.0.1 or later.
$dst = @ImageCreateTrueColor($dest_file_size[0], $dest_file_size[1]);
}
else {
$dst = @ImageCreate($dest_file_size[0], $dest_file_size[1]);
}
// 1.00.05 gd 버전에 따라
if (function_exists("imagecopyresampled")) {
@imagecopyresampled($dst, $src, 0, 0, 0, 0, $dest_file_size[0], $dest_file_size[1], $src_file_size[0], $src_file_size[1]);
}
else {
// 1.00.02 imagecopyresized -> imagecopyresampled 로 교체
@imagecopyresized($dst, $src, 0, 0, 0, 0, $dest_file_size[0], $dest_file_size[1], $src_file_size[0], $src_file_size[1]);
}
@ImageJPEG($dst, $dest_file, $image_quality);
@ImageDestroy($src);
@ImageDestroy($dst);
//퍼미션 변경가능 여부를 가지고 썸네일 생성 실패 판단
return @chmod($dest_file, 0777);
}
//원격이미지 정보 가져오는 함수
function Ymake_sumnail_remoteimage($url, $save_dir, $referer=''){
global $dest_file;
$src_file = $save_dir . '/' . base64_encode($url);
$text = Yreadfile($url, $referer);
if (empty($text)) return Array();
$fp = @fopen ($src_file, "w");
@fwrite($fp, $text);//유일한 파일이므로 파일에 락을 걸지 않는다.
@fclose($fp);
@chmod ($src_file, 0777);
$src_file_size = @getimagesize($src_file);
$dest_file = $save_dir . '/s_' . base64_encode($url);
$dest_file_size = Array(200, 100);
$result = Ysumnail_rule($src_file, $dest_file, $src_file_size, $dest_file_size, 90, 'gd');
@unlink($src_file);
return $result;
}
//플록님 이미지
$url = "http://phosay.com/g4/data/file/demo_gallery/3660583642_49cb97ad_wo%2B091.jpg";//읽어올 url
$referer = "http://phosay.com/g4/";//속일 리퍼러, 넣지 않아도 됨
$save_dir = "./temp";
//임시저장디렉토리 지정, 상대경로
//퍼미션은 웹서버가 읽을 수 있도록, 일반적으로 777
//맨마지막에 / 를 붙이지 않는다.
$result = Ymake_sumnail_remoteimage($url, $save_dir, $referer);
echo "<br>원본이미지 <img src='" . $url . "' border=0>";
if (empty($result)) echo "<br>png 썸네일 생성에 실패하였습니다. 저장디렉토리의 퍼미션이나 원본의 이미지포맷, 또는 gd지원여부를 확인하세요.";
else echo "<br>png 썸네일이미지 <img src='" . $dest_file . "' border=0>";<div class='small'>[이 게시물은 관리자님에 의해 2011-10-31 17:12:10 PHP & HTML에서 이동 됨]</div>
요새 관련 내용이 조금 보이길래 한번 만들어봣습니다.
원리는 외부의 이미지를 소켓으로 읽어와서 내 서버에 저장한다.
그런다음 그 서버에 저장된 이미지로 부터 썸네일을 만든다.
썸네일을 만든후 원본 이미지는 삭제한다.
입니다.
전 그냥 샘플을 만드는 정도로 해봣습니다.
응용하셔서 사용하세요.
예제 : http://82da.com/Ybbs/sample/Ymake_sumnail_remoteimage.php
소스 : http://82da.com/Ybbs/sample/source/Yfilereader.php?file=Ymake_sumnail_remoteimage.php
다음은 소스입니다.
----------------------------------------------------------------------
//썸네일 이미지 사이지 결정하여 썸네일 생성
//$src_file_size, $dest_file_size 이미지 정보를 담은 배열 0은 너비 1은 높이
function Ysumnail_rule($src_file, $dest_file, $src_file_size, $dest_file_size, $image_quality=90, $lib='gd'){
//생성도중 에러가 날수 있는 것들을 체크 하여 return false
if (!is_array($src_file_size) || !is_array($dest_file_size) || empty($src_file_size[0]) || empty($src_file_size[1]) || empty($dest_file_size[0]) || empty($dest_file_size[0])) {
return false;
}
//$lib 확인후 조건에 맞지 않으면 기본값 세팅
if (empty($lib) || ($lib != 'gd' && $lib != 'netpbm')) $lib = 'gd';
$rate = $src_file_size[1] / $src_file_size[0];
$temp[1] = (int)($dest_file_size[0] * $rate);
if ($dest_file_size[1] < $temp[1]) {
$rate = $src_file_size[0] / $src_file_size[1];
$dest_file_size[0] = (int)($dest_file_size[1] * $rate);
}
else{
$dest_file_size[1] = $temp[1];
}
//썸네일의 너비나 높이가 10 미만인것은 만들지 않는다.
if ($dest_file_size[0] < 10 || $dest_file_size[1] < 10) {
return false;
}
//썸네일 이미지가 원본이미지 크기보다 크게 설정되었을 경우, 원본이미지와 동일하게
if ($dest_file_size[0] > $src_file_size[0]) {
$dest_file_size = $src_file_size;
}
if ($lib == 'netpbm') return Ymake_sumnail_netpbm($src_file, $dest_file, $src_file_size, $dest_file_size, $image_quality);
else return Ymake_sumnail_gd($src_file, $dest_file, $src_file_size, $dest_file_size, $image_quality);
}
//섬네일 생성
function Ymake_sumnail_gd($src_file, $dest_file, $src_file_size, $dest_file_size, $image_quality=90){
//생성도중 에러가 날수 있는 것들을 체크 하여 return false
if (empty($src_file) || empty($dest_file) || !is_file($src_file) || !is_array($src_file_size) || !is_array($dest_file_size) || empty($src_file_size[0]) || empty($src_file_size[1]) || empty($src_file_size[2]) || empty($dest_file_size[0]) || empty($dest_file_size[0])) {
return false;
}
//$image_quality 확인후 조건에 맞지 않으면 기본값 세팅
if(!is_numeric($image_quality) || empty($image_quality)) $image_quality = 90;
//원본사이즈보다 썸네일 사이즈가 더 크면 원본사이즈와 같게 썸네일을 생성
if ($dest_file_size[0] > $src_file_size[0]) {
$dest_file_size = $src_file_size;
}
switch($src_file_size[2]) {
case 1: // GIF image
@exec( "gifsicle -I " . $src_file, $tempinfo);
$info = @join(" " , $tempinfo);
//gifsicle rpm이 설치되었을 경우 움직인는 gif도 썸네일 가능하다.
if (preg_match("'(loop forever|loop count)'", $info)) {
@exec( "gifsicle -O " . $image_quality . " --resize " . $dest_file_size[0] . "x" . $dest_file_size[1] . " " . $src_file . " > " . $dest_file );
//퍼미션 변경가능 여부를 가지고 썸네일 생성 실패 판단
return @chmod($dest_file, 0777);
}
else {
$src = @ImageCreateFromGIF($src_file);
}
break;
case 2: // JPEG image
$src = @ImageCreateFromJPEG($src_file); break;
case 3: // PNG image
$src = @ImageCreateFromPNG($src_file); break;
default: // 정해진 이외의 포맷은 return false
return false;
}
if (function_exists("imagecreatetruecolor")) {
// This function requires GD 2.0.1 or later.
$dst = @ImageCreateTrueColor($dest_file_size[0], $dest_file_size[1]);
}
else {
$dst = @ImageCreate($dest_file_size[0], $dest_file_size[1]);
}
// 1.00.05 gd 버전에 따라
if (function_exists("imagecopyresampled")) {
@imagecopyresampled($dst, $src, 0, 0, 0, 0, $dest_file_size[0], $dest_file_size[1], $src_file_size[0], $src_file_size[1]);
}
else {
// 1.00.02 imagecopyresized -> imagecopyresampled 로 교체
@imagecopyresized($dst, $src, 0, 0, 0, 0, $dest_file_size[0], $dest_file_size[1], $src_file_size[0], $src_file_size[1]);
}
@ImageJPEG($dst, $dest_file, $image_quality);
@ImageDestroy($src);
@ImageDestroy($dst);
//퍼미션 변경가능 여부를 가지고 썸네일 생성 실패 판단
return @chmod($dest_file, 0777);
}
//원격이미지 정보 가져오는 함수
function Ymake_sumnail_remoteimage($url, $save_dir, $referer=''){
global $dest_file;
$src_file = $save_dir . '/' . base64_encode($url);
$text = Yreadfile($url, $referer);
if (empty($text)) return Array();
$fp = @fopen ($src_file, "w");
@fwrite($fp, $text);//유일한 파일이므로 파일에 락을 걸지 않는다.
@fclose($fp);
@chmod ($src_file, 0777);
$src_file_size = @getimagesize($src_file);
$dest_file = $save_dir . '/s_' . base64_encode($url);
$dest_file_size = Array(200, 100);
$result = Ysumnail_rule($src_file, $dest_file, $src_file_size, $dest_file_size, 90, 'gd');
@unlink($src_file);
return $result;
}
//플록님 이미지
$url = "http://phosay.com/g4/data/file/demo_gallery/3660583642_49cb97ad_wo%2B091.jpg";//읽어올 url
$referer = "http://phosay.com/g4/";//속일 리퍼러, 넣지 않아도 됨
$save_dir = "./temp";
//임시저장디렉토리 지정, 상대경로
//퍼미션은 웹서버가 읽을 수 있도록, 일반적으로 777
//맨마지막에 / 를 붙이지 않는다.
$result = Ymake_sumnail_remoteimage($url, $save_dir, $referer);
echo "<br>원본이미지 <img src='" . $url . "' border=0>";
if (empty($result)) echo "<br>png 썸네일 생성에 실패하였습니다. 저장디렉토리의 퍼미션이나 원본의 이미지포맷, 또는 gd지원여부를 확인하세요.";
else echo "<br>png 썸네일이미지 <img src='" . $dest_file . "' border=0>";<div class='small'>[이 게시물은 관리자님에 의해 2011-10-31 17:12:10 PHP & HTML에서 이동 됨]</div>
댓글 13개
18년 전
생성되는 이미지의 이름이 전
편의상 base64_encode를 사용하여
인코딩 하였는데
사용하시는 분은 자신의 상황에 맞게 해당 내용을 수정하여 쓰시면 되겠습니다.
편의상 base64_encode를 사용하여
인코딩 하였는데
사용하시는 분은 자신의 상황에 맞게 해당 내용을 수정하여 쓰시면 되겠습니다.
18년 전
감사합니다.^^
얼른 데려가겠습니다.
얼른 데려가겠습니다.
18년 전
멋진 자료를 선보여 주셔서 감사드립니다.
한 가지 더 추가되었으면 하는 기능이 있다면,
제 아무리 썸네일로 추출되는 자료라 할지라도,
해당 자료의 도메인을 추출해 워터마크로 가볍게 마무리가 되었으면
훨씬 더 좋을 것 같다는 생각을 해 봅니다.
한 가지 더 추가되었으면 하는 기능이 있다면,
제 아무리 썸네일로 추출되는 자료라 할지라도,
해당 자료의 도메인을 추출해 워터마크로 가볍게 마무리가 되었으면
훨씬 더 좋을 것 같다는 생각을 해 봅니다.
18년 전
네 그렇게 하면 더 좋겟네요
18년 전
Yreadfile 펑션이 업다고 나오는데 기존의 Yfunction파일을 인크루드해서 테스트해보고있습니다.
한글파일명을 가진 이미지는 썸네일 생성이 안되나봅니다?
밤에 제대로 테스트해보고 코멘트 올리겠습니다.~~**
한글파일명을 가진 이미지는 썸네일 생성이 안되나봅니다?
밤에 제대로 테스트해보고 코멘트 올리겠습니다.~~**
18년 전
좋은 자료 감사합니다.....보쌈해 갑니다...^^
18년 전
흥부보쌈~*
18년 전
한글도 되게 해ㅤㄴㅘㅅ습니다.
원문이 수정이 안되네요
$text = Yreadfile($url, $referer);
이것 대신에
$read_url = iconv('utf-8', 'euc-kr', $url);//utf-8 사용자만 필요한 라인
$read_url = preg_replace("`( )`e", "rawurlencode('\\1')", $read_url);
$text = Yreadfile($read_url, $referer);
이렇게 고쳐 사용하세요.
원문이 수정이 안되네요
$text = Yreadfile($url, $referer);
이것 대신에
$read_url = iconv('utf-8', 'euc-kr', $url);//utf-8 사용자만 필요한 라인
$read_url = preg_replace("`( )`e", "rawurlencode('\\1')", $read_url);
$text = Yreadfile($read_url, $referer);
이렇게 고쳐 사용하세요.
18년 전
거듭 감사드립니다^^
겟방식으로 불러들여 전체 혹은 레코드별로 생성하는데 까지 잘됩니다.
업데이트 스킨에 적용하는 삽질만 마치면 될듯합니다.
겟방식으로 불러들여 전체 혹은 레코드별로 생성하는데 까지 잘됩니다.
업데이트 스킨에 적용하는 삽질만 마치면 될듯합니다.
18년 전
업데이트 스킨에서는 별도의 코딩없이 location.replace로 생성관련 파일을 부른후 다시 본문으로 보내는 방식으로도 잘 돌아가는군요.
리스트나 최신글에도 base64_encode 방식으로 변경해서 적용하니 더더욱 좋습니다.
제가 사용하는데는 문제가 없습니다만, port80을 막아놓은 경우에 대한 내용입니다.
Warning: fsockopen(): unable to connect to www.sir.co.kr:80 in /home/***/g4/skin/board/basic_link_thumb/Yfunction.php on line 115
원본 - http://www.sir.co.kr/img/t_post.gif
png 썸네일 생성에 실패하였습니다.~~
$url_port = Yvar_empty_check($array['port'], 80);
$fp = fsockopen($url_server, $url_port);//115 행
같은 스킨으로 두곳에서 테스트 해보는데 한곳에서만 위처럼 막히는 현상이 있고 다른 한곳은 정상적으로 생성이 되는군요.?!
큰 선물을 주셔서 고맙습니다.^^
리스트나 최신글에도 base64_encode 방식으로 변경해서 적용하니 더더욱 좋습니다.
제가 사용하는데는 문제가 없습니다만, port80을 막아놓은 경우에 대한 내용입니다.
Warning: fsockopen(): unable to connect to www.sir.co.kr:80 in /home/***/g4/skin/board/basic_link_thumb/Yfunction.php on line 115
원본 - http://www.sir.co.kr/img/t_post.gif
png 썸네일 생성에 실패하였습니다.~~
$url_port = Yvar_empty_check($array['port'], 80);
$fp = fsockopen($url_server, $url_port);//115 행
같은 스킨으로 두곳에서 테스트 해보는데 한곳에서만 위처럼 막히는 현상이 있고 다른 한곳은 정상적으로 생성이 되는군요.?!
큰 선물을 주셔서 고맙습니다.^^
용된지렁이
18년 전
잘보고 갑니다~
드렁크수달스
17년 전
좋은 정보 감사합니다.
15년 전
ss
게시판 목록
프로그램
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 |
|---|---|---|---|---|
| 930 | 19년 전 | 3532 | ||
| 929 |
|
19년 전 | 2692 | |
| 928 |
|
19년 전 | 3440 | |
| 927 |
|
19년 전 | 3439 | |
| 926 |
|
19년 전 | 3144 | |
| 925 | 19년 전 | 5427 | ||
| 924 |
|
19년 전 | 2164 | |
| 923 |
|
19년 전 | 2211 | |
| 922 |
|
19년 전 | 2302 | |
| 921 |
|
19년 전 | 3386 | |
| 920 | 19년 전 | 3698 | ||
| 919 |
|
19년 전 | 3737 | |
| 918 |
|
19년 전 | 2342 | |
| 917 |
|
19년 전 | 2386 | |
| 916 |
|
19년 전 | 2682 | |
| 915 | 19년 전 | 3031 | ||
| 914 | 19년 전 | 2451 | ||
| 913 | 19년 전 | 2620 | ||
| 912 | 19년 전 | 2443 | ||
| 911 | 19년 전 | 2197 | ||
| 910 | 19년 전 | 3227 | ||
| 909 | 19년 전 | 3283 | ||
| 908 | 19년 전 | 3021 | ||
| 907 |
|
19년 전 | 4859 | |
| 906 |
|
19년 전 | 2692 | |
| 905 |
|
19년 전 | 3299 | |
| 904 |
|
19년 전 | 3127 | |
| 903 |
|
19년 전 | 1977 | |
| 902 |
|
19년 전 | 3117 | |
| 901 |
|
19년 전 | 1859 | |
| 900 |
|
19년 전 | 2325 | |
| 899 |
|
19년 전 | 2393 | |
| 898 |
|
19년 전 | 3976 | |
| 897 |
|
19년 전 | 3160 | |
| 896 |
|
19년 전 | 3086 | |
| 895 |
|
19년 전 | 2530 | |
| 894 |
|
19년 전 | 1996 | |
| 893 |
|
19년 전 | 1634 | |
| 892 |
|
19년 전 | 2401 | |
| 891 |
|
19년 전 | 2320 | |
| 890 |
|
19년 전 | 1811 | |
| 889 |
|
19년 전 | 1807 | |
| 888 |
|
19년 전 | 2599 | |
| 887 |
|
19년 전 | 2573 | |
| 886 |
|
19년 전 | 1871 | |
| 885 |
|
19년 전 | 2104 | |
| 884 |
|
19년 전 | 3290 | |
| 883 |
|
19년 전 | 1948 | |
| 882 |
|
19년 전 | 2485 | |
| 881 |
|
19년 전 | 2566 | |
| 880 |
|
19년 전 | 2654 | |
| 879 |
|
19년 전 | 2930 | |
| 878 |
|
19년 전 | 2556 | |
| 877 |
|
19년 전 | 2973 | |
| 876 |
|
19년 전 | 2758 | |
| 875 |
|
19년 전 | 3513 | |
| 874 | 19년 전 | 1866 | ||
| 873 | 19년 전 | 2725 | ||
| 872 |
|
19년 전 | 2363 | |
| 871 |
|
19년 전 | 2011 | |
| 870 |
|
19년 전 | 2419 | |
| 869 |
|
19년 전 | 1863 | |
| 868 |
|
19년 전 | 5436 | |
| 867 |
|
19년 전 | 2252 | |
| 866 |
|
19년 전 | 4234 | |
| 865 |
|
19년 전 | 2288 | |
| 864 | 19년 전 | 1838 | ||
| 863 | 19년 전 | 2580 | ||
| 862 | 19년 전 | 2322 | ||
| 861 | 19년 전 | 2523 | ||
| 860 | 19년 전 | 2155 | ||
| 859 | 19년 전 | 3910 | ||
| 858 | 19년 전 | 3413 | ||
| 857 | 19년 전 | 2193 | ||
| 856 |
Power
|
19년 전 | 2101 | |
| 855 | 19년 전 | 1968 | ||
| 854 | 19년 전 | 1989 | ||
| 853 |
pearly
|
19년 전 | 4366 | |
| 852 |
pearly
|
19년 전 | 3348 | |
| 851 | 19년 전 | 2769 | ||
| 850 |
pearly
|
19년 전 | 3341 | |
| 849 |
pearly
|
19년 전 | 2996 | |
| 848 |
pearly
|
19년 전 | 2836 | |
| 847 | 19년 전 | 2340 | ||
| 846 |
|
19년 전 | 2153 | |
| 845 |
pearly
|
19년 전 | 2480 | |
| 844 | 19년 전 | 3092 | ||
| 843 | 19년 전 | 2116 | ||
| 842 |
pearly
|
19년 전 | 3112 | |
| 841 |
pearly
|
19년 전 | 3239 | |
| 840 | 19년 전 | 2908 | ||
| 839 |
|
19년 전 | 1930 | |
| 838 |
|
19년 전 | 1695 | |
| 837 |
|
19년 전 | 2311 | |
| 836 |
|
19년 전 | 2246 | |
| 835 |
|
19년 전 | 1618 | |
| 834 |
|
19년 전 | 1655 | |
| 833 |
|
19년 전 | 1559 | |
| 832 |
|
19년 전 | 2061 | |
| 831 |
|
19년 전 | 1611 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기