create account

[Java] 스티밋 이미지를 캐시해보자. 너무 느린 스티밋 이미지 답답. by nhj12311

View this thread on: hive.blogpeakd.comecency.com
· @nhj12311 ·
$20.75
[Java] 스티밋 이미지를 캐시해보자. 너무 느린 스티밋 이미지 답답.
<center>
![](https://steemitimages.com/DQmVSXzRR7wYVKi1jvocmcEJGTttgAZTRERn6WRndihH1qR/image.png)
</center>

안녕하세요. 스팀마트 서비스를 개발하는 @nhj12311입니다. 오랜만에 개발 포스팅입니다. 본분을 잊으면 안되는데(?) 자꾸 스티밋의 다른곳으로 튀어나갑니다... 

스팀관련한 써드파트 앱들이 많이 있습니다. 기존 스티밋에서 한국인들이 느끼기에 가장 불편한점 중 하나는 속도일겁니다. 그 속도의 문제는 이미지가 거의 80%이상을 차지한다고 봅니다.  그래서 스팀마트를 개발할 때에 판매자 이미지와 상품 이미지를 캐시하도록 만들어 쾌적한 로딩속도를 자랑합니다.  

<center>[Steem Mart 쉬프트 + 클릭 하시면 확인 가능](https://cobot.co.kr/mart)</center>
![](https://steemitimages.com/DQmTVRt2uthH6CiaMzX7yVKkv7oFJT6hnPycwyVvGbCnoiT/image.png)
<center>
![](https://steemitimages.com/DQmSn66Usb9bAgFy7fHUhWmLZwXRkEdZGS8XqvzUEdBiG29/image.png)
</center>

오랜만에 개발자로 돌아와서 이미지를 캐시한 방법을 소개해볼까 합니다. 만들때부터 되어있었으니 꽤 오래 지났지만... 스팀관련 사이트를 제작하려고 하거나 기타 이미지를 잘라오거나 캐시하려는 분들에게 도움이 되었으면 합니다.  

항상 프로그램을 만들려고 할때는 순서가 있겠죠. 뭐 워터풀인가...? (휴가가고 싶다)

<h3>Steemit 이미지 캐시 프로그램</h3>

<h4>[내가 원하는 걸 정리(분석)]</h4>

1\. 해당 프로그램은 수시로 중단, 재시작이 가능하다.
2\. 스티밋 크롤링에 영향을 주지 않도록 별도 봇으로 동작해야한다. (이미지 파일 하나 읽는데 수초가 걸린다. 이를 스티밋 봇에 그대로 넣는다면 스티밋 봇은 일을 제대로 할수가 없다. )
3\. 원본이 하나인 이미지 파일에 대해서는 기존 캐시 파일을 사용하게 한다.
4\. 상품 이미지를 가져오기 위해 각각의 상품 사이즈를 고르게 잘라서 가져온다.
5\. 이미지를 가져오면서 용량도 될수 있으면 많이 줄이도록 한다.

<h4>[어떻게 만들지 계획(설계?)]</h4>
1\. 캐시된 이미지 파일을 디스크에 저장함과 동시에 디비에 경로를 저장해야한다.
2\. 쓰레드를 하나 늘려 이미지 경로를 받아 수집과 저장, 캐시 이미지 경로를 반환해야 한다. 
3\. 이미지를 자를수 있으면서 용량까지 줄일 수 있는 라이브러리를 찾아서 쓰자!

<h4>[자. 이제 노가다를 시작하지(개발)]</h4>

<h5>1\. 사용된 라이브러리 thumbnailator와 사용법</h5>
> 이름이 thumbnailator이기 때문에 굳이 설명할 필요없을 것 같다.
~~~~
URL url = new URL(imgUrl); // 원본 이미지경로
Thumbnails.of(Thumbnails.of(url).width(200).asBufferedImage()).scale(1) // 1차로 200픽셀 가로 비율로 이미지 줄임.
  .sourceRegion(0, 0, 200, 150) // 2차로 200 * 150 픽셀 사이즈로 이미지 자체를 커팅.
  .toFile( CACHE_DIR_PATH + imgName ); // 3차로 지정된 경로에 캐시 이미지를 저장한다.
~~~~

<h5>2\. 쓰레드로 만들자!</h5>
~~~~
public class CacheImgBot implements Runnable {
	private CacheImgBot(){
		
	}
	public static void init() {		
		File pathChk = new File(CACHE_DIR_PATH);
		if( !pathChk.exists()){
			pathChk.mkdirs();
		}
		new Thread(new CacheImgBot()).start();
	}
..........................................................................
        public void run() {
              ................
~~~~


<h5>3\. 쓰레드를 하나 늘려 이미지 경로를 받아 수집과 저장, 캐시 이미지 경로를 반환해야 한다. </h5>

>흠... 이부분 수집, 저장, 경로 반환까지 하려다보니 머리가 초큼 아팠습니다. 일할때완 달리 정리 전혀 없이 머릿속으로만
 담배 피면서 생각하고 바로 코딩으로 들어가니깐... 자꾸 꼬입니다. 머리가 나쁜 개발자는... ㅋㅋㅋ 

음.. 함수를 재귀식으로 만들었더니 말로 설명이 불가능합니다. 그림으로 그려서 설명하더라도 설명이 되지 않을것 같습니다. (제능력의 한계를 느낍니다. ) 가장 좋은건 소스를 보고 실행해보는 것입니다. **그냥 창피함을 무릎쓰고 실제 운영중인 소스 첨부합니다**. 막가봅니다. 개인프로젝트로 하는 개발이니 표준이고 뭐고 지키는것 없습니다. 막 만듭니다. 돌아가면 장땡입니다;; db쪽 코드 빼면 돌아갈 것입니다. 
외부에서는 CacheImgBot.getImgUrl(prodImgUrl); <= 이렇게만 씁니다. 
캐시가 되어있으면 캐시경로를 주고 캐시 전인 경우 작업 stack에 저장하고 ""(blank)를 리턴합니다.  
재귀호출처럼 해놓는 이유는 디스크의 파일이 날아가거나 저장이 안되는 경우를 고려하기 때문입니다. 썸네일레이터를 검색하다보면 가끔 디스크에 저장이 안된다는 글을 볼수 있어서 해놓았습니다. 그리고 언제든 사정에 의해 파일은 날아갈수 있기에... 생각보단 단순해서 실행시켜보면 주석없이도 금방 이해 되실 것입니다. 

~~~~
package kr.co.cobot.bot;

import java.io.File;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Stack;

import javax.persistence.Query;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.resource.transaction.spi.TransactionStatus;

import kr.co.cobot.conf.HibernateCfg;
import kr.co.cobot.entity.TbCacheImg;
import net.coobird.thumbnailator.Thumbnails;
import nhj.util.SecurityUtil;

public class CacheImgBot implements Runnable {
	private CacheImgBot(){
		
	}
	
	private static Map<String, String> CACHE_IMG_REPO = new HashMap();
	private static Stack WORK_REPO = new Stack();
	private static String CACHE_DIR_PATH = "/data/cobot/img/";
	
	public static void init() {		
		File pathChk = new File(CACHE_DIR_PATH);
		if( !pathChk.exists()){
			pathChk.mkdirs();
		}
		new Thread(new CacheImgBot()).start();
	}	

	public static void addCacheImg(String imgUrl) {
		/*
		 * if( cacheImgMap.containsKey(imgUrl) ){ return; }
		 */
		if( "".equals(imgUrl)){
			return;
		}
		else if (WORK_REPO.contains(imgUrl)) {
			System.out.println("CacheImgManager wait For Work... [" + imgUrl + "]");
			return;
		} else {

			try {
				Session session = HibernateCfg.getCurrentSession();
				List list = session.createQuery("from TbCacheImg where imgUrl = :imgUrl ").setParameter("imgUrl", imgUrl)
						.getResultList();
				if (list.size() == 0) {
					WORK_REPO.push(imgUrl);
				} else {
					TbCacheImg cacheImg = (TbCacheImg) list.get(0);				
					// File이 존재하면 캐시에 넣음. 없으면 디비에서 삭제
					chkFileAndCache( cacheImg,  session);				
				}
			} catch (HibernateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				HibernateCfg.closeSession();
			}
		}
	}
	
	private static boolean chkFileAndCache( TbCacheImg cacheImg,  Session session ){
		if (new File(CACHE_DIR_PATH + cacheImg.getImgPath()).exists()) {
			CACHE_IMG_REPO.put(cacheImg.getImgUrl(), cacheImg.getImgPath());
			return true;
		}
		// 파일이 없으면 DB에서 삭제하고 다시 addCacheImg(); 호출!!!
		else {
			
			org.hibernate.Transaction tx = session.beginTransaction();
			
			Query q = session.createQuery("delete from TbCacheImg where imgUrl = :imgUrl ").setParameter("imgUrl",
					cacheImg.getImgUrl());
			int i = q.executeUpdate();
			tx.commit();
			addCacheImg(cacheImg.getImgUrl());
			return false;
		}
	}

	public static String getImgUrl(String url){
		if( url == null || "".equals(url)){
			return "";
		}
		Object obj = CACHE_IMG_REPO.get(url);
		if( obj == null || "".equals(obj.toString()) ) addCacheImg(url);
		return obj == null ? "": obj.toString();
	}

	private static int REFRESH_CACHE_IMG_WORK_TERM = 300;

	@Override
	public void run() {
		try {
			Session session = HibernateCfg.getCurrentSession();
			
			
			List<TbCacheImg> list = session.createQuery("from TbCacheImg ").getResultList();
			for(TbCacheImg img : list ){
				chkFileAndCache(img, session);			
			}
			while (true) {
				try {

					while (!WORK_REPO.empty()) {
						
						String imgUrl = WORK_REPO.pop().toString();
						
						//System.out.println("CacheImgManager cache image work start! + " + imgUrl);
						
						String imgName = SecurityUtil.getRandomID128() + ".png";
						
						org.hibernate.Transaction tx = null;
						try {
							URL url = new URL(imgUrl);
							Thumbnails.of(Thumbnails.of(url).width(200).asBufferedImage()).scale(1)
									.sourceRegion(0, 0, 200, 150)
									.toFile( CACHE_DIR_PATH + imgName );
							TbCacheImg cacheImg = new TbCacheImg();
							cacheImg.setImgUrl(imgUrl);
							cacheImg.setImgPath(imgName);
							tx = session.beginTransaction();						
							session.save(cacheImg);
							tx.commit();
							
							CACHE_IMG_REPO.put(imgUrl, imgName);
							
						} catch (Exception e) {
							if( tx != null && tx.getStatus() != TransactionStatus.COMMITTED ){
								tx.rollback();
							}							
						}
					}
					Thread.sleep(REFRESH_CACHE_IMG_WORK_TERM);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally {
								
				}
			}
		} catch (Throwable e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{
			System.out.println("CacheImgManager.finally");
			
			HibernateCfg.closeSession();		
			HibernateCfg.closeSessionFactory();
		}
	}
	
	public static void main(String[] args) throws Throwable {

		CacheImgBot.init();
		
		System.out.println("add img");
		String imgUrl1 = "https://steemitimages.com/0x0/https://steemitimages.com/0x0/https://steemitimages.com/DQmQZ2eXkxh2zr8YsrEXEUo8rPhmsxqQcG9V1cVFxAyiXKm/bag7301.JPG";
		//CacheImgManager.addCacheImg(imgUrl1);
		System.out.println("add img end");
		
		String cacheImgUrl1 = getImgUrl(imgUrl1);
		System.out.println("cacheImgUrl1 : " + cacheImgUrl1 );
		
		System.out.println("wait 6sec.");
		Thread.sleep(6000);
		
		cacheImgUrl1 = getImgUrl(imgUrl1);
		System.out.println("cacheImgUrl1 : " + cacheImgUrl1 );
		
		System.out.println("wait 3sec.");
		Thread.sleep(3000);
		cacheImgUrl1 = getImgUrl(imgUrl1);
		System.out.println("cacheImgUrl1 : " + cacheImgUrl1 );
	}
	@Override
	protected void finalize() throws Throwable {
		// TODO Auto-generated method stub
		super.finalize();

		HibernateCfg.closeSession();
		HibernateCfg.closeSessionFactory();
	}
	
}

~~~~

<h4>[결과는?]</h4>
소스가 저렇게 허접해도 아무런 문제 없이 잘 돌아갑니다...필요하신 분은 참조, 변경해서 사용하시면 시간단축에는 도움이 되실 것입니다. 제 사이트에서 몇주간 문제가 없었으니 큰 문제도 없을 것입니다(퀄리티가 문제지...)

[스팀마트](https://cobot.co.kr/mart)에서 확인 가능함.
https://cobot.co.kr/mart

향후... 어떤 싸이트를 또 만들게 될지 모르겠으나 이미지 로딩이 계속 이렇게 느리다면 별도 저장이 필수인 것입니다. 조만간 steemcat 같은 사이트를 오픈해서 이미지 로딩을 전부 이걸로 바꿔버릴까 생각중이기도 합니다. 하하하.... 말로만. ㅋㅋ일명 겁내 빠른 스티밋 사이트!

읽어주셔서 감사합니다. :)

<center>
![](https://steemitimages.com/DQmf4v92ni2JUMANB4TQs2exruSGSWiZyBsvLa7kg7hUhFA/image.png)
[![follow me!](https://img1.steemit.com/0x0/https://i.imgsafe.org/b87bb98157.gif)](https://steemit.com/@nhj12311)</center> <center>
👍  , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
properties (23)
authornhj12311
permlinkjava
categorykr-dev
json_metadata{"tags":["kr-dev","kr","kr-java","java","steemdev"],"users":["nhj12311"],"image":["https://steemitimages.com/DQmVSXzRR7wYVKi1jvocmcEJGTttgAZTRERn6WRndihH1qR/image.png","https://steemitimages.com/DQmTVRt2uthH6CiaMzX7yVKkv7oFJT6hnPycwyVvGbCnoiT/image.png","https://steemitimages.com/DQmSn66Usb9bAgFy7fHUhWmLZwXRkEdZGS8XqvzUEdBiG29/image.png","https://steemitimages.com/DQmf4v92ni2JUMANB4TQs2exruSGSWiZyBsvLa7kg7hUhFA/image.png","https://img1.steemit.com/0x0/https://i.imgsafe.org/b87bb98157.gif"],"links":["https://cobot.co.kr/mart","https://steemit.com/@nhj12311"],"app":"steemit/0.1","format":"markdown"}
created2017-08-26 17:10:45
last_update2017-08-26 17:10:45
depth0
children12
last_payout2017-09-02 17:10:45
cashout_time1969-12-31 23:59:59
total_payout_value16.226 HBD
curator_payout_value4.520 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length8,829
author_reputation24,459,544,840,580
root_title"[Java] 스티밋 이미지를 캐시해보자. 너무 느린 스티밋 이미지 답답."
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd0
post_id12,951,593
net_rshares5,137,397,627,763
author_curate_reward""
vote details (55)
@asbear ·
인터넷이 느려서 스팀잇도 원래느린 영국거주자는 공감 못하고 보팅 꾹 하고 갑니다..... ㅎㅎㅎ

그나저나 자바전문가셨군요.... 앞으로 많이 도와주세요오오오오오.......
properties (22)
authorasbear
permlinkre-nhj12311-java-20170827t085353466z
categorykr-dev
json_metadata{"tags":["kr-dev"],"app":"steemit/0.1"}
created2017-08-27 08:53:57
last_update2017-08-27 08:53:57
depth1
children1
last_payout2017-09-03 08:53:57
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length97
author_reputation76,617,948,082,616
root_title"[Java] 스티밋 이미지를 캐시해보자. 너무 느린 스티밋 이미지 답답."
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id13,007,548
net_rshares0
@nhj12311 ·
한국은 길면 5~7초정도 걸리는게 ms단위로 바뀌기때문에 체감이 상당합니다 ^^ 자바만 할줄 아는거죠 ㅎㅎㅁ
properties (22)
authornhj12311
permlinkre-asbear-re-nhj12311-java-20170827t130038172z
categorykr-dev
json_metadata{"tags":["kr-dev"],"app":"steemit/0.1"}
created2017-08-27 13:00:42
last_update2017-08-27 13:00:42
depth2
children0
last_payout2017-09-03 13:00:42
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length60
author_reputation24,459,544,840,580
root_title"[Java] 스티밋 이미지를 캐시해보자. 너무 느린 스티밋 이미지 답답."
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id13,023,016
net_rshares0
@girina79 ·
겁내 빠른 스티밋이라니!! 기대가 됩니다!!
properties (22)
authorgirina79
permlinkre-nhj12311-java-20170826t185234405z
categorykr-dev
json_metadata{"tags":["kr-dev"],"app":"steemit/0.1"}
created2017-08-26 18:52:36
last_update2017-08-26 18:52:36
depth1
children1
last_payout2017-09-02 18:52:36
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length24
author_reputation103,848,783,374,320
root_title"[Java] 스티밋 이미지를 캐시해보자. 너무 느린 스티밋 이미지 답답."
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id12,959,295
net_rshares0
@nhj12311 ·
항상 말로만입니다 하하....
properties (22)
authornhj12311
permlinkre-girina79-re-nhj12311-java-20170827t041901050z
categorykr-dev
json_metadata{"tags":["kr-dev"],"app":"steemit/0.1"}
created2017-08-27 04:19:03
last_update2017-08-27 04:19:03
depth2
children0
last_payout2017-09-03 04:19:03
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length16
author_reputation24,459,544,840,580
root_title"[Java] 스티밋 이미지를 캐시해보자. 너무 느린 스티밋 이미지 답답."
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id12,991,890
net_rshares0
@gyeryak ·
남이 볼것도 아닌데, 돌아 가기만 하면 되는거 아닌가요!

라고 생각했었지만, 제 지난 소스를 되돌아보면 그건 아닌 것 같기도 합니다...

여하튼 좋은 정보 감사합니다 :) 아무래도 인터넷 속도 하나는 엄청 빠른 편에 속한 한국이니까요...
properties (22)
authorgyeryak
permlinkre-nhj12311-java-20170826t180702072z
categorykr-dev
json_metadata{"tags":["kr-dev"],"app":"steemkr/0.1"}
created2017-08-26 18:07:03
last_update2017-08-26 18:07:03
depth1
children1
last_payout2017-09-02 18:07:03
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length135
author_reputation1,325,621,375,112
root_title"[Java] 스티밋 이미지를 캐시해보자. 너무 느린 스티밋 이미지 답답."
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id12,955,935
net_rshares0
@nhj12311 ·
애매한 부분이죠 사실. ㅎㅎㅎ 목적에 맞게 하면 베스트라고 생각합니다. 감사합니다.
properties (22)
authornhj12311
permlinkre-gyeryak-re-nhj12311-java-20170826t181049714z
categorykr-dev
json_metadata{"tags":["kr-dev"],"app":"steemit/0.1"}
created2017-08-26 18:10:48
last_update2017-08-26 18:10:48
depth2
children0
last_payout2017-09-02 18:10:48
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length46
author_reputation24,459,544,840,580
root_title"[Java] 스티밋 이미지를 캐시해보자. 너무 느린 스티밋 이미지 답답."
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id12,956,195
net_rshares0
@jungs ·
저랑 비슷하시네요 ㅎㅎ
돌아가면 장땡 ㅋㅋ 
좋은 정보 잘얻어갑니다. ^^
properties (22)
authorjungs
permlinkre-nhj12311-java-20170826t180025884z
categorykr-dev
json_metadata{"tags":["kr-dev"],"app":"steemkr/0.1"}
created2017-08-26 18:00:33
last_update2017-08-26 18:00:33
depth1
children1
last_payout2017-09-02 18:00:33
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length41
author_reputation26,108,729,177,194
root_title"[Java] 스티밋 이미지를 캐시해보자. 너무 느린 스티밋 이미지 답답."
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id12,955,474
net_rshares0
@nhj12311 ·
ㅋㅋㅋ 감사합니다. 문제는 그 '잘 돌아가게'가 어렵다는거죠.
properties (22)
authornhj12311
permlinkre-jungs-re-nhj12311-java-20170826t181133298z
categorykr-dev
json_metadata{"tags":["kr-dev"],"app":"steemit/0.1"}
created2017-08-26 18:11:33
last_update2017-08-26 18:11:33
depth2
children0
last_payout2017-09-02 18:11:33
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length34
author_reputation24,459,544,840,580
root_title"[Java] 스티밋 이미지를 캐시해보자. 너무 느린 스티밋 이미지 답답."
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id12,956,244
net_rshares0
@minari ·
minari 다녀갑니다 ^^
properties (22)
authorminari
permlinkre-nhj12311-java-20170829t021958814z
categorykr-dev
json_metadata{"tags":["kr-dev"],"app":"steemit/0.1"}
created2017-08-29 02:20:00
last_update2017-08-29 02:20:00
depth1
children1
last_payout2017-09-05 02:20:00
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length15
author_reputation18,256,774,154,134
root_title"[Java] 스티밋 이미지를 캐시해보자. 너무 느린 스티밋 이미지 답답."
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id13,183,993
net_rshares0
@nhj12311 ·
방문에 감사합니다. ^^
properties (22)
authornhj12311
permlinkre-minari-re-nhj12311-java-20170829t070259902z
categorykr-dev
json_metadata{"tags":["kr-dev"],"app":"steemit/0.1"}
created2017-08-29 07:02:57
last_update2017-08-29 07:02:57
depth2
children0
last_payout2017-09-05 07:02:57
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length13
author_reputation24,459,544,840,580
root_title"[Java] 스티밋 이미지를 캐시해보자. 너무 느린 스티밋 이미지 답답."
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id13,201,176
net_rshares0
@twinbraid ·
돌아가면 장땡이죠 ㅎㅎ
유지보수할때는 고생하겠지만 잘 짜신거 같습니다
전 볼줄 모르지만 아무튼 그냥 잘짜신거 같습니다-_-
properties (22)
authortwinbraid
permlinkre-nhj12311-java-20170828t171328324z
categorykr-dev
json_metadata{"tags":["kr-dev"],"app":"steemit/0.1"}
created2017-08-28 17:13:27
last_update2017-08-28 17:13:27
depth1
children1
last_payout2017-09-04 17:13:27
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length68
author_reputation158,830,716,503,548
root_title"[Java] 스티밋 이미지를 캐시해보자. 너무 느린 스티밋 이미지 답답."
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id13,144,581
net_rshares0
@nhj12311 ·
ㅋㅋㅋ 병과 약을 다 주는 말씀입니다.  트윈님의 재방문에 거듭 감사합니다!!
properties (22)
authornhj12311
permlinkre-twinbraid-re-nhj12311-java-20170828t172338506z
categorykr-dev
json_metadata{"tags":["kr-dev"],"app":"steemit/0.1"}
created2017-08-28 17:23:36
last_update2017-08-28 17:23:36
depth2
children0
last_payout2017-09-04 17:23:36
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length43
author_reputation24,459,544,840,580
root_title"[Java] 스티밋 이미지를 캐시해보자. 너무 느린 스티밋 이미지 답답."
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id13,145,464
net_rshares0