<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bonvoyage.log</title>
        <link>https://velog.io/</link>
        <description>Hello World!</description>
        <lastBuildDate>Thu, 23 Nov 2023 05:48:24 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. bonvoyage.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bonvoyage_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[자바스크립트] 논리 연산자]]></title>
            <link>https://velog.io/@bonvoyage_/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%85%BC%EB%A6%AC-%EC%97%B0%EC%82%B0%EC%9E%90</link>
            <guid>https://velog.io/@bonvoyage_/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%85%BC%EB%A6%AC-%EC%97%B0%EC%82%B0%EC%9E%90</guid>
            <pubDate>Thu, 23 Nov 2023 05:48:24 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p><strong>||(or)</strong>
여러개 중 하나라도 true면 true. 즉 모든 값이 false일때만 false를 반환함.
or는 첫 번째 true를 발견하는 즉시 평가를 멈춤.</p>
</li>
<li><p><strong>&amp;&amp;(and)</strong>
모든 값이 true면 true. 즉 하나라도 false면 false를 반환함. 
첫 번째 false를 발견하는 즉시 평가를 멈춤.</p>
</li>
<li><p><strong>!(not)</strong>
true면 false, false면 true.</p>
</li>
</ul>
<hr>
<h3 id="우선순위">우선순위</h3>
<ul>
<li>and가 or보다 우선 순위가 높음. or에 우선순위를 주려면 or 부분을 ()로 감싸야 함. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바스크립트] 연산자 / 비교 연산자]]></title>
            <link>https://velog.io/@bonvoyage_/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%90</link>
            <guid>https://velog.io/@bonvoyage_/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%90</guid>
            <pubDate>Thu, 23 Nov 2023 04:31:18 GMT</pubDate>
            <description><![CDATA[<h3 id="나머지를-어디에-쓸까">나머지(%)를 어디에 쓸까</h3>
<ul>
<li><p>홀수 : x % 2 = 1</p>
</li>
<li><p>짝수 : y % 2 = 0</p>
</li>
<li><p>어떤 값이 들어와도 특정수 넘기면 안될 때 
ex) 
x % 5 = 0 ~ 4 사이의 값만 반환.</p>
</li>
</ul>
<hr>
<h3 id="거듭제곱">거듭제곱</h3>
<p>const num = 2**3;
console.log(num);
// 8 출력</p>
<hr>
<h3 id="우선-순위">우선 순위</h3>
<p>/ * &gt; + -</p>
<p>덧셈과 뺄셈을 우선시 해야 할 경우엔 괄호()를 사용.</p>
<hr>
<h3 id="연산자-줄여-쓰기">연산자 줄여 쓰기</h3>
<pre><code>let num = 10;
num = num + 5; 이를 아래 처럼 줄여 쓸 수 있음.
num += 5;
// -=, *=, /=, %= 도 마찬가지. </code></pre><hr>
<h3 id="증가-연산자-감소-연산자">증가 연산자, 감소 연산자</h3>
<pre><code>ex 1)
let num = 10;
num++; // 1만큼 증가.
num--; // 1만큼 감소.

ex 2)
let num = 10;
let result = num++; // 10 출력. 증가시키기전 값을 result 변수에 넣기 때문.

let result = ++num; // 11 출력. 증가된 값이 result에 저장됨.
</code></pre><hr>
<h3 id="동등연산자-">동등연산자(==, ===)</h3>
<p>1과 &quot;1&quot;을 같은 것으로 보고 true를 반환함. 타입까지 비교하기 위해서는 === 으로 작성함.</p>
<pre><code>const a = 1;
const b = &quot;1&quot;;
consol.log(a === b);
false를 반환함. ===를 일치 연산자라고 함.
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[자바스크립트] 대화 상자]]></title>
            <link>https://velog.io/@bonvoyage_/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%8C%80%ED%99%94-%EC%83%81%EC%9E%90</link>
            <guid>https://velog.io/@bonvoyage_/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%8C%80%ED%99%94-%EC%83%81%EC%9E%90</guid>
            <pubDate>Wed, 22 Nov 2023 08:49:30 GMT</pubDate>
            <description><![CDATA[<ul>
<li><strong>alert()</strong>
알려줌. 메세지를 보여줌.<pre><code>ex 1)
alert(&quot;안녕하세요&quot;);</code></pre><img src="https://velog.velcdn.com/images/bonvoyage_/post/01a92e42-17b1-4b19-a588-53fd9648c04f/image.jpg" alt=""></li>
</ul>
<hr>
<ul>
<li><strong>prompt()</strong>
입력 받음(사용자에게 입력값을 받을 때 사용).<pre><code>ex 1)
const name = prompt(&quot;이름을 입력하세요&quot;);
alert(&quot;환영합니다&quot; + name + &quot;님&quot;);</code></pre><img src="https://velog.velcdn.com/images/bonvoyage_/post/d3f76190-b22e-4b54-b08e-05ec9ea2bbc9/image.jpg" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/978477df-c430-4579-ab22-db1bbd3ebe44/image.jpg" alt=""></p>
<pre><code>ex 2) 디폴트 값 받기 - &quot;2020-10-&quot; 부분이 디폴트 값이 됨.
const name = prompt(&quot;이름을 입력하세요&quot;, &quot;2020-10-&quot;);
alert(&quot;환영합니다&quot; + name + &quot;님&quot;);</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/cc311bbe-766a-4ffb-afed-3beff62c9b44/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/b1b2768d-a25b-4e6e-9a62-a96629f14db9/image.jpg" alt=""></p>
<p>취소 버튼을 누를 경우에는 null 값이 반환됨.</p>
<hr>
<ul>
<li><strong>confirm()</strong>
확인 받음.</li>
</ul>
<pre><code>ex 1)
const test = confirm(&quot;당신은 성인 입니까?&quot;);
console.log(test)</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/040a13d8-a1e7-4d32-ba9e-2dba8dbf3490/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/78b8e435-0a77-4a75-9a78-bab01ae3482a/image.jpg" alt="">
취소 버튼을 클릭하면 false 반환.</p>
<p>주로 &quot;결제 하시겠습니까?&quot;, &quot;정말 삭제하시겠습니까?&quot; 등 확인할 때 사용함.</p>
<hr>
<p>대화형 상자 단점.</p>
<ol>
<li>스크립트 일시 정지</li>
<li>스타일링 불가능 - 스타일링 하고 싶을 경우 모달을 이용함.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바스크립트] 변수 자료형 / 형변환]]></title>
            <link>https://velog.io/@bonvoyage_/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%B3%80%EC%88%98-%EC%9E%90%EB%A3%8C%ED%98%95-%ED%98%95%EB%B3%80%ED%99%98</link>
            <guid>https://velog.io/@bonvoyage_/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%B3%80%EC%88%98-%EC%9E%90%EB%A3%8C%ED%98%95-%ED%98%95%EB%B3%80%ED%99%98</guid>
            <pubDate>Wed, 22 Nov 2023 08:24:41 GMT</pubDate>
            <description><![CDATA[<h3 id="변수-자료형">&lt;변수 자료형&gt;</h3>
<ul>
<li><strong>const</strong> : 변하지 않는 값(상수) - 가급적 대문자로 작성.</li>
<li><strong>let</strong> : 변할 수 있는 값 - 변수 이름이 동일하면 에러 뜸.</li>
</ul>
<hr>
<h3 id="형변환">&lt;형변환&gt;</h3>
<ol>
<li>문자열 변환</li>
</ol>
<ul>
<li><strong>String()</strong> : 문자열로 변환</li>
</ul>
<pre><code>ex)
const test = 123;
String(test);
console.log(test)

-- 123 출력</code></pre><hr>
<ol start="2">
<li>숫자로 변환</li>
</ol>
<ul>
<li><strong>Number()</strong> : 숫자로 변환</li>
</ul>
<pre><code>ex 1)
const test = &quot;123&quot;;
Number(test);
console.log(test)

-- 123 출력

ex 2)
Number(true); -- 1 출력
Number(false); -- 0 출력

ex 3)
Number(&quot;가나다&quot;); -- NaN 출력
Number(null); -- 0 출력
Number(Undefined) -- NaN 출력
Number(0) -- false 출력
Number(&#39;0&#39;) -- true 출력
Number(&#39;&#39;) -- false 출력
Number(&#39; &#39;) -- true 출력</code></pre><hr>
<ol start="3">
<li>Boolean 변환</li>
</ol>
<ul>
<li><strong>Boolean()</strong></li>
</ul>
<p>false가 되는 경우</p>
<p>1) 숫자 0
2) 빈문자열 &#39;&#39;
3) null
4) underfined
5) NaN</p>
<pre><code>ex 3)

Boolean(0)
Boolean(&#39;&#39;)
Boolean(null)
Boolean(underfined)
Boolean(NaN)

-- 모두 false 출력</code></pre><p>위 외를 제외한 나머지는 true가 됨.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[마이바티스 프레임워크] 마이바티스 설치하기]]></title>
            <link>https://velog.io/@bonvoyage_/%EB%A7%88%EC%9D%B4%EB%B0%94%ED%8B%B0%EC%8A%A4-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EB%A7%88%EC%9D%B4%EB%B0%94%ED%8B%B0%EC%8A%A4-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@bonvoyage_/%EB%A7%88%EC%9D%B4%EB%B0%94%ED%8B%B0%EC%8A%A4-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EB%A7%88%EC%9D%B4%EB%B0%94%ED%8B%B0%EC%8A%A4-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 18 Oct 2023 07:49:08 GMT</pubDate>
            <description><![CDATA[<h3 id="마이바티스-설치하기">마이바티스 설치하기</h3>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/929f4f9b-1c88-4fe0-8abb-20b42983ef94/image.jpg" alt=""></p>
<ol>
<li><p><a href="http://www.mybatis.org%EC%97%90">http://www.mybatis.org에</a> 접속한 후 Product 탭을 클릭함.</p>
</li>
<li><p>Mybatis 3 옆에 있는 download 링크를 클릭함.</p>
</li>
<li><p>mybatis-3.4.6.zip 파일을 클릭해 다운로드함.</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/6e836522-0424-4101-a6ec-4123117ffc3d/image.jpg" alt=""></p>
<ol start="4">
<li><p>다운로드한 압축 파일의 압축을 해제함.</p>
</li>
<li><p>mybatis-3.4.6.jar를 복사해 새로 만든 프로젝트의 lib 폴더에 붙여 넣음.</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스프링 프레임워크] 의존성 주입 실습]]></title>
            <link>https://velog.io/@bonvoyage_/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85-%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@bonvoyage_/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85-%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Fri, 13 Oct 2023 03:31:28 GMT</pubDate>
            <description><![CDATA[<p>의존성 주입의 두 방법인 setter를 이용한 방식과 생성자를 이용한 방식을 각각 실습을 통해 확인해 보겠음. 먼저 setter를 이용해 di를 실습하는 방식부터 알아봄.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스프링 프레임워크] 스프링 의존성 주입과 제어 역전 기능]]></title>
            <link>https://velog.io/@bonvoyage_/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85%EA%B3%BC-%EC%A0%9C%EC%96%B4-%EC%97%AD%EC%A0%84-%EA%B8%B0%EB%8A%A5</link>
            <guid>https://velog.io/@bonvoyage_/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85%EA%B3%BC-%EC%A0%9C%EC%96%B4-%EC%97%AD%EC%A0%84-%EA%B8%B0%EB%8A%A5</guid>
            <pubDate>Thu, 12 Oct 2023 08:54:12 GMT</pubDate>
            <description><![CDATA[<p>자바와 같은 객체 지향 프로그랭밍 언어에서 클래스는 특정 기능을 수행하는 부품 역할을 함. 우리가 살아가는 현실 세계에서도 어떤 부품을 사용하다가 이상이 있거나 오래 되면 다른 부품으로 교체해서 사용함.</p>
<p>마찬가지로 애플리케이션에서도 사용자의 요구 사항에 따라 클래스 기능을 변경하거나 다른 클래스 기능으로 대체해야 하는 경우가 자주 생김. 이러한 사황에서 좀 더 수월하게 대체할 수 있게 도입된 기능이 바로 의존성 주입(DI)과 제어 역행(IoC)임.</p>
<h3 id="의존성-주입하기">의존성 주입하기</h3>
<p>지금까지 우리가 프로그래밍을 할 때는 어떤 한 클래스가 다른 클래스의 기능을 사용하려면 당연히 개발자가 직접 코드에서 사용할 클래스의 생성자를 호출해서 사용했음. 즉, 사용할 클래스와 사용될 클래스의 관계는 개발자에 의해 직접 코드에서 부여됨.</p>
<p>의존성 주입이란 이런 연관 관계를 개발자가 직접 코딩을 통해 컴포넌트(클래스)에 부여하는 것이 아니라 컨테이너가 연관 관계를 직접 규정하는 것. 그러면 코드에서 직접적인 연관 관계가 발생하지 않으므로 각 클래스들의 변경이 자유로워짐(loosely coupled, 약한 결합).</p>
<blockquote>
<p>Note
<strong>강합 결합과 약한 결합</strong>
현실에서 우리는 자동차의 에어컨이 고장 나면 당연히 에어컨만 수리하거나 교체하면 됨. 하지만 만약 에어컨 기능이 자동차 엔진과 관련 있게 설계되었다면 어떨까. 에어컨은 작은 문제라도 생기면 자동차 엔진까지 손을 봐야 하는 상황이 됨. 즉 자동차의 부품은 같은 기능끼리는 강하게 결합하고, 큰 관련이 없는 기능과는 서로 영향을 주지 않게 만들어야 좋은 자동차라고 할 수 있음. 프로그램도 마찬가지임. 프로그램은 각각의 독립적인 기능들로 구성되어 있음. 쇼핑몰의 경우 크게 상품 관리, 주문 관리, 회원 관리, 게시판 관리 등으로 구성됨. 각 기능들은 또 세부 기능을 하는 여러 클래스들로 이루어 짐. 그런데 부품 기능을 하는 클래스에 변경 사항이 발생했을 때 그 클래스의 기능과 관련이 없는 다른 클래스까지 손봐야 한다면 자동차의 예처럼 여러 가지 문제가 발생할 수 있음. 따라서 서로 관련이 있는 기능들은 강하게 결합(tightly coupled)하고, 관련이 없는 기능들은 약하게 결합(loosely coupled)해야 좋은 프로그램인. 그 반대가 되면 안됨.</p>
</blockquote>
<p>전체 애플리케이션은 각각의 기능을 담당하는 컴포넌트들로 이뤄짐. 그리고 각 컴포넌트들은 다시 세부 기능을 수행하는 클래스들로 이뤄짐.</p>
<p>다른 클래스의 기능을 사용하려면 어떻게 해야 할까. 소스 코드에서 다른 클래스의 생성자를 호출해서 사용할 경우 기능을 구현하는 과정에서 다른 변경 사항이 발생하면 빠르게 대처하기가 어려움. 또다시 관련이 있는 모든 클래스들의 소스 코드를 수정해 줘야 하기 때문임.</p>
<p>따라서 스프링 프레임워크에서는 각 클래스들의 연관 관계를 클래스들 사이에서 맺는 것이 아니라 스프링 프레임워크에서 설정을 통해 맺어줌으로써 클래스들이 연관 관계를 갖지 않게 구현했음. </p>
<h3 id="의존성-주입을-사용하기-전-게시판-기능">의존성 주입을 사용하기 전 게시판 기능</h3>
<ul>
<li>BoardController.java</li>
</ul>
<p>각 클래스들의 기능을 보면 다른 클래스의 기능을 사용하기 위해 소스 코드에서 직접 다른 클래스 객체를 생성한 후 메서드를 호출하여 연동함.</p>
<pre><code>@WebServlet(&quot;/board/*&quot;)
public class BoardController08 extends HttpServlet {

    BoardService boardService;
    ArticleVO articleVO;

    public void init(ServletConfig config) throws ServletException {

        //BoardService 객체를 코드에서 직접 생성해서 사용함.
        boardService = new BoardService();
        articleVO = new ArticleVO();
    }
    ...</code></pre><ul>
<li>BoardService.java</li>
</ul>
<pre><code>public class BoardService {
    BoardDAO boardDAO;

    public BoardService() {

        // BoardDAO 객체를 코드에서 직접 생성해 데이터베이스와 연동함.
        boardDAO = new BoardDAO();
    }
    ...</code></pre><ul>
<li>BoardDAO.java</li>
</ul>
<pre><code>public class BoardDAO {
    private DataSource dataFactory;
    Connection conn;
    PreparedStatement pstmt;

    public BoardDAO() {
        try {
            Context ctx = new InitialContext();
            Context envContext = (Context) ctx.lookup(&quot;java:/comp/env&quot;);
            dataFactory = (DataSource) envContext.lookup(&quot;jdbc/oracle&quot;);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    ...</code></pre><p>현재 BoardDAO 클래스에서는 오라클과 연동해 게시판 기능을 구현하고 있음. 그런데 만약 중간에 오라클에서 Mysql로 데이터베이스를 변경한다고 가정해 보자. 지금과 같은 경우는 BoardDAO 클래스의 기능을 일일이 변경해 줘야 함. 그뿐만 아니라 경우에 따라서는 BoardDAO 클래스를 사용하는 BoardService 클래스의 기능도 변경해야 할 수도 있음.</p>
<p>이제까지는 클래스를 사용하려면 자바에서 배웠듯이 자바코드에서 클래스 생성자를 호출해 객체를 생성했음. 하지만 지금처럼 프로젝트 규모가 점점 커지는 상황에서 이렇게 자바 코드에서 직접 객체를 생성해서 사용하는 것은 복잡한 문제를 일으킬 수도 있음.</p>
<p>다른 클래스의 변경 사항이 연속적으로 다른 부분에 영향을 미친다면 이 방법(자바 코드에서 직접 객체를 생성해 사용하는 것)은 좋은 방법이 아님.</p>
<h3 id="인터페이스를-적용한-게시판-기능">인터페이스를 적용한 게시판 기능</h3>
<p>그럼 이번에는 앞에서 다룬 게시판 기능 구현 시의 문제점을 인터페이스를 사용해서 해결해 보겠음.</p>
<p>다음은 게시판 기능과 관련된 클래스들의 계층 구조를 나타낸 것임. 각각의 클래스가 인터페이스를 구현하는 구조를 이룸.</p>
<ul>
<li>오라클과 연동하는 게시판 클래스 계층 구조</li>
</ul>
<p>[BoardController] &lt;--- [BoardControllerImpl]</p>
<p>[BoardService] &lt;--- [BoardServiceImpl]</p>
<p>[BoardDAO] &lt;--- [BoardOracleDAOImpl]</p>
<p>다음은 각 클래스들이 상위 인터페이스를 구현한 후 오라클 데이터베이스와 연동하는 기능을 구현하는 소스임.</p>
<ul>
<li>BoardServiceImpl.java</li>
</ul>
<pre><code>public class BoardServiceImpl implements BoardService {
    BoardDAO boardDAO;

    public BoardService(){
        // 인터페이스를 이용해 하위 클래스 객체를 생성한 후 오라클 데이터베이스와 연동함.
        boardDAO = new BoardOracleDAOImpl();
    }
}
...</code></pre><ul>
<li>BoardOracleDAOImpl.java</li>
</ul>
<pre><code>public class BoardOracleDAOImpl implements BoardDAO {
    private DataSource dataFactory;
    Connection conn;
    PreparedStatement pstmt;

    public BoardDAO() {
        try {
            Context ctx = new InitialContext();
            Context envContext = (Context)ctx.lookup(&quot;java:/comp/env&quot;);
            dataFactory = (DataSource)envContext.lookup(&quot;jdbc/oracle&quot;);
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}
...</code></pre><p>이번에는 개발 중에 MySQL과 연동하는 기능이 생겼다가 가정함. 지금처럼 인터페이스로 구현한 경우에는 기존의 BoardOracleDAOImpl 클래스를 변경할 필요가 없음.</p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/ab743b68-bef2-4783-ae8a-f77c98c5db0a/image.jpg" alt="">
이미지처럼 BoardDAO 인터페이스를 구현한 또 다른 BoardMySqlDAOImpl 클래스를 구현한 후 다음 코드처럼 BoardServiceImpl에서 사용하면 됨.</p>
<ul>
<li>BoardServiceImpl.java</li>
</ul>
<pre><code>public class BoardServiceImpl implements BoardService {
    BoardDAO boardDAO;

    public BoardService() {
    // boardDAO = new BoardOracleDAOImpl();
    // 인터페이스를 이용해 하위 클래스 객체를 생성한 후 Mysql 데이터베이스와 연동함.
    boardDAO = new BoardMySqlDAOImpl();
    }
}</code></pre><p>인터페이스를 이용해 각 클래스를 구현한 후 각 클래스의 객체를 사용할 때는 인터페이스 타입으로 선언한 참조 변수로 접근해서 사용하면 됨. 그러면 완전하지는 않아도 앞의 경우보다 훨씬 클래스들 간 의존관계가 약해짐. 그러나 인터페이스를 사용해도 BoardServiceImpl 클래스 자체는 여전히 소스 코드에서 직접 수정해야 함.</p>
<h3 id="의존성-주입을-적용한-게시판-기능">의존성 주입을 적용한 게시판 기능</h3>
<p>앞의 게시판 예제를 통해 클래스들의 의존 관계가 강하게 결합되어 있으면 여러 가지 문제가 발생 할 수 있음을 알았음. 이번에는 스프링의 의존성 주입 기능을 이용해 각 클래스들 사이의 의존 관계를 완전히 분리하는 작업을 실습해 보겠음.</p>
<ul>
<li>의존성 주입을 적용했을 때 얻을 수 있는 장점들</li>
</ul>
<ol>
<li><p>클래스들 간의 의존 관계를 최소화하여 코드를 단순화할 수 있음.</p>
</li>
<li><p>애플리케이션을 더 쉽게 유지 및 관리할 수 있음.</p>
</li>
<li><p>기존 구현 방법은 개발자가 직접 코드 안에서 객체의 생성과 소멸을 제어했음. 하지만 의존성 주입은 객체의 생성, 소멸과 객체 간의 의존 관계를 컨테이너가 제어함.</p>
</li>
</ol>
<p>스프링에서 의존성 주입(이하 di)을 구현하려면 xml이나 애너테이션을 이용해 객체를 주입하여 객체들의 의존관계를 맺어주면 됨. 즉, di를 사용하여 각 객체들 간의 의존 관계를 최소화함으로써 코드를 단순화하고 유지보수를 쉽게 할 수 있음.</p>
<p>di는 객체의 생성, 소멸, 의존 관계를 개발자가 직접 설정하는 것이 아니라 xml이나 애너테이션 설정을 통해 경량 컨테이너에 해당하는 스프링 프레임워크가 제어함. 따라서 기존 코드에서는 개발자가 직접 객체를 제어했지만 스프링 프레임워크에서는 객체의 제어를 스프링이 직접 담당하므로 제어의 역전(이하 ioc)이라고 하는 것임.</p>
<p>ioc의 종류도 여러 가지이며, 일반적으로 스프링에서는 di로 ioc의 기능을 구현하므로 ioc보다는 di라는 용어를 더 많이 사용함.</p>
<p>다음 코드는 di를 적용해 게시판 기능을 구현한 것.</p>
<ul>
<li>BoardServiceImpl.java</li>
</ul>
<pre><code>public class BoardServiceImpl implements BoardService {
    private BoardDAO baordDAO;

    // DI 적용 예시.
    public BoardServiceImpl(BoardDAO boardDAO) {
        this.boardDAO = boardDAO;
    }
...</code></pre><p>BoardServiceImpl 클래스는 의존하는 BoardDAOImpl 객체를 전달받기 위해 new 키워드를 사용해 객체를 생성하지 않고 생성자를 호출할 때 외부에서 객체를 주입 받아 사용했음. 이것이 바로 di를 적용한 예임.</p>
<p>소스 코드에서 new를 사용해 객체를 생성하는 것이 아니라 BoardServiceImpl 생성자를 호출할 때 컨테이너에 의해 주입되는 객체로 boardDAO 변수를 초기화한 것.</p>
<p>di를 사용하면 객체의 의존 관계를 외부에서 설정한다고 했음. 외부 설정에 의해 각 의존 객체가 어떻게 주입되는지 과정을 아래에 나타냈음.</p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/2341d92b-7b54-4024-bc88-aa0c796e8460/image.jpg" alt=""></p>
<p>이미지처럼 스프링에서는 의존하는 개체를 컨테이너 실행 시 주입하기 때문에 di라고 부름. 여기서 각 클래스 객체를 bean(이하 빈)이라고 부르는데, 이는 의존 관계를 설정하는 외부 xml 파일에서 각각의 객체를 bean 태그로 표시하기 때문임.</p>
<p>이번에는 스프링에서 의존 객체를 주입하는 방식을 알아보겠음. 스프링의 의존 객체 주입 방식은 생성자를 이용해서 주입하는 방식과 setter를 이용해서 주입하는 방식이 있음.</p>
<p>위에 코드는 생성자를 이용한 주입 방식이고 아래는 setter를 이용한 의존 객체 주입 방식임.</p>
<ul>
<li><p>BoardServiceImpl.java</p>
<pre><code>public class BoardServiceImpl implements BoardService {
  private BoardDAO boardDAO;

  // setter를 이용해 컨테이너에서 생성된 BoardDAOImpl 객체를 주입.
  public void setBoardDAO(BoardDAO boardDAO) {
      this.boardDAO = boardDAO;
  }
...</code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스프링 프레임워크] 환경 설정하기]]></title>
            <link>https://velog.io/@bonvoyage_/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@bonvoyage_/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 12 Oct 2023 07:31:38 GMT</pubDate>
            <description><![CDATA[<p>현재는 메이븐 같은 자동화 도구를 사용해 스프링 프레임워크 개발과 관련된 설정을 자동으로 할 수 있음. </p>
<p>그러나 여기선 스프링 프레임워크의 기본 기능을 익히기 위해 자동 설정이 아닌 수동으로 이클립스 프로젝트에 스프링 프레임워크 3.0 버전을 설정해 보겠음. </p>
<p>스프링 개발 환경 설정은 간단함. 다음과 같이 새 프로젝트를 만들고 스프링 3.0 라이브러리 파일을 복사해 /WEB-INF/lib 폴더에 붙여 넣으면 애플리케이션에서 바로 사용할 수 있음.</p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/57af80b9-dd02-4d0b-80ce-55617e29fe87/image.jpg" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[모델2] 웹 애플리케이션 모델]]></title>
            <link>https://velog.io/@bonvoyage_/%EB%AA%A8%EB%8D%B82-%EC%9B%B9-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EB%AA%A8%EB%8D%B8</link>
            <guid>https://velog.io/@bonvoyage_/%EB%AA%A8%EB%8D%B82-%EC%9B%B9-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EB%AA%A8%EB%8D%B8</guid>
            <pubDate>Mon, 25 Sep 2023 08:29:55 GMT</pubDate>
            <description><![CDATA[<p>보통 웹 애플리케이션을 개발할 때 화면은 디자이너가 맡아서 구현하고, 데이터베이스 연동 같은 비즈니스 로직은 프로그래머가 맡아서 구현함. 즉 각자 맡은 기능을 좀 더 분업화해서 개발을 하는 것.</p>
<p>일반적으로 어떤 일을 맡아 진행하게 되면 일단은 기존에 주로 사용했던 방법이나 방식을 따르게 마련임. 웹 애플리케이션을 개발할 때도 마찬가지임. 일일이 처음부터 새로 개발하는 것이 아니라 기존에 웹 애플리케이션 개발 방법이나 방식을 따름.</p>
<p>따라서 지금의 웹 애플리케이션 개발은 일반적으로 많이 사용하는 표준화 소스 구조를 만들어 개발을 진행함. 이러한 표준화된 소스 구조를 웹 애플리케이션 모델이라고 함. 웹 애플리케이션 모델의 종류에는 모델1과 모델2 방식이 있음.</p>
<h3 id="모델1-방식">모델1 방식</h3>
<p>지금까지 jsp 실습 예제를 구현한 방식이 바로 모델1 방식임. 이는 데이터베이스 연동같은 비즈니스 로직 작업과 그 작업 결과를 나타내주는 작업을 동일한 jsp에서 수행함. 즉, 모든 클라이언트의 요청과 비즈니스 로직 처리를 jsp가 담당하는 구조임.</p>
<p>모델1 방식은 기능 구현이 쉽고 편리하다는 장점이 있는 반면에 요즘처럼 웹 사이트 화면 기능이 복잡해지면 화면 기능과 비즈니스 로직 기능이 섞이면서 유지보수에 문제가 생김.</p>
<p>예를 들어 의류 쇼핑몰을 모델1 방식으로 구현해 운영하고 있다고 하자. 계절이 가을에서 겨울로 바뀌면 화면에 나타낼 의류 상품이 이미지도 바꿔줘야 함.</p>
<p>디자이너가 이 작얼을 하려면 jsp에 개발자가 관계되는 비즈니스 로직 기능도 알아야 하므로 작업하기가 쉽지 않을 뿐 아니라 비즈니스 로직과 화면 기능이 섞여 코드 재사용성도 떨어짐. 이렇듯 모델1 방식으로 웹 애플리케이션을 구현할 경우 조금만 기능이 복잡해져도 유지보수가 어렵다는 단점이 있음. 모델1 방식의 이러한 단점을 보완한 것이 바로 모델2 방식임.</p>
<h3 id="모델2-방식">모델2 방식</h3>
<p>모델2 방식의 핵심은 웹 애플리케이션의 각 기능(클라이언트의 요청 처리, 응답 처리, 비즈니스, 로직 처리)을 분리해서 구현하자는 것. 객체 지향 프로그래밍에서 각각의 기능을 모듈화해서 개발하자는 것과 같은 원리임.</p>
<p>웹 프로그램 개발 시 개발자가 전체 기능을 몰라도 각 기능이 모듈화되어 있으므로 자신이 맡은 부분만 개발하면 됨. 각 부분을 조립만 하면 나중에 전체를 사용할 수 있어 개발 효율성도 높음. </p>
<p>몰론 모델2 방식으로 개발하기 위해서는 필요한 기술이나 개념을 숙지해야 하는 번거로움은 있지만 초급자라면 우선 자신이 맡은 부분만 개발하면 되므로 훨씬 효율적인 개발 방식이라고 할 수 이음. </p>
<p>그리고 개발 후 서비스를 제공할 때도 유비조수가 편할 뿐만 아니라 개발한 모듈들은 비슷한 프로그램을 만들 때 사용할 수 있어 코드 재사용성도 높음. 현재 모든 웹 프로그램은 모델2 방식으로 개발한다고 보면 됨.</p>
<ul>
<li>모델2 방식의 특징</li>
</ul>
<ol>
<li><p>각 기능이 서로 분리되어 있어 개발 및 유지보수가 쉬움.</p>
</li>
<li><p>각 기능(모듈)의 재사용성이 높음.</p>
</li>
<li><p>디자이너와 개발자의 작업을 분업화해서 쉽게 개발할 수 있음.</p>
</li>
<li><p>모델2 방식과 관련된 기능이나 개념의 학습이 필요함.</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[HTML] html5 시맨틱 웹을 위한 구성 요소]]></title>
            <link>https://velog.io/@bonvoyage_/HTML-html5-%EC%8B%9C%EB%A7%A8%ED%8B%B1-%EC%9B%B9%EC%9D%84-%EC%9C%84%ED%95%9C-%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C</link>
            <guid>https://velog.io/@bonvoyage_/HTML-html5-%EC%8B%9C%EB%A7%A8%ED%8B%B1-%EC%9B%B9%EC%9D%84-%EC%9C%84%ED%95%9C-%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C</guid>
            <pubDate>Wed, 20 Sep 2023 05:14:45 GMT</pubDate>
            <description><![CDATA[<p>시맨틱 웹의 사전적 정의는 기계가 이해할 수 있고 처리할 수 있는 웹 콘텐츠를 만드는 것으로, 1998년 월드와이드웹의 창시자인 팀 버너스 리에 의해 개발되고 정의된 개념임.</p>
<h3 id="html5에-추가도니-웹-페이지-구조-관련-태그">HTML5에 추가도니 웹 페이지 구조 관련 태그</h3>
<p>html4에서는 웹 페이지 구조에 해당하는 머리말, 메뉴, 본문, 하단부를 만들 때 div 태그에 css를 적용하는 방식으로 작업을 했음. 그러다 보니 div 태그만 봐서는 의미를 잘 알 수 없다는 문제가 있었음.</p>
<p>따라서 html5에서는 이 문제를 보완하기 위해 의미 있는 구조를 나타낼 수 있는 태그들을 추가해 가독성을 높였음. html5에 추가된 태그를 추가했음.</p>
<ul>
<li><p>header : 머리말을 나타내는 태그.</p>
</li>
<li><p>hgroup : 제목과 부제목을 묶는 태그.</p>
</li>
<li><p>section : 제목별로 나눌 수 있는 태그.</p>
</li>
<li><p>article : 개별 콘텐츠를 나타내는 태그.</p>
</li>
<li><p>aside : 왼쪽 또는 오른쪽에 위치하는 사이드 바를 나타내는 태그.</p>
</li>
<li><p>footer : 하단의 정보를 표시하는 태그.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/c64eeb45-3d83-409b-b9e9-9777e007bff5/image.jpg" alt=""></p>
<h3 id="html5-웹-페이지-구조-관련-태그-사용">html5 웹 페이지 구조 관련 태그 사용</h3>
<p>먼저 section 태그를 이용해 제목을 표시하는 방법을 실습해 보겠음.</p>
<p><strong>예 )</strong></p>
<ul>
<li>section1.html</li>
</ul>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;!-- section 태그로 제목을 표시함. --&gt;
    &lt;section&gt;
        &lt;h1&gt;기사 제목1&lt;/h1&gt;
        &lt;p&gt;첫 번째 기사 내용입니다.&lt;/p&gt;
    &lt;/section&gt;

    &lt;section&gt;
        &lt;h1&gt;기사 제목2&lt;/h1&gt;
        &lt;p&gt;두 번째 기사 내용입니다.&lt;/p&gt;    
    &lt;/section&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/42ab5722-b1ee-451a-a779-14eb2f2700bb/image.png" alt=""></p>
<ul>
<li>section2.html</li>
</ul>
<p>section 태그 안에 article 태그를 사용해 본문을 표시함.</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;section&gt;
        &lt;!-- section 태그 안의 article 태그를 이용해 콘텐츠를 나눔. --&gt;
        &lt;article&gt;
            &lt;h1&gt;기사 제목1&lt;/h1&gt;
            &lt;p&gt;첫 번째 기사의 내용&lt;/p&gt;
        &lt;/article&gt;

        &lt;article&gt;
            &lt;h1&gt;기사 제목2&lt;/h1&gt;
            &lt;p&gt;두 번째 기사의 내용&lt;/p&gt;
        &lt;/article&gt;
    &lt;/section&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/7b5ae53c-9298-4e55-943a-71e6bae6cab2/image.png" alt=""></p>
<ul>
<li>section3.html</li>
</ul>
<p>여러 가지 시맨틱 웹의 태그를 이용해 화면의 레이아웃을 구성하는 내용임.</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;!-- header 태그를 이용해 로고나 메뉴를 표시함. --&gt;
    &lt;header&gt;
        &lt;h1&gt;HTML5 강좌를 시작함.&lt;/h1&gt;
    &lt;/header&gt;

    &lt;!-- nav 태그를 이용해 상단의 내비게이션 메뉴를 표시함. --&gt;
    &lt;nav&gt;
        &lt;ul&gt;        
            &lt;li&gt;1. 개념익히기&lt;/li&gt;
            &lt;li&gt;2. 문법익히기&lt;/li&gt;
            &lt;li&gt;3. 실전응용하기&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/nav&gt;

    &lt;!-- aside 태그를 이용해 사이드 메뉴를 표시함. --&gt;
    &lt;aside&gt;
        사이드 메뉴
    &lt;/aside&gt;

    &lt;!-- section 태그를 이용해 본문을 표시함. --&gt;
    &lt;section&gt;
        &lt;article&gt;
            &lt;h1&gt;첫 번째 강좌 제목&lt;/h1&gt;
            &lt;p&gt;첫 번째 강좌 내용&lt;/p&gt;
        &lt;/article&gt;
        &lt;article&gt;
            &lt;h1&gt;두 번째 강좌 제목&lt;/h1&gt;
            &lt;p&gt;두 번째 강좌 내용&lt;/p&gt;
        &lt;/article&gt;
        &lt;article&gt;
            &lt;h1&gt;세 번째 강좌 제목&lt;/h1&gt;
            &lt;p&gt;세 번째 강좌 내용&lt;/p&gt;
        &lt;/article&gt;
    &lt;/section&gt;

    &lt;!-- aside 태그를 이용해 퀵 메뉴를 표시함. --&gt;
    &lt;aside&gt;
        퀵메뉴
    &lt;/aside&gt;

    &lt;!-- footer 태그를 이용해 하단 정보를 표시함 --&gt;
    &lt;footer&gt;
        프로그래밍 강의 Copyright All right reserved.
    &lt;/footer&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/8a2253fc-da84-4883-b3e7-840a255d58b3/image.png" alt=""></p>
<p>그런데 실행 결과를 보니 레이아웃이 제대로 적용되지 않았음. 레이아웃을 표시하려면 각 태그에 css를 적용해야 함. session4.html은 태그에 css를 적용한 코드 예임.</p>
<ul>
<li><p>section4.html</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;style type = &quot;text/css&quot;&gt;
  html, body{width : &quot;100%&quot;; height : &quot;70%&quot;}
  html{overflow-y : &quot;scroll&quot;}
  body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, form, filedest, p, button{margin : 0; padding : 0}
  body, h1, h2, h3, h4, input, button{font-family : &quot;NanumGothicWeb&quot;, &quot;verdana&quot;, &quot;dotum&quot;, &quot;sans-serif;&quot; font-size : 13px; color : #383d41}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

      &lt;!-- header 태그를 이용해 로고나 메뉴를 표시함. --&gt;
      &lt;header&gt;
          &lt;h1&gt;HTML5 강좌를 시작함.&lt;/h1&gt;
      &lt;/header&gt;

      &lt;!-- nav 태그를 이용해 상단의 내비게이션 메뉴를 표시함. --&gt;
      &lt;nav&gt;
          &lt;ul&gt;        
              &lt;li&gt;1. 개념익히기&lt;/li&gt;
              &lt;li&gt;2. 문법익히기&lt;/li&gt;
              &lt;li&gt;3. 실전응용하기&lt;/li&gt;
          &lt;/ul&gt;
      &lt;/nav&gt;

      &lt;!-- aside 태그를 이용해 사이드 메뉴를 표시함. --&gt;
      &lt;aside&gt;
          사이드 메뉴
      &lt;/aside&gt;

      &lt;!-- section 태그를 이용해 본문을 표시함. --&gt;
      &lt;section&gt;
          &lt;article&gt;
              &lt;h1&gt;첫 번째 강좌 제목&lt;/h1&gt;
              &lt;p&gt;첫 번째 강좌 내용&lt;/p&gt;
          &lt;/article&gt;
          &lt;article&gt;
              &lt;h1&gt;두 번째 강좌 제목&lt;/h1&gt;
              &lt;p&gt;두 번째 강좌 내용&lt;/p&gt;
          &lt;/article&gt;
          &lt;article&gt;
              &lt;h1&gt;세 번째 강좌 제목&lt;/h1&gt;
              &lt;p&gt;세 번째 강좌 내용&lt;/p&gt;
          &lt;/article&gt;
      &lt;/section&gt;

      &lt;!-- aside 태그를 이용해 퀵 메뉴를 표시함. --&gt;
      &lt;aside&gt;
          퀵메뉴
      &lt;/aside&gt;

      &lt;!-- footer 태그를 이용해 하단 정보를 표시함 --&gt;
      &lt;footer&gt;
          프로그래밍 강의 Copyright All right reserved.
      &lt;/footer&gt;
</code></pre></li>
</ul>
</body>
</html>
```]]></description>
        </item>
        <item>
            <title><![CDATA[[jsp] 문자열 처리 함수 사용하기]]></title>
            <link>https://velog.io/@bonvoyage_/jsp-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%B2%98%EB%A6%AC-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@bonvoyage_/jsp-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%B2%98%EB%A6%AC-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 09 Sep 2023 05:07:58 GMT</pubDate>
            <description><![CDATA[<p>자바에서 문자열을 처리할 때 사용하는 문자열 관련 기능을 jstl에서 제공하는 함수를 이용해 jsp에서도 사용할 수 있음.</p>
<p>아래 나오지 않는 문자열 기능은 가자 String 클래스의 메서드 기능을 참고.</p>
<p><strong>- JSTL에서 제공하는 여러 가지 문자열 함수</strong></p>
<ol>
<li><p>fn:contains(A, B) - boolean : 문자열 A에 문자열 B가 포함되어 있는지 확인함.</p>
</li>
<li><p>fn:endWith(A, B) - boolean : 문자열 A의 끝이 B로 끝나는지 확인함.</p>
</li>
<li><p>fn:indexOf(A, B) - int : 문자열 A에서 B가 처음으로 위치하는 인덱스(index)를 반환함.</p>
</li>
<li><p>fn:lenght(A) - int : 문자열 A의 전체 길이를 반환함.</p>
</li>
<li><p>fn:replace(A, B, C) - String : 문자열 A에서 B까지 해당되는 문자를 찾아 C로 변환함.</p>
</li>
<li><p>fn:toLowerCase(A) - String : A를 모두 소문자로 변환함.</p>
</li>
<li><p>fn:toUpperCase(A) - Sring : A를 모두 대문자로 변환함.</p>
</li>
<li><p>fn:substring(A, B, C) - String : A에서 인덱스 번호 B에서 C까지 해당하는 문자열을 반환함.</p>
</li>
<li><p>fn:split(A, B) - String[ ] : A에서 B에서 지정한 문자열로 나누어 배열로 반환함.</p>
</li>
<li><p>fn:trim(A) - String : 문자열 A에서 앞뒤 공백을 제거함.</p>
</li>
</ol>
<h3 id="예-">예 )</h3>
<ul>
<li>fnTest.jsp</li>
</ul>
<p>문자열 함수를 사용하려면 먼저 taglib 디렉티브 태그를 선언해야 함. 문자열 관련 함수 기능은 자바의 String 클래스에서 제공하는 메서드 기능과 같음.</p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    isELIgnored=&quot;false&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!-- 함수를 사용하기 전에 반드시 선언함. --&gt;
&lt;%@ taglib prefix = &quot;fn&quot; uri = &quot;http://java.sun.com/jsp/jstl/functions&quot; %&gt;
&lt;%@ taglib prefix = &quot;c&quot; uri = &quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;%
    request.setCharacterEncoding(&quot;utf-8&quot;);
%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;c:set var = &quot;title1&quot; value = &quot;hello world!&quot;/&gt;
    &lt;c:set var = &quot;title2&quot; value = &quot;쇼핑몰 중심 jsp 입니다.&quot;/&gt;
    &lt;c:set var = &quot;str1&quot; value = &quot;중심&quot;/&gt;

    &lt;h2&gt;여러 가지 문자열 함수 기능&lt;/h2&gt;
    title1 = : &quot;hello world&quot;&lt;br&gt;
    title2 = : &quot;쇼핑몰 중심 jsp 입니다.&quot;&lt;br&gt;
    str1 = &quot;중심&quot;&lt;br&gt;&lt;br&gt;

    &lt;!-- 문자열 길이를 반환함. --&gt;
    fn : length(title1) = ${fn: length(title1) }&lt;br&gt;
    &lt;!-- 문자열을 대문자로 반환함. --&gt;
    fn : toUpperCase(title1) = ${fn: toUpperCase(title1) }&lt;br&gt;
    &lt;!-- 문자열을 소문자로 반환함. --&gt;
    fn : toLowerCase(title1) = ${fn: toLowerCase(title1) }&lt;br&gt;&lt;br&gt;

    &lt;!-- 문자열에서 4~5번째 문자열을 반환함. --&gt;
    fn : substring(title1, 3, 6) = ${fn: substring(title1, 3, 6) }&lt;br&gt;    
    fn : trim(title) = ${fn: trim(title1) }&lt;br&gt;
    &lt;!-- 문자열에서 공백을 /로 대체함. --&gt;
    fn : replace(title1, &quot; &quot;, &quot;/&quot;) = ${fn: replace(title1,&quot; &quot;, &quot;/&quot;) }&lt;br&gt;&lt;br&gt;

    &lt;!-- title2 문자열에서 str1의 위치를 구함. --&gt;
    fn : indexOf(title2, str1) = ${fn: indexOf(title2, str1) }&lt;br&gt;
    &lt;!-- title1 문자열에 str1 문자열이 있는 판별함. --&gt;
    fn : contains(title1, str1) = ${fn: contains(title1, str1) }&lt;br&gt;
    &lt;!-- 첫 번째 문자열이 두 번째 문자열을 포함하는지 판별함. --&gt;
    fn : contains(title2, str1) = ${fn: contains(title2, str1) }&lt;br&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/85da2a09-5913-45d6-b51a-c41726e1d5a5/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[jsp] 한글을 아스키 코드로 변환하기]]></title>
            <link>https://velog.io/@bonvoyage_/jsp-%ED%95%9C%EA%B8%80%EC%9D%84-%EC%95%84%EC%8A%A4%ED%82%A4-%EC%BD%94%EB%93%9C%EB%A1%9C-%EB%B3%80%ED%99%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@bonvoyage_/jsp-%ED%95%9C%EA%B8%80%EC%9D%84-%EC%95%84%EC%8A%A4%ED%82%A4-%EC%BD%94%EB%93%9C%EB%A1%9C-%EB%B3%80%ED%99%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 09 Sep 2023 03:33:32 GMT</pubDate>
            <description><![CDATA[<p>다국어 기능을 사용하려면 미리 한글을 아스키 코드로 변환한 형태로 저장하고 있다가 요청 시 이아스키 코드를 다시 한글로 변환해서 표시함.</p>
<h3 id="properties-editor-설치하기">Properties Editor 설치하기</h3>
<ol>
<li>먼저 이클립스에 한글을 아스키코드로 변환하는 기능을 제공하는 Properties Editor 플러그인을 설치.</li>
</ol>
<p>이클립스 상단 메뉴에서 Help &gt; Install New Software 를 선택.</p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/2dbffb3d-696b-49bd-9621-be8a9f998917/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/6fadbfe0-0cae-4eb2-9012-61bee8c0b03a/image.jpg" alt="">
work with 칸 오른쪽 add 클릭. 창 뜨면 Name은 Properties Editor로, Location은 <a href="http://propedit.sourceforge.jp/eclipse/updates%EB%A1%9C">http://propedit.sourceforge.jp/eclipse/updates로</a> 입력 후 Add 클릭.</p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/c2cb40d8-2df3-4ba8-82e3-7cc4f2587409/image.jpg" alt="">
체크 후 아래 next 클릭.</p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/12d140a7-3574-447c-8a88-df3f8e8fcd56/image.jpg" alt="">
next 클릭.</p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/4890a029-3bc7-4704-a7a3-94040cab10ee/image.jpg" alt="">
라이센스 정책에 동의한 후 Finish를 클릭</p>
<h3 id="한글-아스키-파일-만들기">한글 아스키 파일 만들기</h3>
<p>이제 한글 아스키 코드를 저장하는 properties 파일을 만들어 보겠음. properties 파일을 만드는 과정은 다음과 같음.</p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/56c05235-e898-424f-9347-6c1d266967be/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/c0a09d67-fa95-45f9-91c4-836b64642f9d/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/47183845-d688-495f-ac3e-6873a095f434/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/cd4a0e85-f443-436e-a854-3fd85e2e137a/image.jpg" alt=""></p>
<h3 id="jsp-페이지에-다국어-표시하기">jsp 페이지에 다국어 표시하기</h3>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/0fd7f120-ae74-49ef-8b73-7e3780bd9e30/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/7e1d45f9-4b16-453b-8b84-9e106594c70c/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/4ba977df-ede9-466d-9690-b7fd8032e6bc/image.jpg" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[jsp] Core 태그 라이브러리 실습 예제]]></title>
            <link>https://velog.io/@bonvoyage_/jsp-Core-%ED%83%9C%EA%B7%B8-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%8B%A4%EC%8A%B5-%EC%98%88%EC%A0%9C</link>
            <guid>https://velog.io/@bonvoyage_/jsp-Core-%ED%83%9C%EA%B7%B8-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%8B%A4%EC%8A%B5-%EC%98%88%EC%A0%9C</guid>
            <pubDate>Fri, 08 Sep 2023 07:14:50 GMT</pubDate>
            <description><![CDATA[<p>그럼 지금까지 배운 Core 태그 라이브러리에 좀 더 익숙해지기 위해 로그인, 학점 변환, 구구단 출력 기능을 Core 태그 라이브러리를 이용해서 구현해 보겠음. 이전에 스크립트릿으로 구현했던 예제들과 결과는 같지만 구현 방법은 다름. 그럼 스크립트릿의 구현 방법과 어떻게 다른지 비교하면서 실습해 보겠음. 표준 태그 라이브러리 사용법을 금방 익힐 수 있을 것.</p>
<h3 id="로그인-예제">로그인 예제</h3>
<ul>
<li>login.jsp</li>
</ul>
<p>로그인창에서 id와 비밀번호를 입력한 후 로그인을 클릭할 수 있도록 login.jsp를 작성함.</p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%
    request.setCharacterEncoding(&quot;utf-8&quot;);
%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;form action = &quot;result.jsp&quot; method = &quot;post&quot;&gt;
        아이디 : &lt;input type = &quot;text&quot; name = &quot;user_ID&quot;&gt;&lt;br&gt;
        비밀번호 : &lt;input type = &quot;password&quot; name = &quot;userPw&quot;&gt;&lt;br&gt;
        &lt;input type = &quot;submit&quot; value = &quot;로그인&quot;&gt;
        &lt;input type = &quot;reset&quot; value = &quot;다시입력&quot;&gt;
    &lt;/form&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><ul>
<li>result.jsp</li>
</ul>
<p>로그인창에서 id를 입력한 경우와 입력하지 않은 경우 &lt;c:if&gt; 태그를 이용해 각기 다른 화면을 출력하도록 설정함.</p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    isELIgnored=&quot;false&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@ taglib prefix = &quot;c&quot; uri = &quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;%
    request.setCharacterEncoding(&quot;utf-8&quot;);
%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;!-- empty 연산자를 이용해 id 값이 비었는지 체크함. --&gt;
    &lt;c:if test = &quot;${empty param.userID }&quot;&gt;
        아이디를 입력하세요&lt;br&gt;
        &lt;a href = &quot;login.jsp&quot;&gt;로그인창&lt;/a&gt;
    &lt;/c:if&gt;

    &lt;!-- id를 정상적으로 입력한 경우 로그인 메ㅔ시지를 출력함. --&gt;
    &lt;c:if test = &quot;${not empty param.userID }&quot;&gt;
        &lt;h1&gt;환영합니다. &lt;c:out value = &quot;${param.userID }&quot;/&gt;님.&lt;/h1&gt;
    &lt;/c:if&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/84cc2471-2453-4cdd-9e7c-ec046511769c/image.png" alt="">
id와 비밀번호를 입력한 후 로그인을 클릭함.</p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/819e1e0a-2b94-4f12-a6fc-0a0f6e6d5b66/image.png" alt="">
id를 정상적으로 입력한 경우 로그인 메시지를 출력함.</p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/ebfa9faf-7238-4f87-b848-7f447dfdcd44/image.png" alt="">
id를 입력하지 않고 로그인한 경우 다시 로그인하라는 메시지를 출력함.</p>
<p>이번에는 &lt;c:if&gt;로 이중 조건문을 구현하도록 다음과 같이 result2.jsp를 작성함. 로그인 시 admin으로 로그인하면 관리자 화면을 출력함.</p>
<ul>
<li>reuslt2.jsp</li>
</ul>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    isELIgnored=&quot;false&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@ taglib prefix = &quot;c&quot; uri = &quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;%
    request.setCharacterEncoding(&quot;utf-8&quot;);
%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;c:if test = &quot;${empty param.userID }&quot;&gt;
        아이디를 입력하세요.&lt;br&gt;
        &lt;a href = &quot;login.jsp&quot;&gt;로그인창&lt;/a&gt;
    &lt;/c:if&gt;

    &lt;!-- id가 null 아님을 체크함. --&gt;
    &lt;c:if test = &quot;${not empty param.userID }&quot;&gt;
        &lt;!-- id가 admin이면 관리자 화면을 출력함. --&gt;
        &lt;c:if test = &quot;${param.userID == &#39;admin&#39; }&quot;&gt;
            &lt;h1&gt;관리자로 로그인 했습니다.&lt;/h1&gt;
            &lt;form&gt;
                &lt;input type = &quot;button&quot; value = &quot;회원정보 삭제하기&quot;/&gt;
                &lt;input type = &quot;button&quot; value = &quot;회원정보 수정하기&quot;/&gt;
            &lt;/form&gt;
        &lt;/c:if&gt;
        &lt;!-- id가 admin이 아니면 로그인 메시지를 출력함. --&gt;
        &lt;c:if test = &quot;${param.userID != &#39;admin&#39; }&quot;&gt;
            &lt;h1&gt;환영합니다. &lt;c:out value = &quot;${param.userID }&quot;/&gt; 님. &lt;/h1&gt;
        &lt;/c:if&gt;
    &lt;/c:if&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/d9f2d08f-f24e-46da-934d-8d534ee103cf/image.png" alt="">
admin으로 로그인함.</p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/43689012-41e0-4112-a186-f74538b8bae2/image.png" alt="">
관리자 화면으로 출력함.</p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/43ffb8ab-91e7-4293-94ea-da41d8360cbb/image.png" alt="">
다른 id로 로그인 시 로그인 메시지를 출력함.</p>
<h3 id="학점-변환기-예제">학점 변환기 예제</h3>
<p>시험 점수를 입력하면 해당하는 학점으로 변환해 주는 프로그램을 Core 태그 라이브러리를 사용해 만들어 보겠음. 앞엣 구현했던 방법과 어떻게 다른지 비교하면서 실습하는 것이 도움이 될것.</p>
<ul>
<li>scoreTest.jsp</li>
</ul>
<p>학점으로 변환할 시험 점수를 입력한 후 scoreResult.jsp로 전송함.</p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;h1&gt;시험 점수를 입력해 주세요&lt;/h1&gt;
    &lt;form method = &quot;get&quot; action = &quot;scoreResult1.jsp&quot;&gt;
        시험점수 : &lt;input type = &quot;text&quot; name = &quot;score&quot;/&gt;&lt;br&gt;
        &lt;input type = &quot;submit&quot; value = &quot;학점변환&quot;/&gt;    
    &lt;/form&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><ul>
<li>scoreResult1.jsp</li>
</ul>
<p>조건이 여러 개이므로 이번에는 &lt;c:choose&gt; 태그의 &lt;c:when&gt; 태그에 설정해 학점을 변환함.</p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    isELIgnored=&quot;false&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@ taglib prefix = &quot;c&quot; uri = &quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;%
    request.setCharacterEncoding(&quot;utf-8&quot;);
%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;!-- param.score를 score 변수에 할댕해서 사용함. --&gt;
    &lt;c:set var = &quot;score&quot; value = &quot;${param.score }&quot;/&gt;
    &lt;h1&gt;시험점수 &lt;c:out value = &quot;${score }&quot;/&gt;&lt;/h1&gt;&lt;br&gt;

    &lt;!-- 조건이 여러 개인 경우 c:choose안의 c:when 태그를 이용해 점수를 해당하는 학점으로 변환함. --&gt;
    &lt;c:choose&gt;
        &lt;c:when test = &quot;${score &gt;= 90 &amp;&amp; score &lt;= 100 }&quot;&gt;
            &lt;h1&gt;A학점입니다.&lt;/h1&gt;
        &lt;/c:when&gt;
        &lt;c:when test = &quot;${score &gt;= 80 &amp;&amp; score &lt;= 90 }&quot;&gt;
            &lt;h1&gt;B학점입니다.&lt;/h1&gt;
        &lt;/c:when&gt;
        &lt;c:when test = &quot;${score &gt;= 70 &amp;&amp; score &lt;=80 }&quot;&gt;
            &lt;h1&gt;C학점입니다.&lt;/h1&gt;
        &lt;/c:when&gt;
        &lt;c:when test = &quot;${score &gt;= 60 &amp;&amp; score &lt;= 70 }&quot;&gt;
            &lt;h1&gt;D학점입니다.&lt;/h1&gt;
        &lt;/c:when&gt;
        &lt;c:otherwise&gt;
            &lt;h1&gt;F학점입니다.&lt;/h1&gt;
        &lt;/c:otherwise&gt;
    &lt;/c:choose&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/6df043ef-30b1-42e1-8870-a8eb85dfc89f/image.png" alt="">
시험 점수 입력 페이지에서 점수를 입력하고 학점변환을 클릭함.</p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/6f4e8a17-0473-40a1-b94c-252936c1353d/image.png" alt="">
변환된 학점을 출력함.
하지만 현재는 시험 점수가 0~100점 사이인지 유효성 검사를 하는 기능이 빠져 있으므로 학점 변화기 프로그램을 조금 수정해 보겠음.</p>
<ul>
<li>scoreResult2.jsp</li>
</ul>
<p>학점 변환 시 &lt;c:choose&gt; 태그를 이용해 시험 점수가 0~100점 사이인지를 먼저 체크한 후 전송된 시험 점수가 유표 범위이면 그 다음에 학점을 변환하도록 다음과 같이 scoreResult2.jsp를 작성함. 만약 유효 범위를 벗어나면 새로 점수를 입력하라는 메시지를 출력함.</p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    isELIgnored=&quot;false&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@ taglib prefix = &quot;c&quot; uri = &quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;%
    request.setCharacterEncoding(&quot;utf-8&quot;);
%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;!-- param.score를 score 변수에 할댕해서 사용함. --&gt;
    &lt;c:set var = &quot;score&quot; value = &quot;${param.score }&quot;/&gt;
    &lt;h1&gt;시험점수 &lt;c:out value = &quot;${score }&quot;/&gt;&lt;/h1&gt;&lt;br&gt;

    &lt;!-- c:choose 태그를 이용해 시험 점수의 유효성을 체크함. --&gt;
    &lt;c:choose&gt;
        &lt;c:when test = &quot;${score &gt;= 0 &amp;&amp; score &lt;= 100 }&quot;&gt;
            &lt;c:choose&gt;
                &lt;c:when test = &quot;${score &gt;= 90 &amp;&amp; score &lt;= 100 }&quot;&gt;
                    &lt;h1&gt;A학점입니다.&lt;/h1&gt;
                &lt;/c:when&gt;
                &lt;c:when test = &quot;${score &gt;= 80 &amp;&amp; score &lt;= 90 }&quot;&gt;
                    &lt;h1&gt;B학점입니다.&lt;/h1&gt;
                &lt;/c:when&gt;
                &lt;c:when test = &quot;${score &gt;= 70 &amp;&amp; score &lt;=80 }&quot;&gt;
                    &lt;h1&gt;C학점입니다.&lt;/h1&gt;
                &lt;/c:when&gt;
                &lt;c:when test = &quot;${score &gt;= 60 &amp;&amp; score &lt;= 70 }&quot;&gt;
                    &lt;h1&gt;D학점입니다.&lt;/h1&gt;
                &lt;/c:when&gt;
                &lt;c:otherwise&gt;
                    &lt;h1&gt;F학점입니다.&lt;/h1&gt;
                &lt;/c:otherwise&gt;
            &lt;/c:choose&gt;
        &lt;/c:when&gt;
        &lt;!-- 시험 점수가 범위를 벗어났으면 입력 창으로 다시 이동함. --&gt;
        &lt;c:otherwise&gt;
            &lt;h1&gt;점수를 잘 못 입력했습니다. 다시 입력하세요.&lt;/h1&gt;
            &lt;a href = &quot;socreTest.jsp&quot;&gt;점수 입력 창으로 이동&lt;/a&gt;
        &lt;/c:otherwise&gt;
    &lt;/c:choose&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/c1607af4-f01c-43e8-9ff7-d591df176e12/image.png" alt="">
이번에는 시험 점수의 유효 범위인 0~100을 벗어나는 값을 일부러 입력함. 그러면 점수를 잘 못 입력했으니 다시 입력하라는 메시지를 출력함.</p>
<h3 id="구구단-출력-예제">구구단 출력 예제</h3>
<p>이번에는 Core 태그 라이브러리를 사용한 구구단 출력 예제를 실습해 보겠음.</p>
<ul>
<li>gugu.jsp</li>
</ul>
<p>구구단 입력창에서 구구단 수를 입력한 후 입력한 단수를 guguResult.jsp로 전송함.</p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;h1&gt;출력할 구구단의 수를 지정해 주세요.&lt;/h1&gt;
    &lt;form method = &quot;get&quot; action = &quot;guguResult1.jsp&quot;&gt;
        출력할 구구단 : &lt;input type = &quot;text&quot; name = &quot;dan&quot;/&gt;
        &lt;input type = &quot;submit&quot; value = &quot;구구단 출력&quot;/&gt;
    &lt;/form&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><ul>
<li>guguResult.jsp</li>
</ul>
<p>전송된 단수를 가져와 &lt;c:forEach&gt; 태그를 이용해서 tr 태그에 연속적으로 구구단을 출력하도록 작성함.</p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    isELIgnored=&quot;false&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@ taglib prefix = &quot;c&quot; uri = &quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;%
    request.setCharacterEncoding(&quot;utf-8&quot;);
%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;c:set var = &quot;dan&quot; value = &quot;${param.dan }&quot;/&gt;
    &lt;table border = &quot;1&quot; width = &quot;800&quot; align = &quot;center&quot;&gt;
        &lt;tr align = &quot;center&quot; bgcolor = &quot;lightgreen&quot;&gt;
            &lt;td colspan = &quot;2&quot;&gt;&lt;c:out value = &quot;dan&quot;/&gt;단 출력&lt;/td&gt;
        &lt;/tr&gt;

        &lt;!-- c:Each태그를 이용해 구구단을 출력함. --&gt;
        &lt;c:forEach var = &quot;i&quot; begin = &quot;1&quot; end = &quot;9&quot; step = &quot;1&quot;&gt;
            &lt;tr align = &quot;center&quot;&gt;
                &lt;td width = &quot;400&quot;&gt;
                    &lt;c:out value = &quot;${dan }&quot;/&gt; *
                    &lt;c:out value = &quot;${i }&quot;/&gt;
                &lt;/td&gt;
                &lt;td width = &quot;400&quot;&gt;
                    &lt;c:out value = &quot;${i * dan }&quot;/&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/c:forEach&gt;
    &lt;/table&gt;


&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/1f84320e-2328-4b21-af93-55f675965f3d/image.png" alt="">
구구단 입력창에서 단수를 입력한 후 구구단 출력을 클릭함.</p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/c7223508-569a-4ac8-86f8-e932a34873ff/image.png" alt="">
전송된 단수를 이용해 구구단을 출력함.</p>
<h3 id="이미지-리스트-출력-예제">이미지 리스트 출력 예제</h3>
<p>이번에는 여러 가지 이미지와 체크박스를 연속적으로 출력하는 프로그램을 &lt;c:forEach&gt; 태그를 사용해 만들어 보겠음.</p>
<ul>
<li>imageList.jsp</li>
</ul>
<p>&lt;c:forEach&gt; 태그를 이용해 ul태그 안에 li 태그를 연속해서 출력하여 이미지를 나타냄.</p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    isELIgnored=&quot;false&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@ taglib prefix = &quot;c&quot; uri = &quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;%
    request.setCharacterEncoding(&quot;utf-8&quot;);
%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;ul class = &quot;list_type&quot;&gt;
        &lt;li&gt;
            &lt;span style = &#39;margin-left:50px&#39;&gt;이미지&lt;/span&gt;
            &lt;span&gt;이미지 이름&lt;/span&gt;
            &lt;span&gt;선택하기&lt;/span&gt;
        &lt;/li&gt;
        &lt;!-- c:forEach 태그를 이용해 이미지와 체크박스를 연속해서 나타냄. --&gt;
        &lt;c:forEach var = &quot;i&quot; begin = &quot;1&quot; end = &quot;9&quot; step = &quot;1&quot;&gt;
            &lt;li&gt;
                &lt;a href = &#39;#&#39; style = &#39;margin-left:50px&#39;&gt;
                    &lt;img src = &#39;../image/duke.png&#39; width = &quot;90&quot; height = &quot;90&quot; alt = &#39;&#39;/&gt;&lt;/a&gt;

                &lt;a href = &#39;#&#39;&gt;&lt;strong&gt;이미지 이름 : 듀크${i }&lt;/strong&gt;&lt;/a&gt;

                &lt;a href = &#39;#&#39;&gt;&lt;input name = &quot;chk${i }&quot; type = &quot;checkbox&quot;&gt;&lt;/a&gt;
            &lt;/li&gt;
        &lt;/c:forEach&gt;
    &lt;/ul&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/c898c5e1-0c7c-4334-9e0d-eb677ae30b0f/image.png" alt=""></p>
<p>지금까지 Core 태그 라이브러리를 사용해 실습해 봤음. 현재 jsp 페이지는 jstl로 구현하므로 라이브러리를 사용하는 방법에 익숙해지면 실제로 개발하는 데 많은 도움이 될 것. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[jsp] <c:set> 태그를 이용한 실습 - 2]]></title>
            <link>https://velog.io/@bonvoyage_/jsp-cset-%ED%83%9C%EA%B7%B8%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%8B%A4%EC%8A%B5-2</link>
            <guid>https://velog.io/@bonvoyage_/jsp-cset-%ED%83%9C%EA%B7%B8%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%8B%A4%EC%8A%B5-2</guid>
            <pubDate>Thu, 07 Sep 2023 07:30:22 GMT</pubDate>
            <description><![CDATA[<h3 id="cforeach-태그를-이용한-실습">&lt;c:forEach&gt; 태그를 이용한 실습</h3>
<p>c:forEach 태그는 jsp 페이지에서 반복문을 수행하는 태그이며, 사용형식은 다음과 같음.</p>
<pre><code>&lt;c:forEach var = &quot;변수이름&quot; items = &quot;반복할객체이름&quot; begin = &quot;시작값&quot;
    end = &quot;마지막값&quot; step = &quot;증가값&quot; varStatsu = &quot;반복상태변수이름&quot;&gt;
...
&lt;/c:forEach&gt;</code></pre><p>여기서 var는 반복할 변수 이름을, items는 반복할 객체 이름을 지정함. begin과 end는 각각 반복 시작 및 종료 값을, step은 한 번 반복 변수를 증가시킬 값을, varStatus는 반복 상태 속성을 지정함. </p>
<ul>
<li>varStatus의 속성</li>
</ul>
<ol>
<li><p>index - int : items에서 정의한 항목을 가리키는 index 번호임. 0부터 시작함.</p>
</li>
<li><p>count - int : 몇 번째 반복인지 나타냄. 1부터 시작함.</p>
</li>
<li><p>first - boolean : 첫 번째 반복인지 나타냄.</p>
</li>
<li><p>last - boolean : 마지막 반복인지 나타냄.</p>
</li>
</ol>
<ul>
<li>member6.jsp</li>
</ul>
<p>먼저 자바 코드로 ArrayList 객체를 생성하여 문자열을 저장한 후 c:forEach 태그에서 사용할 수 있도록 c:set 태그로 변수 list에 재할당함. 그리고 varStatus의 loop 속성을 이용해 반복 횟수를 출력함. c:forEach 태그의 items에 ArrayList를 설정한 후 반복문 수행 시 ArrayList에 저장된 문자열을 반복 변수 data에 한 개씩 가져와 출력함.</p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    import = &quot;java.util.*&quot;
    isELIgnored=&quot;false&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@ taglib prefix = &quot;c&quot; uri = &quot;http://java.sun.com/jsp/jstl/core&quot;%&gt;
&lt;%
    List dataList = new ArrayList();
    dataList.add(&quot;hello&quot;);
    dataList.add(&quot;world&quot;);
    dataList.add(&quot;안녕하세요&quot;);
%&gt;

&lt;!-- 표현언어에서 사용할 수 있도록 c:set 태그를 이용해 변수에 dataList를 할당함. --&gt;
&lt;c:set var = &quot;list&quot; value = &quot;&lt;%=dataList %&gt;&quot;/&gt;

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;!-- 반복 변수 i를 1부터 10까지 1씩 증가시키면서 반복문을 수행함. --&gt;
    &lt;c:forEach var = &quot;i&quot; begin = &quot;1&quot; end = &quot;10&quot; step = &quot;1&quot; varStatus = &quot;loop&quot;&gt;
        i = ${i } &amp;nbsp;&amp;nbsp;&amp;nbsp; 반복횟수 : ${loop.count }&lt;br&gt;
    &lt;/c:forEach&gt;
    &lt;br&gt;

    &lt;!-- 반복 변수 i를 1부터 10까지 2씩 증가시키면서 반복문을 수행함. --&gt;
    &lt;c:forEach var = &quot;i&quot; begin = &quot;1&quot; end = &quot;10&quot; step = &quot;2&quot;&gt;
        5 * ${i } = ${5 * i }&lt;br&gt;
    &lt;/c:forEach&gt;
    &lt;br&gt;

    &lt;!-- ArrayList 같은 컬렉션 객체에 저장된 객체(데이터)를 반복해서 반복 변수 data에 하나씩 가져와 처리함. --&gt;
    &lt;c:forEach var = &quot;data&quot; items = &quot;${list }&quot;&gt;
        ${data }&lt;br&gt;
    &lt;/c:forEach&gt;
    &lt;br&gt;

    &lt;c:set var = &quot;fruits&quot; value = &quot;사과, 파인애플, 바나나, 망고, 귤&quot; /&gt;
    &lt;!-- 구분자 ,(콤마)를 이용해 문자열을 분리해서 출력함. --&gt;
    &lt;c:forTokens var = &quot;token&quot; items = &quot;${fruits }&quot; delims=&quot;,&quot;&gt;
        ${token }&lt;br&gt;
    &lt;/c:forTokens&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/d4eea025-c6e2-4549-a3a3-3fe6a202fd16/image.png" alt=""></p>
<p>이번에는 c:forEach 태그를 이용해 ArrayList에 저장된 회원 정보를 출력해 보겠음. c:forEach 태그를 이용하면 ArrayList에 저장된 객체에 편리하게 접근할 수 있음.</p>
<p>다음과 같이 c:forEach 태그의 반복 변수 i를 ArrayList의 인덱스로 사용해서 저장된 회원 정보를 차례대로 출력하도록 작성함.</p>
<ul>
<li>member7.jsp</li>
</ul>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    import = &quot;java.util.*, sec01.ex01.*&quot;
    isELIgnored=&quot;false&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@ taglib prefix = &quot;c&quot; uri = &quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;%
    request.setCharacterEncoding(&quot;utf-8&quot;);
    List membersList = new ArrayList();
    MemberBean m1 = new MemberBean(&quot;son&quot;, &quot;1234&quot;, &quot;손흥민&quot;, &quot;son@test.com&quot;);
    MemberBean m2 = new MemberBean(&quot;ki&quot;, &quot;4321&quot;, &quot;기성용&quot;, &quot;ki@test.com&quot;);
    MemberBean m3 = new MemberBean(&quot;park&quot;,&quot;1212&quot;, &quot;박지성&quot;, &quot;park@test.com&quot;);

    // 세 명의 회원 정보를 MemberBean에 저장한 후 다시 ArrayList에 저장함.
    membersList.add(m1);
    membersList.add(m2);
    membersList.add(m3);
%&gt;
&lt;c:set var = &quot;membersList&quot; value = &quot;&lt;%=membersList %&gt;&quot;/&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;table border = &quot;1&quot; align = &quot;center&quot;&gt;
        &lt;tr align = &quot;center&quot; bgcolor = &quot;lightgreen&quot;&gt;
            &lt;td width = &quot;7%&quot;&gt;&lt;b&gt;아이디&lt;/b&gt;&lt;/td&gt;
            &lt;td width = &quot;7%&quot;&gt;&lt;b&gt;비밀번호&lt;/b&gt;&lt;/td&gt;
            &lt;td width = &quot;7%&quot;&gt;&lt;b&gt;이름&lt;/b&gt;&lt;/td&gt;
            &lt;td width = &quot;7%&quot;&gt;&lt;b&gt;이메일&lt;/b&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;!-- membersList에 저장된 회원 수만큼 반복 변수 i를 0부터 1씩 증가시키면서 forEach 문을 실행함. --&gt;
        &lt;c:forEach var = &quot;i&quot; begin = &quot;0&quot; end = &quot;2&quot; step = &quot;1&quot;&gt;
        &lt;tr align = &quot;center&quot;&gt;
            &lt;!-- 반복 변수 i를 ArrayList의 인덱스로 사용해 회원 정보를 차례대로 출력함. --&gt;
            &lt;td&gt;${membersList[i].id }&lt;/td&gt;
            &lt;td&gt;${membersList[i].pwd }&lt;/td&gt;
            &lt;td&gt;${membersList[i].name }&lt;/td&gt;
            &lt;td&gt;${membersList[i].email }&lt;/td&gt;
        &lt;/tr&gt;
        &lt;/c:forEach&gt;
    &lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/1f31b4c2-e4c1-44cb-a5ec-7a0f57a17e1a/image.png" alt=""></p>
<ul>
<li>member8.jsp</li>
</ul>
<p>이번에는 c:forEach문의 items 속성에 membersList를 할당한 후 실행해 자동으로 var의 member에 membersList의 MemberBean 객체가 차례대로 할당되도록 작성함.</p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    import = &quot;java.util.*, sec01.ex01.*&quot;
    isELIgnored=&quot;false&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@ taglib prefix = &quot;c&quot; uri = &quot;http://java.sun.com/jsp/jstl/core&quot;%&gt;
&lt;%
    request.setCharacterEncoding(&quot;utf-8&quot;);
    List membersList = new ArrayList();
    MemberBean m1 = new MemberBean(&quot;son&quot;, &quot;1234&quot;, &quot;손흥민&quot;, &quot;son@test.com&quot;);
    MemberBean m2 = new MemberBean(&quot;ki&quot;, &quot;4321&quot;, &quot;기성용&quot;, &quot;ki@test.com&quot;);
    MemberBean m3 = new MemberBean(&quot;park&quot;,&quot;1212&quot;, &quot;박지성&quot;, &quot;park@test.com&quot;);

    membersList.add(m1);
    membersList.add(m2);
    membersList.add(m3);
%&gt;
&lt;c:set var = &quot;membersList&quot; value = &quot;&lt;%=membersList %&gt;&quot;/&gt;

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;table border = &quot;1&quot; align = &quot;center&quot;&gt;
        &lt;tr align = &quot;center&quot; bgcolor = &quot;lightgreen&quot;&gt;
            &lt;td width = &quot;7%&quot;&gt;&lt;b&gt;아이디&lt;/b&gt;&lt;/td&gt;
            &lt;td width = &quot;7%&quot;&gt;&lt;b&gt;비밀번호&lt;/b&gt;&lt;/td&gt;
            &lt;td width = &quot;7%&quot;&gt;&lt;b&gt;이름&lt;/b&gt;&lt;/td&gt;
            &lt;td width = &quot;7%&quot;&gt;&lt;b&gt;이메일&lt;/b&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;!-- 반복문을 수행하면서 memberList에 저장된 MemberBean 객체가 차례대로 member에 할당됨. --&gt;
        &lt;c:forEach var = &quot;member&quot; items = &quot;${membersList }&quot;&gt;
        &lt;tr align = &quot;center&quot;&gt;
            &lt;!-- 반복 변수 i를 ArrayList의 인덱스로 사요애해 회원 정보를 차례대로 출력함. --&gt;
            &lt;td&gt;${member.id }&lt;/td&gt;
            &lt;td&gt;${member.pwd }&lt;/td&gt;
            &lt;td&gt;${member.name }&lt;/td&gt;
            &lt;td&gt;${member.email }&lt;/td&gt;
        &lt;/tr&gt;
        &lt;/c:forEach&gt;
    &lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/43e3b539-a014-4a87-9a6d-e40f66e2e845/image.png" alt=""></p>
<h3 id="curl-태그를-이용한-실습">&lt;c:url&gt; 태그를 이용한 실습</h3>
<p>&lt;c:url&gt; 테그는 jsp 페이지에서 url 정보를 저장하는 역할을 하며, 사용 형식은 다음과 같음.</p>
<pre><code>&lt;c:url var = &quot;변수이름&quot; value = &quot;url경로&quot; [scope = &quot;scope 속성 중 하나&quot;]
    [&lt;c:param name = &quot;매개변수이름&quot; value = &quot;전달값&quot; /&gt;]
...
&lt;/c:url&gt;</code></pre><p>여기서 var는 생성된 url이 저장된 변수를, value는 생성할 url을, scope는 scope 속성의 값을 지정함.</p>
<ul>
<li>urlTest.jsp</li>
</ul>
<p>c:url 태그를 이용해 다른 페이지로 이동하면서 데이터를 전달함. 따라서 이동할 페이지로 전달할 데이터가 많을 경우에 사용하면 편리함.</p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    import = &quot;java.util.*&quot;
    isELIgnored=&quot;false&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@ taglib prefix = &quot;c&quot; uri = &quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;c:set var = &quot;contextPath&quot; value = &quot;${pageContext.request.contextPath }&quot;/&gt;
&lt;!-- c:url 태그로 이동할 페이지를 설정함. --&gt;
&lt;c:url var = &quot;url1&quot; value = &quot;/test01/member1.jsp&quot;&gt;
    &lt;!-- 이동할 페이지로 전달할 데이터를 설정함. --&gt;
    &lt;c:param name = &quot;id&quot; value = &quot;hong&quot;/&gt;
    &lt;c:param name = &quot;pwd&quot; value = &quot;1234&quot;/&gt;
    &lt;c:param name = &quot;name&quot; value = &quot;홍길동&quot;/&gt;
    &lt;c:param name = &quot;email&quot; value = &quot;hong@test.com&quot;/&gt;
&lt;/c:url&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;!-- &lt;a href = &#39;${contextPath }/test01/member1.jsp&#39;&gt;회원정보출력&lt;/a&gt; --&gt;

    &lt;!-- c:url 태그의 변수 이름을 간단하게 설정함. --&gt;
    &lt;a href = &#39;${url1 }&#39;&gt;회원정보출력&lt;/a&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/8b3c1543-c261-46b4-8b70-83506159700a/image.png" alt="">
회원정보출력을 클릭함.</p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/f4ff4e0f-be8e-4df0-ba73-8ff5f9b91a70/image.png" alt=""></p>
<p>매개변수로 전달된 회원 정보를 출력함(member1.jsp에서 ${속성}을 ${param.속성}으로 수정할 것).</p>
<h3 id="credirect-태그를-이용한-실습">&lt;c:redirect&gt; 태그를 이용한 실습</h3>
<p>&lt;c:redirect&gt; 태그는 지정된 jsp 페이지로 리다이렉트할 때 사용함. response.sendRedirect() 기능과 동일하며 &lt;c:redirect&gt; 태그로 리다이렉트할 때 매개변수를 전달할 수 있음. </p>
<p>사용 형식은 다음과 같음.</p>
<pre><code>&lt;c:redirect url = &quot;redirect할 URL&quot;&gt;
    [&lt;c:param name = &quot;매개변수이름&quot; value = &quot;전달값&quot;/&gt;]
    ...
&lt;/c:redirect&gt;</code></pre><p>여기서 url은 리다이렉트 될 url이 저장될 변수를 지정함.</p>
<ul>
<li>redirectTest.jsp</li>
</ul>
<p>&lt;c:redirect&gt; 태그를 이용해 회원 정보 출력창으로 리다이렉트함. 리다이렉트하면서 회원 정보를 매개변수로 전달함.</p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    isELIgnored=&quot;false&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@ taglib prefix = &quot;c&quot; uri = &quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;!-- 리다이렉트할 페이지를 설정함. --&gt;
    &lt;c:redirect url = &quot;/test01/member1.jsp&quot;&gt;
        &lt;!-- 리다이렉트할 페이지로 전달할 매개변수를 설정함. --&gt;
        &lt;c:param name = &quot;id&quot; value = &quot;${&#39;hong&#39; }&quot;/&gt;
        &lt;c:param name = &quot;pwd&quot; value = &quot;${&#39;1234&#39; }&quot;/&gt;
        &lt;c:param name = &quot;name&quot; value = &quot;${&#39;홍길동&#39; }&quot;/&gt;
        &lt;c:param name = &quot;email&quot; value = &quot;${&#39;hong@test.com&#39; }&quot;/&gt;
    &lt;/c:redirect&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/78f3295c-b2f8-4aee-ba71-cf9515d16af8/image.png" alt=""></p>
<p>http:localhost:8090/pro14/test3/redirectTest.jsp로 요청하면 test01/member1.jsp로 리다이렉트 됨. 그러면서 매개변수로 전달한 회원 정보를 출력함.</p>
<h3 id="cout-태그를-이용한-실습">&lt;c:out&gt; 태그를 이용한 실습</h3>
<p>&lt;c:out&gt; 태그는 화면에 지정한 값을 출력해 주는 태그임. 표현 언어와 기능은 거의 동일하지만 기본값 설정 기능 등을 제공하므로 더 편리하게 사용할 수 있음. </p>
<p>사용 형식은 다음과 같음.</p>
<pre><code>&lt;c:out value = &quot;출력값&quot; default = &quot;기본값&quot; [escapeXml = &quot;boolean값&quot;] /&gt;</code></pre><p>여기서 value는 출력할 값을, default는 value 속성에 지정된 값이 없을 때 출력할 기본값을, escapeXml은 escape 문자를 변환하는 역할을 함(생략할 수 있으며 기본값은 true).</p>
<ul>
<li>memberForm.jsp</li>
</ul>
<p>다음은 회원 가입창에서 입력한 회원 정보를 전달받아 &lt;c:out&gt; 태그를 이용해 화면에 출력하는 예제임. 다음과 같이 memberForm.jsp를 작성해 회원 가입창에서 회원 정보를 입력한 후 member9.jsp로 전달함.</p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    isELIgnored=&quot;false&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@ taglib prefix = &quot;c&quot; uri = &quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;%
    request.setCharacterEncoding(&quot;utf-8&quot;);
%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;table align = &quot;center&quot; border = &quot;1&quot;&gt;
        &lt;tr align = &quot;center&quot; bgcolor = &quot;lightgreen&quot;&gt;
            &lt;td width = &quot;7%&quot;&gt;&lt;b&gt;아이디&lt;/b&gt;&lt;/td&gt;
            &lt;td width = &quot;7%&quot;&gt;&lt;b&gt;비밀번호&lt;/b&gt;&lt;/td&gt;
            &lt;td width = &quot;7%&quot;&gt;&lt;b&gt;이름&lt;/b&gt;&lt;/td&gt;
            &lt;td width = &quot;7%&quot;&gt;&lt;b&gt;이메일&lt;/b&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;c:choose&gt;
            &lt;c:when test = &quot;${empty param.id }&quot;&gt;
                &lt;tr align = &quot;center&quot;&gt;
                    &lt;td colspan = &quot;5&quot;&gt;아이디를 입력하세요&lt;/td&gt;
                &lt;/tr&gt;
            &lt;/c:when&gt;
            &lt;c:otherwise&gt;
                &lt;tr align = &quot;center&quot;&gt;
                    &lt;td&gt;&lt;c:out value = &quot;${param.id }&quot;/&gt;&lt;/td&gt;
                    &lt;td&gt;&lt;c:out value = &quot;${param.pwd }&quot;/&gt;&lt;/td&gt;
                    &lt;td&gt;&lt;c:out value = &quot;${param.name }&quot;/&gt;&lt;/td&gt;
                    &lt;td&gt;&lt;c:out value = &quot;${param.email }&quot;/&gt;&lt;/td&gt;
                &lt;/tr&gt;
            &lt;/c:otherwise&gt;
        &lt;/c:choose&gt;
    &lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/f1c67486-d614-4610-b909-0bc1c70f56ba/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/d4e2ea8b-c60b-45a3-a684-7e4857e8f3fd/image.png" alt="">
&lt;c:out&gt; 태그를 이용해 전송된 회우너 정보를 출력함.</p>
<p>프로그래밍을 하다 보면 &gt; 또는 &lt; 그리고 작은따옴표(&#39;)나 큰따옴표(&quot;) 같은 특수 문자를 출력해야 하는 경우가 있음. 그런데 이런 특수 문자들은 html 태그에도 사용되므로 각각의 특수문자에 지정된 문자를 이용해서 브라우저에 출력해야 함.</p>
<ul>
<li>escapeXml이 false일 때 반환되는 문자</li>
</ul>
<pre><code>&lt; : &amp;lt;

&gt; : &amp;gt;

&amp; : &amp;amp;

&#39; : &amp;#039;

&quot; : &amp;#034;

... : ...</code></pre><p>간단히 특수 문자 사용 예를 실습해 보겠음.</p>
<ul>
<li>escapeXml.jsp</li>
</ul>
<p>&lt;c:out&gt; 태그의 escapeXml 속성을 이용해 변환된 문자를 특수 문자로 변환함.</p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@ taglib prefix = &quot;c&quot; uri = &quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;h2&gt;escapeXml 변환하기&lt;/h2&gt;
    &lt;h2&gt;
        &lt;pre&gt;
            &lt;!-- escapeXml 속성이 true이므로 value의 &amp;lt는 그대로 화면에 출력 됨. --&gt;
            &lt;c:out value = &quot;&amp;lt;&quot; escapeXml = &quot;true&quot;/&gt; 
            &lt;!-- escapeXml 속성이 false이므로 value의 &amp;lt는 해당하는 특수 문자로 변환되어 화면에 출력함. --&gt;
            &lt;c:out value = &quot;&amp;lt;&quot; escapeXml = &quot;false&quot;/&gt;

            &lt;c:out value = &quot;&amp;gt;&quot; escapeXml = &quot;true&quot;/&gt;
            &lt;c:out value = &quot;&amp;gt;&quot; escapeXml = &quot;false&quot;/&gt;

            &lt;c:out value = &quot;&amp;amp;&quot; escapeXml = &quot;true&quot;/&gt;
            &lt;c:out value = &quot;&amp;amp;&quot; escapeXml = &quot;false&quot;/&gt;

            &lt;c:out value = &quot;&amp;#039;&quot; escapeXml = &quot;true&quot;/&gt;
            &lt;c:out value = &quot;&amp;#039;&quot; escapeXml = &quot;false&quot;/&gt;

            &lt;c:out value = &quot;&amp;#034;&quot; escapeXml = &quot;true&quot;/&gt;
            &lt;c:out value = &quot;&amp;#034;&quot; escapeXml = &quot;false&quot;/&gt;
        &lt;/pre&gt;        
    &lt;/h2&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/74503a43-2e53-4cb9-bf15-e97740dc6365/image.png" alt="">
지금까지 일반적으로 많이 사용하는 코어 라이브러리에 대해 알아봤음. 그 외 &lt;c:import&gt; 태그는 <a href="jsp:include">jsp:include</a>와 같은 기능을 수행함.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[jsp] 표준 태그 라이브러리(jstl)]]></title>
            <link>https://velog.io/@bonvoyage_/jsp-%ED%91%9C%EC%A4%80-%ED%83%9C%EA%B7%B8-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%ACjstl</link>
            <guid>https://velog.io/@bonvoyage_/jsp-%ED%91%9C%EC%A4%80-%ED%83%9C%EA%B7%B8-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%ACjstl</guid>
            <pubDate>Wed, 06 Sep 2023 06:26:36 GMT</pubDate>
            <description><![CDATA[<p>jstl 이란 커스텀 태그 중 가장 많이 사용되는 태그를 표준화하여 라이브러리로 제공하는 것을 말함. jstl에서는 여러 가지 태그를 지원함.</p>
<p>** - jstl 태그 종류**</p>
<ul>
<li><p>코어(C) : 변수 지원, 흐름 제어, 반복문 처리, URL 처리</p>
</li>
<li><p>국제화(fmt) : 지역, 메세지 형식, 숫자 및 날짜 형식</p>
</li>
<li><p>XML(x) : xml 코어, 흐름제어, xml 변환</p>
</li>
<li><p>데이터베이스(sql) : SQL</p>
</li>
<li><p>함수(fn) : 컬렉션 처리 문자열 처리</p>
</li>
</ul>
<p>*<em>jstl은 2.0 규약부터 추가된 기능이므로 현재는 톰캣에서 기본으로 제공되지 않음. 따라서 다음 사이트에서 라이브러리를 다운로드해 설치해야 함.
*</em>
<a href="http://tomcat.apache.org/download-taglibs.cgi">http://tomcat.apache.org/download-taglibs.cgi</a></p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/54c3db04-5fc9-4024-b021-8c483c2b0405/image.jpg" alt=""></p>
<p>4개의 파일을 다운 받은 후 이클립스 프로젝트 lib 폴더에 붙여넣기.</p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/8f20a6cc-4817-4dd3-a45b-d9414a6fd4e6/image.jpg" alt=""></p>
<p>이렇게 해서 jstl을 사용하는 데 필요한 라이브러리를 설정함.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[jsp] jsp의 여러 가지 액션 태그]]></title>
            <link>https://velog.io/@bonvoyage_/jsp-jsp%EC%9D%98-%EC%97%AC%EB%9F%AC-%EA%B0%80%EC%A7%80-%EC%95%A1%EC%85%98-%ED%83%9C%EA%B7%B8</link>
            <guid>https://velog.io/@bonvoyage_/jsp-jsp%EC%9D%98-%EC%97%AC%EB%9F%AC-%EA%B0%80%EC%A7%80-%EC%95%A1%EC%85%98-%ED%83%9C%EA%B7%B8</guid>
            <pubDate>Thu, 31 Aug 2023 05:43:47 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>인클루드 액션태그 - jsp : include - 이미 있는 jsp를 현재 jsp에 포함하는 태그.</p>
</li>
<li><p>포워드 액션 태그 - jsp : forward - 서블릿에서 RequestDispatcher 클래스의 포워딩 기능을 대신하는 태그.</p>
</li>
<li><p>유즈빈 액션 태그 - jsp : useBean - 객체를 생성하기 위한 new 연산자를 대신하는 태그.</p>
</li>
<li><p>셋프로퍼티 액션 태그 - jsp : setProperty - setter를 대신하는 태그.</p>
</li>
<li><p>겟프로퍼티 액션 태그 - jsp : getProperty - getter를 대신하는 태그.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[jsp] 디렉티브 태그]]></title>
            <link>https://velog.io/@bonvoyage_/jsp-%EB%94%94%EB%A0%89%ED%8B%B0%EB%B8%8C-%ED%83%9C%EA%B7%B8</link>
            <guid>https://velog.io/@bonvoyage_/jsp-%EB%94%94%EB%A0%89%ED%8B%B0%EB%B8%8C-%ED%83%9C%EA%B7%B8</guid>
            <pubDate>Fri, 25 Aug 2023 05:16:53 GMT</pubDate>
            <description><![CDATA[<p>디렉티브 태그는 주로 jsp 페이지에 대한 전반적인 설정 정보를 지정할 때 사용하는 태그임. </p>
<p>디렉티브 태그의 종류</p>
<ul>
<li><p>페이지 디렉티브 태그 : jsp 페이지의 전반적인 정보를 설정할 때 사용함.</p>
</li>
<li><p>인클루드 디렉티브 태그 : 공통으로 사용하는 jsp 페이지를 다른 jsp 페이지에 추가할 때 사용함.</p>
</li>
<li><p>태그라이브 디렉티브 태그 : 개발자나 프레임워크에서 제공하는 태그를 사용할 때 사용함. </p>
</li>
</ul>
<h3 id="페이지-디렉티브-태그-정의와-사용법">페이지 디렉티브 태그 정의와 사용법</h3>
<ul>
<li>페이지 디렉티브 태그로 설정하는 여러 가지 jsp 속성</li>
</ul>
<ol>
<li><p>info - 없음 - 페이지를 설명해 주는 문자열을 지정함.</p>
</li>
<li><p>language - &quot;java&quot; - jsp 페이지에서 사용할 언어를 지정함.</p>
</li>
<li><p>contentTye - &quot;text/html&quot; - jsp 페이지 출력 형식을 지정함.</p>
</li>
<li><p>import - 없음 - jsp 페이지에서 다른 패키지의 클래스를 임포트할 때 지정함.</p>
</li>
<li><p>session - &quot;true&quot; - jsp 페이지에서 HttpSession 객체의 사용 여부를 지정함.</p>
</li>
<li><p>buffer - &quot;8kb&quot; - jsp 페이지 출력 시 사용할 버퍼 크기를 지정함.</p>
</li>
<li><p>autoFlush - &quot;true&quot; - jsp 페이지의 내용이 출력되기 전 버퍼가 다 채워질 경우 동작을 지정함.</p>
</li>
<li><p>errorPage - &quot;false&quot; - jsp 페이지 처리 도중 예외가 발생할 경우 예외 처리 담당 jsp 페이지를 지정함.</p>
</li>
<li><p>isErrorPage - &quot;false&quot; - jsp 페이지 처리 도중 예외가 발생할 경우 예외 처리 담당 jsp 페이지를 지정함.</p>
</li>
<li><p>pageEncoding - &quot;ISO-8859-1&quot; - jsp 페이지에서 사용하는 문자열 인코딩을 지정함.</p>
</li>
<li><p>isELIgnored - &quot;true&quot; - jsp 2.0 버전에서 추가된 기능으로 EL 사용 유무를 지정함. </p>
</li>
</ol>
<p>페이지 디렉티브 형식은 다음과 같이 &lt;%@page %&gt; 안에 속성과 값을 나열하면 됨.</p>
<blockquote>
<p>&lt;%@ page 속성1 = &quot;값1&quot; 속성2 = &quot;값2&quot; 속성3 = &quot;값3&quot;...%&gt;</p>
</blockquote>
<p>그런데 이클립스에서 jsp 페이지를 만들면 자동으로 페이지 디렉티브 태그가 생성됨.</p>
<p><strong>페이지 디렉티브 태그 사용 예제</strong></p>
<pre><code>&lt;!-- import 속성을 제외한 다른 속성은 한 번만 선언해야 함. --&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;
    import = &quot;java.util.*&quot;
    session = &quot;true&quot;
    buffer = &quot;8kb&quot;
    autoFlush = &quot;true&quot;
    isThreadSafe = &quot;true&quot;
    info = &quot;(ShoppingMall...)&quot;
    isErrorPage = &quot;false&quot;
    errorPage = &quot;&quot; %&gt;

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;페이지 디렉티브 연습&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;h1&gt;쇼핑몰 구현 중심 jsp 입니다.&lt;/h1&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><p>서블릿에서는 필요한 클래스 파일을 import문을 이용해서 일일이 설정해 줬음. 하지만 이제는 jsp 페이지에서 페이지 디렉티브 태그를 이용해서 설정함. 그리고 페이지 디렉티브 태그는 import 속성을 제외한 다른 속성은 한 번만 선언해 줘야 함.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[서블릿] 서블릿 속성과 스코프]]></title>
            <link>https://velog.io/@bonvoyage_/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%86%8D%EC%84%B1%EA%B3%BC-%EC%8A%A4%EC%BD%94%ED%94%84</link>
            <guid>https://velog.io/@bonvoyage_/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%86%8D%EC%84%B1%EA%B3%BC-%EC%8A%A4%EC%BD%94%ED%94%84</guid>
            <pubDate>Wed, 23 Aug 2023 05:14:24 GMT</pubDate>
            <description><![CDATA[<p><strong>서블릿 속성</strong>이란 다음 세 가지 서블릿 API 클래스에 저장되는 객체(정보)라고 보면 됨.</p>
<ul>
<li>ServletContext</li>
<li>HttpSession</li>
<li>HttpServletRequest</li>
</ul>
<p>각 장은 앞 장에서 이미 사용해 봤음. 서블릿의 API의 setAttribute(String name, Object value)로 바인딩하고, 필요할 때 getAttrubute(String name)으로 바인딩된 속성을 가져오면 됨. 또한 removeAttribute(String name)을 이용해 속성을 서블릿 API에서 제거할 수도 있음.</p>
<p><strong>서블릿의 스코프(scope)</strong> 는 서블릿 API에 바인딩된 속성에 대한 접근 범위를 의미함. 앞 장에서도 사용해 봤듯이 ServletContext에 바인딩된 속성은 애플리케이션 전체에서 접근할 수 있으므로 애플리케이션 스코프를 갖음.</p>
<p>HttpSession에 바인딩된 속성은 그 HttpSession에 해당하는 브라우저에게만 접근할 수 있으므로 세션 스코프를 갖음. </p>
<p>HttpServletRequest는 해당 요청/응답에 대해서만 접근하므로 리퀘스트 스코프를 갖음.</p>
<p>스코프의 기능은 다음과 같음.</p>
<ul>
<li>로그인 상태 유지 기능.</li>
<li>장바구니 기능.</li>
<li>MVC의 Model과 View의 데이터 전달 기능.</li>
</ul>
<ol>
<li><p>애플리케이션 스코프 : ServletContext - 속성은 애플리케이션 전체에 대해 접근할 수 있음.</p>
</li>
<li><p>세션 스코프 : HttpSession - 속성은 브라우저에서만 접근할 수 있음.</p>
</li>
<li><p>리퀘스트 스코프 : HttpServletRequest - 속성은 해당 요청/응답 사이클에서만 접근할 수 있음.</p>
</li>
</ol>
<p>예 ) 각 서블릿 API에 바인딩된 속성의 스코프를 알아보겠음.</p>
<ul>
<li>SetAttribute.java</li>
</ul>
<p>ServletContext, HttpSession, HttpServletRequest 객체의 setAttribute() 메서드를 이용해 속성을 바인딩함.</p>
<pre><code>package sec01.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet(&quot;/SetAttribute&quot;)
public class SetAttribute extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType(&quot;text/html; charset = utf-8&quot;);
        PrintWriter out = response.getWriter();

        String ctxMesg = &quot;context에 바인딩됩니다.&quot;;
        String sesMesg = &quot;session에 바인딩됩니다.&quot;;
        String reqMesg = &quot;request에 바인딩됩니다.&quot;;

        // HttpServletContext 객체, HttpSession 객체, HttpServletRequest 객체를 얻은 후 속성을 바인딩함.
        ServletContext ctx = getServletContext();
        HttpSession session = request.getSession();
        ctx.setAttribute(&quot;context&quot;, ctxMesg);
        session.setAttribute(&quot;session&quot;, sesMesg);
        request.setAttribute(&quot;request&quot;, &quot;reqMesg&quot;);

        out.print(&quot;바인딩을 수행합니다.&quot;);
    }

}</code></pre><ul>
<li>GetAttribute.java</li>
</ul>
<p>각 서블릿 API들의 getAttribute 메서드를 이용해 속성 이름으로 바인딩한 값을 가져와 브라우저로 출력함.</p>
<pre><code>package sec01.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet(&quot;/get&quot;)
public class GetAttribute extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType(&quot;text/html; charset = utf-8&quot;);
        PrintWriter out = response.getWriter();

        ServletContext ctx = getServletContext();
        HttpSession session = request.getSession();

        // 각 서블릿 API에서 바인딩된 속성의 값을 가져옴.
        String ctxMesg = (String)ctx.getAttribute(&quot;context&quot;);
        String sesMesg = (String)session.getAttribute(&quot;session&quot;);
        String reqMesg = (String)request.getAttribute(&quot;request&quot;);

        out.print(&quot;context 값 : &quot; + ctxMesg + &quot;&lt;br&gt;&quot;);
        out.print(&quot;session 값 : &quot; + sesMesg + &quot;&lt;br&gt;&quot;);
        out.print(&quot;request 값 : &quot; + reqMesg + &quot;&lt;br&gt;&quot;);
    }


}</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/a0e8a449-c7f9-4624-841b-0d9f4520f045/image.png" alt=""></p>
<ol>
<li>브라우저에서 /set 으로 요청해 속성을 바인딩함.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/57cbd2c5-4bc2-4494-866e-9875794737d8/image.png" alt=""></p>
<ol start="2">
<li>Context와 Session 객체에 바인딩된 속성은 같은 브라우저에서 접근할 수 있으므로 값을 출력함. 그러나 기존에 바인딩된 request 객체는 /get으로 생성된 request 객체와 다르므로 null이 출력됨. 
request 값 -&gt; 앞의 요청과 다르므로 바인딩된 속성이 유지되지 않음.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/50c1e472-e9b9-4fc6-81a8-554de20ab09a/image.png" alt=""></p>
<ol start="3">
<li>인터넷 익스플로러에서 /get으로 요청. 익스플로러에서 요청했기 때문에 이번에 크롬의 세션 객체에는 접근할 수 없어 null을 출력함. 반면에 Context 객체에 바인딩된 데이터는 모든 브라우저에서 같은 결과를 출력함.
session -&gt; 다른 브라우저에서 요청한 것이라 세션이 다르므로 속성이 유지되지 않음.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[서블릿] encodeURL() 사용법]]></title>
            <link>https://velog.io/@bonvoyage_/%EC%84%9C%EB%B8%94%EB%A6%BF-encodeURL-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@bonvoyage_/%EC%84%9C%EB%B8%94%EB%A6%BF-encodeURL-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Tue, 22 Aug 2023 04:50:23 GMT</pubDate>
            <description><![CDATA[<p>앞 절에서는 쿠키와 세션 기능을 알아봤음. 세션 역시 클라이언트의 세션 쿠키를 이용해 각 브라우저에 대한 세션 기능을 사용함. 그런데 만약 브라우저에서 쿠키 기능을 사용할 수 없게 설정했다면 쿠키 기능은 물론 세션 기능도 사용할 수 없음. </p>
<p>이럴 때는 encodeURL() 메서드를 이용해 직접 서버에서 브라우저로 응답을 먼저 보낸 후 URL Rewriting 방법을 이용해 jsessionId를 서버로 전송해 세션 기능을 사용하면 됨.</p>
<h3 id="encodeurl-메서드를-이용한-세션-사용-실습">encodeURL() 메서드를 이용한 세션 사용 실습</h3>
<p>이번에는 세션 쿠키를 사용하지 않고 encodeURL() 메서드를 이용해 jessionId의 세션 id를 브라우저에 응답으로 전송한 후 세션을 사용해 보겠음.</p>
<ul>
<li>sessionTest5</li>
</ul>
<p>다시 /login으로 요청해 jsessionId를 URL rewiting 방식으로 가져온 후 세션에 접근해 로그인 상태 유무를 판단하도록 구현함.</p>
<pre><code>package sec04.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet(&quot;/login&quot;)
public class SessionTest5 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doHandle(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doHandle(request, response);
    }

    private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding(&quot;utg-8&quot;);
        response.setContentType(&quot;text/html; charset = utf-8&quot;);
        PrintWriter out = response.getWriter();

        HttpSession session = request.getSession();

        String user_id = request.getParameter(&quot;user_id&quot;);
        String user_pw = request.getParameter(&quot;user_pw&quot;);

        if(session.isNew()) {
            if(user_id != null) {
                session.setAttribute(&quot;user_id&quot;, user_id);
                // 변수 url에 encodeURL()을 이용해 응답 시 미리 jsessionId를 서블릿으로 다시 전송함.
                String url = response.encodeURL(&quot;login&quot;);
                // 로그인 상태 확인 클릭 시 jsessionId를 서블릿으로 다시 전송함.
                out.println(&quot;&lt;a href = &quot; + url + &quot;&gt; 로그인 상태 확인 &lt;/a&gt;&quot;);
            }else {
                out.print(&quot;&lt;a href = &#39;login2.html&#39;&gt; 다시 로그인 하세요 &lt;/a&gt;&quot; );
                session.invalidate();
            }
        }else {
            user_id = (String)session.getAttribute(&quot;user_id&quot;);
            if(user_id != null &amp;&amp; user_id.length() != 0) {
                out.print(&quot;안녕하세요 &quot; + user_id + &quot;님.&quot;);
            }else {
                out.print(&quot;&lt;a href = &#39;login2.html&#39;&gt;다시 로그인하세요.&lt;/a&gt;&quot;);
                session.invalidate();
            }
        }
    }
}
</code></pre><p><img src="https://velog.velcdn.com/images/bonvoyage_/post/18292330-301e-48b8-978b-96402eae5135/image.png" alt=""></p>
<ol>
<li>로그인창에서 id와 비밀번호를 입력하고 로그인함.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/a0e2a8bc-48e3-4701-898b-dbabf42f78c9/image.png" alt=""></p>
<ol start="2">
<li>로그인 상태 확인을 클릭함.</li>
</ol>
<p>이미지 넣을 것</p>
<ol start="3">
<li>서블릿에 jessionId 쿠키 값을 전송해 로그인 상태를 유지함.</li>
</ol>
<p>대부분의 브라우저는 쿠키 사용을 기본으로 설정하고 있지만 쿠키를 사용할 수 없을 경우에는 이렇게 encodeURL() 메서드를 이용해 세션 기능을 사용할 수 있음.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[서블릿] 쿠키 생성 상태 확인하기]]></title>
            <link>https://velog.io/@bonvoyage_/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BF%A0%ED%82%A4-%EC%83%9D%EC%84%B1-%EC%83%81%ED%83%9C-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@bonvoyage_/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BF%A0%ED%82%A4-%EC%83%9D%EC%84%B1-%EC%83%81%ED%83%9C-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 19 Aug 2023 04:20:08 GMT</pubDate>
            <description><![CDATA[<p>클라이언트 쿠키의 생성 상태를 크롬에서 확인하는 방법.</p>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/2a08c0e6-6b93-4b52-8894-a3f74161c468/image.png" alt=""></p>
<ol>
<li>크롬 브라우저를 실행하고 f12를 눌러 디버그창을 나타냄. 그리고 상단 메뉴 바에서 Application을 클릭함.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bonvoyage_/post/7df706bf-ec85-49cf-a4f9-5632986f63dc/image.png" alt=""></p>
<ol start="2">
<li>왼쪽 메뉴에서 Cookies를 선택한 후 하위에 있는 <a href="http://localhost:8090%EC%9D%84">http://localhost:8090을</a> 클릭함. 현재 애플리케이션에서 사용하고 있는 쿠키 정보가 표시됨.</li>
</ol>
]]></description>
        </item>
    </channel>
</rss>