반응형

다음과 같은 특정 규칙으로 정의된 문자열이 있다고 가정하자.

"홍길동,28,남자,서울 강남구"

해당 문자열을 구분자로 구분하여 나누는 방법으로는 몇가지가 있는데 오늘은 StringTokenizer 와 split을 이용해 보겠다

StringTokenizer는 특정 구분자를 기준으로 token 단위로 끊어서 읽을수 있게 해준다.
split의 경우 구분자를 기준으로 문자열을 분리하여 배열로 리턴한다.


import java.util.StringTokenizer;

public class StringTokenTest {

	public static void main(String[] args) {
		
		
		// 이름,나이,성별,지역
		String txt = "홍길동,28,남자,서울 강남구" ;
		
		
		// StringTokenizer를 이용한 문자열 분리
		StringTokenizer tokens = new StringTokenizer(txt);
		
		String sName 	= tokens.nextToken(",") ;	// 이름
		String sAge 	= tokens.nextToken(",") ;	// 나이
		String sSex 	= tokens.nextToken(",") ;	// 성별
		String sLoc 	= tokens.nextToken(",") ;	// 지역
		
		System.out.println("[StringTokenizer 이용]") ;
		System.out.println(sName) ;
		System.out.println(sAge) ;
		System.out.println(sSex) ;
		System.out.println(sLoc) ;
		
		System.out.println("") ;
		
		
		
		// split을 이용한 문자열 분리
		String[] txtArr = txt.split(",") ;
		
		System.out.println("[split 이용]") ;
		for(int i=0; i < txtArr.length; i++){
			System.out.println(txtArr[i]) ;
		}
		
		
	}
}


사용방법은 둘다 간단하지만 특히 split을 이용한 방법이 코드도 짧고 꽤 간단하다.
하지만 상황에 맞게 StringTokenizer 과 split을 구분하여 사용하는게 좋다.

StringTokenizer는 "남자,,서울 강남구" 처럼 null값이 있을경우 null을 무시해 버린다.

즉 실제 출력은 "남자, 서울 강남구"가 되버린다. 이 경우는 구분자 앞뒤로 공백을 주어 토큰을 trim 처리해서 공백을 지워버리면 되지만, split은 null 이 있을경우에도 무시하지 않으므로 차라리 해당 문자열이 적을경우 split을 이용하는게 편하다.

또다른 상황으로 나 같은 경우 StringTokenizer을 사용하는곳은 CSV형식의 파일을 읽어서 뭔가를 처리해야 할때 인데, 이때 CSV 파일의 용량이 상당히 크다.


해당 작업을 split으로 처리하면 처리속도가 굉장히 떨어져 비효율적인 문제가 발생하였다.

반응형



Posted by 궁극의 java개발자
,





반응형

웹 개발을 하다보면 GET / POST 방식의 전송시 한글이 깨지는 경우가 종종 있다.
특히 이제 막 웹 개발을 시작하는 분들의 경우 한글깨짐이 발생하여 굉장히 당황스러워 하는데,
사실 웹 개발자라면 초보시절에 한번쯤은 다들 경험해 봤을것이다.
처음 한번 경험하고 그 이후엔 그 경험을 토대로 더이상 실수하지 않는 그런것 이랄까?

오늘은 JSP / Servlet을 통한 웹 개발시 한글깨짐에 대해 처리하는 방법을 정리해 보았다.

참고로 JSP를 구동시키는 WAS는 톰캣을 이용하였고, 모든 웹페이지의 캐릭터셋은 UTF-8로 개발하였다.



1. POST 전송시 한글깨짐
JSP 페이지 상단에 request.setCharacterEncoding 을 명시한다.

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

<%@page import="java.util.*"%>
<%

	request.setCharacterEncoding("UTF-8");

%>


2. GET 전송시 한글깨짐
Tomcat의 server.xml에 URIEncoding 옵션을 추가해 준다.

아파치를 연동하여 AJP를 사용할 경우 AJP connector에도 해당 옵션을 추가해 준다.

 

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />

 

위와같이 하면 한글깨짐이 어느정도 해결이 된다.

나 같은 경우 GET 방식으로 파라미터를 넘겨 사용할때는 가급적이면 해당 문자열을 인코딩하여 전달한다.
특히 한글이나 특수문자 공백이 들어갈 경우에는 무조건 문자열을 인코딩하여 사용하는데 이는 잘못된 파라미터의 전달처럼 원치않은 문자열이 들어오는것을 피하기 위해서이다.
또한 최신 브라우저는 상관없지만 IE 6, 7과 같은 구형 브라우저에서 문제가 생기는 경우가 있었다.

그래서 습관적으로 get 방식으로 전송되는 문자열에 대해서 인코딩하여 전송한다.

전송하여야 할 문자열은 URLEncoder를 이용하여 인코딩하면 되고 받는쪽에서는 URLDecoder를 이용하여 디코딩하여 사용하면 된다. (POST 전송시엔 할 필요없다)


 

보내는쪽

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@page import="java.net.URLEncoder"%>

<%
	
	String text = "홍길동" ;

	// 전송 문자 UTF-8 인코딩
	string encText = URLEncoder.encode(text, "UTF-8") ;
%>

 

받는쪽

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@page import="java.net.URLDecoder"%>

<%
	
	// Get 전송 파라미터
	String rText = request.getParameter("text") ;

	// 문자 디코딩
	string text = URLDecoder.decode(text, "UTF-8") ;


%>

 

escape(encodeURIComponent("홍길동"))

 


아무쪼록 이 글이 한글 처리에 대해 당황하고 있는 분들에게 도움이 되었으면 좋겠다.

 

반응형



Posted by 궁극의 java개발자
,





반응형

웹 서비스를 하다보면 이미지들을 화면에서 보여줄때가 많다.
특히 메인화면 이라던지 리스트 화면 같은경우에 이미지들이 많이 쓰일때가 종종 있는데,
이때 사이즈가 큰 원본이미지를 사용하는것 보다는 별도의 썸네일 이미지를 생성하여 사용하는게 좋다.

썸네일 이미지를 생성하여 화면에 보여주게 되면 페이지 자체가 가벼워 지므로 서버 부하가 줄어든다는 장점이 있으며

사용자는 덩치 큰 이미지를 내려받는데 시간을 소비하기 보다는 작은 이미지를 내려받음으로서
더 빠른 페이지 로딩을 할 수 있다.

나 같은경우 사용자가 이미지를 업로드할때 서버에 이미지 저장 처리를 하면서 썸네일 이미지를 별도로 만든다.
즉 사용자는 1장의 이미지를 올리게 되지만 서버쪽에서는 원본 1장, 썸네일 1장을 가지게 된다.

리스트 화면에서는 썸네일 이미지를 보여주고 상세화면에서는 원본이미지를 컨트롤하여 사용자에게 보여준다.

썸네일 이미지를 생성하는 방법은 몇가지 있지만 나는 주로 가장 간단하게 사용할 수 있는 Jimi 라이브러리를 이용한다.


라이브러리 다운

JimiProClasses.jar


다운받은 라이브러리는 /WEB-INF/lib 에 넣는다.


썸네일 생성 예

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

<%@page import="java.awt.Image"%>
<%@page import="com.sun.jimi.core.Jimi"%>
<%@page import="com.sun.jimi.core.JimiException"%>
<%@page import="com.sun.jimi.core.JimiUtils"%>


<%

	// 원본 이미지
	String orgFile = "C:/image/test.jpg" ;

	// 썸네일 이미지
	String thumbFile = "C:/image/test_thumb.jpg"

	// 썸네일 이미지 가로크기(단위 : px)
	int thumbWidth = 320 ;

	// 썸네일 이미지 세로크기(단위 : px)
	int thumbHeight = 160 ;

	try{

		// 썸네일 설정
		Image thumbnail = JimiUtils.getThumbnail(orgFile, thumbWidth, thumbHeight, Jimi.IN_MEMORY);

		// 썸네일 생성
		Jimi.putImage(thumbnail, thumbFile);


	}catch(Exception e){
		e.printStackTrace();
	}


%>

Jimi 라이브러리를 이용할때의 단점은 GIF 이미지는 썸네일 생성을 하지 못한다.
이유는 GIF 자체의 라이센스 문제때문이라고 어디선가 본듯 하다.

반응형

'Programming > Jsp' 카테고리의 다른 글

checkbox 값 받기와 전송순서에 대하여  (0) 2015.12.16
한글 깨짐 처리방법과 문자 인코딩  (0) 2015.12.15



Posted by 궁극의 java개발자
,





반응형
필요에 의해 로그 파일과 같은 텍스트 파일을 생성할 일들이 있다.

나 같은 경우는 배치 프로그램의 실행 결과 등을 주로 남기거나, DB 데이터 등을 CSV로 생성하거나 할때 Java로 파일 생성을 한다.

Java에서 파일 생성을 하는 방법은 간단하다.

FileWriter 객체를 이용하여 파일을 생성하고 필요한 텍스트 문자들을 넣어주면 된다.

워낙 간단하니 소스만 봐도 쉽게 이해가 갈 것이다.


1. FileWriter를 이용한 파일 생성

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;


public class FileWriterTest {
	
	
	public static void main(String[] args) {
		
		String txt = "테스트입니다!!" ;
		
		String fileName = "C:\\test11.txt" ;
		
		
		try{
			
			// 파일 객체 생성
			File file = new File(fileName) ;
			
			// true 지정시 파일의 기존 내용에 이어서 작성
			FileWriter fw = new FileWriter(file, true) ;
			
			// 파일안에 문자열 쓰기
			fw.write(txt);
			fw.flush();

			// 객체 닫기
			fw.close(); 
			
			
		}catch(Exception e){
			e.printStackTrace();
		}
		

	}
}

 

2. BufferedWriter + FileWriter를 이용한 생성

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;


public class FileWriterTest {
	
	
	public static void main(String[] args) {
		
		String txt = "테스트입니다!!" ;
		
		String fileName = "C:\\test11.txt" ;
		
		
		try{
						
			// BufferedWriter 와 FileWriter를 조합하여 사용 (속도 향상)
			BufferedWriter fw = new BufferedWriter(new FileWriter(fileName, true));
			
			// 파일안에 문자열 쓰기
			fw.write(txt);
			fw.flush();

			// 객체 닫기
			fw.close(); 
			
			
		}catch(Exception e){
			e.printStackTrace();
		}
		

	}
}


위의 1, 2번 코드는 모두 동일한 형태의 파일을 생성한다. 하지만 성능에는 큰 차이가 발생한다.
기록하고자 하는 파일의 크기가 100K를 넘는다면 FileWriter를 단독으로 쓰기보다는 BufferedWriter + FileWriter

혼합하여 사용하는게 파일 기록할때 속도가 더 빠르다.

아. 물론 위 방법 말고도 Java를 통해 파일 생성하는 법이 여러가지가 있는데,

마찬가지로 최고의 성능은 BufferedWriter + FileWriter 조합이다.

어느 개발자분이 테스트한 자료가 있는데, 그 분은 50K를 넘어가는 시점부터 성능차이가 발생한다고 하였다.


특히 대용량 파일을 생성할때에는 BufferedWriter + FileWriter 를 조합하여 함께 사용하자.
참고로 나같은 경우 대용량 파일을 주기적으로 생성하는데,

이때 파일안에 작성하는 문자열도 String 보다는 StringBuilder나 StringBuffer를 사용해야 한다.


해당 이유는 조만간 포스팅 하도록 하겠다.



ps ) 사실 단순 로그를 남기는것은 log4j 라이브러리를 이용하는게 편하다.

 

반응형



Posted by 궁극의 java개발자
,