곧 Spring Framework에 대한 내용을 게시할 예정인데


Framework가 무엇인지 알아보자.


출처 - 네이버 어학사전




네이버 선생님의 어학사전에 따르면 뼈대, 틀, 체계와 같은 의미로 쓰인다.


어떤 단어가 기술 이름과 같은 곳에 쓰일때에는 절대 연관성이 없는 단어를 끌어다 쓰지 않는다.


그러므로 프로그래밍에서 Framework 또한 기존의 의미에서 벗어나지 않는다는 얘기다.


프로그래밍에서 쓰이는 Framework의 뜻은


개발자가 따르는 가이드나


개발자가 할 수 있는 개발의 범위를 지정하여 제한하거나


개발자가 사용할 수 있는 다양한 도구 플러그인을 말한다.





장단점이 중요한데


장점으로는


1. 개발 시간의 단축


2. 정형화 되어 일정 수준의 품질을 기대 할 수 있다.


3. 유지 보수가 쉽다.




단점으로는


1. 너무 의존하게 되면 개발자들의 능력이 떨어진다 (이 부분은 사전적인 장단점으로 사람마다 다르다고 생각한다.)


2. 어렵기 때문에 습득하는 시간이 오래걸린다





Framework의 종류로는 4가지가 있다.



영속성 Framework 

 데이터 저장, 조회, 변경, 삭제를 다루는 클래스 및 설정 파일들을 라이브러리화 하여 구현

Mybatis

Hibernate

자바 Framework

 Java EE를 통한 웹 어플리케이션 개발에 초점, 필요한 요소들을 모듈화

 Spring Framework

전자정부표준 - Spring

Struts

화면 구현 Framework

 Front-End를 보다 쉽게 구현할 수 있게 틀을 제공

 Bootstrap

Foundation

MDL

기능 및 지원 Framework

 특정 기능, 업무 수행에 도움을 줄 수 있는 기능을 제공

 Log4j

JUnit 5

ANT















이번 예는 결과로 보는 편이 편하다.

Formatting Tags의 예

먼저 Body 부분


    <h1 align="center">JSTL Fmt Library Tag Test</h1>
   
    <h2>fmt:formatNumber 태그 : 숫자에 포맷 적용하는 태그</h2>
   
    <c:set var="number" value="123456789"></c:set>
   
    <fmt:formatNumber value="${ number }" groupingUsed="true"></fmt:formatNumber>
    <br>

    <fmt:formatNumber value="1.234567" pattern="#.###"></fmt:formatNumber>
    <br>

    <fmt:formatNumber value="1.2" pattern="#.##"></fmt:formatNumber>
    <br>

    <fmt:formatNumber value="1.2" pattern="#.00"></fmt:formatNumber>
    <br>

    <fmt:formatNumber value="0.12" type="percent"></fmt:formatNumber>
    <br>

    <fmt:formatNumber value="123456789" type="currency"></fmt:formatNumber>
    <br>

    <fmt:formatNumber value="123456789" type="currency" currencySymbol="$"></fmt:formatNumber>
   
   
   
    <hr>
   
   
   
    <h2>fmt:formatDate 태그 : 날짜와 시간에 포맷 적용하는 태그</h2>

    <c:set var="today" value="<%= new java.util.Date() %>"></c:set>

    오늘 날짜 : <fmt:formatDate value="${ today }" type="date"/>
    <br>

    현재 시간 : <fmt:formatDate value="${ today }" type="time"/>
    <br>

    현재 날짜와 시간 : <fmt:formatDate value="${ today }" type="both"/>
    <br>

   
    <h2>날짜와 시간에 제공되는 포맷을 적용한 경우</h2>
   
    [default] : <fmt:formatDate value="${ today }" type="both" dateStyle="default" timeStyle="default"/>
    <br>

    [short] : <fmt:formatDate value="${ today }" type="both" dateStyle="short" timeStyle="short"/>
    <br>

    [medium] : <fmt:formatDate value="${ today }" type="both" dateStyle="medium" timeStyle="medium"/>
    <br>

    [long] : <fmt:formatDate value="${ today }" type="both" dateStyle="long" timeStyle="long"/>
    <br>

    [full] : <fmt:formatDate value="${ today }" type="both" dateStyle="full" timeStyle="full"/>
    <br>

   
    <h3>원하는 포맷으로 pattern 적용한 경우</h3>

    현재 날짜 : <fmt:formatDate value="${ today }" type="date" pattern="yyyy/mm/dd (E)"/>
    <br>

    현재 시간 : <fmt:formatDate value="${ today }" type="time" pattern="(a) hh:mm:ss"/>
    <br>

    현재 날짜와 시간 : <fmt:formatDate value="${ today }" type="both" pattern="yyyy/mm/dd (E) (a) hh:mm:ss"/>
    <br>



결과 화면은 다음과 같다.
















Function Tags의 예




    <h1 align="center">JSTL Function Library Tag Test</h1>


    <h3>문자열 처리에 관련된 함수들이다.</h3>
    <h3>el 안에서 값 처리용으로 사용된다.</h3>
   
    <c:set var="str" value="How are you?"></c:set>
   
    str : ${ str }
    <br>


    you가 포함되어 있나 : ${ fn:contains(str, 'you') }
    <br>


    how가 포함되어 있나 : ${ fn:contains(str, 'how') }
    <br>


    대소문자 구분 없이 how 포함되는지 확인 : ${ fn:containsIgnoreCase(str, 'how') }
    <br>


    모두 대문자로 : ${ fn:toUpperCase(str) }
    <br>


    모두 소문자로 : ${ fn:toLowerCase(str) }
    <br>


    are의 위치는 : ${ fn:indexOf(str, "are") }
    <br>


    How를 Where로 바꿈 : ${ fn:replace(str, "How", "Where") }
    <br>


    are 분리 추출 : ${ fn:substring(str, 4, 7) }
    <br>
   
    <c:set var="arr" value="${ fn:split(str, ' ') }"></c:set>


    <c:forEach items="${ arr }" varStatus="st">
        <c:out value="${ st.count } : ${ arr[st.index] }"></c:out>
    </c:forEach>
   
    <br>
   
    하나로 합치기 : <c:out value="${ fn:join(arr, '-') }"></c:out>
















https://qdgbjsdnb.tistory.com/217



먼저 위 게시글에서 라이브러리, jar 파일 다운로드가 필요하다.







JSTL은 JSP Standard Tag Library는 JSP에서 사용하는 커스텀 태그로 자주 사용하는 코드들의 집합을


사용하기 쉽게 태그형식으로 만들어 놓은 라이브러리다.


여태껏 써오던 <%%> 부분이 정말 간단하게 표현된다.


먼저 JSP 파일에 사용할 태그 라이브러리를 선언해야 한다.


라이브러리 종류는 다음과 같다.



Core Tags

 변수선언, url, 조건문, 반복문 등 포함

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 Formatting Tags

 메시지 형식, 숫자, 날짜 등 포맷

<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

 Function Tags

 trim, substring과 같은 유용한 문자열 처리함수

<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

 XML Tags

 XML을 읽고 파싱처리 등에 필요한 라이브러리

<%@taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>

 SQL Tags

 JSP에서 DB를 연동, 쿼리 실행

<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>



해당 taglib prefix 선언을 페이지 상단에 명시하고 사용하면 된다.


이 중 아래의 XML, SQL은 사용을 지양한다.


XML의 경우는 JSON을 사용하여 좀 더 효율적으로 사용하기 때문이고


SQL의 경우는 프로젝트 구조(MVC 패턴)상 JSP에 사용하지 않는다. 유지보수에도 영향을 끼치므로 MVC 패턴을 따르는걸 추천






예제를 통해 라이브러리의 태그들을 어떻게 쓰는지 보자.



Core Tags의 사용법




 - c:set 태그 : 변수선언


    <!-- Scope 생략 시 기본 pageScope가 된다. -->
    <c:set var="num1" value="100" scope="session"></c:set>
    <c:set var="num2" value="200" scope="session"></c:set>


 - c:set 태그 : 배열 또는 컬렉션으로 사용할 문자열 선언


    <c:set var="colors">red, yellow, green, orange, blue, magenta</c:set>




선언된 변수들은 ${ num1 }과 같이 EL 태그로 사용하면 된다.



 - c:remove 태그 : 변수 삭제
   
    <!-- 삭제 시 scope를 지정하지 않으면 모든 scope의 동일 이름의 변수를 제거한다. -->
    <c:remove var="num1" scope="session"/>
    <c:remove var="num2" scope="session"/>





※ 이스케이프 시퀀스 : <, >, &, 등의 특수문자를 &lt;와 &gt;과 &amp;로 바꿔서 인식한다.




 - c:out 태그 : 값 출력용


    <c:out value="core라이브러리의 <out> 태그는 값을 화면에 출력하는 태그이다."></c:out>
    <!-- escapeXml false로 지정하면, <, > 등을 태그로 인식하고, true로 지정하면 문자로 인식한다. 기본값은 true이다. -->



    <c:out value="<h2>데이터 출력</h2>" escapeXml="false"></c:out><br>
    <c:out value="<h2>데이터 출력</h2>" escapeXml="true"></c:out><br>
   
    <h2>c:out 태그의 default 속성</h2>
    <!-- el로 가져오는 값이 없는 경우 대체할 값에 대해 default 값으로 설정 가능 -->
    <c:out value="${ param.name }" default="아무개님"/>




 - c:if 태그 : 조건문, if의 경우는 else가 따로 없으므로 다시 if태그를 사용하면 된다.


    <c:set var="value1" value="9" scope="page"/>
    <c:set var="value2" value="3" scope="page"/>
   
    <c:if test="${ value1 >= value2 }">
        <h3>value1이 큽니다.</h3>
    </c:if>


    <c:if test="${ value1 < value2 }">
        <h3>value2가 큽니다.</h3>
    </c:if>




 - c:choose : switch문, c:when : case문, c:otherwise : default문



<c:choose>
        <c:when test="${ no == 1 }">
            <h3>안녕하세요</h3>
        </c:when>


        <c:when test="${ no eq 2 }">
            <h3>반갑습니다.</h3>
        </c:when>


        <c:otherwise>
            <h3>환영합니다.</h3>
        </c:otherwise>
</c:choose>




 - c:forEach태그 : for문


    <c:forEach begin="1" end="10">
        반복실행<br>
    </c:forEach>


   
    <c:forEach var="size" begin="1" end="7" step="1">
        <font size="${ size }">글자크기 ${ size }</font>
    </c:forEach>




 - c:forEach 태그 : 배열 또는 컬렉션 연속 처리에 for~each문처럼 사용할 수 있기에 매우 편리하다.


    <c:forEach var="color" items="${ colors }" varStatus="st">
        <font color="${ color }">
            ${ st.count } : 글자색 ${ color }<br>
        </font>
    </c:forEach>






 - c:forTokens 태그 : 문자열을 토큰으로 분리 처리할 때 사용 (split과 같다)
    <ul>
        <c:forTokens var="color" items="yellow blue pink red green" delims=" ">
            <li>${ color }</li>
        </c:forTokens>
    </ul>



  - 여러개의 토큰 문자를 가지고 분리 처리할 수도 있음


    <c:forTokens var="color" items="yellow-blue*pink/red green" delims="/*- ">
        ${ color }<br>
    </c:forTokens>






- c:url 태그 : 링크 설정 정보 별도 지정시 사용하는 태그 , param을 이용하여 값을 넘길 수 있다.


    <c:url var="fmtlink" value="testJstlCoreResult.jsp">
        <c:param name="num" value="77"></c:param>
    </c:url>


    <a href="${ fmtlink }">결과화면 연결</a>











EL, Expression Language는 JSP 2.0에 추가되어


<%=%> 와 같은 jsp에 쓰는 java 코드를 간결하게 사용하는 방법





EL의 연산자 기호는 다음과 같이 있다.


사용하는데 일반 연산자를 써도 상관없긴 하다.




 일반 연산자

 EL 기호 연산자

+, -

 +, -

 *, /

*, div

 %

 mod

 &&

and

 ||

or

 !

not

 >

lt(less than)

 <

gt(greater than)

 >=

 le(less or eqaul)

 <=

 ge(greater or equal)

 ==

eq(equal)

 !=

 ne(not equal)

 value == null

 empty






EL 태그의 내장 객체


pageScope

 page영역의 객체에 접근

 requestScope

 request영역의 객체에 접근

 sessionScope

 session영역의 객체에 접근

 applicationScope

 application영역의 객체에 접근

 param

 전달된 파라미터값을 받아올 때

 paramValues

 전달된 파라미터값을 배열로

 header

 특정 헤더 정보를 받아올 때

 headerValues

 특정 헤더 정보를 배열로 받아올 때

 cookie

 ${cookie.key} 형식으로 쿠키값 조회

 initParam

 초기 파라미터를 조회

 pageContext

 pageContext 경로 조회










EL 태그의  간단한 예



전달된 request 객체에 저장된 정보 출력 예



name : ${ requestScope.name }
age : ${ requestScope.age }
phone : ${requestScope.phone }


name : ${ name }
age : ${ age }
phone : ${ phone }







ArrayList items = (ArrayList) request.getAttribute("items");


ArrayList와 같이 전달된 값을 출력하는 예



0 : ${ requestScope.items[0] }
1 : ${ requestScope.items[1] }
2 : ${ requestScope.items[2] }
   
0 : ${ items[0] }
1 : ${ items[1] }
2 : ${ items[2] }






전달된 객체의 필드 값들 출력 예, member라는 객체를 request 형식으로 받음



이름 : ${ member.name }
나이 : ${ member.age }
전화번호 : ${ member.phone }
이메일 : ${ member.email }






Parameter로 넘어온 값 출력



    <%
        String pName = request.getParameter("name");
        int price = Integer.parseInt(request.getParameter("price"));
        String[] pNo = request.getParameterValues("no");
        String option = request.getParameter("option");
    %>


이와 같이 받던 데이터를 아래와 같이 간단하게


    상품명 : ${ param.name }
    가격 : ${ param.price }
    제품번호 : ${ paramValues.no[0] }와 ${ paramValues.no["1"] }
    옵션 : ${ (empty param.option)?"옵션없음":param.option }






스코프를 이용하여 구분지어 출력



Request

    이름 : ${ requestScope.member.name }
    나이 : ${ requestScope.member.age }
    전화번호 : ${ requestScope.member.phone }
    이메일 : ${ requestScope.member.email }
   

      Session
    이름 : ${ sessionScope.member.name }
    나이 : ${ sessionScope.member.age }
    전화번호 : ${ sessionScope.member.phone }
    이메일 : ${ sessionScope.member.email }
   
    동일한 이름의 네이밍이 있다면 request가 우선되어 출력됨

    이름 : ${ member.name }
    나이 : ${ member.age }
    전화번호 : ${ member.phone }
    이메일 : ${ member.email }





간단한 예 이외에 내장 객체들은 다음 게시글에서 쭉 사용한다.




JSP Action 태그는 XML을 이용하여 JSP의 태그 문법들을 확장시켜준다.


브라우져가 아닌 웹 컨테이너에서 실행되어 연산 결과를 브라우져에 전달해준다.





JSP 기본 제공 태그는 다음과 같다.


jsp:include             현재 페이지에 특정 페이지를 포함시킴


jsp:forward            페이지를 특정 페이지로 이동시킴 ( = request.forward())


jsp:param              해당 페이지에 전달할 값을 기록


jsp:usebean            Java bean 객체를 사용하기 위한 태그


jsp:setProperty        java 모델 vo의 Setter와 같음


jsp:getProperty        java 모델 vo의 Getter와 같음








간단한 예




- 페이지 포함


<jsp:include page="common.jsp"/>


- 다른 페이지로 이동 시킬 때 request 값까지 설정


    <% request.setAttribute("name", "김둘리"); %>


    <jsp:forward page="testForward.jsp"></jsp:forward>


값 설정에는 따로 키워드가 없어서 이전과 같은 방식으로 사용






useBean은 자바 객체 파일을 불러와 필드 값을 컨트롤 한다. setProperty와 getProperty가 함께 쓰임


    <jsp:useBean id="m" class="com.kh.el.model.vo.Member" scope="page"></jsp:useBean>
    <!-- java 파일에서 id = 변수명, class = import문 scope = 이 페이지에서만 쓰겠다. -->


    <jsp:setProperty property="name" name="m" value="김둘리"/>

    <!-- java에서 m.setName("김둘리"); 와 같음 -->


    <jsp:setProperty property="age" name="m" value="20"/>
    <jsp:setProperty property="phone" name="m" value="010-1234-5678"/>
    <jsp:setProperty property="email" name="m" value="dullee@kkan.or.kr"/>
   
    <!-- setProperty가 Setter 였다면??  getProperty는 Getter이다. -->
    이름 : <jsp:getProperty property="name" name="m"/><br>
    나이 : <jsp:getProperty property="age" name="m"/><br>
    전화번호 : <jsp:getProperty property="phone" name="m"/><br>
    이메일 : <jsp:getProperty property="email" name="m"/><br>





http://tomcat.apache.org/taglibs/standard/



위의 톰캣 사이트에서 Jar 파일 받아서 lib에 추가하면 된다.


버젼은 1.2를 사용하고


이후에 나온 버전은 여러가지 기능들이 분리되어 파일이 여러개가 된다고 한다..?



jstl-1.2.jar


같은 파일이므로 이것을 받아도 된다.








Action태그, EL 태그란 Session이나 Attribute Parameter와 같은 형식으로


받은 데이터나 직접 변수를 선언하여 사용하거나


함수들을 매우 간편하게 사용 할 수 있는 기능이다.







먼저 서블릿에서 데이터를 받았을 때 사용했던 방식을 살펴보자


JSP 페이지 상단에


<%@page import="com.jsp.member.model.vo.Member"%>



Member mem = (Member)session.getAttribute("member")


%>


바디 부분


<body>

<p><%=mem%></p>

</body>



위와 같은 형식으로


객체를 불러오고, 변수 선언, 값 불러오기, 형 변환을 거처서 사용했다.





하지만 JSTL을 사용하면 많이 줄어든다.


<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


위에 tag 라이브러리 c(core)를 사용한다고 선언하고


바로 바디 부분에서


<p>${ member }</p>


위와 같이 사용할 수 있다.


몰론 생략된 구문이 몇개가 있다.


Scope 연산자라고 불러온 값이 Session 값인지 parameter 값인지 등 구분하는 키워드를 앞에 붙여주는 것이다.


만약 Session과 parameter에 같은 이름으로 값을 전달했다면 어느 데이터를 가져오는지 확실치 않기 때문..


불러오는 우선순위가 있어 상관없지만 많은 값들을 기억하기 힘드니 명시하는것을 추천


${ sessionScope.member }


다음 글에서 자세히 설명한다.

















+ Recent posts