모델1의 아키텍쳐

모델2의 아키텍쳐
 

모델1
Model 1의 장점
§   개발 속도가 빠르다.
§   개발자의 스킬이 낮아도 배우기 쉬워 빠르게 적용할 수 있다.
Model 1의 단점
§   JSP페이지에서 프리젠테이션 로직과 비즈니스 로직을 모두 포함 때문에 JSP페이지가 너무 복잡해 진다.
§   프리젠테이션 로직과 비즈니스 로직이 혼재되어 있기 때문에 개발자와 디자이너의 분리된 작업이 어려움
§   JSP페이지의 코드가 복잡해짐으로 인해 유지보수 하기 어려워 진다.

모델2
Model 2 장점
§   점차 Web Application 이 복잡해 지고, 사용자들의 요구가 증가함에 따라 새로운 방식의 개발방식의
   요구가 증대되었
다.
§   점차 개발시의 개발 비용보다는 유지보수를 쉽게 할 수 있는 개발 방식을 요구하는 경우가 많아 졌다.
§   대규모 프로젝트 하에서 Model 1 만으로는 해결하기 어려운 부분들이 대두 되었다.
§   MVC에서 View 는 JSP 가 담당하게 되고 , Controller 는 Servlet 이담당 하며,
   Model 은 Appllication 을 이용하여
개발하게 된다.
Model 2 단점
§   Model 2로 개발방식은 Model 1보다 어렵다.
§   Model 1으로 개발 하는것 보다 개발시간이 더 요구된다.

출처 : http://cms85.tistory.com/

'Dev > JSP & Servlets' 카테고리의 다른 글

[JAVA/JSP] JSP Request 모든변수 뽑기  (0) 2011.04.29
<%
String query="";
Enumeration enum = request.getParameterNames();
while(enum.hasMoreElements()){ 
    String key=(String)enum.nextElement();
    String value=request.getParameter(key);
    query+="&"+key+"="+value;
}
query="?"+query.substring(1);
out.println(query);
%>

'Dev > JSP & Servlets' 카테고리의 다른 글

모델1과 모델2  (0) 2011.04.30
Eclipse 정말 좋은 툴입니다. 무료에다가 엄청나게 많은 지원... 느려터졌지만, 포기하기 힘든 툴 같습니다.
이 느린 이클립스를 조금이라도 빠르게 사용하기 위한 팁을 모아 봤습니다.

여기서 나오는 팁은 3.5 기준입니다.


1. 이클립스 옵션 조정

우선 이클립스 폴더안에 있는 eclipse.ini에 다음을 추가 하거나 수정해 줍니다.

-Xverify:none
-XX:+UseParallelGC
-Xms256M
-Xmx512M

-Xverfify :
초기 시동시 verfify체크를 하지 않습니다. 당연히 시동이 빨라 집니다. 플러그인아 features에 문제가 발생 할 수 있습니다. 플러그인아 변경 사항이 있을 경우에는 이걸 키고 시동하시고, 별 문제 없으면 추가해서 사용하세요.
-XX:+UseParallelGC :
Parallel Collector를 사용 하도록 합니다. 패러럴로 모아 준다니.. 빨라지겠죠.. 체감 속도가 올라 갑니다. 다중 프로세서를 사용하시는 분들은 필수.
-Xms256M
이클리스가 시작시 잡는 메모리(256메가 바이트)
-Xmx512M
이클리스가 사용하는 최대 메모리(512메가 바이트). 메모리가 어느 정도 되신다고 생각 하시면, 늘려 주셔도 됩니다.



2. 중간중간 메모리를 정리해 주자


Window > Perference > General에 보면 Show heap status라는 옵션이 있습니다. 이걸 켜 주시면, 화면 오른쪽 하단에 아래와 같은 아이콘이 생깁니다.
사용하다가, 메모리가 많이 올라 갔다 싶거나, 느려졌네 싶을때 마다, 옆에 쓰레기통 아이콘을 눌러 주세요. 메모리가 확 줄어 듭니다. 그러면 좀 더 쾌적하게 작업을 하 실 수 있을 겁니다.

추가로 메모리는 좀 들긴 하지만 자동 가비지 컬랙션 해주는 플러그인을 설치 하셔도 됩니다.




3. 사용하지 않는 검사를 없애 준다.

필요 이상으로 많은 검사를 많이 해서 느려지는 경우도 많습니다. HTML이나 그외 등등의 검사도 거기에 포함되죠, 딱 필요한 검사만 하도록 합니다.
Window > Perferences > Validation에서 자기가 사용하는 옵션을 켜 줍니다. 저같은 경우에는 PHP를 요즘 사용하고 있어서.. PHP만 켜 줬습니다.

그리고, 영어 스펠링 검사입니다. 영어 단어를 잘 모르지만, 느려지는건 못 참아서.. 그냥.. 꺼 줬습니다.
Window > Prereces > General > Editors > Spellings에서 Enable spell checking을 과감하게 꺼 줍니다.



5. 잘 안 쓰는 기능 끄기 및 사용습관 바꾸기.


코딩하는 공간에서 잘 사용하지 않거나, 있는둥 마는둥 하는 기능을 꺼 줍니다.

Automatic folding 끄기
코드 옆에 더하기 표시 나와서, 코드를 펼쳤다.. 닫았다 하는 기능입니다. 눈에도 안 띄고 전 잘 안 쓰는 기능이라서 꺼 버립니다.
Window->Preferences->Java(또는 사용언어)->Editor->Folding 모든 옵션을 해제(disable) 합니다.옵션을 모두 해제(disable)한다.

Automatic Code Insight 끄기
Window->Preferences->Java(또는 해당언어)->Editor->Code Assist 에서 Enable auto activation 항목을 해제(disable)합니다. 자동으로 동작하는 code assist 기능은 꺼지지만, ctrl+space러 여전히 code assist를 사용할 수 있습니다. 손이 좀 불편하면 이클립스가 빨라집니다 -_-;;

사용하지 않는 플러그인 삭제 하기
이클립스를 패키지로 설치 하도 보면, 사용하지 않는 기능도 많이 들어 가게 됩니다. 그리고 이것저것 설치하기도 하고요. 그 중에서 사용하지 않는 플러그인은 삭제해 주세요.

사용하지 않는 프로젝트 닫아주기
현재 작업과 관련없는 프로젝트를 닫아 주세요. 이클립스가 접근하는 파일의 갯수를 줄여 줍니다.

사용하지 않는 파일은 닫아주기
작업하다가 사용하지 않는 창은 닫아주세요. 메모리가 절약됩니다. 이클립스를 종료시 편집하던 문서를 모두 닫고 종료하는건 다음에 이클립스를 띄울때 좀 더 가볍게 띄울 수 있습니다. 그리고 Window->Preferences->General->Editors에서 Close editors automatically를 켜주세요. 그럼 아래 설정된 숫자만큼만 문서가 열립니다. 그 이상의 문서는 자동으로 닫아집니다. 이렇게 사용하면, 무심결에 많이 열린 파일이 적어집니다. 메모리도 절약 되고요.. ^^*

사용하지 않는 플러그인을 start list에서 제외하기
Window > Preferences > General > Startup and Shutdown에서, 불필요한 플러그인을 startup list에서 제외합니다. 이렇게 하면 이클립스 실행시 좀 더 가볍게 실행 할 수 있습니다.



6. 그래도 느리다.


좀 더 처절하게 가 보겠습니다.

이클립스가 설치된 폴더에 바이러스를 검사를 꺼보세요.
백신마다 보면, 예외사항이 있을 겁니다. 거기서 이클립스가 설치 된 폴더를 예외에 넣어 주세요. 백신을 끄고 사용하면 더 좋지만, 그것 까지는 좀 그렇다면, 이 정도만 해 주세요.

작업하는 파일들과 이클립스 프로그램을 작은 파티션을 만들어서 관리해 주세요.
헤더의 움직임을 최소화 해주고 빨라집니다. 하드디스크에서 디스크 조각모음하는것 보다 훨씬 좋습니다.





7. 그래도 느려서 못 해 먹겠다.

마지막으로 그래도 정말 안 되겠다..
어쩔수 없습니다. 호주머니를 여실 수 밖에,
메모리를 늘리고 CPU를 최신으로 올리고, OS를 64bit로 올려 주세요.
위에 껄 뭐 하려고 했나 싶을 정도로 빨라집니다. -_-;;;



Eclipse is an open source community whose projects are focused on building an open development platform
comprised of extensible frameworks, tools and runtimes for building, deploying and managing software across
the lifecycle.

I am using these settings for more than a year now, and the speed gain you can expect is in the range
of 40%. Eclipse is more responsive, start up time is nearly divided by 2! These gains are reproducible
on different machines in the office.

Conditions

  • You must have a dual processor or quad core, (better if you use VMarg1)
  • You must start Eclipse with Java 1.6, note that you can still compile your project with Java 1.5
    (see windows - preferences - java - Installed JRE's)

The tricks is to use the optimization done in JDK 1.6 (VMarg2) and the new agresivity of the Just In Time
compiler (JIT) for VMarg3

Add theses VM arguments to eclipse.ini (file is located in your Eclipse directory)
eclipse.ini

-XX:-UseParallelGC -XX:+AggressiveOpts -XX:-UseConcMarkSweepGC

Some details about what these parameters are doing:

VMarg1 -XX:-UseParallelGC

Use parallel garbage collection for scavenges. (Introduced in 1.4.1) this will create more threads running in parallel, so the second processor will be put in use

VMarg2 -XX:-UseConcMarkSweepGC

Use concurrent mark-sweep collection for the old generation. (Introduced in 1.4.1)

The Eclipse GUI will feel more responsive as memory will be reclaimed without blocking VM executions.

VMarg3 -XX:+AggressiveOpts Turn on point performance compiler optimizations that are expected to be default in upcoming releases. (Introduced in 5.0 update 6.)

 

More about tuning Garbage collector HERE and at the Java HotSpot VM Options page

'Dev > eclipse' 카테고리의 다른 글

이클립스 리치 클라이언트 플랫폼(RCP)  (0) 2011.06.09
이클립스 단축키  (0) 2011.04.30
이클립스 자동 가비지 컬렉션 플러그인  (0) 2011.04.30
이클립스 속도 올리기  (0) 2011.04.29
Javascript Array클래스에 정의되어있는 배열 메서드에 대하여 알아보자.

join()
Array.join()메서드는 배열의 모든 원소를 문자열로 변환하고 이어 붙여서 반환한다.

var a = [1, 2, 3];     //3개의 원소를 가진 배열을 생성
var s = a.join();      //s == "1,2,3"
s = a.join(", ");       //s == "1, 2, 3"

Array.join() 메서드는 String.split() 메서드와 반대되는 기능을 한다.

reverse()
Array.reverse() 메서드는 이름에서도 알 수 있듯이 배열 안의 원소 순서를 반대로 정렬하여 반환한다.

var a = new Array(1,2,3);     // a[0] = 1, a[1] = 2, a[2] = 3
a.reverse();                       // now a[0] = 3, a[1] = 2. a[2] = 1
var s = a.join();                  // s == "3,2,1"

sort()
Array.sort() 메서드는 배열 안의 원소들을 정렬하여 반환한다.

var a = new Array("c", "a", "b");
a.sort();
var s = a.join(", ");     // s== "a, b, c"

알파벳순이 아니라 다른 순서로 배열을 정렬하려면 sort() 메서드의 전달인자를 통해 비교 함수를 직접 명시해주어야 한다. 비교 함수는 전달인자를 두개 받아서, 정렬된 배열 상에서 어떤 것이 먼저 나타나야 하는지 판단하는데 사용 된다. 만약 첫 번째 전달인자가 두 번째보다 먼저 나타나야 한다면 비교 함수는 0보다 작은 숫자를 반환해야 한다. 첫 번째 전달인자가 두 번째보다 뒤에 나타나야 한다면 0보다 큰 숫자를 반환하며 두 값이 동등하다면 0을 반환해야 한다.
var a = [33, 4, 1111, 222];
a.sort();                   // 알파벳순 : 1111, 222, 33, 4
a.sort(function(a,b) { // 번호순 : 4, 33, 222, 1111
     return a-b;
     });

concat()
Array.concat() 메서드는 본래 배열의 모든 원소에 concat() 메서드의 전달인자들을 전부 이어붙인 배열을 새롭게 생성하여 반환한다.
var a = [1, 2, 3];
a.concat(4, 5);            // [1,2,3,4,5]
a.concat([4,5]);          // [1,2,3,4,5]
a.concat([4.5], [6,7]); // [1,2,3,4,5,6,7]
a.concat([4, [5,[6,7]]]);  // [1,2,3,4,5,[6,7]]

slice()
Array.slice() 메서드는 배열의 일부분 혹은 부분 배열을 반환한다.
var a = [1,2,3,4,5];
a.slice(0, 3);           // [1,2,3]
a.slice(3);              // [4,5]
a.slice(1, -1);         // [2,3,4]
a.slice(-3,-2);        // [3] 

splice()
Array.splice() 메서드는 배열에 원소를 삽입하거나 원소를 제거하려 할 때 범용적으로 사용할 수 있는 메서드이다.
var a = [1,2,3,4,5,6,7,8];
var a.splice(4);          // [5,6,7,8] , a는 [1,2,3,4];
var a.splice(1,2);       // [2,3] , a는 [1,4];
var a.splice(1,1);       // [4] , a는 [1]

push() & pop()
위 메서드를 사용하면 배열을 마치 스택인 것처럼 조작할 수 있다.
push() 메서드는 하나 혹은 그 이상의 원소들을 배열의 끝 부분에 이어 붙이고 배열의 새로운 길이를 반환한다.
pop() 메서드는 push()와 반대로 작동한다. 즉 pop() 메서드는 배열의 마지막 원소를 제거하고 배열의 길이를 감소시킨 후 배열에서 제거한 원소를 반환한다.
var stack = [];           // stack:[]
stack.push(1,2);        // stack:[1,2]        2를 반환
stack.pop();              // stack:[1]          2를 반환
stack.push(3);           // stack:[1,3]       3를 반환
stack.pop();              // stack:[1]          3를 반환
stack.push(4,5);        // stack:[1, [4,5]] 2를 반환
stack.pop();              // stack:[1]          [4,5]를 반환
stack.pop();              // stack:[]           1를 반환

unshift() & shift()
push(), pop()과 유사하며 이 메서들은 배열의 끝이 아니라 배열의 맨 앞에 원소를 삽입하고 제거한다.
var a = [];              // a:[]
a.unshift(1);           // a:[1]
a.unshift(22);          // a:[22, 1]
a.shift();                 // a:[1]
a.unshift(3,[4,5]);    // a:[3,[4,5],1]
a.shift();                 // a:[[4,5],1]
a.shift();                 // a:[1]
a.shift();                 // a:[]










Posted by 빵군

import java.io.File;
import java.awt.Image;
import javax.swing.ImageIcon;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

public class Test {

    public static void main(String[] args) {
  // 방법1
  Image img = new ImageIcon(이미지경로).getImage();
  System.out.println( img.getWidth(null) + "," + img.getHeight(null) );

 

  // 방법2
  try
  {
   File file = new File(이미지경로);
   BufferedImage bi = ImageIO.read( file );
   System.out.println( bi.getWidth() + "," + bi.getHeight() );
  } catch( Exception e ) {
   System.out.println("이미지 파일이 아닙니다.");
  }
    }
}

 

Image 를 쓰는 방법과 BufferedImage 를 쓰는 방법이 있는데

둘다 결과는 똑같지만 후자를 쓰는 이유는...

JSP에서 전자를 쓰면 이미지 파일이 아닌 파일(avi나 exe 같은)은 한동안 파일 락이 걸려서

삭제나 이동이 불가하였고 flush 도 해봤지만 똑같은 증상이 발생하였습니다.

반면 후자는 아무 문제 없었습니다. JAVA 로 실행시에는 문제가 발생하진 않습니다.

문제의 원인과 해결 방법을 아시는 분은 댓글 부탁드립니다.

'Dev > JAVA' 카테고리의 다른 글

Spring framework 설치  (0) 2012.11.25
자바 데몬(daemon) 만들기  (0) 2011.06.09
Java Simple Daemon  (0) 2011.06.05
자바 이미지 리사이즈(썸네일)  (0) 2011.04.06
이미지 파일 첨부할 때 이미지 미리보기 기능을 구현하다가 막혀서 구글링 중에 찾은 포스팅인데
더 수정할 필요 없이 바로 사용해도 무리없는 소스를 발견하여 스크랩하여 둔다.

<html>
<head>
    <title></title>
    <style type="text/css">
        .preView { width: 70px; height: 70px; text-align: center; border:1px solid silver; }
    </style>
    <script type="text/javascript">

        function fileUploadPreview(thisObj, preViewer) {
            if(!/(\.gif|\.jpg|\.jpeg|\.png)$/i.test(thisObj.value)) {
                alert("이미지 형식의 파일을 선택하십시오");
                return;
            }

            preViewer = (typeof(preViewer) == "object") ? preViewer : document.getElementById(preViewer);
            var ua = window.navigator.userAgent;

            if (ua.indexOf("MSIE") > -1) {
                var img_path = "";
                if (thisObj.value.indexOf("\\fakepath\\") < 0) {
                    img_path = thisObj.value;
                } else {
                    thisObj.select();
                    var selectionRange = document.selection.createRange();
                    img_path = selectionRange.text.toString();
                    thisObj.blur();
                }
                preViewer.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fi" + "le://" + img_path + "', sizingMethod='scale')";
            } else {
                preViewer.innerHTML = "";
                var W = preViewer.offsetWidth;
                var H = preViewer.offsetHeight;
                var tmpImage = document.createElement("img");
                preViewer.appendChild(tmpImage);

                tmpImage.onerror = function () {
                    return preViewer.innerHTML = "";
                }

                tmpImage.onload = function () {
                    if (this.width > W) {
                        this.height = this.height / (this.width / W);
                        this.width = W;
                    }
                    if (this.height > H) {
                        this.width = this.width / (this.height / H);
                        this.height = H;
                    }
                }
                if (ua.indexOf("Firefox/3") > -1) {
                    var picData = thisObj.files.item(0).getAsDataURL();
                    tmpImage.src = picData;
                } else {
                    tmpImage.src = "file://" + thisObj.value;
                }
            }
        }

    </script>
</head>
<body>
    <input id="fileData" name="fileData" type="file" onchange="fileUploadPreview(this, 'preView')" />
    <div id="preView" class="preView" title="이미지미리보기"></div>
</body>
</html>

출처 : Junyong's blog - http://junyong.pe.kr/98

'Dev > Javascript' 카테고리의 다른 글

Prototype에서 jQuery로 옮겨타기  (0) 2011.07.31
Firebug의 console 파헤치기.  (0) 2011.07.19
fireBug 사용법  (0) 2011.07.19
[jQuery] firebug로 디버그  (0) 2011.07.19
Javascript 배열 메서드  (0) 2011.04.29
윈도우는 멀티스레드 방식
리눅스는 멀티프로세스 방식

멀티스레드 환경에는 Non Thread Safe 버전
멀티프로세스 환경에는 Thread Safe 버전

MPM prefork는 멀티프로세스
MPM worker는 멀티스레드

스레드 안전 - 멀티스레드 환경하에 하나의 자원에 여러 스레드가 동시에 접근해도 프로그램의 실행에 문제가 없음을 뜻함

Windows + IIS(ISAPI) : VC9 Thread Safe 버전
Windows + IIS(CGI + FastCGI) : VC9 Non Thread Safe 버전
Windows + 아파치(MPM worker) : VC6 Thread Safe 버전
Windows + 아파치(MPM prefork) : VC6 Non Thread Safe 버전

'Dev > PHP' 카테고리의 다른 글

FreeTDS 설치 (PHP와 MS-SQL 연동)  (0) 2011.05.13
CentOS 64bit Apache PHP 컴파일 설치  (2) 2011.05.13
PHP Configure Option  (0) 2011.05.13
PHP 암호화 함수정리  (0) 2011.05.07
upload_max_filesize  (0) 2011.04.19

+ Recent posts