유한상태기계(Finite State Machine, FSM)


 > 장치나 모델이 가질 수 있는 유한개의 상태를 정의하고, 조건에 맞는 이벤트가 발생되면 해당 상태로 변경되는 방식으로 동작하는 것을 유한상태기계라 한다.


 e.g. 전등의 스위치는 ON일때 불이 들어오고, OFF일때 불이 꺼진다. 

      이런 형태로 정해진 이벤트를 받아서 동작하는 장치나 모델을 보고 유한상태기계라 한다.

'java > etc' 카테고리의 다른 글

[etc] - enum 사용 예  (0) 2014.12.24
Domain name to ip address  (0) 2012.05.15
[URL] - FTP 접속 URL  (0) 2012.05.15
[AES] - 256bit 키를 인식하지 못할 때 사용하는 방법  (0) 2011.11.30
[etc] - 테스트 유형  (0) 2010.12.21
Posted by 짱가쟁이


Local 디렉토리에 있는 파일을 다운로드하는 예제 소스


** 컨트롤러

@RequestMapping(value="/demo/download.do")

public void download(

 HttpServletRequest request

, HttpServletResponse response) throws Exception {

// 다운로드 파일 정보 조회

String downloadFilePath = "/tmp/original.jpg";

InputStream inputStream = getFileInputStream(downloadFilePath);

// HTTP 다운로드 프로토콜 정의

ServletContext context = request.getSession().getServletContext();

int contentLengt = inputStream.available();

setHttpDowndloadProtocol(context, response , downloadFilePath, contentLengt);

// 다운로드 파일 쓰기

OutputStream outStream = response.getOutputStream();

writeToResponse(inputStream, outStream);


inputStream.close();

outStream.close();

}



- 다운로드 파일 조회

private InputStream getFileInputStream(String downloadFilePath) throws FileNotFoundException {

File downloadFile = new File(downloadFilePath);

return new FileInputStream(downloadFile);

}


- HTTP 다운로드 프로토콜 정의

private void setHttpDowndloadProtocol(

 ServletContext context

, HttpServletResponse response

, String downloadFilePath

, int contentLength) {

String mimeType = getMimeType(context, downloadFilePath);

response.setContentType(mimeType);

response.setContentLength(contentLength);


String contentDisposition = String.format("attachment; filename=\"%s\"", "download.jpg");

response.setHeader("Content-Disposition", contentDisposition);

}


private String getMimeType(

  ServletContext context

, String downloadFilePath) {

String mimeType = context.getMimeType(downloadFilePath);

if (mimeType == null) {

  mimeType = "application/octet-stream";

}

return mimeType;

}


- 다운로드 파일 쓰기

private void writeToResponse(

  InputStream inputStream

, OutputStream outStream) throws IOException {

byte[] buffer = new byte[1024];

int bytesRead = -1;


while ((bytesRead = inputStream.read(buffer)) != -1) {

  outStream.write(buffer, 0, bytesRead);

}

}


Posted by 짱가쟁이
2014. 12. 24. 16:05

이름이 부여된 열거체(enumeration)을 사용하면 상수를 사용하는 것보다 훨씬 더 유연하고 서술적인 코딩이 가능하다.


- enumexample class

public enum LevelGrade {

LEVEL1 {

public double rate() {

return 1.0;

}

},

LEVEL2 {

public double rate() {

return 2.0;

}

},

LEVEL3 {

public double rate() {

return 3.0;

}

};

public abstract double rate();

}


- JUnit Test Case

public class TestUnit {

LevelGrade grade;

@Test

public void testLEVEL1() {

grade = LevelGrade.LEVEL1;

assertEquals(grade.rate(), 1.0, 0.0);

}

@Test

public void testLEVEL2() {

grade = LevelGrade.LEVEL2;

assertEquals(grade.rate(), 2.0, 0.0);

}

@Test

public void testLEVEL3() {

grade = LevelGrade.LEVEL3;

assertEquals(grade.rate(), 3.0, 0.0);

}

}


출처 : 클린코드

'java > etc' 카테고리의 다른 글

유한상태기계(Finite State Machine, FSM)  (0) 2016.05.24
Domain name to ip address  (0) 2012.05.15
[URL] - FTP 접속 URL  (0) 2012.05.15
[AES] - 256bit 키를 인식하지 못할 때 사용하는 방법  (0) 2011.11.30
[etc] - 테스트 유형  (0) 2010.12.21
Posted by 짱가쟁이
2014. 12. 22. 13:31




Spring MVC

스프링에서 지원하는 서블릿 기반의 MVC 프레임워크


DispatcherServlet(Front Controller)

프레젠테이션 계층의 제일 앞단에서 서버로 들어오는 모든 요청을 먼저 받아서 처리함. 클라이언트가 보낸 요청을 받아서 공통적인 작업을 먼저 수행한 후에 적절한 세부 컨트롤러로 작업을 위임해주고, 클라이언트에게 보낼 뷰를 선택해서 최종 결과를 생성하여 응답을 전송함


HandlerMapping

클라이언트의 요청 URL과 매핑되는 컨트롤러를 결정함

Controller

URL과 매핑되는 세부 컨트롤러로 요청을 처리한 뒤, 결과를 DispatcherServelet에게 전달


ModelAndView

컨트롤러가 처리한 결과 정보 및 뷰를 선택한 정보를 담음


ViewResolver

컨트롤러의 처리 결과를 생성할 뷰를 결정

View

컨트롤러의 처리 결과 화면을 생성. JSP 또는 Velocity 템플릿 파일 등을 뷰로 사용



Posted by 짱가쟁이



Servlet

웹 페이지를 동적으로 생성하는 서버측 프로그램을 말하며, 흔히 서블릿이라 불린다.


서버측 프로그램

서버에서 실행되는 작은 프로그램.

Ex> JSP -> 컴파일 -> 서블릿 변환 -> 서버에서 구동


Container

서블릿의 Lifecycle을 관장하는 소프트웨어(모듈)을 "컨테이너"라 불린다.


Lifecycle

컨테이너는 클라이언트의 요청을 받으면 URL에 매핑하는 서블릿을 생성하고 생성된 서블릿은 정의된 비즈니스를 수행하고 소멸한다.


Role of Container

Communication 지원

서블릿과 웹서버의 통신을 담당. 컨테이너가 없다고 가정하면, 웹서버의 요청을 대기하는 리스너를 만들어 해당 요청(URL)과 서블릿을 매핑해야 하는 과정을 거쳐야 함. 컨테이너는 이런 복잡한 통신 기능을 API로 제공함.

- Lifecycle 관리

클라이언트의 요청(URL)이 들어오면 해당 URL과 매핑되는 서블릿의 인스턴스를 생성하고, 초기화 메소드를 호출. 서블릿의 수명이 다하면 적절하게 가비지 컬렉션을 수행한다. 즉 서블릿의 탄생과 죽음을 관리한다.


- Multi-Thread 지원

컨테이너는 클라이언트의 요청이 들어오면 서블릿을 처리하기 위한 새로운 쓰레드를 생성하고, 작업이 끝난 쓰레드는 반환하여 다중 요청에 대한 안정적인 동시성을 지원함


- 선언적 보안관리(??)


- JSP 지원





Posted by 짱가쟁이


$( "#startDt, #endDt" ).datepicker({

                 dateFormat: 'yy-mm-dd'

               , changeMonth: true

               , changeYear: true

               , nextText: '다음 '

               , prevText: '이전 '

               , showButtonPanel: true

               , beforeShow: function (input) {

                     setTimeout(function() {

                            var nextYearBtn = $("<button>이후 </button>");

                                 nextYearBtn.unbind("click").bind("click", function() {

                             $.datepicker._adjustDate($(input), +1, 'Y');

                                 });

                                 var preYearBtn = $("<button>이전 </button>");

                                 preYearBtn.unbind("click").bind("click", function() {

                             $.datepicker._adjustDate($(input), -1, 'Y');

                                 });

                                

                        $(".ui-datepicker-buttonpane")

                           .html('')

                           .append(nextYearBtn)

                           .append(preYearBtn);

                       }, 1);

               }

                    , onChangeMonthYear:function(y, m, i){                               

                           setTimeout(function() {

                                 var nextYearBtn = $("<button>이후 </button>");

                                 nextYearBtn.unbind("click").bind("click", function() {

                             $.datepicker._adjustDate($(i.input), +1, 'Y');

                                 });

                                

                                 var preYearBtn = $("<button>이전 </button>");

                                 preYearBtn.unbind("click").bind("click", function() {

                             $.datepicker._adjustDate($(i.input), -1, 'Y');

                                 });

                                

                        $(".ui-datepicker-buttonpane")

                           .html('')

                           .append(nextYearBtn)

                           .append(preYearBtn);

                       }, 1);

                 }

             });//.val(getFormatDate(new Date())) defaultDate : $(this).val()


Posted by 짱가쟁이

window.open('','_self').close();

Posted by 짱가쟁이

"01012341234" 형태로 저장된 전화번호를 "-" 구분자를 넣은 포맷으로 변경하고 싶을 때 정규식을 사용하면 편하게 개발이 가능하다.


1. 전화번호 포맷 변경

public static String makePhoneNumber(String phoneNumber) {

  String regEx = "(\\d{3})(\\d{3,4})(\\d{4})";

  

  if(!Pattern.matches(regEx, phoneNumber)) return null;

  

  return phoneNumber.replaceAll(regEx, "$1-$2-$3");

  

   }



2. 테스트

System.out.println(makePhoneNumber("01012341234"));

System.out.println(makePhoneNumber("0101231234"));


결과

010-1234-1234

010-123-1234



'java > util' 카테고리의 다른 글

[util] - 자바 문자열 압축/압축풀기  (0) 2011.11.14
[util] - 특정 디렉토리 파일 목록 출력하자.  (0) 2011.06.17
[InputStream] - String to InputStream  (1) 2010.10.13
[util] - byte to hex string  (0) 2010.09.07
[java] - replaceNull  (0) 2010.07.05
Posted by 짱가쟁이

OS : linux centos 6.2

서버 구성 : DataInputStream으로 데이터를 읽고, DataOutputStream 으로 데이터 전송.


서버를 윈도우에서 구동하고, 클라이언트 구성 시 BufferReader를 사용해서 readLine()으로 읽으니 문제없이 동작하던 코드가 리눅스로 이관하니 데이터 전송은 문제가 안되는데, 데이터 수신 시 읽을 데이터가 없다고 하더라.. 뭔 짓인지..


어쩔 수 없이 클라이언트 코드를 변경하여 BufferReader 대신 DataInputStream 으로 교체하고 데이터를 수신하려고 하는데, readLine()이 없으니 상당히 귀찮더라. DataInputStream 에서 전체 데이터 읽기 위해서는 아래와 같이 하면 되더라.


ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte byteBuffer[] = new byte[1024];
               
for(int i; (i=dis.read(byteBuffer)) != -1; )
{
    baos.write(byteBuffer, 0, i);
}

byte result[] = baos.toByteArray();


'java > socket' 카테고리의 다른 글

[socket] - Advanced Socket Programming  (0) 2010.06.30
Posted by 짱가쟁이
2012. 5. 15. 14:50

DNS 서버로 IP address 를 조회해서 출력하는 듯.


InetAddress inetAddress = InetAddress.getByName("www.google.co.kr");


System.out.println(inetAddress);

System.out.println(inetAddress.getCanonicalHostName());

System.out.println(inetAddress.getHostName());

System.out.println(inetAddress.getHostAddress());


결과

www.google.co.kr/74.125.71.94

hx-in-f94.1e100.net

www.google.co.kr

74.125.71.94


'java > etc' 카테고리의 다른 글

유한상태기계(Finite State Machine, FSM)  (0) 2016.05.24
[etc] - enum 사용 예  (0) 2014.12.24
[URL] - FTP 접속 URL  (0) 2012.05.15
[AES] - 256bit 키를 인식하지 못할 때 사용하는 방법  (0) 2011.11.30
[etc] - 테스트 유형  (0) 2010.12.21
Posted by 짱가쟁이