<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>NOTE</title>
    <link>https://dev-lkh.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 4 Apr 2026 16:56:31 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>시원해지고 싶은 사람</managingEditor>
    <image>
      <title>NOTE</title>
      <url>https://tistory1.daumcdn.net/tistory/6970649/attach/426f280339144676a54bbfc95cba2a1e</url>
      <link>https://dev-lkh.tistory.com</link>
    </image>
    <item>
      <title>[팀프로젝트]HappyTogeDOG</title>
      <link>https://dev-lkh.tistory.com/119</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;  목적 과 대상&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;목적 : 반려견 기반 지역 커뮤니티 활성화 및 편의 제공 및 실시간 유기견 홍보 및 입양 유도 서비스&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대상 : 전국 반려 가구 및 반려동물을 맞이하고자 하는 사람, 동물을 사랑하는 모두&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;  학습목표&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;jsp/servlet을 활용한 서버 사이드 동적 웹페이지 구현&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비동기 api 호출, Ajax 비동기 통신에 대한 이해 및 클라이언트 사이드 동적 웹 페이지 구현&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;디자인 패턴 MVC 에 대한 이해&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;브라우저 개발자 도구 활용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;  협업 프로세스&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;팀 구성원들의 많은 협의를 통해 아이디어와 목표 이해&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;목적에 맞는 API 선택과 학습 및 정보 수집&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구현할 페이지를 구성하고 페이지에 따라 클래스를 나누고 분업&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;담당 기능을 구현하고 평가 또는 피드백 요청&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트를 통해 얻은 지식 공유&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로그램 소개 설명 및 이슈&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;[인덱스]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csuepl/btsGZxbECtv/VK0uiNtCc3QzLMPuPS2BV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csuepl/btsGZxbECtv/VK0uiNtCc3QzLMPuPS2BV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csuepl/btsGZxbECtv/VK0uiNtCc3QzLMPuPS2BV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcsuepl%2FbtsGZxbECtv%2FVK0uiNtCc3QzLMPuPS2BV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;638&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;[로그인]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0KIzi/btsGZwX6z3g/UNUuzB6G1tYKzpKTIGcIt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0KIzi/btsGZwX6z3g/UNUuzB6G1tYKzpKTIGcIt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0KIzi/btsGZwX6z3g/UNUuzB6G1tYKzpKTIGcIt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0KIzi%2FbtsGZwX6z3g%2FUNUuzB6G1tYKzpKTIGcIt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;388&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;[회원 가입]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;1. Daum Postcode Service API :&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;사용자가 우편번호와 주소를 찾을 수 있도록 하여 주소 정보를 필수 입력값으로 요구하여 각 페이지의 필터 기능에&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 활용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2. 문자인증 API(COOLSMS) :&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;문자인증을 사용하여 본인인증을 함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2-1. API 키를 레포지토리에 노출된 상태로 업로드(타인이 도용할 우려)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;해결 : 인증키를 .properties 파일로 분리하여 .gitignore에 추가&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/73A8v/btsGYBeWcN7/knLNv8upnBCeykYZjwy7d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/73A8v/btsGYBeWcN7/knLNv8upnBCeykYZjwy7d1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/73A8v/btsGYBeWcN7/knLNv8upnBCeykYZjwy7d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F73A8v%2FbtsGYBeWcN7%2FknLNv8upnBCeykYZjwy7d1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;864&quot; height=&quot;295&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;[주변 반려견 시설]&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;1. geolocation API :&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;사용자 위치를 얻어 사용자 위치 기반 지도를 제공&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2. 주변 펫 관련 장소 마커 제공, 마커 클릭시 상세보기 제공 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3. 카테고리 별 검색 가능&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mhVHx/btsGZZrXjyH/RWOwbRGedvx9Olfhfnx8kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mhVHx/btsGZZrXjyH/RWOwbRGedvx9Olfhfnx8kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mhVHx/btsGZZrXjyH/RWOwbRGedvx9Olfhfnx8kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmhVHx%2FbtsGZZrXjyH%2FRWOwbRGedvx9Olfhfnx8kK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1008&quot; height=&quot;659&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;[유기동물 조회 및 동물보호센터 조회]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;1. 유기동물 조회 : &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;농림축산식품부 농림축산검역본부: 동물보호관리시스템 유기동물 정보 조회 서비스 API&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1-1. 공고 마감일에 따라 정렬 제공 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2. 동물 보호소 정보 조회 :&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;농림축산식품부 농림축산검역본부: 동물보호센터 정보 조회 API&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2-1. 운영시간, 전화번호 등 제공&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3. 인메모리 캐시 활용 :&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;이유 : 전국 유기동물의 수가 많아 페이지 요청시 데이터를 불러 정보를 가공하는데에 시간이 오래 걸림&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;　　 해결 : 모든 데이터를 서버 시작시에 List 객체를 사용하여 서버 내에 보관하고 필요로 한 정보를 요청시에 보관된 데이터에서 가공하여 페이지 로딩 속도를 향상&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4. 서버 side 스케줄링 로직으로 주기적으로 데이터를 설정해주어 업데이트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;이유 : 지역 유기동물 호출 API를 서버 첫 구동 시에만 불러왔을 때에는 시간 흐름에 따른 데이터 갱신이 없기에, 스케줄링을 통해 해결 &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;816&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY0WJz/btsG0by1ybm/KcZ5AKzxVB6LmOahOenA00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY0WJz/btsG0by1ybm/KcZ5AKzxVB6LmOahOenA00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY0WJz/btsG0by1ybm/KcZ5AKzxVB6LmOahOenA00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY0WJz%2FbtsG0by1ybm%2FKcZ5AKzxVB6LmOahOenA00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1437&quot; height=&quot;816&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;816&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;855&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cogPf5/btsG0s1INBD/8B7B7hDB4GYQzITt3oLB9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cogPf5/btsG0s1INBD/8B7B7hDB4GYQzITt3oLB9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cogPf5/btsG0s1INBD/8B7B7hDB4GYQzITt3oLB9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcogPf5%2FbtsG0s1INBD%2F8B7B7hDB4GYQzITt3oLB9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1032&quot; height=&quot;855&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;855&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RUQgx/btsG0URex9x/O7tHj4SY2roupWD9eEgJYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RUQgx/btsG0URex9x/O7tHj4SY2roupWD9eEgJYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RUQgx/btsG0URex9x/O7tHj4SY2roupWD9eEgJYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRUQgx%2FbtsG0URex9x%2FO7tHj4SY2roupWD9eEgJYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;868&quot; height=&quot;393&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;393&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;[반려견 카풀]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 카카오 맵 API :&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;API Document에서 제공하는 샘플을 참고, 변경하여 출발지 도착지 키워드 검색 후 마커 각각 제공&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2. 카카오 길찾기 API :&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;표시된 출발지와 도착지 마커를 활용하여 경로 데이터에 선을 그어 경로를 표시&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3. 채팅 :&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;웹소켓을 활용하여 작성자와 개별적인 채팅 제공&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZZu8l/btsGZZlai2N/v5kZPniEPw8DXR5VQMWzk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZZu8l/btsGZZlai2N/v5kZPniEPw8DXR5VQMWzk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZZu8l/btsGZZlai2N/v5kZPniEPw8DXR5VQMWzk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZZu8l%2FbtsGZZlai2N%2Fv5kZPniEPw8DXR5VQMWzk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;520&quot; height=&quot;276&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsG8b8/btsGZM0GCG1/0QcH8f2OynZztcKkpflKf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsG8b8/btsGZM0GCG1/0QcH8f2OynZztcKkpflKf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsG8b8/btsGZM0GCG1/0QcH8f2OynZztcKkpflKf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsG8b8%2FbtsGZM0GCG1%2F0QcH8f2OynZztcKkpflKf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;522&quot; height=&quot;245&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RVOqN/btsG13Uyy1y/T1IIn6nwyYFC85wPwRkHdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RVOqN/btsG13Uyy1y/T1IIn6nwyYFC85wPwRkHdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RVOqN/btsG13Uyy1y/T1IIn6nwyYFC85wPwRkHdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRVOqN%2FbtsG13Uyy1y%2FT1IIn6nwyYFC85wPwRkHdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;561&quot; height=&quot;429&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;[산책아르바이트 및 게시판]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. cos 라이브러리 :&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cos 라이브러리를 통해 멀티파트 요청을 활용하여 파일(반려견 사진) 업로드 처리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2. 페이징 구현&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;852&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9EY7j/btsGZVpEnBK/Soc1TZJYUFsArkYHAiN4Y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9EY7j/btsGZVpEnBK/Soc1TZJYUFsArkYHAiN4Y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9EY7j/btsGZVpEnBK/Soc1TZJYUFsArkYHAiN4Y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9EY7j%2FbtsGZVpEnBK%2FSoc1TZJYUFsArkYHAiN4Y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1025&quot; height=&quot;852&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;852&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;741&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/edHDcX/btsG1hZO2mt/1UNttfLEkkw9cRqknKNrs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/edHDcX/btsG1hZO2mt/1UNttfLEkkw9cRqknKNrs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/edHDcX/btsG1hZO2mt/1UNttfLEkkw9cRqknKNrs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FedHDcX%2FbtsG1hZO2mt%2F1UNttfLEkkw9cRqknKNrs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;976&quot; height=&quot;741&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;741&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n90Zg/btsG1x2yuOu/xQdFwvWkJQgjkExkXiJKu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n90Zg/btsG1x2yuOu/xQdFwvWkJQgjkExkXiJKu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n90Zg/btsG1x2yuOu/xQdFwvWkJQgjkExkXiJKu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn90Zg%2FbtsG1x2yuOu%2FxQdFwvWkJQgjkExkXiJKu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;870&quot; height=&quot;358&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;[플로팅 배너]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;1. paypal 결제 API 연결&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2. 플로팅 배너 :&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;유기견 입양 플로팅 배너 클릭 시 국가 동물 보호 정보 시스템 홈페이지 입양안내 페이지로 이동&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;149&quot; data-origin-height=&quot;517&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PG1Oa/btsGZVXst7w/1lnmcTctnozcVy5lkaKVsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PG1Oa/btsGZVXst7w/1lnmcTctnozcVy5lkaKVsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PG1Oa/btsGZVXst7w/1lnmcTctnozcVy5lkaKVsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPG1Oa%2FbtsGZVXst7w%2F1lnmcTctnozcVy5lkaKVsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;149&quot; height=&quot;517&quot; data-origin-width=&quot;149&quot; data-origin-height=&quot;517&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTcRFI/btsGY3BZy5m/KKDsdFS9VFI51N3rsCmik0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTcRFI/btsGY3BZy5m/KKDsdFS9VFI51N3rsCmik0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTcRFI/btsGY3BZy5m/KKDsdFS9VFI51N3rsCmik0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTcRFI%2FbtsGY3BZy5m%2FKKDsdFS9VFI51N3rsCmik0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;418&quot; height=&quot;249&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;249&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2O22A/btsG0SeO03u/ACtPwSyqfBVKiH3NHkmKMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2O22A/btsG0SeO03u/ACtPwSyqfBVKiH3NHkmKMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2O22A/btsG0SeO03u/ACtPwSyqfBVKiH3NHkmKMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2O22A%2FbtsG0SeO03u%2FACtPwSyqfBVKiH3NHkmKMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;418&quot; height=&quot;253&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;253&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;개선 하고 싶은 점&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp; 브라우저에서 제공하는 geolocation을 사용 하였지만 시연할때는 인증 문제로 사용하지 못했기에 IP 주소 기반 위치를 사용하여 개선하고 싶음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp; 채팅 기록이 데이터베이스에 기록되지 않아 과거 기록을 볼 수 없어서 채팅을 데이터 베이스에 기록할 수 있도록 하여 과거 기록을 볼 수 있게 하고 싶음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp; 산책 아르바이트와 반려견 카풀 메뉴에서 사용자들이 연락처나 채팅으로 매칭되기 때문에 미흡함이 있다고 생각을 하여 아르바이트 신청이나 채팅을 신청하게 되면 알림을 구현하고 싶음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp; &amp;nbsp;각 페이지마다 필터가 콤보박스이거나 버튼으로 되어 있는데 통일되어 있지 않아 한가지의 방법으로 통일하고 싶음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>PROJECT</category>
      <author>시원해지고 싶은 사람</author>
      <guid isPermaLink="true">https://dev-lkh.tistory.com/119</guid>
      <comments>https://dev-lkh.tistory.com/119#entry119comment</comments>
      <pubDate>Sun, 28 Apr 2024 17:05:18 +0900</pubDate>
    </item>
    <item>
      <title>Session</title>
      <link>https://dev-lkh.tistory.com/118</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;세션이란 ?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;클라이언트로부터 오는 일련의 요청을 하나의 상태로 보고 그 상태를 일정하게 유지하는 기술&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;클라이언트가 웹 서버에 접속해있는 상태가 하나의 단위&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 세션은 웹서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장합니다. 브라우저를 닫거나 서버에서 세션을 삭제하면 세션이 삭제됩니다. 세션은 각 클라이언트의 고유세션 ID를 부여하는데, 이것으로 클라이언트를 구분하여 각 클라이언트의 요구에 맞는 응답을 반환합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;세션 동작순서&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1) 클라이언트 요청&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2) Request-Header 필드의 Cookie 에서 세션ID를 보냈는지 확인&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3) 세션ID가 없을 경우, 서버에서 생성하여 클라이언트에게 전송&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4) 쿠키를 사용해 세션ID를 서버에 저장&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;5) 클라이언트 재접속 시, 쿠키를 이용하여 세션ID 값을 서버에 전달&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;쿠키와 세션 차이&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;쿠키는 브라우저 종료 시 삭제되는 세션과 달리 쿠키 저장시 만료시점을 저장하여 브라우저가 종료되더라도 자동 삭제되지 않습니다. 즉, 만료시점이 지나야 쿠키가 삭제되는 것 입니다. 세션은 서버에 저장되므로 안전한 반면, 쿠키는 로컬에 저장되어 탈취,변조 위험이 존재합니다. 이러한 세션은 보안에 취약한 쿠키를 보완해주는 역할을 하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 세션은 제공받은 세션Id를 이용해서 서버에서 다시 데이터를 참조해야 하므로 쿠키에 비해 느립니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>JSP</category>
      <author>시원해지고 싶은 사람</author>
      <guid isPermaLink="true">https://dev-lkh.tistory.com/118</guid>
      <comments>https://dev-lkh.tistory.com/118#entry118comment</comments>
      <pubDate>Sat, 20 Apr 2024 16:17:59 +0900</pubDate>
    </item>
    <item>
      <title>Cookie</title>
      <link>https://dev-lkh.tistory.com/117</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;쿠키란 : 사용자가 방문한 웹페이지에서 이용된 환경설정 및 기타 정보를 사용자의 컴퓨터에 작은 파일로 저장한 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;웹 서버가 생성하여 웹 브라우저로 전송하는 작은 정보 파일)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;쿠키의 역할&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저에 저장되어서 접속자 장치를 인식하거나 일부 데이터를 저장하는 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Cookie는 웹사이트가 인터넷 사용자에 대한 정보를 기억하고, 인터넷 사용자가 웹사이트를 더욱 효율적으로 이용할 수 있도록 합니다. 크게는 아래 세가지로 나눌 수 있습니다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세션관리 : 서버에 저장해야 할 데이터 관리&lt;/li&gt;
&lt;li&gt;개인 맞춤 데이터 : 테마 등과 같은 세팅값&lt;/li&gt;
&lt;li&gt;트래킹 : 사용자의 행동을 기록 및 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 인터넷 사용자가 로그인한 상태를 유지하기 위해 Cookie를 사용할 수 있는데, 이는 세션관리에 해당됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;쿠키의 문제점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인증에 사용하기에는 문제점이 많은 쿠키&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Cookie는 노출이 되었을때, 민감 정보까지 다 노출되어 보안이 좋지 않습니다. 일부 웹사이트에서는 Cookie를 사용하여 사용자의 웹사이트 방문 이력을 추적하기도 하고 조작당해서 들어올 가능성도 존재합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한, 웹 브라우저 마다 쿠키에 대한 지원 형태가 달라 다른 브라우저간의 공유가 불가능합니다. 쿠키 사이즈가 4KB로 제한되어 있기때문에 충분한 데이터를 담을 수 없다는 점 역시 큰 문제점입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;쿠키 저장 방법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 쿠키 클래스 객체 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1713597053648&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;% Cookie cookie = new Cooke(&quot;id&quot;, &quot;smhrd&quot;); %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. Response 내장 객체에 addCookie() 호출&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1713597091040&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;% response.addCookie(cooke); %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;쿠키 저장 조회&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1713597213157&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
	Cookie[] cookies = request.getCookies();
    for(int i = 0; i &amp;lt; cookies.length; i++) {
    	out.print(&quot;쿠키 이름 : &quot; + URLDecoder.decode(cookies[i].getName() + &quot;&amp;lt;br&amp;gt;&quot;));
        out.print(&quot;쿠키 값 : &quot; + URLDecoder.decode(cookies[i].getValue() + &quot;&amp;lt;hr&amp;gt;&quot;));
        }
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;쿠키 삭제&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1713597259663&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;% cooke.setMaxAge(0); %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JSP</category>
      <author>시원해지고 싶은 사람</author>
      <guid isPermaLink="true">https://dev-lkh.tistory.com/117</guid>
      <comments>https://dev-lkh.tistory.com/117#entry117comment</comments>
      <pubDate>Sat, 20 Apr 2024 16:15:36 +0900</pubDate>
    </item>
    <item>
      <title>Servlet 개념</title>
      <link>https://dev-lkh.tistory.com/116</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;서블릿(Servlet) ?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Server와 Applet의 합성어로, 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램이다. 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술인데, 쉽게 말하면 웹을 만들기 위해 자바를 사용할 때 필요한 기술이라고 생각하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우리가 흔히 로그인을 할 때, 아이디와 비밀번호를 입력하고 로그인 버튼을 누르는데, 이때 서버는 요청자의 아이디, 비밀번호를 확인 후 다음 페이지를 띄워준다. 띄워주는 것이 바로 서블릿(Servlet).&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;서블릿의 특징&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. HTML 변경시, 서블릿을 재컴파일 해야한다는 단점이 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. MVC패턴에서 Controller로 이용됨&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. JAVA Thread를 이용하여 동작된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. HTML을 사용하여 요청에 응답한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Servlet : Server 상에서 작동하는 Java기반의 Web Application Programming 기술.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Request/Response : Client로부터 데이터가 넘어오면 데이터를 받아서 처리하는 객체와 Client에게 응답을 할 수 있게 해주는 객체&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Url Mapping : Web browser에서 Servlet을 동작시키기 위해 실제 Java 클래스의 이름 대신, Servlet 을 요청하기 위한 문자열을 Servlet 클래스와 Mapping(맵핑)시키는것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일반적으로 웹서버는 정적인 페이지만을 제공한다. 따라서 동적인 페이지를 제공하기 위해서 웹서버는 다른 곳에 도움을 요청하여 동적인 페이지를 작성해야 한다. 이 때, 웹 서버가 동적인 페이지를 제공할 수 있도록 도와주는 어플리케이션이 서블릿이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서블릿 또한 자바 프로그램의 다른 클래스들처럼 자바 가상머신인 JVM에서 동작해야 하므로, Class 파일이 생성되어야 한다. 그래서 Class 형태로 작성한다. JDK에서는 웹 어플리케이션을 제작할 수 있는 클래스가 제공되지 않고, 톰캣을 설치하고 나면 웹 어플리케이션을 제작할 수 있는 클래스가 제공되는데, 그 클래스가 바로 HttpServlet이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;HttpServlet을 상속받은 클래스를 서블릿이라고 하는데, 이미 여러 기능이 만들어져 있기 때문에 개발자는 편리하게 웹 프로그램을 만들 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;get과 post?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Servlet 클래스에서 클라이언트는 서버에 get과post 두 가지 방식 중 하나로 요청을 한다. get 방식은 주소 창을 타고 넘어가기 때문에, 서버로 보내는 데이터를 사용자가 그대로 볼 수 있다. 그래서 보안에 취약하다는 단점이 존재한다. 255자 이하의 적은 양의 데이터를 전송한다. post 방식은 HTML header를 타고 넘어가기 때문에 보안에 강한 장점이 있고, 255자 이상의 대용량 데이터를 전송한다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>JSP</category>
      <author>시원해지고 싶은 사람</author>
      <guid isPermaLink="true">https://dev-lkh.tistory.com/116</guid>
      <comments>https://dev-lkh.tistory.com/116#entry116comment</comments>
      <pubDate>Sat, 20 Apr 2024 16:09:03 +0900</pubDate>
    </item>
    <item>
      <title>MVC</title>
      <link>https://dev-lkh.tistory.com/115</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MVC패턴 ?&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Model , View , Controller의 합성어로 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Model : 백그라운드에서 동작하는 로직을 처리합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;View : 사용자가 보게 될 결과 화면을 출력합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Controller : 사용자의 입력처리와 흐름 제어를 담당합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MVC패턴에는 모델1방식과 모델 2방 식이 있는데 특히 모델 2 구조 기반의 MVC패턴 구현은 JSP 개발자라면 무조건 알고 있어야 할 개발 방식입니다. JSP 웹사이트 구조는 크게 모델 1 방식과 모델 2 방식으로 나뉩니다. 간단하게 분류하자면 JSP에서 출력과 로직을 전부 처리하느냐(모델 1)&amp;nbsp;JSP에서 출력만 처리하느냐(모델 2)로 분류할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZ0L9D/btsGN0xpNLx/PchieFLCwi57OFki8jLeqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZ0L9D/btsGN0xpNLx/PchieFLCwi57OFki8jLeqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZ0L9D/btsGN0xpNLx/PchieFLCwi57OFki8jLeqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZ0L9D%2FbtsGN0xpNLx%2FPchieFLCwi57OFki8jLeqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;815&quot; height=&quot;266&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모델 1 구조는 사용자의 요청을 JSP가 전부 다 처리합니다. 웹브라우저 사용자의 요청을 받은 JSP는 자바 빈이나 서비스 클래스를 사용하여 웹브라우저가 요청한 작업을 처리하고 그 결과를 출력해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Model2방식&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CQd99/btsGMDjjpdl/Kkbyv0DPHCTawK6eXsi7z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CQd99/btsGMDjjpdl/Kkbyv0DPHCTawK6eXsi7z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CQd99/btsGMDjjpdl/Kkbyv0DPHCTawK6eXsi7z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCQd99%2FbtsGMDjjpdl%2FKkbyv0DPHCTawK6eXsi7z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;413&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모델 2 구조는 모델 1 구조와 달리 웹브라우저 사용자의 요청을 서블릿이 받습니다. 서블릿은 웹브라우저의 요청을 받아 View로 보여줄 것인지 Model로 보내줄 것인지 정하여 전송해줍니다. 여기서 View페이지는 사용자에게 보여주는 역할만 담당하고 실질적인 기능의 부분은 Model에서 담당합니다. 모델 2 방식의 경우 실질적으로 보이는 HTML과 JAVA 소스를 분리해놓았기 때문에 모델 1 방식에 비해 개발을 확장시키기도 쉽고 유지 보수하기도 쉽습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>JSP</category>
      <author>시원해지고 싶은 사람</author>
      <guid isPermaLink="true">https://dev-lkh.tistory.com/115</guid>
      <comments>https://dev-lkh.tistory.com/115#entry115comment</comments>
      <pubDate>Sat, 20 Apr 2024 15:45:42 +0900</pubDate>
    </item>
    <item>
      <title>웹에서 파일 업로드하기</title>
      <link>https://dev-lkh.tistory.com/114</link>
      <description>&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bssfqX/btsGLFV6lnF/Er521y1mkiZ7I9C13ORyO0/cos.jar?attach=1&amp;amp;knm=tfile.jar&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;cos.jar&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.05MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;cos.jar파일을&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;117&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjviuA/btsGOtTGSjU/UyNGSLrQOWXq6w4CQ4oiF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjviuA/btsGOtTGSjU/UyNGSLrQOWXq6w4CQ4oiF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjviuA/btsGOtTGSjU/UyNGSLrQOWXq6w4CQ4oiF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjviuA%2FbtsGOtTGSjU%2FUyNGSLrQOWXq6w4CQ4oiF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;117&quot; height=&quot;62&quot; data-origin-width=&quot;117&quot; data-origin-height=&quot;62&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위와 같이 WEB-INF -&amp;gt; lib 폴더 안에 넣어줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #222222; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;웹에서 파일 업로드하기&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1713595391313&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;fileUpload.jsp&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
&amp;lt;table align=&quot;center&quot; border=&quot;1&quot;&amp;gt;
&amp;lt;tr&amp;gt;
    &amp;lt;td colspan=&quot;2&quot;&amp;gt;파일 업로드 폼&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
    &amp;lt;td&amp;gt;올린 사람:&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;name&quot;&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
    &amp;lt;td&amp;gt;제목:&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;subject&quot;&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
    &amp;lt;td&amp;gt;파일명1:&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;&amp;lt;input type=&quot;file&quot; name=&quot;fileName1&quot;&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
    &amp;lt;td&amp;gt;파일명2:&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;&amp;lt;input type=&quot;file&quot; name=&quot;fileName2&quot;&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
    &amp;lt;td colspan=&quot;2&quot;&amp;gt;&amp;lt;input type=&quot;submit&quot; value=&quot;전송&quot;&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;fileUpload.jsp&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1713595407025&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
String uploadPath=request.getRealPath(&quot;upload&quot;);
	
int size = 10*1024*1024;
String name=&quot;&quot;;
String subject=&quot;&quot;;
String filename1=&quot;&quot;;
String filename2=&quot;&quot;;
	
try{
    MultipartRequest multi=new MultipartRequest(request,uploadPath,size,&quot;euc-kr&quot;,new DefaultFileRenamePolicy());
		
    name=multi.getParameter(&quot;name&quot;);
    subject=multi.getParameter(&quot;subject&quot;);
		
    Enumeration files = multi.getFileNames();
    String file1 = (String)files.nextElement();
    filename1 = multi.getFilesystemName(file1);
    String file2 = (String)files.nextElement();
    filename2=multi.getFilesystemName(file2);

}catch(Exception e){
    e.printStackTrace();
}
%&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form name=&quot;filecheck&quot; action=&quot;fileCheck.jsp&quot; method=&quot;post&quot;&amp;gt;
    &amp;lt;input type=&quot;hidden&quot; name=&quot;name&quot; value=&quot;&amp;lt;%=name %&amp;gt;&quot;&amp;gt;
    &amp;lt;input type=&quot;hidden&quot; name=&quot;subject&quot; value=&quot;&amp;lt;%=subject %&amp;gt;&quot;&amp;gt;
    &amp;lt;input type=&quot;hidden&quot; name=&quot;filename1&quot; value=&quot;&amp;lt;%=filename1 %&amp;gt;&quot;&amp;gt;
    &amp;lt;input type=&quot;hidden&quot; name=&quot;filename2&quot; value=&quot;&amp;lt;%=filename2 %&amp;gt;&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;a href=&quot;#&quot; onclick=&quot;javascript:filecheck.submit()&quot;&amp;gt;업로드 확인 및 다운로드 페이지이동 &amp;lt;/a&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;fileCheck.jsp&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1713595421946&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
request.setCharacterEncoding(&quot;euc-kr&quot;);
String name = request.getParameter(&quot;name&quot;);
String subject = request.getParameter(&quot;subject&quot;);
String filename1 = request.getParameter(&quot;filename1&quot;);
String filename2 = request.getParameter(&quot;filename2&quot;);
%&amp;gt;
&amp;lt;body&amp;gt;
올린사람 : &amp;lt;%=name %&amp;gt;&amp;lt;br/&amp;gt;
제목 : &amp;lt;%=subject %&amp;gt;&amp;lt;br/&amp;gt;
파일명1 : &amp;lt;a href=&quot;upload/&amp;lt;%=filename1%&amp;gt;&quot;&amp;gt;&amp;lt;%=filename1%&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
파일명2 : &amp;lt;a href=&quot;upload/&amp;lt;%=filename2%&amp;gt;&quot;&amp;gt;&amp;lt;%=filename2%&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgrB4z/btsGMTF4DWm/eNcykiqu76DMfPqlKVKKBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgrB4z/btsGMTF4DWm/eNcykiqu76DMfPqlKVKKBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgrB4z/btsGMTF4DWm/eNcykiqu76DMfPqlKVKKBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgrB4z%2FbtsGMTF4DWm%2FeNcykiqu76DMfPqlKVKKBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;243&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>JSP</category>
      <author>시원해지고 싶은 사람</author>
      <guid isPermaLink="true">https://dev-lkh.tistory.com/114</guid>
      <comments>https://dev-lkh.tistory.com/114#entry114comment</comments>
      <pubDate>Sat, 20 Apr 2024 15:44:15 +0900</pubDate>
    </item>
    <item>
      <title>Session을 ArrayList로 받기/세션 배열</title>
      <link>https://dev-lkh.tistory.com/113</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Session을 ArrayList로 사용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;선언 부분&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1713594498250&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
ArrayList&amp;lt;String&amp;gt; list = (ArrayList)session.getAttribute(&quot;productlist&quot;);
String productname = request.getParameter(&quot;item&quot;);

if(list==null){
     list = new ArrayList&amp;lt;String&amp;gt;();
     session.setAttribute(&quot;productlist&quot;,list);
}
list.add(productname);
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;출력 부분&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1713594510910&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//리스트를 새로 생성해줘도 이어서 추가하게된다.
&amp;lt;%
ArrayList&amp;lt;String&amp;gt; list = (ArrayList) session.getAttribute(&quot;productlist&quot;);
for(int i=0;i&amp;lt;list.size(); i++) {
    out.println(list.get(i) + &quot;&amp;lt;br&amp;gt;&quot;);
}
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>JSP</category>
      <author>시원해지고 싶은 사람</author>
      <guid isPermaLink="true">https://dev-lkh.tistory.com/113</guid>
      <comments>https://dev-lkh.tistory.com/113#entry113comment</comments>
      <pubDate>Sat, 20 Apr 2024 15:28:38 +0900</pubDate>
    </item>
    <item>
      <title>JSP 란?</title>
      <link>https://dev-lkh.tistory.com/112</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; JSP란 ? &lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;JavaServer Pages의 약자를 뜻하며,&amp;nbsp;&lt;/span&gt;HTML 코드에 JAVA 코드를 사용하여 동적 웹페이지(Dynamic Web Page)를 생성하는 웹 어플리케이션 도구(라이브러리)&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;이다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. Web&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 웹&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;이란, 인터넷 기반의 정보기술을 뜻하며, 우리가 흔히 접하는 &quot;WWW&quot;인 World Wide Web의 줄임말이다. 단어의 뜻처럼 전세계에 걸쳐 거대한 네트워크 망을 통해서 정보들을 공유하며, 정보는 양방향성의 특징을 가진다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. Web Application&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 웹 어플리케이션은 웹에서 실행되는 응용프로그램을 뜻하며, 인터넷을 통한 여러가지의 서비스를 일컫는다. 사용자는 필요한 데이터를 Request(요청)하고 서버에서는 사용자의 Request를 수행하며, 요청한 데이터를 Response(응답)하게 되는 형식이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;web Application의 구성요소&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;웹 브라우저 (Web Browser)&amp;nbsp; :&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;클라이언트에서 요청을 하고 전달받은 페이지를 볼수있는 환경&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;웹 서버 (Web Server) : &lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;클라이언트로 부터 요청받아 서버에 저장된 리소스를 클라이언트 에게 전달한다. 주로 정적컨텐츠를 담당한다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;웹 어플리케이션 서버 (Web Application Server) : &lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;줄여서 was 라고도 부르며 서버단에서 필요한 기능을 수행하고 그결과를 웹서버에게 전달한다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터베이스 (DB) : &lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;서비스에 필요한 데이터를 보관, 갱신 등 관리를 한다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. Java Servlet&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Java Servlet이란, 웹페이지를 동적으로 생성하기 위해 사용하는 서버측의 프로그램을 말한다. Servlet은 Java언어를 기반으로 만들어지며, 웹 어플리케이션 서버(Web Application Server) 위에서 컴파일 되고 동작한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4. JSP와 Java Servlet&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; JSP와 Servlet의 차이점을 비교한다면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #212529; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Servlet&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;JSP&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 자바 코드로 구현하고, 컴파일하고, 배포해야한다.&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 키워드가 태그화 되어 Servlet에 비해서 배우기 쉽다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- HTML 태그로 문자열(&quot;&quot;)스크림으로 처리해야 한다.&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 자바코드를&amp;lt;% %&amp;gt;태그 안에 처리해주어야 한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 코드가 수정되면 다시 컴파일하고 배포해야 한다.&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- HTML처럼 태그를 사용하여 자바코드도 사용이 가능하다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JSP</category>
      <author>시원해지고 싶은 사람</author>
      <guid isPermaLink="true">https://dev-lkh.tistory.com/112</guid>
      <comments>https://dev-lkh.tistory.com/112#entry112comment</comments>
      <pubDate>Sat, 20 Apr 2024 15:26:31 +0900</pubDate>
    </item>
    <item>
      <title>[HTML/CSS] 이미지 버튼(image button)</title>
      <link>https://dev-lkh.tistory.com/111</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이미지&amp;nbsp;버튼(image&amp;nbsp;button)&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1713593803608&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;button type=&quot;button&quot;&amp;gt;
  &amp;lt;img src=&quot;이미지 파일 경로&quot; alt=&quot;대체 텍스트&quot; onclick=&quot;&quot; &amp;gt;
&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;버튼 태그의 배경에 이미지를 포함&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1713593832132&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HTML

&amp;lt;input type=&quot;button&quot; class=&quot;img-button&quot; onclick=&quot;alert('클릭!')&quot;&amp;gt;

CSS

input.img-button {
  background: url(&quot;https://i.ibb.co/3493r17/cat.jpg&quot;) no-repeat;
  width: 180px;
  height: 180px;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;background: url() : 버튼 배경 이미지의 경로&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;no-repeat; : 배경 이미지를 반복하지 않음&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;width: 배경 이미지의 너비&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;height: 배경 이미지의 높이&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>HTML, CSS</category>
      <author>시원해지고 싶은 사람</author>
      <guid isPermaLink="true">https://dev-lkh.tistory.com/111</guid>
      <comments>https://dev-lkh.tistory.com/111#entry111comment</comments>
      <pubDate>Sat, 20 Apr 2024 15:17:27 +0900</pubDate>
    </item>
    <item>
      <title>[HTML] 버튼 태그(input type = &amp;quot;button&amp;quot;)</title>
      <link>https://dev-lkh.tistory.com/110</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;HTML 버튼&lt;/span&gt;&lt;/h3&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;버튼의 종류(button type)&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;background-color: #ffffff; color: #222222; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;버튼 타입&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;설명&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;button&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;버튼 형태를 만들며 자체기능은 없습니다. onClick 메서드를 활용하여 특정 액션을 취하는 기능을 넣을 수 있습니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;submit&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;폼(form)에서 입력받은 데이터들을 서버로 전송합니다.&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;reset&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;폼(form)에서 입력받은 데이터들을 초기화 시킵니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;첫 번째 방법 (input type = &quot;button&quot;)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;type:&lt;/b&gt;&amp;nbsp;버튼의 유형을 지정합니다. submit, reset, button 중 하나의 값을 가질 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;value:&lt;/b&gt;&amp;nbsp;버튼의 텍스트 값을 지정합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;disabled:&lt;/b&gt;&amp;nbsp;버튼을 비활성화시킵니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713593721011&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!--input type 사용--&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;button&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;disabled&quot; disabled&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;submit&quot;&amp;gt;
&amp;lt;input type=&quot;reset&quot; value=&quot;reset&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;두 번째 방법 (&amp;lt;button&amp;gt; 태그 사용)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;type:&lt;/b&gt;&amp;nbsp;버튼의 유형을 지정합니다. submit, reset, button 중 하나의 값을 가질 수 있습니다. (지정하지 않으면 button)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;disabled:&lt;/b&gt;&amp;nbsp;버튼을 비활성화시킵니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1713593729857&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!--button type 사용--&amp;gt;
&amp;lt;button&amp;gt;button&amp;lt;/button&amp;gt;
&amp;lt;button disabled&amp;gt;disabled&amp;lt;/button&amp;gt;
&amp;lt;button type=&quot;submit&quot;&amp;gt;submit&amp;lt;/button&amp;gt;
&amp;lt;button type=&quot;reset&quot;&amp;gt;reset&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;버튼 onclick 메서드&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1713593740153&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;button&quot; value=&quot;button&quot; onclick='alert(&quot;클릭!&quot;)'/&amp;gt;
&amp;lt;button onclick='alert(&quot;클릭!&quot;)'&amp;gt;button&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>HTML, CSS</category>
      <author>시원해지고 싶은 사람</author>
      <guid isPermaLink="true">https://dev-lkh.tistory.com/110</guid>
      <comments>https://dev-lkh.tistory.com/110#entry110comment</comments>
      <pubDate>Sat, 20 Apr 2024 15:15:51 +0900</pubDate>
    </item>
  </channel>
</rss>