<script type="text/javascript">
        var willEval = '';
        willEval += 'var number = 10;';
        willEval += 'alert(number);';

        eval(willEval);
    </script>

    string을 자바스크립트 코드로 실행한다

 

'개발개발 > 자바스크립트' 카테고리의 다른 글

escape() 함수  (0) 2012.08.27
parseFloat(), parseInt() 함수  (0) 2012.08.27
prompt() 함수  (0) 2012.08.27
confirm() 함수  (0) 2012.08.27
클로저  (0) 2012.08.27
Posted by 공돌공돌
,

    <script type="text/javascript">
        var age = prompt('나이를 입력하세요', '숫자만 입력하세요');
    </script>

    입력 대화상자를 만들어 주는 prompt() 함수

'개발개발 > 자바스크립트' 카테고리의 다른 글

parseFloat(), parseInt() 함수  (0) 2012.08.27
eval() 함수  (0) 2012.08.27
confirm() 함수  (0) 2012.08.27
클로저  (0) 2012.08.27
함수를 리턴하는 함수  (0) 2012.08.27
Posted by 공돌공돌
,

    <script type="text/javascript">

        var flag = confirm ('입장하시겠습니까?');

    </script>

 

     확인과 취소를 할 수 있는 confirm()함수

 

'개발개발 > 자바스크립트' 카테고리의 다른 글

eval() 함수  (0) 2012.08.27
prompt() 함수  (0) 2012.08.27
클로저  (0) 2012.08.27
함수를 리턴하는 함수  (0) 2012.08.27
함수를 매개 변수로 받는 함수  (0) 2012.08.27
Posted by 공돌공돌
,

    <script type="text/javascript">
        function outerFunction(name)
        {
            // 지역변수 output
            var output = 'Hello ' + name + '..!';
            return function() {
                alert(output);
            };
        }
        outerFunction('RintIanTta')();

    </script>

지역변수 output은 함수 outerFunction을 실행할 때 생성되어 함수가 종료됨과

동시에 사라져야 한다. 그러나 자바스크립트 스스로 아직 지역변수 output을 지우면

안된다는 것을 인식하고 남겨두므로 발생하는 특성이다 이것을 클로져 라 한다

'개발개발 > 자바스크립트' 카테고리의 다른 글

prompt() 함수  (0) 2012.08.27
confirm() 함수  (0) 2012.08.27
함수를 리턴하는 함수  (0) 2012.08.27
함수를 매개 변수로 받는 함수  (0) 2012.08.27
내부함수  (0) 2012.08.27
Posted by 공돌공돌
,

    <script type="text/javascript">
        // 익명함수를 리턴하는 함수
        function outerFuction()
        {
            return function()
                    {
                        alert('Hello world');
                    };
        }
        outerFuction();

    </script>

함수를 리턴하는 함수도 만들 수 있다

 

'개발개발 > 자바스크립트' 카테고리의 다른 글

confirm() 함수  (0) 2012.08.27
클로저  (0) 2012.08.27
함수를 매개 변수로 받는 함수  (0) 2012.08.27
내부함수  (0) 2012.08.27
리턴값  (0) 2012.08.27
Posted by 공돌공돌
,

    <script type="text/javascript">

        // 함수를 5번 호출 하는 함수
        function callFunctionTenTimes(otherFunction) {
            for (var i = 0; i < 5; i++) {
                otherFunction();
            }
        }
        // 출력창 함수
        function justFunction() {
            alert('Hello World..!');
        }
        // 함수를 호출
        callFunctionTenTimes(justFunction);
       
    </script>

자바스크립트에서는 함수도 하나의 자료형이므로 쉽게 매개 변수로 전달 가능

익명함수, 선언적함수 모두 가능

 

다섯번 출력!

'개발개발 > 자바스크립트' 카테고리의 다른 글

클로저  (0) 2012.08.27
함수를 리턴하는 함수  (0) 2012.08.27
내부함수  (0) 2012.08.27
리턴값  (0) 2012.08.27
가변인자  (0) 2012.08.27
Posted by 공돌공돌
,

    <script type="text/javascript">
        //피타고라스의 정리 함수
        function pythagoras(width, height)
        {
            function square(x) {
                return x * x;
            }
            return Math.sqrt(square(width) + square(height));
            //Math 객체는 수학적인 계산을 사용하는 객체이다
            // sqrt()는 루트 계산을 하는 메소드
        }
        alert(pythagoras(2,2));
    </script>

내부함수는 함수 내부에 선언한 함수를 의미

내부함수를 사용하면 함수 외부에 이름이 같음 함수가 있어도 내부 함수가 우선됨

주의할 점은 내부함수는 내부함수가 포함되는 함수에서만 사용할 수 있다

따라서 위에 소스에서 pythagoras() 함수 외부에서는 square()를 호출할 수 없다

'개발개발 > 자바스크립트' 카테고리의 다른 글

함수를 리턴하는 함수  (0) 2012.08.27
함수를 매개 변수로 받는 함수  (0) 2012.08.27
리턴값  (0) 2012.08.27
가변인자  (0) 2012.08.27
매개변수  (0) 2012.08.27
Posted by 공돌공돌
,

    <script type="text/javascript">
         function returnTest(){
             alert('문장 A');
             return;
             alert('문장 B');
         }

        returnTest();
    </script>

return 키워드는 함수가 실행되는 도중에 함수를 호출 한 곳으로 돌아가라는 의미

return 키워드를 사용하면 값을 지정하지 않아도 함수를 호출한 곳으로 돌아간다

 

'개발개발 > 자바스크립트' 카테고리의 다른 글

함수를 매개 변수로 받는 함수  (0) 2012.08.27
내부함수  (0) 2012.08.27
가변인자  (0) 2012.08.27
매개변수  (0) 2012.08.27
함수 재정의  (0) 2012.08.27
Posted by 공돌공돌
,
<script type="text/javascript">
        function sumAll() {
            alert(arguments + ': ' + arguments.length);
        }
        sumAll(1,2,3,4,5,6,7,8,9);
    </script>

가변인자 함수는 매개 변수의 개수가 변할 수 있는 함수이다

매개 변수를 선언된 형태와 다르게 사용했을 때도 매개 변수를 모두 활용할 수 있다

위 소스는 argument(매개 변수의 배열)의 배열의 길이를 출력하는 예제이다

함수를 호출할 때 9개를 입력 했으므로 길이는 9로 출력된다

 

'개발개발 > 자바스크립트' 카테고리의 다른 글

내부함수  (0) 2012.08.27
리턴값  (0) 2012.08.27
매개변수  (0) 2012.08.27
함수 재정의  (0) 2012.08.27
함수 호출  (0) 2012.08.27
Posted by 공돌공돌
,

<script type="text/javascript">
        //매개변수 : 함수를 호출하는 쪽과 호출된 함수를 연결하는 매개가 되는 변수
        //Array 함수는 매개변수에 아무것도 입력하지 않게 설계됨
        var array1 = Array();       // 빈 배열
        var array2 = Array(10);     // 크기가 10인 배열 생성
        var array3 = Array(273, 103, 57, 32); // 매개변수를 배열로 만듦

        alert(array1 + '\n' + array2 + '\n' + array3 + '\n');
    </script>

                                                

'개발개발 > 자바스크립트' 카테고리의 다른 글

리턴값  (0) 2012.08.27
가변인자  (0) 2012.08.27
함수 재정의  (0) 2012.08.27
함수 호출  (0) 2012.08.27
함수의 생성과 출력  (0) 2012.08.27
Posted by 공돌공돌
,

<script type="text/javascript">
        // 선언적 함수 재정의
        a();
        function a() {
            alert('함수 a')
        }
        function a() {
            alert('함수 b')
        }
       
        // 익명함수 재정의
        var b = function() {
            alert('함수 c')
        }
        var b = function() {
            alert('함수 d')
        }
        b();

        /* 결과는 '함수 b', '함수 d' 가 출력된다
        두 가지 함수는 비슷하지만 차이가 있다
        script 태그는 내부의 내용을 순서대로 읽기전에 선언적 함수를 먼저 읽기 때문에
        호출하는 부분이 선언적함수 위에 있어도 호출이 가능하다
        하지만 익명함수는 호출하는 부분이 위에 있다면 에러가 발생한다*/
    </script>

 

 

'개발개발 > 자바스크립트' 카테고리의 다른 글

리턴값  (0) 2012.08.27
가변인자  (0) 2012.08.27
매개변수  (0) 2012.08.27
함수 호출  (0) 2012.08.27
함수의 생성과 출력  (0) 2012.08.27
Posted by 공돌공돌
,

    <script type="text/javascript">
        var a =
                function () {
                    var output = prompt('숫자를 입력해주세요.', '숫자');
                    alert(output);
                };
       a();
        //a를 호출하여 결과를 나타낸다

    </script>

 

 

 

 

'개발개발 > 자바스크립트' 카테고리의 다른 글

리턴값  (0) 2012.08.27
가변인자  (0) 2012.08.27
매개변수  (0) 2012.08.27
함수 재정의  (0) 2012.08.27
함수의 생성과 출력  (0) 2012.08.27
Posted by 공돌공돌
,

    <script type="text/javascript">
        //        함수의 생성과 출력
        var a =
                function () {
                    var output = prompt('숫자를 입력해주세요.', '숫자');
                    alert(output);
                };
        alert(a);
        // a 의 소스내용을 출력해준다
    </script>

 

 

'개발개발 > 자바스크립트' 카테고리의 다른 글

리턴값  (0) 2012.08.27
가변인자  (0) 2012.08.27
매개변수  (0) 2012.08.27
함수 재정의  (0) 2012.08.27
함수 호출  (0) 2012.08.27
Posted by 공돌공돌
,

 

web.xml 설정 태그 정리

향후 추가 예정

Xml 태그

 

<Welcome-file-list>

<welcome-file>

시작 페이지 설정

<welcome-file>에 설정된 파일을 가장 먼저 실행한다

<session-config>

<session-timeout>

세션 유지 시간 설정

<session-timeout>에 설정된 숫자만큼 유지된다

<listener>

  <listener-class>

<listener-class>에 설정된 세션이나 서블릿 컨텍스트 생성, 수정, 소멸을

알려주는 이벤트 리스너

<filter>

<filter-name>

<filter-class>

<init-param>

  <param-name>

  <param-value>

<filter-mapping>

<filter-name>

<url-pattern>

필터 설정

<filter>태그는 사용자 필터를 지정하는 역할

<filter-mapping>태그는 특정자원에 대해 어떤 필터가 사용할지를 지정

<init-param>태그는 필터가 초기화 될 때, 즉 필터의 init() 메소드가 호출될 때 전달되는 파라미터 값

<url-pattern>태그는 클라이언트가 요청한 특정 URI에 대해서 필터링을

할 때 사용

<servlet>

<servlet-name>

<servlet-class>

<servlet-mapping>

<servlet-name>

<url-pattern>

서블릿 설정

<servlet-name> 아래 servlet-mapping에 기술해주기 위한 식별자

<servlet-class> 실제 서블릿 클래스, 패키지까지 작성

 

<servlet-name> 위의 servlet에 명시한 이름

<url-pattern> 어떠한 URL? 경로로 접근 가능한지 명시

<error-page>

<error-code>

<location>

에러페이지 설정

<error-code>에 설정된 값의 에러코드가 발생하면

<location>에 설정된 위치의 에러페이지를 보여준다

<context-param>

<param-name>

<param-value>

컨텍스트 초기화 파라미터

<servlet>과 비슷해 보이지만 <context-param>은 웹 애플케이션에 존

재하는 어떤 서블릿이나 jsp 모두 가능하지만<servlet> <init-param>

항목을 포함하고 있는 서블릿만 가능

'개발개발 > WAS' 카테고리의 다른 글

Jeus jboot, jdown 만들기~!  (0) 2012.04.24
Jeus 설치 및 설정...  (0) 2012.04.24
Posted by 공돌공돌
,
OKJSP에 자주 가서 요즘 자바 개발자들이 어떻게 살아가나를 보는 편인데, 아주 많이 반복적으로 올라오는 질문이 "대체 뭘 공부해야 하나요? 프레임워크는 Spring을 해야 할까요? iBATIS를 해야 할까요?" 하는 식의 질문들이다(이 질문은 사실 말이 안된다. 왜 그런지 읽다보면 나온다).

Java는 웹 관련 프레임워크들이 너무 다양하고, Ruby나 Python 같은 경우에는 RubyOnRailsDjango 처럼 하나의 프레임워크 안에 기능별 프레임워크들도 모두 다 All in one 형태로 들어 있어서 혼란을 주지 않는 반면, Java는 각 영역별로 프레임워크가 모두 다르고, 또한 각 영역별로 존재하는 프레임워크들의 종류도 많아서 초보 개발자들에게 극심한 혼란을 주고 있다.

그래서 나름대로 Java Web 개발자들을 위한 학습 로드맵을 정리해 보았다.

1. Java 그 자체
많은 웹 개발자들이 마치 JSP 코드를 짤 줄 알면 그걸로 Java 웹 개발을 할 줄아는 것이라 생각하고 Java 그 자체를 소홀히 하는 것을 본다.
말도 안되는 소리이다. Java를 모르고서 Java 웹 개발을 제대로 한다는 것은 어불 성설이다. Java 그 자체를 먼저 공부하라.

특히 Java 5 문법을 숙지하길 권한다. 이제 우리나라도 점차 Java 5가 대세가 되어 가고 있다. 대부분의 프레임워크들과 WAS(JSP와 서블릿을 구동하는 서버)도 모두 Java 5를 기준으로 바뀌었으며, JVM 자체도 버전이 높을 수록 성능이 더 좋다.

2. JSP와 Servlet 그리고 Model 1
모델 1은, JSP 하나에 DB에 접속해서 쿼리를 날리는 등의 모든 업무적인 기능(Business Logic)을 넣고, 그 아래에 HTML 코드를 박아 넣는 식으로 개발하는 것을 의미한다.
아직도 많은 개발자들이 여기에 길들여져 있는데, 일단 JSP 자체에 대한 기본기를 익힌 뒤로는 재빨리 버려야 할 습관이다.

그리고 많은 개발자들이 Servlet을 무시하고 JSP만 하는 것을 보곤 하는데, Servlet에 대한 학습이 제대로 이뤄지지 않으면 더 나은 웹 개발이 곤란하다. Servlet에 대한 기초 개념을 확실히 잡길 권한다.
모델 1은 제가 알기로는 HTML과 로직을 모두 한 JSP에 넣는 방식이 아니라 jsp:beans를 이용하는 방식입니다. 모델 1에서도 여전히 비즈니스 로직과 UI는 분리할 수 있죠. thin controller, fat model에는 더 맞는 방식이라고도 할 수 있습니다. - 영록, 그리고 Servlets and JSP Pages Best Practices에서 Model 1 관련 부분 참조

모델 1은 JSP나 혹은 서블릿 하나가 요청에 대한 처리, 데이터 유효성 검사, 비즈니스 로직 처리, 응답 생성을 모두 다 책임지는 방식이다. 모델 1은 작고, 간단한 애플리케이션에서 개발을 쉽게하고자 할때 사용된다.

In Model 1, a request is made to a JSP or servlet and then that JSP or servlet handles all responsibilities for the request, including processing the request, validating data, handling the business logic, and generating a response. The Model 1 architecture is commonly used in smaller, simple task applications due to its ease of development. - Wikipedia


3. Model 2 - 프레임워크의 등장
JSP로 열심히 개발을 하다보니 프로젝트 규모도 커지기 시작하고, JSP 파일 크기도 수천줄에 달하는등 엄청나게 커진다.
그런데 이 JSP에다 두서없이 모든 기능을 다 때려 넣다보니 JSP마다 똑같은 기능들이 Copy&Paste로 들어가고, JSP 안에 들어 있는 Java 코드들에서 에러가 발생하면 찾아내서 디버깅 하는 일이 지옥같이 느껴지기 시작한다.

여기서 Model 2가 구원자로 등장한다.

Model 2는 말만 멋드러졌지 실제로는 간단한 개념이다.

JSP에서 수행하던 DB 쿼리 등의 작업을 Servlet에게 넘겨주고 JSP에서는 오로지 화면 출력만 담당하는 것이다.

Servlet에서 DB 쿼리등 화면 출력과는 상관없는 비지니스 로직을 일단 먼저 모두 수행하고, 그 결과를 request.setAttribute("key",결과객체);로 담은 다음 JSP 페이지로 포워딩(forward)을 하면 JSP에서는 request.getAttribute("key")로 그 객체를 받아서 화면에 뿌려주기만 한다.
이런 업무 수행단/화면 출력단의 철저한 역할 분리가 Model 2이다.

여기서 이러한 각 역할을 "MVC - Model View Controller" 라고 한다. 그래서 Model 2는 MVC와 동일한 의미로 사용하기 도 한다. MVC의 의미는 공부하면서 찾아보라.

이게 뭐가 좋냐고? 개발 기간이 좀 길어지고 프로젝트 규모가 쬐끔 커지고, 기존 프로젝트를 유지보수를 해보면 얼마나 좋은지 몸소 뼈져리게 느끼게 된다.

Model 2의 기능을 정형화해서 쉽게 구현하게 해주는 것이 MVC Framework들의 역할이다.
가장 유명한 Model 2 웹 프레임워크들은 다음과 같은 것들이 있다.

* 스트럿츠 1 - Struts 1
* 스트럿츠 2 - Struts 2
* 스프링 MVC - Spring MVC
* 기타 덜 유명한 Wicket, Stripes, JSF, Tapestry 등.

Struts 1은 MVC의 효시라고 할 수 있다. 우리에게 MVC라는 축복을 주기는하였으나, 나온지 오래된 만큼 낡은 개념들이 많이 녹아있고 쓸데 없이 복잡하고 배우기도 어려운 편이다.

오히려 Struts 2와 Spring MVC가 더 배우기 쉬울 것이며, 개발도 더 쉽다. 현재 추세는 Struts 2와 Spring MVC이다. 대형 포탈이나 SI 업체들도 Spring/Struts 2를 주로 채택하는 추세로 가고 있는 것으로 알고 있다.

둘 중 하나의 개념만 확실히 이해해도 다른 것을 배우는데 어려움이 별로 없으므로 그냥 둘중에 골라서 배우길 권한다. 나는 Spring을 선호한다.

그리고 MVC 프레임워크를 사용하기 시작하면서 View를 만드는 JSP에 대해서도 재조명이 시작된다. 기존에 Java 코드를 JSP에 직접 넣던 관행을 버리고 JSTL과 태그 라이브러리를 사용하거나 아예 JSP를 버리고 다른 템플릿 엔진으로 만들기도 한다. 이에 관해서는 맨 마지막에.

4. 퍼시스턴스 프레임워크 : JDBC 반복 작업에 짜증이 나기 시작하다.
현대 웹 개발에서 가장 큰 역할을 차지하는 것은 뭐니뭐니해도 단연 Database 작업이다.
지금까지는 아마도 JDBC에서 DB 커넥션을 맺고, 쿼리를 날리고 그 결과 ResultSet을 JSP로 넘겨주어서 출력하는 식으로 했을 것이다.
이미 다들 알고 있겠지만 JDBC를 사용하면 똑같은 코드가 굉장히 많이 반복해서 나온다. 한마디로 "삽질"의 전형이 JDBC 작업이다.
이것을 깨달은 많은 개발자들이 조금 어정짱하게 반복작업을 해결해주는 Util 클래스들을 프로젝트별로 만들어서 사용하곤 한다.
하지만, 물론 이에 대해 정형화하고 깔끔하고 훨씬 더 사용하기 쉬게 만들려는 노력이 이미 수년에 걸쳐 이루어졌다.

이렇게 DB관련된 작업을 정형화한 것들을 Persistence Framework 라고 한다.

* 아이바티스 - iBATIS : SQL Mapper - JDBC보다 더 쉽게 배우고, 더 편하게 사용한다.
* 하이버네이트 - Hibernate : 객체지향을 객체지향답게, 개발 기간을 엄청나게 단축시켜주다.

퍼시스턴스 프레임워크의 양대 산맥은 iBATIS와 Hibernate이다. 이 둘 모두 우리나라에 책이 나와 있다.
iBATIS는 SQL Mapper의 한 종류이고, Hibernate는 ORM의 한 종류이다.

이 둘의 차이는 iBATIS는 개발자가 SQL 쿼리를 직접 작성한 것을 객체에 매핑시켜주는 것이고, ORM은 DB 스키마와 객체간의 관계를 설정파일로 만들면 자동으로 쿼리를 만들어주는 것이다.

자, 이 둘을 보면 미국에서는 Hibernate가 인기가 좋고, 우리나라에서는 iBATIS가 사실상 SI 업계를 평정했다.
그러니까, 일단은 우리나라에서는 iBATIS를 공부하면 된다고 보면 된다.

이렇게 말하니까 마치 이 둘이 경쟁자 같은데, 사실 이 둘은 경쟁 상대라기 보다는 보완해주는 역할을 한다. SI에서 처럼 DB 테이블이 정규화 되어 있지 않은 경우에는 Hibernate같은 ORM을 사용하면 프로젝트를 말아먹을 수 있다.

iBATIS는 테이블 정규화에 무관하게, 개발자가 작성한 SQL을 객체로 매핑하기 때문에 DB 스키마가 마구 꼬여 있는 상황에서도 유연하게 작동하고, 개발자가 직접 SQL 튜닝을 할 수 있다는 장점이다.

그리고 Hibernate는 배우기가 굉장히 어려운 프레임워크이고 튜닝이 매우 어렵다. Hibernate책을 보면 캐싱을 통해 성능을 향상시키라고 하지만 캐싱은 iBATIS도 못지않게 잘 지원한다. 하지만 일단 배우면, 그로인한 코딩 생산성이 iBATIS가 감히 넘볼 수 없을 정도록 급격히 향상된다.

Hibernate는 DB 정규화가 잘되어 있는 웹 포탈 업체나 패키지 소프트웨어 제작시에 강력히 권장할만 하다.

5. IoC와 DI - 객체의 생성주기와 의존성을 관리하고 싶어지다
사실 내가 경험한 SI를 보면 4단계 까지만 가도 막장은 아닌 프로젝트라고 본다. 아직도 신규 프로젝트를 하면서도 Model 1에 JDBC로 코딩하는 것을 많이 보았기 때문이다.

앞서, MVC라는 형태로 웹 애플리케이션의 역할을 철저하게 분할해서 처리하라고 했었다.

이제 여기서 좀 더 역할을 분할하기 시작한다.

Database를 관장하는 코드(DAO)와 Database 처리 결과를 가지고 그외 비지니스 로직을 추가로 수행하는 코드(Service), 그리고 웹으로 들어온 요청을 받아서 비지니스 로직을 호출하고, 그 결과를 다시 웹(HTML 등)으로 내보내는 코드(Controller)로 분할을 하면 유지보수가 더 쉽고, DB가 Oracle에서 DB2 로 변경되는 식의 중대 변화가 있을 때도 DAO만 바꾸면 되는 식으로 변화에 대한 대처가 유연해 진다는 것을 깨닫기 시작한다.

이제는 각 역할별로 클래스를 분할하고 컨트롤러 객체는 서비스 객체에 서비스 객체는 DAO 객체에 의존해서 작동하도록 코드를 바꾸기 시작한다. 그리고 객체의 생성과 파괴 주기도 관리해야만 하게 된다. 객체를 하나만 생성하면 되는데 불필요하게 매번 new를 할 필요는 없으니까.

이렇게 객체의 생성/파괴 주기를 관리하고 객체간의 의존성을 관리해주는 프레임워크를 IoC 컨테이너라고 부른다.

1. Spring Framework
2. EJB 3.0

사실상 대세는 Spring Framework로 굳어졌다. EJB 3.0은 내가 안써봐서 뭐라 말은 못하겠다.

Spring MVC는 이 Spring Framework의 일부분이다.

Spring은 또한 AOP도 지원한다.

AOP 의 개념이 상당히 어려운 편이라서 개념 자체를 확실히 한마디로는 표현하지 못하겠다. 어쨌든 개발자들에게 가장 쉽게 다가오는 표현으로 하자면, AOP는 동일한 패턴으로 반복적으로 해야하는 일을 설정을 통해 자동으로 해주는 것이다.
이에 관한 가장 보편적인 예가 바로 트랜잭션이다.
지금까지는 아마도 비지니스 로직이 시작될 때 트랜잭션이 시작되고, 비지니스 로직이 끝날 때 트랜잭션을 종료하는 코드를 매번 작성해서 넣었을 것이다.
AOP를 사용하면, 비지니스 로직의 역할을 하는 메소드가 무엇인지 설정파일에 넣어주기만 하면 자동으로 메소드가 시작될 때 트랜잭션을 시작시키고, 메소드가 끝날 때 트랜잭션을 종료시켜준다. 물론 예외가 발생하면 트랜잭션을 rollback도 해준다. 따라서 Spring을 사용한 프로젝트에서는 트랜잭션 관련 코드를 볼 수 없을 것이다.

Spring 프레임워크는 기본적으로 IoC 컨테이너 역할을 하는 것이 핵심이다. 따라서 Spring을 사용한다고 해서 꼭 Spring MVC를 사용할 필요는 없다. Struts 2 + Spring + iBATIS 나 SpringMVC + Spring + Hibernate 등... 어떠한 조합이라도 가능하다.

6. 그 외
◈ Template Engine : JSP 보다 더 간결하면서 강력한게 필요해!
* JSP + JSTL : Sun이 지정한 산업표준이다. JSTL은 당연히 쓰고 있으리라 믿는다.
* Freemarker : 가장 권장할 만하다.
* Velocity : 굉장히 배우기 쉽다. JSTL보다 더 빨리 배워서 쓸 수 있다. 가독성도 좋다. 그러나 Freemarker 만큼 편하고 강력하지는 못하다.
많은 사람들이 Java 웹 개발을 그냥 "JSP 개발"이라고도 부르는데, MVC가 도입되고, Freemarker 같은 다른 템플릿 엔진을 사용하게 되면 더이상 JSP는 코빼기도 안보이게 된다. 그러므로.. JSP 개발이라는 말은 쓰지 않았으면 좋겠다.

◈ Layout Engine
* Sitemesh : 헤더 푸터 처럼 동일 패턴이 반복되는 레이아웃을 관리해준다.

◈ XML 도우미 : W3C DOM은 너무 어렵고 난잡하다. 좀 더 편한 XML관련 개발을 원한다면..
* JDOM : Java 표준으로 지정됐다고 한다.
* DOM4J
둘 다 비슷하게 편한거 같다. 예전엔 JDOM을 썼었는데, 나 같은 경우 현재 프로젝트에서는 DOM4J를 사용한다. Hibernate가 DOM4J를 사용하기 때문에, 별도의 라이브러리 더 넣는게 귀찮아서.

◈ 단위 테스트
* jUnit : 코드를 철저하게 테스트하자.

◈ 소스코드 버전관리
* CVS
* Subversion : 현재 대세는 Subversion
내가 최고 막장으로 꼽는 프로젝트는 아직도 FTP로 소스 관리하는 프로젝트이다. 이런 프로젝트에는 절대로 참여하지 않을 것이라고 굳게 맹세하고 또 맹세했다. --;
소스 코드 버전관리는 여러 개발자들이 동시에 개발할 때 소스코드를 저장하고 충돌을 관리해주며, 소스 변경 내역을 계속해서 추적해서 과거 소스로 언제든지 돌아갈 수 있도록 도와준다.
현재 대세는 Subversion이지만 CVS로도 버전관리의 이점을 충분히 만끽할 수 있다. 그리고.. 사실 CVS가 사용법을 익히기는 더 쉽다.

◈ 자동 빌드
* Ant : Ant 면 만사 Ok!
* Maven
아직도 javac 로 컴파일하고 있고, FTP로 파일 올려서 복사하고 있다면.. 이 모든일을 자동으로 명령 한방에 처리하도록 해야 실수도 적고, 퇴근도 일찍한다.
Ant로 빌드와 배포를 자동화 하자.

결론

내가 권하는 조합은
* SI 업체에서 일하는 경우 : Struts 2 혹은 SpringMVC + iBATIS + JSP/JSTL + 가능하다면 Spring Framework
* 웹 포털등과 같은 업계, 패키지 소프트웨어 제작 업체 : Struts 2 혹은 Spring MVC + Hibernate + Spring Framework + Freemarker + Sitemesh

 

 

 

출처 - http://kwon37xi.egloos.com/3666564

'개발개발 > 자바' 카테고리의 다른 글

3일차  (0) 2013.08.28
2일차  (0) 2013.08.28
변수  (0) 2012.04.16
생각하고 코딩하기  (0) 2012.04.13
HashMap 정의, 예제  (1) 2012.04.13
Posted by 공돌공돌
,

12/05/09

기본적으로 제공되는 scott/tiger 계정으로 연습한 쿼리 예제문

http://www.oracleclub.com => 오라클강좌 참고

-- 테이블 생성 및 제약조건
 CREATE TABLE EMP2(
    EMPNO  NUMBER    CONSTRAINT emp_pk_empno PRIMARY KEY,    
    ENAME  VARCHAR2(20) CONSTRAINT emp_nn_ename NOT NULL,
    JOB    VARCHAR2(40),
    MGR    NUMBER,
    HIREDATE  DATE,
    SAL    NUMBER,
    COMM   NUMBER,
    DEPTNO NUMBER
);

-- SELECT 를 이용한 테이블 생성
CREATE TABLE emp2
  AS SELECT * FROM emp;

-- 테이블 삭제
DROP TABLE EMP2;


-- 테이블 복사
CREATE TABLE EMP3
  AS SELECT * FROM EMP;
 
-- 컬럼 추가
ALTER TABLE emp
  ADD (addr VARCHAR2(50));

-- 컬럼 수정
ALTER TABLE emp
  MODIFY (ename VARCHAR2(50));

-- 컬럼 삭제
ALTER TABLE emp
  DROP COLUMN addr;

-- 데이터 삽입
INSERT INTO dept (deptno, dname)
  VALUES(10, 'ACCOUNTING' );

-- 데이터 수정
UPDATE emp
  SET deptno = 30
  WHERE empno = 7902;
 
-- 데이터 삭제
DELETE FROM emp
  WHERE empno = 7902 ;
 
-- SELECT문( IN )
select ename, empno
  from emp
  where empno IN(7900, 7934);
 
-- SELECT문(BETWEEN)
select empno, ename
  from emp
  where sal between 3000 and 5000;
 
-- SELECT문(LIKE)
select empno, ename
  from emp
  where UPPER(name) LIKE '%K%';

-- SELECT문(ORDER BY) asc=오름차순, desc=내림차순
select empno, ename
  from emp
  where deptno = 30
  ORDER BY ename ASC;
 
-- JOIN(EQUI JOIN)
SELECT  e.ename, d.dname
  FROM   emp e , dept d
  WHERE e.deptno = d.deptno;

-- JOIN(OUTER JOIN)
SELECT DISTINCT(a.deptno), b.deptno
  FROM emp a, dept b
  WHERE  a.deptno(+) = b.deptno;

-- 내장함수(숫자함수)
--    반올림
SELECT ROUND(192.123, 1) test FROM DUAL ;

-- 내장함수(숫자함수)
--    올림
SELECT CEIL(10.1) test FROM DUAL;

-- 내장함수(숫자함수)
--    버림
SELECT FLOOR(10.1) test FROM DUAL;

-- 내장함수(문자열 함수)
--    문자 결합
SELECT CONCAT('Oracle', 'Club') FROM DUAL;

-- 내장함수(문자열 함수)
--    LOWER <= 소문자  , UPPER <= 대문자
SELECT LOWER('KIM JUNG SICK') FROM DUAL;
SELECT UPPER('KIM JUNG SICK') FROM DUAL;

-- 내장함수(문자열 함수)
--    SUBSTR('A', B, C) <= A의 B번째 문자부터 C의 개수만큼 반환
SELECT SUBSTR('JUNG-SICK', 3, 4) FROM DUAL;

-- 내장함수(문자열 함수)
--    LENGTH <= 문자 개수 반환
SELECT LENGTH('JUNG-SICK') TEST FROM DUAL;

-- 내장함수(문자열 함수)
--    REPLACE('A', 'B', 'C') <= 'A'문자 중에 'B'에 해당하는 문자를
--                              'C'로 반환한다
SELECT REPLACE('JACK and JUE','J','BL') "Changes" FROM DUAL;

-- 내장함수(문자열 함수)
--   왼쪽에서 3번째부터 시작을 해서 비교를 하는데 
--   OR이 두 번째 검색되는 지점의 위치를 반환 한다.
SELECT INSTR('CORPORATE FLOOR','OR', 3, 2) "Instring" FROM DUAL;

-- 내장함수(문자열 함수)
--    TRIM('A' from 'ABCDE' <= 'A'를 제거한다
SELECT TRIM('A' from 'ABCDE') "TRIM EXAMPLE"
  FROM DUAL;

-- 내장함수(날짜 처리 함수)
--   오늘날짜 출력
SELECT to_char(sysdate, 'YYYY-MM-DD') today
  FROM dual;
 
-- 내장함수(날짜 처리 함수)
--  날짜 출력
SELECT TO_DATE('2011/05/08','YY/MM/DD') FROM DUAL;

-- 내장함수 (General Functions)
--    DECODE
SELECT deptno,
      DECODE(deptno, 10 , 'ACCOUNTING' ,
                     20 , 'RESEARCH' ,
                     30 , 'SALES' ,
                     40 , 'OPERATIONS')
     FROM emp;

-- 내장함수 (CASE)
--    DECODE와 같은 기능
SELECT deptno,
        CASE deptno
          WHEN 10 THEN 'ACCOUNTING'
            WHEN 20 THEN 'RESEARCH'
            WHEN 30 THEN 'SALES'
            ELSE 'OPERATIONS'
          END as "Dept Name"
     FROM emp;

-- GROUP BY
-- 부서별로 그룹한 결과와 사원수 조회
SELECT b.deptno, COUNT(a.empno)
  FROM emp a, dept b
  WHERE a.deptno = b.deptno
  GROUP BY b.deptno;

-- 부서별로 그룹하여  부서번호, 인원수, 급여의 평균,
-- 급여의 합을 조회하는 예제
SELECT deptno, COUNT(*), ROUND(AVG(sal)) "급여평균",
            ROUND(SUM(sal)) "급여합계"
     FROM emp
     GROUP BY deptno;
 
-- 업무별로 그룹하여  업무, 인원수, 평균 급여액,
-- 최고 급여액, 최저 급여액 및 합계를 조회하는 예제
SELECT job, count(empno),AVG(sal)"평균",
       MAX(sal), MIN(sal), SUM(sal)
  FROM emp
  GROUP BY job;

--HAVING
--사원수가 5명이 넘는 부서의 부서명과 사원수 조회
SELECT d.dname, count(e.empno)
  from emp e, dept d
  where e.deptno = d.deptno
  group by d.dname
  having count(e.empno) >= 5;
 
--서브쿼리
SELECT ename,job
  FROM emp
  WHERE job = (SELECT job
              FROM emp
              WHERE empno = 7369);

'개발개발 > 오라클' 카테고리의 다른 글

SQL의 종류  (0) 2012.05.07
SELECT문 세부정리  (0) 2012.04.09
오라클 명령어 간단 정리  (0) 2012.04.09
Posted by 공돌공돌
,

SQL의 종류

1. DDL (Data Definition Language) : 데이터베이스 객체(테이블,뷰,인덱스..)의 구조를 정의 합니다.

SQL문

내 용
CREATE 데이터베이스 객체를 생성 합니다.
DROP 데이터베이스 객체를 삭제 합니다.
ALTER 기존에 존재하는 데이터베이스 객체를 다시 정의하는역할을 합니다.
 

2. DML (Data Manipulation Language) : 데이터의 삽입,삭제,갱신등을 처리

SQL문 내 용
INSERT 데이터베이스 객체에 데이터를 입력 한다.
DELETE 데이터베이스 객체의 데이터를 삭제 한다.
UPDATE 데이터베이스 객체안의 데이터 수정 한다.

3. DCL (Data Control Language) : 데이터베이스 사용자의 권한을 제어

SQL문 내 용
GRANT 데이터베이스 객체에 권한을 부여 한다.
REVOKE 이미 부여된 데이터베이스 객체 권한을 취소한다.

 

 

 

출처 http://www.oracleclub.com/lecture/1003

'개발개발 > 오라클' 카테고리의 다른 글

Oracle 오라클 쿼리 예제  (0) 2012.05.09
SELECT문 세부정리  (0) 2012.04.09
오라클 명령어 간단 정리  (0) 2012.04.09
Posted by 공돌공돌
,

jboot, jdown 파일을 만들어서

구동 다운을 쉽게쉽게 하자 ~!

먼저 환경변수(path)에 등록한다 !!

C:\TmaxSoft\JEUS6.0\bin

 

그리고 이 위치에 jboot.cmd 파일을 만들어서

jeus -U<administrator> -P<password>

이렇게 써주고 저장한다 !

이것으로 구동과 관리자모드를 동시에!!!

 

같은 위치에 다시 jdown.cmd 파일을 만들어서

jeusadmin <hostname> -U<administrator> -P<password> jeusexit

이렇게 저장한다 !!

 

차후에 제우스를 구동할 땐

 

이렇게 만 써주면 된다는거~!

물론 내릴 대도 jboot 대신 jdown 만 쓰면 된다!!

 

아 지금 퇴근시간에 쫓겨 쓰느라 ;; 뭘 빼먹진 않았겠지 ;;

회식만 아니라면 천천히 쓰는데 .ㅋㅋㅋ

오늘 회식은 돈뜰~!!!

'개발개발 > WAS' 카테고리의 다른 글

web.xml 설정 태그 정리  (1) 2012.08.18
Jeus 설치 및 설정...  (0) 2012.04.24
Posted by 공돌공돌
,

장작 이틀동안 설치 도전 끝에 성공 ...

VMware에 깔다가 안되서 포기하고

윈도우7 64비트에 시도해서 결국 이틀만에 성공했다

아.... 내 시간 ....

제우스 .. 평생 잊지 않겠다....

뭐 설치파일 받고 라이센스 받고 Next Next 하는 건 생략 !

중요한건 환경변수 설정!!!

이중 몇개는 Jeus 설치시 자동으로 해주지면 그외에는 다 설정해줘야 한다

내가 한건 저 다섯개다!!

그리고 라이센스 등록!!

메일로 제공된 license.dat 파일을 받고

해당 위치에 붙여넣는다 !

여기서 주의할점 !!

언제 쓸지는 모르지만 기존의 license 파일은 백업용으로 이름을 바꿔 놓는다 삭제안하구!

그리고 새롭게 붙여넣기 한 license.dat 파일에서 확장자를 삭제한다 !!

 

여기까지는 쉬웠다. 문제는 구동 ㅠㅠ

드럽게 에러 많이 나더라 ..

30분전 쯤에 최종 구동과 IM연동까지 끝냈지만 ....

그 전까지 뭘 잘못해서 안됐는지 아직도 모르겠다. .. 그냥 순서에 맞게 했는데 ....

각설하고

 

cmd 창에서 jeus 치고

다시 새로운창에서 cmd를 켜고 jeusadmin <hostname> -U<administrator> -P<password> 를 입력한다

로그인 후 boot  입력하면 완료~!

자 그럼 페이지 확인~!

 

 

'개발개발 > WAS' 카테고리의 다른 글

web.xml 설정 태그 정리  (1) 2012.08.18
Jeus jboot, jdown 만들기~!  (0) 2012.04.24
Posted by 공돌공돌
,

변수

개발개발/자바 2012. 4. 16. 14:45

 

 

 

변수의 종류

선언위치 

생성시기 

 클래스 변수

클래스 영역

 클래스가 메모리에 올라갈 때

 인스턴스 변수

 인스턴스가 생성되었을 때

 지역 변수

클래스 영역 이외의 영역
(메서드, 생성자, 초기화 블럭 내부) 

 변수 선언문이 수행되었을 때

 

클래스변수의 초기화시점 : 클래스가 처음 로딩될 때 단 한번 초기화 된다.

인스턴스변수의 초기화시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다.

클래스변수의 초기화순서 : 기본값 → 명시적초기화 → 클래스 초기화 블럭

인스턴스변수의 초기화순서 : 기본값 → 명시적초기화 → 인스턴스 초기화 블럭 → 생성자

'개발개발 > 자바' 카테고리의 다른 글

3일차  (0) 2013.08.28
2일차  (0) 2013.08.28
초보 Java 웹 개발자들을 위한 학습 로드맵 프로그래밍  (0) 2012.05.16
생각하고 코딩하기  (0) 2012.04.13
HashMap 정의, 예제  (1) 2012.04.13
Posted by 공돌공돌
,
지식인을 보다가 자바 기본문제를 물어보는 질문이 있었다

난 심심풀이로 풀어보았다

문제는 1+(1+2)+(1+2+3)+(1+2+3+4)+...+(1+2+3+...+10)의 결과를 계산하시오

내가 푼건

                               
                                int a,b,sum=0;
		int count=1;
		
		for(a=1; a<=10; a++)
		{
			if(count <= a)
			{
				for(b=1; b<=a; b++)
				{
					sum+=b;	
				}
			}
			count++;
		}
		System.out.println(sum);

생각도 안하고 그냥 짜고 실행보니까 맞길래 올렸다

근데 곧 올라온 또 다른 사람의 답변...

		int sum = 0;
		int totalSum = 0;

		for (int i = 1; i <= 10; i++)
		{
			sum += i;
			totalSum += sum;
		}
		System.out.println("totalSum=" + totalSum);

바로 내 답변 지웠다

쪽팔렸다..

생각좀 하자...

'개발개발 > 자바' 카테고리의 다른 글

3일차  (0) 2013.08.28
2일차  (0) 2013.08.28
초보 Java 웹 개발자들을 위한 학습 로드맵 프로그래밍  (0) 2012.05.16
변수  (0) 2012.04.16
HashMap 정의, 예제  (1) 2012.04.13
Posted by 공돌공돌
,

(1) HashMap 사용하기

- Key Value를 하나의 쌍으로 저장되는 구조이며 저장되는Value Key null을 허용합니다.

- 하지만 키의 중복은 허용하지 않으므로 null을 가지는 Key 2개일 수는 없습니다.

- 동기화가 포함되지 않았으므로 Multi-Thread환경에서의 구현이 아니라면 Hashtable

비해서 처리 속도가 빠른 장점을 가지고 있습니다.


(2) HashMap 메소드 요약




(3) Sample Code

i) 간단한 HashMap 코드

01 package com.map;
02
03 import java.util.HashMap;
04
05 public class HashMapExample1 {
06 public static void main(String[] args) {
07 HashMap<String, Integer> map = new HashMap<String, Integer>();
08
09 map.put("해리", new Integer(10));
10 map.put("해르미온느", new Integer(100));
11 map.put("론", new Integer(85));
12 map.put("드레이코", new Integer(93));
13 map.put("네빌",new Integer(70));
14 map.put("해르미온느", new Integer(100)); //key의 중복 허용하지 않음
15 map.put(null, new Integer(50)); //key에 null을 인정
16 map.put("강호동", null); //value에 null을 인정
17
18 System.out.println(map);
19
20 Integer num = map.get("해르미온느");
21 System.out.println("해르미온느의 성적은? "+num);
22
23 num = map.get(null);
24 System.out.println("null의 성적은? "+num);
25 }
26 }

<< 출력 결과 >>

해르미온느의 성적은? 100

ii) HashMap에서 key, value추출해보기

01 package com.map;
02
03 import java.util.HashMap;
04 import java.util.Iterator;
05 import java.util.Set;
06
07 public class MapEx1 {
08 public static void main(String[] args) {
09 String[] msg = {"Berlin","Paris","Seoul","New York","London"};
10
11 HashMap<Integer,String> map = new HashMap<Integer,String>();
12
13 for(int i=0; i < msg.length; i++)
14 map.put(i, msg[i]);
15
16 System.out.println(map);
17
18 //중계 객체(Iterator로 변환하기 위한)
19 //1. Set<Integer> s = map.keySet();
20 //2. Iterator<Integer> keys2 = s.iterator();
21 //=> 아래와 같이 1라인으로 변환가능
22 Iterator<Integer> keys2 = map.keySet().iterator();
23
24 while(keys2.hasNext()){
25 Integer key = keys2.next();
26 System.out.print("key: "+key);
27 System.out.print(", value: "+map.get(key)+'\n');
28 }
29 }
30 }

<< 출력 결과 >>

{0=Berlin, 1=Paris, 2=Seoul, 3=New York, 4=London}

key: 0, value: Berlin

key: 1, value: Paris

key: 2, value: Seoul

key: 3, value: New York

key: 4, value: London

iii) 간단한 Hashtable 예제

01 package com.map;
02
03 import java.util.*;
04
05 public class HashtableTest {
06 public static void main(String[] args) {
07 //key와 value에 null을 허용하지 않음
08 Hashtable<String, Double> ht = new Hashtable<String, Double>();
09
10 ht.put("김형중", 182.5);
11 ht.put("김범", 180.3);
12 ht.put("금잔디",163.6);
13 ht.put("구준표",187.2);
14 //ht.put("금잔디", null); => Error!
15 //ht.put(null, 163.5); => Error!
16
17 System.out.println(ht);
18
19 Scanner input = new Scanner(System.in);
20 System.out.print("# 이름을 입력하세요 >> ");
21 String key = input.nextLine();
22
23 double height = ht.get(key);
24 System.out.println(key+"의 신장 : "+height);
25
26 System.out.println("\n이름\t 신장");
27 System.out.println("--------------------");
28
29 Set<String> set = ht.keySet();
30 for(String item : set){
31 height = ht.get(item);
32 System.out.println(item+" \t"+height);
33 }
34
35 }
36 }

<< 출력 결과 >>

{김형중=182.5, 구준표=187.2, 금잔디=163.6, 김범=180.3}

# 이름을 입력하세요 >> 금잔디

금잔디의 신장 : 163.6

이름 신장

--------------------

김형중 182.5

구준표 187.2

금잔디 163.6

김범 180.3

'개발개발 > 자바' 카테고리의 다른 글

3일차  (0) 2013.08.28
2일차  (0) 2013.08.28
초보 Java 웹 개발자들을 위한 학습 로드맵 프로그래밍  (0) 2012.05.16
변수  (0) 2012.04.16
생각하고 코딩하기  (0) 2012.04.13
Posted by 공돌공돌
,

SELECT문 세부정리

   SELECT [c_name] FROM [t_name] WHERE [c_name] LIKE [%searching%] ORDER BY [c_name] DESC;
   SELECT * from org_user WHERE email IS NULL;   //이메일이 없는 유저 출력
   SELECT * from org_user WHERE create_dt >to_date('12/03/15') AND ex_user_type='1';
            // 12.3.15일 이후 가입했으면서 비정규직 출력


   SELECT * from org_user WHERE name LIKE '서울%';  //주소가 서울로 시작되는 사람 출력
   SELECT * from org_user WHERE ex_ssn LIKE '_______1%'; //남자인 사람 출력(뒷자리 1로 시작)
     * 가나%     : 앞에 '가나'가 오는 모든 문자열
     * %가나%    : 어느 위치든 '가나'가 포함되어 있는 모든 문자열
     * %가나     : 뒤에 '가나'가 오는 모든 문자열
     * ___가     : 네번째에 '가'가 오는 문자열
     * __가___나 : 세번째에 '가', 일곱번째에 '나'가 오는 문자열


   SELECT * from org_user WHERE name IN('장재순','장잭순'); //이름이 장재순 또는 장잭순 인 사람 출력
   SELECT * from org_user ORDER BY name, id;  // 이름, id 순으로 검색 =>내림차순
   SELECT * from org_user WHERE rownum<4 ORDER BY name DESC; //이름을 상위레코드 3개만 내림차순검색

 

'개발개발 > 오라클' 카테고리의 다른 글

Oracle 오라클 쿼리 예제  (0) 2012.05.09
SQL의 종류  (0) 2012.05.07
오라클 명령어 간단 정리  (0) 2012.04.09
Posted by 공돌공돌
,

INSERT INTO [t_name]([c_name) VALUES ([data]);
DELETE FROM [t_name] WHERE [condition];
CREATE TABLE [t_name](c_name type option...);
UPDATE [t_name] SET [c_name]=? WHERE [condition]
ALTER TABLE [t_name] ADD([c_name c_type c_option]);
ALTER TABLE [t_name] MODIFY([c_name c_type c_option]);
ALTER TABLE [t_name] DROP COLUMN [c_name];

 

//자세한건 차후 정리 예정

'개발개발 > 오라클' 카테고리의 다른 글

Oracle 오라클 쿼리 예제  (0) 2012.05.09
SQL의 종류  (0) 2012.05.07
SELECT문 세부정리  (0) 2012.04.09
Posted by 공돌공돌
,