<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dhffkvm_718.log</title>
        <link>https://velog.io/</link>
        <description>초보자가 기록하는 곳</description>
        <lastBuildDate>Mon, 17 Jan 2022 06:14:58 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dhffkvm_718.log</title>
            <url>https://images.velog.io/images/dhffkvm_718/profile/2099ed85-a2dd-4bf5-9de2-40b428b4a438/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dhffkvm_718.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dhffkvm_718" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Spring Boot + myBatis 연동]]></title>
            <link>https://velog.io/@dhffkvm_718/Spring-Boot-myBatis-%EC%97%B0%EB%8F%99</link>
            <guid>https://velog.io/@dhffkvm_718/Spring-Boot-myBatis-%EC%97%B0%EB%8F%99</guid>
            <pubDate>Mon, 17 Jan 2022 06:14:58 GMT</pubDate>
            <description><![CDATA[<p><a href="https://jonny-cho.github.io/spring/2019/01/21/springbootmysql/">여기</a>를 참고하였으나, thymeleaf를 사용하지 않고 jsp를 사용하여 연결하였다.</p>
<h4 id="pomxml-부분에-dependency-추가">pom.xml 부분에 dependency 추가</h4>
<pre><code>        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;
            &lt;scope&gt;test&lt;/scope&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupId&gt;mysql&lt;/groupId&gt;
            &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;
                &lt;!--             &lt;scope&gt;runtime&lt;/scope&gt; --&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.mybatis.spring.boot&lt;/groupId&gt;
            &lt;artifactId&gt;mybatis-spring-boot-starter&lt;/artifactId&gt;
            &lt;version&gt;2.0.0&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;!-- jsp viewer : jsp 사용을 위해 삽입--&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;javax.servlet&lt;/groupId&gt;
            &lt;artifactId&gt;jstl&lt;/artifactId&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupId&gt;org.apache.tomcat.embed&lt;/groupId&gt;
            &lt;artifactId&gt;tomcat-embed-jasper&lt;/artifactId&gt;
        &lt;/dependency&gt;

        &lt;!-- DevTools --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-devtools&lt;/artifactId&gt;
        &lt;/dependency&gt;</code></pre><h4 id="dto">DTO</h4>
<pre><code>public class UserDTO {
    private String email;
    private int id;
    private String name;

    // getter, setter, tostring</code></pre><h4 id="dao-interface">DAO (Interface)</h4>
<pre><code>@Mapper
public interface UserDAOInterface {
        public List&lt;UserDTO&gt; listmap();
}</code></pre><h4 id="mapper">Mapper</h4>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;
&lt;!DOCTYPE mapper PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot; &quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot; &gt;
&lt;mapper namespace=&quot; &#39;DAO path&#39; + .UserDAOInterface&quot; &gt;

    &lt;select id=&quot;listmap&quot; resultType=&quot; &#39;DTO path&#39; + .UserDTO&quot;&gt;
        select id,name,email from user
    &lt;/select&gt;

&lt;/mapper&gt;</code></pre><h4 id="applicationproperties">application.properties</h4>
<pre><code>spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://데이터베이스서버:3306/데이터베이스이름?serverTimezone=Asia/Seoul
spring.datasource.username=USER
spring.datasource.password=PASSWORD

mybatis.mapper-locations=classpath:mapper/*Mapper.xml</code></pre><h4 id="controller">Controller</h4>
<pre><code>@Controller
public class UserControllerRDBS {

    @Autowired
    private UserDAOInterface userMapper;

    @RequestMapping(&quot;/listmap&quot;)
    public ModelAndView listmap(Model model) {
        ModelAndView mv = new ModelAndView();

        //model.addAttribute(&quot;list&quot;, userMapper.listmap());
        List&lt;UserDTO&gt; listmap = userMapper.listmap();
        System.out.println(listmap.toString());

        mv.addObject(&quot;listmap&quot;, listmap);

        mv.setViewName(&quot;listmap&quot;);

        return mv;
    }
}</code></pre><h4 id="jsp-파일-내용">JSP 파일 내용</h4>
<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;table&gt;
      &lt;tr&gt;
        &lt;th&gt;id&lt;/th&gt;
        &lt;th&gt;name&lt;/th&gt;
        &lt;th&gt;email&lt;/th&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td &gt;${listmap[0].id}&lt;/td&gt;
        &lt;td &gt;${listmap[0].name}&lt;/td&gt;
        &lt;td &gt;${listmap[0].email}&lt;/td&gt;
      &lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[javax.el.PropertyNotFoundException]]></title>
            <link>https://velog.io/@dhffkvm_718/javax.el.PropertyNotFoundException</link>
            <guid>https://velog.io/@dhffkvm_718/javax.el.PropertyNotFoundException</guid>
            <pubDate>Mon, 23 Aug 2021 12:25:49 GMT</pubDate>
            <description><![CDATA[<p>프로젝트를 하는 와중에 갑자기</p>
<blockquote>
<p>javax.el.PropertyNotFoundException: 타입 [com.walab.hgu.DTO.ReservationInfoDTO]에서 프로퍼티 [Day]을(를) 찾을 수 없습니다.</p>
</blockquote>
<p>라는 에러가 떴다.</p>
<p>아니 근데 나는 철자도 틀린게 없고 분명히 DTO 객체 내에 &quot;Day&quot;라고 명시를 해놨는데 이런 에러가 뜨는 것이다. 그래서 구글링을 해보니 jsp 상에서 객체를 display할때, </p>
<p>${officeHour.<del>Day</del>} 이렇게 D를 쓰면 안되고, ${officeHour.<strong>day</strong>} 소문자로 해야한다는 것이다.</p>
<p>DTO 내에도 대문자인 Day로 지정해놓았기 때문에 정확한 원인은 모르겠지만,,,아무튼 이런 경우도 있다고 한다...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring-Git Push 에러(Can't connect to any URI: git-receive-pack not permitted...)]]></title>
            <link>https://velog.io/@dhffkvm_718/Spring-Git-Push-%EC%97%90%EB%9F%ACCant-connect-to-any-URI-git-receive-pack-not-permitted</link>
            <guid>https://velog.io/@dhffkvm_718/Spring-Git-Push-%EC%97%90%EB%9F%ACCant-connect-to-any-URI-git-receive-pack-not-permitted</guid>
            <pubDate>Sun, 15 Aug 2021 06:30:46 GMT</pubDate>
            <description><![CDATA[<p>엊그제까지 잘되던 git push가 갑자기 URI가 틀렸다는 식의 에러를 뱉었다,,,</p>
<p>그래서 찾아봤을 때는 git push 로그인 아이디/비번이 틀렸다, 예전에 store in storage 를 한게 꼬인 것이다, uri를 잘 확인해보아라 는 등의 말이 대부분이었는데 아무리 확인을 해도 해결이 되지 않았다.</p>
<p>그래서 <strong>git-receive-pack not permitted</strong> 이 부분으로 다시 구글링을 했더니 기적처럼 어제~오늘 <a href="https://okky.kr/article/1023091">새벽에 달린 글들</a>이 있었다.</p>
<p>자세히 읽어보니 2021-08-13부터 깃허브에서 ID/PW가 아닌 <strong>ID/Personal Access Token</strong> 인증 방식을 요구한다는 것이다.</p>
<p><a href="https://curryyou.tistory.com/344">이곳에 첨부된 링크</a>를 타고,</p>
<p>git login&gt; Settings(우상단) &gt; Deveoper Settings &gt; Personal Access Tokens &gt; Generate New Token 으로 접근한 후</p>
<p>Access Token 생성하고</p>
<blockquote>
<p>1) Note: 무슨 용도의 토큰인지 이름을 지어준다.<br>2) Select Scopes: 해당 토큰에 부여할 권한을 선택한다.(나는 레퍼지터리 관리 정도만 할 거라 repo에 체크)
3) Generate Token: 토큰을 생성하는 버튼을 클릭해준다.</p>
</blockquote>
<p>출처: <a href="https://curryyou.tistory.com/344">https://curryyou.tistory.com/344</a> [카레유]</p>
<h4 id="바로-자주-접근-가능한-곳에-저장해놓았다">바로 자주 접근 가능한 곳에 저장해놓았다</h4>
<h3 id="---그-창을-벗어나면-나중에-다시-확인할-수-없다">--&gt; 그 창을 벗어나면 나중에 다시 확인할 수 없다</h3>
<p>이걸 하고나니 바로 푸쉬가 되었다..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[용어 공부하기]]></title>
            <link>https://velog.io/@dhffkvm_718/%EC%9A%A9%EC%96%B4-%EA%B3%B5%EB%B6%80%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dhffkvm_718/%EC%9A%A9%EC%96%B4-%EA%B3%B5%EB%B6%80%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 23 Jul 2021 07:42:53 GMT</pubDate>
            <description><![CDATA[<h3 id="jsp-javaserver-pages--란-무엇인가">JSP (JavaServer Pages ) 란 무엇인가?</h3>
<p>: <strong>HTML 코드에 JAVA 코드를 넣어 동적웹페이지를 생성하는 웹어플리케이션 도구</strong></p>
<p>JSP 가 실행되면 자바 서블릿(Servlet) 으로 변환되며 웹 어플리케이션 서버에서 동작되면서 필요한 기능을 수행하고</p>
<p>그렇게 생성된 데이터를 웹페이지와 함께 클라이언트로 응답한다.</p>
<p>위와 같이 정의만 보고는 어려운 용어가 많이 들어가기 때문에 몇가지 개념을 짚고 넘어 가겠다.</p>
<hr>
<p>웹(web)</p>
<p>웹이란 인터넷 기반의 정보기술로 <strong>World Wide Web</strong> 의 줄임말로 쓰이며 WWW 라고도 한다.</p>
<p>전세계에 거대한 네트워크 망을 통해 정보를 공유하며 정보의 흐름은 양방향성을 가진다.</p>
<hr>
<h4 id="웹어플리케이션web-application">웹어플리케이션(Web Application)</h4>
<p>웹어플리케이션은 웹에서 실행되는 응용프로그램을 뜻하며 인터넷을 통한 은행업무, 인터넷쇼핑, 등등 인터넷에서 하는 여러 서비스를 총칭</p>
<p>하며 사용자가 필요한 요청(Request) 를 하고 서버에서는 이에 해당하는 요청을 수행하고 그리고 요청한 데이터를 응답(Response) 한다.</p>
<ul>
<li><p>웹 어플리케이션이 위와 같이 동작하기 위한 몇가지 구성요소가 있다.</p>
<ul>
<li><p>웹 브라우저(Web Browser) : 클라이언트에서 요청을 하고 전달받은 페이지를 볼수있는 환경을 말한다.  ( 크롬, IE, Safari, Firefox 등.. )</p>
</li>
<li><p>웹 서버(Web Server)  : 클라이언트로 부터 요청받아 서버에 저장된 리소스를 클라이언트 에게 전달한다. 주로 정적컨텐츠롤 담당한다.</p>
</li>
<li><p>웹 어플리케이션 서버 ( Web Application Server ) : 줄여서 was 라고도 부르며 서버단에서 필요한 기능을 수행하고 그결과를 웹서버에게 전달한다.</p>
</li>
<li><p>데이터베이스 : 서비스에 필요한 데이터를 보관, 갱신 등 관리를 한다.</p>
</li>
</ul>
</li>
</ul>
<hr>
<h4 id="자바-서블릿java-servlet">자바 서블릿(Java Servlet)</h4>
<p>서블릿: 웹페이지를 동적으로 생성하기 위해 서버측 프로그램 </p>
<p>이는 자바 언어를 기반으로 만들지며 웹 어플리케이션 서버 ( Web Application Sever ) 위에서 컴파일 되고 동작한다.</p>
<hr>
<h4 id="jsp-와-서블릿">JSP 와 서블릿</h4>
<p>JSP 와 서블릿의 차이점은 결과적으로 하는일은 동일하지만 </p>
<p>JSP 는 HTML 내부에 JAVA 소스코드가 들어감으로 인해 HTML 코드를 작성하기 간편하다는 장점이있으며</p>
<p>서블릿은 자바코드내에 HTML 코드가 있어서 읽고 쓰기가 굉장히 불편하기 때문에 작업의 효율성이 떨어진다.</p>
<p>하지만 웹을 공부할때 JSP 와 서블릿은 함께 배운다 그건 왜 때문일까..</p>
<p>JSP 로 작성된 프로그램은 서버로 요청시 서블릿(Servlet) 파일로 변환되어 JSP 태그를  분해하고 추출하여 다시 순수한 HTML 을 반환한다.</p>
<h6 id="참조-">참조 )</h6>
<h6 id="httpskowikipediaorgwikiec9e90ebb094ec849cebb284_ed8e98ec9db4eca780-httpskowikipediaorgwikiec9e90ebb094_ec849cebb894eba6bf-httpswwwtutorialspointcomjspjsp_architecturehtm"><a href="https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94%EC%84%9C%EB%B2%84_%ED%8E%98%EC%9D%B4%EC%A7%80######">https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94%EC%84%9C%EB%B2%84_%ED%8E%98%EC%9D%B4%EC%A7%80######</a> <a href="https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EC%84%9C%EB%B8%94%EB%A6%BF######">https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EC%84%9C%EB%B8%94%EB%A6%BF######</a> <a href="https://www.tutorialspoint.com/jsp/jsp_architecture.htm">https://www.tutorialspoint.com/jsp/jsp_architecture.htm</a></h6>
<h5 id="출처-httpsjavacprotistorycom43-버물리의-it공부">출처: <a href="https://javacpro.tistory.com/43">https://javacpro.tistory.com/43</a> [버물리의 IT공부]</h5>
]]></description>
        </item>
        <item>
            <title><![CDATA[환경 세팅]]></title>
            <link>https://velog.io/@dhffkvm_718/%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85</link>
            <guid>https://velog.io/@dhffkvm_718/%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85</guid>
            <pubDate>Fri, 23 Jul 2021 06:49:04 GMT</pubDate>
            <description><![CDATA[<p><strong>STS4+Tomcat v 9.0+ 자바 버전 1.8</strong>로 진행한다</p>
<p>프로젝트 종류: Spring legacy project &gt; spring MVC Project 활용</p>
<p>gitignore --&gt; <a href="https://www.toptal.com/developers/gitignore">gitignore을 만들어주는 페이지</a> 이용하면 편리!</p>
<ul>
<li>MANIFEST~</li>
<li>pom.~</li>
<li>config.properties
등등</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터베이스 연결을 위한 세팅]]></title>
            <link>https://velog.io/@dhffkvm_718/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%97%B0%EA%B2%B0%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%84%B8%ED%8C%85</link>
            <guid>https://velog.io/@dhffkvm_718/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%97%B0%EA%B2%B0%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%84%B8%ED%8C%85</guid>
            <pubDate>Fri, 23 Jul 2021 06:43:05 GMT</pubDate>
            <description><![CDATA[<p>spring legacy project 에서 데이터베이스에 연결하기 위해서 세팅해야하는 것들을 정리해보았다</p>
<hr>
<p><strong>수정해야하는 것들</strong></p>
<p>pom.xml
mapper.xml
servlet-context.xml
config.properties --&gt; 생성</p>
<hr>
<h4 id="srcmainresources-안에-mapper-폴더-생성-후-mapperxml-파일-생성">src/main/resources 안에 mapper 폴더 생성 후 mapper.xml 파일 생성</h4>
<ul>
<li><pre><code>&lt;mapper namespace=&quot;CommunityInfo&quot;&gt;

  &lt;select id=&quot;readCommunityInfo&quot; resultType=&quot;com.walab.hgu.DTO.CommunityInfoDTO&quot; parameterType=&quot;hashmap&quot;&gt;
      SELECT * FROM communityInfo;
   &lt;/select&gt;

&lt;/mapper&gt;```
</code></pre></li>
</ul>
<h4 id="pomxml에-필요한-dependency-추가필요하면-자바버전-수정">pom.xml에 필요한 dependency 추가(필요하면 자바버전 수정)</h4>
<ul>
<li>commons-dbcp</li>
<li>mysql-connector-java</li>
<li>spring-jdbc</li>
<li>mybatis</li>
<li>mybatis-spring</li>
<li>-&gt; 위 리스트중 원하는 이름과 함께 maven이라고 구글에 검색해 맨위 링크로 들어간다
<img src="https://images.velog.io/images/dhffkvm_718/post/dd3b6bf0-23d6-4a0e-aab5-9f42a43efa54/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-07-23%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.30.04.png" alt=""></li>
<li>-&gt; 들어가면 여러버전이 있는데, 원하는 버전(보통 최근 중 사람들이 많이 쓴 것) 숫자 부분을 클릭</li>
<li>-&gt; maven 박스에 있는 dependency 복사 후 pom.xml에 붙여 넣는다</li>
</ul>
<h4 id="servlet-contextxml에-bean-추가">servlet-context.xml에 bean 추가</h4>
<ul>
<li><pre><code>&lt;beans:bean id = &quot;dataSource&quot;  class=&quot;org.apache.commons.dbcp.BasicDataSource&quot;&gt;
  &lt;beans:property name = &quot;driverClassName&quot; value=&quot;${spring.datasource.driverClassName}&quot;/&gt;
  &lt;beans:property name=&quot;url&quot; value=&quot;${spring.datasource.url}&quot;/&gt;
      &lt;beans:property name = &quot;username&quot; value=&quot;${spring.datasource.username}&quot;/&gt;
  &lt;beans:property name = &quot;password&quot; value=&quot;${spring.datasource.password}&quot;/&gt;
&lt;/beans:bean&gt;```</code></pre></li>
<li><p>``` 
&lt;beans:bean id=&quot;sqlSessionFactory&quot; class=&quot;org.mybatis.spring.SqlSessionFactoryBean&quot;&gt; 
  &lt;beans:property name=&quot;mapperLocations&quot; value=&quot;classpath<em>:mapper/**/</em>.xml&quot;/&gt;   </p>
<pre><code>  &lt;beans:property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;/&gt;  </code></pre><p></beans:bean> ```</p>
</li>
<li><p>``` 
&lt;beans:bean id=&quot;sqlSessionTemplate&quot; class=&quot;org.mybatis.spring.SqlSessionTemplate&quot;&gt;</p>
<pre><code>  &lt;beans:constructor-arg index=&quot;0&quot; ref=&quot;sqlSessionFactory&quot;/&gt;</code></pre><p>  </beans:bean>```</p>
</li>
<li><pre><code>&lt;context:component-scan base-package=&quot;[요부분은 본인이 정한 기본 페키지 이름 삽입]&quot; /&gt;
  &lt;beans:bean class=&quot;org.springframework.beans.factory.config.PropertyPlaceholderConfigurer&quot;&gt;
      &lt;beans:property name=&quot;location&quot; value=&quot;/WEB-INF/config/config.properties&quot;/&gt;
      &lt;beans:property name=&quot;fileEncoding&quot; value=&quot;UTF-8&quot; /&gt;
&lt;/beans:bean&gt;```
</code></pre></li>
</ul>
<h4 id="configproperties">config.properties</h4>
<p>이 파일은 생성해야하는 것이다.
<img src="https://images.velog.io/images/dhffkvm_718/post/b8905cb5-c0fc-429e-8db8-db98b6520a7e/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-07-23%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.07.04.png" alt="">
이렇게 보통 config라는 폴더를 만들고 그 안에 properties 파일을 만든다</p>
<p>나는 이번에는 src&gt;main&gt;webapp&gt;WEB-INF 에 config 폴더를 만들어 추가했다!
<img src="https://images.velog.io/images/dhffkvm_718/post/98dd7eb0-c277-4e76-82e8-1832d85210ba/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-07-23%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.18.40.png" alt="">
내용은 이렇게 넣고 옆에 디비 정보를 쓰면 된다.</p>
<hr>
<p>아마 일단 이정도.....? 나중에 더 생기거나 까먹은게 있다면 추가해야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Dynamic web Project & Spring legacy Project 차이]]></title>
            <link>https://velog.io/@dhffkvm_718/Dynamic-web-Project-Spring-legacy-Project-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@dhffkvm_718/Dynamic-web-Project-Spring-legacy-Project-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Fri, 23 Jul 2021 03:23:06 GMT</pubDate>
            <description><![CDATA[<p>이번 프로젝트를 하면서 Spring legacy project를 사용하게 되었는데, 이전에 사용했던 Dynamic web project와 어떤 점이 다른지 몰라서 공부하게되었다.</p>
<hr>
<p>단적으로는 이렇게 차이가 있다고 볼 수 있다</p>
<p>Dynamic web Project =&gt; 일반 웹어플리케이션 구조
Spring legacy Project =&gt; 스프링프로젝트 구조(웹 + maven)</p>
<hr>
<p>하지만 이러한 종류만 있는 것이 아니기 때문에 찾으면서 잘 정리되어있던 것도 가져와보았다</p>
<h3 id="web">web</h3>
<ul>
<li><strong>Static Web Project</strong> : JSP와 같은 동적인 페이지가 없는 순수하게 웹 컨텐츠로만 구성되어 있는 웹 컨텐츠를 위한 프로젝트</li>
<li><strong>Dynamic Web Project</strong> : JSP와 같이 동적인 웹페이지를 가지는 웹 애플리케이션 개발 시에 사용하는 프로젝트</li>
<li><strong>Web fragment Project</strong> : 다른 웹 프로젝트에 하나의 라이브러리와 같은 형태로 재사용될 때 유용하다. 해당 프로젝트의 output은 jar파일로 생성되어 다르웹 프로젝트에 추가될 수 있다. web fragment는 하나의 논리적인 웹 애플리케이션의 파티션이라고 볼 수 있다.</li>
</ul>
<h3 id="spring--stsspring-tool-suite--java-project--dynamic-web-project">Spring / STS(Spring Tool Suite) = Java Project + Dynamic Web Project</h3>
<ul>
<li><strong>Spring Starter Project</strong> : Standalone / 웹 환경에 함께 사용하며 Spring Boot기반의 Application </li>
<li><strong>Spring Legacy Project</strong> : 일반적인 Spring Framework  프로젝트, 필요에 따라 Spring Framework의 라이브러리를 내장하여 이용<ul>
<li><strong>&lt;Template 종류 -구조 차이&gt;</strong></li>
<li><strong>Simple Java</strong> : 최상위 패키지없이 기본 Spring 구성 및 Java빌드를 사용하여 간단한 Spring 프로젝트를 작성</li>
<li><strong>Simple Spring Maven</strong> : Spring 라이브러리의 기본 세트를 포함하는 Maven을 사용하여 간단한 Spring 프로젝트를 생성</li>
<li><strong>Simple Spring Web Maven</strong> : MVC 구조 + Maven</li>
<li><strong>Simple Spring Utility Project</strong> : Maven Dependencies에 Spring 관련 jar 설정, 약간의 샘플 포함 <ul>
<li><strong>Spring MVC Project</strong> : 기본적으로 MVC형태로 Maven, 여러가지 라이브러리들이 셋팅되어 생성 , 가장 많이 사용</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>#Spring MVC Project(약 47바이트)가 Simple Spring Web Maven(약 15바이트)에 비해 용량이 2.5배 이상 더 나감</p>
<h5 id="여기를-참고하였습니다"><a href="https://deeds-not-words.tistory.com/entry/%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%A2%85%EB%A5%98%EC%99%80-%EC%B0%A8%EC%9D%B4">여기</a>를 참고하였습니다.</h5>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS objects, HTML DOM, BOM, JS Web API]]></title>
            <link>https://velog.io/@dhffkvm_718/JS-objects-HTML-DOM-BOM-JS-Web-API</link>
            <guid>https://velog.io/@dhffkvm_718/JS-objects-HTML-DOM-BOM-JS-Web-API</guid>
            <pubDate>Thu, 15 Jul 2021 02:03:02 GMT</pubDate>
            <description><![CDATA[<h1 id="js-objects">JS objects</h1>
<p>object 형식</p>
<ul>
<li>name:value</li>
</ul>
<pre><code>const person = {
  firstName : &quot;John&quot;,
  lastName  : &quot;Doe&quot;,
  age     : 50,
  eyeColor  : &quot;blue&quot;
};
//객체 예시</code></pre><p>객체를 사용하는 방법은</p>
<ul>
<li>objectName.property      <ul>
<li>ex) person.age</li>
</ul>
</li>
<li>objectName[&quot;property&quot;]      <ul>
<li>ex) person[&quot;age&quot;]</li>
</ul>
</li>
</ul>
<p>객체안에 또다른 객체가 있을 수 있음</p>
<pre><code>const myObj = {
  name: &quot;John&quot;,
  age: 30,
  cars: [
    {name:&quot;Ford&quot;, &quot;models&quot;:[&quot;Fiesta&quot;, &quot;Focus&quot;, &quot;Mustang&quot;]},
    {name:&quot;BMW&quot;, &quot;models&quot;:[&quot;320&quot;, &quot;X3&quot;, &quot;X5&quot;]},
    {name:&quot;Fiat&quot;, &quot;models&quot;:[&quot;500&quot;, &quot;Panda&quot;]}
  ]
}
</code></pre><p>이러한 객체들에 접근하기 위해서는 반복문을 이용합니다</p>
<pre><code>for (let i in myObj.cars) {
  x += &quot;&lt;h2&gt;&quot; + myObj.cars[i].name + &quot;&lt;/h2&gt;&quot;;
  for (let j in myObj.cars[i].models) {
    x += myObj.cars[i].models[j] + &quot;&lt;br&gt;&quot;;
  }
}
</code></pre><p><strong>자바스크립트도 객체에 관하여 getter와 setter를 만들 수 있습니다.</strong>
<img src="https://images.velog.io/images/dhffkvm_718/post/7cd2d3bc-d01f-4f4d-89eb-056f1f63011b/image.png" alt=""></p>
<hr>
<h1 id="html-dom">HTML DOM</h1>
<p>DOM(Document Object Model)
: XML이나 HTML 문서에 접근하기 위한 일종의 인터페이스</p>
<ul>
<li>이 객체 모델은 문서 내의 모든 요소를 정의</li>
<li>각각의 요소에 접근하는 방법을 제공
<img src="https://images.velog.io/images/dhffkvm_718/post/5d4f07c3-97b7-41e0-9b38-b6f75fa60dfa/image.png" alt=""></li>
<li>-&gt; 자바스크립트는 이런 객체 모델을 사용해서 HTML에 변화를 줄 수 있다.</li>
</ul>
<h3 id="이벤트-버블링-vs-캡쳐링"><strong>이벤트 버블링 vs 캡쳐링</strong></h3>
<p>bubbling / capturing
<strong>버블링</strong>: 한 요소에 이벤트가 발생하면, 이 요소에 할당된 핸들러가 동작하고, 이어서 부모 요소의 핸들러가 동작</p>
<ul>
<li>가장 최상단의 조상 요소를 만날 때까지 이 과정이 반복되면서 요소 각각에 할당된 핸들러가 동작</li>
<li><em>캡쳐링*</em>:이벤트가 최상위 조상에서 시작해 아래로 전파</li>
</ul>
<p>--&gt; addEventListener의 세번째 인자에서 사용됨(true: capturing사용 / false: 버블링 사용)</p>
<p><a href="https://www.w3schools.com/js/js_htmldom_eventlistener.asp">여기</a>에서 예시를 확인하세요!</p>
<p><strong>노드 간 관계를 이용해 내용 추가하기</strong></p>
<pre><code>const para = document.createElement(&quot;p&quot;);
const node = document.createTextNode(&quot;This is new.&quot;);
para.appendChild(node);

const element = document.getElementById(&quot;div1&quot;);
element.appendChild(para);</code></pre><p><strong>appendChild</strong> 는 부모 요소의 가장 마지막 child로 새로운 요소를 집어 넣는다</p>
<p>--&gt; <strong>insertBefore()</strong>를 사용하면 위치 바꿀 수 있음</p>
<ul>
<li>remove와 removeChild, replaceChild도 존재</li>
</ul>
<h4 id="getelementsbytagname">getElementsByTagName()</h4>
<p>는 HTMLCollection 객체를 반환한다.
--&gt; 불려온 태그에 대해 인덱스로 특정 순서의 태그에 접근할 수 있음</p>
<pre><code>const myCollection = document.getElementsByTagName(&quot;p&quot;);
myCollection[1]</code></pre><h4 id="queryselectorall">querySelectorAll()</h4>
<p>는 NodeList 객체를 반환한다
--&gt;인덱스로 접근 가능</p>
<h4 id="htmlcollection-vs-nodelist">HTMLCollection vs NodeList</h4>
<p>두 객체는 굉장히 흡사한 특징을 가지고 있다
But,
HTMLCollection</p>
<ul>
<li>인덱스, name, id로 모두 접근이 가능</li>
</ul>
<p>NodeList</p>
<ul>
<li>인덱스로만 접근이 가능함</li>
<li>배열처럼 보이지만 배열이 아니다!</li>
</ul>
<hr>
<h1 id="browser-object-model-bom">Browser Object Model (BOM)</h1>
<p>: 이 모델은 자바스크립트가 브라우저의 기능적인 요소들을 직접 제어하고 관리할 방법을 제공</p>
<h4 id="window-객체">Window 객체</h4>
<p>:웹 브라우저의 창(window)을 나타내는 객체로, 대부분의 웹 브라우저에서 지원</p>
<pre><code>&#39;자바스크립트의 모든 객체, 전역 함수, 전역 변수들은 자동으로 window 객체의 프로퍼티가 됨

window 객체의 메소드는 전역 함수이며, window 객체의 프로퍼티는 전역 변수가 됨

문서 객체 모델(DOM)의 요소들도 모두 window 객체의 프로퍼티가 됨.&#39;</code></pre><h4 id="screen-객체">Screen 객체</h4>
<p>:사용자의 디스플레이 화면에 대한 다양한 정보를 저장하는 객체</p>
<h4 id="location-객체">Location 객체</h4>
<p>:현재 브라우저에 표시된 HTML 문서의 주소를 얻거나, 브라우저에 새 문서를 불러올 때 사용</p>
<ul>
<li>location 객체의 href 프로퍼티는 현재 문서의 전체 URL 주소를 문자열로 반환<pre><code>document.write(&quot;현재 문서의 주소는 &quot; + location.href + &quot;입니다.&quot;);</code></pre></li>
</ul>
<h4 id="history-객체">History 객체</h4>
<p>:브라우저의 히스토리 정보를 문서와 문서 상태 목록으로 저장하는 객체</p>
<ul>
<li>자바스크립트는 사용자의 개인 정보를 보호하기 위해 이 객체에 접근하는 방법을 일부 제한하고 있습니다.</li>
</ul>
<h4 id="navigator-객체">Navigator 객체</h4>
<p>:브라우저 공급자 및 버전 정보 등을 포함한 브라우저에 대한 다양한 정보를 저장하는 객체</p>
<h4 id="대화-상자dialog-box">대화 상자(dialog box)</h4>
<p>사용자에게 보여줄 수 있는 간단한 대화 상자를 만들기 위한 메소드를 제공</p>
<ol>
<li><p>alert():사용자에게 간단한 메시지를 보여주고, 그에 대한 사용자의 확인을 기다림</p>
</li>
<li><p>confirm(): 사용자에게 간단한 메시지를 보여주고, 사용자가 확인이나 취소를 누르면 그 결과를 불리언 값으로 반환</p>
</li>
<li><p>prompt():사용자에게 간단한 메시지를 보여주고, 사용자가 입력한 문자열을 반환</p>
</li>
</ol>
<hr>
<h1 id="js-web-api">JS Web API</h1>
<h4 id="web-workers-api">Web Workers API</h4>
<p>:Web Worker 는 브라우저의 Main Thread에 영향끼치지 않기 위해서, Main Thread와 별개로 작동되는 Thread를 만들거나 관리한다.
<a href="https://pks2974.medium.com/web-worker-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0-4ec90055aa4d">출처</a>에 예제가 잘 되어있습니다.</p>
<h4 id="javascript-fetch-api">JavaScript Fetch API</h4>
<p><a href="https://ko.javascript.info/fetch">fetch 예시</a></p>
<h4 id="web-geolocation-api">Web Geolocation API</h4>
<p>사용자의 현재 위치를 가져오는 API</p>
<hr>
<h1 id="ajax">AJAX</h1>
<p>AJAX(Asynchronous JavaScript And XML, 비동기적 JavaScript와 XML)
: 웹 페이지 전체를 다시 로딩하지 않고도, 웹 페이지의 일부분만을 갱신할 수 있다.</p>
<h4 id="xmlhttprequest">XMLHttpRequest</h4>
<p>:웹 브라우저가 서버와 데이터를 교환할 때 사용</p>
<pre><code>비동기식(asynchronous) 요청
서버에 비동기식 요청을 보내기 위해서는 open() 메소드의 세 번째 인수로 true를 전달하면 됩니다.

이렇게 서버로 비동기식 요청을 보내면, 자바스크립트는 서버로부터의 응답을 기다리면서 동시에 다른 일을 할 수 있게 됩니다.



만약 open() 메소드의 세 번째 인수로 false를 전달하면, 서버에 동기식 요청을 보내게 됩니다.

이때 자바스크립트는 서버로부터 응답이 도착할 때까지 대기하게 됩니다.

따라서 사용자는 대기하는 동안 다른 어떤 작업도 할 수 없게 됩니다.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[css 속성 object-fit]]></title>
            <link>https://velog.io/@dhffkvm_718/css-%EC%86%8D%EC%84%B1-object-fit</link>
            <guid>https://velog.io/@dhffkvm_718/css-%EC%86%8D%EC%84%B1-object-fit</guid>
            <pubDate>Sun, 11 Jul 2021 06:34:49 GMT</pubDate>
            <description><![CDATA[<p>대체되는 요소의 내용(img, video, object, svg 등과 같은)이 지정된 너비와 높이에 맞게 장착되는 방식을 지정
속성</p>
<ul>
<li>fill: 사진을 자르지 않고 화면을 가득 채운다</li>
<li>contain: 사진을 자르지 않고, 비율을 유지한 채로 화면에 맞게 조절</li>
<li>cover: 사진을 자르기도 하고, 비율은 유지한채로 화면을 채움</li>
<li>none: 크기가 조정되지 않고 원본사이즈로 처리됩니다. 크면 잘리고, 작으면 남음</li>
<li>scale-down : 크기를 아무것도 지정되지 않거나 혹은 contain이 지정되어 있는 것처럼 변경됩니다. 이는 원본 크기보다 작아지는 결과를 보여준다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML tag 정리2]]></title>
            <link>https://velog.io/@dhffkvm_718/HTML-tag-%EC%A0%95%EB%A6%AC2</link>
            <guid>https://velog.io/@dhffkvm_718/HTML-tag-%EC%A0%95%EB%A6%AC2</guid>
            <pubDate>Tue, 06 Jul 2021 16:03:51 GMT</pubDate>
            <description><![CDATA[<p><a href="https://velog.io/@dhffkvm_718/HTML-%ED%83%9C%EA%B7%B8-%EC%A0%95%EB%A6%AC">이전에 정리한 것</a> 외에 새롭게 안 것을 정리해보았습니다~</p>
<p><strong>title</strong>
: 해당 태그가 적용되어 있는 문구에 마우스를 올리면 tooltip처럼 내용이 뜹니다</p>
<pre><code>&lt;p title=&#39;툴팁처럼 뜬다구요&#39;&gt;안녕하세요&lt;/p&gt;</code></pre><blockquote>
<p title='툴팁처럼 뜬다구요'>안녕하세요</p>
</blockquote>
<p><strong>mailto</strong>
:링크에 걸려있는 이메일로 바로 메일을 보낼 수 있도록 함</p>
<pre><code>&lt;p&gt;&lt;a href=&quot;mailto:mailaddress@naver.com&quot;&gt;Send email&lt;/a&gt;&lt;/p&gt;</code></pre><blockquote>
<p><a href="mailto:someone@example.com">Send email</a></p>
</blockquote>
<p><strong>특정 부분으로 건너뛰기</strong></p>
<pre><code>&lt;p&gt;&lt;a href=&quot;#C4&quot;&gt;Jump to Chapter 4&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;C4&quot;&gt;Chapter 4&lt;/h2&gt;</code></pre><blockquote>
<p><a href="#C4">Jump to Chapter 4</a></p>
</blockquote>
<p>저밑에 chapter4가 있어요!</p>
<hr>
<p><strong>map</strong> &amp; <strong>area</strong></p>
<ul>
<li><p>map: 이미지맵(클릭할 수 있는 영역을 지닌 이미지)을 만드는 태그</p>
<ul>
<li>area: 이미지맵에서 영역을 지정
<a href="https://www.w3schools.com/html/html_images_imagemap.asp">여기</a>에서 예제 보기</li>
</ul>
</li>
</ul>
<p><strong>picture</strong>
:img 요소의 다중 이미지 리소스(multiple image resources)를 위한 컨테이너를 정의할 때 사용
--&gt; 주로 반응형 웹을 만들때</p>
<pre><code>&lt;picture&gt;
  &lt;source media=&quot;(min-width: 650px)&quot; srcset=&quot;img_food.jpg&quot;&gt;
  &lt;source media=&quot;(min-width: 465px)&quot; srcset=&quot;img_car.jpg&quot;&gt;
  &lt;img src=&quot;img_girl.jpg&quot;&gt;
&lt;/picture&gt;</code></pre><p>img태그는 가장 마지막에 써야한다 &lt;- <em>호환되지 않는 브라우저나 써놓은 조건에 다 안맞을때를 대비해서</em></p>
<hr>
<p><strong>base</strong>
:기준이 되는 base url/uri를 설정하여 사용</p>
<h5 id="여기서-base-urluri는-링크-주소-등을-만들-경우-특정-값이-자동으로-추가되는-것과-같습니다">여기서 base url/uri는 링크 주소 등을 만들 경우 특정 값이 자동으로 추가되는 것과 같습니다</h5>
<h6 id="base-태그-사용시-주의할-점------base-태그를-적용할-경우-반드시-head-태그-영역-안에-사용하여야하며-또한-중복된-base-태그는-설정할-수-없습니다-즉-하나만-사용가능합니다-일반적으로-head-내부에서도-최상단에-선언-위치합니다">!base 태그 사용시 주의할 점 ---- base 태그를 적용할 경우 반드시 <head> 태그 영역 안에 사용하여야하며 또한 중복된 base 태그는 설정할 수 없습니다. 즉 하나만 사용가능합니다. 일반적으로 head 내부에서도 최상단에 선언, 위치합니다.</h6>
<hr>
<blockquote>
<h2 id="C4">Chapter 4</h2></blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[javax.el.ELException: Cannot convert ]]></title>
            <link>https://velog.io/@dhffkvm_718/javax.el.ELException-Cannot-convert</link>
            <guid>https://velog.io/@dhffkvm_718/javax.el.ELException-Cannot-convert</guid>
            <pubDate>Wed, 03 Feb 2021 05:14:11 GMT</pubDate>
            <description><![CDATA[<pre><code>&lt;c:if test=&#39;${u.fieldType eq &quot;text&quot;}&#39;&gt;</code></pre><p>여기에서 이러한 오류가 떴다.
<strong>javax.el.ELException: Cannot convert [text] of type [class java.lang.String] to [class java.lang.Long]</strong></p>
<pre><code>private char fieldType; </code></pre><p>원인: String인 &#39;text&#39;를 char 과 비교하여 생긴 문제로 추측</p>
<p>해결방법: 
받아오는 type 을 char --&gt; String으로 변경</p>
<pre><code>private String fieldType;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Run on server 가 없다?]]></title>
            <link>https://velog.io/@dhffkvm_718/Run-on-server-%EA%B0%80-%EC%97%86%EB%8B%A4</link>
            <guid>https://velog.io/@dhffkvm_718/Run-on-server-%EA%B0%80-%EC%97%86%EB%8B%A4</guid>
            <pubDate>Wed, 27 Jan 2021 12:51:32 GMT</pubDate>
            <description><![CDATA[<p>STS4에서 프로젝트를 실행해보려고 하는데 run on server가 없는 것이다. 아마도 깃을 pull하는데 자꾸 안되어서 파일 내용을 로컬에 저장하고 지워버린 후, git에서 프로젝트 파일을 다운받아 import시킨 것이 문제였던 것 같다.</p>
<h4 id="해결방법">해결방법</h4>
<ol>
<li><p><strong>프로젝트 우클릭&gt;maven&gt;update project</strong>
 를 하자..! 원래는 2번이 우선이었는데 2번을 한 후 pom.xml에 또 다른 에러가 생겼다. 1번을 먼저 해보는 게 좋은 것 같다.</p>
</li>
<li><p>project property –&gt; project facets –&gt; dynamic web module 과 java가 체크
<img src="https://images.velog.io/images/dhffkvm_718/post/7b897958-910d-4c2e-ba73-52b169c0a102/image.png" alt=""></p>
</li>
</ol>
<p>하면 run on server가 뜬다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring Controller]]></title>
            <link>https://velog.io/@dhffkvm_718/Spring-Controller</link>
            <guid>https://velog.io/@dhffkvm_718/Spring-Controller</guid>
            <pubDate>Wed, 27 Jan 2021 09:29:26 GMT</pubDate>
            <description><![CDATA[<h4 id="controller-method-parameter-type">Controller Method Parameter Type</h4>
<p>컨트롤러 <code>@RequestMapping</code> 어노테이션이 적용된 메서드는 커맨드 클래스 뿐만 아니라, HttpServletRequest, HttpSession, Locale 등 웹 애플리케이션과 관련된 다양한 타입의 파라미터를 가질 수 있습니다.</p>
<p><img src="https://images.velog.io/images/dhffkvm_718/post/698e2b69-f166-4210-95bc-c2d76997d30d/image.png" alt=""></p>
<p><strong>httpServletRequest.getParameter()</strong></p>
<blockquote>
<p>@RequestMapping(&quot;/test&quot;) 
public String test(HttpServletRequest req) {
    String userId = req.getParameter(&quot;userId&quot;);
    return &quot;test&quot;; 
}</p>
</blockquote>
<p>getParameter()는 String 값을 반환합니다.</p>
<p>​
<strong>httpServletRequest.getAttribute()</strong></p>
<blockquote>
<p>@RequestMapping(&quot;/test&quot;) 
public String test(HttpServletRequest req) {
    String userId = req.getAttribute(&quot;userId&quot;);
    return &quot;test&quot;; 
}</p>
</blockquote>
<p>getAttribute()는 getParameter()와 비슷하지만 String 값이 아닌 Object 값을 반환한다는 차이가 있습니다.</p>
<p>​</p>
<p> <strong>@RequestParam</strong></p>
<blockquote>
</blockquote>
<p>@RequestMapping(&quot;/test&quot;, method=RequestMethod.GET)
public String test(@RequestParam(value=&quot;userId&quot;, defaultValue=&quot;ooeunz&quot;) String userId) {
    return &quot;test&quot;; 
}</p>
<p><code>@RequestParam</code>은 query string 방식으로 url을 통해  parameter로 값을 받아옵니다. 갖고있는 속성으로는 value, required, defaultValue가 있습니다.</p>
<p>​</p>
<p><strong>@PathVariable</strong></p>
<blockquote>
</blockquote>
<p>@RequestMapping(&quot;/test/{email}&quot;, method=RequestMethod.GET)
public String test(@PathVariable(&quot;email&quot;) String email) {
    return &quot;test&quot;; 
}</p>
<p><code>@Pathvariable</code> 애노테이션은 RequestMapping에 {email} 이라는 부분에 맵핑됩니다. query string 방식과 path value 방식을 이해하고 있다면 별로 어렵지 않게 사용하실 수 있을거라 생각합니다.</p>
<p>​</p>
<p><strong>@RequestBody</strong></p>
<p>GET방식은 request packet에 http body가 존재하지 않습니다. 따라서 <code>@RequestBody</code>로 받으려면 반드시 POST 방식을 사용해야 합니다. <code>@RequestBody</code>는 JSON이나 XML과 같은 데이터를 받거나 DTO/VO 객체 전체를 받을 경우 사용합니다.</p>
<blockquote>
</blockquote>
<p>@RequestMapping(&quot;/test&quot;)
public String test(@RequestBody Map&lt;String, Obejct&gt; obj) {
    Account account = obj.get(&quot;account&quot;); 
    return &quot;test&quot;; 
}</p>
<p><strong>@ModelAttribute</strong></p>
<p><code>@RequestParam</code>과 비슷한데 1:1로 parameter를 받을 경우엔 @RequestParam을 사용하고 DTO/VO와 같이 객체 전체로 받을 경우 <code>@ModelAttribute</code>로 받을 수 있습니다. 예를들어 form에서 데이터를 받을 경우 form name과 DTO/VO의 변수 명을 같게 해줌으로써 자동으로 데이터를 바인딩할 수 있습니다.</p>
<blockquote>
</blockquote>
<p>@RequestMapping(&quot;/test&quot;)
public String test(@ModelAttribute UserDto user) {<br>    System.out.println(user.getUserId());
    return &quot;test&quot;; 
}</p>
<hr>
<h4 id="controller-method-retuern-type">Controller Method Retuern Type</h4>
<p><img src="https://images.velog.io/images/dhffkvm_718/post/9c8b5006-b5f0-4c35-a0df-90910d3f7d07/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring Framework_JSP]]></title>
            <link>https://velog.io/@dhffkvm_718/Spring-FrameworkJSP</link>
            <guid>https://velog.io/@dhffkvm_718/Spring-FrameworkJSP</guid>
            <pubDate>Tue, 26 Jan 2021 17:25:16 GMT</pubDate>
            <description><![CDATA[<h4 id="spring-framework의-장점">Spring Framework의 장점</h4>
<p>1) 미리 정의된 견본들이 있다.</p>
<p>-Spring framework는 JDBC, Hivernate, JPA 등 견본들을 제공한다. 그렇기 때문에 코드를 길게 작성하지 않아도 된다. 기본적인 단계는 미리 제공을 해주기 때문에 직접적인 코드를 작성하지 않고, 실행되는 부분만 작성하면 된다.</p>
<p>2) 테스트하기가 쉽다.</p>
<p>-Dependency의 추가로 작업을 쉽게 테스트 할 수 있다. 그리고  EJB나 Struts는 서버를 필요로 하지만 Spring framework는 서버를 필요로 하지 않는다.</p>
<p>3) 가볍다.</p>
<hr>
<h4 id="jsp-model-1-vs-model-2-arichitecture">JSP Model 1 vs Model 2 Arichitecture</h4>
<p><strong>Model 1 Architecture</strong>
<img src="https://images.velog.io/images/dhffkvm_718/post/ee0cbc9c-14fb-4763-83b9-e265bca8669e/image.png" alt=""></p>
<ul>
<li><p>브라우저가 JSP 페이지로 요청을 전송</p>
</li>
<li><p>JSP에서 Java Bean에 접근하고 로직을 호출</p>
</li>
<li><p>Java Bean은 Database와 연결하고 데이터를 받거나 저장</p>
</li>
<li><p>JSP에서 생성 된 응답은 브라우저로 전송됨</p>
</li>
</ul>
<p><strong>Model 2 (MVC) Architecture</strong></p>
<p>: MVC를 바탕으로 디자인 된 패턴이다. MVC 디자인 패턴은 model, view 그리고 controller로 구성되어 있다.</p>
<ul>
<li><p>Model: 모델은 애플리케이션의 상태(데이터) 및 비즈니스 논리를 나타냅니다.</p>
</li>
<li><p>View: 뷰 모듈은 데이터 표시를 담당합니다. 즉, 프레젠테이션을 나타냅니다.</p>
</li>
<li><p>Controller: 컨트롤러 모듈은 뷰와 모델 간의 인터페이스 역할을 합니다. 즉, 모델 / 뷰에 대한 입력과 명령을 수신하여 그에 따라 변경합니다.</p>
</li>
</ul>
<p><img src="https://images.velog.io/images/dhffkvm_718/post/6a78cc7d-4cda-4ee3-a59e-773ecbecf071/image.png" alt=""></p>
<hr>
<h4 id="pojo">POJO</h4>
<ul>
<li>POJO란, 특별한 제한에 종속되지 않고, 클래스 패스(class path)를 필요로 하지 않는 일반적인 Java Object를 의미</li>
</ul>
<p>POJO의 특징</p>
<ul>
<li><p>특정 규약에 종속되지 않는다.</p>
</li>
<li><p>특정 환경에 종속되지 않는다.</p>
</li>
<li><p>객체지향원리에 충실해야 한다</p>
</li>
</ul>
<h4 id="ioc">IoC</h4>
<p>: Inversion of Control의 줄임말로 한글로 번역하면 제어의 역전이라는 말이다. &quot;제어의 역전&quot;이라는 의미는 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미</p>
<h4 id="di">DI</h4>
<ul>
<li>DI란 Dependency Injection의 줄임말, 의존성 주입
: 의존적인 객체를 직접 생성하거나 제어하는 것이 아니라,  특정 객체에 필요한 객체를 외부에서 결정해서 연결시키는 것을 의미한다. 즉, 우리는 클래스의 기능을 추상적으로 묶어둔 인터페이스를 갖다 쓰면 되는 것이다. 나머지는 스프링에서 객체를 주입해주기 때문이다. 따라서 이러한 의존성 주입으로 인해 모듈 간의 결합도가 낮아지고 유연성이 높아진다.</li>
</ul>
<h4 id="aop">AOP</h4>
<p>: 관점 지향 프로그래밍
: 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Tomcat port 에러..]]></title>
            <link>https://velog.io/@dhffkvm_718/Tomcat-port-%EC%97%90%EB%9F%AC</link>
            <guid>https://velog.io/@dhffkvm_718/Tomcat-port-%EC%97%90%EB%9F%AC</guid>
            <pubDate>Tue, 26 Jan 2021 14:13:00 GMT</pubDate>
            <description><![CDATA[<p>Tomcat port 에러</p>
<p>port 8080 required by tomcat v9.0 server at localhost is already in use. the server may already be running in another process, or a system process may be using the port. to start this server you will need to stop the other process or change the port number(s).</p>
<p>이게 떠서 찾아보니 내가 하다가 렉이 너무 걸려서 강제종료시켰던 것이 문제였던 것 같다. 남아있는 포트를 지워야했다.</p>
<p>일단 서버가 내렸는데 8080포트가 사용중이라고 나오면 아래 명령어로 찾아볼 수 있다.</p>
<p>터미널에</p>
<p>server 이미 사용중이라고 나올 때</p>
<pre><code>sudo lsof -i:8080</code></pre><p>입력하면 다음과 같은 결과가 나옴</p>
<pre><code>COMMAND   PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
java   [각각다른숫자] yangjihu   39u  IPv6 0xfdc32fa1f1b6a605      0t0  TCP *:http-alt (LISTEN)</code></pre><pre><code>kill [각각다른숫자]</code></pre><p>이때 kill [PID]를 해주면 server가 강제 종료 됨</p>
<p>sudo lsof -i:8080 입력하여 다시 한번 확인</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[STS4에 협업 프로젝트 임포트하는 방법]]></title>
            <link>https://velog.io/@dhffkvm_718/STS4%EC%97%90-%ED%98%91%EC%97%85-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9E%84%ED%8F%AC%ED%8A%B8%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@dhffkvm_718/STS4%EC%97%90-%ED%98%91%EC%97%85-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9E%84%ED%8F%AC%ED%8A%B8%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Mon, 25 Jan 2021 12:51:40 GMT</pubDate>
            <description><![CDATA[<p>인터넷에 다들 찾아보면 기본 깃 개념만 잔뜩 설명해주고, clone하는 방법만 왕창 설명해놔서 멘붕이 왔었다. </p>
<p>remote을 연결하기 위해서 내 로컬에 clone 한다는 건 알겠는데(이게 맞나?),,,</p>
<p>clone해온 프로젝트 파일을 어떻게 해야 그대로 내 창에 옮길 수 있을지 모르겠다니까..?(컴맹의 자신감)
<img src="https://images.velog.io/images/dhffkvm_718/post/073be6ef-85bd-4d05-bb84-7d9a8a34247d/image.png" alt=""></p>
<p>그래서 마구 찾다가 import라고 검색해야하는 걸 깨닫고 <a href="https://atoz-develop.tistory.com/entry/%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4%EC%97%90%EC%84%9C-%EA%B9%83%ED%97%88%EB%B8%8C-%EC%A0%80%EC%9E%A5%EC%86%8C-%EB%B3%B5%EC%A0%9C-%EB%B0%8F-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9E%84%ED%8F%AC%ED%8A%B8%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95">구세주같은 페이지</a>를 만났다.</p>
<hr>
<p>clone을 한 후 git repository 페이지에서 clone한 repository의 working tree를 들어간다.
import하기를 원하는 프로젝트에서 우클릭을 한 후
<img src="https://images.velog.io/images/dhffkvm_718/post/b6453d4c-407c-49cf-9bd9-5eff36c35857/image.png" alt="">
그리고 [import Projects] 클릭</p>
<p>이후 뜨는 창에 finish를 누르면 import되고 자신의 프로젝트 목록창에도 생긴다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파일업로드 기능 구현]]></title>
            <link>https://velog.io/@dhffkvm_718/%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84</link>
            <guid>https://velog.io/@dhffkvm_718/%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84</guid>
            <pubDate>Sun, 24 Jan 2021 14:55:41 GMT</pubDate>
            <description><![CDATA[<p> Database 테이블에 사진을 위한 column 만들기</p>
<p>명령어
: <strong>ALTER TABLE 테이블이름 ADD COLUMN image varchar(40);</strong></p>
<p><em>1. Library에 cos.jar 추가</em></p>
<p><a href="http://www.servlets.com/cos/">cos.jar 파일 다운</a></p>
<ul>
<li>cos.jar파일을 다운로드<ul>
<li>압축해제 후, 폴더에 들어가면 lib폴더안에 있는 cos.jar파일 옮기기
<img src="https://images.velog.io/images/dhffkvm_718/post/c6e27831-75d4-496b-9ae5-052832cd9a6b/image.png" alt=""></li>
</ul>
</li>
<li>pom.xml에 디펜던시로 추가하는 방법</li>
</ul>
<p>아래 사이트에서 Maven용 디펜던시 명령어를 pom.xml에 복붙하면 된다.
<a href="https://mvnrepository.com/artifact/servlets.com/cos/05nov2002">maven 명령어 복사</a></p>
<p><em>2. upload 폴더추가</em></p>
<p><img src="https://images.velog.io/images/dhffkvm_718/post/421c1533-996a-4ebe-a7db-6ea21352e7e6/image.png" alt="">
이제 이 폴더에 실제 업로드된 파일들이 저장된다.</p>
<p><em>3. fileform.jsp 생성</em></p>
<p>파일업로드 기능 구현 코어 코드</p>
<p><strong>fileform.jsp</strong></p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;form method=&#39;post&#39; action=&#39;fileupload.jsp&#39; enctype=&quot;multipart/form-data&quot;&gt;
    제목 : &lt;input type=&quot;text&quot; name=&quot;title&quot; /&gt;&lt;br /&gt;
    이미지 : &lt;input type=&#39;file&#39; name=&#39;photo&#39; /&gt;&lt;br /&gt;
    &lt;input type=&#39;submit&#39; value=&#39;upload&#39; /&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p><em>4. fileupload.jsp 생성</em></p>
<ul>
<li>fileform.jsp와 함께 파일업로드 기능을 위해서 생성해야 하는 파일</li>
</ul>
<p><strong>fileupload.jsp</strong></p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@ page import =&quot;com.myapp.common.*, java.io.File&quot; %&gt;
&lt;%@ page import =&quot;com.oreilly.servlet.*&quot; %&gt;
&lt;%@ page import=&quot;com.oreilly.servlet.multipart.DefaultFileRenamePolicy&quot; %&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;파일 업로드 결과 &lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;% 
    String filename = &quot;&quot;;
    int sizeLimit = 15 * 1024 * 1024;

    //    상대경로를 절대경로로 가져와야 
    String realPath = request.getServletContext().getRealPath(&quot;upload&quot;);
    System.out.println(realPath);

    //upload 폴더가 없는 경우 폴더를 만들기
    File dir = new File(realPath);
    if (!dir.exists()) dir.mkdirs();

    MultipartRequest multpartRequest = null;
    multpartRequest = new MultipartRequest(request, realPath, 
            sizeLimit, &quot;utf-8&quot;,new DefaultFileRenamePolicy());

    String title = multpartRequest.getParameter(&quot;title&quot;);
    filename = multpartRequest.getFilesystemName(&quot;photo&quot;);
%&gt;
제목 : &lt;%=title %&gt;&lt;br /&gt;
파일명 : &lt;%=filename%&gt;&lt;br /&gt;
&lt;img src=&quot;${pageContext.request.contextPath }/upload/&lt;%=filename%&gt;&quot;
&lt;/body&gt;
&lt;/html&gt;
</code></pre><p>나머지 edit, delet도 수정</p>
<hr>
<ul>
<li>request.getServletContext().getRealPath(&quot;upload&quot;);</li>
<li><a href="https://java119.tistory.com/101">[Spring] 절대경로와 상대경로(feat.${pageContext.request.contextPath})</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Heroku관련]]></title>
            <link>https://velog.io/@dhffkvm_718/Heroku%EA%B4%80%EB%A0%A8</link>
            <guid>https://velog.io/@dhffkvm_718/Heroku%EA%B4%80%EB%A0%A8</guid>
            <pubDate>Wed, 20 Jan 2021 12:45:48 GMT</pubDate>
            <description><![CDATA[<h4 id="1-이제-terminal-에서-작업-root-로-가서-heroku-에-로그인">1. 이제 terminal 에서 작업 root 로 가서, heroku 에 로그인.</h4>
<p>$ heroku login</p>
<hr>
<h4 id="2-서비스-앱-생성">2. 서비스 앱 생성.</h4>
<p>$ heroku apps:create &quot;앱이름&quot;</p>
<ul>
<li>삭제할때는 </li>
</ul>
<p>$ heroku apps:delete &quot; 앱이름&quot;</p>
<hr>
<h3 id="3-준비된-소스를-heroku-의-git-에-연결">3. 준비된 소스를 heroku 의 Git 에 연결.</h3>
<p>$ git init</p>
<p>// 빈 git 을 생성.</p>
<p>$ git add 와 git commit 까지.</p>
<p>$ heroku git:remote -a &quot;앱이름&quot;</p>
<p>또는 $ git remote add heroku &quot;heroku 앱에 git 주소&quot;</p>
<hr>
<h4 id="4-소스-upload">4. 소스 upload</h4>
<p>$ git push heroku master // 이때 소스가 올라가고 build도 되는 듯.</p>
<hr>
<h4 id="5-앱-서비스-시작">5. 앱 서비스 시작.</h4>
<p>$ heroku ps:scale web=1 --app &quot;앱이름&quot;</p>
<p>$ heroku open                    // browser 에서 동작 확인.</p>
<p>$ heroku ps:scale web=0              // 서비스 중지.</p>
<p>$ heroku ps                                // 현재 앱 서비스 상태 보기</p>
<p>$ heroku logs --tail // 로그 보기. 문제 발생시.</p>
<p>$ heroku local web // 로컬에서 동작 확인 용.</p>
<hr>
<h4 id="6-git-clone">6. Git clone</h4>
<p>$ heroku git:clone -a &quot;앱이름&quot;            // 앱을 clone 해 올수 있음</p>
<hr>
<h3 id="내가-따르던-일련의-deploy-과정"><em>내가 따르던 일련의 deploy 과정</em></h3>
<pre><code>heroku plugins:install java[enter] // 자바 환경을 위해서
mvn package (프로젝트 폴더내에서)
에러발생시 pom.xml 수정 // web.xml이 없고, 아래 구문이 없으면 에러나기도함
 &lt;plugin&gt;
 &lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;
 &lt;version&gt;2.4&lt;/version&gt;
 &lt;configuration&gt;
 &lt;warSourceDirectory&gt;WebContent&lt;/warSourceDirectory&gt;
 &lt;failOnMissingWebXml&gt;false&lt;/failOnMissingWebXml&gt;
 &lt;/configuration&gt;
&lt;/plugin&gt;

수정 후 maven &gt; update project 할것
</code></pre><p><strong>터미널에서 해당 프로젝트의 target 창에 들어가기</strong>
heroku login
heroku create [app_name]
heroku war:deploy ./target/myapp-1.0.0-BUILD-SNAPSHOT.war system.properties --app [hellospringjs] 
heroku run java -version  --app [app_name] //자바 버전 확인용
heroku open --app[app_name]
자신의 개발환경 java version을 확인하여 Java 1.8이 아닌 경우에는 수업내용을 참고하여 해당 버전(11 또는 14)에 맞는 maven update, system.properties 제작 등의 과정을 진행할 것.
web content 안에 system.properties 라는 파일 생성
<img src="https://images.velog.io/images/dhffkvm_718/post/2d2ea07f-c39f-421f-872c-3fb16b2e2371/image.png" alt="">
그 안에 java.runtime.version=14(자기에게 깔려있는 자바 버전 값) 삽입</p>
<hr>
<p>--&gt; 갑자기 system.properties 파일로 하는 절차를 했는데도 자바 버전이 맞지 않다고 나와서
<img src="https://images.velog.io/images/dhffkvm_718/post/a82baef3-9ecf-408f-9529-50da03b814ff/image.png" alt="">
우클릭&gt;properties&gt;build path
<img src="https://images.velog.io/images/dhffkvm_718/post/61f1d3a0-2353-4e30-bf1b-244d1b171be8/image.png" alt="">
자바 버전은 1.8로 바꿈(오류난 heroku 버전이 1.8이었음-아래 사진)
<img src="https://images.velog.io/images/dhffkvm_718/post/b6a2c66e-de04-436a-a02d-7944b5f96ae3/image.png" alt="">
그리고 엑박 무시하고 다시 maven install 후 deploy 하니 잘 되었음
<img src="https://images.velog.io/images/dhffkvm_718/post/e92b67b8-2c83-463e-99af-0d224a5e6df8/image.png" alt="엑박사진"></p>
<p>deploy후에는 다시
프로젝트 우클릭&gt;maven&gt;project update 로 다시 버전 원상복귀</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JSTL(JSP Standard Tag Library)]]></title>
            <link>https://velog.io/@dhffkvm_718/JSTLJSP-Standard-Tag-Library</link>
            <guid>https://velog.io/@dhffkvm_718/JSTLJSP-Standard-Tag-Library</guid>
            <pubDate>Wed, 20 Jan 2021 06:08:47 GMT</pubDate>
            <description><![CDATA[<h4 id="jstl-jsp-standard-tag-library-이란">JSTL (JSP Standard Tag Library) 이란?</h4>
<ul>
<li>JSP에서 사용되는 반복, 조건, 데이터관리, 데이터베이스 액세스, 시간, 숫자, 날짜, 문자열 가공등을 사용할 수 있는 표준라이브러리이다.</li>
<li>JSTL은 EL(Expression Language)를 사용하여 표현한다.</li>
</ul>
<p>출처: <a href="https://hackersstudy.tistory.com/42">https://hackersstudy.tistory.com/42</a> [공대인들이 직접쓰는 컴퓨터공부방]</p>
<p><strong>JSTL의 이점</strong></p>
<ul>
<li>Fast Development: JSP를 단순화하는 많은 태그 제공</li>
<li>Code Reusability: 다양한 페이지에서 JSTL tag를 사용할 수 있다 </li>
<li>No need to use scriptlet tag</li>
</ul>
<h4 id="jstl-core-tag의-종류">JSTL Core Tag의 종류</h4>
<table>
<thead>
  <tr>
      <th>태그 이름</th>
    <th>설명</th>
  </tr>
</thead>
<tbody>
    <tr>
      <td>c:set /</td>
      <td rowspan='2'> 변수의 선언 및 제거</td>
     </tr>
    <tr>
      <td>c:remove / </td>
     </tr>
    <tr>
      <td>c:out /</td>
      <td>변수의 출력</td>
     </tr>
    <tr>
      <td>c:catch /</td>
      <td>예외 처리</td>
    </tr>
    <tr>
      <td>c:if /</td>
      <td>조건문 (else는 없다) </td>
    </tr>
    <tr>
      <td>c:choose /</td>
      <td rowspan='3'>Switch문과 비슷</td>
    </tr>
    <tr>
      <td>c:when /</td>
    </tr>
    <tr>
      <td>c:otherwise /</td>
    </tr>
    <tr>
      <td>c:forEach /</td>
      <td>반복문 </td>
    </tr>
    <tr>
      <td>c:forTokens /</td>
      <td>구분자로 분할하여 반복문 </td>
    </tr>
    <tr>
      <td>c:url /</td>
      <td>URL 생성 </td>
    </tr>
      <tr>
      <td>c:param /</td>
      <td>파라미터 추가  </td>
    </tr>
    <tr>
      <td>c:import /</td>
      <td>페이지 첨부 </td>
    </tr>
    <tr>
      <td>c:redirect /</td>
      <td>URL 이동</td>
    </tr>
</tbody>
</table>

<h4 id="각-core-tag-설명">각 Core Tag 설명</h4>
<ul>
<li>&lt;c:set /&gt; Tag<ul>
<li>JSP의 setAttribute()와 같은 역할</li>
</ul>
</li>
</ul>
<ul>
<li>&lt;c:remove /&gt; Tag<ul>
<li>JSP의 removeAttribute()와 같은 역할</li>
</ul>
</li>
</ul>
<ul>
<li>&lt;c:out /&gt; Tag<ul>
<li>&#39;&lt;%=...&gt;&#39;와 같다. JSP의 표현식을 대체</li>
</ul>
</li>
</ul>
<ul>
<li>&lt;c:catch /&gt; Tag<ul>
<li>Body에서 실행되는 코드의 예외 처리</li>
</ul>
</li>
</ul>
<ul>
<li>&lt;c:if /&gt; Tag<ul>
<li>조건문</li>
</ul>
</li>
</ul>
<ul>
<li>&lt;c:choose /&gt;, &lt;c:when /&gt;, &lt;c:otherwise /&gt;<ul>
<li>Switch문과 동일, 여러개의 when 태그와 하나의 otherwise 태그를 가진다</li>
<li>&lt;c:if /&gt; 태그에 else가 없으므로 대체식으로도 많이 사용</li>
</ul>
</li>
</ul>
<ul>
<li>&lt;c:forEach /&gt; Tag<ul>
<li>객체 전체에 걸쳐 반복 실행에 사용</li>
</ul>
</li>
</ul>
<ul>
<li>&lt;c:forTokens /&gt; Tag<ul>
<li>문자열을 구분자(delimiter)로 분할</li>
</ul>
</li>
</ul>
<ul>
<li>&lt;c:url /&gt; Tag<ul>
<li>URL의 생성</li>
</ul>
</li>
</ul>
<ul>
<li>&lt;c:param /&gt; Tag<ul>
<li>파라미터 추가</li>
</ul>
</li>
</ul>
<ul>
<li>&lt;c:import /&gt; Tag<ul>
<li>페이지 첨부</li>
</ul>
</li>
</ul>
<ul>
<li>&lt;c:redirect /&gt; Tag<ul>
<li>sendRedirect()와 동일</li>
</ul>
</li>
</ul>
<hr>
<h4 id="jstl-function-tag">JSTL Function Tag</h4>
<p>: 문자열을 처리하는 함수를 제공</p>
<blockquote>
<p>&lt;%@ taglib prefix=&quot;fn&quot; uri=&quot;<a href="http://java.sun.com/jsp/jstl/functions&quot;">http://java.sun.com/jsp/jstl/functions&quot;</a> %&gt;</p>
</blockquote>
<pre><code>ex.

${fn:contains(str, str)}

${fn:split(str, &#39;|&#39;)}</code></pre><ul>
<li>fn:contains(string, sbustring)<ul>
<li>string이 substring을 포함하면 return true 반환</li>
</ul>
</li>
</ul>
<ul>
<li>fn:containsIgnoreCase(string, sbustring)<ul>
<li>대소문자 관계없이 string이 substring을 포함하면 return true 반환</li>
</ul>
</li>
</ul>
<ul>
<li>fn:startsWith(string, prefix)<ul>
<li>string이 prefix로 시작하면 return True</li>
</ul>
</li>
</ul>
<ul>
<li>fn:endsWith(string, suffix)<ul>
<li>string이 suffix로 끝나면 return True</li>
</ul>
</li>
</ul>
<ul>
<li>fn:escapeXml(string)<ul>
<li>stting에 XML과 HTML에서 &lt; &gt;&amp; &#39; &quot; 문자들이 있으면, XML엔티티 코드로 바꿔준뒤 문자열 반환</li>
</ul>
</li>
</ul>
<ul>
<li>fn:indexOf(string, sbustring)<ul>
<li>string에서 substring이 처음으로 나타나는 인덱스 반환</li>
</ul>
</li>
</ul>
<ul>
<li>fn:split(string, separator)<ul>
<li>string내의 문자열 separetor에 따라 나누어서 배열로 구성해서 반환</li>
</ul>
</li>
</ul>
<ul>
<li>fn:join(array, separator)<ul>
<li>array요소들을 separator를 구분자로 하여 연결해서 반환</li>
</ul>
</li>
</ul>
<ul>
<li>fn:length(item)<ul>
<li>item이 배열이나 컬렉션이면 요소의 개수를 문자열이면 문자의 개수를 반환</li>
</ul>
</li>
</ul>
<ul>
<li>fn:replace(string, before, after)<ul>
<li>string내에 있는 before 문자열을 after 문자열로 모두 변경해서 반환</li>
</ul>
</li>
</ul>
<ul>
<li>fn:substring(string, begin, end)<ul>
<li>string에서 begin인덱스에서 시작해서 end인덱스에 끝나는 부분의 문자열 반환</li>
</ul>
</li>
</ul>
<ul>
<li>fn:substringAfter(string, sbustring)<ul>
<li>string에서 substring이 나타나는 이후의 문자열 반환</li>
</ul>
</li>
</ul>
<ul>
<li>fn:substringBefore(string, sbustring)<ul>
<li>string에서 substring이 나타나는 이전의 문자열 반환</li>
</ul>
</li>
</ul>
<ul>
<li>fn:toLowerCase(string)<ul>
<li>string을 모두 소문자로 변경 후 리턴</li>
</ul>
</li>
</ul>
<ul>
<li>fn:toUpperCase(string)<ul>
<li>string을 모두 대문자로 변경 후 리턴</li>
</ul>
</li>
</ul>
<ul>
<li>fn:trim(string)<ul>
<li>string앞뒤의 공백을 모두 제거한 후 반환</li>
</ul>
</li>
</ul>
<p>출처: <a href="https://cofs.tistory.com/262">https://cofs.tistory.com/262</a> [CofS]</p>
<hr>
<h4 id="jstl-formatting-tags">JSTL Formatting tags</h4>
<p>: 숫자, 날짜, 시간을 formatting하는 기능과 국제화, 다국어 지원 기능을 제공</p>
<blockquote>
<p>&lt;%@ taglib uri=&quot;<a href="http://java.sun.com/jsp/jstl/fmt&quot;">http://java.sun.com/jsp/jstl/fmt&quot;</a> prefix=&quot;fmt&quot;  %&gt;</p>
</blockquote>
<ul>
<li>예제<ul>
<li><strong>fmt</strong>:parseNumber</li>
</ul>
</li>
</ul>
<hr>
<h4 id="jstl-xml-tags">JSTL XML tags</h4>
<p>:XML 문서를 처리할 때 필요한 기능을 제공합니다.
XML 출력, 흐름 제어, XML 변환 등의 기능이 있습니다.</p>
<p>&lt;%@ taglib uri=&quot;<a href="http://java.sun.com/jsp/jstl/xml&quot;">http://java.sun.com/jsp/jstl/xml&quot;</a> prefix=&quot;x&quot; %&gt;</p>
<ul>
<li>예제<ul>
<li><strong>x</strong>:out</li>
</ul>
</li>
</ul>
<hr>
<h4 id="jstl-sql-tags">JSTL SQL Tags</h4>
<p>: 데이터베이스의 데이터를 입력/수정/삭제/조회하는 기능을 제공
&lt;%@ taglib uri=&quot;<a href="http://java.sun.com/jsp/jstl/sql&quot;">http://java.sun.com/jsp/jstl/sql&quot;</a> prefix=&quot;sql&quot; %&gt;</p>
<ul>
<li>예제<ul>
<li><strong>sql</strong>:query</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JSP(introduction~ 9 implicit objects)]]></title>
            <link>https://velog.io/@dhffkvm_718/JSPintroduction-9-implicit-objects</link>
            <guid>https://velog.io/@dhffkvm_718/JSPintroduction-9-implicit-objects</guid>
            <pubDate>Wed, 20 Jan 2021 02:12:09 GMT</pubDate>
            <description><![CDATA[<h4 id="jsp-scripting-elements">JSP Scripting Elements</h4>
<ol>
<li>JSP scripting tag
scripting tag는 jsp 내부에 자바 코드를 삽입하는 기능을 제공</li>
</ol>
<p><strong>scripting elements 종류</strong></p>
<ul>
<li><p>scriptlet tag
: jsp에서 자바 소스 코드를 실행하는 데 사용</p>
<blockquote>
</blockquote>
<p>&lt;% 자바 소스 코드; %&gt;</p>
<blockquote>
<p>ex) &lt; % out.print ( &quot;jsp에 오신 것을 환영합니다&quot;); % &gt;</p>
</blockquote>
</li>
<li><p>expression tag
: response의 output stream에 사용 --&gt; out.print()를 사용할 필요가 없음</p>
<ul>
<li>주로 변수 또는 메서드의 값을 인쇄하는 데 사용</li>
<li>주의해야 할 점: <strong>세미콜론(;)을 사용하지 않</strong>는다<blockquote>
<p>  &lt;%=  statement %&gt;
ex) &lt;%= &quot;welcome to jsp&quot; %&gt;</p>
</blockquote>
</li>
</ul>
</li>
<li><p>declaration tag
: declaration tag는 필드나 메소드를 선언하기 위해 사용</p>
<ul>
<li>declaration tag 안에 쓰여진 코드는 자동으로 생성되는 servlet의 service() 메소드 바깥에 위치한다. <strong>--&gt;</strong> 각각의 request 마다 메모리를 차지하지 않는다.<blockquote>
<p>&lt;%!  field or method declaration %&gt;</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="9-implicit-objects">9 Implicit Objects</h3>
<p>9가지의 implicit object들은 모든 jsp 페이지에 접근 가능한 웹 컨테이너에 의해서 생성된다.</p>
<p><strong>1. out</strong>
: 버퍼에 데이터를 쓰기위해서 jsp는 out이라는 implicit object를 제공한다. 이것은 JspWriter의 객체</p>
<blockquote>
<p>ex) &lt;% out.print ( &quot;오늘은 :&quot; + java.util.Calendar.getInstance ().getTime ()); %&gt; </p>
</blockquote>
<p><strong>2. request</strong>
: 웹 컨테이너에 의한 jsp request를 생성하기 위한 HttpServletRequest 타입의 implicit 객체</p>
<ul>
<li><p>parameter, header information, remote address, server name, server port, content type, character encoding 등등과 같은 요청 정보를 얻기 위해 사용된다.</p>
</li>
<li><p>jsp request 범위에서 속성을 set, get, remove하기 위해 사용될 수 있다.</p>
</li>
</ul>
<blockquote>
<p>ex) String name=request.getParameter(&quot;uname&quot;);  </p>
</blockquote>
<p><strong>3. response</strong>
: response는 HttpServletResponse 유형의 implicit 객체</p>
<ul>
<li><p>HttpServletResponse의 인스턴스는 각 jsp 요청에 대해 웹 컨테이너에 의해서 생성된다.</p>
</li>
<li><p>응답을 다른 리소스로 리디렉션, 오류 전송 등과 같은 응답을 추가하거나 조작하는 데에 사용할 수 있다.</p>
</li>
</ul>
<blockquote>
<p>ex) response.sendRedirect ( &quot;<a href="http://www.google.com&quot;">http://www.google.com&quot;</a>); </p>
</blockquote>
<p><strong>4. config</strong>
 : config는 ServletConfig 유형의 implicit 객체</p>
<ul>
<li><p>특정 jsp 페이지에 대한 초기화된 파라미터를 사용할 수 있다.</p>
</li>
<li><p>각각의 jsp 페이지의 웹 컨테이너에 의해 생성된다.</p>
</li>
<li><p>일반적으로, 이 객체는 web.xml 파일의 초기화된 파라미터를 얻어 사용한다.</p>
</li>
</ul>
<blockquote>
<p>ex) String driver=config.getInitParameter(&quot;dname&quot;); </p>
</blockquote>
<p><strong>5. application</strong>
: ServletContext 유형의 implicit 객체</p>
<ul>
<li><p>ServletContext의 인스턴스는 응용 프로그램이나 프로젝트가 서버에 배포될 때 웹 컨테이너에서 한 번만 생성된다.</p>
</li>
<li><p>이 객체는 구성 파일(web.xml)에서 초기화된 매개 변수를 가져오기 위해 사용 가능</p>
</li>
<li><p>응용 프로그램 범위에서 attribute를 get, set하거나 remove하기 위해 사용 가능</p>
</li>
</ul>
<blockquote>
<p>ex) String driver=application.getInitParameter(&quot;dname&quot;);  </p>
</blockquote>
<p><strong>6. session</strong>
: HttpSession 유형의 implicit 객체이다.</p>
<ul>
<li>이 객체를 사용하여 속성을 set, get, remove, 또는 session 정보를 가져올 수 있다.</li>
</ul>
<blockquote>
<p>ex) session.setAttribute(&quot;user&quot;,name);  </p>
</blockquote>
<p><strong>7. pageContext</strong>
: PageContext 타입의 implicit 객체이다.</p>
<ul>
<li>다음의 scope 중 하나에서 속성을 set, get, 또는 remove하기 위해 사용될 수 있다.<ul>
<li>page</li>
<li>request</li>
<li>session</li>
<li>application</li>
</ul>
</li>
</ul>
<blockquote>
<p>ex) pageContext.setAttribute(&quot;user&quot;,name,PageContext.SESSION_SCOPE);<br>    String name=(String)pageContext.getAttribute(&quot;user&quot;,PageContext.SESSION_SCOPE);  </p>
</blockquote>
<p><strong>8. page</strong>
: Object class 타입의 implicit 객체이다.</p>
<ul>
<li><p>자동으로 생성된 servlet 클래스의 참조를 할당 받는다.</p>
</li>
<li><p>log 안에 입력된 메세지는 콘솔 창에서 확인할 수 있다.</p>
<ul>
<li>Object page=this;</li>
</ul>
</li>
</ul>
<blockquote>
<p>ex) &lt;% this.log ( &quot;message&quot;); %&gt;</p>
</blockquote>
<p><strong>9. exception</strong>
: java.lang.Throwable 클래스 유형의 implicit 객체이다.</p>
<ul>
<li><p>예외를 프린트하기 위해 사용된다.</p>
</li>
<li><p>error인 페이지에만 사용된다.</p>
</li>
</ul>
<p>출처: <a href="http://www.javatpoint.com/jsp-tutorial">www.javatpoint.com/jsp-tutorial</a></p>
]]></description>
        </item>
    </channel>
</rss>