'프로그래밍/Java'에 해당되는 글 26건

  1. 2015.10.09 스프링(Spring)에서 세션(Session) 기반 로그인 처리하기
  2. 2015.08.07 자바 객체로 구성된 리스트 정렬하기
  3. 2015.06.01 이클립스 자바 프로젝트 설정하기~ (1)
  4. 2015.05.27 자바 URL과 URLConnection을 활용한 POST 방식 데이터 보내고 받기~ (1)
  5. 2012.08.22 Java 서블릿을 활용한 엑셀파일 다운로드 기능 구현
  6. 2012.08.19 임시 비밀번호 생성하는 간단한 자바 소스
  7. 2012.08.02 자바 컴파일러 버그로 인한 Ant Build 오류 처리~
  8. 2012.07.30 이클립스(Eclipse) 개발환경을 UTF-8로 설정하기 (1)
  9. 2012.07.18 Java에서 표준시(Global Time)와 지방시(Local time)를 상호 변경하는 함수
  10. 2012.07.16 Static 키워드 알고 사용하기~

스프링(Spring)에서 세션(Session) 기반 로그인 처리하기

|



일반적으로 쿠키나 세션을 활용해서 로그인 처리를 많이 한다. 

스프링 기반에서 인터셉트를 통해 세션 로그인 처리를 하는 부분을 정리해 보려고 한다. 


전체적인 과정은 다음과 같다. 

로그인 체크 인터셉터를 만든 다음, applicationContext.xml에 해당 인터셉터를 설정한다. 

마지막으로 로그인 처리 중에 세션에 정보를 저장하면 된다. 

이후, 인터셉터가 지정된 URL에 접근할 때는 로그인 체크 인터셉터를 통해서 로그인 여부를 확인하게 된다. 


인터셉터를 활용한 흐름도는 다음과 같다. 



로그인 체크 인터셉터

먼저 세션 정보가 있는지 여부를 확인하는 인터셉터를 만들어 보자. 


세션이 존재하지 않거나, 사용자 정보가 세션에 없으면 다시 로그인 화면으로 이동하도록 구성한 인터셉터이다. 

이어서 위 인터셉터를 적용할 페이지를 applicationContext.xml에 다음과 같이 지정한다. 



applicationContext.xml 설정


다른 부분은 생략하고 <mvc:interceptors>로 인터셉터를 설정하는 부분만 포함했다. 

"/mini.do"와 같이 특정 페이지만 지정할 수 있고, 

"/admin/**"와 같은 형태로 특정 폴더 아래를 모드 지정할 수도 있다. 


세션 설정

이제 로그인 처리 중에 다음과 같이 세션에 정보를 등록하면 된다. 


마지막으로 사용하는 member VO 객체의 형태는 다음과 같다. 

Serializable을 구현한 부분만 참고하면 된다. 

"java.lang.IllegalArgumentException: setAttribute: Non-serializable attribute" 에러가 발생할 경우에 Serializable을 구현해 줘야 한다. 





Trackback 0 And Comment 0

자바 객체로 구성된 리스트 정렬하기

|



자바에서 리스트의 정렬은 Collections.sort() 메소드를 이용해서 쉽게 수행할 수 있다. 

리스트의 값이 기본 타입일 경우에는 바로 Collection.sort(list)를 적용하면 된다. 


만약 리스트의 값의 자체적으로 만든 객체(Object)일 경우, 어떻게 처리해야 할까? 

우선 Comparator 인터페이스를 구현해서 내부에 compare 메소드로 정렬할 방식을 정한다. 

그리고 Collection.sort를 호출할 때 Comparator 인터페이스를 구현한 클래스의 객체를 전달하면 된다. 


예제를 통해서 살펴보도록 하자~

먼저 name과 volume의 멤버 변수를 가진 MiniVo 객체를 다음과 같이 만든다. 


volume을 기준으로 정렬을 해 볼 예정이며, 좀 더 다양한 경우를 고려해서 실제값은 숫자형이지만 String으로 선언했다. 


이어서 정렬을 위한 리스트를 다음과 같이 구성한다. 

ArrayList를 활용해서 3개의 데이터를 입력하고 순서대로 출력하는 부분까지 포함했다. 


그리고 Comparator 인터페이스를 구현한 클래스의 객체를 생성하고, Collections.sort를 통해 정렬한 뒤 결과 값을 확인하는 소스다.



마지막으로 MiniComparator 클래스를 구현한 부분을 살펴보자. 

여기서 중요한 부분은 compare 메소드를 처리하는 부분이다. 


compare 메소드는 MiniVo 객체를 두개 받아서 voulme 값을 Double 형으로 변환하고 

두 수를 비교해서 결과값을 0, 1, -1로 리턴하는 함수이다. 

이 예제에서는 내림차순으로 정렬했다. 오름차순이 필요하면 1과 -1의 리턴값을 바꾸면 될 것이다. 


실행 결과를 살펴보면 다음과 같이 내림차순으로 객체들이 정렬된 것을 확인할 수 있다. 


실행하기 위한 전체 소스는 다음과 같다. 






Trackback 0 And Comment 0

이클립스 자바 프로젝트 설정하기~

|



이클립스를 사용하다보면 가끔 자바 프로젝트인데도 일반 프로젝트로 인식해서 자바 관련 설정 항목들이 프로퍼티에서 나오지 않는 경우가 있다. 

이런 경우, SVN 서버에 접속해서 프로젝트를 다시 신규로 Check out 하기도 하는데

아예 .project 파일을 수정해서 해당 항목이 제대로 나오도록 구성하는 방법을 정리해 보려고 한다. 


자바 프로젝트의 경우, 아래와 같이 프로퍼티 또는 속성에서 Java Build Path 등 설정항목이 보인다. 


다음은 이런 설정 항목이 사라졌을 때 처리하는 방법이다. 

일반 프로젝트를 자바 프로젝트로 변경하는 것도 동일하게 처리하면 된다. 


프로젝트 폴더의 .project 파일을 텍스트 편집기로 연다. 

숨김 파일로 되어 있으므로 숨김 파일을 볼 수 있도록 설정을 바꾸거나 ls -al 과 같은 옵션을 줘야 한다. 


.project 파일에서 buildCommand 태그와 nature 태그에 다음과 같이 추가하면 이클립스에서 위와 같은 자바 설정이 나타나게 된다. 




Trackback 0 And Comment 1
  1. coder 2016.08.11 13:06 address edit & del reply

    딱 제가 찾고있던 내용이네요^^
    좋은 포스팅 감사드립니다.

자바 URL과 URLConnection을 활용한 POST 방식 데이터 보내고 받기~

|



자바 URL과 URLConnection 클래스

자바에는 java.net.URL 클래스를 통해 URL 주소를 인식할 수 있으며, 프로토콜, 도메인, 포트, 경로 등을 지정할 수 있다.

URLConnection을 통해 자바에서 웹페이지에 접속하기 위해서는 URL 주소를 java.net.URL 클래스로 변경할 필요가 있다.  


다음 두 가지 방법으로 URL 클래스를 생성할 수 있는데, 일반적으로 문자열을 받아서 처리하는 2번째 방법을 많이 사용한다. 

URL url = new URL("http", "blog.acronym.co.kr", 80, "537");
URL url = new URL("http://blog.acronym.co.kr/537");


해당 URL에서 페이지 정보를 가져오기 위해서 다음과 같이 URLConnection을 사용한다. 

URLConnection conn = url.openConnection();


URL 클래스와 URLConnection 클래스를 사용할 때는 각각 MalformedURLException과 IOException을 처리해줘야 한다. 

기본적인 소스의 형태는 다음과 같다. 


자바에서 웹 페이지 가져오기

위에서 설명한 대로 해당 URL에 접속한 다음 웹 페이지의 HTML을 가져오면 된다. 

데이터를 읽어오기 위해 예전에는 BufferedReader 클래스를 사용했지만, 최근에는 Scanner 클래스를 더 많이 사용하는 편이다. 

Scanner 클래스는 데이터의 타입에 따라 읽어올 수 있다는 장점이 있지만 웹 페이지 읽는데는 큰 차이는 없다. 

BufferedReader의 예제는 많으므로 여기에서는 Scanner로 읽어보도록 하자. 


17-24 라인을 보면, scan.nextLine() 메소드로 해당 URL의 값을 한줄씩 읽어와서 화면에 다음과 같이 출력한다. 



자바에서 GET 방식으로 데이터 보내기

Get 방식은 URL에 다음과 같이 매개변수를 붙여넣으면 된다. 

http://www.word.pe.kr/url.php?name=mini&age=18&email=...


그래서 Get 방식으로 데이터 보내는 것은 앞의 웹 페이지 가져오는 부분에서 URL만 변경하면 된다. 

단, 웹으로 데이터를 전송하는 것이기 때문에 URLEncoder를 통해 인코딩을 한 후 전달하면 된다. 


14번째 줄과 16번째 줄만 변경되었으므로 확인하면 된다. 

그리고 웹에서 캐시를 사용하지 않도록 할 경우, 19번째 줄에 conn.setUseCache()메소드를 통해 false로 넣으면 된다. 


자바에서 POST 방식으로 데이터 보내기 

POST 방식으로 처리하기 위해서는 먼저 URLConnection 객체에 몇가지 설정을 해야 한다. 

먼저 setDoOutput() 메소드를 true로 설정해서 URL을 연결하고 데이터를 기록한다고 알려줘야 한다. 

그리고 나서 setRequestProperty() 메소드로 ContentType 등을 지정해준다. 


데이터를 쓰기 위해서는 DataOutputStream을 이용해 URLEncoding 된 문자열을 쓰면 된다. 

전체 소스를 살펴보자. 


최종 결과는 화면은 다음과 같다. 




Trackback 0 And Comment 1
  1. 초보자 2016.08.29 00:09 address edit & del reply

    이렇게할경우 node.js express로 만든 서버에서 데이터를 받을수 있나요??

Java 서블릿을 활용한 엑셀파일 다운로드 기능 구현

|



Java Servlet을 활용해서 엑셀파일을 다운로드 하는 예제를 살펴보도록 하겠습니다. 

일반 텍스트 파일인 CSV와 달리 엑셀로 다운로드 하기 위해서는 jxl.Workbook이라는 클래스가 필요합니다. 

필요한 jxl.jar 파일은 다음에서 다운로드 할 수 있습니다. 

jxl.jar


웹 프로젝트 설정


index.jsp 파일 생성

먼저 파일 다운로드를 위한 화면을 만들어 보도록 하겠습니다. 

이 파일은 엑셀로 저장할 데이터를 서블릿으로 넘겨주는 역할을 하게 됩니다. 

이름을 index.jsp로 하고 다음과 같이 구성해 봤습니다. 


먼저 data라는 변수에 엑셀로 저장할 데이터를 넣었습니다. 여기에서는 컴마로 구분된 값을 전달하는 것으로 했습니다. 

(이 부분은 굉장히 자유롭게 구성할 수 있습니다. 

예를 들면 HTML 파일을 가져와서 파싱해서 엑셀로 저장하는 형태도 고려해 볼 수 있겠죠. 

이럴 때 지난번에 설명한 JSoup 과 같은 라이브러리를 활용 할 수 있을 겁니다.)


이어서 HTML Form을 사용해서 서블릿 miniexport로 파일 다운로드를 요청합니다. 


web.xml 설정

서블릿을 등록하기 위해서 web.xml을 수정해야 합니다. 

다음과 같이 간단하게 miniexport를 서블릿으로 등록할 수 있습니다. 


<servlet>과 <servlet-mapping>으로 miniexport를 설정한 것을 볼 수 있습니다. 


라이브러리 복사

마지막으로 위에서 다운로드한 jxl.jar 파일을 web/WEB-INF/lib 폴더로 복사합니다. 

드디어 준비과정이 모두 끝났습니다. 

이제 남은 것은 web.xml에서 설정한 mini.servlet.MiniExportServlet 파일을 작성하면 됩니다.


엑셀 다운로드를 위한 서블릿 구성 


다음과 같은 두 단계를 거쳐서 서블릿을 구성하면 됩니다. 


1. 엑셀파일 생성하기 

먼저 Workbook.createWorkbook()을 이용해서 엑셀 파일을 하나 생성합니다. 

이때, 서버의 특정 폴더에 파일을 생성해야 하는데요. 리눅스 계열이라면 해당 폴더에 접근 권한이 있어야 함을 반드시 유의해 주세요~


이어서 createSheet() 메소드르 통해서 하나의 엑셀 시트를 생성합니다. 

엑셀 하단에 보면 워크시트라고 있죠.. 그 부분에 해당합니다. 


서버로부터 전달받은 데이터를 분석해서 생성된 엑셀파일에 저장합니다. 

addCell() 메소드로 데이터를 특정 위치에 추가할 수 있습니다. 


마지막으로 write() 메소드를 통해 엑셀 파일을 저장합니다. 


2. 엑셀 다운로드 하기 

엑셀 파일은 텍스트가 아니므로 header 를 수정해서 binary로 받을 수 있도록 설정해야 합니다. 

그래서 response 객체의 setContentType이나 setHeader를 활용해서 적절하게 세팅합니다. 

소스를 보시고 그대로 따라하셔도 됩니다.~


그리고 1번에서 생성된 파일을 열고 스트림으로 출력한 다음 마지막에 생성된 임시파일을 삭제합니다. 


다음 소스를 보면 위의 글들이 쉽게 이해가 될 것입니다. 



위 예제를 실행하면 다음과 같습니다. 

"엑셀 파일 다운로드" 버튼을 클릭하면 하단처럼 "mini.xls" 파일이 다운로드 되는 것을 확인할 수 있습니다. 






Trackback 0 And Comment 0

임시 비밀번호 생성하는 간단한 자바 소스

|



비밀번호 찾기 기능에서 임시 비밀번호 생성이나 

키 값을 만들 때, 일련번호 뒤에 붙이고 싶은 문자들을 랜덤하게 생성할 때 사용할 수 있는 소스입니다. 


기본적으로 charSet을 숫자, 알파벳 등으로 설정하구요.. 

java의 random함수인 Math.random() 을 사용해서 처리했습니다. 


Math.random() 함수는 0 ~ 1 사이의 임시 값을 제공합니다. 

정확하게는 0.0 이상 1.0 미만의 double 형의 실수값을 반환합니다. 

즉, 1.0의 값은 절대로 나올 수가 없습니다. 


그래서 만약 1 ~ 10 사이의 임시값을 구하려면 다음과 같은 코드를 사용하죠.. 


int n = (int) (Math.random() * 10) + 1;


(int) (Math.random() * 10) 을 통해서 0 ~ 9 사이의 임시값이 나오게 됩니다. 

여기에 1을 더함으로써 1 ~ 10 사이의 임시값이 정해 지겠죠.. 


우리가 사용할 charSet 배열은 0 부터 시작하므로 이렇게 계산할 필요는 없을 것입니다. 

그럼.. 소스를 보시죠.. 



실행 결과는 다음과 같습니다. 


임시비밀번호: GPZJfmJ9Kd


간단하면서도 유용한 팁이었습니다.~




Trackback 0 And Comment 0

자바 컴파일러 버그로 인한 Ant Build 오류 처리~

|



혹시 다음과 같은 오류 메시지를 보신 적이 있으신가요? 

type parameters of <T>T cannot be determined; no unique maximal instance exists for type variable T with upper bounds int,java.lang.Object


Eclipse에서는 이런 메시지가 나타나지 않지만 Ant Build로 서버에서 컴파일하려고 하면 나타나는 경우가 있습니다 

에러 메시지를 살펴보면 매개변수의 타입이 정의되지 않았다는 것 같은데요. 

int, java.lang.Object와  같이 명확하게 사용하라는 것 같습니다. 


해당 오류를 찾아보니 자바 컴파일러의 버그 라고 하네요. 

http://bugs.sun.com/view_bug.do;jsessionid=b25465a8a4d3cffffffffdd0a31aeee673b4?bug_id=6973465


위 글을 참고하면 우회할 수 있는 해결책(workaround)을 제시해 주고 있는데요. 

Workaround is to cast return value to appropriate wrapper type before performing assignment:


바로 Cast 연산자를 통해서 리턴 타입을 다음과 같이 명시하면 된다고 합니다. 

int i2 = (Integer)getValue();

float f2 = (Float)getValue();


테스트 해보니 잘 되네요. 

이클립스에서는 컴파일이 오류 없이 되다가 서버에 Ant Build로 적용할 때 나타날 수 있는 오류이니 알아두시면 도움이 될 것 같습니다. 





Trackback 0 And Comment 0

이클립스(Eclipse) 개발환경을 UTF-8로 설정하기

|



이클립스가 이번에 Juno Release가 되었는데요. 디자인이 훨씬 깔끔해졌네요. 


그런데 이클립스를 새로 설치할 때마다 인코딩이 기본으로 EUC-KR로 설정이 되어 있습니다. 

그래서 기존 프로젝트를 SubVersion 등에서 받아보면 한글이 깨지는 것을 알 수 있죠.. 

인코딩 설정을 UTF-8로 바꾸면 되는데.. 가끔 작업하는 것이라 변경하는 부분을 자주 잊어버리게 되네요. 

그래서 이클립스에서 텍스트 설정하는 것에 대해서 모두 모아 봤습니다. 


이클립스(Eclipse) 기본 설정에서 UTF-8 변경하기

먼저 이클립스 기본 설정을 UTF-8로 지정하기 위해서 환경 설정(Preference)로 들어가야 합니다. 

윈도우에서는 Windows > Preferences.. 로 들어가면 되구요. 맥에서는 Eclipse > 환경 설정...으로 들어가면 됩니다. 


먼저 General > Workspace > Text file encoding에 대해 다음과 같이 UTF-8로 설정합니다. 


여기까지만 해도 기본적인 설정은 되겠지만 인코딩과 관련된 모든 부분을 설정해 보도록 하겠습니다. 

이어서 Java Class 파일에 대한 Content type도 UTF-8로 변경해 줍니다. 

General > Content Types에서 윗부분의 Java Class File을 선택하시고 아래 부분의 Default encoding을 UTF-8로 지정하시면 됩니다. 


마지막으로 Spelling 관련 부분에도 인코딩 설정이 있습니다. 

General > Editor > Text Editors > Spelling 에서 Dictionaries의 Encoding을 UTF-8로 변경합니다. 


이클립스(Eclipse) 프로젝트에서 UTF-8로 변경하기 

가끔은 위와 같이 세팅을 안한 상태에서 SubVersion의 소스를 가져온 경우가 있습니다. 

이 경우, 소스를 다시 받지 않고 해당 프로젝트의 인코딩만 UTF-8로 변경할 수 있습니다. 

이런 방식으로 이클립스의 UTF-8 환경에서 특정 프로젝트만 EUC-KR로 설정할 수도 있겠죠. 


먼저 프로젝트를 선택하고 오른쪽 버튼을 클릭합니다. 그리고 나서 Properties를 선택합니다. 

Properties에서 Resources를 선택하고 Text file encoding을 원하는 인코딩으로 설정해 줍니다. 


이클립스 더 알아보기

이클립스의 단축키

자주 사용하는 단축키 정도는 알아두세요. 




Trackback 0 And Comment 1
  1. 미니~ 2012.08.21 21:24 신고 address edit & del reply

    Web 프로젝트 생성시 HTML, CSS, JSP 파일은 EUC-KR로 인코딩 되는 경우가 있을 겁니다.

    이 경우에는 "Preference > Web > JSP Files "에서 각 파일의 인코딩을 UTF-8로 변경하시면 됩니다.

    이것도 함께 참고하세요~

Java에서 표준시(Global Time)와 지방시(Local time)를 상호 변경하는 함수

|



Global 서비스를 준비하다보면 고려해야 하는 것 중 하나가 시간대와 관련된 이슈입니다. 

보통 UCT 또는 GMT라고 하는 표준 시간대가 있구요. 그리고 국내에서 사용하는 Local 시간대(지방시)가 있습니다. 

표준시 기준으로 국내는 GMT+9라고 표시하는데요. 표준시보다는 9시간이 빠르다고 합니다. 


표준시는 영국왕립 그리니치 천문대를 기준으로 동쪽으로 경도 15도씩 갈때마다 1시간씩 빠르고

반대로 서쪽으로 경도 15도씩 갈때마다 1시간씩 늦어진다고 합니다. 

이런 이슈로 얼마전 TV에서 아프리카의 한 집에서 경계선을 중심으로 오늘과 내일이 공존하는 것을 본 기억이 있네요.. ^^


UTC/GMT와 Local Time 시간 변환 함수


가끔은 Global  서비스를 준비할 때 표준시와 지방시를 상호 변환하는 기능이 필요할 수 있습니다. 

이와 관련되어 잘 만들어진 소스가 있어 소개해 보려고 합니다. (http://donghunl.tistory.com/40)



위 소스에서 다른 부분은 쉽게 이해가 될 것 같습니다. 

다만, 파라미터로 넘어가는 long 타입은 Date 포맷의 변수에서 getTime() 메소드를 통해 반환된 값입니다.


Date Format을 활용해서 UCT/GMT를 LocalTime으로 변환하기


실제로 사용할 때는 "20120713064755"와 같은 형태로 된 시간을 변경해야 하는 경우가 있을 듯 합니다. 

이럴때는 지난번에 설명한 SimpleDateFormat 을 활용하면 되는데요. 

간단하게 표준시를 LocalTime으로 변경하는 소스를 정리해 봤습니다. 



중간에 주석을 달아놨으니 그리 어렵지 않게 이해할 수 있을 듯 합니다. 





Trackback 0 And Comment 0

Static 키워드 알고 사용하기~

|



Java 프로그래밍을 하다보면 static 메소드나 static 변수가 자주 사용되는 것을 볼 수 있습니다. 

일반적으로 static 변수나 메소드를 사용할 때 적절한지 여부 보다는 계속 사용해 왔으니 하면서 습관적으로 쓰는 경향이 있는 것 같습니다. 

예를 들면, log4j를 활용한 Logger 변수를 선언하거나 

유틸리티 클래스를 만들어 사용할 때 메소드를 static으로 선언하는 경우가 종종 있습니다. 


Static 장단점


그런데 혹자들은 가능하면 static을 사용하지 않는 것이 좋다고도 합니다. 

예전의 함수 위주의 절차적 프로그래밍에서의 전역변수 처럼 static을 사용하면 프로그램의 오류가 양산될 수 있고, 디버깅 하기도 어렵기 때문이기도 합니다. 


static 변수를 선언할 경우, 프로그램 어디에서든지 객체를 생성하지 않고도 접근할 수가 있습니다. 

이럴 경우, 여기 저기에서 해당하는 변수 값 즉 상태를 변경하게 되면 프로그램이 꼬일 수 있다는 것이죠. 

그래서 자바에서 보면 static 변수에 final이라는 키워드가 붙어 있는 것을 볼 수 있습니다. 

즉, 상태 값을 변경할 수 없다는 것이죠. 


그래도 static을 사용하면 객체를 생성하지 않고 변수에 접근하거나 메소드를 실행할 수 있기 때문에 속도가 빠르다는 장점이 있습니다. 

이런 측면에서 static의 사용을 권장하는 경우도 상당히 많습니다. 

실제로 java의 내장 메소드들 중에도 Math 클래스와 같이 static으로 정의된 것도 꽤 많이 있습니다. 

static 메소드를 사용할 경우, static이 아닌 인스턴스 변수는 호출할 수 없다는 한계도 있습니다. 


Static 활용하기


종합하면 다음과 같은 상황들을 고려해서 static을 사용할지 여부를 결정하는 것이 바람직할 것 같습니다. 

1. 클래스 설계시 멤버 변수 중에 모든 인스턴스에서 공통으로 사용해야 하고 상태 값이 변경되지 않는 경우에는 static 변수를 사용한다. 

2. 클래스 설계시 메소드 중 내부의 인스턴스 변수를 사용하지 않는 것은 static 메소드를 사용한다. 


속도나 접근성 측면에서 static의 장점이 분명히 있고 실제로도 많이 사용되는 키워드 이기 때문에 

한번쯤 왜 써야 하는지 생각해 보고 활용하는 것이 좋을 것 같아서 정리해 봤습니다. 





Trackback 0 And Comment 0
prev | 1 | 2 | 3 | next