Category Archives: Uncategorized

스프링 트랜잭션설정이 정상적으로 안먹는 문제

context-transaction.xml 에 txManager, txAdvise, AOP, annotation-driven 이 정상적으로 되어 있는데, 트랜잭션이 안되는 문제를 찾아보니

context-mapper.xml에
<property name=”dataSource” ref=”dataSource”> 만 있고,
<property name=”transactionFactory”> 설정이 없어서 문제가 있었음

transationFactory설정을 넣으니, context-transaction.xml에 AOP, annotaion-driven 둘 다 정상적으로 됨을 확인함

참고 :
[SPRING] Mybatis-Transaction Management
출처: https://sime.tistory.com/115 [심이 블로그]

엑셀다운로드 했는데 한글이 깨짐문제

윈도우서버에서 리눅스서버로 톰캣을 옮겼다.
리눅스서버로 옮긴 후 서비스도 정상적으로 나오고 문제가 없었는데
엑셀다운로드를 했을 때, 엑셀안에 내용 중에 한글이 깨지는 문제가 발생했다.

엑셀다운로드용 jsp파일을 만들어서 그리드 내용을 엑셀로 다운로드하도록 되어 있는데 한글깨짐이 발생하자 구글링해서 문제를 해결하기 위한 방법을 찾아봤는데
전부다 실패했다.
사용해본 방법은 web.xml에 charset 필터추가 => 실패
server.xml에 charset필터 추가 => 실패

문제를 해결한 방법은 jsp페이지 상단에 page contentType 설정이 문제였음을 알겠됬다.

ㅎ.문제가된 내용
<%@page contentType=”application/vnd.ms-excel; name=’FileName_Excel’, text/html; charset=euc-kr” language=”java”%>

ㅎ.변경한 내용
<%@page contentType=”application/vnd.ms-excel; charset=euc-kr” language=”java”%>

윈도우에서는 문제가 없었는데, 리눅스환경의 톰캣에서는 엑셀에서 한글이 깨지는 문제를 야기시켰다.

jsp파일 인코딩이 utf8로 되어 있어야 엑셀에서 한글이 안깨지는걸 확인했다.
이클립스에서 파일을 선택하고 마우스오른쪽클릭 메뉴중에 properties를 눌러보면, 현재 파일의 text file encoding정보를 볼수 있는데, 이정보가 euckr이 아니라 utf8로 되어 있어야만 문제가 없다.

아무래도 서버리눅스의 locale이 ko_KR.UTF8로 되어 있는데, 이것때문에 이런 문제가 있는게 아닌지 의심스럽다.

virtualbox에 ubuntu16.04설치 후 oracle11g(64bit)설치 완료

공부목적으로 컴퓨터에 오라클을 깔아야되는데, 경험상 윈도우에 오라클을 깔아버리면 나중에 지울때는 그냥 포맷해야하는 이유로 가상머신을 찾아봄
가상머신은 wmware 와 virtualbox, hyper-v 3가지가 있음
wmware는 써봤지만 무료(개인사용자무료도 있긴함,기능제한버전)가 아니라서 패스, hyper-v는 윈도우프로에서만 가능하므로 패스(https://answers.microsoft.com/ko-kr/windows/forum/windows_10-power/window-101-home-edition-hyper-v-%EC%84%A4%EC%B9%98/8ccf0232-b9ff-41a5-990c-0a9f1e3a93ee)
virtualbox는 사용안해봤지만 일단 무료에다가 사용이 간편해보여서 공부목적으로 선택함
virtualbox는 오라클에서 무료로 배포하는 제품임, 버전은 VirtualBox-5.2.20 윈도우용
ssd에다가 virtualbox 저장소를 설정하니깐 일단 굉장히 빠르다. 무조건 ssd에다가 저장소를 설정하자.

설치할 리눅스는 회사에서 사용하는 red hat enterprise linux(통칭 RHEL)를 설치하려고 생각했는데, 그냥 예전에 사용해봤던 우분투를 설치하기로 함
우분투는 desktop(gui)과 server(cli) 제품으로 나누어지는데, server로 사용할 목적으로 server 64bit(amd64)로 선택함, 버전은 16.04버전 굳이 신버전을 사용할 필요가 없어서 구버전중에 안정화된 버전으로 선택함.
우분투는 오라클을 공식적으로 지원해주지 않는 리눅스이므로 설정할게 많다.
우분투에 오라클설치해서 성공하면 redhat으로 시도해봐야겠음.

(중요)오라클 설치하려면 gui가 무조건 필요하다고 함, 그래서 gnome을 설치함(https://idchowto.com/?p=43024)
gnome 일반설치는 2.5G, 최소설치하면 800M이므로 최소설치만 함(옵션 –no-install-recommends)

우분투 설치 후에 계정환경설정,오라클 설치준비에 시간이 많이 들어감.
오라클은 설치하기 전에 환경설정을 잡아야하는게 좀 많다.
virtualbox 콘솔에서는 불편한 점(클립보드)이 많아서 ssh서버설정(http://blog.elmitash.com/78)하고 ssh접속해서 작업함
ssh접속할 때는 Xhell5을 사용함, 개인사용자는 무료인데, ui가 깔끔하고 putty보다는 확실히 좋다.

첫번째 오라클 설치는 실패함, 설치는 완료됬지만 sqlplus실행하면 Segmentation Fault (core dumped) 에러 발생하고 실행이 안됨
구글링을 열심히 했지만, 결국 버전문제로 보임(우분투는 64bit인데 오라클은 32bit를 설치했음)
설치한 오라클을 삭제(http://euless.tistory.com/75)하려고 $ORACLE_HOME/deinstall/deinstall을 했지만 삭제가 안됨
그냥 우분투부터 다시 설치하기로 함(오라클홈페이지에서 oracle11g 64bit버전을 다운받음)

두번째 우분투 설치는 일사천리로 설치후 환경설정까지 30분정도밖에 안걸림.
만반의 준비를 하고서 오라클을 실행했는데, 그냥 바로 설치되서 놀랐음.

설치해서 sqlplus를 실행하니깐 잘된다.

아래는 작업요약
=======================
1. virtualbox 설치
=======================
cpu 2, ram 4G, 디스크 30G 설정(동적할당, 그래도 SSD라서 빠르다)
virtualbox설치 후에 Oracle_VM_VirtualBox_Extension_Pack-5.2.20 확장팩설치

=======================
2. ubuntu16.04 설치
=======================
무조건 영어로만 설정함, 한글로 설정하면 한글도 깨지고 귀찮아진다.
우분투 설치 후 작업
virtualbox 게스트확장설치 (https://kldp.org/node/156898)
게스트 확장 이미지CD삽입으로 실패하면 aptget으로 직접설치한다.
sudo apt-get update
sudo apt-get disk-upgrade
sudo apt-get install virtualbox-guest-x11

history명령어에 날짜/표시 (http://faq.hostway.co.kr/?mid=Linux_ETC&page=8&document_srl=1424)
# vi /etc/profile
HISTTIMEFORMAT=”%F %T — ”
export HISTTIMEFORMAT
# source /etc/profile

ssh 접속설정 (http://blog.elmitash.com/78)

=======================
3. 오라클 설치
=======================
공유폴더설정 후 오라클압축파일 해제 작업
mkdir -p /download/oracle11g
cp /media/sf_oracle11g/linux.x64_11gR2_database*.zip /download/oracle11g
upzip linux*.zip

oracle 계정생성 (다른곳은 oinstall을 oracle계정의 기본그룹으로 두지만, 나는 dba를 기본그룹으로 지정함)
sudo groupadd oinstall
sudo groupadd dba
sudo mkdir -p /home/oracle
sudo useradd -g dba -G oinstall -d /home/oracle -s /bin/bash oracle
sudo passwd oracle
sudo chown -R oracle:dba /home/oracle

오라클 설치하려면 gnome을 설치해야한다. (https://idchowto.com/?p=43024)
# apt-get update
# apt-get install –no-install-recommends ubuntu-gnome-desktop (최소설치 800M)
# apt-get install ubuntu-gnome-desktop (일반설치 2.5G)

설치하기전에 설정해야될거 (http://dimpl.tistory.com/8)

# vi oraerr.sh
sed -i ‘s/^\(\s*\$(MK_EMAGENT_NMECTL)\)\s*$/\1 -lnnz11/g’ $ORACLE_HOME/sysman/lib/ins_emagent.mk
sed -i ‘s/^\(TNSLSNR_LINKLINE.*\$(TNSLSNR_OFILES)\) \(\$(LINKTTLIBS)\)/\1 -Wl,–no-as-needed \2/g’ $ORACLE_HOME/network/lib/env_network.mk
sed -i ‘s/^\(ORACLE_LINKLINE.*\$(ORACLE_LINKER)\) \(\$(PL_FLAGS)\)/\1 -Wl,–no-as-needed \2/g’ $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i ‘s/^\(\$LD \$LD_RUNTIME\) \(\$LD_OPT\)/\1 -Wl,–no-as-needed \2/g’ $ORACLE_HOME/bin/genorasdksh
sed -i ‘s/^\(\s*\)\(\$(OCRLIBS_DEFAULT)\)/\1 -Wl,–no-as-needed \2/g’ $ORACLE_HOME/srvm/lib/ins_srvm.mk

# setting up oracle environment variables
export ORACLE_BASE=/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2/dbhome
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=testdb

오라클 설치하기전에 무조건 따라하기
HOWTO install Oracle 11g on Ubuntu Linux 12.04 (Precise Pangolin) 64bits

오라클 설치하는방법2(gui설정)
https://ttend.tistory.com/158

우분투에 오라클11g 설치하기
https://sarc.io/index.php/oracledatabase/529-ubuntu-oracle-11gr2

리눅스 파일지우는 명령어

서버에 디렉토리 안에 파일이 너무 많으면  시스템이 느려지므로 파일을 지워야할 경우가 생긴다. 그래서 파일을 지우려고 rm *.* 명령을 날리면 파일이 너무많아서 지울 수 없다는 에러가 나오는 경우가 있다.

그런 경우 파일을 일정부분씩 지우면 되는데, 나는 아래와 같은 방법을 사용했다.

ll | grep 파일부분이름 | grep _201601 | awk ‘{print $9}’ | xargs rm

find ./ -type f -name BM*_2015*.xml | grep /DbRecv/ | awk ‘{print $1}’ | xargs rm

참고로 디렉토리별 용량보는 명령어

du -sh *

 

ajax post 실행시 content length가 2Mb 이상일 때, 서비스실패(파라미터가 null)

문제점 : Ajax로 post요청을 was로 날렸는데 서비스실패가 일어남
Was로그에서 확인해보니, controller에서 서비스는 인식하는데, 파라미터값을 null로 인식함

해결방법 : Ajax로 실행할 때, 컨텐츠데이터가 2Mb가 넘어가면 서비스가 실패함을 확인

https://docs.jboss.org/jbossweb/2.1.x/config/http.html
JBOSS에서 webservice post요청일 때, 용량을 제한하는 설정이 있으며, 디폴트로 2MB(2097152)로 되어 있음

웹서버에서 maxPostSize설정을 추가함
<connector name=”ajp” protocol=”AJP/1.3″ scheme=”http” socket-binding=”ajp” max-post-size=”5000000″/>

Dexie.js(indexedDB) IE에서 속도느림현상

크롬(version57)과 익스11에서 dexie 성능테스트

익스11에서는 너무 느리다.

Dexie.js 정보
http://dexie.org/docs/Dexie.js.html

jsfiddle.net에서 소스 시뮬레이션
https://jsfiddle.net/xf2zrL4p/77/

소스실행시에 익스에서는 Promise is undefine에러가 발생하므로, bluebird.js 를 넣는다.

<script src=”https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.3.5/bluebird.min.js”></script>

 

참고 웹사이트

https://developers.google.com/web/fundamentals/instant-and-offline/web-storage/offline-for-pwa?hl=no

http://programmingsummaries.tistory.com/325

java에서 html(xml)구조 dom만들기

일하다가 이것때문에 시간을 마니 잡아먹어서 기억할 겸 메모한다.
처음에는 org.apache.xerces.dom.DocumentImpl와 org.w3c.dom.Document, DOMImplementationRegistry, DOMImplementationLS 를 사용했는데(how-can-i-build-an-html-org-w3c-dom-document),
라이브러리가 꼬여서 다른방법이 없나 찾아보다가 DocumentBuilder,TransformerFactory를 사용하는 방법으로 구현했다.

import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class CustomTest {

	public CustomTest() {
		
	}
	public String makeElement() {
		StringBuffer sb = new StringBuffer();
		
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = null;
		try {
			builder = factory.newDocumentBuilder();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}
		Document htmlDoc = builder.newDocument();
        Element ulElement = htmlDoc.createElement("ul");
        Element liElement = htmlDoc.createElement("li");  
        Element aElement = htmlDoc.createElement("a");
        aElement.setAttribute("href", "#none");
    	aElement.setTextContent("Test");
    	liElement.appendChild(aElement);
    	ulElement.appendChild(liElement);
        TransformerFactory transFactory = TransformerFactory.newInstance();
        Transformer transformer =null;
        StringWriter buffer = null;
		try {
			transformer = transFactory.newTransformer();
			buffer = new StringWriter();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
	        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
	        transformer.transform(new DOMSource(ulElement),
				      new StreamResult(buffer));
		} catch (TransformerConfigurationException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
       
        sb.append(buffer);
		return sb.toString();
		
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		CustomTest cm = new CustomTest();
		System.out.println("start!!");
		//StringBuffer sb = new StringBuffer();
		//sb.append(menu.getHtmlHelpPage(""));
		System.out.print(cm.makeElement());
	}

}

결과:

<ul>
<li>
<a href=”#none”>Test</a>
</li>
</ul>

Apache-Tomcat 로드밸런싱 및 세션 클러스터링 설정하기

아주 잘 정리된 문서를 보면 꼭 스크랩해 놓고싶다.

더군다나 이해하기 쉽게도 적어놓으셨다.

대단하신 분인듯

  1. Apache-Tomcat 로드밸런싱 및 세션 클러스터링 설정하기
  2. http://bryan7.tistory.com/432

1.설치환경
2.Apache Web server설정
3.Tomcat Application Server 설정
4.Web Application에 Clustering이 가능하도록 설정
5.Clustering Test

추가)
1. apache 1.2.7버전이후로

worker.loadbalancer.balanced_workers=tomcat1,tomcat2
–> worker.loadbalancer.balance_workers=tomcat1,tomcat2

2. mod_jk의 라우팅 로그를 보려면 httpd.conf 파일에
JkRequestLogFormat  “%w %R %V %T %U %s” 옵션을 추가하자

jklog

 

[workers.properties]

worker.list=loadbalancer

worker.tomcat1.type=ajp13
worker.tomcat1.host=localhost
worker.tomcat1.port=8009
worker.tomcat1.lbfactor=1

worker.tomcat2.type=ajp13
worker.tomcat2.host=localhost
worker.tomcat2.port=8010
worker.tomcat2.lbfactor=1

worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=tomcat1,tomcat2

 

[httpd.conf]

LoadModule jk_module modules/mod_jk.so


<IfModule jk_module>
JkWorkersFile conf/workers.properties
JkLogFile logs/jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkRequestLogFormat  "%w %R %V %T %U %s"
JkMount /*.jsp loadbalancer
JkMount /*.js loadbalancer
JkMount /*.do loadbalancer
JkMount /*.html loadbalancer
JkMount /servlet/* loadbalancer
JkMount /*.gif loadbalancer
JkMount /*.png loadbalancer
JkMount /*.jpg loadbalancer
</IfModule>

 

[web.xml]

<web-app>

   <distributable/>
</web-app>

 

[server.xml]

<Engine defaultHost="localhost" name="Catalina" jvmRoute="tomcat1">
     <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
     <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log." suffix=".txt"/>
     <Context docBase="MES" path="/MES" reloadable="true" source="org.eclipse.jst.jee.server:MES"/></Host>
</Engine>