<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>lee_ari615.log</title>
        <link>https://velog.io/</link>
        <description>wow</description>
        <lastBuildDate>Fri, 14 Apr 2023 07:37:43 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. lee_ari615.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/lee_ari615" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Spring 세팅]]></title>
            <link>https://velog.io/@lee_ari615/Spring-%EC%84%B8%ED%8C%85</link>
            <guid>https://velog.io/@lee_ari615/Spring-%EC%84%B8%ED%8C%85</guid>
            <pubDate>Fri, 14 Apr 2023 07:37:43 GMT</pubDate>
            <description><![CDATA[<p>구글 - &gt; 스프링 검색</p>
<p><a href="https://spring.io/">https://spring.io/</a></p>
<p>projects - &gt; overview  -&gt; Spring Boot Tools 4  Eclipse 다운</p>
<p>spring-tool-suite-4-4.18.0.RELEASE-e4.27.0-win32.win32.x86_64.self-extracting  압축풀기</p>
<p>spring-tool-suite-4-4.18.0.RELEASE-e4.27.0-win32.win32.x86_64.self-extracting 폴더안에</p>
<p>contents  압축풀기 </p>
<p>실행 후 </p>
<p>project 생성은 여기서 </p>
<p><a href="https://start.spring.io/">https://start.spring.io/</a></p>
<p>Dependencies
ADD - &gt;   spring web,   Thymeleaf 추가 </p>
<p>생성하고</p>
<p>해당파일 위치로 이동</p>
<p>import projects - &gt; gradle -&gt; existing gradle project</p>
<p>project root 설정 하고 finish </p>
<p>window - preferences - &gt; UTF-8</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring boot day02]]></title>
            <link>https://velog.io/@lee_ari615/Spring-boot-day02</link>
            <guid>https://velog.io/@lee_ari615/Spring-boot-day02</guid>
            <pubDate>Fri, 14 Apr 2023 07:37:08 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/lee_ari615/post/87129f1d-b4d3-47e5-8ab8-6fe9f1b5c7e4/image.PNG" alt=""></p>
<h1 id="1-일반적인-웹-애플리케이션-계층-구조">1. 일반적인 웹 애플리케이션 계층 구조</h1>
<ul>
<li>컨트롤러 : 웹 MVC의 컨트롤러 역할</li>
<li>서비스 : 핵심 비지니스 로직 구현</li>
<li>레파지토리 : 데이터베이스에 접근, 도에인 객체를<pre><code>    DB에 저장하고 관리</code></pre></li>
<li>도메인 : 비지니스 도메인 객체
<img src="https://velog.velcdn.com/images/lee_ari615/post/3651bdc3-bcf5-4d50-80e7-54215f0ef9b4/image.PNG" alt=""></li>
</ul>
<h1 id="2-membercontroller">2. MemberController</h1>
<ul>
<li>생성자에 @Autowired가 있으면 스프링이 
연관된 객체를 스프링 컨테이너에서 찾아서
넣어준다. 이렇게 객체 의존관계를 외부에서 
넣어주는 것을 DI(Dependency Injection), 
의존성 주입이라 한다.</li>
<li>이전에는 개발자가 직접 주입했고, 여기서는 
@Autowired에 의해 스프링이 주입해준다. </li>
</ul>
<h1 id="3-제어역전">3. 제어역전</h1>
<ul>
<li>IoC, Inversion of Control</li>
<li>개발자가 프레임워크의 기능을 호출하는 형태가
아니라 프레임워크가 개발자의 코드를 호출하기
때문에, 개발자는 전체를 직접 구현하지 않고
자신의 코드를 부분적으로 &quot;끼워넣기&quot;하는
형태로 구현할 수 있다. </li>
<li>프레임워크가 객체의 생성, 소멸과 같은 라이프
사이클을 관리하며 스프링으로부터 필요한 객체를
얻어올 수도 있다. </li>
<li>객체의 의존성을 역전시켜 객체 간의 결합도를
줄이고 유연한 코드를 작성할 수 있게 하여
가독성 및 코드 중복, 유지보수를 편하게 할 수 
있게 한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/98f87b80-3a23-4bad-b042-2553586a1785/image.PNG" alt=""></p>
<h1 id="4-spring-container">4. Spring Container</h1>
<ul>
<li>스프링 컨테이너는 자바 객체의 생명 주기를
관리하며, 생성된 자바 객체들에게 추가적인 
기능을 제공하는 역할을 합니다. 여기서 맒하는
자바 객체를 스프링에서는 빈(Bean)이라고 부른다.</li>
<li>개발자는 객체를 생성하고 소멸할 수 있는데,
스프링 컨테이너가 이 역할을 대신해준다. 
즉, 제어의 흐름을 외부에서 관리한다. </li>
<li>또한, 객체들 간의 의존 관계를 스프링 컨테이너가
런타임 과정에서 알아서 만들어 준다. </li>
<li>스프링은 실행시 객체들을 담고있는 Container
가 있다. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/34c7dbe3-1b60-4485-bf12-30122b66b600/image.PNG" alt=""></p>
<h1 id="5-autowired">5. @Autowired</h1>
<ul>
<li>필요한 의존 객체의 &quot;타입&quot;에 해당하는 빈을
찾아 주입한다. 기본값이 true이기 때문에 의존성
주입을 할 대상을 찾지 못한다면 애플리케이션
구동에 실패한다. </li>
</ul>
<h1 id="6-pojo">6. POJO</h1>
<ul>
<li>Plain Old Java Object, 단순한 자바 오브젝트</li>
<li>객체 지향적인 원리에 충실하면서 
환경과 기술에 종속되지 않고 필요에 따라
재활용될 수 있는 방식으로 설계된 오브젝트를 
말한다. </li>
</ul>
<h1 id="7-컴퍼넌트-스캔의-대상">7. 컴퍼넌트 스캔의 대상</h1>
<ul>
<li>component scan의 대상은 main메서드가 있는
class의 동일 패키지 또는 하위 패키지만 
Spring이 scan을 하는 대상이 된다. </li>
</ul>
<h1 id="8-di-3가지-방법">8. DI 3가지 방법</h1>
<ul>
<li>Field Injection(필드 주입)</li>
<li>Setter Injection(수정자 주입)</li>
<li>Constructor Injection(생성자 주입)</li>
</ul>
<h1 id="9-solid">9. SOLID</h1>
<ul>
<li>클린코드로 유명한 로버트 마틴이 좋은 객체 
지향 설계의 5가지 원칙을 정리</li>
<li>SRP : 단일 책임 원칙
(Single responsibility principle)</li>
<li>OCP : 개방-폐쇄 원칙
(Open-closed principle)</li>
<li>LSP : 리스코프 치환 원칙
(Liskov substitution principle)</li>
<li>ISP : 인터페이스 분리 원칙
(Interface segregation principle)</li>
<li>DIP : 의존관계 역전 원칙
(Dependency inversion principle)</li>
</ul>
<h2 id="9-1-단일-책임-원칙">9-1. 단일 책임 원칙</h2>
<ul>
<li>한 클래스는 하나의 책임만 가져야 한다.</li>
<li>하나의 책임이라는 것은 모호하다.</li>
<li>클 수 있고, 작을 수 있다.</li>
<li>기준은 변경이다. 변경이 있을 때 파급효과가 적으면 
단일 책임 원칙을 자 따른 것</li>
</ul>
<h2 id="9-2-개방-폐쇄-원칙">9-2. 개방-폐쇄 원칙</h2>
<ul>
<li>확장에는 열려있고, 수정, 변경에는 닫혀있다. </li>
</ul>
<h2 id="9-3-리스코프-치환-원칙">9-3. 리스코프 치환 원칙</h2>
<ul>
<li>프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서
하위 타입의 인스턴스로 바꿀 수 있어야 한다.  </li>
<li>다형성에서 하위 클래스는 인터페이스 규약을 다 
지켜야 한다는 것, 인터페이스를 구현한 구현체를 믿고
사용하려면, 이 원칙이 필요하다.</li>
<li>단순히 컴파일에 성공하는 것을 넘엇어는 이야기</li>
</ul>
<h2 id="9-4-인터페이스-분리-원칙">9-4. 인터페이스 분리 원칙</h2>
<ul>
<li>특정 클라이언트를 위한 인터페이스 여러 개가 범용 
인터페이스 하나보다 낫다.</li>
<li>자동차 인터페이스 -&gt; 운전 인터페이스, 정비 인터페이스</li>
<li>인터페이스를 분리하면 정비 인터페이스 자체가 변해도,
운전 인터페이스는 영향을 주지 않는다.</li>
<li>인터페이스가 명확해지고, 대체 가능성이 높아진다.</li>
</ul>
<h2 id="9-5-dip-의존관계-역전-원칙">9-5. DIP 의존관계 역전 원칙</h2>
<ul>
<li>프로그래머는 추상황에 의존해야지, 구체화에 의존하면
안된단. 의존성 쥡은 이 원칙을 따르는 방법 중 하나다.</li>
<li>쉽게 이야기 해서 구현 클래스에 의존하지 말고, 인터페이스에
의존하라는 뜻</li>
</ul>
<h1 id="10-jpa">10. JPA</h1>
<ul>
<li>JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도
JPA가 직접 만들어서 실행해준다. </li>
<li>JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의
설계로 패러다임을 전화할 수 있다.</li>
<li>JPA를 사용하면 개발 생산성을 크게 높일 수 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring boot day01]]></title>
            <link>https://velog.io/@lee_ari615/Spring-boot-day01</link>
            <guid>https://velog.io/@lee_ari615/Spring-boot-day01</guid>
            <pubDate>Fri, 14 Apr 2023 07:32:47 GMT</pubDate>
            <description><![CDATA[<h1 id="1-framework란">1. Framework란?</h1>
<ul>
<li>&#39;뼈대나 근간&#39;을 이루는 코드들의 묶음</li>
<li>프로그램의 기본 흐름이나 구조를 정하고,
이 구조에 자신의 코드를 추가하는 방식으로
개발할 수 있도록 하는 프로그래밍의 기본 틀을 의미</li>
<li>개발에 필요한 구조가 제공되고, 여기에 필요한 
부분을 조립하는 형태로 개발이 진행된다. </li>
</ul>
<h1 id="2-라이브러리">2. 라이브러리</h1>
<ul>
<li>자주 사용되는 로직을 재사용하기 편리하도록 
잘 정리한 일련의 코드들의 집합</li>
</ul>
<h1 id="3-framework-vs-라이브러리">3. Framework vs 라이브러리</h1>
<ul>
<li>프레임워크는 자동자의 프레임, 즉 기본적으로 
구성하고 있는 뼈대를 말한다.</li>
<li>라이브러리는 자동차의 기능을 하는 부품을 의미한다. </li>
<li>한 번 정해진 자동차의 프레임은 바꿀 수 없다.</li>
<li>소형차를 민들기 위해 뼈대를 사용하는데, 이 뼈대로
SUV를 만들수 없다.(Framework)</li>
<li>그러나 바퀴나, 선루프, 헤드라이트 등은 비교적
다른 종류로 쉽게 바뀔 수 있다. (라이브러리)</li>
</ul>
<h1 id="4-spring-이란">4. Spring 이란?</h1>
<ul>
<li>스프링 프레임워크는 자바 플랫폼을 위한 오픈소스
애플리케이션 프레임워크로서 간단히 스프링이라고도
불린다. </li>
<li>동적인 웹 사이트를 개발하기 위한 여러 가지 
서비스를 제공하고 있다. </li>
</ul>
<h1 id="5-스프링-프로젝트-생성">5. 스프링 프로젝트 생성</h1>
<ul>
<li><a href="https://start.spring.io/">https://start.spring.io/</a></li>
</ul>
<h2 id="5-1-project">5-1. Project</h2>
<ul>
<li>빌드 툴 : 프로젝트에 필요한 의존성을 관리하는 툴,
과거에는 Maven을, 최근에는 Gradle추세이다.</li>
<li>Maven</li>
<li>Gradle </li>
</ul>
<h1 id="6-스프링-시작점">6. 스프링 시작점</h1>
<ul>
<li>@SpringBootApplication : 스프링 부트의 자동 
설정 읽기와 생성이 모두 자동으로 설정된다.</li>
</ul>
<h1 id="7-spring-mvc">7. Spring MVC</h1>
<ul>
<li>@Controller : 해당 url mapping을 찾는</li>
<li>@GetMapping : url get방식 요청 매핑</li>
<li>컨트롤러에서 리턴 값으로 문자를 반환하면 
resources/templates/ + {viewName} + .html
  -&gt; 뷰리졸버(viewResolver)</li>
</ul>
<h1 id="8-dispatcherservlet">8. DispatcherServlet</h1>
<ul>
<li>스프링 MVC도 프론트 컨트롤러 패턴으로 구현되어
있다. </li>
<li>스프링 MVC의 프론트 컨트롤러가 바로 
디스패처 서블릿이다. </li>
<li>DispatcherServlet  -&gt; FrameworkServlet
 -&gt; HttpServletBean -&gt; HttpServlet</li>
</ul>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/d0ff6f3c-3b94-493a-a250-4b85ca2f96ec/image.PNG" alt=""></p>
<h1 id="9-viewresolver">9. ViewResolver</h1>
<ul>
<li>실행할 뷰를 찾는 일을 한다.</li>
<li>페이지 컨트롤러가 리턴한 뷰 이름에 해당하는
뷰 객체를 매핑하는 역할</li>
</ul>
<h1 id="10-model">10. Model</h1>
<ul>
<li>Controller에서의 데이터를 Model에 담는다. 
View는 Model에 담겨있는 데이터만 쏙쏙 골라서 
화면에 바인딩해준다.</li>
<li>HashMap의 형태를 갖고있고, key와 value값을 
저장한다.</li>
<li>servlet에서 request.setAttribute()와 비슷한 역할을
한다.</li>
</ul>
<h1 id="11-modelandview">11. ModelAndView</h1>
<ul>
<li>model에서 view영역이 좀 더 확장</li>
<li>Model과 View를 동시에 설정이 가능하려면
컨트롤러는 ModelAndView객체만 리턴하지만
Model과 View가 모두 리턴 가능</li>
<li>addObject(key, value);</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[day11  jsp]]></title>
            <link>https://velog.io/@lee_ari615/day11-jsp</link>
            <guid>https://velog.io/@lee_ari615/day11-jsp</guid>
            <pubDate>Tue, 28 Mar 2023 06:52:15 GMT</pubDate>
            <description><![CDATA[<ol>
<li>프론트 컨트롤러</li>
</ol>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/9f7803a3-5442-4d08-bec3-1f4b904440e0/image.PNG" alt=""></p>
<ul>
<li>프론트컨트롤러가 도입된 이후부터는 공통의 로직을
관리하는 서블릿을 만들어 처리하도록 했다.</li>
<li>프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을
받는다.</li>
<li>프론트 컨트롤러가 클라이언트의 요청에 맞는 컨트롤러를
찾아 호출해준다.</li>
<li>컨트롤러에 대한 공통 로직에 처리가 가능하다.</li>
<li>프로트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을
사용하지 않아도 된다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/fd3ff769-c838-4a21-bb51-937971da34fb/image.PNG" alt=""></p>
<ol start="2">
<li>상대경로, 절대경로<ul>
<li>${pageContext.request.contextPath} : 프로젝트 경로</li>
<li><a href="http://localhost:8080/mvcMain/write.do">http://localhost:8080/mvcMain/write.do</a> -&gt; /mvcMain</li>
</ul>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[day10 jsp
]]></title>
            <link>https://velog.io/@lee_ari615/day10-jsp</link>
            <guid>https://velog.io/@lee_ari615/day10-jsp</guid>
            <pubDate>Mon, 27 Mar 2023 07:20:31 GMT</pubDate>
            <description><![CDATA[<h1 id="1-el">1. el</h1>
<h2 id="1-1-el의-데이터-저장소">1-1. el의 데이터 저장소</h2>
<ul>
<li><p>각 객체에 동일한 변수가 있을시 EL로 출력하면
아래 순서대로 출력된다. 
page &gt; request &gt; session &gt; application</p>
<ul>
<li>page scope : 하나의 JSP 페이지에서만 사용</li>
<li>request scope : 하나의 요청(request)에서만
  사용할 수 있는 영역</li>
<li>session scope : 하나의 웹 브라우저에서
  사용할 수 있는 영역</li>
<li>application scope : 웹 어플리케이션 영역</li>
</ul>
</li>
</ul>
<h1 id="2-jstl">2. jstl</h1>
<ul>
<li>JSP Standard Tab Library</li>
<li>연산이나 조건문, 반복문을 편하게 처리할 수 있으며,
JSP 페이지 내에서 자바코드를 사용하지 않고도 로직을 구현할 수 있도록
효율적인 방법을 제공한다.</li>
</ul>
<h2 id="2-1-jstl-core-태그">2-1. jstl core 태그</h2>
<blockquote>
<ul>
<li>&lt;c:set/&gt;
  : 변수를 만들때 사용</li>
</ul>
</blockquote>
<ul>
<li>&lt;c:out&gt; </c:out>
 : 값을 출력할때사용 ( &lt;-- 보단 EL문을 좀 더 많이 쓴다)</li>
<li>&lt;c:choose&gt; </c:choose>
 : 조건 제어 (swith)
 내부에 c:when, c:otherwise만 있어야한다.</li>
<li>&lt;c:when&gt; </c:when>
 : 조건 제어(case문)</li>
<li>&lt;c:otherwise&gt; </c:otherwise>
 : 조건 제어(default)<ul>
<li>&lt;c:forEach&gt; </c:forEach>
: 반복제어 (for문)</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[day09 jsp]]></title>
            <link>https://velog.io/@lee_ari615/day09-jsp</link>
            <guid>https://velog.io/@lee_ari615/day09-jsp</guid>
            <pubDate>Mon, 27 Mar 2023 07:19:19 GMT</pubDate>
            <description><![CDATA[<h1 id="1-mybatis">1. MyBatis</h1>
<h2 id="1-1-mybatis">1-1. MyBatis</h2>
<ul>
<li>객체 지향 언어인 자바의 관계형 데이터베이스
프로그래밍을 좀 더 쉽게 할 수 있게 도와 주는 개발
프레임워크로서 JDBC를 통해 데이터베이스에 엑세스하는
작업을 캡슐화하고 일반 SQL쿼리, 저장 프로시저 및 고급
매핑을 지원하며 모든 JDBC 코드 및 매개 변수의
중복작업을 제거 한다.</li>
<li>MyBatis 에서는 프로그램에 있는 SQL쿼리들을 한
구성파일에 구성하여 프로그램 코드와 SQL을 
분리할 수 있는 장점을 가지고 있다. </li>
<li>MyBatis는 기존 JDBC 방식과 달리 SQL문을 XML 파일에
작성함으로써 코드가 줄어들고 SQL문만 따로 관리하기
때문에 수정이 편해진다.</li>
<li>DBCP을 사용하기 때문에 JDBC만 사용하는 것보다
작업 효율과 가독성이 좋다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/bc318f45-fc39-4a9f-8867-0bc2f09ec96a/image.PNG" alt=""></p>
<h2 id="1-2-결과-값">1-2. 결과 값</h2>
<blockquote>
<ul>
<li>select
 -&gt; select 문에 해당하는 결과</li>
</ul>
</blockquote>
<ul>
<li>insert
-&gt; 1(다중 insert문도 마찬가지)</li>
<li>update
-&gt; update된 행의 갯수 반환(없으면 0)</li>
<li>delete
-&gt; delete된 행의 갯수 반환(없으면 0)</li>
</ul>
<h1 id="2-el문과-jstl">2. EL문과 JSTL</h1>
<ul>
<li>JSP페이지 내에 자바코드와 HTML코드가 섞여 있으면
가독성이 떨어진다. EL문와 JSTL문을 사용하면 HTML과 같은
태그로만 구성된 일관된 소스코드를 볼 수 있다는 장점이
있다. <h2 id="2-1-el">2-1. EL</h2>
<ul>
<li>Expression Language</li>
<li>값을 간결하고 간편하게 출력할 수 있도록 해주는 언어</li>
<li>&lt;%= %&gt;, out.println() 과 같을 자바코드를 더 이상
사용하지 않고 좀더 간편하게 출력을 지원하기 위한 도구.</li>
<li>EL 구문 : ${....}</li>
</ul>
</li>
</ul>
<h2 id="2-2-저장범위">2-2. 저장범위</h2>
<ul>
<li>값을 찾을때는 작은 scope에서 큰 scope으로 찾습니다.</li>
<li>page &gt; request &gt; session &gt; application </li>
</ul>
<h2 id="2-3-el-표현식">2-3. EL 표현식</h2>
<ul>
<li>pageContext : JSP내장객체의 pageContext</li>
<li>pageScope </li>
<li>requestScope</li>
<li>sessionScope</li>
<li>applicationScope</li>
<li>param </li>
<li>paramValues : 같은 이름으로 전달된 질의 문자열의 이름과<pre><code>값들을 저장하고 있는 map객체</code></pre></li>
<li>header</li>
<li>headerValue</li>
<li>cookie</li>
<li>initParam</li>
</ul>
<h2 id="2-4-el연산자">2-4. EL연산자</h2>
<ul>
<li>산술연산자 : +, -, *, /(div), %(mode)<ul>
<li>논리연산자 : &amp;&amp;(and), ||(or), !(not)</li>
</ul>
</li>
<li>비교연산자 : ==(eq), !=(ne), &lt;(lt), &gt;(gt), &lt;=(le), &gt;=(ge)</li>
<li>empty연산자 : 값이 null 이거나 공백문자인지를 판단하는 연산자
${empty &quot;&quot;}    -&gt; true
${empty null}    -&gt; true
${empty data}    -&gt; 값이 없으면 true, 값이 있으면 data</li>
</ul>
<h2 id="2-5-예">2-5. 예</h2>
<blockquote>
<ul>
<li><p>request.setAttribute(&quot;cnt&quot;, 30);
 -&gt; request.getAttribute(&quot;cnt&quot;);
 -&gt; ${cnt}</p>
</li>
<li><p>List list = new ArrayList&lt;&gt;{&quot;1&quot;, &quot;test&quot;, &gt;...};
request.setAttribute(&quot;list&quot;, list);
 -&gt; ((List)request.getAttribue(&quot;list&quot;)).get(0)
-&gt; ${list[0]}</p>
</li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[jsp day08]]></title>
            <link>https://velog.io/@lee_ari615/jsp-day08</link>
            <guid>https://velog.io/@lee_ari615/jsp-day08</guid>
            <pubDate>Mon, 27 Mar 2023 07:14:14 GMT</pubDate>
            <description><![CDATA[<h1 id="1-dbcp">1. DBCP</h1>
<ul>
<li><p>DataBase Connection Pool</p>
</li>
<li><p>데이터베이스와 연결된 커넥션을 미리 만들어서
저장해두고 있다가 필요할 때 저장된 공간(pool)
에서 가져다 쓰고 반환하는 기법을 말한다.</p>
</li>
<li><p>커넥션 풀은 이용하면 커넥션을 미리 만들어 두고
사용하기 때문에 매번 사용자가 요청할 경우
드라이버를 로드하고, 커넥션 객체를 생성해
연결하고 졸효나는 비효율적인 작업을 하지 않아도
된다.</p>
</li>
<li><p>즉 데이터베이스의 부하를 줄일 수 있고
자원을 효율적으로 관리할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/f1603f98-3d02-4ae7-a71f-c7703a85681d/image.PNG" alt=""></p>
</li>
</ul>
<h1 id="2-jndi-java-naming-and-directory-interface">2. JNDI (Java Naming and Directory Interface)</h1>
<ul>
<li>디렉토리 서비스에서 제공하는 데이터 및 객체를
발견하고 참고하기 위한 자바 API.</li>
<li>외부(WAS)에 있는 객체를 가져오기 위한 기술 방법</li>
<li>DB Pool을 미리 Naming시켜두는 방법
(DB 연결 방법중 하나)</li>
<li>우리가 저장해 놓은 WAS의 데이터베이스 정보에
JNDI를 성정해 놓으면, 웹 어플리케이션은 JNDI만
호출하면 간단하다.</li>
</ul>
<h2 id="2-1-사용하는이유">2-1. 사용하는이유</h2>
<ul>
<li>개발을 한 사람과 실제 서비스를 운영하는 담당자는
다른경우가 많기 때문에, 소스레벨에서 설정되어
있는 것보다 WAS에서 설정되어 있는 것을 선호한다.</li>
<li>WAS에 여러개의 웹 어플리케이션을 올려서 사용하기 때문에
WAS에서 한 번에 설정해 주는 것이
자원 낭비를 줄일 수 있습니다.</li>
<li>또한 장애가 나거나 성능이 정상적이지 못하면 다른
한 서버가 대신 일을 해줄 수 있습니다.</li>
<li>정리하자면 운영, 관리, 최적화 문제 대처에 다양한 이점이
있기 때문에 JNDI를 사용한다.
<img src="https://velog.velcdn.com/images/lee_ari615/post/8e950d95-bdc7-4838-868d-589b4ac2a21c/image.PNG" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/85be7dde-e57b-4ee2-b8d5-9257a14b9515/image.PNG" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[day07 jsp]]></title>
            <link>https://velog.io/@lee_ari615/day07-jsp</link>
            <guid>https://velog.io/@lee_ari615/day07-jsp</guid>
            <pubDate>Mon, 27 Mar 2023 07:12:01 GMT</pubDate>
            <description><![CDATA[<h1 id="1-ajaxasynchronous-javascript-and-xml">1. Ajax(Asynchronous javascript And XML)</h1>
<ul>
<li>비동기적 통신</li>
<li>빠르게 동작하는 웹페이지를 만들기 위한 개발 기법</li>
<li>Ajax는웹 페이지 전체를 다시 로딩하지 않고도,
웹페이지으 일부분만을 갱신할 수 있고, 백그라운드 
영역에서 서버와 통신하여 그 결과를 웹 페이지의
일부분에만 표시할 수 있다.</li>
<li>이 때 서버와 데이터를 주고 받을 수 있는데 대표적인
데이터는 JSON, XML,HTML, 텍스트 파일 등이 있다.</li>
</ul>
<h2 id="1-1-ajax-장점">1-1. Ajax 장점</h2>
<ul>
<li>웹 페이지 전체를 다시 로딩하지 않고도 웹 페이지
일부분만 갱신할 수 있다.</li>
<li>웹 페이지가 로드된 후에 서버로 데이터 요청을
보내거나 받을 수 있다.</li>
<li>다양한 UI동적 페이지 구현이 가능해진다.</li>
</ul>
<h2 id="1-2-ajax단점">1-2. Ajax단점</h2>
<ul>
<li>페이지의 이동이 없기때문에 히스토리의 관리가 
안된다.</li>
<li>반복적인 데이터 요청이 있으면 느려지거나 작동하지
않게된다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/fc6eaa74-31fc-4f0a-94b6-808afe2b5a72/image.PNG" alt=""></p>
<h2 id="1-3-ajax의-구성-요소">1-3. Ajax의 구성 요소</h2>
<ul>
<li>웹 페이지의 표현을 위한 HTML과 CSS</li>
<li>데이터의 교환을 위한 JSON, XML</li>
<li>웹 서버와의 비동기식 통신을 위한 XMLHttpRequest
객체(브라우저에 내장)</li>
</ul>
<h2 id="1-4-서버에-요청하기request">1-4. 서버에 요청하기(request)</h2>
<ul>
<li><p>XMLHttpRequest 객체
: 가장 핵심적인 구성요소
웹 브라우저가 서버와 데이터를 교환할 때 사용한다.</p>
</li>
<li><p>open()
: 서버로 보낼 ajax요성의 형식을 설정
opne(전달방식, url 주소, 동기여부)</p>
</li>
<li><p>send()
: 작성된 ajax요청을 서로 전달</p>
</li>
</ul>
<h2 id="1-5-서버로부터-응답response">1-5. 서버로부터 응답(response)</h2>
<ul>
<li><p>readyState 프로퍼티</p>
</li>
<li><p>status 프로퍼티</p>
</li>
<li><p>onreadystatechange 프로퍼티</p>
</li>
<li><p>readyState는 XMLHttpRequest 객체의 현재 상태를
나타낸다.
-&gt; UNSENT(숫자0)
: XMLHttpRequest 객체가 생성
-&gt; OPENED(숫자1)
: open() 메소드가 성공적으로 실행됨
-&gt; HEADERS_REVEIVED(숫자2)
: 모든 요청에 대한 응답이 도착함
-&gt; LOADING(숫자3)
: 요청한 데이터를 처리 중임
-&gt; DONE(숫자4)
: 요청한 데이터의 처리가 완료되어 응답할 
준비가 완료됨</p>
<ul>
<li>status : 서버의 문서상태를 나타낸다.(HTTP상태코드)</li>
<li>onreadystatechange : XMLHttpRequest객체의
readyState 프로퍼티 값이 변할 때마다 자동으로
호출되는 함수를 설정</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/7d6342dc-7e8d-456f-a07b-b634cf541476/image.PNG" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JSP day06]]></title>
            <link>https://velog.io/@lee_ari615/JSP-day06</link>
            <guid>https://velog.io/@lee_ari615/JSP-day06</guid>
            <pubDate>Tue, 21 Mar 2023 07:30:01 GMT</pubDate>
            <description><![CDATA[<h1 id="1-dbms-계정생성">1. dbms 계정생성</h1>
<ul>
<li><p>sqlplus system/1234</p>
</li>
<li><p>create user [id] identified by [pw];
 ex: create user jsp identified by jsp;</p>
</li>
<li><p>grant connect, resource to [id];
ex: grant connect, resource to jsp;</p>
</li>
</ul>
<h1 id="2-ojdbc란">2. ojdbc란</h1>
<h2 id="2-1-jdbc란">2-1. jdbc란</h2>
<ul>
<li>Java DataBase Connectivity</li>
<li>자바에서 데이터베이스에 접속/관리할 수 있게 
해주는 드라이버(API)</li>
<li>자바로 작성된 프로그램으로 DB와 관련된 작업을
처리할 수 있도록 제공되는 기능(코드)들을 모아놓은 것</li>
</ul>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/c87fcbcc-67cd-47b8-afb1-f256f934de5b/image.PNG" alt=""></p>
<h2 id="2-2-ojdbc란">2-2. ojdbc란</h2>
<ul>
<li>Oracle jdbc</li>
<li>오라클에서 제공하는 오라클 DB를 관리할 수 있도록
도와주는 JDBC이다.</li>
</ul>
<h1 id="3-executeupdate">3. executeUpdate()</h1>
<ul>
<li>수행결과로 int 타입을 반환한다.</li>
<li>select 구문을 제외한 다른 구문을 수행할 때 사용된다.</li>
<li>insert / delete / update 관련 구문에서는 반영된
레코드의 건수를 반환한다.</li>
</ul>
<h1 id="4-resultset">4. resultset</h1>
<ul>
<li>select 쿼리 실행 시 executeQuery() 메서드를 사용하여,
실행 결과로 java.sql.ResultSet 형으로 리턴</li>
<li>ResultSet 메서드
 -&gt; next()
 -&gt; getInt(int columnIndex)
 : columnIndex 번째 컬럼의 값을 가지고 온다.
 -&gt; getString(String columnName)
 : columnName값을 가지고 온다</li>
</ul>
<pre><code>![](https://velog.velcdn.com/images/lee_ari615/post/23410d55-33b9-4677-855c-904f8c23b3ca/image.PNG)</code></pre><h1 id="5-자바빈즈">5. 자바빈즈</h1>
<ul>
<li><p>JSP의 표준 액션 태그를 통해 접근할 수 있는 자바
클래스로서 멤버변수(필드)와 setter, getter 메소드로
이루어져있다.</p>
</li>
<li><p>자바빈즈 태그</p>
</li>
<li><p>MemberBean
 -&gt; 객체 생성
 java
 : MemberBean member = new MemeberBean();
 jsp
 : &lt;jsp:userBean class=&quot;패키지명.MemberBean&quot; id=&quot;member&quot;&gt;    </p>
<p> -&gt; setter()
 java 
 : member.setName(&quot;자바학생&quot;);
 jsp
 : &lt;jsp:setProperty name=&quot;member&quot; property=&quot;name&quot; value=&quot;자바학생&quot;/&gt;</p>
<p> -&gt; getter()
 java 
 : member.getName();
 jsp
 : &lt;jsp:getPropery name=&quot;member&quot; property=&quot;name&quot; /&gt;</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JSP day05]]></title>
            <link>https://velog.io/@lee_ari615/JSP-day05</link>
            <guid>https://velog.io/@lee_ari615/JSP-day05</guid>
            <pubDate>Mon, 20 Mar 2023 07:36:43 GMT</pubDate>
            <description><![CDATA[<ol>
<li>attribute scope<ul>
<li>page : 페이지 내에서 지역변수 처럼 사용</li>
<li>request : http 요청을 was가 받아서 웹 브라우저에게 
응답할 때까지 변수가 유지되는 경우 사용한다.</li>
<li>session : 웹 브라우저 별로 변수가 관리되는 경우 사용</li>
<li>application : 웹 어플리케이션이 시작되고 종료될 때까지
변수가 유지되는 경우 사용(모든 클라이언트에게 공통적으로
무언가를 보여줄때 사용)
<img src="https://velog.velcdn.com/images/lee_ari615/post/4c79f5c4-0576-4356-8b02-e4e96abd3980/image.PNG" alt=""></li>
</ul>
</li>
</ol>
<p>1-1. 사용 메서드</p>
<ul>
<li>setAttribute(String name, Object Value)  &lt;- 많이사용</li>
<li>getAttribute(String name)            &lt;- 많이사용</li>
<li>removeAttribute(String name)</li>
<li>getAttributeNames()   </li>
</ul>
<ol start="2">
<li><p>MVC패턴
2-1. MVC패턴이란</p>
<ul>
<li><p>M : Model
-&gt; 사용자가 원하는 데이터나 정보를 제공 (db)
-&gt; 애플리케이션의 정보, 데이터를 나타낸다.
-&gt; 이러한 data 정보들의 가공을 책임지는
컴포넌트를 말한다.</p>
</li>
<li><p>V : View
-&gt; 보여지는 화면( jsp, html)
-&gt; input 텍스트, 체크박스 항목 등과 같은 사용자
인터페이스 요소를 나타낸다.
-&gt; 다시 말해 데이터 및 객체의 입력, 그리고
보여주는 출력을 담당합니다.
-&gt; 데이터를 기반으로 사용자들이 볼 수 있는
화면이다. </p>
</li>
<li><p>C : Controller
-&gt; 사용자의 요청을 처리하고, 그 요청에 따른
전체 적인 흐름을 제어(java.jsp)
-&gt; 데이터와 사용자 인터페이스 요소들을 
잇는 다리역활을 한다.</p>
</li>
</ul>
</li>
</ol>
<p>2-2. MVC1 패턴</p>
<ul>
<li>MVC1 패턴의 경우 View와 Controller를 모두 JSP가
담당하는 형태를 가집니다. 즉 JSP하나로 유저의 요청을
받고 응답을 처리하므로 구현 난이도는 쉽다.</li>
<li>단순한 프로젝트에는 괜찮겠지만 내용이 복잡하고
거대해질수록 이 패턴은 힘을 잃습니다. 즉, 유지보수에
있어서 문제가 발생한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/cd6a73ee-ce5a-4e00-8e00-580d29b3e560/image.PNG" alt=""></p>
<p>2-3. MVC2패턴</p>
<ul>
<li>MVC2패턴은 널리 표준으로 사용되는 패턴이다.</li>
<li>요청을 하나의 컨트롤러(servlet)가 먼저 받는다.
즉 MVC1 과는 다르게 Controller와 view 가 분리되어
있습니다.</li>
<li>따라서 역활이 분리되어 MVC1패턴에서의 단점을
보완할 수 있다.</li>
<li>M,V,C중에서 수정해야 할 부분이 있다면, 그것만
꺼내어 수정하면 된다. 따라서 유지보수에 있어서도 큰
이점을 가진다. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/cafc375f-573c-4317-8db9-59d63a1974e7/image.PNG" alt=""></p>
<ol start="3">
<li>DTO( Data Transfer Object) / VO (Value Object)<ul>
<li>양쪽으로 전송되어 오고가는 데이터들을 담는 객체,
jsp에서는 bean 이라고 부른다. 여러 데이터들을
포장해서 만든 데이터 포장 객체</li>
<li>사용자가 입력한 값은 객체 형태로 받을 수 있게
클래스 구성</li>
<li>폼에서 입력된 데이터들은 하나의 DTO객체로 변환가능</li>
<li>하나의 데이터 베이스 레코드를 저장하여 레코드와 같은
구조를 가짐</li>
<li>레코드가 50개면 DOT객체도 50개</li>
<li>한 개의 레코드는 빈즈 클래스 객체 하나로 매핑</li>
<li>데이터가 포함된 객체를 한 시스템에서 다른 시스템으로
전달하는 작업을 처리하는 객체 </li>
</ul>
</li>
</ol>
<p>4.DAO(Data Access Object)</p>
<ul>
<li>데이터에 접근, 데이터를 관리하기 위한 객체,
데이터를 관리(추가, 수정, 삭제, 읽기)하는 여러
메소드들이 정의되어 있다.</li>
<li>insert, delete, update, select등 레코드 처리를 주 목적으로 한다.<ul>
<li>DTO 객체를 데이터베이스 서버에 저장</li>
</ul>
</li>
<li>데이터베이스 서버로부터 레코드를 selsect 한 후 ,
DTO 객체로 변경해 가져옴</li>
<li>SQL 을 직접 실행하는 기능을 가짐</li>
<li>JSP에서 데이터 베이스 접속 로직을 Beans로 작성하여
DB정보 변경시 수비게 변경사항을 구현할 수 있음</li>
<li>데이터 접근을 목적으로 하는 객체</li>
<li>커넥션 같은 것을 하나만 두고 여러 사용자가 DAO의
인터페이스를 사용하여 필요한 자료에 접근하도록 하는것</li>
<li>DB를 사용해 데이터를 조회하거나 조작하는 기능을
전담하도록 만든 오브젝트 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/c1fc5b16-c457-4875-8ebf-36ac8d116f78/image.PNG" alt=""></p>
]]></description>
        </item>
        <item>
            <link>https://velog.io/@lee_ari615/uk810k3s</link>
            <guid>https://velog.io/@lee_ari615/uk810k3s</guid>
            <pubDate>Fri, 17 Mar 2023 07:41:29 GMT</pubDate>
            <description><![CDATA[<h1 id="1-액션-태그">1. 액션 태그</h1>
<h2 id="1-1-액션-태그란-">1-1. 액션 태그란 ?</h2>
<ul>
<li><p>jsp 페이지에서 동이한 내용이라도 자바 코드를 기술하기 보다는
태그를 기술하는 것이 지저분하지 않고 깔끔하게 코딩할 수 있어
가독성 높은 소스코드를 작성할 수 있따. 코드 양을 대폭 줄일  수
있다.</p>
</li>
<li><p>페이지와 페이지 사이를 제어하거나 다른 페이지의 실행 결과
내용을 현재 페이지에 포함하거나 자바 빈즈(객체)등의 다양한
기능을 제공한다.</p>
</li>
<li><p>액션태그는 XML 문법을 따른다. 즉 시작 태그와 함께 반드시
종료태그를 포함해야 한다.</p>
</li>
<li><p>액션 태그의 기본형식 : &lt;jsp : ... 속성:값&gt; 내용 &lt;/jsp:....&gt;</p>
</li>
<li><p>내용이 없는 액션 태그의 형식 : &lt;jsp : ... 속성:값/&gt;</p>
</li>
</ul>
<h2 id="1-2-액션-태그">1-2. 액션 태그</h2>
<pre><code> - forward(&lt;jsp:forward/&gt;)
    -&gt; 다른 페이지로의 이동, 페이지 흐름 제어
 - include(&lt;jsp:include/&gt;)
    -&gt; 외부 페이지의 내용을 포함하거나 페이지 모듈화
 - param(&lt;jsp:param/&gt;)
    -&gt; 현재 페이지에서 다른 페이지에 대한 정보를 전달할 때 사용
 - useBean(&lt;jsp:useBean/&gt;
    -&gt; 빈(bean)을 생성하고 사용하기 위한 환경을 정의하는
    액션태그
 - setProjperty(&lt;jsp:setPreperty /&gt;)
    -&gt; 빈에서 속성값을 할당
 - getProperty(&lt;jsp:getProperty /&gt;)
    -&gt; 빈에서 속성 값을 얻어올 때 사용</code></pre><h1 id="2-페이지-이동">2. 페이지 이동</h1>
<h2 id="2-1-forward">2-1. forward</h2>
<ul>
<li>request 에 담긴 값이 유효한다. (response, request가 유지된다.)</li>
<li>이동된 url이 화면에 안보인다.(사용자는 이동했는지 알 수 없음)</li>
<li>forward 방식
 pageContext.forward(&quot;이동할페이지&quot;);
 &lt;jsp:forward page=&quot;이동할페이지&quot;/&gt;</li>
</ul>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/27986b3c-4fb0-45c2-9355-ec0c2e828628/image.PNG" alt=""></p>
<h2 id="2-2-redirect">2-2. redirect</h2>
<ul>
<li>클라이언트가 새로 페이지를 요청한 것과 같은 방식으로 
페이지가 이동됨</li>
<li>request, response가 유지되지 않는다.(새로 만들어짐)</li>
<li>이동된 url이 화면에 보인다.</li>
<li>리다이렉트 하는 방법
  response.sendRedirect(&quot;이동할페이지&quot;);</li>
</ul>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/1e6c8de1-8a6b-409d-95e9-e7eecfc7cf5f/image.PNG" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JSP day03]]></title>
            <link>https://velog.io/@lee_ari615/JSP-day03</link>
            <guid>https://velog.io/@lee_ari615/JSP-day03</guid>
            <pubDate>Thu, 16 Mar 2023 08:00:57 GMT</pubDate>
            <description><![CDATA[<h1 id="1-session">1. session</h1>
<h2 id="1-1-session이란">1-1. session이란</h2>
<ul>
<li>하나의 웹 브라우저의 정보를 유지하기 위한
세션 정보를 저장
(브라우저 종료 시 종료, 클라이언트 로그인 정보)</li>
<li>내장객체로서 브라우저마다 한 개씩 존재하고,
고유한 sessionID 생성 후 정보를 추출한다.</li>
<li>장점
-&gt; 서버에서 접근할 수 있기 때문에
보안성이 좋고, 저장 용량의 한계가
거의 없다.</li>
<li>단점
-&gt; 서버에 데이터를 저장하므로 서버에 
부하가 걸릴 수 있다.</li>
</ul>
<h2 id="1-2-session-사용하기">1-2. session 사용하기</h2>
<pre><code class="language-*">    session.setAttribute(&quot;설정이름&quot;, 값);

  * 세션유지시간 설정하기(초 단위)
    // 60분동안 저장
    session.setMaxInactiveInterval(60*60);
    // 무한대로 설정
    session.setMaxInactiveInterval(-1);

  * 세션에 저장된 값 가져오기
    session.getAttribute(&quot;설정이름&quot;);

  * 세션삭제
    session.removeAttribute(&quot;설정이름&quot;);
    // 세션 전체 제거
    session.invalidate();</code></pre>
<h1 id="2-쿠키cookie">2. 쿠키(cookie)</h1>
<h2 id="2-1-쿠키란">2-1. 쿠키란</h2>
<ul>
<li>웹 브라우저가 보관하고 있는 데이터로, 웹 서버에
요청을 보낼 때 쿠키를 헤더에 담아서 전송한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/e8f54f9c-3c31-499d-83ec-ce1634d02dbe/image.PNG" alt=""></p>
<h2 id="2-2-장점">2-2. 장점</h2>
<ul>
<li>클라이언트의 일정 폴더에 정보를 저장하기 때문에
서버의 부하를 줄일 수 있다.</li>
</ul>
<h2 id="2-3-단점">2-3. 단점</h2>
<ul>
<li>정보가 사용자 컴퓨터에 저장되기 때문에 
보안에 위협을 받을 수 있다.</li>
<li>데이터 저장 용량에 제한이 있다.</li>
<li>과자 브스러기처럼 작은 값을 저장할 수 있다.</li>
<li>일반 사용자가 브라우저 내의 기능인 &quot;쿠키차단&quot;
을 사용하면 무용지물</li>
</ul>
<h1 id="3-쿠키-vs-세션">3. 쿠키 vs 세션</h1>
<ul>
<li><p>쿠키
 -&gt; 클라이언트(=접속자PC)에 저장
 -&gt; 저장형식 : text
 -&gt; 만료시점 : 쿠키 저장시 설정
 -&gt; 사용자원 : 클라이언트 리소스
 -&gt; 용량제한 : 총 300개
 -&gt; 속도 : 세션보다는 빠름
 -&gt; 보안 : 세션보다는 안좋음</p>
</li>
<li><p>세션
 -&gt; 웹서버에 저장
 -&gt; 저장형식 : Object
 -&gt; 만료시점 : 브라우저 종료시 삭제
 -&gt; 사용자원 : 웹 서버 리소스
 -&gt; 용량제한 : 서버가 허용하는 용량제한
 -&gt; 속도 : 쿠키보다는 느림
 -&gt; 보안 : 쿠키보다 좋음</p>
</li>
</ul>
<h1 id="4-jsp">4. JSP</h1>
<h2 id="4-1-jsp란">4-1. JSP란?</h2>
<ul>
<li>JavaServer Pages</li>
<li>HTML코드에 Java코드를 넣어 동적 웹페이지를
생성하는 웹어플리케이션 도구이다. </li>
<li>HTML + java</li>
<li>HTML을 중심으로 JAVA와 연동하여 사용하는 
웹언어다. </li>
<li>JSP가 실행되면 자바 서블릿(servlet)으로 변환되며
웹 어플리케이션 서버에서 동작되면서 필요한
기능을 수행하고, 그렇게 생성된 데이터를 웹페이지와
함께 클라이언로 응답하게된다.</li>
</ul>
<p>  <img src="https://velog.velcdn.com/images/lee_ari615/post/8388e900-a9db-4fa6-86a5-d15fe55c3d1f/image.PNG" alt=""></p>
<p><img src="https://velog.velcdn.com/images/lee_ari615/post/8b33cc2a-0254-4a5b-921a-a2d85b5210d9/image.PNG" alt=""></p>
<h2 id="4-2-스크립트-태그">4-2. 스크립트 태그</h2>
<pre><code class="language--">  수행할 기능을 구현할 수 있다.
  - 선언문(declaration)
    -&gt; 자바 변수나 메소드를 정의하는데 
    사용하는 태그
    &lt;%!  ...  %&gt;
  - 스크립틀릿(scriptlet)
    -&gt; 자바 변수선언 및 자바 로직코드를
    작성하는데 사용되는 태그
    &lt;%  ... %&gt;
  - 표현문(expression)
    -&gt; 변수, 계산식, 메소드호출 결과를
    나타내는 태그
    &lt;%= ... %&gt;
  - 지시자
    -&gt; 페이지 속성 지정
    &lt;%@  %&gt;
  - 주석
    &lt;%-- ..... --%&gt;</code></pre>
<h2 id="4-3-jsp-내장-객체">4-3. JSP 내장 객체</h2>
<ul>
<li>JSP 내장 객체</li>
<li>JSP 페이지 내에서 제공되는 특수한 클래스 형의 객체</li>
<li>내장객체는 선언과 할당 없이 사용할 수 있다.</li>
</ul>
<h2 id="4-4-jsp-내장객체-종류">4-4. JSP 내장객체 종류</h2>
<ul>
<li>request : 웹 브라우저의 요청 정보를 저장하고 있는 객체</li>
<li>response : 웹 브라우저의 요청에 대한 응답 정보를 
   저장하고 있는 객체</li>
<li>out : JSP 페이지에 출력할 내용을 가지고 있는 출력
스트림 객체이다.</li>
<li>session : 하나의 웹 브라우저의 정보를 유지하기 위한
세션 정보를 저장하고 있는 객체</li>
<li>application</li>
<li>pageContext</li>
<li>page</li>
<li>config</li>
<li>exception</li>
</ul>
<h2 id="4-5-디렉티브-태그">4-5. 디렉티브 태그</h2>
<ul>
<li>&lt;%@ include file=&quot;파일명&quot; %&gt;</li>
<li>현재 jsp페이지의 특정 영역에 외부 파일의 내용을 포함
시키는 태그이다. 보통 header와 footer는 대부분의 페이지에
동일한 내용으로 작성되기 때문에 유지보수 및 편의를
위해서 외부 파일로 만든 후 incliude 하여 사용한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JSP day02]]></title>
            <link>https://velog.io/@lee_ari615/JSP-day02</link>
            <guid>https://velog.io/@lee_ari615/JSP-day02</guid>
            <pubDate>Wed, 15 Mar 2023 08:11:15 GMT</pubDate>
            <description><![CDATA[<h1 id="1-get-방식-vs-post-방식">1. GET 방식 vs POST 방식</h1>
<h2 id="1-1-get-방식">1-1. GET 방식</h2>
<ul>
<li>서블릿에 데이터를 전송할 때 데이터가 URL뒤에
 name=value 형태로 전송</li>
<li>보안에 취약</li>
<li>전송 가능 데이터 최대 255자</li>
<li>기본 전송 방식으로 사용이 쉬움  </li>
<li>웹 브라우저에서 직접 입력하여 전송 가능</li>
<li>여러 개의 데이터를 전송할 때 &#39;&amp;&#39;로 구분해서 전송</li>
<li>doGet()</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;!-- get 방식 : ...../url?parm1=value  --&gt;
        &lt;form action=&quot;usercount&quot;&gt;            &lt;------ 여기 주목 
            &lt;div&gt;
                    &lt;label&gt;&quot;안녕하세요&quot; 를 몇번 듣고 싶으세요?&lt;/label&gt;
            &lt;/div&gt;
            &lt;div&gt;
                &lt;input type=&quot;text&quot; name=&quot;cnt&quot;&gt;
                &lt;input type=&quot;submit&quot; value=&quot;출력&quot;&gt;
            &lt;/div&gt;
        &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><pre><code>



## 1-2. POST 방식
 - 서블릿에 데이터를 전송할때 TCP/IP 프로토콜
 데이터의 HEAD영역에 숨겨진 채 전송
 - 보안에 유리 
 - 전송 데이터 용량 무제한 
 - 전송 시 서블릿에서 또 다시 가져오는 작업이
 필요하므로 GET방식보다 처리 속도가 느림
 - doPost() 

</code></pre> <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
        <form action="add" method="post">    <----- 여기주목 
            <div>
                    <label>x :</label>
                    <input type="text" name="x">
            </div>
            <div>
                    <label>y :</label>
                    <input type="text" name="y">
            </div>

<pre><code>        &lt;div&gt;
            &lt;input type=&quot;submit&quot; name=&quot;operator&quot; value=&quot;덧셈&quot;&gt;
            &lt;input type=&quot;submit&quot; name=&quot;operator&quot; value=&quot;뺄셈&quot;&gt;
        &lt;/div&gt;
    &lt;/form&gt;</code></pre></body>
</html>
```




<h1 id="2-servlet-filter">2. Servlet Filter</h1>
<pre><code class="language-java">
package com.condingbox.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
//        모든곳에 적용
@WebFilter(&quot;/*&quot;)
public class CharacterEncodingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest arg0, 
                        ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {

//        System.out.println(&quot;before filter&quot;);
        // filgerChain으로 다음 작업 진행 여부를 정한다.

        arg0.setCharacterEncoding(&quot;UTF-8&quot;);

        arg1.setCharacterEncoding(&quot;UTF-8&quot;);
        arg1.setContentType(&quot;text/html; charset=UTF-8&quot;);

        arg2.doFilter(arg0, arg1);
//       System.out.println(&quot;after filter&quot;);
    }

}</code></pre>
<h1 id="3-서버-상태-코드">3. 서버 상태 코드</h1>
<ul>
<li><p>HTTP 상태 코드</p>
</li>
<li><p>1xx(정보) : 요청을 받았으며 프로세스를 계속한다.</p>
</li>
<li><p>2xx(성공) : 요청을 성공적으로 받았으며 인식했고
  정상적으로 수용했다.</p>
</li>
<li><p>3xx(리다이렉션) :요청 완료를 위해 추가 작업 조치가</p>
<pre><code> 필요하다.</code></pre></li>
<li><p>4xx(클라이언트 오류) : 요청의 문법이 잘못되었거나</p>
<pre><code>     요청을 처리할 수 없다.</code></pre></li>
<li><p>5xx(서버 오류) : 서버가 명백히 유효한 요청에 대해</p>
<pre><code> 충족을 실패했다.</code></pre></li>
</ul>
<p>HTTP 위키백과 
<a href="https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C">https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C</a></p>
<h1 id="4-상태유지의-필요성">4. 상태유지의 필요성</h1>
<ul>
<li>application, session, cookie</li>
</ul>
<h2 id="4-1-application">4-1. application</h2>
<ul>
<li>하나의 프로젝트가 생성이되고, 소멸될 때까지 계속
유지된다.</li>
</ul>
<pre><code class="language-java">
package com.codingbox.servlet;

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;

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

    @Override
    protected void service(HttpServletRequest arg0, 
            HttpServletResponse arg1) throws ServletException, IOException {

        // application 저장소 선언
        ServletContext application 
                    = arg0.getServletContext();

        String value_ = arg0.getParameter(&quot;value&quot;);
        String op = arg0.getParameter(&quot;operator&quot;);

        PrintWriter out = arg1.getWriter();
        int value = 0;

        if(!value_.equals(&quot;&quot;)) {
             value = Integer.parseInt(value_);
        }

        if( op.equals(&quot;=&quot;) ) {
            // 계산
            int x = (Integer)application.getAttribute(&quot;value&quot;);
            int y = value;
            String operator = (String)application.getAttribute(&quot;op&quot;);

            int result = 0;

            if(operator.equals(&quot;+&quot;)) {
                result = x + y;
            } else {
                result = x - y;
            }

            out.printf(&quot;결과값 : %d&quot;, result);
        } else {
            // application 값 저장
            application.setAttribute(&quot;value&quot;, value);
            application.setAttribute(&quot;op&quot;, op);
        }



    }

}


</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[JSP 세팅 방법 ]]></title>
            <link>https://velog.io/@lee_ari615/JSP-%EC%84%B8%ED%8C%85-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@lee_ari615/JSP-%EC%84%B8%ED%8C%85-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Tue, 14 Mar 2023 07:43:12 GMT</pubDate>
            <description><![CDATA[<p>환경세팅</p>
<ul>
<li><p>아파치 톰캣 
<a href="https://tomcat.apache.org/whichversion.html">https://tomcat.apache.org/whichversion.html</a></p>
<p>Supported Java Versions 확인 후 
왼쪽 메뉴 Download -&gt; 해당하는 버전 다운 </p>
</li>
</ul>
<p>압축 해제 후</p>
<p>이클립스 실행 - &gt; 파일 경로지정</p>
<p>실행할때의 지정을 놓쳤다면</p>
<p>실행 후 - &gt; file - &gt; switch workspace -&gt; Other 에서 설정</p>
<hr>
<p>&lt;프로젝트 설정&gt;</p>
<p>Create a project -&gt; dynamic 검색후 -&gt; Next 
-&gt; name 설정 day00 -&gt; Modify -&gt; java 버전선택
 next -&gt; next -&gt; Generate 체크박스 선택후 -&gt;  Finish</p>
<hr>
<p>&lt;서버설정&gt;</p>
<p>// Servers 클릭 버튼이 없다면 
Servers 탭에서 -&gt; 마우스 오른쪽버튼  -&gt; new -&gt; server </p>
<p>Apache 버전 선택 후  name변경 - &gt; next 
Browse 눌러서 경로선택 -&gt; next 
Availlable 에서 해당하는 파일선택 후 add 
Finish</p>
<hr>
<p>서버 스타트 오류 시 (포트넘버 사용중)
Servers -&gt; 해당파일 더블클릭 
Ports 에서
HTTP/1.1 포트넘버 확인 후 변경   (0~ 65535범위내 사용) </p>
<p>Ctrl + s 눌러서 저장</p>
<p>Modules 탭에서 
파일 선택후 - &gt; Edit</p>
<p>path: 를 / 로 변경</p>
<p>Ctrl + s 눌러서 저장</p>
<hr>
<p> &lt;호출&gt;
      <a href="http://localhost:8081/">http://localhost:8081/</a></p>
<hr>
<p>언어변경 
window - &gt; preferences -&gt; enc 검색 -&gt; UTF-8 변경</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹 서버 프로그램?(JSP시작)]]></title>
            <link>https://velog.io/@lee_ari615/%EC%9B%B9-%EC%84%9C%EB%B2%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8JSP%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@lee_ari615/%EC%9B%B9-%EC%84%9C%EB%B2%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8JSP%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Tue, 14 Mar 2023 07:39:55 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>웹 서버 프로그램이란</p>
</li>
<li><p>90년대 CS의 주류에서 이젠 2000년 이후에는 급격하게
web으로 전환이 되었으나, 두가지의 경우 서로 장단점이 있다</p>
</li>
<li><p>Client Server 모델</p>
<ul>
<li><p>간단한 구조로 되어 있다.대부분 Server에서 데이터를 처리
하고 클라이언트는 UI를 담당한다.</p>
</li>
<li><p>구조가 간단하여 속도가 좋은 특징이 있으나, 확장성은 
조금 떨어진다.</p>
</li>
<li><p>장점 
-&gt; 속도가 빠르다</p>
</li>
<li><p>단점
-&gt; 구조상 확장의 어려움이 있다.
-&gt; Client 프로그램을 다운로드 받아 PC에 설치해야
하는 배포의 번거로움
-&gt; 버그를 수정하여도 배포가히가 어려움
-&gt; 특정 OS 및 하드웨어에 종속적인</p>
</li>
<li><p>Socket통신
-&gt; 소켓통신이란 서버와 클라이언트 양방향 
연결이 이루어지는 통신으로, 클라이언트도 서버로
요청을 보낼 수 있고 서버도 클라이언트로 요청을
보낼수 있는 통신
-&gt; 클라이언트와 서버 양쪽에서 서로에게 데이터를
전달하는 방식의 양방향 통신</p>
</li>
</ul>
</li>
</ul>
<h1 id="1-웹의-등장-배경">1. 웹의 등장 배경</h1>
<h2 id="1-1-web환경">1-1. web환경</h2>
<ul>
<li><p>cs 환경이 배포가 어렵다는 단점을 보완한 모델</p>
</li>
<li><p>브라우저만 있으면 어디서든 쉽게 접근 가능</p>
<h2 id="1-2-장점">1-2. 장점</h2>
</li>
<li><p>OS와 브라우저의 제품에 상관없이 어디서든
동작가능</p>
</li>
<li><p>수정된 부분을 쉽게 배포가 가능함</p>
</li>
</ul>
<h2 id="1-3단점">1-3.단점</h2>
<ul>
<li>성능이 떨어지고, 속도가 느림.</li>
<li>너무 다양한 기술이 접목되어 관리하기 어려움</li>
</ul>
<h1 id="2-http-통신-★">2. HTTP 통신 ★</h1>
<ul>
<li>HTTP란 Hyper Text Transfer Protocol의 약자로
HTML 파일을 전송하는 프로토콜이라는 의미를 가진다.</li>
<li>현재는 JSON, Image 파일 등 또한 전송한다 .</li>
<li>HTTP 통신은 클라이언트에서 서버로 요청을 보내고
서버가 응답하는 방식으로 통신이 이루어진다.</li>
<li>응답에는 클라이언트의 요청에 따른 결과를 반환한다.</li>
<li>클라이언트의 요청이 있을 때 서버가 응답하는 방식.</li>
<li>단방향 통신</li>
</ul>
<h1 id="3-통신-프로토콜-★">3. 통신 프로토콜 ★</h1>
<ul>
<li>통신 프로토콜 또는 통신 규약은 컴퓨터나 원거리 통신
장비사이에서 메시지를 주고 받는 양식과 규칙의 체계이다.</li>
<li>통신 프로토콜은 신호 체계, 인증, 그리고 오류 감지
및 수정 기능을 포함할 수 있다.</li>
</ul>
<h1 id="4-프로토콜의-예시">4. 프로토콜의 예시</h1>
<ul>
<li>HTTP : Hyper Text Transfer Protocol</li>
<li>HTTPS : Hyper Text Transfer Protocol Secure</li>
<li>FTP :  File Transfer Protocol    (파일만 업로드)</li>
<li>SFTP : Secure File Transfer Protocol</li>
<li>Telnet : Terminal NETwork</li>
<li>SSH :  Secure SHell</li>
<li>SMTP : Simple Mail Transfer Protocol</li>
</ul>
<h1 id="5-정적-웹-페이지-static-web-pages">5. 정적 웹 페이지 (static web pages)</h1>
<ul>
<li>정적 웹 페이지는 언제 접속해도 같은 응답을 
보내줍니다.</li>
<li>일단 HTML, CSS, JS파일 등이 서버에 업로드 되면
개발자가 수정하기 전까지 매번 같은 파일을
브라우저에 건네줍니다.</li>
<li>즉, 웹 서버가 정적 웹 페이지에 대한 요청을 받은 경우
서버는 추가적인 처리 과정 없이 클라이언트에게
응답을 보냅니다.</li>
<li>예를 들어 회사나 개인의 소개 페이지가
정적 웹페이지의 좋은 예시이다.</li>
</ul>
<h1 id="6-동적-웹-페이지-dynamic-web-pages">6. 동적 웹 페이지 (dynamic web pages)</h1>
<ul>
<li>웹 서버가 동적 웹 페이지에 대한 요청을 받은 경우
서버는 추가적인 처리 과정 이후 클라이언트에게 응답을 보냅니다.</li>
<li>동적 페이지는 방문자와 상호작용하기 때문에
페이지 내용은 그때그때 다릅니다.</li>
<li>댓글, 날씨, 주가정보 등과 같이 정보 변경이 잦은
곳에 많이 사용된다.</li>
<li>동적페이지란 요청에 대해서 각각 다른 내용을 
보여준다.</li>
<li>사용자(클라이언트)가 URL을 통해 서버에 웹 페이지를
요청했을 때, 서버는 사용자에 맞는 HTML 문서를 생성하여
사용자에게 응답하게 된다.   </li>
</ul>
<h1 id="7-웹-호스팅">7. 웹 호스팅</h1>
<ul>
<li>웹 호스팅이란 개발자의 홈페이지(웹사이트)를 올려놓는
인터넷상의 공간을 임대해 주는 서비스</li>
<li>만든 홈페이지를 local PC에만 저장해놓으면 
인터넷상에서 누구나 볼수는 없습니다.</li>
<li>이때 필요한 서비스가 웹 호스팅 서비스</li>
<li>웹서버의 일부 공간을 할당받아, 그곳에 홈페이지
자료를 올려놓으면 누구나 인터넷상으로 해당 페이지를
볼 수 있다. </li>
</ul>
<h1 id="8-도메인">8. 도메인</h1>
<ul>
<li>도메인은 이름이다.</li>
<li>실제 주소 : 서울특별시 송파구 잠실6동 올림픽로 300</li>
<li>위치 : 롯데타워</li>
<li>실제 주소 : 125.209.222.142 </li>
<li>사이트 위치 : naver.com</li>
</ul>
<h1 id="9-인터넷-주소의-체계">9. 인터넷 주소의 체계</h1>
<ul>
<li><a href="http://localhost:8080">http://localhost:8080</a></li>
<li><a href="http://www.facebook.com">http://www.facebook.com</a>
  -&gt; http:// 프로토콜
-&gt; localhost or facebook.com 도메인
: localhost -&gt; &quot;자기자신&quot;을 가르키는 특수 도메인
: localhost -&gt; 127.0.0.1 <ul>
<li>8080</li>
<li><blockquote>
<p>포트번호, 특정 컴퓨터에서 통신을 위해
열려있는 문</p>
</blockquote>
</li>
<li><blockquote>
<p>모든 컴퓨터는 0~65536까지의 포트번호를 가지고있다.</p>
</blockquote>
</li>
<li><blockquote>
<p>이 포트번호를 통해서 통신이 진행될 수 있으며
기본적으로는 모든 포트번호는 차단되어있다.
(포트를 차단하는 역활을 하는 프로그램이
방화벽이다.) </p>
</blockquote>
</li>
</ul>
</li>
</ul>
<h1 id="10-jsp란">10. JSP란?</h1>
<ul>
<li>JSP는 HTML문서에 내부적으로 자바문법을 사용할 수 있게하는
스크립트 언어이다.</li>
</ul>
<h1 id="11-spring-framework란">11. Spring Framework란?</h1>
<ul>
<li>Spring은 다양한 개발을 빠르게 적용할 수 있게 만들어
놓은 도구이다.</li>
</ul>
<h1 id="12-서블릿">12. 서블릿</h1>
<ul>
<li>Web Server</li>
<li>HTTP 프로토콜을 기반으로 하여 클라이언트의 요청을 서비스하는
기능을 담당</li>
<li>클라이언트가 어떠한 요청을 하면 그에 대한 결과를 다시
전송해 주어야 하는데, 이러한 역활을 하는 자바 프로그램이다.</li>
<li>클라이언트가 URL을 입력하면 HTTP Request가 Servlet Container로
전송합니다. 요청을 전송받은 Servlet Container는 HttpServletRequest,
HttpServletResponse 객체를 생성합니다.</li>
<li>web.xml을 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한
요청인지를 찾습니다.</li>
<li>해당 서블릿에서 service메소드를 호출한 후 클라이언트의 GET,
POST 여부에 따라서 doGet() 또는 doPost()를 호출합니다.</li>
<li>HttpServletResponse 객체에 응답을 보낸다.</li>
<li>응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를
소멸시킵니다. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[jQuery ....]]></title>
            <link>https://velog.io/@lee_ari615/jQuery-</link>
            <guid>https://velog.io/@lee_ari615/jQuery-</guid>
            <pubDate>Tue, 14 Mar 2023 07:36:25 GMT</pubDate>
            <description><![CDATA[<h1 id="1-this">1. this</h1>
<h2 id="1-1-this의-용법">1-1. this의 용법</h2>
<ul>
<li>여러개의 요소를 의미하는 css셀레터를 사용하여
이벤트를 정의 한 경우, 대상 요소들은 모두 동일한
이벤트를 발생시킬 수 있다.</li>
<li>이때 $(this)는 현재 이벤트가 발생한 단 하나의
요소를 가리킨다.</li>
</ul>
<h2 id="1-2-this를-부정하는-notthis">1-2. this를 부정하는 not(this)</h2>
<ul>
<li>$(&quot;요소&quot;)객체의 not(this)함수는 여러 HTML요소들
중 이벤트가 발생한 자신을 제외한 나머지 객체들을
가리킨다.</li>
</ul>
<h2 id="1-3-not함수의-기능은-중에서-대상은-제외라는-의미">1-3. not()함수의 기능은 &quot;~중에서 대상은 제외&quot;라는 의미</h2>
<ul>
<li><p>&quot;.btn&quot; 클래스를 갖는 요소 중에서 &quot;#mybtn&quot;만 제외</p>
<p>   let mybtn = $(&quot;#mybtn&quot;);
   $(&quot;.btn&quot;).not(mybtn).css(....);</p>
<p>   $(&quot;.btn&quot;).not($(&quot;#mybtn&quot;)).css(....);</p>
</li>
</ul>
<h1 id="2-애니메이션">2. 애니메이션</h1>
<h1 id="3-each">3. each</h1>
<ul>
<li>each() 메소드는 객체나 배열에서 모두 사용할 수 있는
범용적인 반복 함수이다.</li>
<li>length속성이 있는 배열이나 배열과 같은 객체를 
전달받아, 그 길이만큼 반복해서 콜백함수를 실행한다.</li>
<li>객체의 경우는 객체가 가지고 있는 프로퍼티의 개수만큼
반복해서 콜백함수를 실행한다.</li>
</ul>
<h1 id="4-엘리먼트-제어">4. 엘리먼트 제어</h1>
<h2 id="4-1-자식으로-삽입">4-1. 자식으로 삽입</h2>
<pre><code>append(), appendTo(), html(), prepend(), prependTo(),
text()</code></pre><h2 id="4-2-형제로-삽입">4-2. 형제로 삽입</h2>
<pre><code>after(), before(), insertAfter(), insertBefore()</code></pre><h2 id="4-3-부모로-감싸기">4-3. 부모로 감싸기</h2>
<pre><code>unwrap(), wrap(), wralAll(), wrapInner()</code></pre><h2 id="4-4-삭제">4-4. 삭제</h2>
<pre><code>detach(), empty(), remove(), unwrap()</code></pre><h2 id="4-5-치환">4-5. 치환</h2>
<pre><code>replaceAll(), replaceWith()</code></pre><h2 id="4-6-클래스">4-6. 클래스</h2>
<pre><code>  addClass, hasClass, removeClass, toggleClass()</code></pre><h2 id="4-7-속성제어">4-7. 속성제어</h2>
<pre><code>attr(), prop(), removeAttr(), removeProp(), val()</code></pre><h1 id="5-탐색traversing">5. 탐색(traversing)</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[요소의 CSS속성 제어 ]]></title>
            <link>https://velog.io/@lee_ari615/%EC%9A%94%EC%86%8C%EC%9D%98-CSS%EC%86%8D%EC%84%B1-%EC%A0%9C%EC%96%B4</link>
            <guid>https://velog.io/@lee_ari615/%EC%9A%94%EC%86%8C%EC%9D%98-CSS%EC%86%8D%EC%84%B1-%EC%A0%9C%EC%96%B4</guid>
            <pubDate>Tue, 14 Mar 2023 07:31:13 GMT</pubDate>
            <description><![CDATA[<h1 id="1-요소의-css-속성-제어">1. 요소의 CSS 속성 제어</h1>
<h2 id="1-1-html태그-요소에-적용된-특정-속성값을-얻기">1-1. HTML태그 요소에 적용된 특정 속성값을 얻기</h2>
<p>  위해서는 CSS()함수를 사용한다.</p>
<pre><code>$(&quot;요소&quot;).css(&quot;속성이름&quot;, &quot;값&quot;);</code></pre><h2 id="1-2-속성값-변경추가하기">1-2. 속성값 변경/추가하기</h2>
<ul>
<li><p>HTML태그 요소에 특정 CSS값을 지정할 경우, attr()
함수와 용법이 동일하다.</p>
<p> let 변수 = $(&quot;요소&quot;).css(&quot;CSS속성이름&quot;);</p>
</li>
</ul>
<h2 id="1-3-html-태그-요소의-특정-클래스-적용-여부">1-3. HTML 태그 요소의 특정 클래스 적용 여부</h2>
<ul>
<li><p>HTML태그 요소의 특정 클래스 적용 여부는 
hasClass() 메서드의 리턴값(boolean)으로 파악할 수 있다</p>
<p>let 변수 = $(&quot;요소&quot;).hasClass(&quot;클래스이름&quot;);</p>
</li>
</ul>
<h2 id="1-4-클래스-적용과-해제">1-4. 클래스 적용과 해제</h2>
<ul>
<li><p>요소에 특정 CSS클래스를 적용할 경우, addClass()</p>
</li>
<li><p>두 개 이상의 클래스를 한번에 적용할 경우 공백으로
구분해서 지정</p>
<p>$(&quot;요소&quot;).addClass(&quot;클래스이름&quot;);</p>
<ul>
<li>HTML태그 요소에 적용된 특정 CSS클래스를 제거할 
경우 removeClass()함수를 사용한다.</li>
<li>두 개 이상의 클래스를 한번에 제거할때 공백으로 구분</li>
</ul>
<p>$(&quot;요소&quot;).removeClass(&quot;클래스이름&quot;);</p>
</li>
</ul>
<h2 id="1-5-적용과-해제의-반복-처리">1-5. 적용과 해제의 반복 처리</h2>
<ul>
<li><p>어떤 요소에 특정 클래스의 적용과 해제를 반복적으로
처리하는 것을 토글처리라고 한다.</p>
<p>if( $(&quot;요소&quot;).hasClass(&quot;클래스&quot;) ){</p>
<pre><code>// class가 적용
$(&quot;요소&quot;).removeClass(&quot;클래스&quot;);</code></pre><p>} else {</p>
<pre><code>// class가 미적용
$(&quot;요소&quot;).addClass(&quot;클래스&quot;);        </code></pre><p>}</p>
<p> -&gt; toggleClass();</p>
<p>$(&quot;요소&quot;).toggleClass(&quot;클래스이름&quot;);</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JSON ]]></title>
            <link>https://velog.io/@lee_ari615/JSON</link>
            <guid>https://velog.io/@lee_ari615/JSON</guid>
            <pubDate>Tue, 14 Mar 2023 07:29:25 GMT</pubDate>
            <description><![CDATA[<h1 id="1-json을-포함하는-json">1. JSON을 포함하는 JSON</h1>
<h2 id="1-1-json을-포함하는-json-표현">1-1. JSON을 포함하는 JSON 표현</h2>
<ul>
<li><p>JSON 데이터의 각 항목에는 어떠한 형식의 데이터든지 할당할 
수 있기 때문에, 새로운 JSON데이터를 할당하여 각각의 JSON
데이터들이 하나의 그룹 안에서 계층을 형성하도록 구성할 수 
있다.</p>
<p> let 계층이름 = {</p>
<pre><code> 하위객체이름 : { 이름 : 값, 이름 : 값 },
 하위객체이름 : { 이름 : 값, 이름 : 값 }</code></pre><p> }</p>
<p> let korea = {</p>
<pre><code> &quot;seoul&quot; : { &quot;people&quot; : 54321, &quot;desc&quot; : &quot;수도&quot; },
 &quot;jaeju&quot; : {  &quot;people&quot; : 12345, &quot;desc&quot; : &quot;섬&quot;  }</code></pre><p> }</p>
<h2 id="1-2-하위-json-데이터의-접근">1-2. 하위 JSON 데이터의 접근</h2>
<ul>
<li>JSON데이터에서 하위 데이터로 접근하고자 할 경우에는 
점(.)을 사용해 계층을 표현한다.</li>
</ul>
<p>객체이름.하위객체이름.값의이름;</p>
<p>   let description = korea.seoul.desc;</p>
</li>
</ul>
<h2 id="1-3-배열-json">1-3. 배열 JSON</h2>
<ul>
<li><p>일반적인 배열</p>
<pre><code>let 배열이름 = [1,2,3];</code></pre></li>
<li><p>배열 원소를 JSON으로 변경</p>
</li>
<li><p>javascript는 변수의 데이터 타입이 유동적이기 때문에
배열의 원소 역시 다양한 형태의 값을 저장할 수 있다.
즉 JSON 객체도 배열의 원소가 될 수 있다.</p>
<p>let 객체이름 = [{...},{....},{...}];</p>
<p>let 객체이름 = [</p>
<pre><code>{ &quot;people&quot; : 54321, &quot;desc&quot; : &quot;수도&quot; },
{  &quot;people&quot; : 12345, &quot;desc&quot; : &quot;섬&quot;  }</code></pre><p>];</p>
</li>
<li><p>배열 JSON의 데이터 접근</p>
</li>
<li><p>배열의 index를 통한 데이터 접근에는 변함이 없다.</p>
<pre><code>객체이름[0].people;
객체이름[0].desc;</code></pre></li>
</ul>
<h1 id="2-이벤트-처리-함수-안에서-자기-자신을-판별하기">2. 이벤트 처리 함수 안에서 자기 자신을 판별하기</h1>
<ul>
<li><p>이벤트에 의해서 실행되는 함수 영역 안에서는 특수 키워드 this를
사용할 수 있다. 이 키워드를 jQueyr의 $()함수에 전달하면 
이벤트가 발생한 자기 자신을 감지할 수 있다.</p>
<p> $(&quot;css셀렉터&quot;).이벤트함수(function(){</p>
<pre><code> $(this)</code></pre><p> });</p>
<ul>
<li>나는 몇번째 요소인가?
-&gt; 특정 객체에 대하여 index() 함수의 리턴값을 사용하면
자신이 속한 부모 태그 안에서 태그 종류의 구분 없이
자신이 몇 번쨰 요소인지를 알 수 있다.
-&gt; index()함수는 요소를 0부터 카운드 한다.
-&gt; 태그 종류에 상관 없이 무조건 부모 요소 안에서
몇 번째 항목인지를 판별한다.</li>
</ul>
</li>
</ul>
<h1 id="3-html-요소의-속성값-제어">3. HTML 요소의 속성값 제어</h1>
<h2 id="3-1-속성값-읽기">3-1. 속성값 읽기</h2>
<ul>
<li><p>HTML 태그 요소의 특정 속성값을 얻기 위해서는 attr()함수를
사용한다.</p>
<p>let 변수 = $(&quot;요소&quot;).attr(&quot;속성이름&quot;);</p>
 <img id="k" src="hello.png" >
let src = $("#k").attr("src");
src : hello.png

</li>
</ul>
<h2 id="3-2-속성값-변경추가">3-2. 속성값 변경/추가</h2>
<pre><code>  - HTML 태그 요소의 특정 속성값을 지정할 경우에도 attr()함수 사용
 - $(&quot;요소&quot;).attr(&quot;속성이름&quot;,&quot;값&quot;);
- $(&quot;#k&quot;).attr(&quot;src&quot;, &quot;world.png&quot;);</code></pre><h2 id="3-3-다중처리">3-3. 다중처리</h2>
<pre><code>$(&quot;요소&quot;).attr({
&quot;속성이름1&quot; : &quot;값&quot;,    
&quot;속성이름2&quot; : &quot;값&quot;,
&quot;속성이름3&quot; : &quot;값&quot;
 });</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[jQuery 의 시작]]></title>
            <link>https://velog.io/@lee_ari615/jQuery-%EC%9D%98-%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@lee_ari615/jQuery-%EC%9D%98-%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Tue, 14 Mar 2023 07:23:24 GMT</pubDate>
            <description><![CDATA[<h1 id="1-jquery">1. jQuery</h1>
<ul>
<li>라이브러리</li>
<li>자주 사용하는 로직을 재사용할 수 있도록 고안된 소프트웨어를
라이브러리라고 한다.</li>
<li>DOM을 내부에 감추고 보다 쉽게 웹페이지를 조작할 수 있도록 돕는 도구다</li>
</ul>
<p>다운 - &gt; <a href="https://jquery.com/">https://jquery.com/</a></p>
<ul>
<li><p>javascript 구현에 필요한 상당수의 기능들을 미리 구현해 놓은
함수들의 집약체</p>
</li>
<li><p>이처럼 프로그래밍에 필요한 함수들을 언제든지 필요할 때 참조할 수 있도록
집약해 놓은 형태를 &#39;라이브러리&#39;라고 한다.</p>
</li>
<li><p>HTMl 요소제어</p>
</li>
<li><p>요소의 탐색과 생성</p>
</li>
<li><p>ajax 통신처리</p>
</li>
<li><p>익숙한 구문</p>
</li>
<li><p>다양한 플러그인</p>
</li>
</ul>
<h1 id="2-jquery-제어의-대상-찾기">2. jQuery 제어의 대상 찾기</h1>
<pre><code> $(&#39;li&#39;).css(&#39;color&#39;,red&#39;);
 $ -&gt; jQuery
(&#39;li&#39;)   -&gt; css 선택자
.css(&#39;color&#39;,&#39;red&#39;)     -&gt; 선택된 객체들에게 style을
        color:red로 변경한다.</code></pre><h1 id="3-축약된-코드">3. 축약된 코드</h1>
<ul>
<li>innerHTML
 -&gt; 선택자.html(&quot;문장&quot;);</li>
</ul>
<ul>
<li>window.onload = function(...){}
  -&gt; $(document).ready(function(){...});
  -&gt; $(function(){...})</li>
</ul>
<h1 id="4--jquery-제어할-대상에-접근하는-방법">4.  jQuery 제어할 대상에 접근하는 방법</h1>
<ul>
<li>jQuery는 제어할 요소를 획득하기 위하여 $()함수 안에 제어할 대상을
가르키는 CSS셀렉터를 파라미터로 전달한다. </li>
</ul>
<ul>
<li><p>태그요소
  let tag = $(&#39;h1&#39;);</p>
</li>
<li><p>css클래스 요소 
  let mycss = $(&quot;.hello&quot;);</p>
</li>
<li><p>hello라는 id 속성을 갖는 요소
   let myid = $(&quot;#id&quot;); </p>
</li>
<li><p>조합형
  let my = $(&quot;a,b&quot;);</p>
</li>
<li><p>자식 항목</p>
<p>  let my = $(&quot;a b&quot;);</p>
</li>
</ul>
<h1 id="5-이벤트">5. 이벤트</h1>
<ul>
<li>id가 btn이라는 버튼에다가 click 이벤트를 바인딩하는 방법</li>
</ul>
<p>$(&quot;#btn&quot;).click(function(event){
    ..........
});</p>
<p>$(&quot;#btn&quot;).bind(&#39;click&#39;, function(event){
    .......
});</p>
<p>$(&quot;#btn&quot;).ont(&#39;click&#39;,function(event){
    ....
});</p>
<h1 id="6-keyevent">6. keyevent</h1>
<ul>
<li>keypress  이벤트는 영문, 특수문자에 대해서는 동작하지만
한글에 대해서는 동작하지 않는다.</li>
<li>그러므로 균등한 키 이벤트 구현을 위해서는 keyup 이벤트를 사용해야 한다.</li>
</ul>
<h2 id="6-1-keycode">6-1. keyCode</h2>
<ul>
<li>키보드가 자신의 어떤 키가 눌러졌는지 컴퓨터에게 보내는 데이터.</li>
<li>키보드의 키 하나하나에 각각 일련의 숫자값들이 할당되어 있다.
키보드는 눌러진 키에 대응되는 숫자값을 컴퓨터에게 전달한다.</li>
<li>javascript key code</li>
</ul>
<h1 id="7-json">7. JSON</h1>
<h2 id="7-1-json-표기법이란">7-1. JSON 표기법이란?</h2>
<ul>
<li>JSON(javascript Object Notaion)은 경량의 데이터 교환형식으로
프로그래밍 언어로부터 완전히 독립적이기 때문에, 서로 다른
프로그래밍 언어간에 데이터를 교환하는데 가장 널리 사용되는 
표기법이다. </li>
</ul>
<h2 id="7-2-json-표기법의-중요성">7-2 JSON 표기법의 중요성</h2>
<ul>
<li>문법으로서의 사용</li>
<li>javascript에서의 하나의 객체안에 함수와 변수를 함께 그룹화
하여 포함시키기 위한 문법의 형태로서 JSON 표기법이 사용된다.</li>
<li>jQuery에서의 기본 문법 체계는 JSON으로 구성된다.</li>
<li>javascript 소스코드 안에서 여러개의 변수값들을 계층적으로 표현하기
위해 사용된다.</li>
<li>Ajax에서 사용되는 데이터 규격으로 JSON이 사용된다.</li>
</ul>
<h2 id="7-3-표기법의-기본구조">7-3. 표기법의 기본구조</h2>
<ul>
<li><p>이름(key)과 값(value)의 쌍으로 이루어진 객체 구조</p>
</li>
<li><p>빈 객체(&#39;{}&#39;) 안에 배열과 같이 콤마(,)로 구별하여 여러개의 값을
하나의 객체 안에 포함시킨다. 이 때 &quot;이름:값&quot;의 형태로 할당한다.</p>
<p> let 객체이름 = {</p>
<pre><code> 이름 : 값, 이름 : 값</code></pre><p> }</p>
</li>
<li><p>데이터에 접근 </p>
<p>객체이름.이름;</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹 브라우저와 javascript]]></title>
            <link>https://velog.io/@lee_ari615/%EC%9B%B9-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-javascript</link>
            <guid>https://velog.io/@lee_ari615/%EC%9B%B9-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-javascript</guid>
            <pubDate>Tue, 14 Mar 2023 07:19:23 GMT</pubDate>
            <description><![CDATA[<h1 id="1-웹브라우저와-javascript">1. 웹브라우저와 javascript</h1>
<ul>
<li>웹브라우저에 올라가는 것은 html, css, javascript</li>
<li>HTML : 정보  ( 뼈대구성)</li>
<li>CSS : 디자인</li>
<li>Javascript : 웹브라우저 HTML 제어, 액션 </li>
</ul>
<h1 id="2-inline-방식">2. inline 방식</h1>
<ul>
<li>inline 방식은 태그에 직접 자바스크립트를 기술하는 방식이다.
장점은 태그에 연관된 스크립트가 분명하게 드러난다는 점이다.
하지만 정보와 제어가 섞여 있기 때문에 정보로서의 가치가
떨어진다.</li>
</ul>
<h1 id="3-object-model">3. Object Model</h1>
<ul>
<li>웹브라우저의 구성요소들은 하나하나가 객체화 되어있다.
자바스크립트로 이 객체를 제어해서 웹브라우저를 제어할 수 있게
된다. </li>
</ul>
<h2 id="3-1-window-객체">3-1. window 객체</h2>
<ul>
<li>window 객체는 DOM을 포함한 브라우저의 창을 나타낸다.
자바스크립트의 모든 객체, 전역 함수, 전역 변수들은 자동으로
window 객체의 프로퍼티가 된다. window객체의 메소드는 전역함수이며,
window 객체의 프로터티는 전역 변수가 된다.</li>
</ul>
<h2 id="3-2-dom">3-2. DOM</h2>
<ul>
<li>document object model </li>
</ul>
<h2 id="3-3-bom">3-3. BOM</h2>
<ul>
<li>browser object model</li>
<li>웹브라우저의 창이나 프레임을 추상화해서 프로그래밍적으로
제어할 수 있도록 제공하는 수단이다.</li>
</ul>
<h2 id="3-4-최상위-객체-사용">3-4. 최상위 객체 사용</h2>
<ul>
<li><p>모든 객체는 window객체의 하위 객체로써 존재한다. 내장객체 접근은</p>
<p> window.내장객체이름.함수이름(파라미터);</p>
</li>
<li><p>하지만, 모든 객체가 window안에 내장되어있기 때문에, window객체를
명시적으로 선언하는 것은 생략이 가능하다.</p>
<p> 내장객체이름.함수이름(파라미터);</p>
</li>
</ul>
<h2 id="3-5-windowopen">3-5. window.open()</h2>
<ul>
<li><p>새로운 창 열기 : 새로운 브라우저 창을 열 경우</p>
<p> window.open(&quot; 페이지 url &quot;);</p>
</li>
<li><p>팝업창 형태로 창을 열 경우</p>
<p> window.open(&quot;페이지 url&quot;, &quot;창이름:&quot;, &quot;옵션&quot;);</p>
</li>
<li><p>현재 창 닫기</p>
<p> window.close();
 self.close();</p>
</li>
</ul>
<h2 id="3-6-기본-이벤트-적용-방법">3-6. 기본 이벤트 적용 방법</h2>
<ul>
<li><p>링크 처리하는<code>&lt;a&gt; &lt;/a&gt;</code>태그에 대한 이벤트 처리 방법 역시
다른 HTML 태그에 대한 이벤트 처리 방법과 마찬가지로
이벤트 이름을 의미하는 태그 속성을 사용한다.</p>
</li>
<li><p>href와 onclick 속성의 충돌 방지
 -&gt; 링크는 클릭했을 때, 자체적으로 페이지를 이동하기 위한
 href속성과 이벤트 처리를 위한 onclick속성 양쪽 모두
 동작하는 과정에서 서로 충돌이 발생하게 되는 경우가 있는데,
 이벤트가 동작 전이나 후에 페이지가 이동해 버리는
 현상이 발생하기도 한다.
 -&gt; 두 속성의 충돌을 방지하기 위하여 onclick속성에 이벤트
 함수를 호출 한 뒤, return false 구문을 추가하여 실행을
 중단하도록 처리한다.</p>
<p> <a href="#" onclick = "opne1(); return false;"></a></p>
</li>
</ul>
<h2 id="3-7-location-객체-개요">3-7. location 객체 개요</h2>
<ul>
<li>location 객체는 웹 브라우저의 주소 표시줄을 제어한다.</li>
<li>주소를 변경하게 되면, 웹 브라우저는 페이지를 이동시킨다.</li>
<li>주소표시줄의 현재 주소 혹은 일부를 조회할 수 있다.</li>
<li>페이지 새로고침
 -&gt; location 객체 안에 포함된 reload() 함수는 현재 페이지를
 새로고침한다.</li>
</ul>
<h2 id="3-8-navigator">3-8. navigator</h2>
<ul>
<li>브라우저의 정보를 조회하기 위한 속성들을 가지고 있는 객체</li>
<li>navigator 객체를 사용하여, 하나의 웹 서비스로 다양한 브라우저를
지원할 수 있도록 처리하기 위한 기준이 되는 정보를 추출한다.</li>
</ul>
<h1 id="4-크로스-브라우징cross-browsing">4. 크로스 브라우징(cross browsing)</h1>
<ul>
<li>크로스 브라우징이란?
: 웹 페이지 제작 시에 모든 브라우저에서 깨지지 않고 의도한 대로
올바르게(호환성) 나오게 하는 작업을 말한다.</li>
</ul>
<ul>
<li>크로스 브라우징이 필요한 이유
: 브라우저 마다 랜더링 엔진이 다르기 때문이다.</li>
</ul>
<h1 id="5-document">5. document</h1>
<h2 id="5-1-특정-html요소를-객체-형태로-가져오기">5-1. 특정 HTML요소를 객체 형태로 가져오기</h2>
<ul>
<li><p>document 객체는 HTML 문서를 제어하기 위하여<br>특정 HTML태그 요소(Element)를 id값에 의하여 
객체 형태로 가져오는 기능을 제공</p>
<p> let somel = document.getElementByld(&quot;ID속성값&quot;);</p>
</li>
</ul>
<h2 id="5-2--html-요소의-내용-제어">5-2.  HTML 요소의 내용 제어</h2>
<ul>
<li>객체화된 HTML 요소의 innerHTML 속성을 사용하면 해당 태그에
속해 있는 내용을 새롭게 설정하거나, 현재의 내용을 읽어올 수 있다.</li>
</ul>
<pre><code>somel.innerHTML = &quot;&lt;h1&gt;Hi&lt;/h1&gt;&quot;</code></pre><h2 id="5-3-element-객체의-style-하위-객체">5-3. Element 객체의 style 하위 객체</h2>
<ul>
<li><p>style 객체는 css속성에 대응되는 변수들을 내장하고 있으며,
이 변수에 특정 값을 대입하는것으로 javascript를 통한 특정요소의
css제어가 가능해진다.</p>
<p> let somEle = document.getElementByld(&quot;id값&quot;);
 somEle.style.CSS대응속성 = &quot;CSS적용값&quot;;</p>
</li>
</ul>
<h1 id="6-이벤트">6. 이벤트</h1>
<h2 id="6-1-이벤트란">6-1. 이벤트란?</h2>
<ul>
<li>특정한 상황이 발생했을 때 호출되도록 사용자가 정의하는 함수들</li>
<li>특정한 상황, 특정한 동작</li>
</ul>
<h2 id="6-2-this">6-2. this</h2>
<ul>
<li>이벤트가 발생한 대상을 필요로 하는 경우 this를
통해서 참조할 수 있다.</li>
</ul>
<h2 id="6-3-프로퍼티-리스너">6-3. 프로퍼티 리스너</h2>
<ul>
<li>프로터티리스너 방식은 이벤트 대상에 해당하는 객체의 프로퍼티로
이벤트를 등록하는 방식이다.</li>
</ul>
<h2 id="6-4-이벤트-객체">6-4. 이벤트 객체</h2>
<ul>
<li>이벤트가 실행된 맥락의 정보가 필요할 때는 이벤트 객체를 사용한다.
이벤트 객체는 이벤트가 실행될 때 이벤트 핸들러의 인자로 전달된다.</li>
</ul>
<h2 id="6-5-addeventlistner">6-5. addEventlistner()</h2>
<ul>
<li>이벤트를 등록하는 가장 권장되는 방식이다.</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>