Programming/JAVA2012.10.26 12:14

특정 view가 아닌 URL로 redirect 할 필요가 있다.

아래와 같은 방법으로 하면 된다.

절대 @ResponseBody를 붙이면 안 된다.

@RequestMapping("/redirect")
public String redirect(@RequestParam("url") String url) {
    return "redirect:" + url;
}

출처 : http://stackoverflow.com/questions/9311940/redirect-to-dynamic-url-in-spring-mvc

신고
Posted by 초프(초보 프로그래머)
Programming/JAVA2012.09.12 21:07

현재 실행 중인 class 파일의 절대 경로 구하기

String path = MyClass.class.getResource(".").getPath();


출처 : http://mrjh.com/wiki/content.php?no=211&page=5

신고
Posted by 초프(초보 프로그래머)
Project2011.10.06 15:17
우연히 동기의 질문에 오랫만에 다시 YHGCommunication 과 관련된 글을 확인하게 되었습니다.

잘 모르고 빨리 만들다 보니 허접한 코드가 되어 버렸습니다.
이벤트 방식의 메세지 처리, 객체 직렬화 메세지 전송 등 비 효율적인 면이 많이 있었습니다.
이 부분을 좀 더 수정해서 새로운 버전의 YHGComm 을 새로 만들까 하는 욕심이 생깁니다.


주요 수정 사항
1. 받은 메세지 처리 방식 수정
2. 전송되는 메세지 구조 수정
3. 서버에서 다양한 사용자 정보를 관리
4. 사용자 고유 번호 할당
5. Android 에서 UI thread 오류 없이 쉽게 동작

기대 효과
1. 많은 수의 메세지 클래스가 줄어듬
2. 조금 더 효율적인 전송 메세지 크기
3. 서버의 확장성
4. 타 플랫폼(Android)와의 호환성
5. 오류 수정

현재 메세지 처리 방식과 사용자 고유방식 관리에 대해서는 어느 정도 구상이 끝났습니다.
문제가 되는 부분은 전송 메세지 구조입니다. 최소한으로 전송하기 위해 어떻게 해야할지 고민이 되고 있습니다. 
모르는 것이 많다 보니 생각할 것도 많습니다.

언제 작업하고 언제 완성될지 모르겠지만 꼭 해볼렵니다.
이걸 실제로 사용하는 분이 있는지는 모르겠지만...  
신고
Posted by 초프(초보 프로그래머)
Programming/Android2011.08.31 18:15

javaw.exe 의 경로를 지정해 주면 간단히 해결됩니다.

eclipse가 있는 폴더안에 eclipse.ini 파일을 편집기로 여세요.

내용 중에 -vm 이라고 있습니다.

그 다음 줄에 javaw.exe가 있는 경로를 적어주면 끝입니다.

-vm
C:/Program Files/Java/jdk1.6.0_27/bin/javaw.exe
-vmargs

저장후 Eclipse 실행~!

신고
Posted by 초프(초보 프로그래머)
중대 컴공2011.05.27 02:30


IBM Rational Requisite Pro 라는 프로그램과 같은 프로그램을 제작.
JUnit Test, EasyMock 을 사용하여 단위 테스트를 하는 프로젝트!

작업환경
Windows Vista
Eclipse
Java SDK 6.*
Swing

팀인원
5명

실해방법
java -jar RMT.jar


프로그램의 사용 방법
1. 프로젝트 명을 입력하여 새로운 프로젝트를 만든다

 
2. 왼쪽에 있는 프로젝트에 마우스 오른쪽 버튼을 눌러 properties를 클릭한다

 
3. 요구사항 종류를 만듭니다.



4. 요구사항별 속성을 수정합니다. 새로운 속성을 추가하거나 수정할 수 있습니다.

 
5. 모든 설정이 완료되었습니다. 이제 요구사항을 추가하세요.



 
6. 추가한 요구사항들의 관계를 설정하세요.





7. 하나의 요구사항 종류를 선택하여 요구사항을 추적해 보세요!






신고
Posted by 초프(초보 프로그래머)
Project2010.05.13 10:41



  • 입장, 퇴장, 입장, 퇴장 등이 반복하여 일어났을때 생기는 클라이언트 번호 오류 문제를 해결 하였습니다.
  • 기본 제공되는 Message Class 를 최소한으로 줄였습니다.
  • 새로운 Message Class 가 생길때 마다 기존의 Message Class에서 type을 지정하던 것을 변경하여 Message Constants Class를 하나 만들었으며 다른 프로젝트에 적용할 때에는 예제와 같이 상속을 사용함
  • GUI (Swing) 을 이용한 예제


서버 화면으로 3개로 구분하여 로그가 나오게 하였습니다.

알림 / 보낸 메세지 / 받은 메세지 순으로 나옵니다.


클라이언트 화면입니다. 대화명은 테스트이므로 클라이언트 번호로 나오게 하였습니다.



채팅 서버
package yhg.comm.test;

import java.io.IOException;

import yhg.comm.message.Message;
import yhg.comm.server.CommClientManager;
import yhg.comm.server.CommServer;
import yhg.comm.server.ICommClientManagerEvent;
import yhg.comm.server.ICommServerEvent;

public class Server {
	private CommServer server;
	private ServerFrame frame;
	
	public Server(){
		frame = new ServerFrame();
		
		try {
			server = new CommServer(1234);
			setEvent();
			server.start();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		frame.setVisible(true);
	}
	
	private void setEvent(){
		server.setServerEvent(new ICommServerEvent(){
			public void onEnterClient(CommClientManager cm) {
				frame.addNoticeLog("["+cm.getNumber()+"] Enter");
				
				MSGEnterClient msgEC = new MSGEnterClient();
				msgEC.setClientNumber(cm.getNumber());
				try {
					server.sendAll(cm.getNumber(),msgEC);
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			public void onLeaveClient(CommClientManager cm) {
				frame.addNoticeLog("["+cm.getNumber()+"] Leave");

				MSGLeaveClient msgLC = new MSGLeaveClient();
				msgLC.setClientNumber(cm.getNumber());
				try {
					server.sendAll(cm.getNumber(),msgLC);
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		});
		
		server.setClientManagerEvent(new ICommClientManagerEvent(){
			public void onReceiveMessage(CommClientManager cm, Message msg) {
				frame.addReceiveLog("[R]["+cm.getNumber()+"]"+msg);
				
				switch(msg.getType()){
					case MSGConstants.type_MSGChat:
						MSGChat msgC = (MSGChat) msg;
						msgC.setClientNumber(cm.getNumber());
						try {
							server.sendAll(msg);
						} catch (IOException e) {
							e.printStackTrace();
						}
						break;
				}
			}

			public void onSendMessage(CommClientManager cm, Message msg) {
				frame.addSendLog("[S]["+cm.getNumber()+"]"+msg);
			}
		});
	}
	
	public static void main(String[] args){
		new Server();
	}
}

채팅 클라이언트
package yhg.comm.test;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.net.UnknownHostException;

import yhg.comm.client.CommClient;
import yhg.comm.client.ICommClientEvent;
import yhg.comm.message.Message;

public class Client {
	private CommClient client;
	private ClientFrame frame;
	
	public Client(){
		frame = new ClientFrame();
		
		try {
			client = new CommClient("127.0.0.1",1234);
			setEvent();
			client.start();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		frame.setVisible(true);
	}
	
	private void setEvent(){
		client.setClientEvent(new ICommClientEvent(){
			public void onReceiveMessage(Message msg) {
				switch(msg.getType()){
					case MSGConstants.type_MSGEnterClient:
						MSGEnterClient msgEC = (MSGEnterClient) msg;
						frame.addNotice(msgEC.getClientNumber()+" 님 입장");
						break;
					case MSGConstants.type_MSGLeaveClient:
						MSGLeaveClient msgLC = (MSGLeaveClient) msg;
						frame.addNotice(msgLC.getClientNumber()+" 님 퇴장");
						break;
					case MSGConstants.type_MSGChat:
						MSGChat msgC = (MSGChat) msg;
						frame.addChat(msgC.getClientNumber()+"", msgC.getChat());
						break;
				}
			}

			public void onSendMessage(Message msg) {
				
			}
		});
		
		frame.getChatTextField().addKeyListener(new KeyListener(){
			public void keyPressed(KeyEvent arg0) {}

			public void keyReleased(KeyEvent evt) {
				if(evt.getKeyCode() != 10)	return ;
				
				String chat = frame.getChatTextField().getText();
				if(chat.length() == 0)	return;
				
				MSGChat msgC = new MSGChat();
				msgC.setChat(chat);
				
				try {
					client.send(msgC);
					frame.getChatTextField().setText("");
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			public void keyTyped(KeyEvent arg0) {}
		});
	}
	
	public static void main(String[] args){
		new Client();
	}
}

신고
Posted by 초프(초보 프로그래머)
Project2010.03.21 15:38

Message Class 가 좀 이상한거 같아서 바꿨음


그리고 CommClient가 비동기식으로만 동작한다는 것이 좀 문제가 될거 같아서 동기식으로 동작하는 것도 하나 만들어 보았습니다.

말만 거창한거 같네요... 아무것도 없는데 ㅋㅋㅋ

Message Class가 더 필요할 때에는 기존의 클래스를 상속받아서 사용하면 됩니다.

CommSynchronousClient

  • CommSynchronousClient(String address, int port)
    • 생성자이며 서버주소, 포트를 입력으로 받는다
  • boolean connect()
    • 서버에 접속하며 결과를 boolean 으로 리턴한다
  • Message getResponse(Message msg) throws IOException, ClassNotFoundException
    • 서버로 Message를 전송하고 응답 Message를 받는다


아주 간단히 만들었으며 직접 사용시 필요한 것만으로 만들어 보았습니다.


신고
Posted by 초프(초보 프로그래머)
Programming/JAVA2010.03.15 19:13

실수형 데이터에서 소수점을 제한해서 표현하고 싶을때!!!!

예를 들어 소수점 둘째 자리까지만 표기하고 싶을때!! 

그럴때 사용하는 함수가 있습니다. DecimalFormat

여기에 간단한 사용법을 남김과 동시에 버릴 소수점을 어떻게 처리하는지도 비교할수 있도록 같이 올립니다.

setRoundingMode 메소드가 처리하는 방법을 설정하는 함수 입니다.


import java.math.RoundingMode;
import java.text.DecimalFormat;

public class Test {
	public static void main(String[] args) {
		DecimalFormat df = new DecimalFormat("0.##");
		double num[] = {1.977, 1.975, 1.972};
		RoundingMode[] modes = {RoundingMode.UP, RoundingMode.DOWN, RoundingMode.CEILING, RoundingMode.FLOOR, RoundingMode.HALF_UP, RoundingMode.HALF_DOWN, RoundingMode.HALF_EVEN};
		
		for(int n=0; n<3; n++){
			System.out.println("number : "+num[n]);
			
			for(int i=0; i<7; i++){
				df.setRoundingMode(modes[i]);
				System.out.println(modes[i]+" : "+df.format(num[n]));
			}
			
			System.out.println();
		}
	}
}


출력결과

number : 1.977
UP : 1.98
DOWN : 1.97
CEILING : 1.98
FLOOR : 1.97
HALF_UP : 1.98
HALF_DOWN : 1.98
HALF_EVEN : 1.98

number : 1.975
UP : 1.98
DOWN : 1.97
CEILING : 1.98
FLOOR : 1.97
HALF_UP : 1.98
HALF_DOWN : 1.97
HALF_EVEN : 1.98

number : 1.972
UP : 1.98
DOWN : 1.97
CEILING : 1.98
FLOOR : 1.97
HALF_UP : 1.97
HALF_DOWN : 1.97
HALF_EVEN : 1.97




자세한 사항은 http://java.sun.com/javase/7/docs/api/java/text/DecimalFormat.html 여기서 확인 하세요....

신고
Posted by 초프(초보 프로그래머)
Project2010.03.10 23:42

 




작성한 서버와 클라이언트 클래스를 이용해서 안드로이드와 데스크탑의 채팅을 만들어 보았습니다.

기존의 채팅서버와 채팅 클라이언트는 많이 변하지 않았고

안드로이드 클라이언트 추가가 주가 되었습니다.

안드로이드 실행시에는 아이피를 수정해주셔야 합니다~


신고
Posted by 초프(초보 프로그래머)
Project2010.03.10 23:20



만든지 얼마 지나지 않아... 혼자 테스트중 버그들이 발견되어 수정하였습니다.

  • 클라이언트 번호 할당 방식
  • MSGConnectServer 클래스 추가

 

신고
Posted by 초프(초보 프로그래머)