2019.03.24 18:35

요즘 ORM으로는 하이버네이트, JPA등 많이 사용하고 있으나, 역시 SI 쪽은 mybatis(ibatis)를 많이 사용된다.

문제는 mybatis는 xml로 sql을 관리하고 있는데 보통 조금 바꿀때 마다 서버를 재구동 시켜야 되는 문제가 된다.

시스템이 클 경우 재시작시 오랜 시간 걸리고 session 사용시 또 로그인을 해야 하는듯 개발의 흐름이 끊어지는 문제가 많이 발생한다.

예전에 ibatis를 사용 했을시에도 그런 부분이 많이 불편했었는데, 예전 대우정보시스템의 JCF 프레임워크에서 사용된다고 Refresh 되는 클래스 소스가 한번 공개 된적이 있었다. ( 몇년전인지 기억은 안나지만, 당시 인터넷 검색으로 찾았었다. )

그것이 버전이 문제인지 바로 사용이 안되어서 커스터마이징하고 사용을 잘사용 했었다.

그런데 지금 프로젝트가 mybatis로 진행하기 때문에 예전과 같은 불편함이 또 생기게 되었는데, 이 번에는 그 소스를 mybatis에 맞도로 커스터마이징 하기로 했다.  

일단 사전 조건은 

JDK 1.5 이상, Spring, mybatis, spring-mybatis 라이브러리가 설치되어 있는 환경에서만 된다.


일단 기존 Spring 에서 mybatis 설정을 보겠다.

보통 sqlSessionFactory를 이렇게 설정 한다. 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" p:mapperLocations="classpath*:패키지경로/**/mapper.xml" p:configLocation="classpath:/MapperConfig.xml" p:dataSource-ref="dataSource"/>

classpath*:패키지경로/**/mapper.xml  <-이부분이 재로딩 될 xml 파일경로 ( 자신의 프로젝트에 따라 변경 )

이부분에서 굵게 표시한 class 부분만 새로 만든 클래스로 바꾸면 모든게 해결된다.

<bean id="sqlSessionFactory" class="패키지경로.RefreshableSqlSessionFactoryBean" p:mapperLocations="classpath*:패키지경로/**/mapper.xml" p:configLocation="classpath:/MapperConfig.xml" p:dataSource-ref="dataSource" />

RefreshableSqlSessionFactoryBean.java

import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.core.io.Resource;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* mybatis mapper 자동 감지 후 자동으로 서버 재시작이 필요 없이 반영
*
* @author sbcoba
*/
public class RefreshableSqlSessionFactoryBean extends SqlSessionFactoryBean implements DisposableBean {
private static final Log log = LogFactory.getLog(RefreshableSqlSessionFactoryBean.class);
private SqlSessionFactory proxy;
private int interval = 500;
private Timer timer;
private TimerTask task;
private Resource[] mapperLocations;
/**
* 파일 감시 쓰레드가 실행중인지 여부.
*/
private boolean running = false;
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();
public void setMapperLocations(Resource[] mapperLocations) {
super.setMapperLocations(mapperLocations);
this.mapperLocations = mapperLocations;
}
public void setInterval(int interval) {
this.interval = interval;
}
/**
* @throws Exception
*/
public void refresh() throws Exception {
if (log.isInfoEnabled()) {
log.info("refreshing sqlMapClient.");
}
w.lock();
try {
super.afterPropertiesSet();
} finally {
w.unlock();
}
}
/**
* 싱글톤 멤버로 SqlMapClient 원본 대신 프록시로 설정하도록 오버라이드.
*/
public void afterPropertiesSet() throws Exception {
super.afterPropertiesSet();
setRefreshable();
}
private void setRefreshable() {
proxy = (SqlSessionFactory) Proxy.newProxyInstance(
SqlSessionFactory.class.getClassLoader(),
new Class[]{SqlSessionFactory.class},
new InvocationHandler() {
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
// log.debug("method.getName() : " + method.getName());
return method.invoke(getParentObject(), args);
}
});
task = new TimerTask() {
private Map<Resource, Long> map = new HashMap<Resource, Long>();
public void run() {
if (isModified()) {
try {
refresh();
} catch (Exception e) {
log.error("caught exception", e);
}
}
}
private boolean isModified() {
boolean retVal = false;
if (mapperLocations != null) {
for (int i = 0; i < mapperLocations.length; i++) {
Resource mappingLocation = mapperLocations[i];
retVal |= findModifiedResource(mappingLocation);
}
}
return retVal;
}
private boolean findModifiedResource(Resource resource) {
boolean retVal = false;
List<String> modifiedResources = new ArrayList<String>();
try {
long modified = resource.lastModified();
if (map.containsKey(resource)) {
long lastModified = ((Long) map.get(resource))
.longValue();
if (lastModified != modified) {
map.put(resource, new Long(modified));
modifiedResources.add(resource.getDescription());
retVal = true;
}
} else {
map.put(resource, new Long(modified));
}
} catch (IOException e) {
log.error("caught exception", e);
}
if (retVal) {
if (log.isInfoEnabled()) {
log.info("modified files : " + modifiedResources);
}
}
return retVal;
}
};
timer = new Timer(true);
resetInterval();
}
private Object getParentObject() throws Exception {
r.lock();
try {
return super.getObject();
} finally {
r.unlock();
}
}
public SqlSessionFactory getObject() {
return this.proxy;
}
public Class<? extends SqlSessionFactory> getObjectType() {
return (this.proxy != null ? this.proxy.getClass()
: SqlSessionFactory.class);
}
public boolean isSingleton() {
return true;
}
public void setCheckInterval(int ms) {
interval = ms;
if (timer != null) {
resetInterval();
}
}
private void resetInterval() {
if (running) {
timer.cancel();
running = false;
}
if (interval > 0) {
timer.schedule(task, 0, interval);
running = true;
}
}
public void destroy() throws Exception {
timer.cancel();
}
}


만약에 재로딩 되는 시간을 바꾸고 싶으면 

<bean id="sqlSessionFactory" class="패키지경로.RefreshableSqlSessionFactoryBean" p:mapperLocations="classpath*:패키지경로/**/mapper.xml" :configLocation="classpath:/MapperConfig.xml" p:dataSource-ref="dataSource" p:interval="1000" />

 p:interval="1000" 이부분을 수치를 정해주면된다. ( 디폴트는 500, 단위 ms )


 

이제 설정을 서버를 시작해서 위에 로케이션 해당하는 mapper.xml ( sql이 있는 xml , 설정에 따라 다름)에서

sql을 바꿔 보자 그리고 클라이언트에서 바뀐지 확인해보자

큰 문제가 없다면 반영될것이라고 생각된다. 


 

아 단 운영 시스템에 사용은 보장 못합니다~ 개발시에서만 사용하세요~


이 소스는 예전에 인터넷에서 나돌던 RefreshableSqlMapClientFactoryBean 소스를 커스터마이징한 소스인데 문제가 있다면 연락주시길바랍니다.



https://sbcoba.tistory.com/16

Posted by 물색없는세상
2019.03.23 23:04

보통 전자정부같은 Spring기반의 프로젝트를 할때 에러가 나던가 혹은 서버에서 어떤 액션이 일어나면 이클립스 콘솔창에


많은 정보들이 후두두둑 하고 올라간다.


내가 날린 쿼리가 무엇인지, 내가 요청한 URL은 무엇있지 버그나 오류가 있을땐 어떤 오류인지 온갖 정보들이 나타나는데


가끔 쿼리를 실행해도 어떤 쿼리를 실행했는지 나타나지 않는 경우가 있다. 단지 오류가 났을때만 콘솔창에 로그를 뿌려주는 경우


이럴때 버그가 있더라도 시스템에서 오류가 나지 않는다면  어떤 쿼리를 실행시켰는지 어떤 url을 요청했는지 알기 힘들게 된다.



이런경우의 대부분은 로깅 프로퍼티의 설정 레벨이 warn 정도로 되어 있는 경우 인것 같다.


정상적인 쿼리도 콘솔창에 보이게 할수 있도록 설정하는 방법을 알아보자.



log4j를 쓰던 log4j2를 쓰던 logback를 쓰던 설정 xml파일의 이름엔 [log]가 들어간다


프로젝트의 구성,설계에 따라 해당 xml파일은 리소스에 들어가는 경우도 있고 web-inf에 들어가는 경우도 있다


파일을 열어 보면


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration 
    xmlns:log4j="http://jakarta.apache.org/log4j/" 
    debug="false">
    
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %5p [%c] %m%n" />
        </layout>   
    </appender>
    
    <logger name="egovframework" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="console"/>
    </logger>
 
    <!-- log SQL with timing information, post execution -->
    <logger name="jdbc.sqltiming" additivity="false">
        <level value="WARN" />
        <appender-ref ref="console" />
    </logger>
 
    <logger name="jdbc.audit" additivity="false">
        <level value="WARN" />
        <appender-ref ref="console" />
    </logger>
    
    <logger name="jdbc.resultset" additivity="false">
        <level value="WARN" />
        <appender-ref ref="console" />
    </logger>
    
    <logger name="org.springframework" additivity="false">
        <level value="INFO" />
        <appender-ref ref="console" />
    </logger>
    
    <logger name="java.sql" additivity="false">
        <level value="WARN"/
        <appender-ref ref="console"/
    </logger
    
    <root>
        <level value="INFO" />
        <appender-ref ref="console" />
    </root>
                       
</log4j:configuration>
 
cs


이런식으로 되어 있을 것이다. 이부분은 log4j나 logback나 크게 다른 부분은 없다.


단지 로거 안에 레벨이 들어가냐 안들어가냐 어펜드가 포함되냐 안되냐 그리고 최상단에의 정보들같은  이런 약간의 차이만 있을 뿐이다.



보면 <level value="warn"/> 이라고 되어있는데


여기서 밸류값에 들어가는 종류는


DEBUG, INFO, WARN, ERROR, FATAL, ALL, OFF 가 있다.



ALL은 모든 로깅

OFF는 로깅 해제


DEBUG = 디버깅

INFO = 강조정보

WARN = 경고

ERROR = 오류

FATAL = 심각한 오류


라는 의미 이며


WARN은 경고수준 이하 레벨의 정보는 로깅하지 않는 다는 뜻이다

그러니 정상적으로 돌아가는 SQL쿼리문은 콘솔창에 나타나지 않으니


레벨의 밸류를 전부 DEBUG 로 바꿔주자


로거 name="" << 이부분의 네임은 어떤 부분에서 로그를 띄워줄지 적는 부분이다.


뭔지 모르겠고 sql만 띄우고 싶다면 jdbc.sqltiming  이부분의 레벨만 DEBUG 로 바꿔보도록 하자


설정에 따라  


1
2
3
4
5
6
7
<logger name="org.springframework" level="DEBUG " additivity="false">
     <appender-ref ref="console" />
</logger>
  
<logger name="org.mybatis" level="DEBUG "  additivity="false">
    <appender-ref ref="console" />
</logger>
cs


이런식의 스프링프레임워크나 마이바티스에 관한 로그를 띄울 수도 있다.



아무튼 원하는 부분의 레벨을 DEBUG로 설정한 후 구동시키면 정상적으로 실행되는 정보들도 출력이 된다.


additivity 이부분은 

http://seosh81.info/?p=404  << 이분의 블로그에서 잘 설명이 되어 있으니 궁금하면 들어가서 보자


간단히 설명하자면 로그이벤트를 부모에게 전달하도록 하느냐 마느냐 정도의 설정부분인것 같은데


어차피 나는 야매개발자라서 정확하고 자세하겐 모른다.



 <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %5p [%c] %m%n" />
        </layout>   
    </appender>


이부분에서 ConversionPattern이부분의 밸류는 콘솔에 표현되는 표현식을 지정하는 부분이다.


표현식은 아래와 같다.


%m: 로그 내용 출력
%p: debug, info, warn, error, fatal 등의 priority 출력
%r: 어플이 시작 후 이벤트가 발생하는 시점까지의 경과시간 밀리세컨드로 출력
%c: package 출력
%c{n}: n(숫자) 만큼의 package를 가장 하단 부터 역으로 출력
        예) %c{2} 일때 a.b.c 는 b.c 로 출력된다.
%n: 개행문자 출력. 플렛폼에 따라 \r\n 또는 \n 출력.
%d: 이벤트 발생 날짜 출력 ( 프로그램의 실행속도를 느리게 한다.)
        예) %d{HH:mm:ss} 또는 %d{dd MMMM yyyy HH:mm:ss}
%C: 호출자의 클래스명 출력
        예) %C{2} 일때 a.b.c.TestClass 는 c.TestClass 로 출력된다.
%M: method 이름.
%F: 프로그램 파일명.
%l: caller의 정보
%L: caller의 라인수
%x: thread와 관련된 NDC(nested diagnostic context) 
%X: thread와 관련된 MDC(mapped diagnostic context) 
%%: % 표시를 출력  
%t: 쓰레드 이름


로그띄울줄 몰라서 들어온 사람이라면 어차피 저 표현식을 쓸일은 없을테니 그냥 이런게 있다는것만 알아두고 넘어가자.



 

https://yamea-guide.tistory.com/108

Posted by 물색없는세상
2017.06.16 00:15

 

Posted by 물색없는세상
2016.02.01 09:40

윈도우 환경변수를 관리하다보면 불편함을 금하지 않을 수가 없습니다.

마이크로 소프트에서 조금만 신경을 써주면 될거 같은데... 그닥 관심은 없는듯 하네요.

그래도 다행히 이런 문제점을 어느정도 해소해 줄 수 있는 유틸리티가 있습니다.

아래 주소로 가시면 받을 수 있는데요.

 

http://eveditor.com/

귀차니즘이 있으신 분들을 위해 현재 시점으로 최신 버전 업어다 놨습니다.

EveditorFree-1.5.0.zip

프로그램의 이름은 Windows Environment Variables Editor 입니다.

제목이 프로그램의 용도를 그대로 나타내고있네요.

 

 

사용자 환경변수와 시스템 환경변수를 별도로 관리하기 편하게 나눠놨고

각 변수 별로 값을 편리하게 입력 할 수 있습니다. 검색도 되네요.

그리고 환경변수의 핵심인 PATH를 별도의 카테고리로 두어 관리 할 수 있게 해놨습니다. (각 항목의 순서 바꾸기 기능 지원됩니다.)

경로에 변수가 포함되어 있는 경우 실제 경로를 표시해 주는 기특한 기능도 있습니다.

지금도 훌륭한데 앞으로 백업기능을 추가 할 예정이라네요. 다 칙한 프로그램이 될 거 같습니다. ^^;;

 

아 그리고 유효하지 않은 경로를 붉은색으로 표시해주는 센스도 포함되어 있습니다.

 

앞으로 윈도우 환경 변수 관리를 보다 편리하게 해보세요~

 

http://noota.tistory.com/99

Posted by 물색없는세상
2016.01.22 13:31

한글 이름 로마자 표기

성씨는 규정된 표기법이 없어 다양한 표기가 가능합니다. (문화관광부 고시 제2000-8호 제3장 제4항)

이름은 규정에 따른 표기 이외에 관습적으로 사용해 온 표기도 가능합니다. (문화관광부 고시 제2000-8호 제3장 제7항)

  • Ctrl + F(Mac OS X: Command + F)로 원하는 키워드를 검색하시면 더욱 쉽게 찾으실 수 있습니다.
한글 이름 로마자 표기법
가 ga 각 gak 간 gan 갈 gal 감 gam
갑 gap 갓 gat 강 gang 개 gae 객 gaek
거 geo 건 geon 걸 geol 검 geom 겁 geop
게 ge 겨 gyeo 격 gyeok 견 gyeon 결 gyeol
겸 gyeom 겹 gyeop 경 gyeong 계 gye 고 go
곡 gok 곤 gon 골 gol 곳 got 공 gong
곶 got 과 gwa 곽 gwak 관 gwan 괄 gwal
광 gwang 괘 gwae 괴 goe 굉 goeng 교 gyo
구 gu 국 guk 군 gun 굴 gul 굿 gut
궁 gung 권 gwon 궐 gwol 귀 gwi 규 gyu
균 gyun 귤 gyul 그 geu 극 geuk 근 geun
글 geul 금 geum 급 geup 긍 geung 기 gi
긴 gin 길 gil 김 gim 까 kka 깨 kkae
꼬 kko 꼭 kkok 꽃 kkot 꾀 kkoe 꾸 kku
꿈 kkum 끝 kkeut 끼 kki
한글 이름 로마자 표기법
나 na 낙 nak
난 nan 날 nal 남 nam 납 nap 낭 nang
내 nae 냉 naeng 너 neo 널 neol 네 ne
녀 nyeo 녁 nyeok 년 nyeon 념 nyeom 녕 nyeong
노 no 녹 nok 논 non 놀 nol 농 nong
뇌 noe 누 nu 눈 nun 눌 nul 느 neu
늑 neuk 늠 neum 능 neung 늬 nui 니 ni
닉 nik 닌 nin 닐 nil 님 nim
한글 이름 로마자 표기법
다 da
단 dan 달 dal 담 dam 답 dap 당 dang
대 dae 댁 daek 더 deo 덕 deok 도 do
독 dok 돈 don 돌 dol 동 dong 돼 dwae
되 doe 된 doen 두 du 둑 duk 둔 dun
뒤 dwi 드 deu 득 deuk 들 deul 등 deung
디 di 따 tta 땅 ttang 때 ttae 또 tto
뚜 ttu 뚝 ttuk 뜨 tteu 띠 tti
한글 이름 로마자 표기법
라 ra
락 rak 란 ran 람 ram 랑 rang 래 rae
랭 raeng 량 ryang 렁 reong 레 re 려 ryeo
력 ryeok 련 ryeon 렬 ryeol 렴 ryeom 렵 ryeop
령 ryeong 례 rye 로 ro 록 rok 론 ron
롱 rong 뢰 roe 료 ryo 룡 ryong 루 ru
류 ryu 륙 ryuk 륜 ryun 률 ryul 륭 ryung
르 reu 륵 reuk 른 reun 름 reum 릉 reung
리 ri 린 rin 림 rim 립 rip
한글 이름 로마자 표기법
마 ma
막 mak 만 man 말 mal 망 mang 매 mae
맥 maek 맨 maen 맹 maeng 머 meo 먹 meok
메 me 며 myeo 멱 myeok 면 myeon 멸 myeol
명 myeong 모 mo 목 mok 몰 mol 못 mot
몽 mong 뫼 moe 묘 myo 무 mu 묵 muk
문 mun 물 mul 므 meu 미 mi 민 min
밀 mil
한글 이름 로마자 표기법
바 ba 박 bak 반 ban 발 bal
밥 bap 방 bang 배 bae 백 baek 뱀 baem
버 beo 번 beon 벌 beol 범 beom 법 beop
벼 byeo 벽 byeok 변 byeon 별 byeol 병 byeong
보 bo 복 bok 본 bon 봉 bong 부 bu
북 buk 분 bun 불 bul 붕 bung 비 bi
빈 bin 빌 bil 빔 bim 빙 bing 빠 ppa
빼 ppae 뻐 ppeo 뽀 ppo 뿌 ppu 쁘 ppeu
삐 ppi
한글 이름 로마자 표기법
사 sa 삭 sak 산 san 살 sal
삼 sam 삽 sap 상 sang 샅 sat 새 sae
색 saek 생 saeng 서 seo 석 seok 선 seon
설 seol 섬 seom 섭 seop 성 seong 세 se
셔 syeo 소 so 속 sok 손 son 솔 sol
솟 sot 송 song 쇄 swae 쇠 soe 수 su
숙 suk 순 sun 술 sul 숨 sum 숭 sung
쉬 swi 스 seu 슬 seul 슴 seum 습 seup
승 seung 시 si 식 sik 신 sin 실 sil
심 sim 십 sip 싱 sing 싸 ssa 쌍 ssang
쌔 ssae 쏘 sso 쑥 ssuk 씨 ssi
한글 이름 로마자 표기법
아 a
악 ak 안 an 알 al 암 am 압 ap
앙 ang 앞 ap 애 ae 액 aek 앵 aeng
야 ya 약 yak 얀 yan 양 yang 어 eo
억 eok 언 eon 얼 eol 엄 eom 업 eop
에 e 여 yeo 역 yeok 연 yeon 열 yeol
염 yeom 엽 yeop 영 yeong 예 ye 오 o
옥 ok 온 on 올 ol 옴 om 옹 ong
와 wa 완 wan 왈 wal 왕 wang 왜 wae
외 oe 왼 oen 요 yo 욕 yok 용 yong
우 u 욱 uk 운 un 울 ul 움 um
웅 ung 워 wo 원 won 월 wol 위 wi
유 yu 육 yuk 윤 yun 율 yul 융 yung
윷 yut 으 eu 은 eun 을 eul 음 eum
읍 eup 응 eung 의 ui 이 i 익 ik
인 in 일 il 임 im 입 ip 잉 ing
한글 이름 로마자 표기법
자 ja 작 jak 잔 jan 잠 jam 잡 jap
장 jang 재 jae 쟁 jaeng 저 jeo 적 jeok
전 jeon 절 jeol 점 jeom 접 jeop 정 jeong
제 je 조 jo 족 jok 존 jon 졸 jol
종 jong 좌 jwa 죄 joe 주 ju 죽 juk
준 jun 줄 jul 중 jung 쥐 jwi 즈 jeu
즉 jeuk 즐 jeul 즘 jeum 즙 jeup 증 jeung
지 ji 직 jik 진 jin 질 jil 짐 jim
집 jip 징 jing 짜 jja 째 jjae 쪼 jjo
찌 jji
한글 이름 로마자 표기법
차 cha 착 chak 찬 chan 찰 chal
참 cham 창 chang 채 chae 책 chaek 처 cheo
척 cheok 천 cheon cheol 첨 cheom 첩 cheop
청 cheong 체 che 초 cho 촉 chok 촌 chon
총 chong 최 choe 추 chu 축 chuk 춘 chun
출 chul 춤 chum 충 chung 측 cheuk 층 cheung
치 chi 칙 chik 친 chin 칠 chil 침 chim
칩 chip 칭 ching
칩 chip 칭 ching
한글 이름 로마자 표기법
코 ko 쾌 kwae 크 keu 큰 keun 키 ki
한글 이름 로마자 표기법
타 ta 탁 tak 탄 tan
탈 tal 탐 tam 탑 tap 탕 tang 태 tae
택 taek 탱 taeng 터 teo 테 te 토 to
톤 ton 톨 tol 통 tong 퇴 toe 투 tu
퉁 tung 튀 twi 트 teu 특 teuk 틈 teum
티 ti
한글 이름 로마자 표기법
파 pa 판 pan 팔 pal 패 pae
팽 paeng 퍼 peo 페 pe 펴 pyeo 편 pyeon
폄 pyeom 평 pyeong 폐 pye 포 po 폭 pok
표 pyo 푸 pu 품 pum 풍 pung 프 peu
피 pi 픽 pik 필 pil 핍 pip
한글 이름 로마자 표기법
하 ha
학 hak 한 han 할 hal 함 ham 합 hap
항 hang 해 hae 핵 haek 행 haeng 향 hyang
허 heo 헌 heon 험 heom 헤 he 혀 hyeo
혁 hyeok 현 hyeon 혈 hyeol 혐 hyeom 협 hyeop
형 hyeong 혜 hye 호 ho 혹 hok 혼 hon
홀 hol 홉 hop 홍 hong 화 hwa 확 hwak
환 hwan 활 hwal 황 hwang 홰 hwae 횃 hwaet
회 hoe 획 hoek 횡 hoeng 효 hyo 후 hu
훈 hun 훤 hwon 훼 hwe 휘 hwi 휴 hyu
휼 hyul 흉 hyung 흐 heu 흑 heuk 흔 heun
흘 heul 흠 heum 흡 heup 흥 heung 희 hui
흰 huin 히 hi 힘 him

http://viewit.kr/3

Posted by 물색없는세상
2015.07.03 12:53

CSS로 만든 깔끔하고 다양한 색상의 상단 메뉴바가 있어 소개합니다.


CSS가 적용되지 않으면 이렇게 보입니다.

깔끔하면서도 방탄웹으로 잘 만들었네요~

http://naradesign.net/wp/2010/02/11/1185/

 

http://zzznara2.tistory.com/290

Posted by 물색없는세상
2015.07.03 12:53

CSS 메뉴 만들기를 해보도록 하겠습니다. 방법은 어렵지는 않습니다. CSS MENU MAKER 사이트에 접속해서 원하는 형태를 선택하고 만들기를 하면 만들어집니다. 사용방법도 간단한게 장점이구요. CSS 메뉴 만들기 내부 메뉴에는 템플릿으로 미리 만들어진것도 존재하고 또는 직접 만들 수 도 있습니다. 물론 잘만들어진 템플릿 선택 후 원하는 내용만 수정할 수 도 있습니다. 생각보다는 꽤 여러가지 템플릿이 있으며 쉽고 빠르게 메뉴를 꾸밀 수 있다는 점이 장점입니다. 그런데 애드센스 정책상 위에 뭔가 떠 있으면 안된다는것 때문에 약간 사용상 제한은 있을 듯 합니다. 블로그 상단에 쓰일 때 말이죠. 사이드바에 메뉴를 넣으면 상관없겠지만요. 이부분은 잘 확인해보시고 적용해 보시기 바랍니다.

CSS 메뉴 만들기, CSS 메뉴, CSS메뉴, CSS MENU MAKER, IT,CSS 메뉴 만들기를 해보도록 하겠습니다. 방법은 어렵지는 않습니다. CSS MENU MAKER 사이트에 접속해서 원하는 형태를 선택하고 만들기를 하면 만들어집니다. 사용방법도 간단한게 장점이구요. CSS 메뉴 만들기 내부 메뉴에는 템플릿으로 미리 만들어진것도 존재하고 또는 직접 만들 수 도 있습니다. 물론 잘만들어진 템플릿 선택 후 원하는 내용만 수정할 수 도 있습니다. 생각보다는 꽤 여러가지 템플릿이 있으며 쉽고 빠르게 메뉴를 꾸밀 수 있다는 점이 장점입니다. 그런데 애드센스 정책상 위에 뭔가 떠 있으면 안된다는것 때문에 약간 사용상 제한은 있을 듯 합니다. 블로그 상단에 쓰일 때 말이죠. 사이드바에 메뉴를 넣으면 상관없겠지만요. 이부분은 잘 확인해보시고 적용해 보시기 바랍니다.



http://cssmenumaker.com/

위 사이트에 먼저 접속 합니다.


CSS 메뉴 만들기, CSS 메뉴, CSS메뉴, CSS MENU MAKER, IT,CSS 메뉴 만들기를 해보도록 하겠습니다. 방법은 어렵지는 않습니다. CSS MENU MAKER 사이트에 접속해서 원하는 형태를 선택하고 만들기를 하면 만들어집니다. 사용방법도 간단한게 장점이구요. CSS 메뉴 만들기 내부 메뉴에는 템플릿으로 미리 만들어진것도 존재하고 또는 직접 만들 수 도 있습니다. 물론 잘만들어진 템플릿 선택 후 원하는 내용만 수정할 수 도 있습니다. 생각보다는 꽤 여러가지 템플릿이 있으며 쉽고 빠르게 메뉴를 꾸밀 수 있다는 점이 장점입니다. 그런데 애드센스 정책상 위에 뭔가 떠 있으면 안된다는것 때문에 약간 사용상 제한은 있을 듯 합니다. 블로그 상단에 쓰일 때 말이죠. 사이드바에 메뉴를 넣으면 상관없겠지만요. 이부분은 잘 확인해보시고 적용해 보시기 바랍니다.



아래로 내려보면 여러가지 메뉴가 나타납니다. 마음에 드는 메뉴를 먼저 선택 합니다.



CSS 메뉴 만들기, CSS 메뉴, CSS메뉴, CSS MENU MAKER, IT,CSS 메뉴 만들기를 해보도록 하겠습니다. 방법은 어렵지는 않습니다. CSS MENU MAKER 사이트에 접속해서 원하는 형태를 선택하고 만들기를 하면 만들어집니다. 사용방법도 간단한게 장점이구요. CSS 메뉴 만들기 내부 메뉴에는 템플릿으로 미리 만들어진것도 존재하고 또는 직접 만들 수 도 있습니다. 물론 잘만들어진 템플릿 선택 후 원하는 내용만 수정할 수 도 있습니다. 생각보다는 꽤 여러가지 템플릿이 있으며 쉽고 빠르게 메뉴를 꾸밀 수 있다는 점이 장점입니다. 그런데 애드센스 정책상 위에 뭔가 떠 있으면 안된다는것 때문에 약간 사용상 제한은 있을 듯 합니다. 블로그 상단에 쓰일 때 말이죠. 사이드바에 메뉴를 넣으면 상관없겠지만요. 이부분은 잘 확인해보시고 적용해 보시기 바랍니다.



메뉴를 확인 합니다. 왼쪽 아래에 customize / download 를 선택 합니다.


CSS 메뉴 만들기, CSS 메뉴, CSS메뉴, CSS MENU MAKER, IT,CSS 메뉴 만들기를 해보도록 하겠습니다. 방법은 어렵지는 않습니다. CSS MENU MAKER 사이트에 접속해서 원하는 형태를 선택하고 만들기를 하면 만들어집니다. 사용방법도 간단한게 장점이구요. CSS 메뉴 만들기 내부 메뉴에는 템플릿으로 미리 만들어진것도 존재하고 또는 직접 만들 수 도 있습니다. 물론 잘만들어진 템플릿 선택 후 원하는 내용만 수정할 수 도 있습니다. 생각보다는 꽤 여러가지 템플릿이 있으며 쉽고 빠르게 메뉴를 꾸밀 수 있다는 점이 장점입니다. 그런데 애드센스 정책상 위에 뭔가 떠 있으면 안된다는것 때문에 약간 사용상 제한은 있을 듯 합니다. 블로그 상단에 쓰일 때 말이죠. 사이드바에 메뉴를 넣으면 상관없겠지만요. 이부분은 잘 확인해보시고 적용해 보시기 바랍니다.



메뉴를 수정할 수 있습니다. 왼쪽 메뉴에서는 메뉴의 단계를 수정할 수 있고 선택 후 오른쪽 타이틀과 링크를 수정해서 메뉴를 변경할 수 있습니다.

모두 수정 후 download 를 합니다.


CSS 메뉴 만들기, CSS 메뉴, CSS메뉴, CSS MENU MAKER, IT,CSS 메뉴 만들기를 해보도록 하겠습니다. 방법은 어렵지는 않습니다. CSS MENU MAKER 사이트에 접속해서 원하는 형태를 선택하고 만들기를 하면 만들어집니다. 사용방법도 간단한게 장점이구요. CSS 메뉴 만들기 내부 메뉴에는 템플릿으로 미리 만들어진것도 존재하고 또는 직접 만들 수 도 있습니다. 물론 잘만들어진 템플릿 선택 후 원하는 내용만 수정할 수 도 있습니다. 생각보다는 꽤 여러가지 템플릿이 있으며 쉽고 빠르게 메뉴를 꾸밀 수 있다는 점이 장점입니다. 그런데 애드센스 정책상 위에 뭔가 떠 있으면 안된다는것 때문에 약간 사용상 제한은 있을 듯 합니다. 블로그 상단에 쓰일 때 말이죠. 사이드바에 메뉴를 넣으면 상관없겠지만요. 이부분은 잘 확인해보시고 적용해 보시기 바랍니다.



다운로드된 파일을 압축을 해제 후 실행해보면 메뉴가 나타나는것을 볼 수 있습니다. 이제 HTML 과 CSS 그리고 이미지 등을 적용하고자 하는 웹페이지에 업로드 후 적용을 합니다.

http://cdmanii.com/3875

Posted by 물색없는세상
2015.06.23 10:11

http://silentvoyage.tistory.com/125

http://blog.naver.com/devstory/130095325607

http://blog.naver.com/cubot/140112250672

http://neosm.tistory.com/8

http://blog.naver.com/qola/110187703555

http://blog.acronym.co.kr/235

 

 

zxing

Homepage : https://code.google.com/p/zxing/
source : https://github.com/zxing/zxing


maven (pom.xml)

<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>2.1</version>
</dependency>

 


QR 코드 생성 소스

import java.io.File;
import org.junit.Test;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

public class TestQRCode {

@Test
public void test() throws Exception {
QRCodeWriter qrCodeWriter = new QRCodeWriter();
String text = "http://iwastore.obigo.com/mobile";
//text = new String(text.getBytes("UTF-8"), "ISO-8859-1");
BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, 300, 300);
MatrixToImageWriter.writeToFile(bitMatrix, "png", new File("qrcode.png"));
}

}

 



웹 상에서 QR코드 바로 만들 수 있는 URL

Homepage : http://mqr.kr/generate/url/




jQuery QR 코드 만들기

Homepage : http://jeromeetienne.github.io/jquery-qrcode/
소스 : https://github.com/jeromeetienne/jquery-qrcode
blog : http://notes.jetienne.com/2011/04/07/jquery-qrcode.html

jquery-qrcode-master.zip





iText

컬러풀한 QR 코드 만들기

소스 :
http://sourceforge.net/projects/itext/files/iText/

참고 : http://blog.nooree.com/post.cfm/itext-colorful-qrcode


http://tyboss.tistory.com/59

'WebPrograming' 카테고리의 다른 글

QR code  (0) 2015.06.23
네이버 스마트 에디터에 이미지 삽입 기능 추가  (0) 2012.04.10
Posted by 물색없는세상
2015.05.19 13:27

리눅스 환경에서 이클립스를 쓰다보니 별의 별 문제를 다 겪는다.

먼저 번에 톰캣 7.0을 이클립스 서버탭에 등록을 했었고 어떤 문제 때문에 제거를 했었는데..

그 다음 톰캣 7.0을 재 설정 하는데 피니쉬탭이 활성화가 되지 않는 것이었다.

그래서 고생을 했는데..

이 문제는 자신의 이클립스 기본 WorkSpace에 톰캣에 관련된 파일이 완전하게 삭제가 되지 않아서이다.

내가 겪었던 문제 외에 에러 메시지로 아래 메시지가 나타나기도 한다.
Cannot create a server using the selected type

관련 파일을 삭제 하는 방법.
.metadata/.plugins/org.eclipse.core.runtime/.setting 안에 있는 아래 파일을 삭제한다.
org.eclipse.wst.server.core.prefs
org.eclipse.jst.server.tomcat.core.prefs

리눅스 기반에서는 터미널에서 ls -al을 해야 보임.

 

http://levante.tistory.com/33

Posted by 물색없는세상
2015.05.18 17:37

<%@page import="org.json.JSONObject"%>

<%@page import="service.DBService"%>

<%@page import="vo.MemberVO"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

 

<%

 

// json으로 응답시 아래의 두 줄이 필요하다.

response.setHeader("Access-Control-Allow-Origin", "*");

response.setHeader("Access-Control-Allow-Headers", "X-Requested-With");

request.setCharacterEncoding("utf-8");

 

MemberVO[] ar = DBService.getAll();

 

// 라이브러리를 활용하여 배열 또는 ArrayList와 같은 객체를

// JSON표기로 전환하자! 우선

// http:// json.org로 접속하여 화면 하단에서 [Java]라는 분류의 첫번째

// [org.json]항목을 선택한다.

// 화면에서 [Free source code is ....]선택하여 [zip]버튼으로 다운받는다.

 

// 압축을 푼 후 그 안에 있는 ~.java파일들을 복사하여

// 현재 프로젝트의 [org.json]이라느 이름의 package를 생성하여 붙여넣기를 해둔다.

 



 

// 루트를 지정하면서 JSON으로 표현한다.

// JSONObject jo = new JSONObject();

// jo.put("TEST", ar);

// out.println(jo.toString());

%>


// 라이브러리를 이용하여 배열을 json으로 전환이 가능하다.

// 단 한줄로

<%=JSONObject.wrap(ar)%>

http://jdreams.tistory.com/44

Posted by 물색없는세상