<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>001cloudid</title>
    <link>https://001cloudid.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 8 Jun 2026 02:02:11 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>001cloudid</managingEditor>
    <item>
      <title>스프링 웹 프로젝트 15</title>
      <link>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-15</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;검색조건처리를 위한 Criteria 클래스 변경&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;검색항목(type)과 검색 키워드(keyword) 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1736824559976&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.domain;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class Criteria {

	private int pageNum; // 페이지
	private int amount; // 개수
	
	private String type; // 검색 항복
	private String keyword; // 키워드

	public Criteria() {
		this(1,10); // 초기값
	}

	public Criteria(int pageNum, int amount) {
		super();
		this.pageNum = pageNum;
		this.amount = amount;
	}
	
	// 루프를 돌리기 위해서 배열이 필요
	public String[] getTypeArr() {
		return type == null? new String[] {} : type.split(&quot;&quot;);
	}
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardMapper.xml 수정&lt;/p&gt;
&lt;pre id=&quot;code_1736824923044&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(...생략...)
	&amp;lt;select id=&quot;getListWithPaging&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt; &amp;lt;!-- xml에서 부등호처리 &amp;rarr; cdata --&amp;gt;
		&amp;lt;![CDATA[  
		select *
		from (select /*+ index_desc(tbl_board pk_board) */ rownum rn, bno, title, writer, regdate,updateDate 
			  from tbl_board 
			  where 
			  ]]&amp;gt;
			  &amp;lt;foreach collection=&quot;typeArr&quot; item=&quot;type&quot;&amp;gt;
			   &amp;lt;if test=&quot;type == 'T'.toString&quot;&amp;gt;
			   		title like #{keyword}
			   &amp;lt;/if&amp;gt;
			   &amp;lt;if test=&quot;type == 'C'.toString&quot;&amp;gt;
			   		content like #{keyword}
			   &amp;lt;/if&amp;gt;
			   &amp;lt;if test=&quot;type == 'W'.toString&quot;&amp;gt;
			   		writer like #{keyword}
			   &amp;lt;/if&amp;gt;
			  &amp;lt;/foreach&amp;gt;
			  &amp;lt;![CDATA[
			  bno &amp;gt; 0 and rownum &amp;gt; 0 and rownum &amp;lt;= (#{pageNum} * #{amount}))
		where rn &amp;gt; (#{pageNum}-1) * #{amount}
		]]&amp;gt;
	&amp;lt;/select&amp;gt;
(...생략...)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제가 있는 코드지만 되는지만 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardMapperTests&lt;/p&gt;
&lt;pre id=&quot;code_1736825028335&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(...생략...)
	@Test
	public void testSearchPaging() {
		Criteria criteria = new Criteria();
		criteria.setType(&quot;T&quot;);
		criteria.setKeyword(&quot;test&quot;);
		List&amp;lt;BoardVO&amp;gt; list = boardMapper.getListWithPaging(criteria);
		for(int i = 0; i &amp;lt; list.size(); i++) {
			log.info(list);
		}
	}
}&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;1455&quot; data-origin-height=&quot;911&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FQJCa/btsLNau01wN/GkFwpSHWkeLsksQJXsS9Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FQJCa/btsLNau01wN/GkFwpSHWkeLsksQJXsS9Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FQJCa/btsLNau01wN/GkFwpSHWkeLsksQJXsS9Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFQJCa%2FbtsLNau01wN%2FGkFwpSHWkeLsksQJXsS9Xk%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;1455&quot; height=&quot;911&quot; data-origin-width=&quot;1455&quot; data-origin-height=&quot;911&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardMapper 수정&lt;/p&gt;
&lt;pre id=&quot;code_1736825370359&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;getListWithPaging&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt; &amp;lt;!-- xml에서 부등호처리 &amp;rarr; cdata --&amp;gt;
		&amp;lt;![CDATA[  
		select *
		from (select /*+ index_desc(tbl_board pk_board) */ rownum rn, bno, title, writer, regdate,updateDate 
			  from tbl_board 
			  where 
			  ]]&amp;gt;
			  &amp;lt;trim prefix=&quot;(&quot; suffix=&quot;) AND&quot;&amp;gt;
				  &amp;lt;foreach collection=&quot;typeArr&quot; item=&quot;type&quot;&amp;gt;
				   &amp;lt;if test=&quot;type == 'T'.toString&quot;&amp;gt;
				   		title like #{keyword}
				   &amp;lt;/if&amp;gt;
				   &amp;lt;if test=&quot;type == 'C'.toString&quot;&amp;gt;
				   		content like #{keyword}
				   &amp;lt;/if&amp;gt;
				   &amp;lt;if test=&quot;type == 'W'.toString&quot;&amp;gt;
				   		writer like #{keyword}
				   &amp;lt;/if&amp;gt;
				  &amp;lt;/foreach&amp;gt;
			  &amp;lt;/trim&amp;gt;
			  &amp;lt;![CDATA[
			  bno &amp;gt; 0 and rownum &amp;gt; 0 and rownum &amp;lt;= (#{pageNum} * #{amount}))
		where rn &amp;gt; (#{pageNum}-1) * #{amount}
		]]&amp;gt;
	&amp;lt;/select&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;1459&quot; data-origin-height=&quot;909&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HqLQY/btsLMJSntcG/n2XrOJv8K3N8lxWwU2l3x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HqLQY/btsLMJSntcG/n2XrOJv8K3N8lxWwU2l3x1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HqLQY/btsLMJSntcG/n2XrOJv8K3N8lxWwU2l3x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHqLQY%2FbtsLMJSntcG%2Fn2XrOJv8K3N8lxWwU2l3x1%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;1459&quot; height=&quot;909&quot; data-origin-width=&quot;1459&quot; data-origin-height=&quot;909&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 조건을 다양하게 테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BordMapperTests&lt;/p&gt;
&lt;pre id=&quot;code_1736825870294&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@Test
	public void testSearchPaging() {
		Criteria criteria = new Criteria();
//		criteria.setType(&quot;T&quot;);
//		criteria.setKeyword(&quot;테스트&quot;);
		List&amp;lt;BoardVO&amp;gt; list = boardMapper.getListWithPaging(criteria);
		for(int i = 0; i &amp;lt; list.size(); i++) {
			log.info(list);
		}
	}&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;1457&quot; data-origin-height=&quot;909&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M7Xoa/btsLLsYbD4m/ceVOymwkq7VfXyVU4DpjR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M7Xoa/btsLLsYbD4m/ceVOymwkq7VfXyVU4DpjR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M7Xoa/btsLLsYbD4m/ceVOymwkq7VfXyVU4DpjR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM7Xoa%2FbtsLLsYbD4m%2FceVOymwkq7VfXyVU4DpjR1%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;1457&quot; height=&quot;909&quot; data-origin-width=&quot;1457&quot; data-origin-height=&quot;909&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;/p&gt;
&lt;pre id=&quot;code_1736826045354&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@Test
	public void testSearchPaging() {
		Criteria criteria = new Criteria();
		criteria.setType(&quot;TCW&quot;);
		criteria.setKeyword(&quot;테스트&quot;);
		List&amp;lt;BoardVO&amp;gt; list = boardMapper.getListWithPaging(criteria);
		for(int i = 0; i &amp;lt; list.size(); i++) {
			log.info(list);
		}
	}&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;1459&quot; data-origin-height=&quot;908&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rT1Tq/btsLLUG4qdq/keIjtRDl78Xx77ptXph3bK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rT1Tq/btsLLUG4qdq/keIjtRDl78Xx77ptXph3bK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rT1Tq/btsLLUG4qdq/keIjtRDl78Xx77ptXph3bK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrT1Tq%2FbtsLLUG4qdq%2FkeIjtRDl78Xx77ptXph3bK%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;1459&quot; height=&quot;908&quot; data-origin-width=&quot;1459&quot; data-origin-height=&quot;908&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;BoardMapper 수정(separator)&lt;/p&gt;
&lt;pre id=&quot;code_1736826129818&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;getListWithPaging&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt; &amp;lt;!-- xml에서 부등호처리 &amp;rarr; cdata --&amp;gt;
		&amp;lt;![CDATA[  
		select *
		from (select /*+ index_desc(tbl_board pk_board) */ rownum rn, bno, title, writer, regdate,updateDate 
			  from tbl_board 
			  where 
			  ]]&amp;gt;
			  &amp;lt;trim prefix=&quot;(&quot; suffix=&quot;) AND&quot;&amp;gt;
				  &amp;lt;foreach collection=&quot;typeArr&quot; item=&quot;type&quot; separator=&quot;OR&quot;&amp;gt;
				   &amp;lt;if test=&quot;type == 'T'.toString&quot;&amp;gt;
				   		title like #{keyword}
				   &amp;lt;/if&amp;gt;
				   &amp;lt;if test=&quot;type == 'C'.toString&quot;&amp;gt;
				   		content like #{keyword}
				   &amp;lt;/if&amp;gt;
				   &amp;lt;if test=&quot;type == 'W'.toString&quot;&amp;gt;
				   		writer like #{keyword}
				   &amp;lt;/if&amp;gt;
				  &amp;lt;/foreach&amp;gt;
			  &amp;lt;/trim&amp;gt;
			  &amp;lt;![CDATA[
			  bno &amp;gt; 0 and rownum &amp;gt; 0 and rownum &amp;lt;= (#{pageNum} * #{amount}))
		where rn &amp;gt; (#{pageNum}-1) * #{amount}
		]]&amp;gt;
	&amp;lt;/select&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;1460&quot; data-origin-height=&quot;911&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8A3w2/btsLK44vTOg/3UD5OWHF59SqeJ5bLUxKnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8A3w2/btsLK44vTOg/3UD5OWHF59SqeJ5bLUxKnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8A3w2/btsLK44vTOg/3UD5OWHF59SqeJ5bLUxKnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8A3w2%2FbtsLK44vTOg%2F3UD5OWHF59SqeJ5bLUxKnK%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;1460&quot; height=&quot;911&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;911&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;like 처리&lt;/p&gt;
&lt;pre id=&quot;code_1736826250054&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;getListWithPaging&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt; &amp;lt;!-- xml에서 부등호처리 &amp;rarr; cdata --&amp;gt;
		&amp;lt;![CDATA[  
		select *
		from (select /*+ index_desc(tbl_board pk_board) */ rownum rn, bno, title, writer, regdate,updateDate 
			  from tbl_board 
			  where 
			  ]]&amp;gt;
			  &amp;lt;trim prefix=&quot;(&quot; suffix=&quot;) AND&quot;&amp;gt;
				  &amp;lt;foreach collection=&quot;typeArr&quot; item=&quot;type&quot; separator=&quot;OR&quot;&amp;gt;
				   &amp;lt;if test=&quot;type == 'T'.toString&quot;&amp;gt;
				   		title like '%'||#{keyword}||'%'
				   &amp;lt;/if&amp;gt;
				   &amp;lt;if test=&quot;type == 'C'.toString&quot;&amp;gt;
				   		content like '%'||#{keyword}||'%'
				   &amp;lt;/if&amp;gt;
				   &amp;lt;if test=&quot;type == 'W'.toString&quot;&amp;gt;
				   		writer like '%'||#{keyword}||'%'
				   &amp;lt;/if&amp;gt;
				  &amp;lt;/foreach&amp;gt;
			  &amp;lt;/trim&amp;gt;
			  &amp;lt;![CDATA[
			  bno &amp;gt; 0 and rownum &amp;gt; 0 and rownum &amp;lt;= (#{pageNum} * #{amount}))
		where rn &amp;gt; (#{pageNum}-1) * #{amount}
		]]&amp;gt;
	&amp;lt;/select&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oTmOU/btsLMDEsTxC/390t10CDW1kLRLlL5Barr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oTmOU/btsLMDEsTxC/390t10CDW1kLRLlL5Barr0/img.png&quot; data-origin-width=&quot;1459&quot; data-origin-height=&quot;910&quot; data-is-animation=&quot;false&quot; style=&quot;width: 35.0427%; margin-right: 10px;&quot; data-widthpercent=&quot;35.45&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oTmOU/btsLMDEsTxC/390t10CDW1kLRLlL5Barr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoTmOU%2FbtsLMDEsTxC%2F390t10CDW1kLRLlL5Barr0%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;1459&quot; height=&quot;910&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGb2Ol/btsLLtvXmmi/FdCkYCT5e8rIPZOimVmk3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGb2Ol/btsLLtvXmmi/FdCkYCT5e8rIPZOimVmk3K/img.png&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;357&quot; data-is-animation=&quot;false&quot; style=&quot;width: 63.7945%;&quot; data-widthpercent=&quot;64.55&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGb2Ol/btsLLtvXmmi/FdCkYCT5e8rIPZOimVmk3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGb2Ol%2FbtsLLtvXmmi%2FFdCkYCT5e8rIPZOimVmk3K%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;1042&quot; height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;/div&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EBc3q/btsLLOzX4VA/dDp8BZR8kPVUZDg7j8Q8Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EBc3q/btsLLOzX4VA/dDp8BZR8kPVUZDg7j8Q8Z0/img.png&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;917&quot; data-is-animation=&quot;false&quot; style=&quot;width: 27.6234%; margin-right: 10px;&quot; data-widthpercent=&quot;27.95&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EBc3q/btsLLOzX4VA/dDp8BZR8kPVUZDg7j8Q8Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEBc3q%2FbtsLLOzX4VA%2FdDp8BZR8kPVUZDg7j8Q8Z0%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;1466&quot; height=&quot;917&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxlgGi/btsLL5BlADU/sX39n6thWOqmTlKGo38t6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxlgGi/btsLL5BlADU/sX39n6thWOqmTlKGo38t6K/img.png&quot; data-origin-width=&quot;1459&quot; data-origin-height=&quot;354&quot; data-is-animation=&quot;false&quot; style=&quot;width: 71.2138%;&quot; data-widthpercent=&quot;72.05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxlgGi/btsLL5BlADU/sX39n6thWOqmTlKGo38t6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxlgGi%2FbtsLL5BlADU%2FsX39n6thWOqmTlKGo38t6K%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;1459&quot; height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/div&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;rarr; totalcount도 변경되기 때문에 처리해줘야함 &amp;rarr; 그렇지 않으면 화면에서 처리가 안됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sql 태그는 jsp:include와 같이 사용할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardMapper.xml 수정&lt;/p&gt;
&lt;pre id=&quot;code_1736827037610&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
	PUBLIC &quot;-//mybatis.org/DTD Mapper 3.0//EN&quot;
	&quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;

&amp;lt;mapper namespace=&quot;org.zerock.mapper.BoardMapper&quot;&amp;gt;

&amp;lt;sql id=&quot;criteria&quot;&amp;gt;
			  &amp;lt;trim prefix=&quot;(&quot; suffix=&quot;) AND&quot;&amp;gt;
				  &amp;lt;foreach collection=&quot;typeArr&quot; item=&quot;type&quot; separator=&quot;OR&quot;&amp;gt;
				   &amp;lt;if test=&quot;type == 'T'.toString&quot;&amp;gt;
				   		title like '%'||#{keyword}||'%'
				   &amp;lt;/if&amp;gt;
				   &amp;lt;if test=&quot;type == 'C'.toString&quot;&amp;gt;
				   		content like '%'||#{keyword}||'%'
				   &amp;lt;/if&amp;gt;
				   &amp;lt;if test=&quot;type == 'W'.toString&quot;&amp;gt;
				   		writer like '%'||#{keyword}||'%'
				   &amp;lt;/if&amp;gt;
				  &amp;lt;/foreach&amp;gt;
			  &amp;lt;/trim&amp;gt;
&amp;lt;/sql&amp;gt;

	&amp;lt;select id=&quot;getList&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt;
		select * from tbl_board order by bno desc		
	&amp;lt;/select&amp;gt;

	&amp;lt;insert id=&quot;insert&quot;&amp;gt;
		insert into tbl_board(bno, title, content, writer)
		values(seq_board.nextval, #{title}, #{content}, #{writer})
	&amp;lt;/insert&amp;gt;

	&amp;lt;insert id=&quot;insertSelectKey&quot;&amp;gt;
		&amp;lt;selectKey order=&quot;BEFORE&quot; keyProperty=&quot;bno&quot; resultType=&quot;long&quot;&amp;gt;
			select seq_board.nextval from dual
		&amp;lt;/selectKey&amp;gt;
		insert into tbl_board(bno, title, content, writer)
		values(#{bno}, #{title}, #{content}, #{writer})
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;select id=&quot;read&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt;
		select * from tbl_board
		where bno = #{bno}
		order by bno desc
	&amp;lt;/select&amp;gt;
	
	&amp;lt;delete id=&quot;delete&quot;&amp;gt;
		delete from tbl_board
		where bno=#{bno}
	&amp;lt;/delete&amp;gt;
	
	&amp;lt;update id=&quot;update&quot;&amp;gt;
		update tbl_board
		set title = #{title}, content = #{content}, writer = #{writer}, updateDate = sysdate
		where bno = #{bno} 
	&amp;lt;/update&amp;gt;
	
	&amp;lt;select id=&quot;getListWithPaging&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt; &amp;lt;!-- xml에서 부등호처리 &amp;rarr; cdata --&amp;gt;
		&amp;lt;![CDATA[  
		select *
		from (select /*+ index_desc(tbl_board pk_board) */ rownum rn, bno, title, writer, regdate,updateDate 
			  from tbl_board 
			  where 
			  ]]&amp;gt;
		&amp;lt;include refid=&quot;criteria&quot;&amp;gt;&amp;lt;/include&amp;gt;
			  &amp;lt;![CDATA[
			  bno &amp;gt; 0 and rownum &amp;gt; 0 and rownum &amp;lt;= (#{pageNum} * #{amount}))
		where rn &amp;gt; (#{pageNum}-1) * #{amount}
		]]&amp;gt;
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;getTotalCount&quot; resultType=&quot;int&quot;&amp;gt;
		select count(bno) from tbl_board where &amp;lt;include refid=&quot;criteria&quot;&amp;gt;&amp;lt;/include&amp;gt; bno &amp;gt; 0
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;searchTest&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt;
		&amp;lt;![CDATA[
		select * from tbl_board
		where
		]]&amp;gt;
		&amp;lt;trim suffix=&quot;and&quot;&amp;gt;
		&amp;lt;foreach collection=&quot;map&quot; index=&quot;key&quot; item=&quot;value&quot; separator=&quot;OR&quot; open=&quot;(&quot; close=&quot;)&quot;&amp;gt;
			&amp;lt;if test=&quot;key == 'T'.toString()&quot;&amp;gt;
				title like #{value}
			&amp;lt;/if&amp;gt;
			&amp;lt;if test=&quot;key == 'C'.toString()&quot;&amp;gt;
				content like #{value}
			&amp;lt;/if&amp;gt;
			&amp;lt;if test=&quot;key == 'W'.toString()&quot;&amp;gt;
				writer like #{value}
			&amp;lt;/if&amp;gt;
		&amp;lt;/foreach&amp;gt;
		&amp;lt;/trim&amp;gt;
		&amp;lt;![CDATA[
			rownum &amp;lt; 10
		]]&amp;gt;
	&amp;lt;/select&amp;gt;
	
&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;화면에서의 검색처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list.jsp 검색상자 및 버튼 등 생성&lt;/p&gt;
&lt;pre id=&quot;code_1736827516952&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Tables&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            DataTables Advanced Tables
                            &amp;lt;button id=&quot;regBtn&quot; type=&quot;button&quot; class=&quot;btn btn-xs pull-right&quot;&amp;gt;Register New Board&amp;lt;/button&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
                            &amp;lt;table width=&quot;100%&quot; class=&quot;table table-striped table-bordered table-hover&quot;&amp;gt;
                                &amp;lt;thead&amp;gt;
                                    &amp;lt;tr&amp;gt;
                                        &amp;lt;th&amp;gt;#번호&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;수정일&amp;lt;/th&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/thead&amp;gt;
                                &amp;lt;tbody&amp;gt;
                                &amp;lt;c:forEach items=&quot;${list}&quot; var=&quot;boardVO&quot;&amp;gt;
                                    &amp;lt;tr class=&quot;odd gradeX&quot;&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.bno}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;a class=&quot;move&quot; href=&quot;&amp;lt;c:out value='${boardVO.bno}' /&amp;gt;&quot;&amp;gt;&amp;lt;c:out value=&quot;${boardVO.title}&quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.writer}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.regdate }&quot; pattern=&quot;yyyy-MM-dd&quot;/&amp;gt; &amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.updateDate }&quot; pattern=&quot;yyyy-MM-dd&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/c:forEach&amp;gt;
                                &amp;lt;/tbody&amp;gt;
                            &amp;lt;/table&amp;gt;
                            &amp;lt;!-- /.table-responsive --&amp;gt;
                            
                            &amp;lt;form id=&quot;searchForm&quot; action=&quot;/board/list&quot; method=&quot;get&quot;&amp;gt;
                            	&amp;lt;select name=&quot;type&quot;&amp;gt;
                            		&amp;lt;option value=&quot;T&quot;&amp;gt;제목&amp;lt;/option&amp;gt;
                            	&amp;lt;/select&amp;gt;
                            	&amp;lt;input type=&quot;text&quot; name=&quot;keyword&quot;&amp;gt;
                            	&amp;lt;button class=&quot;btn btn-default&quot;&amp;gt;Search&amp;lt;/button&amp;gt;
                            &amp;lt;/form&amp;gt;
                            
                            &amp;lt;div class=&quot;pull-right&quot;&amp;gt;
                            	&amp;lt;ul class=&quot;pagination&quot;&amp;gt;
                            		&amp;lt;c:if test=&quot;${page.prev}&quot;&amp;gt; 
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${page.startPage - 1}&quot; tabindex=&quot;-1&quot;&amp;gt;Previous&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:if&amp;gt;
									&amp;lt;c:forEach begin=&quot;${page.startPage}&quot; end=&quot;${page.endPage}&quot; var=&quot;num&quot;&amp;gt;
										&amp;lt;li class=&quot;page-item ${page.criteria.pageNum == num? 'active' :''}&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${num}&quot;&amp;gt;${num}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:forEach&amp;gt;                
									&amp;lt;c:if test=&quot;${page.next}&quot;&amp;gt;            	
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${page.endPage + 1}&quot;&amp;gt;Next&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                            		&amp;lt;/c:if&amp;gt;
                            	&amp;lt;/ul&amp;gt;
                            &amp;lt;/div&amp;gt;
                            &amp;lt;form id=&quot;actionForm&quot; action=&quot;/board/list&quot; method=&quot;get&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;pageNum&quot; value=&quot;${page.criteria.pageNum}&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;${page.criteria.amount}&quot;&amp;gt;
                            &amp;lt;/form&amp;gt;
                            
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;

&amp;lt;div id=&quot;myModal&quot; class=&quot;modal&quot; tabindex=&quot;-1&quot; role=&quot;dialog&quot;&amp;gt;
  &amp;lt;div class=&quot;modal-dialog&quot; role=&quot;document&quot;&amp;gt;
    &amp;lt;div class=&quot;modal-content&quot;&amp;gt;
      &amp;lt;div class=&quot;modal-header&quot;&amp;gt;
        &amp;lt;h5 class=&quot;modal-title&quot;&amp;gt;Modal title&amp;lt;/h5&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;modal&quot; aria-label=&quot;Close&quot;&amp;gt;
          &amp;lt;span aria-hidden=&quot;true&quot;&amp;gt;&amp;amp;times;&amp;lt;/span&amp;gt;
        &amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-body&quot;&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-footer&quot;&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-primary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Save changes&amp;lt;/button&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-secondary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Close&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
$(document).ready(function(){
	var result = '&amp;lt;c:out value=&quot;${result}&quot;/&amp;gt;';
	
	
	checkModal(result);
	
	history.replaceState({},null,null); // 히스토리 클리어
	
	function checkModal(result){
		
		if(result ==='' || history.state){
			return;
		}
		
		if(result === 'success'){
			$('.modal-body').html(&quot;정상적으로 처리됨.&quot;);
		} else if(parseInt(result)&amp;gt;0){
			$('.modal-body').html(&quot;게시글 &quot; + parseInt(result) + &quot; 번이 등록됨.&quot;);
		}
		
		$(&quot;#myModal&quot;).modal(&quot;show&quot;);
	}
	
	$(&quot;#regBtn&quot;).click(function(){
		self.location = &quot;/board/register&quot;;
	});
	
	var actionForm = $(&quot;#actionForm&quot;);
	
	$(&quot;.page-link&quot;).on(&quot;click&quot;, function(e){
		e.preventDefault(); // a태그는 기능은 이동 &amp;rarr; 이동이 되지 않음(기본 동작 제어)
		
		console.log('click');
		
		//form 태그의 내용 변경 후 submit
		actionForm.find(&quot;input[name='pageNum']&quot;).val($(this).attr(&quot;href&quot;));
		actionForm.submit();
		
	});
	
	$(&quot;.move&quot;).on(&quot;click&quot;, function(e){
		e.preventDefault();
		
		console.log($(this).attr(&quot;href&quot;));
		
		actionForm.append(&quot;&amp;lt;input type='hidden' name='bno' value='&quot;+$(this).attr(&quot;href&quot;)+&quot;'&amp;gt;&quot;);
		actionForm.attr(&quot;action&quot;,&quot;/board/get&quot;).submit();
		
	})
	
});
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&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;1341&quot; data-origin-height=&quot;839&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4t3Pp/btsLM4IC1hO/dnOaTol8S1k6iAGPHWVps0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4t3Pp/btsLM4IC1hO/dnOaTol8S1k6iAGPHWVps0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4t3Pp/btsLM4IC1hO/dnOaTol8S1k6iAGPHWVps0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4t3Pp%2FbtsLM4IC1hO%2FdnOaTol8S1k6iAGPHWVps0%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;1341&quot; height=&quot;839&quot; data-origin-width=&quot;1341&quot; data-origin-height=&quot;839&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색을 할 때 pageNum, amount를 가져가야함&lt;/p&gt;
&lt;pre id=&quot;code_1736827771367&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(...생략...)
                            &amp;lt;div class=&quot;pull-right&quot;&amp;gt;
                            	&amp;lt;ul class=&quot;pagination&quot;&amp;gt;
                            		&amp;lt;c:if test=&quot;${page.prev}&quot;&amp;gt; 
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${page.startPage - 1}&quot; tabindex=&quot;-1&quot;&amp;gt;Previous&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:if&amp;gt;
									&amp;lt;c:forEach begin=&quot;${page.startPage}&quot; end=&quot;${page.endPage}&quot; var=&quot;num&quot;&amp;gt;
										&amp;lt;li class=&quot;page-item ${page.criteria.pageNum == num? 'active' :''}&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${num}&quot;&amp;gt;${num}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:forEach&amp;gt;                
									&amp;lt;c:if test=&quot;${page.next}&quot;&amp;gt;            	
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${page.endPage + 1}&quot;&amp;gt;Next&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                            		&amp;lt;/c:if&amp;gt;
                            	&amp;lt;/ul&amp;gt;
                            &amp;lt;/div&amp;gt;
                            &amp;lt;form id=&quot;actionForm&quot; action=&quot;/board/list&quot; method=&quot;get&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;pageNum&quot; value=&quot;${page.criteria.pageNum}&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;${page.criteria.amount}&quot;&amp;gt;
                            &amp;lt;/form&amp;gt;
                            
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;

(...생략...)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 검색해보면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1332&quot; data-origin-height=&quot;840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tdg4W/btsLLT9kT6q/fk4tFh9OQm4R9X0b4pPww1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tdg4W/btsLLT9kT6q/fk4tFh9OQm4R9X0b4pPww1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tdg4W/btsLLT9kT6q/fk4tFh9OQm4R9X0b4pPww1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTdg4W%2FbtsLLT9kT6q%2Ffk4tFh9OQm4R9X0b4pPww1%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;1332&quot; height=&quot;840&quot; data-origin-width=&quot;1332&quot; data-origin-height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트처리&lt;/p&gt;
&lt;pre id=&quot;code_1736828060929&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(...생략...)
                            &amp;lt;form id=&quot;searchForm&quot; action=&quot;/board/list&quot; method=&quot;get&quot;&amp;gt;
                            	&amp;lt;select name=&quot;type&quot;&amp;gt;
                            		&amp;lt;option value=&quot;T&quot;&amp;gt;제목&amp;lt;/option&amp;gt;
                            	&amp;lt;/select&amp;gt;
                            	&amp;lt;input type=&quot;text&quot; name=&quot;keyword&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;pageNum&quot; value=&quot;${page.criteria.pageNum}&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;${page.criteria.amount}&quot;&amp;gt;
                            	&amp;lt;button class=&quot;btn btn-default&quot;&amp;gt;Search&amp;lt;/button&amp;gt;
                            &amp;lt;/form&amp;gt;
                            
                            &amp;lt;div class=&quot;pull-right&quot;&amp;gt;
                            	&amp;lt;ul class=&quot;pagination&quot;&amp;gt;
                            		&amp;lt;c:if test=&quot;${page.prev}&quot;&amp;gt; 
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${page.startPage - 1}&quot; tabindex=&quot;-1&quot;&amp;gt;Previous&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:if&amp;gt;
									&amp;lt;c:forEach begin=&quot;${page.startPage}&quot; end=&quot;${page.endPage}&quot; var=&quot;num&quot;&amp;gt;
										&amp;lt;li class=&quot;page-item ${page.criteria.pageNum == num? 'active' :''}&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${num}&quot;&amp;gt;${num}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:forEach&amp;gt;                
									&amp;lt;c:if test=&quot;${page.next}&quot;&amp;gt;            	
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${page.endPage + 1}&quot;&amp;gt;Next&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                            		&amp;lt;/c:if&amp;gt;
                            	&amp;lt;/ul&amp;gt;
                            &amp;lt;/div&amp;gt;
                            &amp;lt;form id=&quot;actionForm&quot; action=&quot;/board/list&quot; method=&quot;get&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;pageNum&quot; value=&quot;${page.criteria.pageNum}&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;${page.criteria.amount}&quot;&amp;gt;
                            &amp;lt;/form&amp;gt;
                            
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;

&amp;lt;div id=&quot;myModal&quot; class=&quot;modal&quot; tabindex=&quot;-1&quot; role=&quot;dialog&quot;&amp;gt;
  &amp;lt;div class=&quot;modal-dialog&quot; role=&quot;document&quot;&amp;gt;
    &amp;lt;div class=&quot;modal-content&quot;&amp;gt;
      &amp;lt;div class=&quot;modal-header&quot;&amp;gt;
        &amp;lt;h5 class=&quot;modal-title&quot;&amp;gt;Modal title&amp;lt;/h5&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;modal&quot; aria-label=&quot;Close&quot;&amp;gt;
          &amp;lt;span aria-hidden=&quot;true&quot;&amp;gt;&amp;amp;times;&amp;lt;/span&amp;gt;
        &amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-body&quot;&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-footer&quot;&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-primary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Save changes&amp;lt;/button&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-secondary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Close&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
$(document).ready(function(){

(...생략...)
	
	var searchForm = $(&quot;#searchForm&quot;);
	
	$(&quot;#searchForm button&quot;).on(&quot;click&quot;, function(e){
		e.preventDefault();
		console.log(&quot;클릭........&quot;);
	})
	
});
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&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;1333&quot; data-origin-height=&quot;788&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbwIaK/btsLMsi8VOg/LQrrmivshPRKg78vCkGGm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbwIaK/btsLMsi8VOg/LQrrmivshPRKg78vCkGGm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbwIaK/btsLMsi8VOg/LQrrmivshPRKg78vCkGGm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbwIaK%2FbtsLMsi8VOg%2FLQrrmivshPRKg78vCkGGm1%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;1333&quot; height=&quot;788&quot; data-origin-width=&quot;1333&quot; data-origin-height=&quot;788&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인 후 submit()&lt;/p&gt;
&lt;pre id=&quot;code_1736828136238&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Tables&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            DataTables Advanced Tables
                            &amp;lt;button id=&quot;regBtn&quot; type=&quot;button&quot; class=&quot;btn btn-xs pull-right&quot;&amp;gt;Register New Board&amp;lt;/button&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
                            &amp;lt;table width=&quot;100%&quot; class=&quot;table table-striped table-bordered table-hover&quot;&amp;gt;
                                &amp;lt;thead&amp;gt;
                                    &amp;lt;tr&amp;gt;
                                        &amp;lt;th&amp;gt;#번호&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;수정일&amp;lt;/th&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/thead&amp;gt;
                                &amp;lt;tbody&amp;gt;
                                &amp;lt;c:forEach items=&quot;${list}&quot; var=&quot;boardVO&quot;&amp;gt;
                                    &amp;lt;tr class=&quot;odd gradeX&quot;&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.bno}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;a class=&quot;move&quot; href=&quot;&amp;lt;c:out value='${boardVO.bno}' /&amp;gt;&quot;&amp;gt;&amp;lt;c:out value=&quot;${boardVO.title}&quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.writer}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.regdate }&quot; pattern=&quot;yyyy-MM-dd&quot;/&amp;gt; &amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.updateDate }&quot; pattern=&quot;yyyy-MM-dd&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/c:forEach&amp;gt;
                                &amp;lt;/tbody&amp;gt;
                            &amp;lt;/table&amp;gt;
                            &amp;lt;!-- /.table-responsive --&amp;gt;
                            
                            &amp;lt;form id=&quot;searchForm&quot; action=&quot;/board/list&quot; method=&quot;get&quot;&amp;gt;
                            	&amp;lt;select name=&quot;type&quot;&amp;gt;
                            		&amp;lt;option value=&quot;T&quot;&amp;gt;제목&amp;lt;/option&amp;gt;
                            	&amp;lt;/select&amp;gt;
                            	&amp;lt;input type=&quot;text&quot; name=&quot;keyword&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;pageNum&quot; value=&quot;${page.criteria.pageNum}&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;${page.criteria.amount}&quot;&amp;gt;
                            	&amp;lt;button class=&quot;btn btn-default&quot;&amp;gt;Search&amp;lt;/button&amp;gt;
                            &amp;lt;/form&amp;gt;
                            
                            &amp;lt;div class=&quot;pull-right&quot;&amp;gt;
                            	&amp;lt;ul class=&quot;pagination&quot;&amp;gt;
                            		&amp;lt;c:if test=&quot;${page.prev}&quot;&amp;gt; 
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${page.startPage - 1}&quot; tabindex=&quot;-1&quot;&amp;gt;Previous&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:if&amp;gt;
									&amp;lt;c:forEach begin=&quot;${page.startPage}&quot; end=&quot;${page.endPage}&quot; var=&quot;num&quot;&amp;gt;
										&amp;lt;li class=&quot;page-item ${page.criteria.pageNum == num? 'active' :''}&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${num}&quot;&amp;gt;${num}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:forEach&amp;gt;                
									&amp;lt;c:if test=&quot;${page.next}&quot;&amp;gt;            	
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${page.endPage + 1}&quot;&amp;gt;Next&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                            		&amp;lt;/c:if&amp;gt;
                            	&amp;lt;/ul&amp;gt;
                            &amp;lt;/div&amp;gt;
                            &amp;lt;form id=&quot;actionForm&quot; action=&quot;/board/list&quot; method=&quot;get&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;pageNum&quot; value=&quot;${page.criteria.pageNum}&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;${page.criteria.amount}&quot;&amp;gt;
                            &amp;lt;/form&amp;gt;
                            
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;

&amp;lt;div id=&quot;myModal&quot; class=&quot;modal&quot; tabindex=&quot;-1&quot; role=&quot;dialog&quot;&amp;gt;
  &amp;lt;div class=&quot;modal-dialog&quot; role=&quot;document&quot;&amp;gt;
    &amp;lt;div class=&quot;modal-content&quot;&amp;gt;
      &amp;lt;div class=&quot;modal-header&quot;&amp;gt;
        &amp;lt;h5 class=&quot;modal-title&quot;&amp;gt;Modal title&amp;lt;/h5&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;modal&quot; aria-label=&quot;Close&quot;&amp;gt;
          &amp;lt;span aria-hidden=&quot;true&quot;&amp;gt;&amp;amp;times;&amp;lt;/span&amp;gt;
        &amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-body&quot;&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-footer&quot;&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-primary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Save changes&amp;lt;/button&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-secondary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Close&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
$(document).ready(function(){
	var result = '&amp;lt;c:out value=&quot;${result}&quot;/&amp;gt;';
	
	
	checkModal(result);
	
	history.replaceState({},null,null); // 히스토리 클리어
	
	function checkModal(result){
		
		if(result ==='' || history.state){
			return;
		}
		
		if(result === 'success'){
			$('.modal-body').html(&quot;정상적으로 처리됨.&quot;);
		} else if(parseInt(result)&amp;gt;0){
			$('.modal-body').html(&quot;게시글 &quot; + parseInt(result) + &quot; 번이 등록됨.&quot;);
		}
		
		$(&quot;#myModal&quot;).modal(&quot;show&quot;);
	}
	
	$(&quot;#regBtn&quot;).click(function(){
		self.location = &quot;/board/register&quot;;
	});
	
	var actionForm = $(&quot;#actionForm&quot;);
	
	$(&quot;.page-link&quot;).on(&quot;click&quot;, function(e){
		e.preventDefault(); // a태그는 기능은 이동 &amp;rarr; 이동이 되지 않음(기본 동작 제어)
		
		console.log('click');
		
		//form 태그의 내용 변경 후 submit
		actionForm.find(&quot;input[name='pageNum']&quot;).val($(this).attr(&quot;href&quot;));
		actionForm.submit();
		
	});
	
	$(&quot;.move&quot;).on(&quot;click&quot;, function(e){
		e.preventDefault();
		
		console.log($(this).attr(&quot;href&quot;));
		
		actionForm.append(&quot;&amp;lt;input type='hidden' name='bno' value='&quot;+$(this).attr(&quot;href&quot;)+&quot;'&amp;gt;&quot;);
		actionForm.attr(&quot;action&quot;,&quot;/board/get&quot;).submit();
		
	});
	
	var searchForm = $(&quot;#searchForm&quot;);
	
	$(&quot;#searchForm button&quot;).on(&quot;click&quot;, function(e){
		e.preventDefault();
		console.log(&quot;클릭........&quot;);
		searchForm.submit();
	});
	
});
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&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;option 추가&lt;/p&gt;
&lt;pre id=&quot;code_1736828282524&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(...생략...)
                            &amp;lt;form id=&quot;searchForm&quot; action=&quot;/board/list&quot; method=&quot;get&quot;&amp;gt;
                            	&amp;lt;select name=&quot;type&quot;&amp;gt;
                            		&amp;lt;option value=&quot;&quot;&amp;gt;---&amp;lt;/option&amp;gt;
                            		&amp;lt;option value=&quot;T&quot;&amp;gt;제목&amp;lt;/option&amp;gt;
                            		&amp;lt;option value=&quot;C&quot;&amp;gt;내용&amp;lt;/option&amp;gt;
                            		&amp;lt;option value=&quot;W&quot;&amp;gt;작성자&amp;lt;/option&amp;gt;
                            		&amp;lt;option value=&quot;TC&quot;&amp;gt;제목+내용&amp;lt;/option&amp;gt;
                            		&amp;lt;option value=&quot;TCW&quot;&amp;gt;제목+내용+작성자&amp;lt;/option&amp;gt;
                            	&amp;lt;/select&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;1317&quot; data-origin-height=&quot;840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byzCLm/btsLMWjKhZt/KjlgtX4Iw9tQ8MpLIxSAZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byzCLm/btsLMWjKhZt/KjlgtX4Iw9tQ8MpLIxSAZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byzCLm/btsLMWjKhZt/KjlgtX4Iw9tQ8MpLIxSAZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyzCLm%2FbtsLMWjKhZt%2FKjlgtX4Iw9tQ8MpLIxSAZ0%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;1317&quot; height=&quot;840&quot; data-origin-width=&quot;1317&quot; data-origin-height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 버튼을 누른다 &amp;rarr; 새롭게 검색을 한다&lt;/p&gt;
&lt;pre id=&quot;code_1736828353663&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Tables&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            DataTables Advanced Tables
                            &amp;lt;button id=&quot;regBtn&quot; type=&quot;button&quot; class=&quot;btn btn-xs pull-right&quot;&amp;gt;Register New Board&amp;lt;/button&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
                            &amp;lt;table width=&quot;100%&quot; class=&quot;table table-striped table-bordered table-hover&quot;&amp;gt;
                                &amp;lt;thead&amp;gt;
                                    &amp;lt;tr&amp;gt;
                                        &amp;lt;th&amp;gt;#번호&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;수정일&amp;lt;/th&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/thead&amp;gt;
                                &amp;lt;tbody&amp;gt;
                                &amp;lt;c:forEach items=&quot;${list}&quot; var=&quot;boardVO&quot;&amp;gt;
                                    &amp;lt;tr class=&quot;odd gradeX&quot;&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.bno}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;a class=&quot;move&quot; href=&quot;&amp;lt;c:out value='${boardVO.bno}' /&amp;gt;&quot;&amp;gt;&amp;lt;c:out value=&quot;${boardVO.title}&quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.writer}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.regdate }&quot; pattern=&quot;yyyy-MM-dd&quot;/&amp;gt; &amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.updateDate }&quot; pattern=&quot;yyyy-MM-dd&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/c:forEach&amp;gt;
                                &amp;lt;/tbody&amp;gt;
                            &amp;lt;/table&amp;gt;
                            &amp;lt;!-- /.table-responsive --&amp;gt;
                            
                            &amp;lt;form id=&quot;searchForm&quot; action=&quot;/board/list&quot; method=&quot;get&quot;&amp;gt;
                            	&amp;lt;select name=&quot;type&quot;&amp;gt;
                            		&amp;lt;option value=&quot;&quot; ${page.criteria.type == null?&quot;selected&quot;:&quot;&quot; }&amp;gt;---&amp;lt;/option&amp;gt;
                            		&amp;lt;option value=&quot;T&quot; ${page.criteria.type eq 'T'?&quot;selected&quot;:&quot;&quot; }&amp;gt;제목&amp;lt;/option&amp;gt;
                            		&amp;lt;option value=&quot;C&quot; ${page.criteria.type eq 'C'?&quot;selected&quot;:&quot;&quot; }&amp;gt;내용&amp;lt;/option&amp;gt;
                            		&amp;lt;option value=&quot;W&quot; ${page.criteria.type eq 'W'?&quot;selected&quot;:&quot;&quot; }&amp;gt;작성자&amp;lt;/option&amp;gt;
                            		&amp;lt;option value=&quot;TC&quot; ${page.criteria.type eq 'TC'?&quot;selected&quot;:&quot;&quot; }&amp;gt;제목+내용&amp;lt;/option&amp;gt;
                            		&amp;lt;option value=&quot;TCW&quot; ${page.criteria.type eq 'TCW'?&quot;selected&quot;:&quot;&quot; }&amp;gt;제목+내용+작성자&amp;lt;/option&amp;gt;
                            	&amp;lt;/select&amp;gt;
                            	&amp;lt;input type=&quot;text&quot; name=&quot;keyword&quot; value=&quot;${page.criteria.keyword}&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;pageNum&quot; value=&quot;${page.criteria.pageNum}&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;${page.criteria.amount}&quot;&amp;gt;
                            	&amp;lt;button class=&quot;btn btn-default&quot;&amp;gt;Search&amp;lt;/button&amp;gt;
                            &amp;lt;/form&amp;gt;
                            
                            &amp;lt;div class=&quot;pull-right&quot;&amp;gt;
                            	&amp;lt;ul class=&quot;pagination&quot;&amp;gt;
                            		&amp;lt;c:if test=&quot;${page.prev}&quot;&amp;gt; 
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${page.startPage - 1}&quot; tabindex=&quot;-1&quot;&amp;gt;Previous&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:if&amp;gt;
									&amp;lt;c:forEach begin=&quot;${page.startPage}&quot; end=&quot;${page.endPage}&quot; var=&quot;num&quot;&amp;gt;
										&amp;lt;li class=&quot;page-item ${page.criteria.pageNum == num? 'active' :''}&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${num}&quot;&amp;gt;${num}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:forEach&amp;gt;                
									&amp;lt;c:if test=&quot;${page.next}&quot;&amp;gt;            	
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${page.endPage + 1}&quot;&amp;gt;Next&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                            		&amp;lt;/c:if&amp;gt;
                            	&amp;lt;/ul&amp;gt;
                            &amp;lt;/div&amp;gt;
                            &amp;lt;form id=&quot;actionForm&quot; action=&quot;/board/list&quot; method=&quot;get&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;pageNum&quot; value=&quot;${page.criteria.pageNum}&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;${page.criteria.amount}&quot;&amp;gt;
                            &amp;lt;/form&amp;gt;
                            
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;

&amp;lt;div id=&quot;myModal&quot; class=&quot;modal&quot; tabindex=&quot;-1&quot; role=&quot;dialog&quot;&amp;gt;
  &amp;lt;div class=&quot;modal-dialog&quot; role=&quot;document&quot;&amp;gt;
    &amp;lt;div class=&quot;modal-content&quot;&amp;gt;
      &amp;lt;div class=&quot;modal-header&quot;&amp;gt;
        &amp;lt;h5 class=&quot;modal-title&quot;&amp;gt;Modal title&amp;lt;/h5&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;modal&quot; aria-label=&quot;Close&quot;&amp;gt;
          &amp;lt;span aria-hidden=&quot;true&quot;&amp;gt;&amp;amp;times;&amp;lt;/span&amp;gt;
        &amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-body&quot;&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-footer&quot;&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-primary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Save changes&amp;lt;/button&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-secondary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Close&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
$(document).ready(function(){
	var result = '&amp;lt;c:out value=&quot;${result}&quot;/&amp;gt;';
	
	
	checkModal(result);
	
	history.replaceState({},null,null); // 히스토리 클리어
	
	function checkModal(result){
		
		if(result ==='' || history.state){
			return;
		}
		
		if(result === 'success'){
			$('.modal-body').html(&quot;정상적으로 처리됨.&quot;);
		} else if(parseInt(result)&amp;gt;0){
			$('.modal-body').html(&quot;게시글 &quot; + parseInt(result) + &quot; 번이 등록됨.&quot;);
		}
		
		$(&quot;#myModal&quot;).modal(&quot;show&quot;);
	}
	
	$(&quot;#regBtn&quot;).click(function(){
		self.location = &quot;/board/register&quot;;
	});
	
	var actionForm = $(&quot;#actionForm&quot;);
	
	$(&quot;.page-link&quot;).on(&quot;click&quot;, function(e){
		e.preventDefault(); // a태그는 기능은 이동 &amp;rarr; 이동이 되지 않음(기본 동작 제어)
		
		console.log('click');
		
		//form 태그의 내용 변경 후 submit
		actionForm.find(&quot;input[name='pageNum']&quot;).val($(this).attr(&quot;href&quot;));
		actionForm.submit();
		
	});
	
	$(&quot;.move&quot;).on(&quot;click&quot;, function(e){
		e.preventDefault();
		
		console.log($(this).attr(&quot;href&quot;));
		
		actionForm.append(&quot;&amp;lt;input type='hidden' name='bno' value='&quot;+$(this).attr(&quot;href&quot;)+&quot;'&amp;gt;&quot;);
		actionForm.attr(&quot;action&quot;,&quot;/board/get&quot;).submit();
		
	});
	
	var searchForm = $(&quot;#searchForm&quot;);
	
	$(&quot;#searchForm button&quot;).on(&quot;click&quot;, function(e){
		e.preventDefault();
		console.log(&quot;클릭........&quot;);
		
		searchForm.find(&quot;input[name='pageNum']&quot;).val(1);
		
		searchForm.submit();
	});
	
});
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&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;1335&quot; data-origin-height=&quot;837&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/db0yxL/btsLLtiDgOs/SZEOYaegLD4RyNqreCW6qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/db0yxL/btsLLtiDgOs/SZEOYaegLD4RyNqreCW6qK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/db0yxL/btsLLtiDgOs/SZEOYaegLD4RyNqreCW6qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdb0yxL%2FbtsLLtiDgOs%2FSZEOYaegLD4RyNqreCW6qK%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;1335&quot; height=&quot;837&quot; data-origin-width=&quot;1335&quot; data-origin-height=&quot;837&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;링크 처리&lt;/p&gt;
&lt;pre id=&quot;code_1736829058472&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Tables&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            DataTables Advanced Tables
                            &amp;lt;button id=&quot;regBtn&quot; type=&quot;button&quot; class=&quot;btn btn-xs pull-right&quot;&amp;gt;Register New Board&amp;lt;/button&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
                            &amp;lt;table width=&quot;100%&quot; class=&quot;table table-striped table-bordered table-hover&quot;&amp;gt;
                                &amp;lt;thead&amp;gt;
                                    &amp;lt;tr&amp;gt;
                                        &amp;lt;th&amp;gt;#번호&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;수정일&amp;lt;/th&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/thead&amp;gt;
                                &amp;lt;tbody&amp;gt;
                                &amp;lt;c:forEach items=&quot;${list}&quot; var=&quot;boardVO&quot;&amp;gt;
                                    &amp;lt;tr class=&quot;odd gradeX&quot;&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.bno}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;a class=&quot;move&quot; href=&quot;&amp;lt;c:out value='${boardVO.bno}' /&amp;gt;&quot;&amp;gt;&amp;lt;c:out value=&quot;${boardVO.title}&quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.writer}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.regdate }&quot; pattern=&quot;yyyy-MM-dd&quot;/&amp;gt; &amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.updateDate }&quot; pattern=&quot;yyyy-MM-dd&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/c:forEach&amp;gt;
                                &amp;lt;/tbody&amp;gt;
                            &amp;lt;/table&amp;gt;
                            &amp;lt;!-- /.table-responsive --&amp;gt;
                            
                            &amp;lt;form id=&quot;searchForm&quot; action=&quot;/board/list&quot; method=&quot;get&quot;&amp;gt;
                            	&amp;lt;select name=&quot;type&quot;&amp;gt;
                            		&amp;lt;option value=&quot;&quot; ${page.criteria.type == null?&quot;selected&quot;:&quot;&quot; }&amp;gt;---&amp;lt;/option&amp;gt;
                            		&amp;lt;option value=&quot;T&quot; ${page.criteria.type eq 'T'?&quot;selected&quot;:&quot;&quot; }&amp;gt;제목&amp;lt;/option&amp;gt;
                            		&amp;lt;option value=&quot;C&quot; ${page.criteria.type eq 'C'?&quot;selected&quot;:&quot;&quot; }&amp;gt;내용&amp;lt;/option&amp;gt;
                            		&amp;lt;option value=&quot;W&quot; ${page.criteria.type eq 'W'?&quot;selected&quot;:&quot;&quot; }&amp;gt;작성자&amp;lt;/option&amp;gt;
                            		&amp;lt;option value=&quot;TC&quot; ${page.criteria.type eq 'TC'?&quot;selected&quot;:&quot;&quot; }&amp;gt;제목+내용&amp;lt;/option&amp;gt;
                            		&amp;lt;option value=&quot;TCW&quot; ${page.criteria.type eq 'TCW'?&quot;selected&quot;:&quot;&quot; }&amp;gt;제목+내용+작성자&amp;lt;/option&amp;gt;
                            	&amp;lt;/select&amp;gt;
                            	&amp;lt;input type=&quot;text&quot; name=&quot;keyword&quot; value=&quot;${page.criteria.keyword}&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;pageNum&quot; value=&quot;${page.criteria.pageNum}&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;${page.criteria.amount}&quot;&amp;gt;
                            	&amp;lt;button class=&quot;btn btn-default&quot;&amp;gt;Search&amp;lt;/button&amp;gt;
                            &amp;lt;/form&amp;gt;
                            
                            &amp;lt;div class=&quot;pull-right&quot;&amp;gt;
                            	&amp;lt;ul class=&quot;pagination&quot;&amp;gt;
                            		&amp;lt;c:if test=&quot;${page.prev}&quot;&amp;gt; 
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${page.startPage - 1}&quot; tabindex=&quot;-1&quot;&amp;gt;Previous&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:if&amp;gt;
									&amp;lt;c:forEach begin=&quot;${page.startPage}&quot; end=&quot;${page.endPage}&quot; var=&quot;num&quot;&amp;gt;
										&amp;lt;li class=&quot;page-item ${page.criteria.pageNum == num? 'active' :''}&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${num}&quot;&amp;gt;${num}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:forEach&amp;gt;                
									&amp;lt;c:if test=&quot;${page.next}&quot;&amp;gt;            	
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${page.endPage + 1}&quot;&amp;gt;Next&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                            		&amp;lt;/c:if&amp;gt;
                            	&amp;lt;/ul&amp;gt;
                            &amp;lt;/div&amp;gt;
                            &amp;lt;form id=&quot;actionForm&quot; action=&quot;/board/list&quot; method=&quot;get&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;pageNum&quot; value=&quot;${page.criteria.pageNum}&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;${page.criteria.amount}&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;type&quot; value=&quot;${page.criteria.type}&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;keyword&quot; value=&quot;${page.criteria.keyword}&quot;&amp;gt;
                            &amp;lt;/form&amp;gt;
                            
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;

&amp;lt;div id=&quot;myModal&quot; class=&quot;modal&quot; tabindex=&quot;-1&quot; role=&quot;dialog&quot;&amp;gt;
  &amp;lt;div class=&quot;modal-dialog&quot; role=&quot;document&quot;&amp;gt;
    &amp;lt;div class=&quot;modal-content&quot;&amp;gt;
      &amp;lt;div class=&quot;modal-header&quot;&amp;gt;
        &amp;lt;h5 class=&quot;modal-title&quot;&amp;gt;Modal title&amp;lt;/h5&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;modal&quot; aria-label=&quot;Close&quot;&amp;gt;
          &amp;lt;span aria-hidden=&quot;true&quot;&amp;gt;&amp;amp;times;&amp;lt;/span&amp;gt;
        &amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-body&quot;&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-footer&quot;&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-primary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Save changes&amp;lt;/button&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-secondary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Close&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
$(document).ready(function(){
	var result = '&amp;lt;c:out value=&quot;${result}&quot;/&amp;gt;';
	
	
	checkModal(result);
	
	history.replaceState({},null,null); // 히스토리 클리어
	
	function checkModal(result){
		
		if(result ==='' || history.state){
			return;
		}
		
		if(result === 'success'){
			$('.modal-body').html(&quot;정상적으로 처리됨.&quot;);
		} else if(parseInt(result)&amp;gt;0){
			$('.modal-body').html(&quot;게시글 &quot; + parseInt(result) + &quot; 번이 등록됨.&quot;);
		}
		
		$(&quot;#myModal&quot;).modal(&quot;show&quot;);
	}
	
	$(&quot;#regBtn&quot;).click(function(){
		self.location = &quot;/board/register&quot;;
	});
	
	var actionForm = $(&quot;#actionForm&quot;);
	
	$(&quot;.page-link&quot;).on(&quot;click&quot;, function(e){
		e.preventDefault(); // a태그는 기능은 이동 &amp;rarr; 이동이 되지 않음(기본 동작 제어)
		
		console.log('click');
		
		//form 태그의 내용 변경 후 submit
		actionForm.find(&quot;input[name='pageNum']&quot;).val($(this).attr(&quot;href&quot;));
		actionForm.submit();
		
	});
	
	$(&quot;.move&quot;).on(&quot;click&quot;, function(e){
		e.preventDefault();
		
		console.log($(this).attr(&quot;href&quot;));
		
		actionForm.append(&quot;&amp;lt;input type='hidden' name='bno' value='&quot;+$(this).attr(&quot;href&quot;)+&quot;'&amp;gt;&quot;);
		actionForm.attr(&quot;action&quot;,&quot;/board/get&quot;).submit();
		
	});
	
	var searchForm = $(&quot;#searchForm&quot;);
	
	$(&quot;#searchForm button&quot;).on(&quot;click&quot;, function(e){
		e.preventDefault();
		console.log(&quot;클릭........&quot;);
		
		searchForm.find(&quot;input[name='pageNum']&quot;).val(1);
		
		searchForm.submit();
	});
	
});
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&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;1328&quot; data-origin-height=&quot;835&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvPwHC/btsLNMgusOw/7fKHfCY0KHMuXR8ymfjY5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvPwHC/btsLNMgusOw/7fKHfCY0KHMuXR8ymfjY5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvPwHC/btsLNMgusOw/7fKHfCY0KHMuXR8ymfjY5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvPwHC%2FbtsLNMgusOw%2F7fKHfCY0KHMuXR8ymfjY5k%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;1328&quot; height=&quot;835&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;835&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;검색 후 조회, 수정, 삭제 페이지 이동 시 검색 항목 유지&lt;br /&gt;RedirectAttribute에 검색 관련 내용을 추가하는 방식&lt;br /&gt;UriComponentsBuilder를 이용해서 Criteria에서 링크를 생성하는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;get.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1736829287000&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Board Read&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            Board Read
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;BNO&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.bno}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Title&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.title}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Content&amp;lt;/label&amp;gt; &amp;lt;textarea rows=&quot;5&quot; cols=&quot;50&quot; class=&quot;form-control&quot; name=&quot;content&quot;&amp;gt;&amp;lt;c:out value='${boardVO.content}'/&amp;gt;&amp;lt;/textarea&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Writer&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;writer&quot; class=&quot;form-control&quot; value=&quot;&amp;lt;c:out value='${boardVO.writer}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
	                            &amp;lt;form id=&quot;actionForm&quot; action=&quot;/board/list&quot; method=&quot;get&quot;&amp;gt;
	                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;pageNum&quot; value=&quot;${criteria.pageNum}&quot;&amp;gt;
	                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;${criteria.amount}&quot;&amp;gt;
	                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;bno&quot; value=&quot;${boardVO.bno}&quot;&amp;gt;
	                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;type&quot; value=&quot;${criteria.type}&quot;&amp;gt;
	                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;keyword&quot; value=&quot;${criteria.keyword}&quot;&amp;gt;
                            	&amp;lt;/form&amp;gt;
							 	&amp;lt;button type=&quot;button&quot; class=&quot;btn btn-default listBtn&quot;&amp;gt;&amp;lt;a href=&quot;/board/list&quot;&amp;gt;List&amp;lt;/a&amp;gt;&amp;lt;/button&amp;gt;
                                &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-default modiBtn&quot;&amp;gt;&amp;lt;a href=&quot;/board/modify?bno=&amp;lt;c:out value='${boardVO.bno }'/&amp;gt;&quot;&amp;gt;Modify&amp;lt;/a&amp;gt;&amp;lt;/button&amp;gt;
								&amp;lt;script&amp;gt;
									
								var actionForm = $(&quot;#actionForm&quot;);
								
								$('.listBtn').click(function(e){
									e.preventDefault();
									actionForm.find(&quot;input[name='bno']&quot;).remove();
									actionForm.submit();
								});
								
								$('.modiBtn').click(function(e){
									e.preventDefault();
									actionForm.attr(&quot;action&quot;,&quot;/board/modify&quot;);
									actionForm.submit();
								});
								
								&amp;lt;/script&amp;gt;

                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
&amp;lt;%@include file=&quot;../include/footer.jsp&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;redirect하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1736829401629&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/modify&quot;)
	public String modify(BoardVO boardVO, RedirectAttributes redirectAttributes, Criteria criteria) {
		log.info(&quot;BoardController modify()......................&quot;);
		
		int count = boardService.modify(boardVO);
		
		if(count == 1) {
			redirectAttributes.addFlashAttribute(&quot;result&quot;, &quot;success&quot;);
		}
		
		redirectAttributes.addAttribute(&quot;pageNum&quot;,criteria.getPageNum());
		redirectAttributes.addAttribute(&quot;amount&quot;,criteria.getAmount());
		redirectAttributes.addAttribute(&quot;type&quot;,criteria.getType());
		redirectAttributes.addAttribute(&quot;keyword&quot;,criteria.getKeyword());
		
		return &quot;redirect:/board/list&quot;;
	}
	
	@PostMapping(&quot;/remove&quot;)
	public String remove(@RequestParam(&quot;bno&quot;) Long bno, RedirectAttributes redirectAttributes, Criteria criteria) {
		log.info(&quot;BoardController remove()......................&quot;);
		
		int count = boardService.remove(bno);
		
		if(count == 1) {
			redirectAttributes.addFlashAttribute(&quot;result&quot;, &quot;success&quot;);
		}
		
		redirectAttributes.addAttribute(&quot;pageNum&quot;,criteria.getPageNum());
		redirectAttributes.addAttribute(&quot;amount&quot;,criteria.getAmount());
		redirectAttributes.addAttribute(&quot;type&quot;,criteria.getType());
		redirectAttributes.addAttribute(&quot;keyword&quot;,criteria.getKeyword());
		
		return &quot;redirect:/board/list&quot;;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/332</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-15#entry332comment</comments>
      <pubDate>Tue, 14 Jan 2025 13:36:58 +0900</pubDate>
    </item>
    <item>
      <title>스프링 웹 프로젝트 14</title>
      <link>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-14</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;※ 외부 라이브러리는 footer에 작성하는 이유? 성능과 로딩 최적화 때문&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;페이지 로딩 우선순위&lt;br /&gt;head에 스크립트를 넣으면 페이지 로딩이 완료되기 전에 자바스크립트가 먼저 로드되고 실행될 수 있음. 이는 스크립트가 다른 DOM 요소의 렌더링을 차단할 수 있기 때문에 페이지 로딩 속도를 늦출 수 있음. footer에 스크립트를 넣으면 HTML 문서의 주요 콘텐츠가 먼저 로드되고 표시된 후, 그 다음에 자바스크립트가 로드되기 때문에 사용자에게 빠른 콘텐츠 표시를 제공할 수 있음&lt;/li&gt;
&lt;li&gt;비동기적 로딩&lt;br /&gt;footer에 스크립트를 추가하면서 async나 defer 속성을 사용하면, 스크립트가 비동기적으로 로드되거나 DOM이 완전히 로드된 후 실행될 수 있음. 이로 인해 페이지 로딩 시간이 개선&lt;/li&gt;
&lt;li&gt;최소한의 차단적 렌더링&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지 번호 이벤트 처리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;페이지 번호의 링크는 페이지 번호만 가지도록 하고 별도의 form 태그와 이벤트 처리를 통해서 이동&lt;/li&gt;
&lt;li&gt;검색 조건이 많이 붙을 수 있는데, 관련된 모든 링크를 다 수정해줘야하기 때문에 form태그를 사용&lt;br /&gt;단점 &amp;rarr; 자바스크립트가 정상하지 않으면 동작하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1736745827233&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;                            &amp;lt;form action=&quot;actionForm&quot; action=&quot;/board/list&quot; method=&quot;get&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;pageNum&quot; value=&quot;${page.criteria.pageNum}&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;${page.criteria.amount}&quot;&amp;gt;
                            &amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1736747606967&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Tables&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            DataTables Advanced Tables
                            &amp;lt;button id=&quot;regBtn&quot; type=&quot;button&quot; class=&quot;btn btn-xs pull-right&quot;&amp;gt;Register New Board&amp;lt;/button&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
                            &amp;lt;table width=&quot;100%&quot; class=&quot;table table-striped table-bordered table-hover&quot;&amp;gt;
                                &amp;lt;thead&amp;gt;
                                    &amp;lt;tr&amp;gt;
                                        &amp;lt;th&amp;gt;#번호&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;수정일&amp;lt;/th&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/thead&amp;gt;
                                &amp;lt;tbody&amp;gt;
                                &amp;lt;c:forEach items=&quot;${list}&quot; var=&quot;boardVO&quot;&amp;gt;
                                    &amp;lt;tr class=&quot;odd gradeX&quot;&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.bno}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;a href=&quot;/board/get?bno=&amp;lt;c:out value='${boardVO.bno}' /&amp;gt;&quot;&amp;gt;&amp;lt;c:out value=&quot;${boardVO.title}&quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.writer}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.regdate }&quot; pattern=&quot;yyyy-MM-dd&quot;/&amp;gt; &amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.updateDate }&quot; pattern=&quot;yyyy-MM-dd&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/c:forEach&amp;gt;
                                &amp;lt;/tbody&amp;gt;
                            &amp;lt;/table&amp;gt;
                            &amp;lt;!-- /.table-responsive --&amp;gt;
                            
                            &amp;lt;h4&amp;gt;${page}&amp;lt;/h4&amp;gt;
                            &amp;lt;div class=&quot;pull-right&quot;&amp;gt;
                            	&amp;lt;ul class=&quot;pagination&quot;&amp;gt;
                            		&amp;lt;c:if test=&quot;${page.prev}&quot;&amp;gt; 
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${page.startPage - 1}&quot; tabindex=&quot;-1&quot;&amp;gt;Previous&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:if&amp;gt;
									&amp;lt;c:forEach begin=&quot;${page.startPage}&quot; end=&quot;${page.endPage}&quot; var=&quot;num&quot;&amp;gt;
										&amp;lt;li class=&quot;page-item ${page.criteria.pageNum == num? 'active' :''}&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${num}&quot;&amp;gt;${num}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:forEach&amp;gt;                
									&amp;lt;c:if test=&quot;${page.next}&quot;&amp;gt;            	
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${page.endPage + 1}&quot;&amp;gt;Next&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                            		&amp;lt;/c:if&amp;gt;
                            	&amp;lt;/ul&amp;gt;
                            &amp;lt;/div&amp;gt;
                            &amp;lt;form id=&quot;actionForm&quot; action=&quot;/board/list&quot; method=&quot;get&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;pageNum&quot; value=&quot;${page.criteria.pageNum}&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;${page.criteria.amount}&quot;&amp;gt;
                            &amp;lt;/form&amp;gt;
                            
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;

&amp;lt;div id=&quot;myModal&quot; class=&quot;modal&quot; tabindex=&quot;-1&quot; role=&quot;dialog&quot;&amp;gt;
  &amp;lt;div class=&quot;modal-dialog&quot; role=&quot;document&quot;&amp;gt;
    &amp;lt;div class=&quot;modal-content&quot;&amp;gt;
      &amp;lt;div class=&quot;modal-header&quot;&amp;gt;
        &amp;lt;h5 class=&quot;modal-title&quot;&amp;gt;Modal title&amp;lt;/h5&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;modal&quot; aria-label=&quot;Close&quot;&amp;gt;
          &amp;lt;span aria-hidden=&quot;true&quot;&amp;gt;&amp;amp;times;&amp;lt;/span&amp;gt;
        &amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-body&quot;&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-footer&quot;&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-primary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Save changes&amp;lt;/button&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-secondary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Close&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
$(document).ready(function(){
	var result = '&amp;lt;c:out value=&quot;${result}&quot;/&amp;gt;';
	
	
	checkModal(result);
	
	history.replaceState({},null,null); // 히스토리 클리어
	
	function checkModal(result){
		
		if(result ==='' || history.state){
			return;
		}
		
		if(result === 'success'){
			$('.modal-body').html(&quot;정상적으로 처리됨.&quot;);
		} else if(parseInt(result)&amp;gt;0){
			$('.modal-body').html(&quot;게시글 &quot; + parseInt(result) + &quot; 번이 등록됨.&quot;);
		}
		
		$(&quot;#myModal&quot;).modal(&quot;show&quot;);
	}
	
	$(&quot;#regBtn&quot;).click(function(){
		self.location = &quot;/board/register&quot;;
	});
	
	var actionForm = $(&quot;#actionForm&quot;);
	
	$(&quot;.page-link&quot;).on(&quot;click&quot;, function(e){
		e.preventDefault(); // a태그는 기능은 이동 &amp;rarr; 이동이 되지 않음(기본 동작 제어)
		
		console.log('click');
		
		//form 태그의 내용 변경 후 submit
		actionForm.find(&quot;input[name='pageNum']&quot;).val($(this).attr(&quot;href&quot;));
		actionForm.submit();
		
	});
	
	
	
});
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V3yMY/btsLMI6n1m8/KSPWhuKnK8MBa7X3FNdNk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V3yMY/btsLMI6n1m8/KSPWhuKnK8MBa7X3FNdNk1/img.png&quot; data-origin-width=&quot;1901&quot; data-origin-height=&quot;984&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.5068%; margin-right: 10px;&quot; data-widthpercent=&quot;50.09&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V3yMY/btsLMI6n1m8/KSPWhuKnK8MBa7X3FNdNk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV3yMY%2FbtsLMI6n1m8%2FKSPWhuKnK8MBa7X3FNdNk1%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;1901&quot; height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTh4x7/btsLMH0HBrN/k7e633Fl4pQnGlJhUmt4l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTh4x7/btsLMH0HBrN/k7e633Fl4pQnGlJhUmt4l1/img.png&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;987&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.3304%;&quot; data-widthpercent=&quot;49.91&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTh4x7/btsLMH0HBrN/k7e633Fl4pQnGlJhUmt4l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTh4x7%2FbtsLMH0HBrN%2Fk7e633Fl4pQnGlJhUmt4l1%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;1900&quot; height=&quot;987&quot;/&gt;&lt;/span&gt;&lt;/div&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;3페이지에서&amp;nbsp; 1376376의 글을 조회 &amp;rarr; List 버튼을 누르면 list의 1페이지로 넘어감&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uErMj/btsLK5ho9DR/q0LPIEMuz14aJakOo3DWuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uErMj/btsLK5ho9DR/q0LPIEMuz14aJakOo3DWuK/img.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;985&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.6438%; margin-right: 10px;&quot; data-widthpercent=&quot;50.23&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uErMj/btsLK5ho9DR/q0LPIEMuz14aJakOo3DWuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuErMj%2FbtsLK5ho9DR%2Fq0LPIEMuz14aJakOo3DWuK%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;985&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oby6Y/btsLKsc7fD0/a3RKbAB0KA5adO2fQEycw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oby6Y/btsLKsc7fD0/a3RKbAB0KA5adO2fQEycw1/img.png&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;993&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.1934%;&quot; data-widthpercent=&quot;49.77&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oby6Y/btsLKsc7fD0/a3RKbAB0KA5adO2fQEycw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foby6Y%2FbtsLKsc7fD0%2Fa3RKbAB0KA5adO2fQEycw1%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;975&quot; height=&quot;993&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1736747871815&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; &amp;lt;c:forEach items=&quot;${list}&quot; var=&quot;boardVO&quot;&amp;gt;
                                    &amp;lt;tr class=&quot;odd gradeX&quot;&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.bno}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;a href=&quot;/board/get?bno=&amp;lt;c:out value='${boardVO.bno}' /&amp;gt;&quot;&amp;gt;&amp;lt;c:out value=&quot;${boardVO.title}&quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.writer}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.regdate }&quot; pattern=&quot;yyyy-MM-dd&quot;/&amp;gt; &amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.updateDate }&quot; pattern=&quot;yyyy-MM-dd&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/c:forEach&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;1734&quot; data-origin-height=&quot;993&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/neDiK/btsLKrSOHr0/upCRNxJjPK370vQK3hDvQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/neDiK/btsLKrSOHr0/upCRNxJjPK370vQK3hDvQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/neDiK/btsLKrSOHr0/upCRNxJjPK370vQK3hDvQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FneDiK%2FbtsLKrSOHr0%2FupCRNxJjPK370vQK3hDvQk%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;1734&quot; height=&quot;993&quot; data-origin-width=&quot;1734&quot; data-origin-height=&quot;993&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1736747911823&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;                                &amp;lt;c:forEach items=&quot;${list}&quot; var=&quot;boardVO&quot;&amp;gt;
                                    &amp;lt;tr class=&quot;odd gradeX&quot;&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.bno}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;a href=&quot;&amp;lt;c:out value='${boardVO.bno}' /&amp;gt;&quot;&amp;gt;&amp;lt;c:out value=&quot;${boardVO.title}&quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.writer}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.regdate }&quot; pattern=&quot;yyyy-MM-dd&quot;/&amp;gt; &amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.updateDate }&quot; pattern=&quot;yyyy-MM-dd&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/c:forEach&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;1733&quot; data-origin-height=&quot;985&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7upOL/btsLKG9Zp17/KP1NTzQJjlX2KLOMA53er1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7upOL/btsLKG9Zp17/KP1NTzQJjlX2KLOMA53er1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7upOL/btsLKG9Zp17/KP1NTzQJjlX2KLOMA53er1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7upOL%2FbtsLKG9Zp17%2FKP1NTzQJjlX2KLOMA53er1%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;1733&quot; height=&quot;985&quot; data-origin-width=&quot;1733&quot; data-origin-height=&quot;985&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1736748509626&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Tables&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            DataTables Advanced Tables
                            &amp;lt;button id=&quot;regBtn&quot; type=&quot;button&quot; class=&quot;btn btn-xs pull-right&quot;&amp;gt;Register New Board&amp;lt;/button&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
                            &amp;lt;table width=&quot;100%&quot; class=&quot;table table-striped table-bordered table-hover&quot;&amp;gt;
                                &amp;lt;thead&amp;gt;
                                    &amp;lt;tr&amp;gt;
                                        &amp;lt;th&amp;gt;#번호&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;수정일&amp;lt;/th&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/thead&amp;gt;
                                &amp;lt;tbody&amp;gt;
                                &amp;lt;c:forEach items=&quot;${list}&quot; var=&quot;boardVO&quot;&amp;gt;
                                    &amp;lt;tr class=&quot;odd gradeX&quot;&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.bno}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;a class=&quot;move&quot; href=&quot;&amp;lt;c:out value='${boardVO.bno}' /&amp;gt;&quot;&amp;gt;&amp;lt;c:out value=&quot;${boardVO.title}&quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.writer}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.regdate }&quot; pattern=&quot;yyyy-MM-dd&quot;/&amp;gt; &amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.updateDate }&quot; pattern=&quot;yyyy-MM-dd&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/c:forEach&amp;gt;
                                &amp;lt;/tbody&amp;gt;
                            &amp;lt;/table&amp;gt;
                            &amp;lt;!-- /.table-responsive --&amp;gt;
                            
                            &amp;lt;h4&amp;gt;${page}&amp;lt;/h4&amp;gt;
                            &amp;lt;div class=&quot;pull-right&quot;&amp;gt;
                            	&amp;lt;ul class=&quot;pagination&quot;&amp;gt;
                            		&amp;lt;c:if test=&quot;${page.prev}&quot;&amp;gt; 
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${page.startPage - 1}&quot; tabindex=&quot;-1&quot;&amp;gt;Previous&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:if&amp;gt;
									&amp;lt;c:forEach begin=&quot;${page.startPage}&quot; end=&quot;${page.endPage}&quot; var=&quot;num&quot;&amp;gt;
										&amp;lt;li class=&quot;page-item ${page.criteria.pageNum == num? 'active' :''}&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${num}&quot;&amp;gt;${num}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:forEach&amp;gt;                
									&amp;lt;c:if test=&quot;${page.next}&quot;&amp;gt;            	
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;${page.endPage + 1}&quot;&amp;gt;Next&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                            		&amp;lt;/c:if&amp;gt;
                            	&amp;lt;/ul&amp;gt;
                            &amp;lt;/div&amp;gt;
                            &amp;lt;form id=&quot;actionForm&quot; action=&quot;/board/list&quot; method=&quot;get&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;pageNum&quot; value=&quot;${page.criteria.pageNum}&quot;&amp;gt;
                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;${page.criteria.amount}&quot;&amp;gt;
                            &amp;lt;/form&amp;gt;
                            
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;

&amp;lt;div id=&quot;myModal&quot; class=&quot;modal&quot; tabindex=&quot;-1&quot; role=&quot;dialog&quot;&amp;gt;
  &amp;lt;div class=&quot;modal-dialog&quot; role=&quot;document&quot;&amp;gt;
    &amp;lt;div class=&quot;modal-content&quot;&amp;gt;
      &amp;lt;div class=&quot;modal-header&quot;&amp;gt;
        &amp;lt;h5 class=&quot;modal-title&quot;&amp;gt;Modal title&amp;lt;/h5&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;modal&quot; aria-label=&quot;Close&quot;&amp;gt;
          &amp;lt;span aria-hidden=&quot;true&quot;&amp;gt;&amp;amp;times;&amp;lt;/span&amp;gt;
        &amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-body&quot;&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-footer&quot;&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-primary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Save changes&amp;lt;/button&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-secondary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Close&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
$(document).ready(function(){
	var result = '&amp;lt;c:out value=&quot;${result}&quot;/&amp;gt;';
	
	
	checkModal(result);
	
	history.replaceState({},null,null); // 히스토리 클리어
	
	function checkModal(result){
		
		if(result ==='' || history.state){
			return;
		}
		
		if(result === 'success'){
			$('.modal-body').html(&quot;정상적으로 처리됨.&quot;);
		} else if(parseInt(result)&amp;gt;0){
			$('.modal-body').html(&quot;게시글 &quot; + parseInt(result) + &quot; 번이 등록됨.&quot;);
		}
		
		$(&quot;#myModal&quot;).modal(&quot;show&quot;);
	}
	
	$(&quot;#regBtn&quot;).click(function(){
		self.location = &quot;/board/register&quot;;
	});
	
	var actionForm = $(&quot;#actionForm&quot;);
	
	$(&quot;.page-link&quot;).on(&quot;click&quot;, function(e){
		e.preventDefault(); // a태그는 기능은 이동 &amp;rarr; 이동이 되지 않음(기본 동작 제어)
		
		console.log('click');
		
		//form 태그의 내용 변경 후 submit
		actionForm.find(&quot;input[name='pageNum']&quot;).val($(this).attr(&quot;href&quot;));
		actionForm.submit();
		
	});
	
	$(&quot;.move&quot;).on(&quot;click&quot;, function(e){
		e.preventDefault();
		
		console.log($(this).attr(&quot;href&quot;));
		
		actionForm.append(&quot;&amp;lt;input type='hidden' name='bno' value='&quot;+$(this).attr(&quot;href&quot;)+&quot;'&amp;gt;&quot;);
		actionForm.attr(&quot;action&quot;,&quot;/board/get&quot;).submit();
		
	})
	
});
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&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;975&quot; data-origin-height=&quot;991&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xyMaF/btsLMG8xaTX/4oUwoQ5qvnylAa9X539GXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xyMaF/btsLMG8xaTX/4oUwoQ5qvnylAa9X539GXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xyMaF/btsLMG8xaTX/4oUwoQ5qvnylAa9X539GXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxyMaF%2FbtsLMG8xaTX%2F4oUwoQ5qvnylAa9X539GXk%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;975&quot; height=&quot;991&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;991&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소줄에 bno도 추가됨 추가적으로 수정 삭제 조회에도 이런 작업이 필요함&lt;/p&gt;
&lt;pre id=&quot;code_1736748623756&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.zerock.domain.BoardVO;
import org.zerock.domain.Criteria;
import org.zerock.domain.PageDTO;
import org.zerock.service.BoardService;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@RequestMapping(&quot;/board/*&quot;)
@RequiredArgsConstructor
@Log4j
public class BoardController {

	private final BoardService boardService;
	
(...생략...)

	@GetMapping({&quot;/get&quot;, &quot;/modify&quot;})
	public void get(@RequestParam(&quot;bno&quot;) Long bno,Model model, Criteria criteria) {
		model.addAttribute(&quot;boardVO&quot;, boardService.get(bno));
	}
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;get.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1736749242455&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Board Read&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            Board Read
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;BNO&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.bno}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Title&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.title}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Content&amp;lt;/label&amp;gt; &amp;lt;textarea rows=&quot;5&quot; cols=&quot;50&quot; class=&quot;form-control&quot; name=&quot;content&quot;&amp;gt;&amp;lt;c:out value='${boardVO.content}'/&amp;gt;&amp;lt;/textarea&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Writer&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;writer&quot; class=&quot;form-control&quot; value=&quot;&amp;lt;c:out value='${boardVO.writer}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
	                            &amp;lt;form id=&quot;actionForm&quot; action=&quot;/board/list&quot; method=&quot;get&quot;&amp;gt;
	                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;pageNum&quot; value=&quot;${criteria.pageNum}&quot;&amp;gt;
	                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;${criteria.amount}&quot;&amp;gt;
	                            	&amp;lt;input type=&quot;hidden&quot; name=&quot;bno&quot; value=&quot;${boardVO.bno}&quot;&amp;gt;
                            	&amp;lt;/form&amp;gt;
							 	&amp;lt;button type=&quot;button&quot; class=&quot;btn btn-default listBtn&quot;&amp;gt;&amp;lt;a href=&quot;/board/list&quot;&amp;gt;List&amp;lt;/a&amp;gt;&amp;lt;/button&amp;gt;
                                &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-default modiBtn&quot;&amp;gt;&amp;lt;a href=&quot;/board/modify?bno=&amp;lt;c:out value='${boardVO.bno }'/&amp;gt;&quot;&amp;gt;Modify&amp;lt;/a&amp;gt;&amp;lt;/button&amp;gt;
								&amp;lt;script&amp;gt;
									
								var actionForm = $(&quot;#actionForm&quot;);
								
								$('.listBtn').click(function(e){
									e.preventDefault();
									actionForm.find(&quot;input[name='bno']&quot;).remove();
									actionForm.submit();
								});
								
								$('.modiBtn').click(function(e){
									e.preventDefault();
									actionForm.attr(&quot;action&quot;,&quot;/board/modify&quot;);
									actionForm.submit();
								});
								
								&amp;lt;/script&amp;gt;

                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
&amp;lt;%@include file=&quot;../include/footer.jsp&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1736749804564&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/modify&quot;)
	public String modify(BoardVO boardVO, RedirectAttributes redirectAttributes, Criteria criteria) {
		log.info(&quot;BoardController modify()......................&quot;);
		
		int count = boardService.modify(boardVO);
		
		if(count == 1) {
			redirectAttributes.addFlashAttribute(&quot;result&quot;, &quot;success&quot;);
		}
		
		redirectAttributes.addAttribute(&quot;pageNum&quot;,criteria.getPageNum());
		redirectAttributes.addAttribute(&quot;amount&quot;,criteria.getAmount());
		
		return &quot;redirect:/board/list&quot;;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;modify.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1736749816906&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Board Modify/Delete&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            Board Modify/Delete
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
                        &amp;lt;form&amp;gt;
                        	&amp;lt;input type=&quot;hidden&quot; name=&quot;pageNum&quot; value=&quot;${criteria.pageNum}&quot;&amp;gt;
                        	&amp;lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;${criteria.amount}&quot;&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;BNO&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;bno&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.bno}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Title&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; value=&quot;&amp;lt;c:out value='${boardVO.title}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Content&amp;lt;/label&amp;gt; &amp;lt;textarea rows=&quot;5&quot; cols=&quot;50&quot; class=&quot;form-control&quot; name=&quot;content&quot;&amp;gt;&amp;lt;c:out value='${boardVO.content}'/&amp;gt;&amp;lt;/textarea&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Writer&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;writer&quot; class=&quot;form-control&quot; value=&quot;&amp;lt;c:out value='${boardVO.writer}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
							 	&amp;lt;button class=&quot;btn btn-default&quot; data-oper='modify'&amp;gt;Modify&amp;lt;/button&amp;gt;
                                &amp;lt;button class=&quot;btn btn-danger&quot; data-oper='remove'&amp;gt;Remove&amp;lt;/button&amp;gt;
                                &amp;lt;button class=&quot;btn btn-info&quot; data-oper='list'&amp;gt;List&amp;lt;/button&amp;gt;
                        &amp;lt;/form&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;
	$(document).ready(function(){
		
		var formObj = $('form');
		
		$('.btn').click(function(e){
			
			e.preventDefault();
			
			var operation = $(this).data(&quot;oper&quot;);
			
			console.log(operation);
			
			if(operation === 'list'){
				self.location = &quot;/board/list&quot;;
			}else if(operation === 'remove'){
				formObj.attr(&quot;action&quot;, &quot;/board/remove&quot;).attr(&quot;method&quot;,&quot;post&quot;);
				formObj.submit();
			}else if(operation === 'modify'){
				formObj.attr(&quot;action&quot;, &quot;/board/modify&quot;).attr(&quot;method&quot;,&quot;post&quot;);
				formObj.submit();
			}
		})
		
		
	})
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&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;삭제 &amp;rarr; 삭제는 따로 할 필요는 없으나 이런 방법이 있다는 것을 알아두면 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1736750099798&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/remove&quot;)
	public String remove(@RequestParam(&quot;bno&quot;) Long bno, RedirectAttributes redirectAttributes, Criteria criteria) {
		log.info(&quot;BoardController remove()......................&quot;);
		
		int count = boardService.remove(bno);
		
		if(count == 1) {
			redirectAttributes.addFlashAttribute(&quot;result&quot;, &quot;success&quot;);
		}
		
		redirectAttributes.addAttribute(&quot;pageNum&quot;,criteria.getPageNum());
		redirectAttributes.addAttribute(&quot;amount&quot;,criteria.getAmount());
		
		return &quot;redirect:/board/list&quot;;
	}&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;total&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1736750266978&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	int getTotalCount(Criteria criteria); // 검색 조건을 Criteria로 넣기 위해서 파라미터로 Criteria를 넣어줌&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardMapper.XML&lt;/p&gt;
&lt;pre id=&quot;code_1736750342929&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;getTotalCount&quot; resultType=&quot;int&quot;&amp;gt;
		select count(bno) from tbl_board 
	&amp;lt;/select&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardService&lt;/p&gt;
&lt;pre id=&quot;code_1736750471855&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public int getTotal(Criteria criteria);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardServiceImpl&lt;/p&gt;
&lt;pre id=&quot;code_1736750501737&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@Override
	public int getTotal(Criteria criteria) {
		return boardMapper.getTotalCount(criteria);
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1736750591694&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/list&quot;)
	public void list(Model model, Criteria criteria) { 
		log.info(&quot;BoardController list()................&quot;);
		log.info(&quot;criteria : &quot; + criteria);
		model.addAttribute(&quot;list&quot;, boardService.getList(criteria));
		model.addAttribute(&quot;page&quot;, new PageDTO(criteria, boardService.getTotal(criteria)));
	}&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;1042&quot; data-origin-height=&quot;835&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1JxZF/btsLKvHPMxl/xG7Dod6k0yK9clV1SYBFW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1JxZF/btsLKvHPMxl/xG7Dod6k0yK9clV1SYBFW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1JxZF/btsLKvHPMxl/xG7Dod6k0yK9clV1SYBFW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1JxZF%2FbtsLKvHPMxl%2FxG7Dod6k0yK9clV1SYBFW0%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;1042&quot; height=&quot;835&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;835&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;제목, 내용, 작성자와 같은 단일 항목&lt;/li&gt;
&lt;li&gt;제목 + 내용, 제목 + 작성자와 같은 복합 항목&lt;/li&gt;
&lt;li&gt;검색 항목에 따라서 매번 다른 SQL이 처리될 필요가 있는 상황&lt;br /&gt;&amp;rarr; MyBatis의 동적 쿼리 기능을 이용해서 처리&lt;br /&gt;&lt;a href=&quot;https://mybatis.org/mybatis-3/dynamic-sql.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://mybatis.org/mybatis-3/dynamic-sql.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mybatis 동적 태그&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;if&lt;br /&gt;test라는 속성과 함께 특정한 조건이 true가 되었을 때 포함된 SQL을 사용하고자 할 때 작성&lt;/li&gt;
&lt;li&gt;choose(when, otherwise)&lt;br /&gt;if와 달리 여러 상황들 중 하나의 상황에서만 동작&lt;/li&gt;
&lt;li&gt;trim(where, set)&lt;br /&gt;단독으로 사용되지 않고, if, choose와 같은 태그들을 내포하고 있어 SQL들을 연결해주고, 앞 뒤에 필요한 구문들(and, or, where 등)을 추가하거나 생략하는 역할&lt;/li&gt;
&lt;li&gt;foreach&lt;br /&gt;List, Array, Map 등을 이용해서 루프를 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1736755506822&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.mapper;

import java.util.List;
import java.util.Map;

import org.zerock.domain.BoardVO;
import org.zerock.domain.Criteria;

public interface BoardMapper {

(...생략...)

	List&amp;lt;BoardVO&amp;gt; searchTest(Map&amp;lt;String, Map&amp;lt;String, String&amp;gt;&amp;gt; map);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardMapper.xml&lt;/p&gt;
&lt;pre id=&quot;code_1736755657100&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;getTotalCount&quot; resultType=&quot;int&quot;&amp;gt;
		select count(bno) from tbl_board 
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;searchTest&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt;
		&amp;lt;![CDATA[
		select * from tbl_board
		where
		]]&amp;gt;
		&amp;lt;foreach collection=&quot;map&quot; index=&quot;key&quot; item=&quot;value&quot;&amp;gt;
			#{key} #{value}
		&amp;lt;/foreach&amp;gt;
		&amp;lt;![CDATA[
			rownum &amp;lt; 10
		]]&amp;gt;
	&amp;lt;/select&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Key만 출력&lt;/p&gt;
&lt;pre id=&quot;code_1736755855121&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.mapper;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.domain.BoardVO;
import org.zerock.domain.Criteria;
import org.zerock.domain.PageDTO;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;)
@Log4j
public class BoardMapperTests {

(...생략...)

	@Test
	public void testSearch() {
		Map&amp;lt;String, String&amp;gt; map = new HashMap&amp;lt;String, String&amp;gt;();
		map.put(&quot;T&quot;, &quot;TTT&quot;);
		map.put(&quot;C&quot;, &quot;CCC&quot;);
		
		Map&amp;lt;String, Map&amp;lt;String, String&amp;gt;&amp;gt; outer = new HashMap&amp;lt;String, Map&amp;lt;String,String&amp;gt;&amp;gt;();
		outer.put(&quot;map&quot;, map);
		
		List&amp;lt;BoardVO&amp;gt; list = boardMapper.searchTest(outer);
		
		log.info(&quot;list.................. : &quot; + list);
	}
	
}&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;1462&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3dLo9/btsLMp0v578/GpEeML5aPjAFwSrRPI4ypk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3dLo9/btsLMp0v578/GpEeML5aPjAFwSrRPI4ypk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3dLo9/btsLMp0v578/GpEeML5aPjAFwSrRPI4ypk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3dLo9%2FbtsLMp0v578%2FGpEeML5aPjAFwSrRPI4ypk%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;1462&quot; height=&quot;914&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;914&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardMapper.xml&lt;/p&gt;
&lt;pre id=&quot;code_1736756088159&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;searchTest&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt;
		&amp;lt;![CDATA[
		select * from tbl_board
		where
		]]&amp;gt;
		&amp;lt;foreach collection=&quot;map&quot; index=&quot;key&quot; item=&quot;value&quot;&amp;gt;
			&amp;lt;if test=&quot;key == 'T'.toString()&quot;&amp;gt;
				title like #{value}
			&amp;lt;/if&amp;gt;
		&amp;lt;/foreach&amp;gt;
		&amp;lt;![CDATA[
			rownum &amp;lt; 10
		]]&amp;gt;
	&amp;lt;/select&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;1459&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tM3xq/btsLLOzCoT8/3br2QgzXzP77GLSMa6EnZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tM3xq/btsLLOzCoT8/3br2QgzXzP77GLSMa6EnZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tM3xq/btsLLOzCoT8/3br2QgzXzP77GLSMa6EnZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtM3xq%2FbtsLLOzCoT8%2F3br2QgzXzP77GLSMa6EnZ1%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;1459&quot; height=&quot;912&quot; data-origin-width=&quot;1459&quot; data-origin-height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1736756219709&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;searchTest&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt;
		&amp;lt;![CDATA[
		select * from tbl_board
		where
		]]&amp;gt;
		&amp;lt;trim suffix=&quot;and&quot;&amp;gt;
		&amp;lt;foreach collection=&quot;map&quot; index=&quot;key&quot; item=&quot;value&quot;&amp;gt;
			&amp;lt;if test=&quot;key == 'T'.toString()&quot;&amp;gt;
				title like #{value}
			&amp;lt;/if&amp;gt;
		&amp;lt;/foreach&amp;gt;
		&amp;lt;/trim&amp;gt;
		&amp;lt;![CDATA[
			rownum &amp;lt; 10
		]]&amp;gt;
	&amp;lt;/select&amp;gt;&lt;/code&gt;&lt;/pre&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;1467&quot; data-origin-height=&quot;911&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsmZFx/btsLLrdBLDl/qj54r7EJC7Eh0EhvG0JbKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsmZFx/btsLLrdBLDl/qj54r7EJC7Eh0EhvG0JbKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsmZFx/btsLLrdBLDl/qj54r7EJC7Eh0EhvG0JbKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsmZFx%2FbtsLLrdBLDl%2Fqj54r7EJC7Eh0EhvG0JbKK%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;1467&quot; height=&quot;911&quot; data-origin-width=&quot;1467&quot; data-origin-height=&quot;911&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1736756422980&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;searchTest&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt;
		&amp;lt;![CDATA[
		select * from tbl_board
		where
		]]&amp;gt;
		&amp;lt;trim suffix=&quot;and&quot;&amp;gt;
		&amp;lt;foreach collection=&quot;map&quot; index=&quot;key&quot; item=&quot;value&quot;&amp;gt;
			&amp;lt;if test=&quot;key == 'T'.toString()&quot;&amp;gt;
				title like #{value}
			&amp;lt;/if&amp;gt;
			&amp;lt;if test=&quot;key == 'C'.toString()&quot;&amp;gt;
				content like #{value}
			&amp;lt;/if&amp;gt;
			&amp;lt;if test=&quot;key == 'W'.toString()&quot;&amp;gt;
				writer like #{value}
			&amp;lt;/if&amp;gt;
		&amp;lt;/foreach&amp;gt;
		&amp;lt;/trim&amp;gt;
		&amp;lt;![CDATA[
			rownum &amp;lt; 10
		]]&amp;gt;
	&amp;lt;/select&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736756477480&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@Test
	public void testSearch() {
		Map&amp;lt;String, String&amp;gt; map = new HashMap&amp;lt;String, String&amp;gt;();
		map.put(&quot;T&quot;, &quot;TTT&quot;);
		map.put(&quot;C&quot;, &quot;CCC&quot;);
		map.put(&quot;W&quot;, &quot;WWW&quot;);
		
		Map&amp;lt;String, Map&amp;lt;String, String&amp;gt;&amp;gt; outer = new HashMap&amp;lt;String, Map&amp;lt;String,String&amp;gt;&amp;gt;();
		outer.put(&quot;map&quot;, map);
		
		List&amp;lt;BoardVO&amp;gt; list = boardMapper.searchTest(outer);
		
		log.info(&quot;list.................. : &quot; + list);
	}&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;1466&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bogMSm/btsLLscx9np/XL1o7rfAFYq1jex9g19VwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bogMSm/btsLLscx9np/XL1o7rfAFYq1jex9g19VwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bogMSm/btsLLscx9np/XL1o7rfAFYq1jex9g19VwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbogMSm%2FbtsLLscx9np%2FXL1o7rfAFYq1jex9g19VwK%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;1466&quot; height=&quot;912&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1736756522752&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;searchTest&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt;
		&amp;lt;![CDATA[
		select * from tbl_board
		where
		]]&amp;gt;
		&amp;lt;trim suffix=&quot;and&quot;&amp;gt;
		&amp;lt;foreach collection=&quot;map&quot; index=&quot;key&quot; item=&quot;value&quot; separator=&quot;OR&quot;&amp;gt;
			&amp;lt;if test=&quot;key == 'T'.toString()&quot;&amp;gt;
				title like #{value}
			&amp;lt;/if&amp;gt;
			&amp;lt;if test=&quot;key == 'C'.toString()&quot;&amp;gt;
				content like #{value}
			&amp;lt;/if&amp;gt;
			&amp;lt;if test=&quot;key == 'W'.toString()&quot;&amp;gt;
				writer like #{value}
			&amp;lt;/if&amp;gt;
		&amp;lt;/foreach&amp;gt;
		&amp;lt;/trim&amp;gt;
		&amp;lt;![CDATA[
			rownum &amp;lt; 10
		]]&amp;gt;
	&amp;lt;/select&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;1460&quot; data-origin-height=&quot;907&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cokcJa/btsLM5Ux0Lq/ezT8112UGa9QV5pnWmrpK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cokcJa/btsLM5Ux0Lq/ezT8112UGa9QV5pnWmrpK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cokcJa/btsLM5Ux0Lq/ezT8112UGa9QV5pnWmrpK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcokcJa%2FbtsLM5Ux0Lq%2FezT8112UGa9QV5pnWmrpK1%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;1460&quot; height=&quot;907&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;907&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1736756621782&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select * from tbl_board where content like 'CCC' OR title like 'TTT' OR writer like 'WWW'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선순위 때문에 or 조건은 괄호로 묶어줘야함&lt;/p&gt;
&lt;pre id=&quot;code_1736756664167&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;searchTest&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt;
		&amp;lt;![CDATA[
		select * from tbl_board
		where
		]]&amp;gt;
		&amp;lt;trim suffix=&quot;and&quot;&amp;gt;
		&amp;lt;foreach collection=&quot;map&quot; index=&quot;key&quot; item=&quot;value&quot; separator=&quot;OR&quot; open=&quot;(&quot; close=&quot;)&quot;&amp;gt;
			&amp;lt;if test=&quot;key == 'T'.toString()&quot;&amp;gt;
				title like #{value}
			&amp;lt;/if&amp;gt;
			&amp;lt;if test=&quot;key == 'C'.toString()&quot;&amp;gt;
				content like #{value}
			&amp;lt;/if&amp;gt;
			&amp;lt;if test=&quot;key == 'W'.toString()&quot;&amp;gt;
				writer like #{value}
			&amp;lt;/if&amp;gt;
		&amp;lt;/foreach&amp;gt;
		&amp;lt;/trim&amp;gt;
		&amp;lt;![CDATA[
			rownum &amp;lt; 10
		]]&amp;gt;
	&amp;lt;/select&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;1471&quot; data-origin-height=&quot;917&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz5miM/btsLKMvQa2u/qDXw01Y0G28MSDy4mUm7SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz5miM/btsLKMvQa2u/qDXw01Y0G28MSDy4mUm7SK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz5miM/btsLKMvQa2u/qDXw01Y0G28MSDy4mUm7SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz5miM%2FbtsLKMvQa2u%2FqDXw01Y0G28MSDy4mUm7SK%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;1471&quot; height=&quot;917&quot; data-origin-width=&quot;1471&quot; data-origin-height=&quot;917&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 조건이 없을 때&lt;/p&gt;
&lt;pre id=&quot;code_1736756751143&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@Test
	public void testSearch() {
		Map&amp;lt;String, String&amp;gt; map = new HashMap&amp;lt;String, String&amp;gt;();
		
		Map&amp;lt;String, Map&amp;lt;String, String&amp;gt;&amp;gt; outer = new HashMap&amp;lt;String, Map&amp;lt;String,String&amp;gt;&amp;gt;();
		outer.put(&quot;map&quot;, map);
		
		List&amp;lt;BoardVO&amp;gt; list = boardMapper.searchTest(outer);
		
		log.info(&quot;list.................. : &quot; + list);
	}&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;1462&quot; data-origin-height=&quot;911&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6BUYm/btsLKDlmi1A/VaBLHdTxoky6d7myd2GSV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6BUYm/btsLKDlmi1A/VaBLHdTxoky6d7myd2GSV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6BUYm/btsLKDlmi1A/VaBLHdTxoky6d7myd2GSV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6BUYm%2FbtsLKDlmi1A%2FVaBLHdTxoky6d7myd2GSV1%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;1462&quot; height=&quot;911&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;911&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1736756799395&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select * from tbl_board where rownum &amp;lt; 10&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;동적 SQL &amp;rarr; 확인 할 수 있는 것이 중요&lt;/p&gt;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/331</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-14#entry331comment</comments>
      <pubDate>Mon, 13 Jan 2025 17:27:17 +0900</pubDate>
    </item>
    <item>
      <title>스프링 웹 프로젝트 13</title>
      <link>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-13</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;PK와 인덱스&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;PK를 생성하면 자동으로 인덱스 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1505&quot; data-origin-height=&quot;841&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brcMaB/btsLKbu7SM4/MzJgQ3fEnFkOvvrfctUGc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brcMaB/btsLKbu7SM4/MzJgQ3fEnFkOvvrfctUGc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brcMaB/btsLKbu7SM4/MzJgQ3fEnFkOvvrfctUGc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrcMaB%2FbtsLKbu7SM4%2FMzJgQ3fEnFkOvvrfctUGc1%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;1505&quot; height=&quot;841&quot; data-origin-width=&quot;1505&quot; data-origin-height=&quot;841&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를 이용하기 위한 힌트&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;개발자의 의도를 힌트를 이용해서 전달&lt;/li&gt;
&lt;li&gt;힌트 구문은 잘못되어도 SQL 처리에 지장을 주지 않음&lt;/li&gt;
&lt;li&gt;여러 종류의 힌트가 존재 FULL/ INDEX_DESC, INDEX_ASC&lt;br /&gt;/*+ index_desc(tbl_board pk_board) */&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T2qfk/btsLJsEeBeA/WZ9fwbYXyZuu9ynJc7HoG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T2qfk/btsLJsEeBeA/WZ9fwbYXyZuu9ynJc7HoG1/img.png&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;764&quot; data-is-animation=&quot;false&quot; style=&quot;width: 28.9352%; margin-right: 10px;&quot; data-widthpercent=&quot;29.28&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T2qfk/btsLJsEeBeA/WZ9fwbYXyZuu9ynJc7HoG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT2qfk%2FbtsLJsEeBeA%2FWZ9fwbYXyZuu9ynJc7HoG1%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;825&quot; height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tXdqY/btsLK6GBTHy/mLH0XG6ozkiJkd2fexlr7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tXdqY/btsLK6GBTHy/mLH0XG6ozkiJkd2fexlr7K/img.png&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;437&quot; data-is-animation=&quot;false&quot; style=&quot;width: 69.902%;&quot; data-widthpercent=&quot;70.72&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tXdqY/btsLK6GBTHy/mLH0XG6ozkiJkd2fexlr7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtXdqY%2FbtsLK6GBTHy%2FmLH0XG6ozkiJkd2fexlr7K%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;1140&quot; height=&quot;437&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSppaT/btsLKHUFMLp/wkfEQwRW7T1nRWRT95mEQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSppaT/btsLKHUFMLp/wkfEQwRW7T1nRWRT95mEQk/img.png&quot; data-origin-width=&quot;1501&quot; data-origin-height=&quot;724&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;42.72&quot; style=&quot;width: 42.2231%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSppaT/btsLKHUFMLp/wkfEQwRW7T1nRWRT95mEQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSppaT%2FbtsLKHUFMLp%2FwkfEQwRW7T1nRWRT95mEQk%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;1501&quot; height=&quot;724&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mcwp1/btsLL5NM2IT/MLld6Qz3r6mRBYaDLoYGLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mcwp1/btsLL5NM2IT/MLld6Qz3r6mRBYaDLoYGLk/img.png&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;436&quot; data-is-animation=&quot;false&quot; style=&quot;width: 56.6141%;&quot; data-widthpercent=&quot;57.28&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mcwp1/btsLL5NM2IT/MLld6Qz3r6mRBYaDLoYGLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmcwp1%2FbtsLL5NM2IT%2FMLld6Qz3r6mRBYaDLoYGLk%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;1212&quot; height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/div&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;full 힌트&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PvKjo/btsLLAUXPRi/DstlsRWkbTbCvnLeW1asC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PvKjo/btsLLAUXPRi/DstlsRWkbTbCvnLeW1asC1/img.png&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;669&quot; data-is-animation=&quot;false&quot; style=&quot;width: 33.7342%; margin-right: 10px;&quot; data-widthpercent=&quot;34.13&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PvKjo/btsLLAUXPRi/DstlsRWkbTbCvnLeW1asC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPvKjo%2FbtsLLAUXPRi%2FDstlsRWkbTbCvnLeW1asC1%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;851&quot; height=&quot;669&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2DXNW/btsLKMO8zOJ/qZ9ndNFPKD2NhQRU7HkH70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2DXNW/btsLKMO8zOJ/qZ9ndNFPKD2NhQRU7HkH70/img.png&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;510&quot; data-is-animation=&quot;false&quot; style=&quot;width: 65.103%;&quot; data-widthpercent=&quot;65.87&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2DXNW/btsLKMO8zOJ/qZ9ndNFPKD2NhQRU7HkH70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2DXNW%2FbtsLKMO8zOJ%2FqZ9ndNFPKD2NhQRU7HkH70%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;1252&quot; height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index 힌트&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE10y5/btsLJlyt6uP/BvWG4Qv7eWuGnAuVG0JlW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE10y5/btsLJlyt6uP/BvWG4Qv7eWuGnAuVG0JlW0/img.png&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;706&quot; data-is-animation=&quot;false&quot; style=&quot;width: 33.4125%; margin-right: 10px;&quot; data-widthpercent=&quot;33.81&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE10y5/btsLJlyt6uP/BvWG4Qv7eWuGnAuVG0JlW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE10y5%2FbtsLJlyt6uP%2FBvWG4Qv7eWuGnAuVG0JlW0%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;770&quot; height=&quot;706&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2MTKK/btsLJWkKpkW/jFTKNdBRXjD4yhGm5AEkMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2MTKK/btsLJWkKpkW/jFTKNdBRXjD4yhGm5AEkMK/img.png&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;531&quot; data-is-animation=&quot;false&quot; style=&quot;width: 65.4247%;&quot; data-widthpercent=&quot;66.19&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2MTKK/btsLJWkKpkW/jFTKNdBRXjD4yhGm5AEkMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2MTKK%2FbtsLJWkKpkW%2FjFTKNdBRXjD4yhGm5AEkMK%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;1134&quot; height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 데이터가 많아질수록 order by를 이용하기보다는 index를 이용&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;rarr; 오라클의 경우 다른 db와 다름, 좀 더 복잡함 &amp;rarr; 실행계획에 따라서 어떻게 접근할지 결정됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※실행계획 : sql을 작성했을 때 데이터베이스에서 어떻게 처리할지 순서가 결정?&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;rownum과 인덱스&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;rownum 가상 테이터 같은 것(실제 데이터가 아님), 출력되면서 붙는 번호&lt;/li&gt;
&lt;li&gt;테이블에서 최종적으로 나오면서 붙이는 컬럼&lt;/li&gt;
&lt;li&gt;인덱스를 통해서 나오는지, full 스캔을 통하는지에 따라서 rownum이 다르게 나&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csyUKc/btsLJTO3Djg/7XSerbjbTxKETnUj8yIX0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csyUKc/btsLJTO3Djg/7XSerbjbTxKETnUj8yIX0K/img.png&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;697&quot; data-is-animation=&quot;false&quot; style=&quot;width: 41.6421%; margin-right: 10px;&quot; data-widthpercent=&quot;42.13&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csyUKc/btsLJTO3Djg/7XSerbjbTxKETnUj8yIX0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsyUKc%2FbtsLJTO3Djg%2F7XSerbjbTxKETnUj8yIX0K%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;463&quot; height=&quot;697&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byyPP6/btsLJTnVXT3/HwvO2AnWfGkMRLJRfP3JKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byyPP6/btsLJTnVXT3/HwvO2AnWfGkMRLJRfP3JKK/img.png&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;719&quot; data-is-animation=&quot;false&quot; style=&quot;width: 57.1951%;&quot; data-widthpercent=&quot;57.87&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byyPP6/btsLJTnVXT3/HwvO2AnWfGkMRLJRfP3JKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyyPP6%2FbtsLJTnVXT3%2FHwvO2AnWfGkMRLJRfP3JKK%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;656&quot; height=&quot;719&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/exe0nH/btsLKc1RDiJ/KaHcjMNcdM6SHKMmj2d7SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/exe0nH/btsLKc1RDiJ/KaHcjMNcdM6SHKMmj2d7SK/img.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;628&quot; data-is-animation=&quot;false&quot; style=&quot;width: 44.6803%; margin-right: 10px; margin-top: 10px;&quot; data-widthpercent=&quot;45.21&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/exe0nH/btsLKc1RDiJ/KaHcjMNcdM6SHKMmj2d7SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fexe0nH%2FbtsLKc1RDiJ%2FKaHcjMNcdM6SHKMmj2d7SK%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;700&quot; height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZVhCF/btsLLAAGcFz/9yyFkFpVfSrCMCBPMGvaE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZVhCF/btsLLAAGcFz/9yyFkFpVfSrCMCBPMGvaE0/img.png&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;658&quot; data-is-animation=&quot;false&quot; style=&quot;width: 54.1569%; margin-top: 10px;&quot; data-widthpercent=&quot;54.79&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZVhCF/btsLLAAGcFz/9yyFkFpVfSrCMCBPMGvaE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZVhCF%2FbtsLLAAGcFz%2F9yyFkFpVfSrCMCBPMGvaE0%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;889&quot; height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index &amp;rarr; 가장 높은 번호가 가장 먼저 테이블에서 접근이 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지를 위해서는 아래의 SQL을 이용해야함&lt;/p&gt;
&lt;pre id=&quot;code_1736659396843&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select /*+ index_desc(tbl_board pk_board) */ rownum, bno, title from tbl_board where bno&amp;gt;0 and rownum &amp;lt;= 10;&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;821&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nS2zu/btsLK5VgEwG/TkjFwDPZGGMgDVMDRqW6I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nS2zu/btsLK5VgEwG/TkjFwDPZGGMgDVMDRqW6I1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nS2zu/btsLK5VgEwG/TkjFwDPZGGMgDVMDRqW6I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnS2zu%2FbtsLK5VgEwG%2FTkjFwDPZGGMgDVMDRqW6I1%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;821&quot; height=&quot;348&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위는 1페이지에 해당할 것이다. 그렇다면 2페이지는?&lt;/p&gt;
&lt;pre id=&quot;code_1736659618555&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select /*+ index_desc(tbl_board pk_board) */ rownum, bno, title from tbl_board where bno&amp;gt;0 and rownum &amp;gt;= 11 and rownum &amp;lt;=20;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 작성하고 조회를 해보면 아무것도 뜨지 않음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1155&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GOK0I/btsLJ6nbhUS/e0YEnQ6wG6oyXmLjd305Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GOK0I/btsLJ6nbhUS/e0YEnQ6wG6oyXmLjd305Ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GOK0I/btsLJ6nbhUS/e0YEnQ6wG6oyXmLjd305Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGOK0I%2FbtsLJ6nbhUS%2Fe0YEnQ6wG6oyXmLjd305Ok%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;1155&quot; height=&quot;558&quot; data-origin-width=&quot;1155&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FILTER에서 맞는 데이터가 하나도 없기 때문임&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTq9Jh/btsLJ9qDPik/j25EAKK3ouED2n0jKTkuQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTq9Jh/btsLJ9qDPik/j25EAKK3ouED2n0jKTkuQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTq9Jh/btsLJ9qDPik/j25EAKK3ouED2n0jKTkuQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTq9Jh%2FbtsLJ9qDPik%2Fj25EAKK3ouED2n0jKTkuQK%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;917&quot; height=&quot;506&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8iH1U/btsLK7leDLY/xaVkV2OKwtOOfRaaelzhj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8iH1U/btsLK7leDLY/xaVkV2OKwtOOfRaaelzhj1/img.png&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;533&quot; data-is-animation=&quot;false&quot; style=&quot;width: 40.5602%; margin-right: 10px;&quot; data-widthpercent=&quot;41.04&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8iH1U/btsLK7leDLY/xaVkV2OKwtOOfRaaelzhj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8iH1U%2FbtsLK7leDLY%2FxaVkV2OKwtOOfRaaelzhj1%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;1006&quot; height=&quot;533&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwHriy/btsLKaXhYrM/DInsinG9m6kUren9c9nRv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwHriy/btsLKaXhYrM/DInsinG9m6kUren9c9nRv1/img.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;354&quot; data-is-animation=&quot;false&quot; style=&quot;width: 58.277%;&quot; data-widthpercent=&quot;58.96&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwHriy/btsLKaXhYrM/DInsinG9m6kUren9c9nRv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwHriy%2FbtsLKaXhYrM%2FDInsinG9m6kUren9c9nRv1%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;960&quot; height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;from에 인라인뷰(select 문을 테이블 값을 들고오는 테이블로 사용 ) &amp;rarr; 거기에 조건을 넣어줌&lt;/p&gt;
&lt;pre id=&quot;code_1736660137504&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select *
from (select /*+ index_desc(tbl_board pk_board) */ rownum rn, bno, title from tbl_board where bno&amp;gt;0 and rownum &amp;gt;0 and rownum &amp;lt;=20)
where rn &amp;gt;10;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1736660708943&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.domain;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class Criteria {

	private int pageNum; // 페이지
	private int amount; // 개수

	public Criteria() {
		this(1,10); // 초기값
	}

	public Criteria(int pageNum, int amount) {
		super();
		this.pageNum = pageNum;
		this.amount = amount;
	}
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736660730032&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
	PUBLIC &quot;-//mybatis.org/DTD Mapper 3.0//EN&quot;
	&quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;

&amp;lt;mapper namespace=&quot;org.zerock.mapper.BoardMapper&quot;&amp;gt;

(...생략...)

	&amp;lt;select id=&quot;getListWithPaging&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt; &amp;lt;!-- xml에서 부등호처리 &amp;rarr; cdata --&amp;gt;
		&amp;lt;![CDATA[  
		select *
		from (select /*+ index_desc(tbl_board pk_board) */ rownum rn, bno, title from tbl_board where bno&amp;gt;0 and rownum &amp;gt; 0 and rownum &amp;lt;= (2 * 10))
		where rn &amp;gt; (2-1) *10
		]]&amp;gt;
	&amp;lt;/select&amp;gt;
	
&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736661009039&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.mapper;

import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.domain.BoardVO;
import org.zerock.domain.Criteria;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;)
@Log4j
public class BoardMapperTests {

	@Autowired
	private BoardMapper boardMapper;
	
(...생략...)

	@Test
	public void testPaging() {
		Criteria criteria = new Criteria(); // 1 페이지에 10개
		List&amp;lt;BoardVO&amp;gt; list = boardMapper.getListWithPaging(criteria);
		for(int i = 0; i &amp;lt; list.size(); i++) {
			log.info(list);
		}
	}
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lnPNp/btsLK1ekcDx/h0RKXJA3khYwbzkSKA5S4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lnPNp/btsLK1ekcDx/h0RKXJA3khYwbzkSKA5S4k/img.png&quot; data-origin-width=&quot;1461&quot; data-origin-height=&quot;356&quot; data-is-animation=&quot;false&quot; style=&quot;width: 58.637%; margin-right: 10px;&quot; data-widthpercent=&quot;59.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lnPNp/btsLK1ekcDx/h0RKXJA3khYwbzkSKA5S4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlnPNp%2FbtsLK1ekcDx%2Fh0RKXJA3khYwbzkSKA5S4k%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;1461&quot; height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGS61s/btsLJEkhHez/3kOmHKCkpe9utkj4TwoPHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGS61s/btsLJEkhHez/3kOmHKCkpe9utkj4TwoPHK/img.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;354&quot; data-is-animation=&quot;false&quot; style=&quot;width: 40.2002%;&quot; data-widthpercent=&quot;40.67&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGS61s/btsLJEkhHez/3kOmHKCkpe9utkj4TwoPHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGS61s%2FbtsLJEkhHez%2F3kOmHKCkpe9utkj4TwoPHK%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;996&quot; height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일치 &amp;rarr; BoardMapper 수정&lt;/p&gt;
&lt;pre id=&quot;code_1736661074497&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
	PUBLIC &quot;-//mybatis.org/DTD Mapper 3.0//EN&quot;
	&quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;

&amp;lt;mapper namespace=&quot;org.zerock.mapper.BoardMapper&quot;&amp;gt;

(...생략...)
	
	&amp;lt;select id=&quot;getListWithPaging&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt; &amp;lt;!-- xml에서 부등호처리 &amp;rarr; cdata --&amp;gt;
		&amp;lt;![CDATA[  
		select *
		from (select /*+ index_desc(tbl_board pk_board) */ rownum rn, bno, title from tbl_board where bno&amp;gt;0 and rownum &amp;gt; 0 and rownum &amp;lt;= (#{pageNum} * #{amount}))
		where rn &amp;gt; (#{pageNum}-1) * #{amount}
		]]&amp;gt;
	&amp;lt;/select&amp;gt;
	
&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 후 다시 테스트&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/82nBz/btsLLtIp44U/FAM5lSU4gkIlzQ1Rxgfiok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/82nBz/btsLLtIp44U/FAM5lSU4gkIlzQ1Rxgfiok/img.png&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;911&quot; data-is-animation=&quot;false&quot; style=&quot;width: 27.6433%; margin-right: 10px;&quot; data-widthpercent=&quot;27.97&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/82nBz/btsLLtIp44U/FAM5lSU4gkIlzQ1Rxgfiok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F82nBz%2FbtsLLtIp44U%2FFAM5lSU4gkIlzQ1Rxgfiok%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;1464&quot; height=&quot;911&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM0rYY/btsLLP5w4ik/ehoID6MUBGD8tdBq1tW7pK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM0rYY/btsLLP5w4ik/ehoID6MUBGD8tdBq1tW7pK/img.png&quot; data-origin-width=&quot;1461&quot; data-origin-height=&quot;353&quot; data-is-animation=&quot;false&quot; style=&quot;width: 71.1939%;&quot; data-widthpercent=&quot;72.03&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM0rYY/btsLLP5w4ik/ehoID6MUBGD8tdBq1tW7pK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM0rYY%2FbtsLLP5w4ik%2FehoID6MUBGD8tdBq1tW7pK%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;1461&quot; height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/div&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;/p&gt;
&lt;pre id=&quot;code_1736661282497&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.service;

import java.util.List;

import org.zerock.domain.BoardVO;
import org.zerock.domain.Criteria;

public interface BoardService { // 고객과 의사소통하는 용어로 사용하기 때문에 변수명을 주의

//	public void register(BoardVO boardVO);

	public Long register(BoardVO boardVO);
	
	public BoardVO get(Long bno);
	
	public int modify(BoardVO boardVO);
	
	public int remove(Long bno);
	
	public List&amp;lt;BoardVO&amp;gt; getList();

	public List&amp;lt;BoardVO&amp;gt; getList(Criteria criteria); // 오버로딩
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736661340024&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.service;

import java.util.List;

import org.springframework.stereotype.Service;
import org.zerock.domain.BoardVO;
import org.zerock.domain.Criteria;
import org.zerock.mapper.BoardMapper;

import lombok.RequiredArgsConstructor;
import lombok.ToString;
import lombok.extern.log4j.Log4j;

@Service
@Log4j
@RequiredArgsConstructor
@ToString
public class BoardSeriveImpl implements BoardService{ // 인터페이스를 사용 : 실제 객체가 무엇인지 몰라도 타입만 보고 코딩할 수 있게 하기 위해서
	
	private final BoardMapper boardMapper; // @RequiredArgsConstructor + final =&amp;gt; 자동 주입

//	@Override
//	public void register(BoardVO boardVO) {
//		boardMapper.insert(boardVO);
//	}

	@Override
	public Long register(BoardVO boardVO) {
		boardMapper.insertSelectKey(boardVO);
		return boardVO.getBno();
	}
	
	@Override
	public BoardVO get(Long bno) {
		return boardMapper.read(bno);
	}

	@Override
	public int modify(BoardVO boardVO) {
		return boardMapper.update(boardVO);
	}

	@Override
	public int remove(Long bno) {
		return boardMapper.delete(bno);
	}

	@Override
	public List&amp;lt;BoardVO&amp;gt; getList() {
		return boardMapper.getList();
	}

	@Override
	public List&amp;lt;BoardVO&amp;gt; getList(Criteria criteria) {
		return boardMapper.getListWithPaging(criteria);
	}
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736661417978&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.zerock.domain.BoardVO;
import org.zerock.domain.Criteria;
import org.zerock.service.BoardService;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@RequestMapping(&quot;/board/*&quot;)
@RequiredArgsConstructor
@Log4j
public class BoardController {

	private final BoardService boardService;
	
//	@GetMapping(&quot;/list&quot;)
//	public void list(Model model) { // Model 전달 당시에는 없는데 화면에 추가적인 데이터가 필요한 경우 사용
//		log.info(&quot;BoardController list()................&quot;);
//		model.addAttribute(&quot;list&quot;, boardService.getList());
//	}
	@GetMapping(&quot;/list&quot;)
	public void list(Model model, Criteria criteria) { 
		log.info(&quot;BoardController list()................&quot;);
		log.info(&quot;criteria : &quot; + criteria);
		model.addAttribute(&quot;list&quot;, boardService.getList(criteria));
	}
	
	@GetMapping(&quot;/register&quot;)
	public void registerGet() {
		log.info(&quot;BoardController regsterGet()............&quot;);
	}
	
	@PostMapping(&quot;/register&quot;)
	public String register(BoardVO boardVO, RedirectAttributes redirectAttributes) {
		log.info(&quot;BoardController register()....................&quot;);
		boardService.register(boardVO);
		log.info(&quot;register : &quot; + boardVO);
		redirectAttributes.addFlashAttribute(&quot;result&quot;, boardVO.getBno()); // addFlashAttribute 잠깐 결과를 보내는 방식
		// ※ redirectAttributes.addAttribute(&quot;result : &quot; + boardVO.getBno()) // 브라우저의 링크와 같이 연결, list?bno= 이런 형식으로 할 때 쓰임
		
		return &quot;redirect:/board/list&quot;;
	}
	
	@PostMapping(&quot;/modify&quot;)
	public String modify(BoardVO boardVO, RedirectAttributes redirectAttributes) {
		log.info(&quot;BoardController modify()......................&quot;);
		
		int count = boardService.modify(boardVO);
		
		if(count == 1) {
			redirectAttributes.addFlashAttribute(&quot;result&quot;, &quot;success&quot;);
		}
		return &quot;redirect:/board/list&quot;;
	}
	
	@PostMapping(&quot;/remove&quot;)
	public String remove(@RequestParam(&quot;bno&quot;) Long bno, RedirectAttributes redirectAttributes) {
		log.info(&quot;BoardController remove()......................&quot;);
		
		int count = boardService.remove(bno);
		
		if(count == 1) {
			redirectAttributes.addFlashAttribute(&quot;result&quot;, &quot;success&quot;);
		}
		return &quot;redirect:/board/list&quot;;
	}
	
	@GetMapping({&quot;/get&quot;, &quot;/modify&quot;})
	public void get(@RequestParam(&quot;bno&quot;) Long bno,Model model) {
		model.addAttribute(&quot;boardVO&quot;, boardService.get(bno));
	}
	
}&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;951&quot; data-origin-height=&quot;878&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lf5sN/btsLJAWwPNH/TMeeIkCr02ZgGqWdiZW110/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lf5sN/btsLJAWwPNH/TMeeIkCr02ZgGqWdiZW110/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lf5sN/btsLJAWwPNH/TMeeIkCr02ZgGqWdiZW110/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flf5sN%2FbtsLJAWwPNH%2FTMeeIkCr02ZgGqWdiZW110%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;951&quot; height=&quot;878&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;878&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mapper에서 작성자, 작성일, 수정일을 들고오지 않음&lt;/p&gt;
&lt;pre id=&quot;code_1736661539449&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
	PUBLIC &quot;-//mybatis.org/DTD Mapper 3.0//EN&quot;
	&quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;

&amp;lt;mapper namespace=&quot;org.zerock.mapper.BoardMapper&quot;&amp;gt;

(...생략...)
	
	&amp;lt;select id=&quot;getListWithPaging&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt; &amp;lt;!-- xml에서 부등호처리 &amp;rarr; cdata --&amp;gt;
		&amp;lt;![CDATA[  
		select *
		from (select /*+ index_desc(tbl_board pk_board) */ rownum rn, bno, title, writer, regdate,updateDate from tbl_board where bno&amp;gt;0 and rownum &amp;gt; 0 and rownum &amp;lt;= (#{pageNum} * #{amount}))
		where rn &amp;gt; (#{pageNum}-1) * #{amount}
		]]&amp;gt;
	&amp;lt;/select&amp;gt;
	
&amp;lt;/mapper&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;956&quot; data-origin-height=&quot;875&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctr5ZS/btsLJCUj91q/ue2dC6SMRahL2D6n9h7xj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctr5ZS/btsLJCUj91q/ue2dC6SMRahL2D6n9h7xj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctr5ZS/btsLJCUj91q/ue2dC6SMRahL2D6n9h7xj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fctr5ZS%2FbtsLJCUj91q%2Fue2dC6SMRahL2D6n9h7xj0%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;956&quot; height=&quot;875&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;875&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;JSP 처리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;BoardController/BoardService/BoardServiceImpl 처리&lt;/li&gt;
&lt;li&gt;list.jsp 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지 처리에 필요한 정보&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;현재 페이지 번호(page) &amp;rarr; Criteria&lt;/li&gt;
&lt;li&gt;이전과 다음으로 이동 가능한 링크의 표시 여부(prev, next)&lt;/li&gt;
&lt;li&gt;화면에서 보여지는 페이지의 시작 번호와 끝 번호(startPage, endPage)&lt;br /&gt;startPage = endPage - 9&lt;br /&gt;endPage = (int)(Math.ceil(page/10.0))*10&lt;br /&gt;&lt;br /&gt;total을 통한 endPage의 재계산&lt;br /&gt;realEnd = (int)(Math.ceil((total * 1.0) / amount))&lt;br /&gt;if(realEnd &amp;lt; endPage){&lt;br /&gt;&amp;nbsp; &amp;nbsp; endPage = realEnd&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;※끝 페이지에서 계산하는 것이 더 편함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1736662793360&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.domain;

import lombok.Getter;
import lombok.ToString;

@ToString
@Getter
public class PageDTO {

	private int startPage, endPage;
	private boolean prev, next;
	
	private int total;
	private Criteria criteria;
	
	public PageDTO(Criteria criteria, int total) {
		this.criteria = criteria;
		this.total = total;
		
		// 계산
		this.endPage = (int)(Math.ceil(criteria.getPageNum()/10.0)) * 10; 
		
		this.startPage = endPage - 9;
		
		this.prev = this.startPage &amp;gt; 1;
		
		int realEnd = (int)(Math.ceil((total * 1.0) / criteria.getAmount()));
		
		this.endPage = (realEnd &amp;lt; endPage) ? realEnd : endPage;
		
		this.next = this.endPage &amp;lt; realEnd;
	}
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736663095910&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.mapper;

import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.domain.BoardVO;
import org.zerock.domain.Criteria;
import org.zerock.domain.PageDTO;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;)
@Log4j
public class BoardMapperTests {

	@Autowired
	private BoardMapper boardMapper;
	
(...생략...)

	@Test
	public void testPageDTO() {
		Criteria criteria = new Criteria(); 
		PageDTO pageDTO = new PageDTO(criteria, 1376395);
		log.info(pageDTO);
	}
	
}&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;1440&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx1f4f/btsLLQDpodY/UUeVxf1DL2LZLaHb0m7h30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx1f4f/btsLLQDpodY/UUeVxf1DL2LZLaHb0m7h30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx1f4f/btsLLQDpodY/UUeVxf1DL2LZLaHb0m7h30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx1f4f%2FbtsLLQDpodY%2FUUeVxf1DL2LZLaHb0m7h30%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;1440&quot; height=&quot;585&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에 전달(아직까지 total은 들고오지 않음)&lt;/p&gt;
&lt;pre id=&quot;code_1736663351930&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.zerock.domain.BoardVO;
import org.zerock.domain.Criteria;
import org.zerock.domain.PageDTO;
import org.zerock.service.BoardService;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@RequestMapping(&quot;/board/*&quot;)
@RequiredArgsConstructor
@Log4j
public class BoardController {

	private final BoardService boardService;
	
//	@GetMapping(&quot;/list&quot;)
//	public void list(Model model) { // Model 전달 당시에는 없는데 화면에 추가적인 데이터가 필요한 경우 사용
//		log.info(&quot;BoardController list()................&quot;);
//		model.addAttribute(&quot;list&quot;, boardService.getList());
//	}
	@GetMapping(&quot;/list&quot;)
	public void list(Model model, Criteria criteria) { 
		log.info(&quot;BoardController list()................&quot;);
		log.info(&quot;criteria : &quot; + criteria);
		model.addAttribute(&quot;list&quot;, boardService.getList(criteria));
		model.addAttribute(&quot;page&quot;, new PageDTO(criteria, 123));
	}

(...생략...)

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list.jsp에 model 출력&lt;/p&gt;
&lt;pre id=&quot;code_1736663430070&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Tables&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            DataTables Advanced Tables
                            &amp;lt;button id=&quot;regBtn&quot; type=&quot;button&quot; class=&quot;btn btn-xs pull-right&quot;&amp;gt;Register New Board&amp;lt;/button&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
                            &amp;lt;table width=&quot;100%&quot; class=&quot;table table-striped table-bordered table-hover&quot;&amp;gt;
                                &amp;lt;thead&amp;gt;
                                    &amp;lt;tr&amp;gt;
                                        &amp;lt;th&amp;gt;#번호&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;수정일&amp;lt;/th&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/thead&amp;gt;
                                &amp;lt;tbody&amp;gt;
                                &amp;lt;c:forEach items=&quot;${list}&quot; var=&quot;boardVO&quot;&amp;gt;
                                    &amp;lt;tr class=&quot;odd gradeX&quot;&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.bno}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;a href=&quot;/board/get?bno=&amp;lt;c:out value='${boardVO.bno}' /&amp;gt;&quot;&amp;gt;&amp;lt;c:out value=&quot;${boardVO.title}&quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.writer}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.regdate }&quot; pattern=&quot;yyyy-MM-dd&quot;/&amp;gt; &amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.updateDate }&quot; pattern=&quot;yyyy-MM-dd&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/c:forEach&amp;gt;
                                &amp;lt;/tbody&amp;gt;
                            &amp;lt;/table&amp;gt;
                            &amp;lt;!-- /.table-responsive --&amp;gt;
                            
                            &amp;lt;h3&amp;gt;${page}&amp;lt;/h3&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;959&quot; data-origin-height=&quot;872&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/skjQD/btsLJCtgnAB/hbqVWatKlSmYru28lU0YC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/skjQD/btsLJCtgnAB/hbqVWatKlSmYru28lU0YC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/skjQD/btsLJCtgnAB/hbqVWatKlSmYru28lU0YC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FskjQD%2FbtsLJCtgnAB%2FhbqVWatKlSmYru28lU0YC0%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;959&quot; height=&quot;872&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;872&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;957&quot; data-origin-height=&quot;871&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PeAcv/btsLLSVpwYk/tD27dsk9isxBbldglFAfq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PeAcv/btsLLSVpwYk/tD27dsk9isxBbldglFAfq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PeAcv/btsLLSVpwYk/tD27dsk9isxBbldglFAfq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPeAcv%2FbtsLLSVpwYk%2FtD27dsk9isxBbldglFAfq1%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;957&quot; height=&quot;871&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;871&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1736663688632&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Tables&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            DataTables Advanced Tables
                            &amp;lt;button id=&quot;regBtn&quot; type=&quot;button&quot; class=&quot;btn btn-xs pull-right&quot;&amp;gt;Register New Board&amp;lt;/button&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
                            &amp;lt;table width=&quot;100%&quot; class=&quot;table table-striped table-bordered table-hover&quot;&amp;gt;
                                &amp;lt;thead&amp;gt;
                                    &amp;lt;tr&amp;gt;
                                        &amp;lt;th&amp;gt;#번호&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;수정일&amp;lt;/th&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/thead&amp;gt;
                                &amp;lt;tbody&amp;gt;
                                &amp;lt;c:forEach items=&quot;${list}&quot; var=&quot;boardVO&quot;&amp;gt;
                                    &amp;lt;tr class=&quot;odd gradeX&quot;&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.bno}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;a href=&quot;/board/get?bno=&amp;lt;c:out value='${boardVO.bno}' /&amp;gt;&quot;&amp;gt;&amp;lt;c:out value=&quot;${boardVO.title}&quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.writer}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.regdate }&quot; pattern=&quot;yyyy-MM-dd&quot;/&amp;gt; &amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.updateDate }&quot; pattern=&quot;yyyy-MM-dd&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/c:forEach&amp;gt;
                                &amp;lt;/tbody&amp;gt;
                            &amp;lt;/table&amp;gt;
                            &amp;lt;!-- /.table-responsive --&amp;gt;
                            
                            &amp;lt;h3&amp;gt;${page}&amp;lt;/h3&amp;gt;
                            &amp;lt;div class=&quot;pull-right&quot;&amp;gt;
                            	&amp;lt;ul&amp;gt;
									&amp;lt;c:forEach begin=&quot;${page.startPage}&quot; end=&quot;${page.endPage}&quot; var=&quot;num&quot;&amp;gt;
										&amp;lt;li&amp;gt;${num}&amp;lt;/li&amp;gt;
									&amp;lt;/c:forEach&amp;gt;                            	
                            	&amp;lt;/ul&amp;gt;
                            &amp;lt;/div&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;939&quot; data-origin-height=&quot;871&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B5Asz/btsLJCGNivJ/Rrfq5GkWT9MdYj5TtQn1I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B5Asz/btsLJCGNivJ/Rrfq5GkWT9MdYj5TtQn1I1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B5Asz/btsLJCGNivJ/Rrfq5GkWT9MdYj5TtQn1I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB5Asz%2FbtsLJCGNivJ%2FRrfq5GkWT9MdYj5TtQn1I1%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;939&quot; height=&quot;871&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;871&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지 번호 링크 부트스트랩을 이용 list.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1736663906805&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(...생략...)
                            &amp;lt;h3&amp;gt;${page}&amp;lt;/h3&amp;gt;
                            &amp;lt;div class=&quot;pull-right&quot;&amp;gt;
                            	&amp;lt;ul class=&quot;pagination&quot;&amp;gt; 
									&amp;lt;c:forEach begin=&quot;${page.startPage}&quot; end=&quot;${page.endPage}&quot; var=&quot;num&quot;&amp;gt;
										&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;#&quot;&amp;gt;${num}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:forEach&amp;gt;                            	
                            	&amp;lt;/ul&amp;gt;
                            &amp;lt;/div&amp;gt;
(...생략...)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rcGBL/btsLLAOdfud/6qPNVk2woxmGGNte7A08Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rcGBL/btsLLAOdfud/6qPNVk2woxmGGNte7A08Q0/img.png&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;869&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.6637%; margin-right: 10px;&quot; data-widthpercent=&quot;51.26&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rcGBL/btsLLAOdfud/6qPNVk2woxmGGNte7A08Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrcGBL%2FbtsLLAOdfud%2F6qPNVk2woxmGGNte7A08Q0%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;952&quot; height=&quot;869&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wrmKa/btsLLQwAc6S/zFssjQ1RO6RKl2eoYB9dLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wrmKa/btsLLQwAc6S/zFssjQ1RO6RKl2eoYB9dLK/img.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;912&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.1735%;&quot; data-widthpercent=&quot;48.74&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wrmKa/btsLLQwAc6S/zFssjQ1RO6RKl2eoYB9dLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwrmKa%2FbtsLLQwAc6S%2FzFssjQ1RO6RKl2eoYB9dLK%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;950&quot; height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prev, next 버튼&lt;/p&gt;
&lt;pre id=&quot;code_1736664170870&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(...생략...)
                            &amp;lt;h4&amp;gt;${page}&amp;lt;/h4&amp;gt;
                            &amp;lt;div class=&quot;pull-right&quot;&amp;gt;
                            	&amp;lt;ul class=&quot;pagination&quot;&amp;gt; 
								    &amp;lt;li class=&quot;page-item disabled&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;#&quot; tabindex=&quot;-1&quot;&amp;gt;Previous&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;c:forEach begin=&quot;${page.startPage}&quot; end=&quot;${page.endPage}&quot; var=&quot;num&quot;&amp;gt;
										&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;#&quot;&amp;gt;${num}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:forEach&amp;gt;                            	
								    &amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;#&quot;&amp;gt;Next&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                            	&amp;lt;/ul&amp;gt;
                            &amp;lt;/div&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;950&quot; data-origin-height=&quot;905&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rYCcD/btsLMbHc6u9/THjyrOe8DTsSkR7dj62T8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rYCcD/btsLMbHc6u9/THjyrOe8DTsSkR7dj62T8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rYCcD/btsLMbHc6u9/THjyrOe8DTsSkR7dj62T8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrYCcD%2FbtsLMbHc6u9%2FTHjyrOe8DTsSkR7dj62T8k%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;950&quot; height=&quot;905&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;905&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Previous, Next list.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1736667432279&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(...생략...)
                            &amp;lt;h4&amp;gt;${page}&amp;lt;/h4&amp;gt;
                            &amp;lt;div class=&quot;pull-right&quot;&amp;gt;
                            	&amp;lt;ul class=&quot;pagination&quot;&amp;gt;
                            		&amp;lt;c:if test=&quot;${page.prev}&quot;&amp;gt; 
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;#&quot; tabindex=&quot;-1&quot;&amp;gt;Previous&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:if&amp;gt;
									&amp;lt;c:forEach begin=&quot;${page.startPage}&quot; end=&quot;${page.endPage}&quot; var=&quot;num&quot;&amp;gt;
										&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;#&quot;&amp;gt;${num}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:forEach&amp;gt;                
									&amp;lt;c:if test=&quot;${page.next}&quot;&amp;gt;            	
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;#&quot;&amp;gt;Next&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                            		&amp;lt;/c:if&amp;gt;
                            	&amp;lt;/ul&amp;gt;
                            &amp;lt;/div&amp;gt;
(...생략...)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BW2HG/btsLJhQmReM/DkrgveW5kCqvHV1vs1tDVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BW2HG/btsLJhQmReM/DkrgveW5kCqvHV1vs1tDVk/img.png&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;916&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.5219%; margin-right: 10px;&quot; data-widthpercent=&quot;50.1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BW2HG/btsLJhQmReM/DkrgveW5kCqvHV1vs1tDVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBW2HG%2FbtsLJhQmReM%2FDkrgveW5kCqvHV1vs1tDVk%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;959&quot; height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LczhI/btsLLC6lqHC/lc9dRiRYYPXzUIohhB4KH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LczhI/btsLLC6lqHC/lc9dRiRYYPXzUIohhB4KH1/img.png&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;916&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.3153%;&quot; data-widthpercent=&quot;49.9&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LczhI/btsLLC6lqHC/lc9dRiRYYPXzUIohhB4KH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLczhI%2FbtsLLC6lqHC%2Flc9dRiRYYPXzUIohhB4KH1%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;955&quot; height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 아래 사진과 같은 작업&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;289&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cM8NTH/btsLJsYvXCx/drM242GcF7oURpmmvhsIkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cM8NTH/btsLJsYvXCx/drM242GcF7oURpmmvhsIkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cM8NTH/btsLJsYvXCx/drM242GcF7oURpmmvhsIkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcM8NTH%2FbtsLJsYvXCx%2FdrM242GcF7oURpmmvhsIkk%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;289&quot; height=&quot;87&quot; data-origin-width=&quot;289&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1736667641418&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(...생략...)
 &amp;lt;h4&amp;gt;${page}&amp;lt;/h4&amp;gt;
                            &amp;lt;div class=&quot;pull-right&quot;&amp;gt;
                            	&amp;lt;ul class=&quot;pagination&quot;&amp;gt;
                            		&amp;lt;c:if test=&quot;${page.prev}&quot;&amp;gt; 
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;#&quot; tabindex=&quot;-1&quot;&amp;gt;Previous&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:if&amp;gt;
									&amp;lt;c:forEach begin=&quot;${page.startPage}&quot; end=&quot;${page.endPage}&quot; var=&quot;num&quot;&amp;gt;
										&amp;lt;li class=&quot;page-item ${page.criteria.pageNum == num? 'active' :''}&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;#&quot;&amp;gt;${num}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
									&amp;lt;/c:forEach&amp;gt;                
									&amp;lt;c:if test=&quot;${page.next}&quot;&amp;gt;            	
								    	&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;#&quot;&amp;gt;Next&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                            		&amp;lt;/c:if&amp;gt;
                            	&amp;lt;/ul&amp;gt;
                            &amp;lt;/div&amp;gt;
(...생략...)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SjXXE/btsLJtQGUXZ/OnKsNAC6Q4SxpK1RuUoiRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SjXXE/btsLJtQGUXZ/OnKsNAC6Q4SxpK1RuUoiRk/img.png&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;906&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.7671%; margin-right: 10px;&quot; data-widthpercent=&quot;50.35&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SjXXE/btsLJtQGUXZ/OnKsNAC6Q4SxpK1RuUoiRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSjXXE%2FbtsLJtQGUXZ%2FOnKsNAC6Q4SxpK1RuUoiRk%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;961&quot; height=&quot;906&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nq3V8/btsLKLJuFMN/1OCxuyTbhswM2TrzenOXc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nq3V8/btsLKLJuFMN/1OCxuyTbhswM2TrzenOXc0/img.png&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;916&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.0701%;&quot; data-widthpercent=&quot;49.65&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nq3V8/btsLKLJuFMN/1OCxuyTbhswM2TrzenOXc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNq3V8%2FbtsLKLJuFMN%2F1OCxuyTbhswM2TrzenOXc0%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;958&quot; height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/330</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-13#entry330comment</comments>
      <pubDate>Sun, 12 Jan 2025 16:42:29 +0900</pubDate>
    </item>
    <item>
      <title>스프링 웹 프로젝트 12</title>
      <link>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-12</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SQL Developer를 종료하고 다시 시작하고난 뒤&amp;nbsp;sql_board.nextval로 bno값을 증가시켰을 때 bno값이 마지막 번호에서 증가되지 않는 문제가 발생 &amp;rarr; Oracle의 시퀀스는 기본적으로 캐시 기능을 사용하는데, 시퀀스에서 생성되는 값을 미리 메모리에 저장해두고, 그 값을 반환함. 세션 종료와 캐시 SQL Developer를 종료하고 다시 시작하면, 캐시된 시퀀스 값들이 세션 종료와 함께 소멸됨. 즉 SQL Developer 세션이 종료될 때 메모리에서 캐시된 값들이 사라지고, 새로 시작된 세션에서 시퀀스가 처음부터 새로운 값을 생성하기 시작함. 이 과정에서 이미 캐시된 값들이 사려졌기 때문에 시퀀스가 값을 건너뛰는 현상이 발생할 수 있음&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시물 작업 이후 재전송&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;게시물의 틍록, 수정, 삭제의 경우에 해당&lt;/li&gt;
&lt;li&gt;작업이 완료된 후에는 리스트 페이지로 다시 이동&lt;/li&gt;
&lt;li&gt;BoardController에서는 RedirectAttributes의 addFlashAttribute()를 이용해서 단 한 번만 전송되는 데이터를 저장 후 전송&lt;/li&gt;
&lt;li&gt;JSP 등의 화면에서는 JavaScript를 이용해서 경고창이나 모달창 등을 보여주는 형식&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1736573535695&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.zerock.domain.BoardVO;
import org.zerock.service.BoardService;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@RequestMapping(&quot;/board/*&quot;)
@RequiredArgsConstructor
@Log4j
public class BoardController {

	private final BoardService boardService;
	
(...생략...)
	
	@PostMapping(&quot;/register&quot;)
	public String register(BoardVO boardVO, RedirectAttributes redirectAttributes) {
		log.info(&quot;BoardController register()....................&quot;);
		boardService.register(boardVO);
		log.info(&quot;register : &quot; + boardVO);
		redirectAttributes.addFlashAttribute(&quot;result&quot;, boardVO.getBno()); // addFlashAttribute 잠깐 결과를 보내는 방식
		// ※ redirectAttributes.addAttribute(&quot;result&quot;, boardVO.getBno()) // 브라우저의 링크와 같이 연결, list?bno= 이런 형식으로 할 때 쓰임
		
		return &quot;redirect:/board/list&quot;;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qkRJ0/btsLK51QgPZ/YJCPOLpD31JkBc1kOEP3jK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qkRJ0/btsLK51QgPZ/YJCPOLpD31JkBc1kOEP3jK/img.png&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;838&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;28.82&quot; style=&quot;width: 28.4868%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qkRJ0/btsLK51QgPZ/YJCPOLpD31JkBc1kOEP3jK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqkRJ0%2FbtsLK51QgPZ%2FYJCPOLpD31JkBc1kOEP3jK%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;955&quot; height=&quot;838&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP04lF/btsLJWSmDqD/KAWYpGSzxyHK45ptgscxSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP04lF/btsLJWSmDqD/KAWYpGSzxyHK45ptgscxSk/img.png&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;334&quot; data-is-animation=&quot;false&quot; style=&quot;width: 70.3504%;&quot; data-widthpercent=&quot;71.18&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP04lF/btsLJWSmDqD/KAWYpGSzxyHK45ptgscxSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP04lF%2FbtsLJWSmDqD%2FKAWYpGSzxyHK45ptgscxSk%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;940&quot; height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Submit Button을 누르고 뒤로 가기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;837&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqbb22/btsLKrxE0Qd/5cPJCVPoQgCVDfKZkhsbGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqbb22/btsLKrxE0Qd/5cPJCVPoQgCVDfKZkhsbGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqbb22/btsLKrxE0Qd/5cPJCVPoQgCVDfKZkhsbGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcqbb22%2FbtsLKrxE0Qd%2F5cPJCVPoQgCVDfKZkhsbGK%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;958&quot; height=&quot;837&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;837&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1736573974331&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;

(...생략...)

&amp;lt;script&amp;gt;
$(document).ready(function(){
	${result}
});
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MNW3w/btsLJExEURe/dWYrJcPJW2Mi2Eo3auMqyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MNW3w/btsLJExEURe/dWYrJcPJW2Mi2Eo3auMqyK/img.png&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;834&quot; data-is-animation=&quot;false&quot; style=&quot;width: 29.0227%; margin-right: 10px;&quot; data-widthpercent=&quot;29.36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MNW3w/btsLJExEURe/dWYrJcPJW2Mi2Eo3auMqyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMNW3w%2FbtsLJExEURe%2FdWYrJcPJW2Mi2Eo3auMqyK%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;956&quot; height=&quot;834&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cokDMO/btsLLVdl7lC/jtqrS5yTsZtSKyXbWReMM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cokDMO/btsLLVdl7lC/jtqrS5yTsZtSKyXbWReMM0/img.png&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;338&quot; data-is-animation=&quot;false&quot; style=&quot;width: 69.8145%;&quot; data-widthpercent=&quot;70.64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cokDMO/btsLLVdl7lC/jtqrS5yTsZtSKyXbWReMM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcokDMO%2FbtsLLVdl7lC%2FjtqrS5yTsZtSKyXbWReMM0%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;932&quot; height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4MCkx/btsLJyKUDrh/L7X0GDgOpp3VhkilWGxAK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4MCkx/btsLJyKUDrh/L7X0GDgOpp3VhkilWGxAK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4MCkx/btsLJyKUDrh/L7X0GDgOpp3VhkilWGxAK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4MCkx%2FbtsLJyKUDrh%2FL7X0GDgOpp3VhkilWGxAK1%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;566&quot; height=&quot;362&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 문법상 에러 나는 코드&lt;/p&gt;
&lt;pre id=&quot;code_1736574635365&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;

(...생략...)

&amp;lt;script&amp;gt;
$(document).ready(function(){
	var result = '&amp;lt;c:out value=&quot;${result}&quot;/&amp;gt;';
});
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3bg1I/btsLL4OK4HM/kKm6kfVKYElXvYzuMUo0kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3bg1I/btsLL4OK4HM/kKm6kfVKYElXvYzuMUo0kK/img.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;636&quot; data-is-animation=&quot;false&quot; style=&quot;width: 26.3367%; margin-right: 10px;&quot; data-widthpercent=&quot;26.96&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3bg1I/btsLL4OK4HM/kKm6kfVKYElXvYzuMUo0kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3bg1I%2FbtsLL4OK4HM%2FkKm6kfVKYElXvYzuMUo0kK%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;950&quot; height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbLFiH/btsLL8p5lIH/K1dahqncHaVVaIt4syY3x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbLFiH/btsLL8p5lIH/K1dahqncHaVVaIt4syY3x1/img.png&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;333&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.8183%; margin-right: 10px;&quot; data-widthpercent=&quot;49.98&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbLFiH/btsLL8p5lIH/K1dahqncHaVVaIt4syY3x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbLFiH%2FbtsLL8p5lIH%2FK1dahqncHaVVaIt4syY3x1%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;922&quot; height=&quot;333&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsqbm7/btsLJhpgawL/5OnDeKRzVJF5w7qxExDLS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsqbm7/btsLJhpgawL/5OnDeKRzVJF5w7qxExDLS0/img.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;487&quot; data-is-animation=&quot;false&quot; style=&quot;width: 22.5194%;&quot; data-widthpercent=&quot;23.06&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsqbm7/btsLJhpgawL/5OnDeKRzVJF5w7qxExDLS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdsqbm7%2FbtsLJhpgawL%2F5OnDeKRzVJF5w7qxExDLS0%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;622&quot; height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;board/list에서 새로 고침을 하고 소스보기를 할 경우&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4F577/btsLKEQ5mfT/yKbCiX8WmMhGbCrYQH8im0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4F577/btsLKEQ5mfT/yKbCiX8WmMhGbCrYQH8im0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4F577/btsLKEQ5mfT/yKbCiX8WmMhGbCrYQH8im0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4F577%2FbtsLKEQ5mfT%2FyKbCiX8WmMhGbCrYQH8im0%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;330&quot; height=&quot;91&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것을 가지고 작업을 했는지, 호출만 했는지를 구분 &amp;rarr; 모달창&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;BoardController에서 특정한 데이터가 RedirectAttribute에 포함된 경우에 모달창&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://getbootstrap.com/docs/4.0/components/modal/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://getbootstrap.com/docs/4.0/components/modal/&lt;/a&gt; 코드를 복사&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1736575005716&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;

(...생략...)

&amp;lt;div id=&quot;myModal&quot; class=&quot;modal&quot; tabindex=&quot;-1&quot; role=&quot;dialog&quot;&amp;gt;
  &amp;lt;div class=&quot;modal-dialog&quot; role=&quot;document&quot;&amp;gt;
    &amp;lt;div class=&quot;modal-content&quot;&amp;gt;
      &amp;lt;div class=&quot;modal-header&quot;&amp;gt;
        &amp;lt;h5 class=&quot;modal-title&quot;&amp;gt;Modal title&amp;lt;/h5&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;modal&quot; aria-label=&quot;Close&quot;&amp;gt;
          &amp;lt;span aria-hidden=&quot;true&quot;&amp;gt;&amp;amp;times;&amp;lt;/span&amp;gt;
        &amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-body&quot;&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-footer&quot;&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-primary&quot;&amp;gt;Save changes&amp;lt;/button&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-secondary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Close&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
$(document).ready(function(){
	var result = '&amp;lt;c:out value=&quot;${result}&quot;/&amp;gt;';
	
	
	checkModal(result);
	
	function checkModal(result){
		
		if(result ===''){
			return;
		}
		
		if(parseInt(result)&amp;gt;0){
			$('.modal-body').html(&quot;게시글 &quot; + parseInt(result) + &quot; 번이 등록됨.&quot;);
		}
		$(&quot;#myModal&quot;).modal(&quot;show&quot;);
	}
	
});
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글 작성 후&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;835&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sggXw/btsLKM9knvI/ckUROyCWTjmpWXlGXGeAk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sggXw/btsLKM9knvI/ckUROyCWTjmpWXlGXGeAk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sggXw/btsLKM9knvI/ckUROyCWTjmpWXlGXGeAk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsggXw%2FbtsLKM9knvI%2FckUROyCWTjmpWXlGXGeAk0%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;956&quot; height=&quot;835&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;835&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 http://localhost:8080/board/list에서 새로고침을 하면 모달창이 뜨지 않음&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;/p&gt;
&lt;pre id=&quot;code_1736576317213&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Tables&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            DataTables Advanced Tables
                            &amp;lt;button id=&quot;regBtn&quot; type=&quot;button&quot; class=&quot;btn btn-xs pull-right&quot;&amp;gt;Register New Board&amp;lt;/button&amp;gt;
                        &amp;lt;/div&amp;gt;
 (...생략...)
 
 
 &amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Tables&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            DataTables Advanced Tables
                            &amp;lt;button id=&quot;regBtn&quot; type=&quot;button&quot; class=&quot;btn btn-xs pull-right&quot;&amp;gt;Register New Board&amp;lt;/button&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
                            &amp;lt;table width=&quot;100%&quot; class=&quot;table table-striped table-bordered table-hover&quot;&amp;gt;
                                &amp;lt;thead&amp;gt;
                                    &amp;lt;tr&amp;gt;
                                        &amp;lt;th&amp;gt;#번호&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;수정일&amp;lt;/th&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/thead&amp;gt;
                                &amp;lt;tbody&amp;gt;
                                &amp;lt;c:forEach items=&quot;${list}&quot; var=&quot;boardVO&quot;&amp;gt;
                                    &amp;lt;tr class=&quot;odd gradeX&quot;&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.bno}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.title}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.writer}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.regdate }&quot; pattern=&quot;yyyy-MM-dd&quot;/&amp;gt; &amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.updateDate }&quot; pattern=&quot;yyyy-MM-dd&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/c:forEach&amp;gt;
                                &amp;lt;/tbody&amp;gt;
                            &amp;lt;/table&amp;gt;
                            &amp;lt;!-- /.table-responsive --&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;

&amp;lt;div id=&quot;myModal&quot; class=&quot;modal&quot; tabindex=&quot;-1&quot; role=&quot;dialog&quot;&amp;gt;
  &amp;lt;div class=&quot;modal-dialog&quot; role=&quot;document&quot;&amp;gt;
    &amp;lt;div class=&quot;modal-content&quot;&amp;gt;
      &amp;lt;div class=&quot;modal-header&quot;&amp;gt;
        &amp;lt;h5 class=&quot;modal-title&quot;&amp;gt;Modal title&amp;lt;/h5&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;modal&quot; aria-label=&quot;Close&quot;&amp;gt;
          &amp;lt;span aria-hidden=&quot;true&quot;&amp;gt;&amp;amp;times;&amp;lt;/span&amp;gt;
        &amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-body&quot;&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-footer&quot;&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-primary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Save changes&amp;lt;/button&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-secondary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Close&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
$(document).ready(function(){

(...생략...)

	$(&quot;#regBtn&quot;).click(function(){
		self.location = &quot;/board/register&quot;;
	});
	
});
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vgng6/btsLJnv99ri/56a5WpVL9svwv4tbYCvEM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vgng6/btsLJnv99ri/56a5WpVL9svwv4tbYCvEM1/img.png&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;788&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.3344%; margin-right: 10px;&quot; data-widthpercent=&quot;50.93&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vgng6/btsLJnv99ri/56a5WpVL9svwv4tbYCvEM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvgng6%2FbtsLJnv99ri%2F56a5WpVL9svwv4tbYCvEM1%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;935&quot; height=&quot;788&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xMC3F/btsLKabSAqD/7wyMDEcRboukku3qzFPsok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xMC3F/btsLKabSAqD/7wyMDEcRboukku3qzFPsok/img.png&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;830&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.5029%;&quot; data-widthpercent=&quot;49.07&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xMC3F/btsLKabSAqD/7wyMDEcRboukku3qzFPsok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxMC3F%2FbtsLKabSAqD%2F7wyMDEcRboukku3qzFPsok%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;949&quot; height=&quot;830&quot;/&gt;&lt;/span&gt;&lt;/div&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;목록에서 특정 게시물 선택 후 이동 처리 (번호가 전달되어야함)&lt;/li&gt;
&lt;li&gt;조회의 경우 반드시 GET 방식으로만 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1736576880925&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.zerock.domain.BoardVO;
import org.zerock.service.BoardService;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@RequestMapping(&quot;/board/*&quot;)
@RequiredArgsConstructor
@Log4j
public class BoardController {

	private final BoardService boardService;
	
(...생략...)
	
	@GetMapping(&quot;/get&quot;)
	public void get(@RequestParam(&quot;bno&quot;) Long bno,Model model) {
		model.addAttribute(&quot;boardVO&quot;, boardService.get(bno));
	}
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;get.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1736577180550&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Board Read&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            Board Read
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;BNO&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.bno}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Title&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.title}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Content&amp;lt;/label&amp;gt; &amp;lt;textarea rows=&quot;5&quot; cols=&quot;50&quot; class=&quot;form-control&quot; name=&quot;content&quot;&amp;gt;&amp;lt;c:out value='${boardVO.content}'/&amp;gt;&amp;lt;/textarea&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Writer&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;writer&quot; class=&quot;form-control&quot; value=&quot;&amp;lt;c:out value='${boardVO.writer}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
							 	&amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-default&quot;&amp;gt;Submit Button&amp;lt;/button&amp;gt;
                                &amp;lt;button type=&quot;reset&quot; class=&quot;btn btn-default&quot;&amp;gt;Reset Button&amp;lt;/button&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&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;951&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdCMMN/btsLLOFnyBP/FhisDzl0hoIYlDaqZwy1MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdCMMN/btsLLOFnyBP/FhisDzl0hoIYlDaqZwy1MK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdCMMN/btsLLOFnyBP/FhisDzl0hoIYlDaqZwy1MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdCMMN%2FbtsLLOFnyBP%2FFhisDzl0hoIYlDaqZwy1MK%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;951&quot; height=&quot;820&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;820&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list.jsp 에서&amp;nbsp; 제목을 클릭하면 위의 조회 페이지를 볼 수 있게 구현&lt;/p&gt;
&lt;pre id=&quot;code_1736577596270&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Tables&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            DataTables Advanced Tables
                            &amp;lt;button id=&quot;regBtn&quot; type=&quot;button&quot; class=&quot;btn btn-xs pull-right&quot;&amp;gt;Register New Board&amp;lt;/button&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
                            &amp;lt;table width=&quot;100%&quot; class=&quot;table table-striped table-bordered table-hover&quot;&amp;gt;
                                &amp;lt;thead&amp;gt;
                                    &amp;lt;tr&amp;gt;
                                        &amp;lt;th&amp;gt;#번호&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;수정일&amp;lt;/th&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/thead&amp;gt;
                                &amp;lt;tbody&amp;gt;
                                &amp;lt;c:forEach items=&quot;${list}&quot; var=&quot;boardVO&quot;&amp;gt;
                                    &amp;lt;tr class=&quot;odd gradeX&quot;&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.bno}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;a href=&quot;/board/get?bno=&amp;lt;c:out value='${boardVO.bno}' /&amp;gt;&quot;&amp;gt;&amp;lt;c:out value=&quot;${boardVO.title}&quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.writer}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.regdate }&quot; pattern=&quot;yyyy-MM-dd&quot;/&amp;gt; &amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.updateDate }&quot; pattern=&quot;yyyy-MM-dd&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/c:forEach&amp;gt;
                                &amp;lt;/tbody&amp;gt;
                            &amp;lt;/table&amp;gt;
                            &amp;lt;!-- /.table-responsive --&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;

&amp;lt;div id=&quot;myModal&quot; class=&quot;modal&quot; tabindex=&quot;-1&quot; role=&quot;dialog&quot;&amp;gt;
  &amp;lt;div class=&quot;modal-dialog&quot; role=&quot;document&quot;&amp;gt;
    &amp;lt;div class=&quot;modal-content&quot;&amp;gt;
      &amp;lt;div class=&quot;modal-header&quot;&amp;gt;
        &amp;lt;h5 class=&quot;modal-title&quot;&amp;gt;Modal title&amp;lt;/h5&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;modal&quot; aria-label=&quot;Close&quot;&amp;gt;
          &amp;lt;span aria-hidden=&quot;true&quot;&amp;gt;&amp;amp;times;&amp;lt;/span&amp;gt;
        &amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-body&quot;&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;modal-footer&quot;&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-primary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Save changes&amp;lt;/button&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-secondary&quot; data-dismiss=&quot;modal&quot;&amp;gt;Close&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
$(document).ready(function(){
	var result = '&amp;lt;c:out value=&quot;${result}&quot;/&amp;gt;';
	
	
	checkModal(result);
	
	function checkModal(result){
		
		if(result ===''){
			return;
		}
		
		if(parseInt(result)&amp;gt;0){
			$('.modal-body').html(&quot;게시글 &quot; + parseInt(result) + &quot; 번이 등록됨.&quot;);
		}
		$(&quot;#myModal&quot;).modal(&quot;show&quot;);
	}
	
	$(&quot;#regBtn&quot;).click(function(){
		self.location = &quot;/register&quot;;
	});
	
});
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1736578053496&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(...생략...)

&amp;lt;script&amp;gt;
$(document).ready(function(){
	var result = '&amp;lt;c:out value=&quot;${result}&quot;/&amp;gt;';
	
	
	checkModal(result);
	
	history.replaceState({},null,null); // 히스토리 클리어
	
	function checkModal(result){
		
		if(result ==='' || history.state){
			return;
		}
		
		if(parseInt(result)&amp;gt;0){
			$('.modal-body').html(&quot;게시글 &quot; + parseInt(result) + &quot; 번이 등록됨.&quot;);
		}
		$(&quot;#myModal&quot;).modal(&quot;show&quot;);
	}
	
	$(&quot;#regBtn&quot;).click(function(){
		self.location = &quot;/board/register&quot;;
	});
	
});
&amp;lt;/script&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;게시물 조회 이후 수정/삭제 페이지로 이동&lt;/li&gt;
&lt;li&gt;사용자의 선택에 따라서 작업을 처리&lt;/li&gt;
&lt;li&gt;수정/삭제는 POST 방식으로 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardController의 get()메서드와 같기 때문에 똑같은 페이지를 만들 필요 없이 두 개의 링크를 처리할 수 있게&lt;/p&gt;
&lt;pre id=&quot;code_1736578417460&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping({&quot;/get&quot;, &quot;/modify&quot;})
	public void get(@RequestParam(&quot;bno&quot;) Long bno,Model model) {
		model.addAttribute(&quot;boardVO&quot;, boardService.get(bno));
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;modify.jsp (get.jsp와 거의 유사하기 때문에 복사붙여넣기 후 이름만 수정)&lt;/p&gt;
&lt;pre id=&quot;code_1736578453071&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Board Modify/Delete&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            Board Modify/Delete
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;BNO&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.bno}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Title&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.title}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Content&amp;lt;/label&amp;gt; &amp;lt;textarea rows=&quot;5&quot; cols=&quot;50&quot; class=&quot;form-control&quot; name=&quot;content&quot;&amp;gt;&amp;lt;c:out value='${boardVO.content}'/&amp;gt;&amp;lt;/textarea&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Writer&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;writer&quot; class=&quot;form-control&quot; value=&quot;&amp;lt;c:out value='${boardVO.writer}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
							 	&amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-default&quot;&amp;gt;Submit Button&amp;lt;/button&amp;gt;
                                &amp;lt;button type=&quot;reset&quot; class=&quot;btn btn-default&quot;&amp;gt;Reset Button&amp;lt;/button&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&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;954&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W55PL/btsLK5HxElZ/D9xkBktsVHSvvrB8w7J9TK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W55PL/btsLK5HxElZ/D9xkBktsVHSvvrB8w7J9TK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W55PL/btsLK5HxElZ/D9xkBktsVHSvvrB8w7J9TK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW55PL%2FbtsLK5HxElZ%2FD9xkBktsVHSvvrB8w7J9TK%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;954&quot; height=&quot;830&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;830&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;pre id=&quot;code_1736578702640&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;							 	&amp;lt;button class=&quot;btn btn-default&quot;&amp;gt;Modify&amp;lt;/button&amp;gt;
                                &amp;lt;button class=&quot;btn btn-danger&quot;&amp;gt;Remove&amp;lt;/button&amp;gt;
                                &amp;lt;button class=&quot;btn btn-info&quot;&amp;gt;List&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트&lt;/p&gt;
&lt;pre id=&quot;code_1736578961581&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Board Modify/Delete&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            Board Modify/Delete
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;BNO&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.bno}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Title&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.title}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Content&amp;lt;/label&amp;gt; &amp;lt;textarea rows=&quot;5&quot; cols=&quot;50&quot; class=&quot;form-control&quot; name=&quot;content&quot;&amp;gt;&amp;lt;c:out value='${boardVO.content}'/&amp;gt;&amp;lt;/textarea&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Writer&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;writer&quot; class=&quot;form-control&quot; value=&quot;&amp;lt;c:out value='${boardVO.writer}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
							 	&amp;lt;button class=&quot;btn btn-default&quot; data-oper='modify'&amp;gt;Modify&amp;lt;/button&amp;gt;
                                &amp;lt;button class=&quot;btn btn-danger&quot; data-oper='remove'&amp;gt;Remove&amp;lt;/button&amp;gt;
                                &amp;lt;button class=&quot;btn btn-info&quot; data-oper='list'&amp;gt;List&amp;lt;/button&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;
	$(document).ready(function(){
		
		$('.btn').click(function(e){
			
			e.preventDefault();
			
			var operation = $(this).data(&quot;oper&quot;);
			
			console.log(operation);
		})
		
		
	})
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&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;948&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/calBMe/btsLJchcBYS/jRmoPqOeVVsCxxHJkvs9e0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/calBMe/btsLJchcBYS/jRmoPqOeVVsCxxHJkvs9e0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/calBMe/btsLJchcBYS/jRmoPqOeVVsCxxHJkvs9e0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcalBMe%2FbtsLJchcBYS%2FjRmoPqOeVVsCxxHJkvs9e0%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;948&quot; height=&quot;820&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;820&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1736579101670&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Board Modify/Delete&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            Board Modify/Delete
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
                        &amp;lt;form action=&quot;&quot;&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;BNO&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.bno}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Title&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.title}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Content&amp;lt;/label&amp;gt; &amp;lt;textarea rows=&quot;5&quot; cols=&quot;50&quot; class=&quot;form-control&quot; name=&quot;content&quot;&amp;gt;&amp;lt;c:out value='${boardVO.content}'/&amp;gt;&amp;lt;/textarea&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Writer&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;writer&quot; class=&quot;form-control&quot; value=&quot;&amp;lt;c:out value='${boardVO.writer}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
							 	&amp;lt;button class=&quot;btn btn-default&quot; data-oper='modify'&amp;gt;Modify&amp;lt;/button&amp;gt;
                                &amp;lt;button class=&quot;btn btn-danger&quot; data-oper='remove'&amp;gt;Remove&amp;lt;/button&amp;gt;
                                &amp;lt;button class=&quot;btn btn-info&quot; data-oper='list'&amp;gt;List&amp;lt;/button&amp;gt;
                        &amp;lt;/form&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;
	$(document).ready(function(){
		
		var formObj = $('form');
		
		$('.btn').click(function(e){
			
			e.preventDefault();
			
			var operation = $(this).data(&quot;oper&quot;);
			
			console.log(operation);
			
			if(operation === 'list'){
				self.location = &quot;/board/list&quot;;
			}
		})
		
		
	})
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&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;947&quot; data-origin-height=&quot;873&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n3PRe/btsLJMoOUju/KxMrFnfrBFV6sw7RrQHR1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n3PRe/btsLJMoOUju/KxMrFnfrBFV6sw7RrQHR1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n3PRe/btsLJMoOUju/KxMrFnfrBFV6sw7RrQHR1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn3PRe%2FbtsLJMoOUju%2FKxMrFnfrBFV6sw7RrQHR1k%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;947&quot; height=&quot;873&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;873&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1736579281096&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Board Modify/Delete&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            Board Modify/Delete
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
                        &amp;lt;form&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;BNO&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.bno}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Title&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.title}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Content&amp;lt;/label&amp;gt; &amp;lt;textarea rows=&quot;5&quot; cols=&quot;50&quot; class=&quot;form-control&quot; name=&quot;content&quot;&amp;gt;&amp;lt;c:out value='${boardVO.content}'/&amp;gt;&amp;lt;/textarea&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Writer&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;writer&quot; class=&quot;form-control&quot; value=&quot;&amp;lt;c:out value='${boardVO.writer}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
							 	&amp;lt;button class=&quot;btn btn-default&quot; data-oper='modify'&amp;gt;Modify&amp;lt;/button&amp;gt;
                                &amp;lt;button class=&quot;btn btn-danger&quot; data-oper='remove'&amp;gt;Remove&amp;lt;/button&amp;gt;
                                &amp;lt;button class=&quot;btn btn-info&quot; data-oper='list'&amp;gt;List&amp;lt;/button&amp;gt;
                        &amp;lt;/form&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;
	$(document).ready(function(){
		
		var formObj = $('form');
		
		$('.btn').click(function(e){
			
			e.preventDefault();
			
			var operation = $(this).data(&quot;oper&quot;);
			
			console.log(operation);
			
			if(operation === 'list'){
				self.location = &quot;/board/list&quot;;
			}else if(operation === 'remove'){
				formObj.attr(&quot;action&quot;, &quot;/board/remove&quot;);
			}
		})
		
		
	})
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&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;1897&quot; data-origin-height=&quot;985&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6h2ep/btsLLDjG4Tb/uQpY08hMtukOWCz5zgXmd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6h2ep/btsLLDjG4Tb/uQpY08hMtukOWCz5zgXmd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6h2ep/btsLLDjG4Tb/uQpY08hMtukOWCz5zgXmd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6h2ep%2FbtsLLDjG4Tb%2FuQpY08hMtukOWCz5zgXmd1%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;1897&quot; height=&quot;985&quot; data-origin-width=&quot;1897&quot; data-origin-height=&quot;985&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;remove 버튼을 누르면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1911&quot; data-origin-height=&quot;982&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1tpU7/btsLJnwaxnP/AonACmWYAs3NE5chtBTFT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1tpU7/btsLJnwaxnP/AonACmWYAs3NE5chtBTFT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1tpU7/btsLJnwaxnP/AonACmWYAs3NE5chtBTFT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1tpU7%2FbtsLJnwaxnP%2FAonACmWYAs3NE5chtBTFT1%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;1911&quot; height=&quot;982&quot; data-origin-width=&quot;1911&quot; data-origin-height=&quot;982&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서 attr(&quot;method&quot;,&quot;post&quot;)를 추가&lt;/p&gt;
&lt;pre id=&quot;code_1736579410451&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
(...생략...)
				formObj.attr(&quot;action&quot;, &quot;/board/remove&quot;).attr(&quot;method&quot;,&quot;post&quot;);
			}
		})
	})
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&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;945&quot; data-origin-height=&quot;837&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z0BJe/btsLLB7hdPL/KQzzEpqPIfxvuYpTddwkKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z0BJe/btsLLB7hdPL/KQzzEpqPIfxvuYpTddwkKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z0BJe/btsLLB7hdPL/KQzzEpqPIfxvuYpTddwkKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ0BJe%2FbtsLLB7hdPL%2FKQzzEpqPIfxvuYpTddwkKK%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;945&quot; height=&quot;837&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;837&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;submit만 해주면&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1736579471445&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(...생략...)
			if(operation === 'list'){
				self.location = &quot;/board/list&quot;;
			}else if(operation === 'remove'){
				formObj.attr(&quot;action&quot;, &quot;/board/remove&quot;).attr(&quot;method&quot;,&quot;post&quot;);
				formObj.submit();
			}
		})
		
		
	})
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&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;945&quot; data-origin-height=&quot;881&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WFsiy/btsLLPjZuJO/rhDco8wKgn97s0Kwxq4as0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WFsiy/btsLLPjZuJO/rhDco8wKgn97s0Kwxq4as0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WFsiy/btsLLPjZuJO/rhDco8wKgn97s0Kwxq4as0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWFsiy%2FbtsLLPjZuJO%2FrhDco8wKgn97s0Kwxq4as0%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;945&quot; height=&quot;881&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;881&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;input 태그에 name에 bno가 아니라 title로 작성되어 있어 오류 발생 수정&lt;/p&gt;
&lt;pre id=&quot;code_1736579639913&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Board Modify/Delete&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            Board Modify/Delete
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
                        &amp;lt;form&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;BNO&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;bno&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.bno}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Title&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.title}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Content&amp;lt;/label&amp;gt; &amp;lt;textarea rows=&quot;5&quot; cols=&quot;50&quot; class=&quot;form-control&quot; name=&quot;content&quot;&amp;gt;&amp;lt;c:out value='${boardVO.content}'/&amp;gt;&amp;lt;/textarea&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Writer&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;writer&quot; class=&quot;form-control&quot; value=&quot;&amp;lt;c:out value='${boardVO.writer}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
							 	&amp;lt;button class=&quot;btn btn-default&quot; data-oper='modify'&amp;gt;Modify&amp;lt;/button&amp;gt;
                                &amp;lt;button class=&quot;btn btn-danger&quot; data-oper='remove'&amp;gt;Remove&amp;lt;/button&amp;gt;
                                &amp;lt;button class=&quot;btn btn-info&quot; data-oper='list'&amp;gt;List&amp;lt;/button&amp;gt;
                        &amp;lt;/form&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;
	$(document).ready(function(){
		
		var formObj = $('form');
		
		$('.btn').click(function(e){
			
			e.preventDefault();
			
			var operation = $(this).data(&quot;oper&quot;);
			
			console.log(operation);
			
			if(operation === 'list'){
				self.location = &quot;/board/list&quot;;
			}else if(operation === 'remove'){
				formObj.attr(&quot;action&quot;, &quot;/board/remove&quot;).attr(&quot;method&quot;,&quot;post&quot;);
				formObj.submit();
			}
		})
		
		
	})
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&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;1204&quot; data-origin-height=&quot;990&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tfb90/btsLK42W5AH/QPgCtMKES6RbkXM9uunV81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tfb90/btsLK42W5AH/QPgCtMKES6RbkXM9uunV81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tfb90/btsLK42W5AH/QPgCtMKES6RbkXM9uunV81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftfb90%2FbtsLK42W5AH%2FQPgCtMKES6RbkXM9uunV81%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;1204&quot; height=&quot;990&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;990&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Modal title이 비어있는 것을 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1736579893515&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(...생략...)
	
	function checkModal(result){
		
		if(result ==='' || history.state){
			return;
		}
		
		if(result === 'success'){
			$('.modal-body').html(&quot;정상적으로 처리됨.&quot;);
		} else if(parseInt(result)&amp;gt;0){
			$('.modal-body').html(&quot;게시글 &quot; + parseInt(result) + &quot; 번이 등록됨.&quot;);
		}
		
		$(&quot;#myModal&quot;).modal(&quot;show&quot;);
	}
	
	$(&quot;#regBtn&quot;).click(function(){
		self.location = &quot;/board/register&quot;;
	});
	
});
&amp;lt;/script&amp;gt;

&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kw27j/btsLLBTM9Dg/FDBED5Ud0GfxWMT0Ni7ef0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kw27j/btsLLBTM9Dg/FDBED5Ud0GfxWMT0Ni7ef0/img.png&quot; data-origin-width=&quot;1199&quot; data-origin-height=&quot;978&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4943%; margin-right: 10px;&quot; data-widthpercent=&quot;50.08&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kw27j/btsLLBTM9Dg/FDBED5Ud0GfxWMT0Ni7ef0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKw27j%2FbtsLLBTM9Dg%2FFDBED5Ud0GfxWMT0Ni7ef0%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;1199&quot; height=&quot;978&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfHGAq/btsLJniEfwH/kRpnaWLGJ2jt6VkitM8cv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfHGAq/btsLJniEfwH/kRpnaWLGJ2jt6VkitM8cv0/img.png&quot; data-origin-width=&quot;1199&quot; data-origin-height=&quot;981&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.3429%;&quot; data-widthpercent=&quot;49.92&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfHGAq/btsLJniEfwH/kRpnaWLGJ2jt6VkitM8cv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfHGAq%2FbtsLJniEfwH%2FkRpnaWLGJ2jt6VkitM8cv0%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;1199&quot; height=&quot;981&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;modify.jsp에서 readonly 속성 제거&lt;/p&gt;
&lt;pre id=&quot;code_1736580070981&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(...생략...)
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;BNO&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;bno&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.bno}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Title&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; value=&quot;&amp;lt;c:out value='${boardVO.title}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Content&amp;lt;/label&amp;gt; &amp;lt;textarea rows=&quot;5&quot; cols=&quot;50&quot; class=&quot;form-control&quot; name=&quot;content&quot;&amp;gt;&amp;lt;c:out value='${boardVO.content}'/&amp;gt;&amp;lt;/textarea&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Writer&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;writer&quot; class=&quot;form-control&quot; value=&quot;&amp;lt;c:out value='${boardVO.writer}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&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;1201&quot; data-origin-height=&quot;981&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sU45l/btsLJ6URRAo/iAQnZX2sJh9AnCYcsjbBG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sU45l/btsLJ6URRAo/iAQnZX2sJh9AnCYcsjbBG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sU45l/btsLJ6URRAo/iAQnZX2sJh9AnCYcsjbBG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsU45l%2FbtsLJ6URRAo%2FiAQnZX2sJh9AnCYcsjbBG0%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;1201&quot; height=&quot;981&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;981&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;modify.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1736580146416&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(...생략...)
&amp;lt;script&amp;gt;
	$(document).ready(function(){
		
		var formObj = $('form');
		
		$('.btn').click(function(e){
			
			e.preventDefault();
			
			var operation = $(this).data(&quot;oper&quot;);
			
			console.log(operation);
			
			if(operation === 'list'){
				self.location = &quot;/board/list&quot;;
			}else if(operation === 'remove'){
				formObj.attr(&quot;action&quot;, &quot;/board/remove&quot;).attr(&quot;method&quot;,&quot;post&quot;);
				formObj.submit();
			}else if(operation === 'modify'){
				formObj.attr(&quot;action&quot;, &quot;/board/modify&quot;).attr(&quot;method&quot;,&quot;post&quot;);
				formObj.submit();
			}
		})
		
		
	})
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmxWRi/btsLK6mbhEi/E2HD2Q2e2R93RLqxnHcJ30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmxWRi/btsLK6mbhEi/E2HD2Q2e2R93RLqxnHcJ30/img.png&quot; data-origin-width=&quot;1203&quot; data-origin-height=&quot;986&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5882%; margin-right: 10px;&quot; data-widthpercent=&quot;33.36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmxWRi/btsLK6mbhEi/E2HD2Q2e2R93RLqxnHcJ30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmxWRi%2FbtsLK6mbhEi%2FE2HD2Q2e2R93RLqxnHcJ30%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;1203&quot; height=&quot;986&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djcq52/btsLKbV4F7w/JS2hJgiKeBDkrXqidWxFG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djcq52/btsLKbV4F7w/JS2hJgiKeBDkrXqidWxFG1/img.png&quot; data-origin-width=&quot;1199&quot; data-origin-height=&quot;982&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.6122%; margin-right: 10px;&quot; data-widthpercent=&quot;33.39&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djcq52/btsLKbV4F7w/JS2hJgiKeBDkrXqidWxFG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdjcq52%2FbtsLKbV4F7w%2FJS2hJgiKeBDkrXqidWxFG1%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;1199&quot; height=&quot;982&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o5stj/btsLL7Y13Vm/efDrY5DLI3jvJ2bCEWKydK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o5stj/btsLL7Y13Vm/efDrY5DLI3jvJ2bCEWKydK/img.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;987&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.474%;&quot; data-widthpercent=&quot;33.25&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o5stj/btsLL7Y13Vm/efDrY5DLI3jvJ2bCEWKydK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo5stj%2FbtsLL7Y13Vm%2FefDrY5DLI3jvJ2bCEWKydK%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;1200&quot; height=&quot;987&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;get.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1736580448215&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Board Read&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            Board Read
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;BNO&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.bno}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Title&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot; readonly=&quot;readonly&quot; value=&quot;&amp;lt;c:out value='${boardVO.title}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Content&amp;lt;/label&amp;gt; &amp;lt;textarea rows=&quot;5&quot; cols=&quot;50&quot; class=&quot;form-control&quot; name=&quot;content&quot;&amp;gt;&amp;lt;c:out value='${boardVO.content}'/&amp;gt;&amp;lt;/textarea&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Writer&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;writer&quot; class=&quot;form-control&quot; value=&quot;&amp;lt;c:out value='${boardVO.writer}'/&amp;gt;&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
							 	&amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-default&quot;&amp;gt;&amp;lt;a href=&quot;/board/list&quot;&amp;gt;List&amp;lt;/a&amp;gt;&amp;lt;/button&amp;gt;
                                &amp;lt;button type=&quot;reset&quot; class=&quot;btn btn-default&quot;&amp;gt;&amp;lt;a href=&quot;/board/modify?bno=&amp;lt;c:out value='${boardVO.bno }'/&amp;gt;&quot;&amp;gt;Modify&amp;lt;/a&amp;gt;&amp;lt;/button&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/329</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-12#entry329comment</comments>
      <pubDate>Sat, 11 Jan 2025 16:28:37 +0900</pubDate>
    </item>
    <item>
      <title>스프링 웹 프로젝트 11</title>
      <link>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-11</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;POST 방식 후 처리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;등록, 수정, 삭제의 최종 처리는 POST 방식을 이용&lt;/li&gt;
&lt;li&gt;브라우저에는 어떤 결과를 보여 줄 것인가?&lt;br /&gt;&amp;nbsp;1) 별도의 결과 페이지를 만들어서 보여주는 방식(ex, 회원가입 완료 페이지)&lt;br /&gt;&amp;nbsp;2) 목록 페이지로 이동하는 방식(ex, 목록 페이지에서 알림 메시지를 보여주는 방식)&lt;/li&gt;
&lt;li&gt;POST 방식 후에는 'redirect:/...'를 고려&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RedirectAttribute 사용 시기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;상황&lt;br /&gt;&amp;nbsp;GET 방식으로 입력페이지 /board/register&lt;br /&gt;&amp;nbsp;POST 방식으로 입력 처리 /board/register&lt;br /&gt;&amp;nbsp;처리가 끝난 후 화면 이동을 해도 브라우저의 URL은 POST 방식 처리 URL 그대로&lt;br /&gt;&amp;nbsp;만일 브라우저를 새로고침 한다면?&lt;br /&gt;&amp;nbsp;=&amp;gt; 도배를 방지하기 위해&lt;/li&gt;
&lt;li&gt;'redirect:/...'를 이용해서 브라우저와 연결을 한 번 종료&lt;/li&gt;
&lt;li&gt;브라우저는 새롭게 특정 URL을 요구&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1736419738018&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.zerock.domain.BoardVO;
import org.zerock.service.BoardService;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@RequestMapping(&quot;/board/*&quot;)
@RequiredArgsConstructor
@Log4j
public class BoardController {

	private final BoardService boardService;
	
(...생략...)
	
	@PostMapping(&quot;/register&quot;)
	public String register(BoardVO boardVO, RedirectAttributes redirectAttributes) {
		log.info(&quot;BoardController register()....................&quot;);
		log.info(&quot;register : &quot; + boardVO);
		redirectAttributes.addFlashAttribute(&quot;result : &quot; + boardVO.getBno()); // addFlashAttribute 잠깐 결과를 보내는 방식
		// ※ redirectAttributes.addAttribute(&quot;result : &quot; + boardVO.getBno()) // 브라우저의 링크와 같이 연결, list?bno= 이런 형식으로 할 때 쓰임
		
		return &quot;redirect:/board/list&quot;;
	}
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시물의 수정&lt;/p&gt;
&lt;pre id=&quot;code_1736419987538&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/modify&quot;)
	public String modify(BoardVO boardVO, RedirectAttributes redirectAttributes) {
		log.info(&quot;BoardController modify()......................&quot;);
		
		int count = boardService.modify(boardVO);
		
		if(count == 1) {
			redirectAttributes.addFlashAttribute(&quot;result&quot;, &quot;success&quot;);
		}
		return &quot;redirect:/board/list&quot;;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시물의 삭제&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;BoardMapper 인터페이스에 메서드 추가 파라미터는 PK&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1736420085907&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/remove&quot;)
	public String remove(@RequestParam(&quot;bno&quot;) Long bno, RedirectAttributes redirectAttributes) {
		log.info(&quot;BoardController remove()......................&quot;);
		
		int count = boardService.remove(bno);
		
		if(count == 1) {
			redirectAttributes.addFlashAttribute(&quot;result&quot;, &quot;success&quot;);
		}
		return &quot;redirect:/board/list&quot;;
	}&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;/p&gt;
&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/bXgHo9/btsLIVrGTN3/aa31RWIaqiFkxqu5ebM1D1/startbootstrap-sb-admin-2-gh-pages.zip?attach=1&amp;amp;knm=tfile.zip&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;startbootstrap-sb-admin-2-gh-pages.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;1.48MB&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;board/list에 pages 소스 붙여 넣기 후 링크 파일 넣어주기 및 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;resources에 data, dist, js, less, pages, vendor 붙여 넣기 후 list.jsp를 아래와 파일과 같이 수정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;906&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O2kvR/btsLILbMCqX/pz557tfmPkDAaADOWZdDvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O2kvR/btsLILbMCqX/pz557tfmPkDAaADOWZdDvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O2kvR/btsLILbMCqX/pz557tfmPkDAaADOWZdDvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO2kvR%2FbtsLILbMCqX%2Fpz557tfmPkDAaADOWZdDvk%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;1900&quot; height=&quot;906&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;906&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;include 적용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;header.jsp, foot&lt;/p&gt;
&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/bfmyGP/btsLILbNg9k/vmH11qUZ3kMtT4XnIDJRFK/header.jsp?attach=1&amp;amp;knm=tfile.jsp&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;header.jsp&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.02MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bkSFOq/btsLICeP2U8/iGLL4kEz84XlLVzn23PlT1/footer.jsp?attach=1&amp;amp;knm=tfile.jsp&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;footer.jsp&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;er.jsp 추가 및 수정&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;list.jsp 잘라낸 후&lt;/p&gt;
&lt;pre id=&quot;code_1736422953438&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Tables&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            DataTables Advanced Tables
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
                            &amp;lt;table width=&quot;100%&quot; class=&quot;table table-striped table-bordered table-hover&quot;&amp;gt;
                                &amp;lt;thead&amp;gt;
                                    &amp;lt;tr&amp;gt;
                                        &amp;lt;th&amp;gt;Rendering engine&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;Browser&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;Platform(s)&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;Engine version&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;CSS grade&amp;lt;/th&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/thead&amp;gt;
                                &amp;lt;tbody&amp;gt;
                                    &amp;lt;tr class=&quot;odd gradeX&quot;&amp;gt;
                                        &amp;lt;td&amp;gt;Trident&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;Internet Explorer 4.0&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;Win 95+&amp;lt;/td&amp;gt;
                                        &amp;lt;td class=&quot;center&quot;&amp;gt;4&amp;lt;/td&amp;gt;
                                        &amp;lt;td class=&quot;center&quot;&amp;gt;X&amp;lt;/td&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/tbody&amp;gt;
                            &amp;lt;/table&amp;gt;
                            &amp;lt;!-- /.table-responsive --&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
&amp;lt;%@include file=&quot;../include/footer.jsp&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list.jsp에서 taglib추가&lt;/p&gt;
&lt;pre id=&quot;code_1736423244839&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정&lt;/p&gt;
&lt;pre id=&quot;code_1736424656058&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(...생략...)
                           &amp;lt;table width=&quot;100%&quot; class=&quot;table table-striped table-bordered table-hover&quot;&amp;gt;
                                &amp;lt;thead&amp;gt;
                                    &amp;lt;tr&amp;gt;
                                        &amp;lt;th&amp;gt;#번호&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
                                        &amp;lt;th&amp;gt;수정일&amp;lt;/th&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/thead&amp;gt;
                                &amp;lt;tbody&amp;gt;
                                &amp;lt;c:forEach items=&quot;${list}&quot; var=&quot;boardVO&quot;&amp;gt;
                                    &amp;lt;tr class=&quot;odd gradeX&quot;&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.bno}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.title}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${boardVO.writer}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.regdate }&quot; pattern=&quot;yyyy-MM-dd&quot;/&amp;gt; &amp;lt;/td&amp;gt;
                                        &amp;lt;td&amp;gt;&amp;lt;fmt:formatDate value=&quot;${boardVO.updateDate }&quot; pattern=&quot;yyyy-MM-dd&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                                    &amp;lt;/tr&amp;gt;
                                &amp;lt;/c:forEach&amp;gt;
                                &amp;lt;/tbody&amp;gt;
                            &amp;lt;/table&amp;gt;
(...생략...)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jQuery를 header.jsp로 옮기기&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;GET 방식으로 게시물 등록 화면 제공&lt;/li&gt;
&lt;li&gt;POST 방식으로 실제 게시물 등록처리&lt;/li&gt;
&lt;li&gt;이후 목록 페이지로 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller&lt;/p&gt;
&lt;pre id=&quot;code_1736425383222&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.zerock.domain.BoardVO;
import org.zerock.service.BoardService;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@RequestMapping(&quot;/board/*&quot;)
@RequiredArgsConstructor
@Log4j
public class BoardController {

	private final BoardService boardService;
	
	@GetMapping(&quot;/list&quot;)
	public void list(Model model) { // Model 전달 당시에는 없는데 화면에 추가적인 데이터가 필요한 경우 사용
		log.info(&quot;BoardController list()................&quot;);
		model.addAttribute(&quot;list&quot;, boardService.getList());
	}
	
	@GetMapping(&quot;/register&quot;)
	public void registerGet() {
		log.info(&quot;BoardController regsterGet()............&quot;);
	}
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;board/register.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1736426157691&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@include file=&quot;../include/header.jsp&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;h1 class=&quot;page-header&quot;&amp;gt;Board Register&amp;lt;/h1&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!-- /.row --&amp;gt;
            &amp;lt;div class=&quot;row&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                    &amp;lt;div class=&quot;panel panel-default&quot;&amp;gt;
                        &amp;lt;div class=&quot;panel-heading&quot;&amp;gt;
                            DataTables Advanced Tables
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-heading --&amp;gt;
                        &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
                        	&amp;lt;form action=&quot;/board/register&quot; method=&quot;post&quot;&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Title&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;title&quot; class=&quot;form-control&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
								
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Content&amp;lt;/label&amp;gt; &amp;lt;textarea rows=&quot;5&quot; cols=&quot;50&quot; class=&quot;form-control&quot; name=&quot;content&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
								&amp;lt;/div&amp;gt;
								&amp;lt;div class=&quot;form-group&quot;&amp;gt;
									&amp;lt;label&amp;gt;Writer&amp;lt;/label&amp;gt; &amp;lt;input name=&quot;writer&quot; class=&quot;form-control&quot;&amp;gt;
								&amp;lt;/div&amp;gt;
							 	&amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-default&quot;&amp;gt;Submit Button&amp;lt;/button&amp;gt;
                                &amp;lt;button type=&quot;reset&quot; class=&quot;btn btn-default&quot;&amp;gt;Reset Button&amp;lt;/button&amp;gt;
							&amp;lt;/form&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;!-- /.panel-body --&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- /.panel --&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- /.col-lg-12 --&amp;gt;
            &amp;lt;/div&amp;gt;
&amp;lt;%@include file=&quot;../include/footer.jsp&quot; %&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;1023&quot; data-origin-height=&quot;774&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFwMJ8/btsLIN1NJZQ/AT3mrdB4Iel3Su4XYE6Ui0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFwMJ8/btsLIN1NJZQ/AT3mrdB4Iel3Su4XYE6Ui0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFwMJ8/btsLIN1NJZQ/AT3mrdB4Iel3Su4XYE6Ui0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFwMJ8%2FbtsLIN1NJZQ%2FAT3mrdB4Iel3Su4XYE6Ui0%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;1023&quot; height=&quot;774&quot; data-origin-width=&quot;1023&quot; data-origin-height=&quot;774&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;input 태그와 textare 태그에 글을 작성하면 bno값이 null로 뜸. 왜 그런가를 찾아보니 Controller에서 Service를 설정해주지 않음&lt;/p&gt;
&lt;pre id=&quot;code_1736427307017&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.zerock.domain.BoardVO;
import org.zerock.service.BoardService;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@RequestMapping(&quot;/board/*&quot;)
@RequiredArgsConstructor
@Log4j
public class BoardController {

(...생략...)

	@PostMapping(&quot;/register&quot;)
	public String register(BoardVO boardVO, RedirectAttributes redirectAttributes) {
		log.info(&quot;BoardController register()....................&quot;);
		boardService.register(boardVO);
		log.info(&quot;register : &quot; + boardVO);
		redirectAttributes.addFlashAttribute(&quot;result : &quot; + boardVO.getBno()); // addFlashAttribute 잠깐 결과를 보내는 방식
		// ※ redirectAttributes.addAttribute(&quot;result : &quot; + boardVO.getBno()) // 브라우저의 링크와 같이 연결, list?bno= 이런 형식으로 할 때 쓰임
		
		return &quot;redirect:/board/list&quot;;
	}
	
(...생략...)
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 한글로 글을 작성하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJcraQ/btsLI6tjJJg/d09pXiLhBKbCVxHPJyGpUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJcraQ/btsLI6tjJJg/d09pXiLhBKbCVxHPJyGpUk/img.png&quot; data-origin-width=&quot;1019&quot; data-origin-height=&quot;769&quot; data-is-animation=&quot;false&quot; style=&quot;width: 27.1335%; margin-right: 10px;&quot; data-widthpercent=&quot;27.45&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJcraQ/btsLI6tjJJg/d09pXiLhBKbCVxHPJyGpUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJcraQ%2FbtsLI6tjJJg%2Fd09pXiLhBKbCVxHPJyGpUk%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;1019&quot; height=&quot;769&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tDbtz/btsLIlR0wX2/c7nwYKn8d54qr6ilCRNMl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tDbtz/btsLIlR0wX2/c7nwYKn8d54qr6ilCRNMl0/img.png&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;287&quot; data-is-animation=&quot;false&quot; style=&quot;width: 71.7037%;&quot; data-widthpercent=&quot;72.55&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tDbtz/btsLIlR0wX2/c7nwYKn8d54qr6ilCRNMl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtDbtz%2FbtsLIlR0wX2%2Fc7nwYKn8d54qr6ilCRNMl0%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;1005&quot; height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한글이 깨짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;한글 문제와 UTF-8 필터 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;web.xml 필터 추가&lt;/p&gt;
&lt;pre id=&quot;code_1736427632388&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;filter&amp;gt;
		&amp;lt;filter-name&amp;gt;encodingFilter&amp;lt;/filter-name&amp;gt;
		&amp;lt;filter-class&amp;gt;
			org.springframework.web.filter.CharacterEncodingFilter
		&amp;lt;/filter-class&amp;gt;
		&amp;lt;init-param&amp;gt;
			&amp;lt;param-name&amp;gt;encoding&amp;lt;/param-name&amp;gt;
			&amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt;
		&amp;lt;/init-param&amp;gt;
		&amp;lt;init-param&amp;gt;
			&amp;lt;param-name&amp;gt;forceEncoding&amp;lt;/param-name&amp;gt;
			&amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;
		&amp;lt;/init-param&amp;gt;
	&amp;lt;/filter&amp;gt;
	&amp;lt;filter-mapping&amp;gt;
		&amp;lt;filter-name&amp;gt;encodingFilter&amp;lt;/filter-name&amp;gt;
		&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
	&amp;lt;/filter-mapping&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;998&quot; data-origin-height=&quot;289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rnVqm/btsLI4WwTNA/IGaKT3o1V8F9QdsWklw2Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rnVqm/btsLI4WwTNA/IGaKT3o1V8F9QdsWklw2Sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rnVqm/btsLI4WwTNA/IGaKT3o1V8F9QdsWklw2Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrnVqm%2FbtsLI4WwTNA%2FIGaKT3o1V8F9QdsWklw2Sk%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;998&quot; height=&quot;289&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;289&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한글이 정상적으로 처리된 결&lt;/p&gt;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/328</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-11#entry328comment</comments>
      <pubDate>Thu, 9 Jan 2025 22:07:38 +0900</pubDate>
    </item>
    <item>
      <title>스프링 웹 프로젝트 10</title>
      <link>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-10</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;ex02에서 Tomcat으로 서버를 구동했을 때 아래와 같은 오류가 발생함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 아 래 -&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;org.springframework.beans.factory.BeanCreationException:&amp;nbsp;Error&amp;nbsp;creating&amp;nbsp;bean&amp;nbsp;with&amp;nbsp;name&amp;nbsp;'hikariConfig'&amp;nbsp;defined&amp;nbsp;in&amp;nbsp;ServletContext&amp;nbsp;resource&amp;nbsp;[/WEB-INF/spring/root-context.xml]:&amp;nbsp;Error&amp;nbsp;setting&amp;nbsp;property&amp;nbsp;values;&amp;nbsp;nested&amp;nbsp;exception&amp;nbsp;is&amp;nbsp;org.springframework.beans.PropertyBatchUpdateException;&amp;nbsp;nested&amp;nbsp;PropertyAccessExceptions&amp;nbsp;(1)&amp;nbsp;are:&amp;nbsp;PropertyAccessException&amp;nbsp;1:&amp;nbsp;org.springframework.beans.MethodInvocationException:&amp;nbsp;Property&amp;nbsp;'driverClassName'&amp;nbsp;threw&amp;nbsp;exception;&amp;nbsp;nested&amp;nbsp;exception&amp;nbsp;is&amp;nbsp;java.lang.NoClassDefFoundError:&amp;nbsp;Unable&amp;nbsp;to&amp;nbsp;find&amp;nbsp;Log4j2&amp;nbsp;as&amp;nbsp;default&amp;nbsp;logging&amp;nbsp;library.&amp;nbsp;Please&amp;nbsp;provide&amp;nbsp;a&amp;nbsp;logging&amp;nbsp;library&amp;nbsp;and&amp;nbsp;configure&amp;nbsp;a&amp;nbsp;valid&amp;nbsp;spyLogDelegator&amp;nbsp;name&amp;nbsp;in&amp;nbsp;the&amp;nbsp;properties&amp;nbsp;file.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 끝 -&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex01은 hikariCP를 사용하지 않아서 제대로 서버가 구동되는데, ex00도 마찬가지로 위의 오류 메시지가 발생하면서 서버가 제대로 구동되지 못함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 오류는 Log4j2 로깅 라이브러리가 누락되어 발생함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Log4j2는 Spring과 HikariCP가 로그를 기록하는 데 사용하는 로깅 라이브러리 중 하나인데, Spring이나 HikariCP와 같은 라이브러리는 로깅을 처리하는 데 외부 로깅 라이브러리(Log4j, Logback 등)를 필요로 함. HikariConfig의 초기화 과정에서 로그를 기록하려고 할 때, 해당 로그를 처리할 로깅 라이브러리가 없으면 NoClassDefFoundError가 발생.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결하기 위해 pom.xml에 두 가지 라이브러리를 추가해줌으로서 해결함&lt;/p&gt;
&lt;pre id=&quot;code_1736341989164&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.apache.logging.log4j&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;log4j-api&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;2.0.1&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.apache.logging.log4j&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;log4j-core&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;2.0.1&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;log4j-api&lt;br /&gt;Log4j2의 API를 제공하는 라이브러리, 이 라이브러리를 통해 애플리케이션에서 로그를 작성하고, 로그 수준, 로그 출력 등을 설정할 수 있음&lt;/li&gt;
&lt;li&gt;log4j-core&lt;br /&gt;실제 로깅 기능을 수행하는 구현체, 이 라이브러리가 로깅 메시지를 콘솔, 파일 등으로 출력할 수 있게 해줌&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;log4j-api와 log4j-core 의존성을 추가하면, Log4j가 애플리케이션에 포함되어 HikariCP나 Spring에서 로그를 기록할 수 있게 됨. 이로 인해 NoClassDefFoundError가 발생하지 않게 되고, HikariConfig 빈을 정상적으로 생성할 수 있게 됨&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;u&gt;&lt;b&gt;로깅 라이브러리가 없으면 Spring이나 HikariCP가 내부에서 로그를 기록할 때 오류가 발생할 수 있음.&lt;/b&gt;&lt;/u&gt;&amp;nbsp;log4j-api와 log4j-core 의존성을 추가하여 이 문제를 해결&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;color: #222222; text-align: start;&quot;&gt;프레젠테이션(웹) 계층의 CRUD 구현&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9Jz6M/btsLHRQFA6Q/mKoxSTM16BwBbpTrPNm8mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9Jz6M/btsLHRQFA6Q/mKoxSTM16BwBbpTrPNm8mk/img.png&quot; data-origin-width=&quot;146&quot; data-origin-height=&quot;60&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;59.44&quot; style=&quot;width: 58.7531%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9Jz6M/btsLHRQFA6Q/mKoxSTM16BwBbpTrPNm8mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9Jz6M%2FbtsLHRQFA6Q%2FmKoxSTM16BwBbpTrPNm8mk%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;146&quot; height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/barQlF/btsLHl5FS0D/XKzuyhiyARarB40bTltkXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/barQlF/btsLHl5FS0D/XKzuyhiyARarB40bTltkXk/img.png&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;459&quot; data-is-animation=&quot;false&quot; style=&quot;width: 40.0841%;&quot; data-widthpercent=&quot;40.56&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/barQlF/btsLHl5FS0D/XKzuyhiyARarB40bTltkXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbarQlF%2FbtsLHl5FS0D%2FXKzuyhiyARarB40bTltkXk%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;762&quot; height=&quot;459&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1736343684004&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.zerock.service.BoardService;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@RequestMapping(&quot;/board/*&quot;)
@RequiredArgsConstructor
@Log4j
public class BoardController {

	private final BoardService boardService;
	
	@GetMapping(&quot;/list&quot;)
	public void list(Model model) { // Model 전달 당시에는 없는데 화면에 추가적인 데이터가 필요한 경우 사용
		log.info(&quot;BoardController list()................&quot;);
		model.addAttribute(&quot;list&quot;, boardService.getList());
	}
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736343690821&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;board/list&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;list page&amp;lt;/h1&amp;gt;
${list}
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;1560&quot; data-origin-height=&quot;696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JfLJK/btsLHQKZ8BC/bRixn7xFjPRsKsne5l9mUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JfLJK/btsLHQKZ8BC/bRixn7xFjPRsKsne5l9mUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JfLJK/btsLHQKZ8BC/bRixn7xFjPRsKsne5l9mUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJfLJK%2FbtsLHQKZ8BC%2FbRixn7xFjPRsKsne5l9mUK%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;1560&quot; height=&quot;696&quot; data-origin-width=&quot;1560&quot; data-origin-height=&quot;696&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;BoardController의 등록처리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;POST 방식으로 처리되는 데이터를 BoardVO 타입의 인스턴스로 바인딩해서 메서드에서 활용&lt;/li&gt;
&lt;li&gt;BoardService를 이용해서 등록 처리&lt;/li&gt;
&lt;li&gt;'redirect:'를 이용해서 다시 목록으로 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1736344016854&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.zerock.domain.BoardVO;
import org.zerock.service.BoardService;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@RequestMapping(&quot;/board/*&quot;)
@RequiredArgsConstructor
@Log4j
public class BoardController {

	private final BoardService boardService;
	
(...생략...)

	@PostMapping(&quot;/register&quot;)
	public String register(BoardVO boardVO, RedirectAttributes redirectAttributes) {
		log.info(&quot;BoardController register()....................&quot;);
		log.info(&quot;register : &quot; + boardVO);
		redirectAttributes.addFlashAttribute(&quot;result : &quot; + boardVO.getBno());
		return &quot;redirect:/board/list&quot;;
	}
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736344221677&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.controller;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import lombok.AllArgsConstructor;
import lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration({
	&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;, 
	&quot;file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml&quot;})
@Log4j
public class BoardControllerTests {

	@Setter(onMethod_ = {@Autowired})
	private WebApplicationContext ctx;
	
	private MockMvc mockMvc;
	
(...생략...)

	@Test
	public void testRegister() throws Exception{
		log.info(
				mockMvc.perform(
						MockMvcRequestBuilders.post(&quot;/board/register&quot;).param(&quot;title&quot;, &quot;Test 테스트&quot;)
																  .param(&quot;content&quot;, &quot;content&quot;)
																  .param(&quot;writer&quot;, &quot;user1&quot;))
					   .andReturn()
					   .getModelAndView()
					   .getModelMap());
	}
}&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;1465&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XD9um/btsLHxkmOhV/A8spP9K6ZakO8SK0RFT8t1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XD9um/btsLHxkmOhV/A8spP9K6ZakO8SK0RFT8t1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XD9um/btsLHxkmOhV/A8spP9K6ZakO8SK0RFT8t1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXD9um%2FbtsLHxkmOhV%2FA8spP9K6ZakO8SK0RFT8t1%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;1465&quot; height=&quot;916&quot; data-origin-width=&quot;1465&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/327</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-10#entry327comment</comments>
      <pubDate>Wed, 8 Jan 2025 22:56:23 +0900</pubDate>
    </item>
    <item>
      <title>스프링 웹 프로젝트 9</title>
      <link>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;비즈니스 계층 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비즈니스 계층(서비스 계층)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;고객의 요구사항을 반영하는 계층&lt;/li&gt;
&lt;li&gt;업무의 단위로 설계(트랜잭션의 단위)&lt;/li&gt;
&lt;li&gt;여러 개의 Mapper나 DAO를 사용하는 경우가 존재&lt;/li&gt;
&lt;li&gt;xxxService 형태로 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bivTrk/btsLGPx8NJ2/gNnfi9L9g6R50whNReQJkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bivTrk/btsLGPx8NJ2/gNnfi9L9g6R50whNReQJkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bivTrk/btsLGPx8NJ2/gNnfi9L9g6R50whNReQJkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbivTrk%2FbtsLGPx8NJ2%2FgNnfi9L9g6R50whNReQJkk%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;804&quot; height=&quot;338&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 패키지 설정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;인터페이스와 클래스를 설정하고, root-context.xml에 등록&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1736239131422&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.service;

import java.util.List;

import org.zerock.domain.BoardVO;

public interface BoardService { // 고객과 의사소통하는 용어로 작성

	public void register(BoardVO boardVO);
	
	public BoardVO get(Long bno);
	
	public int modify(BoardVO boardVO);
	
	public int remove(Long bno);
	
	public List&amp;lt;BoardVO&amp;gt; getList();
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736239138600&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.service;

import java.util.List;

import org.springframework.stereotype.Service;
import org.zerock.domain.BoardVO;
import org.zerock.mapper.BoardMapper;

import lombok.RequiredArgsConstructor;
import lombok.ToString;
import lombok.extern.log4j.Log4j;

@Log4j
@Service
@RequiredArgsConstructor
@ToString
public class BoardServiceImpl implements BoardService{

	private final BoardMapper boardMapper;

	@Override
	public void register(BoardVO boardVO) {
		
		boardMapper.insert(boardVO);
		
	}

	@Override
	public BoardVO get(Long bno) {
		
		return boardMapper.read(bno);
	}

	@Override
	public int modify(BoardVO boardVO) {

		return boardMapper.update(boardVO);
	}

	@Override
	public int remove(Long bno) {
		
		return boardMapper.delete(bno);
	}

	@Override
	public List&amp;lt;BoardVO&amp;gt; getList() {
		
		return boardMapper.getList();
	}
	
	
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736239147640&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.service;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;)
@Log4j
public class BoardServiceTest {
	
	@Autowired
	private BoardService boardService;
	
	@Test
	public void testPrint() {
		log.info(boardService);
	}

}&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;1463&quot; data-origin-height=&quot;913&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDsQuU/btsLFJSYCgY/DOlkFBk7JUkygOcKXg92D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDsQuU/btsLFJSYCgY/DOlkFBk7JUkygOcKXg92D1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDsQuU/btsLFJSYCgY/DOlkFBk7JUkygOcKXg92D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDsQuU%2FbtsLFJSYCgY%2FDOlkFBk7JUkygOcKXg92D1%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;1463&quot; height=&quot;913&quot; data-origin-width=&quot;1463&quot; data-origin-height=&quot;913&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;pre id=&quot;code_1736239607835&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.service;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.domain.BoardVO;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;)
@Log4j
public class BoardServiceTest {
	
	@Autowired
	private BoardService boardService;
	
(...생략...)

	@Test
	public void testGetList() {
		boardService.getList().forEach(BoardVO -&amp;gt; log.info(boardService));
	}
	
}&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;1448&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP7OoX/btsLF1eDSx8/mlvnz0n9KQZ5VlNGacEch1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP7OoX/btsLF1eDSx8/mlvnz0n9KQZ5VlNGacEch1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP7OoX/btsLF1eDSx8/mlvnz0n9KQZ5VlNGacEch1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP7OoX%2FbtsLF1eDSx8%2Fmlvnz0n9KQZ5VlNGacEch1%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;1448&quot; height=&quot;600&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※&lt;/p&gt;
&lt;pre id=&quot;code_1736239751613&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.service;

import java.util.List;

import org.zerock.domain.BoardVO;

public interface BoardService { // 고객과 의사소통하는 용어로 작성

//	public void register(BoardVO boardVO);
	public Long register(BoardVO boardVO);
	
(...생략...)
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736239767511&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.service;

import java.util.List;

import org.springframework.stereotype.Service;
import org.zerock.domain.BoardVO;
import org.zerock.mapper.BoardMapper;

import lombok.RequiredArgsConstructor;
import lombok.ToString;
import lombok.extern.log4j.Log4j;

@Log4j
@Service
@RequiredArgsConstructor
@ToString
public class BoardServiceImpl implements BoardService{

	private final BoardMapper boardMapper;

//	@Override
//	public void register(BoardVO boardVO) {
//		
//		boardMapper.insert(boardVO);
//		
//	}
	@Override
	public Long register(BoardVO boardVO) {
		
		boardMapper.insertSelectKey(boardVO);
		
		return boardVO.getBno();
		
	}

(...생략...)
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736239914218&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.service;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.domain.BoardVO;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;)
@Log4j
public class BoardServiceTest {
	
	@Autowired
	private BoardService boardService;
	
(...생략...)

	@Test
	public void testRegister() {
		BoardVO boardVO = new BoardVO();
		boardVO.setTitle(&quot;testRegister() title test&quot;);
		boardVO.setContent(&quot;testRegister() content test&quot;);
		boardVO.setWriter(&quot;testRegister() writer test&quot;);
		
		long bno = boardService.register(boardVO);
		
		log.info(bno);
	}
	
}&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;1464&quot; data-origin-height=&quot;908&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pwVo9/btsLGPrpn9t/hV7TaQohMco34HFCirjn7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pwVo9/btsLGPrpn9t/hV7TaQohMco34HFCirjn7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pwVo9/btsLGPrpn9t/hV7TaQohMco34HFCirjn7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpwVo9%2FbtsLGPrpn9t%2FhV7TaQohMco34HFCirjn7K%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;1464&quot; height=&quot;908&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;908&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레젠테이션(웹) 계층의 CRUD 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 계층의 구현&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;웹 계층에서 가정 먼저 설계하는 것은 URI의 설계&lt;/li&gt;
&lt;li&gt;기준? &amp;rarr; 와이어프레임, 스토리보드&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 137px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;Task&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;URL&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;Method&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;Parameter&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;From&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;URL 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;전체 목록&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;/board/list&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;get&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;등록처리&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;/board/register&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;post&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;모든 항목&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;입력화면 필요&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;조회&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;/board/get&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;get&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;bno=n&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;삭제 처리&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;/board/remove&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;post&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;bno&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;입력화면 필요&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;수정 처리&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;/board/modify&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;post&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;모든 항목&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&gt;입력화면 필요&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 20px;&quot;&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;p data-ke-size=&quot;size16&quot;&gt;작업의 순서&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;목록페이지 : 모든 진입 경로인 동시에 입력을 가는 링크&lt;/li&gt;
&lt;li&gt;등록 입력/처리 : 게시물 등록 및 처리, 처리 후 이동&lt;/li&gt;
&lt;li&gt;조회 : 목록 페이지에서 특정 게시물로 이동&lt;/li&gt;
&lt;li&gt;수정/삭제 : 조회 페이지에서 수정/삭제 선택해 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller 목록 처리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;게시물(BoardVO)의 목록을 Model에 담아서 전달&lt;/li&gt;
&lt;li&gt;Model 전달 당시에는 없는데 화면에서 추가적인 데이터가 필요한 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1736241536254&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@Log4j
@RequestMapping(&quot;/board/*&quot;)
@RequiredArgsConstructor
public class BoardController {

	@GetMapping(&quot;/list&quot;)
	public void list() {
		log.info(&quot;BoardController list()&quot;);
	}
	
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736241541886&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.controller;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration // Test for Controller
@ContextConfiguration({&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;, &quot;file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml&quot;})
@Log4j
public class BoardControllerTest {

	@Setter(onMethod_ = {@Autowired})
	private WebApplicationContext context;
	
	private MockMvc mockMvc;
	
	@Before
	public void setup() {
		this.mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
	}
	
	@Test
	public void testList() throws Exception{
		log.info(
				mockMvc.perform(
						MockMvcRequestBuilders.get(&quot;/board/list&quot;))
					   .andReturn()
					   .getModelAndView()
					   .getModelMap());
	}
	
	
}&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;1469&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y9iYX/btsLGQDSfDh/NPJtqVQbGlv5UQiYGr3jN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y9iYX/btsLGQDSfDh/NPJtqVQbGlv5UQiYGr3jN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y9iYX/btsLGQDSfDh/NPJtqVQbGlv5UQiYGr3jN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY9iYX%2FbtsLGQDSfDh%2FNPJtqVQbGlv5UQiYGr3jN1%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;1469&quot; height=&quot;914&quot; data-origin-width=&quot;1469&quot; data-origin-height=&quot;914&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;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/326</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-9#entry326comment</comments>
      <pubDate>Tue, 7 Jan 2025 18:32:22 +0900</pubDate>
    </item>
    <item>
      <title>스프링 웹 프로젝트 8</title>
      <link>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;게시물 등록(Create)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;insert와 selectkey 사용&lt;/li&gt;
&lt;li&gt;생성된 게시물의 번호를 사용하는지에 따른 구분&lt;br /&gt;insert만 처리되고 생성된 PK 값을 알 필요가 없는 경우&lt;br /&gt;insert문이 실행되고, 생성된 PK 값을 알아야 하는경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ MyBatis를 사용할 때 #을 생각해야함. #은 getter나 setter로 생각&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;insert&lt;/p&gt;
&lt;pre id=&quot;code_1736144556810&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.mapper;

import java.util.List;

import org.zerock.domain.BoardVO;

public interface BoardMapper {

	List&amp;lt;BoardVO&amp;gt; getList();
	
	void insert(BoardVO boardVO); // 메서드 이름, 메서드 파라미터, 메서드 리턴 타입 순서로 생각을 함
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736144571185&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
	PUBLIC &quot;-//mybatis.org/DTD Mapper 3.0//EN&quot;
	&quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;org.zerock.mapper.BoardMapper&quot;&amp;gt;

	&amp;lt;select id=&quot;getList&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt;
		select * from tbl_board order by bno desc
	&amp;lt;/select&amp;gt;

	&amp;lt;insert id=&quot;insert&quot;&amp;gt;
		insert into tbl_board(bno, title,content, writer)
		values(seq_board.nextval, #{title}, #{content}, #{writer}) &amp;lt;!-- #은 ?로 바뀌고 get메서드 --&amp;gt;
	&amp;lt;/insert&amp;gt;


&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736144784834&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.mapper;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.domain.BoardVO;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;)
@Log4j
public class BoardMapperTest {
	
	@Autowired
	private BoardMapper boardMapper;
	
(...생략...)

	@Test
	public void testInsert() {
		log.info(&quot;=======================&quot;);
		BoardVO boardVO = new BoardVO();
		boardVO.setTitle(&quot;Title 테스트&quot;);
		boardVO.setContent(&quot;Content 테스트&quot;);
		boardVO.setWriter(&quot;Writer 테스트&quot;);
		
		boardMapper.insert(boardVO);
		
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nm8Ro/btsLFMHOsEC/y7FqCpdviDDmkCE3jBhIxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nm8Ro/btsLFMHOsEC/y7FqCpdviDDmkCE3jBhIxK/img.png&quot; data-origin-width=&quot;1467&quot; data-origin-height=&quot;829&quot; data-is-animation=&quot;false&quot; style=&quot;width: 64.4964%; margin-right: 10px;&quot; data-widthpercent=&quot;65.26&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nm8Ro/btsLFMHOsEC/y7FqCpdviDDmkCE3jBhIxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnm8Ro%2FbtsLFMHOsEC%2Fy7FqCpdviDDmkCE3jBhIxK%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;1467&quot; height=&quot;829&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEWDzn/btsLE34BLXa/W1AFOXrVbXDIZfxyswZvmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEWDzn/btsLE34BLXa/W1AFOXrVbXDIZfxyswZvmK/img.png&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;623&quot; data-is-animation=&quot;false&quot; style=&quot;width: 34.3408%;&quot; data-widthpercent=&quot;34.74&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEWDzn/btsLE34BLXa/W1AFOXrVbXDIZfxyswZvmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEWDzn%2FbtsLE34BLXa%2FW1AFOXrVbXDIZfxyswZvmK%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;587&quot; height=&quot;623&quot;/&gt;&lt;/span&gt;&lt;/div&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;selectkey&lt;/p&gt;
&lt;pre id=&quot;code_1736145048300&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.mapper;

import java.util.List;

import org.zerock.domain.BoardVO;

public interface BoardMapper {

(...생략...)

	void insertSelectKey(BoardVO boardVO);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736145221545&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
	PUBLIC &quot;-//mybatis.org/DTD Mapper 3.0//EN&quot;
	&quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;org.zerock.mapper.BoardMapper&quot;&amp;gt;

(...생략...)

	&amp;lt;insert id=&quot;insertSelectKey&quot;&amp;gt;
		&amp;lt;selectKey order=&quot;BEFORE&quot; keyProperty=&quot;bno&quot; resultType=&quot;long&quot;&amp;gt;
			select seq_board.nextval from dual
		&amp;lt;/selectKey&amp;gt; &amp;lt;!-- 성능은 훨씬 안좋음 --&amp;gt;
		insert into tbl_board(bno, title,content, writer)
		values(#{bno}, #{title}, #{content}, #{writer})
	&amp;lt;/insert&amp;gt;

&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736145483168&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.mapper;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.domain.BoardVO;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;)
@Log4j
public class BoardMapperTest {
	
(...생략...)

	@Test
	public void testInsertSelectKey() {
		BoardVO boardVO = new BoardVO();
		boardVO.setTitle(&quot;ISK_Title 테스트&quot;);
		boardVO.setContent(&quot;ISK_Content 테스트&quot;);
		boardVO.setWriter(&quot;ISK_Writer 테스트&quot;);
		boardMapper.insertSelectKey(boardVO);
		log.info(&quot;=======================&quot;);
		log.info(&quot;after insert selectkey &quot; + boardVO.getBno());
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kF7xB/btsLE3KhTPc/fXfXlnmErxkYvqtaIyTELk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kF7xB/btsLE3KhTPc/fXfXlnmErxkYvqtaIyTELk/img.png&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;911&quot; data-is-animation=&quot;false&quot; style=&quot;width: 60.9625%; margin-right: 10px;&quot; data-widthpercent=&quot;61.68&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kF7xB/btsLE3KhTPc/fXfXlnmErxkYvqtaIyTELk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkF7xB%2FbtsLE3KhTPc%2FfXfXlnmErxkYvqtaIyTELk%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;1464&quot; height=&quot;911&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RvqEI/btsLFD5sm0A/zagvBw33ofVq72sOA0MYd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RvqEI/btsLFD5sm0A/zagvBw33ofVq72sOA0MYd1/img.png&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;630&quot; data-is-animation=&quot;false&quot; style=&quot;width: 37.8748%;&quot; data-widthpercent=&quot;38.32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RvqEI/btsLFD5sm0A/zagvBw33ofVq72sOA0MYd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRvqEI%2FbtsLFD5sm0A%2FzagvBw33ofVq72sOA0MYd1%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;629&quot; height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/div&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;게시물의 조회(read)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;BoardMapper에&amp;nbsp; read관련된 메서드 추가&lt;/li&gt;
&lt;li&gt;BoardMapper.xml의 SQL 추가&lt;/li&gt;
&lt;li&gt;테스트를 통한 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1736147689990&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.mapper;

import java.util.List;

import org.zerock.domain.BoardVO;

public interface BoardMapper {

(...생략...)
	
	BoardVO read(Long bno);

}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736147702784&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
	PUBLIC &quot;-//mybatis.org/DTD Mapper 3.0//EN&quot;
	&quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;org.zerock.mapper.BoardMapper&quot;&amp;gt;

(...생략...)

	&amp;lt;select id=&quot;read&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt; &amp;lt;!-- Alias로 할 수도 있음 --&amp;gt;
		select * from tbl_board where bno = #{bno}
	&amp;lt;/select&amp;gt;

&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736147717005&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.mapper;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.domain.BoardVO;

import lombok.extern.log4j.Log4j;
import oracle.net.aso.b;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;)
@Log4j
public class BoardMapperTest {
	
	@Autowired
	private BoardMapper boardMapper;
	
(...생략...)

	@Test
	public void read() {
		BoardVO boardVO = boardMapper.read(21L);
		log.info(boardVO);
	}

}&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;1461&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7usE4/btsLEHguUc8/3PrsVabJJCI1kfSiJacR10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7usE4/btsLEHguUc8/3PrsVabJJCI1kfSiJacR10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7usE4/btsLEHguUc8/3PrsVabJJCI1kfSiJacR10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7usE4%2FbtsLEHguUc8%2F3PrsVabJJCI1kfSiJacR10%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;1461&quot; height=&quot;912&quot; data-origin-width=&quot;1461&quot; data-origin-height=&quot;912&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;/p&gt;
&lt;pre id=&quot;code_1736147827587&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.mapper;

import java.util.List;

import org.zerock.domain.BoardVO;

public interface BoardMapper {

(...생략...)
	
	// 삭제 리턴 타입을 int로 하는 이유? 몇 건이 삭제되었는지 알아보기 위해 사용
	int delete(Long bno);

}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736147867888&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
	PUBLIC &quot;-//mybatis.org/DTD Mapper 3.0//EN&quot;
	&quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;org.zerock.mapper.BoardMapper&quot;&amp;gt;

(...생략...)

	&amp;lt;delete id=&quot;delete&quot;&amp;gt;
		delete from tbl_board where bno = #{bno}
	&amp;lt;/delete&amp;gt;

&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736148055093&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.mapper;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.domain.BoardVO;

import lombok.extern.log4j.Log4j;
import oracle.net.aso.b;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;)
@Log4j
public class BoardMapperTest {
	
	@Autowired
	private BoardMapper boardMapper;
	
(...생략...)

	@Test
	public void testDelete() {
		int count = boardMapper.delete(21L);
		log.info(&quot;count : &quot; + count);
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rE5LA/btsLEJ6rbAS/ECksB1vta3oPvt2bItNtk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rE5LA/btsLEJ6rbAS/ECksB1vta3oPvt2bItNtk0/img.png&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;912&quot; data-is-animation=&quot;false&quot; style=&quot;width: 61.6794%; margin-right: 10px;&quot; data-widthpercent=&quot;62.41&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rE5LA/btsLEJ6rbAS/ECksB1vta3oPvt2bItNtk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrE5LA%2FbtsLEJ6rbAS%2FECksB1vta3oPvt2bItNtk0%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;1464&quot; height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rXXQs/btsLDIUDqZM/9uMzLSKwJgNqWftqiE4w71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rXXQs/btsLDIUDqZM/9uMzLSKwJgNqWftqiE4w71/img.png&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;668&quot; data-is-animation=&quot;false&quot; style=&quot;width: 37.1578%;&quot; data-widthpercent=&quot;37.59&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rXXQs/btsLDIUDqZM/9uMzLSKwJgNqWftqiE4w71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrXXQs%2FbtsLDIUDqZM%2F9uMzLSKwJgNqWftqiE4w71%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;646&quot; height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/div&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;/p&gt;
&lt;pre id=&quot;code_1736148375873&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.mapper;

import java.util.List;

import org.zerock.domain.BoardVO;

public interface BoardMapper {

(...생략...)
	
	int update(BoardVO boardVO);

}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736148391132&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
	PUBLIC &quot;-//mybatis.org/DTD Mapper 3.0//EN&quot;
	&quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;org.zerock.mapper.BoardMapper&quot;&amp;gt;

(...생략...)

	&amp;lt;update id=&quot;update&quot;&amp;gt;
		update tbl_board
		set title = #{title}, content = #{content}, writer = #{writer}, updatedate = sysdate
		where bno = #{bno} 
	&amp;lt;/update&amp;gt;

&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736148404954&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.mapper;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.domain.BoardVO;

import lombok.extern.log4j.Log4j;
import oracle.net.aso.b;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;)
@Log4j
public class BoardMapperTest {
	
	@Autowired
	private BoardMapper boardMapper;
	
(...생략...)

	@Test
	public void testUpdate() {
		BoardVO boardVO = new BoardVO();
		boardVO.setBno(1L);
		boardVO.setTitle(&quot;Update Title&quot;);
		boardVO.setContent(&quot;Update Content&quot;);
		boardVO.setWriter(&quot;Update Writer&quot;);
		
		log.info(&quot;count &quot; + boardMapper.update(boardVO));
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yUiUd/btsLDUUT2QB/X0EhwaYWDN1XaTbrKLCTf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yUiUd/btsLDUUT2QB/X0EhwaYWDN1XaTbrKLCTf0/img.png&quot; data-origin-width=&quot;1459&quot; data-origin-height=&quot;912&quot; data-is-animation=&quot;false&quot; style=&quot;width: 59.525%; margin-right: 10px;&quot; data-widthpercent=&quot;60.23&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yUiUd/btsLDUUT2QB/X0EhwaYWDN1XaTbrKLCTf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyUiUd%2FbtsLDUUT2QB%2FX0EhwaYWDN1XaTbrKLCTf0%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;1459&quot; height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/znt0G/btsLEryaHzs/SArNemlGXk58kXWILUTUKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/znt0G/btsLEryaHzs/SArNemlGXk58kXWILUTUKk/img.png&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;672&quot; data-is-animation=&quot;false&quot; style=&quot;width: 39.3122%;&quot; data-widthpercent=&quot;39.77&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/znt0G/btsLEryaHzs/SArNemlGXk58kXWILUTUKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fznt0G%2FbtsLEryaHzs%2FSArNemlGXk58kXWILUTUKk%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;710&quot; height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sql에서 update from으로 작성했을 때 java.sql.SQLSyntaxErrorException: ORA-00903: invalid table name 에러가 발생함. update from 테이블명(X) update 테이블명(O)&lt;/p&gt;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/325</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-8#entry325comment</comments>
      <pubDate>Mon, 6 Jan 2025 16:37:28 +0900</pubDate>
    </item>
    <item>
      <title>스프링 웹 프로젝트 7</title>
      <link>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-7</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;각 영역의 네이밍 규칙&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;xxController&amp;nbsp;&lt;br /&gt;스프링 MVC에서 동작하는 Controller 클래스&lt;/li&gt;
&lt;li&gt;xxService, xxServiceImpl&amp;nbsp;&lt;br /&gt;비즈니스 영역을 담당하는 인터페이스는 ~~Service라는 방식을 사용하고,&lt;br /&gt;인터페이스를 구현한 클래스는 ~~ServiceImpl이라는 이름을 사용&lt;/li&gt;
&lt;li&gt;xxDAO, xxRepository&lt;br /&gt;DAO(Data-Access-Object)나 Repository(저장소)라는 이름으로 영역을 따로 구성하는 것이 보편적&lt;/li&gt;
&lt;li&gt;VO, DTO&lt;br /&gt;VO의 경우 주로 ReadOnly의 목적이 강하고 데이터 자체도 불변하게 설계&lt;br /&gt;DTO는 주로 데이터 수집의 용도로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 네이밍 규칙(ex. com.001cloudid)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;.config : 프로젝트와 관련된 설정 클래스들의 보관 패키지&lt;/li&gt;
&lt;li&gt;.controller : 스프링 MVC의 Controller들의 보관 패키지&lt;/li&gt;
&lt;li&gt;.service : 스프링 Service 인터페이스와 구현 클래스 패키지&lt;/li&gt;
&lt;li&gt;.domain : VO, DTO 클래스들의 패키지&lt;/li&gt;
&lt;li&gt;.persistence : MyBatis Mapper 인터페이스 패키지&lt;/li&gt;
&lt;li&gt;.exception : 웹 관련 예외처리 패키지&lt;/li&gt;
&lt;li&gt;.aop : 스프링의 AOP 관련 패키지&lt;/li&gt;
&lt;li&gt;.security : 스프링 Security 관련 패키지&lt;/li&gt;
&lt;li&gt;.util : 각종 유틸리티 클래스 관련 패키지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와이어 프레임(기본적인 게시물의 CRUD 흐름) &lt;i&gt;&lt;u&gt;※구현의 시작부&lt;/u&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/board/list(게시물 목록) &amp;rarr; /board/register(게시물 등록) &amp;rarr; /board/list(게시물 목록 결과)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;/board/list(게시물 목록) &amp;rarr;&lt;span&gt; /board/get(게시물 조회) &amp;rarr; /board/modify(게시물 수정/삭제) &amp;rarr; /board/list(게시물 목록 결과)&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;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;프로젝트의 생성 및 준비&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Spring Legacy Project 생성&lt;/li&gt;
&lt;li&gt;pom.xml에서 스프링 버전 변경&lt;/li&gt;
&lt;li&gt;spring-test, spring-jdbc, spring-tx 추가&lt;/li&gt;
&lt;li&gt;junit 버전 번경&lt;/li&gt;
&lt;li&gt;Servlet 버전 변경&lt;/li&gt;
&lt;li&gt;HikariCP, MyBatis, mybatis-spring, Log4jdbc 추가&lt;/li&gt;
&lt;li&gt;JDBC 드라이버 프로젝트 내 추가&lt;/li&gt;
&lt;li&gt;기타 Lombok의 설정&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Spring Legacy Project 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring MVC Project&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z8ODb/btsLDk6N9MY/hBWa3ZvjvHdGrDBZVl9ep1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z8ODb/btsLDk6N9MY/hBWa3ZvjvHdGrDBZVl9ep1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z8ODb/btsLDk6N9MY/hBWa3ZvjvHdGrDBZVl9ep1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz8ODb%2FbtsLDk6N9MY%2FhBWa3ZvjvHdGrDBZVl9ep1%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;234&quot; height=&quot;184&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. pom.xml 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 버전, 자바 버전 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;spring-tx, spring-jdbc, spring-test 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MyBatis를 이용할 예정임므로 HikariCP, MyBatis, mybatis-spring, Log4jdbc 라이브러리 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트를 위한 jUnit 버전 변경 및 Lombok 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Servlet 3.0이상을 제대로 사용하기 위해서 서브릿 2.5버전이 아닌 3.0이상으로 수정&lt;/p&gt;
&lt;pre id=&quot;code_1736053111771&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;
	&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
	&amp;lt;groupId&amp;gt;org.zerock&amp;lt;/groupId&amp;gt;
	&amp;lt;artifactId&amp;gt;controller&amp;lt;/artifactId&amp;gt;
	&amp;lt;name&amp;gt;ex02&amp;lt;/name&amp;gt;
	&amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;
	&amp;lt;version&amp;gt;1.0.0-BUILD-SNAPSHOT&amp;lt;/version&amp;gt;
	&amp;lt;properties&amp;gt;
		&amp;lt;java-version&amp;gt;1.6&amp;lt;/java-version&amp;gt;
		&amp;lt;org.springframework-version&amp;gt;5.2.7.RELEASE&amp;lt;/org.springframework-version&amp;gt;
		&amp;lt;org.aspectj-version&amp;gt;1.6.10&amp;lt;/org.aspectj-version&amp;gt;
		&amp;lt;org.slf4j-version&amp;gt;1.6.6&amp;lt;/org.slf4j-version&amp;gt;
	&amp;lt;/properties&amp;gt;
	&amp;lt;dependencies&amp;gt;
		&amp;lt;!-- Spring --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
			&amp;lt;exclusions&amp;gt;
				&amp;lt;!-- Exclude Commons Logging in favor of SLF4j --&amp;gt;
				&amp;lt;exclusion&amp;gt;
					&amp;lt;groupId&amp;gt;commons-logging&amp;lt;/groupId&amp;gt;
					&amp;lt;artifactId&amp;gt;commons-logging&amp;lt;/artifactId&amp;gt;
				&amp;lt;/exclusion&amp;gt;
			&amp;lt;/exclusions&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;!-- DB 세팅 연결 확인 --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-test&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-jdbc&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-tx&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- AspectJ --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.aspectj&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;aspectjrt&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.aspectj-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- Logging --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.slf4j-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;jcl-over-slf4j&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.slf4j-version}&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.slf4j-version}&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;log4j&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;log4j&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;1.2.17&amp;lt;/version&amp;gt;
			&amp;lt;exclusions&amp;gt;
				&amp;lt;exclusion&amp;gt;
					&amp;lt;groupId&amp;gt;javax.mail&amp;lt;/groupId&amp;gt;
					&amp;lt;artifactId&amp;gt;mail&amp;lt;/artifactId&amp;gt;
				&amp;lt;/exclusion&amp;gt;
				&amp;lt;exclusion&amp;gt;
					&amp;lt;groupId&amp;gt;javax.jms&amp;lt;/groupId&amp;gt;
					&amp;lt;artifactId&amp;gt;jms&amp;lt;/artifactId&amp;gt;
				&amp;lt;/exclusion&amp;gt;
				&amp;lt;exclusion&amp;gt;
					&amp;lt;groupId&amp;gt;com.sun.jdmk&amp;lt;/groupId&amp;gt;
					&amp;lt;artifactId&amp;gt;jmxtools&amp;lt;/artifactId&amp;gt;
				&amp;lt;/exclusion&amp;gt;
				&amp;lt;exclusion&amp;gt;
					&amp;lt;groupId&amp;gt;com.sun.jmx&amp;lt;/groupId&amp;gt;
					&amp;lt;artifactId&amp;gt;jmxri&amp;lt;/artifactId&amp;gt;
				&amp;lt;/exclusion&amp;gt;
			&amp;lt;/exclusions&amp;gt;
			&amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;1.18.36&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;com.zaxxer&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;HikariCP&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;3.4.5&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;mybatis&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;3.5.6&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;mybatis-spring&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;1.3.2&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4.1 --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.bgee.log4jdbc-log4j2&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;log4jdbc-log4j2-jdbc4.1&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;1.16&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc6 --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;com.oracle.database.jdbc&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;ojdbc6&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;11.2.0.4&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;1.18.36&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- @Inject --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;javax.inject&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;javax.inject&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;1&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- Servlet --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;javax.servlet-api&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;4.0.1&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;javax.servlet.jsp&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;jsp-api&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;2.1&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;jstl&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;1.2&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- Test --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;4.12&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;
	&amp;lt;/dependencies&amp;gt;
	&amp;lt;build&amp;gt;
		&amp;lt;plugins&amp;gt;
			&amp;lt;plugin&amp;gt;
				&amp;lt;artifactId&amp;gt;maven-eclipse-plugin&amp;lt;/artifactId&amp;gt;
				&amp;lt;version&amp;gt;2.9&amp;lt;/version&amp;gt;
				&amp;lt;configuration&amp;gt;
					&amp;lt;additionalProjectnatures&amp;gt;
						&amp;lt;projectnature&amp;gt;org.springframework.ide.eclipse.core.springnature&amp;lt;/projectnature&amp;gt;
					&amp;lt;/additionalProjectnatures&amp;gt;
					&amp;lt;additionalBuildcommands&amp;gt;
						&amp;lt;buildcommand&amp;gt;org.springframework.ide.eclipse.core.springbuilder&amp;lt;/buildcommand&amp;gt;
					&amp;lt;/additionalBuildcommands&amp;gt;
					&amp;lt;downloadSources&amp;gt;true&amp;lt;/downloadSources&amp;gt;
					&amp;lt;downloadJavadocs&amp;gt;true&amp;lt;/downloadJavadocs&amp;gt;
				&amp;lt;/configuration&amp;gt;
			&amp;lt;/plugin&amp;gt;
			&amp;lt;plugin&amp;gt;
				&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
				&amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
				&amp;lt;version&amp;gt;2.5.1&amp;lt;/version&amp;gt;
				&amp;lt;configuration&amp;gt;
					&amp;lt;source&amp;gt;1.8&amp;lt;/source&amp;gt;
					&amp;lt;target&amp;gt;1.8&amp;lt;/target&amp;gt;
					&amp;lt;compilerArgument&amp;gt;-Xlint:all&amp;lt;/compilerArgument&amp;gt;
					&amp;lt;showWarnings&amp;gt;true&amp;lt;/showWarnings&amp;gt;
					&amp;lt;showDeprecation&amp;gt;true&amp;lt;/showDeprecation&amp;gt;
				&amp;lt;/configuration&amp;gt;
			&amp;lt;/plugin&amp;gt;
			&amp;lt;plugin&amp;gt;
				&amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
				&amp;lt;artifactId&amp;gt;exec-maven-plugin&amp;lt;/artifactId&amp;gt;
				&amp;lt;version&amp;gt;1.2.1&amp;lt;/version&amp;gt;
				&amp;lt;configuration&amp;gt;
					&amp;lt;mainClass&amp;gt;org.test.int1.Main&amp;lt;/mainClass&amp;gt;
				&amp;lt;/configuration&amp;gt;
			&amp;lt;/plugin&amp;gt;
		&amp;lt;/plugins&amp;gt;
	&amp;lt;/build&amp;gt;
&amp;lt;/project&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;root-context.xml&lt;/p&gt;
&lt;pre id=&quot;code_1736054043924&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xmlns:mybatis-spring=&quot;http://mybatis.org/schema/mybatis-spring&quot;
	xsi:schemaLocation=&quot;http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd&quot;&amp;gt;
	
	&amp;lt;!-- Root Context: defines shared resources visible to all other web components --&amp;gt;

	&amp;lt;bean id=&quot;hikariConnfig&quot; class=&quot;com.zaxxer.hikari.HikariConfig&quot;&amp;gt;
		&amp;lt;property name=&quot;driverClassName&quot; value=&quot;net.sf.log4jdbc.sql.jdbcapi.DriverSpy&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;jdbcUrl&quot; value=&quot;jdbc:log4jdbc:oracle:thin:@localhost:1521:XE&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;username&quot; value=&quot;book_ex&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;password&quot; value=&quot;book_ex&quot;&amp;gt;&amp;lt;/property&amp;gt;
	&amp;lt;/bean&amp;gt;
	
	&amp;lt;bean id=&quot;dateSource&quot; class=&quot;com.zaxxer.hikari.HikariDataSource&quot; destroy-method=&quot;close&quot;&amp;gt;
		&amp;lt;constructor-arg ref=&quot;hikariConnfig&quot; /&amp;gt;
	&amp;lt;/bean&amp;gt;

	&amp;lt;bean id=&quot;sqlSessionFactory&quot; class=&quot;org.mybatis.spring.SqlSessionFactoryBean&quot;&amp;gt;
		&amp;lt;property name=&quot;dataSource&quot; ref=&quot;dateSource&quot;&amp;gt;&amp;lt;/property&amp;gt;
	&amp;lt;/bean&amp;gt;

	&amp;lt;mybatis-spring:scan base-package=&quot;org.zerock.mapper&quot;/&amp;gt;
		
&amp;lt;/beans&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;servlet-context.xml&lt;/p&gt;
&lt;pre id=&quot;code_1736054067678&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/mvc&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
	xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
	xsi:schemaLocation=&quot;http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd&quot;&amp;gt;

	&amp;lt;!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --&amp;gt;
	
	&amp;lt;!-- Enables the Spring MVC @Controller programming model --&amp;gt;
	&amp;lt;annotation-driven /&amp;gt;

	&amp;lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&amp;gt;
	&amp;lt;resources mapping=&quot;/resources/**&quot; location=&quot;/resources/&quot; /&amp;gt;

	&amp;lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&amp;gt;
	&amp;lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&amp;gt;
		&amp;lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&amp;gt;
		&amp;lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&amp;gt;
	&amp;lt;/beans:bean&amp;gt;
	
	&amp;lt;context:component-scan base-package=&quot;org.zerock.controller&quot; /&amp;gt;
	
	
	
&amp;lt;/beans:beans&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;/p&gt;
&lt;pre id=&quot;code_1736054365388&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;create SEQUENCE seq_board; -- 아무 의미가 없는 번호/구분을 위한 번호

create table tbl_board(
    bno number(10,0),
    title varchar2(200) not null,
    content varchar2(2000) not null,
    writer varchar2(50) not null,
    regdate date default sysdate,
    updatedate date default sysdate
);

-- 모든 데이터베이스에 저장되는 것은 명사와 히스토리


-- PK
alter table tbl_board add constraint pk_board
primary  key(bno);&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;rarr; 추가시 한글이 깨지는지 확인 &amp;rarr; 데이터 추가 시 한글로 된 데이터로&lt;/p&gt;
&lt;pre id=&quot;code_1736054569164&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;insert into tbl_board(bno, title, content, writer)
values(seq_board.nextval, '테스트 제목', '테스트 내용', 'user00');&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;539&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cA8PyN/btsLDuPeqN4/FgPb0yaAvQkhQchAonovCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cA8PyN/btsLDuPeqN4/FgPb0yaAvQkhQchAonovCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cA8PyN/btsLDuPeqN4/FgPb0yaAvQkhQchAonovCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcA8PyN%2FbtsLDuPeqN4%2FFgPb0yaAvQkhQchAonovCK%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;539&quot; height=&quot;161&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 자바 파일은 실행하기전 반드시 저장하듯이 dbms는 커밋을 해줘야함&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;테이블의 컬럼 구조를 반영하는 VO(Value Object) 클래스의 생성&lt;/li&gt;
&lt;li&gt;MyBatis의 Mapper 인터페이스의 작성/XML 처리&lt;/li&gt;
&lt;li&gt;작성한 Mapper 인터페이스의 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VO클래스 &amp;rarr; 테이블과 동일하게 맞춰주면 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardVO&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ml1zR/btsLCqNrPnC/r7psNVJcvaFaFEtEVByjL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ml1zR/btsLCqNrPnC/r7psNVJcvaFaFEtEVByjL1/img.png&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;433&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.0679%; margin-right: 10px;&quot; data-widthpercent=&quot;53.69&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ml1zR/btsLCqNrPnC/r7psNVJcvaFaFEtEVByjL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fml1zR%2FbtsLCqNrPnC%2Fr7psNVJcvaFaFEtEVByjL1%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;811&quot; height=&quot;433&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lxlZo/btsLDcVsGKE/o6XP53WeFGCGyixdxNvaIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lxlZo/btsLDcVsGKE/o6XP53WeFGCGyixdxNvaIK/img.png&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;169&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.7693%;&quot; data-widthpercent=&quot;46.31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lxlZo/btsLDcVsGKE/o6XP53WeFGCGyixdxNvaIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlxlZo%2FbtsLDcVsGKE%2Fo6XP53WeFGCGyixdxNvaIK%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;273&quot; height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYQ9PO/btsLDMINrY0/UbhKwZz9eRvNy6Kb6Ios5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYQ9PO/btsLDMINrY0/UbhKwZz9eRvNy6Kb6Ios5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYQ9PO/btsLDMINrY0/UbhKwZz9eRvNy6Kb6Ios5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYQ9PO%2FbtsLDMINrY0%2FUbhKwZz9eRvNy6Kb6Ios5k%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;795&quot; height=&quot;478&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;478&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1736055104328&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.domain;

import java.util.Date;

import lombok.Data;

@Data
public class BoardVO {
	
	// 데이터베이스 관련 작업을 할 때는 소문자로 하지 않음 &amp;rarr; 소문자로 하면 기본값을 가짐
	
	private Long bno;
	private String title, content, writer;
	private Date regdate, updateDate;
	
}&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;Mapper 인터페이스 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1736055208008&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.mapper;

import java.util.List;

import org.zerock.domain.BoardVO;

public interface BoardMapper {

	List&amp;lt;BoardVO&amp;gt; getList();
	
}&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;BoardMapper.xml&lt;/p&gt;
&lt;pre id=&quot;code_1736056206789&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
	PUBLIC &quot;-//mybatis.org/DTD Mapper 3.0//EN&quot;
	&quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;org.zerock.mapper.BoardMapper&quot;&amp;gt;

	&amp;lt;select id=&quot;getList&quot; resultType=&quot;org.zerock.domain.BoardVO&quot;&amp;gt;
		select * from tbl_board order by bno desc
	&amp;lt;/select&amp;gt;

&amp;lt;/mapper&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;BoardMapperTest&lt;/p&gt;
&lt;pre id=&quot;code_1736056213747&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.mapper;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;)
@Log4j
public class BoardMapperTest {
	
	@Autowired
	private BoardMapper boardMapper;
	
	@Test
	public void testGetList() {
		log.info(&quot;=======================&quot;);
		boardMapper.getList();
	}

}&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;1199&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNO4FX/btsLDOUatkh/kdTyIky8FHK5wlZxZuxoMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNO4FX/btsLDOUatkh/kdTyIky8FHK5wlZxZuxoMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNO4FX/btsLDOUatkh/kdTyIky8FHK5wlZxZuxoMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNO4FX%2FbtsLDOUatkh%2FkdTyIky8FHK5wlZxZuxoMK%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;1199&quot; height=&quot;882&quot; data-origin-width=&quot;1199&quot; data-origin-height=&quot;882&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;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/324</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-7#entry324comment</comments>
      <pubDate>Sun, 5 Jan 2025 14:50:46 +0900</pubDate>
    </item>
    <item>
      <title>스프링 웹 프로젝트 6</title>
      <link>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-6</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;파일업로드 처리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Servlet 3.0 이후(Tomcat 7.0)에는 기본적으로 업로드 되는 파일을 처리할 수 있는 기능이 추가&lt;/li&gt;
&lt;li&gt;별로 commos-fileupload 라이브러리를 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735961867820&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;commons-fileupload&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;commons-fileupload&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.4&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;파일 업로드를 위한 servlet-context.xml&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;multipartResolver라는 이름으로 스프링 빈 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735962231713&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;beans:bean id=&quot;multipartResolver&quot; class=&quot;org.springframework.web.multipart.commons.CommonsMultipartResolver&quot;&amp;gt;
		&amp;lt;beans:property name=&quot;defaultEncoding&quot; value=&quot;utf-8&quot;&amp;gt;&amp;lt;/beans:property&amp;gt;
		&amp;lt;beans:property name=&quot;maxUploadSize&quot; value=&quot;104857560&quot;&amp;gt;&amp;lt;/beans:property&amp;gt; &amp;lt;!-- 1024*1024*2bytes 2MB --&amp;gt;
		&amp;lt;beans:property name=&quot;uploadTempDir&quot; value=&quot;file:/C:/upload/tmp&quot;&amp;gt;&amp;lt;/beans:property&amp;gt;
		&amp;lt;beans:property name=&quot;maxInMemorySize&quot; value=&quot;10485756&quot;&amp;gt;&amp;lt;/beans:property&amp;gt;
	&amp;lt;/beans:bean&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디렉토리 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;673&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwNE4E/btsLEeq8mnS/tKgDgb82gsFN7kEIM2vMjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwNE4E/btsLEeq8mnS/tKgDgb82gsFN7kEIM2vMjK/img.png&quot; data-alt=&quot;경로 : C:\upload\tmp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwNE4E/btsLEeq8mnS/tKgDgb82gsFN7kEIM2vMjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwNE4E%2FbtsLEeq8mnS%2FtKgDgb82gsFN7kEIM2vMjK%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;969&quot; height=&quot;673&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;673&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;경로 : C:\upload\tmp&lt;/figcaption&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;파일 업로드를 위한 HTML&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;form 태그 내 enctype=&quot;multipart&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SampleController&lt;/p&gt;
&lt;pre id=&quot;code_1735962569180&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/exUpload&quot;) // 화면을 보는 것 기본 Get방식, 작업을 하는 것은 Post방식
	public void exUpload() {
		log.info(&quot;SampleController exUplad() log info&quot;); // log &amp;rarr; 작업이 어디까지 실행되었는지 확인하기 위해서
	}&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;1050&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgIYaY/btsLEeYXbWu/sW4UJhoOwFQFXdyw9UxXdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgIYaY/btsLEeYXbWu/sW4UJhoOwFQFXdyw9UxXdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgIYaY/btsLEeYXbWu/sW4UJhoOwFQFXdyw9UxXdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgIYaY%2FbtsLEeYXbWu%2FsW4UJhoOwFQFXdyw9UxXdK%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;1050&quot; height=&quot;304&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;304&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;901&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WdSgL/btsLErxcuMf/dTbMFfu0wmAYTQ38cKtvQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WdSgL/btsLErxcuMf/dTbMFfu0wmAYTQ38cKtvQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WdSgL/btsLErxcuMf/dTbMFfu0wmAYTQ38cKtvQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWdSgL%2FbtsLErxcuMf%2FdTbMFfu0wmAYTQ38cKtvQ1%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;901&quot; height=&quot;120&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735962862227&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
	pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;exUpload&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;h1&amp;gt;파일 업로드를 위한 HTML&amp;lt;/h1&amp;gt;
	&amp;lt;form action=&quot;/sample/exUploadPost&quot; method=&quot;post&quot;
		enctype=&quot;multiPart/form-data&quot;&amp;gt;
		&amp;lt;div&amp;gt;
			&amp;lt;input type=&quot;file&quot; name=&quot;files&quot;&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;div&amp;gt;
			&amp;lt;input type=&quot;file&quot; name=&quot;files&quot;&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;div&amp;gt;
			&amp;lt;input type=&quot;file&quot; name=&quot;files&quot;&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;div&amp;gt;
			&amp;lt;input type=&quot;file&quot; name=&quot;files&quot;&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;div&amp;gt;
			&amp;lt;input type=&quot;file&quot; name=&quot;files&quot;&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;div&amp;gt;
			&amp;lt;input type=&quot;submit&quot;&amp;gt;
		&amp;lt;/div&amp;gt;
	&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SampleController&lt;/p&gt;
&lt;pre id=&quot;code_1735963125437&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/exUploadPost&quot;)
	public void exUploadPost(ArrayList&amp;lt;MultipartFile&amp;gt; files) {
		files.forEach(file -&amp;gt;{
			log.info(&quot;=====================&quot;);
			log.info(&quot;name : &quot; + file.getOriginalFilename());
			log.info(&quot;size : &quot; + file.getSize());
			log.info(&quot;type : &quot; + file.getContentType());
		});
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KZICX/btsLDIGbZhB/kBgFqODC8IirqtQs5pScrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KZICX/btsLDIGbZhB/kBgFqODC8IirqtQs5pScrk/img.png&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;434&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.8166%; margin-right: 10px;&quot; data-widthpercent=&quot;46.36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KZICX/btsLDIGbZhB/kBgFqODC8IirqtQs5pScrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKZICX%2FbtsLDIGbZhB%2FkBgFqODC8IirqtQs5pScrk%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;683&quot; height=&quot;434&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgPYd8/btsLDX389VY/73LCvYhHEmKAZsklrHmDk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgPYd8/btsLDX389VY/73LCvYhHEmKAZsklrHmDk1/img.png&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;850&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.0206%;&quot; data-widthpercent=&quot;53.64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgPYd8/btsLDX389VY/73LCvYhHEmKAZsklrHmDk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgPYd8%2FbtsLDX389VY%2F73LCvYhHEmKAZsklrHmDk1%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;1548&quot; height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtXWdz/btsLEoNZOrT/yvlSOtqryVx9Pyo4a83bW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtXWdz/btsLEoNZOrT/yvlSOtqryVx9Pyo4a83bW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtXWdz/btsLEoNZOrT/yvlSOtqryVx9Pyo4a83bW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtXWdz%2FbtsLEoNZOrT%2FyvlSOtqryVx9Pyo4a83bW1%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;837&quot; height=&quot;470&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;470&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;컨트롤러의 예외 처리(Exception)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;@ExceptionHandler와 @ControllerAdvice를 이용한 처리 &amp;rarr; 서버&lt;/li&gt;
&lt;li&gt;@ResponseEntity를 이용하는 예외 메시지 구성 &amp;rarr; 클라이언트 데이터 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@ControllerAdvice(스프링 빈으로 등록)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;예외처리와 원래의 컨트롤러가 혼합된 형태의 클래스가 작성되는 방식&lt;/li&gt;
&lt;li&gt;@ExceptionHandler는 해당 메서드가 () 들어가는 예외 타입을 처리한다는 것을 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735963863549&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.exception;

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import lombok.extern.log4j.Log4j;

@ControllerAdvice
@Log4j
public class CommonExceptionAdvice {
	
	@ExceptionHandler(Exception.class)
	public String except(Exception exception, Model model) {
		log.error(&quot;Exception : &quot; + exception.getMessage());
		model.addAttribute(&quot;exception&quot;,exception);
		log.error(&quot;model : &quot; + model);
		return &quot;error_page&quot;;
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;servlet-context.xml&lt;/p&gt;
&lt;pre id=&quot;code_1735963890056&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;context:component-scan base-package=&quot;org.zerock.exception&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1735964194408&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
	pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;error_page&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;h1&amp;gt;error_page&amp;lt;/h1&amp;gt;
	&amp;lt;h4&amp;gt;
		&amp;lt;c:out value=&quot;${exception.getMessage()}&quot;&amp;gt;&amp;lt;/c:out&amp;gt;
	&amp;lt;/h4&amp;gt;

	&amp;lt;ul&amp;gt;
		&amp;lt;c:forEach items=&quot;${exception.getStackTrace()}&quot; var=&quot;stack&quot;&amp;gt;
			&amp;lt;li&amp;gt;&amp;lt;c:out value=&quot;${stack}&quot;&amp;gt;&amp;lt;/c:out&amp;gt;&amp;lt;/li&amp;gt;
		&amp;lt;/c:forEach&amp;gt;
	&amp;lt;/ul&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;959&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/belOKB/btsLEjMJM5T/gki6IRuRUBk1ge4ngw7cqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/belOKB/btsLEjMJM5T/gki6IRuRUBk1ge4ngw7cqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/belOKB/btsLEjMJM5T/gki6IRuRUBk1ge4ngw7cqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbelOKB%2FbtsLEjMJM5T%2Fgki6IRuRUBk1ge4ngw7cqK%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;959&quot; height=&quot;335&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;335&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;1296&quot; data-origin-height=&quot;26&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OfcRT/btsLDVL6ntj/dT7kjfhDVLrgfNATM5bSy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OfcRT/btsLDVL6ntj/dT7kjfhDVLrgfNATM5bSy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OfcRT/btsLDVL6ntj/dT7kjfhDVLrgfNATM5bSy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOfcRT%2FbtsLDVL6ntj%2FdT7kjfhDVLrgfNATM5bSy0%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;1296&quot; height=&quot;26&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;26&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;age값을 숫자가 아닌 값을 준다면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beWhUt/btsLEXvHr9R/a37RHQqHAJ4kMFPXnekQgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beWhUt/btsLEXvHr9R/a37RHQqHAJ4kMFPXnekQgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beWhUt/btsLEXvHr9R/a37RHQqHAJ4kMFPXnekQgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeWhUt%2FbtsLEXvHr9R%2Fa37RHQqHAJ4kMFPXnekQgk%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;1387&quot; height=&quot;389&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;389&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;1536&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1DD08/btsLCDFSFqa/bkI5peXYaNKqqZsqkoMivk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1DD08/btsLCDFSFqa/bkI5peXYaNKqqZsqkoMivk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1DD08/btsLCDFSFqa/bkI5peXYaNKqqZsqkoMivk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1DD08%2FbtsLCDFSFqa%2FbkI5peXYaNKqqZsqkoMivk%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;1536&quot; height=&quot;854&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;854&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;1460&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k2TqG/btsLEb2gyl6/y15oOkKnC0GASyWHOnvEqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k2TqG/btsLEb2gyl6/y15oOkKnC0GASyWHOnvEqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k2TqG/btsLEb2gyl6/y15oOkKnC0GASyWHOnvEqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk2TqG%2FbtsLEb2gyl6%2Fy15oOkKnC0GASyWHOnvEqK%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;1460&quot; height=&quot;95&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;95&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;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/323</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-6#entry323comment</comments>
      <pubDate>Sat, 4 Jan 2025 13:23:35 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트 7</title>
      <link>https://001cloudid.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-7</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문서 객체 모델 DOM(Document Object Model)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;웹에서 어떤 조건에 맞거나 사용자의 동작이 있을 때 웹 문서 전체 또는 일부분이 동적으로 반응하게 하는 것&lt;br /&gt;이렇게 반응하게 하려면 웹 문서의 모든 요소를 따로 제어할 수 있어야 함&lt;/li&gt;
&lt;li&gt;모든 정보 요소를 자바스크립트로 가져와 프로그래밍할 때 사용&lt;/li&gt;
&lt;li&gt;자바스크립트를 이용하여 웹 문서에 접근하고 제어할 수 있도록 객체를 사용해 웹 문서를 체계적으로 정리하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOM 트리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;웹 문서의 요소를 부모 요소와 자식 요소로 구분&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735701561954&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;html(root)&lt;br /&gt;head&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;body&lt;br /&gt;meta title&lt;/li&gt;
&lt;li&gt;부모와 자식 구조로 표시하면 나무 형태가 되므로 DOM 트리라고 함&lt;/li&gt;
&lt;li&gt;DOM 트리에서 가지가 갈라져 나간 항목을 노드라고 하며,&lt;br /&gt;DOM 트리의 시작 부분인 html 노드를 나무 뿌리에 해당한다고 해서 루트 노드&lt;/li&gt;
&lt;li&gt;루트 노드를&amp;nbsp; 시작으로 웹 문서에서 사용한 요소는 계층 구조를 이룸&lt;br /&gt;각 노드 사이의 관계를 부모와 자식, 형제 간으로 표현할 수 있음&lt;br /&gt;부모 노드에는 자식 노드가 있으며, 부모 노드가 같은 형제 노드가 있음&lt;/li&gt;
&lt;li&gt;DOM을 구성하는 기본 원칙&lt;br /&gt;모든 HTML 태그는 요소(element) 노드&lt;br /&gt;HTML 태그에서 사용하는 텍스트 내용은 자식 노드인 텍스트(text) 노드&lt;br /&gt;HTML 태그에 있는 속성은 자식 노드인 속성(attribute) 노드&lt;br /&gt;주석은 주석(comment) 노드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DOM 요소 접근하고 속성 가져오기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;웹 문서에서 원하는 요소를 찾아가는 것을 '접근한다.'라고 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOM에 접근&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;CSS에서 class, id, 태그(선택자) 등의 스타일을 각각 구별해서 정의해야 함&lt;/li&gt;
&lt;li&gt;id 선택자로 접근하는 getElementById()&lt;br /&gt;요소명.getElementById(&quot;id명&quot;)&lt;/li&gt;
&lt;li&gt;class 값으로 접근하는 getElementsByClassName()&lt;br /&gt;요소명.getElementsByClassName(&quot;클래스명&quot;)&lt;br /&gt;※ class 선택자는 중복되어 사용할 수 있으므로 Element가 아닌 Elements&lt;/li&gt;
&lt;li&gt;태그 이름으로 접근하는 getElementsByTagName()&lt;br /&gt;요소명.getElementsByTagName(&quot;태그명&quot;)&lt;/li&gt;
&lt;li&gt;다양한 방법으로 접근 querySelector(), querySelectorAll()&lt;br /&gt;DOM 트리의 텍스트, 속성 노드까지 자유롭게 제어하려면 querySelector(), querySelectorAll()&lt;br /&gt;노드.querySelector(선택자) &lt;br /&gt;노드.querySelectorAll(선택자 또는 태그)&lt;br /&gt;id 선택자처럼 반환값이 하나라면 querySelector()를 사용&lt;br /&gt;class 선택자나 태그 이름을 사용하여 여러 값이 한꺼번에 반환될 경우 querySelectorAll()&lt;br /&gt;선택자를 표시할 때 id 이름 앞에는 # class 이름 앞에는 . 태그는 기호 없이 태그명만 작성&lt;br /&gt;querySelector()에서 class 이름으로 접근할 때 class 이름을 사용한 여러 요소 중에서 &lt;span style=&quot;color: #ee2323;&quot;&gt;첫 번째 요소&lt;/span&gt;만 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 요소의 내용을 수정하는 innerText, innerHTML 프로퍼티&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;웹 요소의 내용을 수정할 때 사용&lt;/li&gt;
&lt;li&gt;innerText 프로퍼티는 텍스트 내용을 표시&lt;br /&gt;요소명.innerText = 내용&lt;/li&gt;
&lt;li&gt;innerHTML 프로퍼티는 HTML 태그까지 반영하여 표시&lt;br /&gt;요소명.innerHTML = 내용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735703020657&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;DOM 요소에 접근하고 속성 가져오기&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;button onclick=&quot;intext()&quot;&amp;gt;innerText로 표시&amp;lt;/button&amp;gt;
    &amp;lt;button onclick=&quot;inHTML()&quot;&amp;gt;innerHTML 표시&amp;lt;/button&amp;gt;
    &amp;lt;h1&amp;gt;현재 시각 : &amp;lt;/h1&amp;gt;
    &amp;lt;div id=&quot;current&quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;script&amp;gt;
        // innerText, innerHTML 프로퍼티 사용
        var now = new Date();

        function intext(){
            document.getElementById(&quot;current&quot;).innerText = now;
        }

        function inHTML(){
            document.getElementById(&quot;current&quot;).innerHTML = &quot;&amp;lt;b&amp;gt;&quot;+ now+&quot;&amp;lt;/b&amp;gt;&quot;;
        }
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUNCVw/btsLCGVCDnE/MNv4gOP6Mo9I1YFoiQcIM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUNCVw/btsLCGVCDnE/MNv4gOP6Mo9I1YFoiQcIM1/img.png&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;176&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.4678%; margin-right: 10px;&quot; data-widthpercent=&quot;33.24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUNCVw/btsLCGVCDnE/MNv4gOP6Mo9I1YFoiQcIM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUNCVw%2FbtsLCGVCDnE%2FMNv4gOP6Mo9I1YFoiQcIM1%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;428&quot; height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PUlAk/btsLDmoCqcs/0G1DyAT4SzDKJsEm2EGo7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PUlAk/btsLDmoCqcs/0G1DyAT4SzDKJsEm2EGo7k/img.png&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;175&quot; data-is-animation=&quot;false&quot; style=&quot;width: 34.4844%; margin-right: 10px;&quot; data-widthpercent=&quot;35.31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PUlAk/btsLDmoCqcs/0G1DyAT4SzDKJsEm2EGo7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPUlAk%2FbtsLDmoCqcs%2F0G1DyAT4SzDKJsEm2EGo7k%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;452&quot; height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKG0c7/btsLBWLaMNZ/TnzHS5vv8KVWBEEd5npWeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKG0c7/btsLBWLaMNZ/TnzHS5vv8KVWBEEd5npWeK/img.png&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;186&quot; data-is-animation=&quot;false&quot; style=&quot;width: 30.7222%;&quot; data-widthpercent=&quot;31.45&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKG0c7/btsLBWLaMNZ/TnzHS5vv8KVWBEEd5npWeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKG0c7%2FbtsLBWLaMNZ%2FTnzHS5vv8KVWBEEd5npWeK%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;428&quot; height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/div&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;웹 요소를 문서에 삽입할 때 태그 속성을 함께 사용하려면 DOM 트리에 속성 노드가 추가되면서 속성값이 저장&lt;/li&gt;
&lt;li&gt;속성에 접근하려면 getAttribute() 메서드를 사용, 접근한 속성의 값을 바꾸려면 setAttribute() 메서드를 사용&lt;/li&gt;
&lt;li&gt;속성 가져오기 getAttribute(&quot;속성명&quot;)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;원하는 속성값으로 지정 setAttribute(&quot;속성명&quot;,&quot;값)&lt;br /&gt;속성값이 이미 있다면 새로운 속성값으로 수정하고, 아직 해당 속성이 없다면 속성과 속성값을 새로 추가함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735703591535&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;속성 가져오기, 수정하기&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div id = &quot;picDiv&quot;&amp;gt;
        &amp;lt;img src=&quot;img/toa-heftiba-BHcB-sr_HzQ-unsplash.jpg&quot; alt=&quot;이미지&quot; id=&quot;pic&quot; width=&quot;200&quot; height=&quot;200&quot; onclick=&quot;displaySrc()&quot;&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;script&amp;gt;
        // 이미지 속성 가져오기
        function displaySrc(){
            var pic = document.querySelector(&quot;#pic&quot;);
            alert(&quot;이미지 소스 : &quot; + pic.getAttribute(&quot;src&quot;)); // 속성을 알림창에 표시
        }
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I3knu/btsLDvy3cqC/tzqJWQVC1VfcsxLcBlGGak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I3knu/btsLDvy3cqC/tzqJWQVC1VfcsxLcBlGGak/img.png&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;240&quot; data-is-animation=&quot;false&quot; style=&quot;width: 30.3871%; margin-right: 10px;&quot; data-widthpercent=&quot;30.74&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I3knu/btsLDvy3cqC/tzqJWQVC1VfcsxLcBlGGak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI3knu%2FbtsLDvy3cqC%2FtzqJWQVC1VfcsxLcBlGGak%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;338&quot; height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9qonB/btsLBYhUtqZ/ioZzoPMKcMvEv1URKqOZwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9qonB/btsLBYhUtqZ/ioZzoPMKcMvEv1URKqOZwk/img.png&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;145&quot; data-is-animation=&quot;false&quot; style=&quot;width: 68.4501%;&quot; data-widthpercent=&quot;69.26&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9qonB/btsLBYhUtqZ/ioZzoPMKcMvEv1URKqOZwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9qonB%2FbtsLBYhUtqZ%2FioZzoPMKcMvEv1URKqOZwk%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;460&quot; height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/div&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;h3 data-ke-size=&quot;size23&quot;&gt;DOM 이벤트 처리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;웹 문서에서 이벤트가 발생하면 이벤트 처리기(event handler)를 연결해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOM 요소에 함수 직접 연결&lt;/p&gt;
&lt;pre id=&quot;code_1735703957013&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;DOM 이벤트 처리&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;img src=&quot;img/cup-1.png&quot; id=&quot;cup&quot;&amp;gt;

    &amp;lt;script&amp;gt;
        var cup = document.getElementById(&quot;cup&quot;);

        cup.onclick = function(){
            alert(&quot;이미지를 클릭하였습니다.&quot;);
        }
    &amp;lt;/script&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctOEqa/btsLCHzXiTA/yfB08MeOxDkV3K0qYhjg1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctOEqa/btsLCHzXiTA/yfB08MeOxDkV3K0qYhjg1K/img.png&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;326&quot; data-is-animation=&quot;false&quot; style=&quot;width: 25.9377%; margin-right: 10px;&quot; data-widthpercent=&quot;26.24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctOEqa/btsLCHzXiTA/yfB08MeOxDkV3K0qYhjg1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctOEqa%2FbtsLCHzXiTA%2FyfB08MeOxDkV3K0qYhjg1K%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;368&quot; height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsF8V9/btsLCoOmIdX/EFkGuhcd8x2gaMgkmb5qnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsF8V9/btsLCoOmIdX/EFkGuhcd8x2gaMgkmb5qnk/img.png&quot; data-origin-width=&quot;441&quot; data-origin-height=&quot;139&quot; data-is-animation=&quot;false&quot; style=&quot;width: 72.8995%;&quot; data-widthpercent=&quot;73.76&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsF8V9/btsLCoOmIdX/EFkGuhcd8x2gaMgkmb5qnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsF8V9%2FbtsLCoOmIdX%2FEFkGuhcd8x2gaMgkmb5qnk%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;441&quot; height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;/div&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;이벤트가 발생했을 때 실행할 함수를 따로 정의해 놓았다면 함수 이름을 사용해 연결할 수 있음&lt;/li&gt;
&lt;li&gt;함수 이름 다음에 괄호를 추가하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735704257701&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;DOM 이벤트 처리&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;!-- 
    함수 이름을 사용해 연결
    --&amp;gt;

    &amp;lt;img src=&quot;img/cup-1.png&quot; id=&quot;cup&quot;&amp;gt;

    &amp;lt;script&amp;gt;
        // 이미지를 클릭하면 함수 실행
        var cup = document.querySelector(&quot;#cup&quot;);
        cup.onclick = changePic;
        
        function changePic(){
            cup.src = &quot;img/cup-2.png&quot;;
        }
    &amp;lt;/script&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l2GPF/btsLBkZ2BCX/GvbPs1rt5qpk7d1Dg5sMb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l2GPF/btsLBkZ2BCX/GvbPs1rt5qpk7d1Dg5sMb0/img.png&quot; data-origin-width=&quot;287&quot; data-origin-height=&quot;296&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;48.9&quot; style=&quot;width: 48.3318%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l2GPF/btsLBkZ2BCX/GvbPs1rt5qpk7d1Dg5sMb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl2GPF%2FbtsLBkZ2BCX%2FGvbPs1rt5qpk7d1Dg5sMb0%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;287&quot; height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E9b4k/btsLBrd0xer/ek4Ldy0Pd0rOU3HaDZsRz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E9b4k/btsLBrd0xer/ek4Ldy0Pd0rOU3HaDZsRz0/img.png&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;303&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.5054%;&quot; data-widthpercent=&quot;51.1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E9b4k/btsLBrd0xer/ek4Ldy0Pd0rOU3HaDZsRz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE9b4k%2FbtsLBrd0xer%2Fek4Ldy0Pd0rOU3HaDZsRz0%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;307&quot; height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/div&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;DOM의 event 객체&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;이벤트 정보를 저장하는 event 객체가 존재&lt;/li&gt;
&lt;li&gt;웹 문서에서 이벤트가 발생한 요소가 무엇인지, 어떤 이벤트가 발생했는지 등의 정보가 들어 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735704461308&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;DOM의 event 객체&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;img src=&quot;img/cup-1.png&quot; id=&quot;cup&quot;&amp;gt;

    &amp;lt;script&amp;gt;
        // 이미지를 클릭하면 함수 실행
        var cup = document.querySelector(&quot;#cup&quot;);
        cup.onclick = function(evnet) {
            alert(&quot;이벤트 유형 : &quot; + event.type + &quot;, 이벤트 발생 위치 : &quot; + event.pageX + &quot;, &quot; + event.pageY);
        }
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFLLgV/btsLDl4jZT9/KfqwKkxXn912OEK6JSDA70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFLLgV/btsLDl4jZT9/KfqwKkxXn912OEK6JSDA70/img.png&quot; data-origin-width=&quot;299&quot; data-origin-height=&quot;293&quot; data-is-animation=&quot;false&quot; style=&quot;width: 22.6816%; margin-right: 10px;&quot; data-widthpercent=&quot;22.95&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFLLgV/btsLDl4jZT9/KfqwKkxXn912OEK6JSDA70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFLLgV%2FbtsLDl4jZT9%2FKfqwKkxXn912OEK6JSDA70%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;299&quot; height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cazA48/btsLCZUV2eK/mQfKT6q8CVutqJvtZNTgp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cazA48/btsLCZUV2eK/mQfKT6q8CVutqJvtZNTgp1/img.png&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;129&quot; data-is-animation=&quot;false&quot; style=&quot;width: 76.1556%;&quot; data-widthpercent=&quot;77.05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cazA48/btsLCZUV2eK/mQfKT6q8CVutqJvtZNTgp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcazA48%2FbtsLCZUV2eK%2FmQfKT6q8CVutqJvtZNTgp1%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;442&quot; height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;event 객체에는 이벤트 정보만 들어 있음. 만약 이벤트가 발생한 대상에 접근하려면 이벤트 처리기에서 예약어 this를 사용해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;addEventListener() 메서드&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;addEventListener() 메서드와 event 객체를 사용하면 한 요소에서 여러 이벤트 처리기를 연결해 실행할 수 있음&lt;/li&gt;
&lt;li&gt;요소.addEventListener(이벤트, 함수, 캡처 여부);&lt;br /&gt;이벤트 : 이번트 유형을 지정, on을 붙이지 않음&lt;br /&gt;함수 : 이벤트가 발생하면 실행할 명령이나 함수를 지정. 함수를 정의할 때는 event 객체로 인수를 받음&lt;br /&gt;캡처 여부 : 기본값은 false(버블링 : DOM의 자식 노드에서 부모 노드로 전달).&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;true(캡처링 : DOM의 부모 노드에서 자식 노드로 전달되는 것)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735705714315&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;addEventListener() 메서드&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;img src=&quot;img/cup-1.png&quot; id=&quot;cover&quot;&amp;gt;

    &amp;lt;script&amp;gt;
        // 마우스 포인터를 올리면 이미지 바꾸기
        var cover = document.getElementById(&quot;cover&quot;);
        cover.addEventListener(&quot;mouseover&quot;,changeImg);
        cover.addEventListener(&quot;mouseout&quot;,originImg);

        function changeImg(){
            cover.src = &quot;img/cup-2.png&quot;;
        }
        function originImg(){
            cover.src = &quot;img/cup-1.png&quot;;
        }
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blRwGB/btsLCLh5k8K/YslSForxEE9PNmSHOB3JL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blRwGB/btsLCLh5k8K/YslSForxEE9PNmSHOB3JL1/img.png&quot; data-origin-width=&quot;304&quot; data-origin-height=&quot;317&quot; data-is-animation=&quot;false&quot; style=&quot;width: 31.6557%; margin-right: 10px;&quot; data-widthpercent=&quot;32.41&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blRwGB/btsLCLh5k8K/YslSForxEE9PNmSHOB3JL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblRwGB%2FbtsLCLh5k8K%2FYslSForxEE9PNmSHOB3JL1%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;304&quot; height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rXOiT/btsLz8MLLrJ/8HQKVgAlc0koiA8Mp1tZ0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rXOiT/btsLz8MLLrJ/8HQKVgAlc0koiA8Mp1tZ0k/img.png&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;303&quot; data-is-animation=&quot;false&quot; style=&quot;width: 33.0094%; margin-right: 10px;&quot; data-widthpercent=&quot;33.8&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rXOiT/btsLz8MLLrJ/8HQKVgAlc0koiA8Mp1tZ0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrXOiT%2FbtsLz8MLLrJ%2F8HQKVgAlc0koiA8Mp1tZ0k%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;303&quot; height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JS1Pq/btsLAzcj79S/LMKnqwdfdmZ57DfehaKVn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JS1Pq/btsLAzcj79S/LMKnqwdfdmZ57DfehaKVn1/img.png&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;292&quot; data-is-animation=&quot;false&quot; style=&quot;width: 33.0094%;&quot; data-widthpercent=&quot;33.79&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JS1Pq/btsLAzcj79S/LMKnqwdfdmZ57DfehaKVn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJS1Pq%2FbtsLAzcj79S%2FLMKnqwdfdmZ57DfehaKVn1%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;292&quot; height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;/div&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;CSS 속성에 접근&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;자바스크립트를 이용하면 스타일 속성값을 가져와서 그 값을 원하는 대로 수정할 수 있음&lt;br /&gt;각 요소의 스타일을 자유롭게 수정할 수 있으므로 웹 문서에서 다양한 효과를 만들 수 있음&lt;/li&gt;
&lt;li&gt;CSS 속성에 접근하려면 해당 스타일이 적용된 HTML 요소 다음에 예약어 style을 쓰고 속성을 작성&lt;br /&gt;document.요소명.style.속성명&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735709814243&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;CSS 속성에 접근&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
		#container {
			width:400px;
			margin:50px auto;
			text-align: center;
		}
		#rect {
			width:100px;
			height:100px;			
			border:1px solid #222;
			margin:30px auto;
			transition: 1s;
		}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;div id=&quot;container&quot;&amp;gt;
		&amp;lt;p&amp;gt;도형 위로 마우스 포인터를 올려놓으세요.&amp;lt;/p&amp;gt;
		&amp;lt;div id=&quot;rect&quot;&amp;gt;&amp;lt;/div&amp;gt;
	&amp;lt;/div&amp;gt;	

&amp;lt;script&amp;gt;
    var myRect = document.querySelector(&quot;#rect&quot;);
    myRect.addEventListener(&quot;mouseover&quot;,function(){
        myRect.style.backgroundColor = &quot;green&quot;;
        myRect.style.borderRadius = &quot;50%&quot;;
    });
    myRect.addEventListener(&quot;mouseout&quot;,function(){
        myRect.style.backgroundColor =&quot;&quot;;
        myRect.style.borderRadius =&quot;&quot;;
    });
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YiiIQ/btsLAV7KvRa/3nUENvsv7CaCdsJ76kZDNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YiiIQ/btsLAV7KvRa/3nUENvsv7CaCdsJ76kZDNk/img.png&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;228&quot; data-is-animation=&quot;false&quot; style=&quot;width: 30.7869%; margin-right: 10px;&quot; data-widthpercent=&quot;31.52&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YiiIQ/btsLAV7KvRa/3nUENvsv7CaCdsJ76kZDNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYiiIQ%2FbtsLAV7KvRa%2F3nUENvsv7CaCdsJ76kZDNk%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;345&quot; height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8e46S/btsLCqL2JAm/1K00xR2in4JChcuq3gj3Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8e46S/btsLCqL2JAm/1K00xR2in4JChcuq3gj3Yk/img.png&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;223&quot; data-is-animation=&quot;false&quot; style=&quot;width: 30.6561%; margin-right: 10px;&quot; data-widthpercent=&quot;31.39&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8e46S/btsLCqL2JAm/1K00xR2in4JChcuq3gj3Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8e46S%2FbtsLCqL2JAm%2F1K00xR2in4JChcuq3gj3Yk%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;336&quot; height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yE8K4/btsLCDR9YFC/l8G6FVd8xQB9yjEkmsYGG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yE8K4/btsLCDR9YFC/l8G6FVd8xQB9yjEkmsYGG0/img.png&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;187&quot; data-is-animation=&quot;false&quot; style=&quot;width: 36.2314%;&quot; data-widthpercent=&quot;37.09&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yE8K4/btsLCDR9YFC/l8G6FVd8xQB9yjEkmsYGG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyE8K4%2FbtsLCDR9YFC%2Fl8G6FVd8xQB9yjEkmsYGG0%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;333&quot; height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;DOM 노드 추가,삭제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노드리스트&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;DOM에서 새로운 노드를 만들어 추가하거나 삭제하려면 노드리스트를 사용해야함&lt;/li&gt;
&lt;li&gt;DOM에 접근할 때 querySelectorAll() 메서드를 사용하면 노드를 한꺼번에 여러 개 가져올 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735710200919&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;노드리스트&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;웹 프로그래밍&amp;lt;/h1&amp;gt;
    &amp;lt;ul id=&quot;itemList&quot;&amp;gt;
        &amp;lt;li&amp;gt;HTML&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;CSS&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;JavaScript&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Python&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pmzun/btsLDozXtjf/8E66iJAlPcGpzl6QFHOX31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pmzun/btsLDozXtjf/8E66iJAlPcGpzl6QFHOX31/img.png&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;141&quot; data-is-animation=&quot;false&quot; style=&quot;width: 34.6277%; margin-right: 10px;&quot; data-widthpercent=&quot;35.45&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pmzun/btsLDozXtjf/8E66iJAlPcGpzl6QFHOX31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpmzun%2FbtsLDozXtjf%2F8E66iJAlPcGpzl6QFHOX31%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;247&quot; height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XLE14/btsLBjfLSmv/HIk7IbZCXrUlRxVM5vr3I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XLE14/btsLBjfLSmv/HIk7IbZCXrUlRxVM5vr3I0/img.png&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;808&quot; data-is-animation=&quot;false&quot; style=&quot;width: 12.5992%; margin-right: 10px;&quot; data-widthpercent=&quot;12.9&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XLE14/btsLBjfLSmv/HIk7IbZCXrUlRxVM5vr3I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXLE14%2FbtsLBjfLSmv%2FHIk7IbZCXrUlRxVM5vr3I0%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;515&quot; height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsld0o/btsLAACfBRC/KKbPiYfXh38XNhPyOLqcBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsld0o/btsLAACfBRC/KKbPiYfXh38XNhPyOLqcBK/img.png&quot; data-origin-width=&quot;245&quot; data-origin-height=&quot;96&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.4476%;&quot; data-widthpercent=&quot;51.65&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsld0o/btsLAACfBRC/KKbPiYfXh38XNhPyOLqcBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdsld0o%2FbtsLAACfBRC%2FKKbPiYfXh38XNhPyOLqcBK%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;245&quot; height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;새로운 노드 추가 과정&lt;br /&gt;모든 HTML 태그는 요소(element) 노드&lt;br /&gt;HTML 태그에서 사용하는 텍스트 내용은 자식 노드인 텍스트(text) 노드&lt;br /&gt;HTML 태그에 있는 속성은 자식 노드인 속성 노드&lt;br /&gt;주석은 주석 노드&lt;/li&gt;
&lt;/ul&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;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;요소 노드 만들기 createElement() 메서드&lt;br /&gt;document.createElement(노드명)&lt;/li&gt;
&lt;li&gt;텍스트 노드 만들기 createTextNode() 메서드&lt;br /&gt;새로운 요소 노드를 만들었다면 내용을 담는 텍스트 노드를 자식 노드로 만들어 연결&lt;br /&gt;document.createTextNode(텍스트)&lt;/li&gt;
&lt;li&gt;자식 노드 연결 appendChild() 메서드&lt;br /&gt;1, 2 과정은 노드만 만든 상태이며, 부모 노드와 자식 노드로 연결되지 않음&lt;br /&gt;appendChild() 메서드는 텍스트 노드나 속성 노드를 만든 후 요소 노드에 연결할 때 사용&lt;br /&gt;부모노드.appendChild(자식노드)&lt;/li&gt;
&lt;li&gt;전체 소스 코드 완성&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1735711050436&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;텍스트 노드를 사용하는 새로운 요소 추가&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        #container{
          width:500px;
          margin:10px auto;
          padding:20px;
        }
        #info {
          margin-top:20px;
        }
      &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;&quot;container&quot;&amp;gt;
        &amp;lt;h1&amp;gt;텍스트 노드를 사용하는 새로운 요소 추가하기&amp;lt;/h1&amp;gt;
        &amp;lt;a href=&quot;#&quot; onclick=&quot;addP()&quot;&amp;gt;더 보기&amp;lt;/a&amp;gt;
        &amp;lt;div id=&quot;info&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;script&amp;gt;
        function addP(){
            var newP = document.createElement(&quot;p&quot;);
            var textNode = document.createTextNode(&quot;DOM은 Documnet Object Model의 줄임말&quot;);
            newP.appendChild(textNode);
            document.getElementById(&quot;info&quot;).appendChild(newP);
        }
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;684&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/24shV/btsLC0Gjk8t/mFXj4WDhzFKNKyIT8peW70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/24shV/btsLC0Gjk8t/mFXj4WDhzFKNKyIT8peW70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/24shV/btsLC0Gjk8t/mFXj4WDhzFKNKyIT8peW70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F24shV%2FbtsLC0Gjk8t%2FmFXj4WDhzFKNKyIT8peW70%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;684&quot; height=&quot;246&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735711103420&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;div id=&quot;&quot;container&quot;&amp;gt;
        &amp;lt;h1&amp;gt;텍스트 노드를 사용하는 새로운 요소 추가하기&amp;lt;/h1&amp;gt;
        &amp;lt;a href=&quot;#&quot; onclick=&quot;addP(); this.onclick='';&quot;&amp;gt;더 보기&amp;lt;/a&amp;gt;
        &amp;lt;div id=&quot;info&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&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;662&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9oFMj/btsLC6zwML1/UzlDK9lMZXhpFgNF6X1EXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9oFMj/btsLC6zwML1/UzlDK9lMZXhpFgNF6X1EXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9oFMj/btsLC6zwML1/UzlDK9lMZXhpFgNF6X1EXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9oFMj%2FbtsLC6zwML1%2FUzlDK9lMZXhpFgNF6X1EXK%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;662&quot; height=&quot;166&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;166&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;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;요소 노드 만들기 createElement() 메서드&lt;/li&gt;
&lt;li&gt;속성 노드 만들기 createAttribute() 메서드&lt;/li&gt;
&lt;li&gt;속성 노드 연결 setAttributeNode() 메서드&lt;/li&gt;
&lt;li&gt;자식 노드 연결 appendChild() 메서드&lt;/li&gt;
&lt;li&gt;전체 소스 코드 완성&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1735711738457&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;속성값이 있는 새로운 요소 추가하기&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;container&quot;&amp;gt;
        &amp;lt;h1&amp;gt;DOM&amp;lt;/h1&amp;gt;
        &amp;lt;a href=&quot;#&quot; onclick=&quot;addContents(); this.onclick=''&quot;&amp;gt;더보기&amp;lt;/a&amp;gt;
        &amp;lt;div id=&quot;info&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;script&amp;gt;
        function addContents(){
            var newP = document.createElement(&quot;p&quot;);
            var textNode = document.createTextNode(&quot;DOM은 Document Object Model의 줄임말&quot;);
            newP.appendChild(textNode);

            var newImg = document.createElement(&quot;img&quot;)
            var srcNode = document.createAttribute(&quot;src&quot;);
            var altNode = document.createAttribute(&quot;alt&quot;);
            srcNode.value = &quot;img/dom.jpg&quot;;
            altNode.value = &quot;DOM 트리 예제&quot;;
            newImg.setAttributeNode(srcNode);
            newImg.setAttributeNode(altNode);

            document.getElementById(&quot;info&quot;).appendChild(newP);
            document.getElementById(&quot;info&quot;).appendChild(newImg);
        }
    &amp;lt;/script&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AF51Y/btsLAyLeOcS/3kAAzbjmv0kqrPuM460nU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AF51Y/btsLAyLeOcS/3kAAzbjmv0kqrPuM460nU0/img.png&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;243&quot; data-is-animation=&quot;false&quot; style=&quot;width: 70.8565%; margin-right: 10px;&quot; data-widthpercent=&quot;71.69&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AF51Y/btsLAyLeOcS/3kAAzbjmv0kqrPuM460nU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAF51Y%2FbtsLAyLeOcS%2F3kAAzbjmv0kqrPuM460nU0%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;652&quot; height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nIMLJ/btsLBgDLZ95/k018HtPxM08PVJPKHHXVTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nIMLJ/btsLBgDLZ95/k018HtPxM08PVJPKHHXVTk/img.png&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;487&quot; data-is-animation=&quot;false&quot; style=&quot;width: 27.9807%;&quot; data-widthpercent=&quot;28.31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nIMLJ/btsLBgDLZ95/k018HtPxM08PVJPKHHXVTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnIMLJ%2FbtsLBgDLZ95%2Fk018HtPxM08PVJPKHHXVTk%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;516&quot; height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;/div&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;parentNode 프로퍼티&lt;br /&gt;DOM 트리의 노드는 바로 삭제할 수 없으므로 먼저 부모 노드에 접근해야함&lt;br /&gt;삭제할 노드의 부모 노드를 찾아가는 방법을 먼저 알아야함&lt;br /&gt;parentNode 프로퍼티는 현재 노드의 부모 노드에 접근해서 부모 노드의 요소를 반환&lt;br /&gt;노드.parentNode&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r9LUO/btsLCtvchBT/zp4vqJ0nX251C6fowitflK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r9LUO/btsLCtvchBT/zp4vqJ0nX251C6fowitflK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r9LUO/btsLCtvchBT/zp4vqJ0nX251C6fowitflK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr9LUO%2FbtsLCtvchBT%2Fzp4vqJ0nX251C6fowitflK%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;318&quot; height=&quot;79&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;79&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;removeChild() 메서드&lt;br /&gt;자식 노드를 삭제하는 역할&lt;br /&gt;부모 노드만 찾는다면 삭제하는 것은 간단함&lt;br /&gt;부모노드.removeChild(자식노드)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>organize/자바스트립트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/322</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-7#entry322comment</comments>
      <pubDate>Wed, 1 Jan 2025 15:13:10 +0900</pubDate>
    </item>
    <item>
      <title>스프링 웹 프로젝트 5</title>
      <link>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-5</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Controller&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;서블릿에서 시작 &amp;rarr; Spring MVC는 서블릿에서부터 시작 &amp;rarr; 기본적으로 서블릿에 대한 이해가 필요함&lt;/li&gt;
&lt;li&gt;서블릿에서 HttpServletRequest, HttpServletResponse를 사용했지만&lt;br /&gt;Spring MVC에서는 사용할 필요가 없음 이유는 HttpServletRequest, HttpServletResponse는 파라미터를 수집하려고 사용하는데 Spring MVC에서는 자동으로 파라미터를 수집하는 기능을 처리해줌 + 리턴 타입&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 이러한 Spring MVC를 이용하면 자바에서 배운 상속이나 인터페이스 등의 문법에 갇혀 있지 않을 수 있게 함&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;@Controller : 해당 클래스의 인스턴스를 스프링의 빈으로 등록하고 컨트롤러로 사용&lt;br /&gt;componet-scan과 같이 활용&lt;/li&gt;
&lt;li&gt;@RequestMapping : 특정한 URI에 대한 처리를 해당 컨트롤러나 메서드에서 처리&lt;br /&gt;※ 과거 서블릿을 계속 만들거나 구조를 만들었어야함&lt;br /&gt;스프링 4.3 이전까지는 @RequestMapping(method = &quot;get&quot;) 방식으로 사용하였으나&lt;br /&gt;스프링 4.3 이후에는 @GetMapping, @PostMapping으로 간단히 표현이 가능해&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735625284303&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import lombok.extern.log4j.Log4j;

@Controller
@RequestMapping(&quot;/sample/*&quot;)
@Log4j
public class SampleController {
	
	@RequestMapping(&quot;&quot;)
	public void basic() {
		log.info(&quot;SampleController basic() log.info&quot;);
	}
	
	@GetMapping(&quot;/basicGet&quot;)
	public void basicGet() {
		log.info(&quot;SampleController basicGet() log.info&quot;);
	}

}&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;스프링 MVC의 컨트롤러는 메서드의 파라미터를 자동으로 수집, 변환하는 기능을 제공&lt;/li&gt;
&lt;li&gt;Java Beans 규칙에 맞게 작성되어야 함&lt;br /&gt;생성자가 없거나 빈 생성자&lt;br /&gt;올바른 규칙으로 만들어진 Getter/Setter&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735625691674&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.domain;

import lombok.Data;

@Data
public class SampleDTO {
	
	private String name;
	private int age;

}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1735625788289&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/ex01&quot;)
	public void ex01(SampleDTO sampleDTO) {
		log.info(&quot;SampleController ex01(SampleDTO sampleDTO) log.info : &quot; + sampleDTO);
	}&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;783&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C9w4w/btsLBYaUB2H/1X99qbGTAy1v94datrdhwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C9w4w/btsLBYaUB2H/1X99qbGTAy1v94datrdhwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C9w4w/btsLBYaUB2H/1X99qbGTAy1v94datrdhwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC9w4w%2FbtsLBYaUB2H%2F1X99qbGTAy1v94datrdhwK%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;783&quot; height=&quot;272&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;272&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;1297&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3BZLx/btsLCKXzxff/9FV1llpuF5FJqDwK6p2t6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3BZLx/btsLCKXzxff/9FV1llpuF5FJqDwK6p2t6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3BZLx/btsLCKXzxff/9FV1llpuF5FJqDwK6p2t6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3BZLx%2FbtsLCKXzxff%2F9FV1llpuF5FJqDwK6p2t6k%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;1297&quot; height=&quot;207&quot; data-origin-width=&quot;1297&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면은 찾을 수 없지만, 실제로 데이터는 수집(console에서 확인이 가능함)&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;/p&gt;
&lt;pre id=&quot;code_1735626985785&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/ex02List&quot;)
	public String ex02List(@RequestParam(&quot;ids&quot;) ArrayList&amp;lt;String&amp;gt; ids) { // @RequestParam 명시적으로 작성 파라미터 이름이 ids인 것을 수집 
		log.info(&quot;SampleController ex02List() log.info ids&quot; + ids);
		return &quot;ex02List&quot;;
	}
	
	//http://localhost:8080/sample/ex02Bean?list[0].name=ABC&amp;amp;list[0].age=20
	@GetMapping(&quot;/ex02Bean&quot;)
	public String ex02Bean(@ModelAttribute(&quot;sample&quot;) SampleDTOList list, Model model) {
		log.info(&quot;SampleController ex02List() log.info list : &quot; + list);
		model.addAttribute(&quot;result&quot;,&quot;success&quot;);
		return &quot;sample/ex02Bean&quot;;
	}&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;Model&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Model 객체는 JSP에 컨트롤러에서 생성된 데이터를 담아 전달하는 역할을 하는 존재&lt;/li&gt;
&lt;li&gt;모델 2 방식에서 사용하는 requestsetAttribute()와 유사한 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735627055000&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public String home(Locale locale, Model model) { // Model : 상자(데이터 전달), 화면으로 전달하고 싶다면 파라미터에 Model 추가
		logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);
		
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
		
		String formattedDate = dateFormat.format(date);
		
		model.addAttribute(&quot;serverTime&quot;, formattedDate );
		
		return &quot;home&quot;;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ Model을 사용하지 않아도 데이터 수집이 됨&lt;/p&gt;
&lt;pre id=&quot;code_1735627365133&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/ex02Bean&quot;)
	public String ex02Bean(SampleDTOList list/* @ModelAttribute(&quot;sample&quot;) SampleDTOList list, Model model */) {
		log.info(&quot;SampleController ex02List() log.info list : &quot; + list);
//		model.addAttribute(&quot;result&quot;,&quot;success&quot;);
		return &quot;sample/ex02Bean&quot;;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1735627414518&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;ex02Bean.jsp&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;h1&amp;gt;${sampleDTOList}&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;618&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OPUqc/btsLAx6soS1/8IvVZv3KOHPCSyx75wIKl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OPUqc/btsLAx6soS1/8IvVZv3KOHPCSyx75wIKl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OPUqc/btsLAx6soS1/8IvVZv3KOHPCSyx75wIKl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOPUqc%2FbtsLAx6soS1%2F8IvVZv3KOHPCSyx75wIKl0%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;618&quot; height=&quot;236&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;객체로 데이터를 수집하는 것은 화면까지 전달이 됨.&lt;/li&gt;
&lt;li&gt;그렇다면 Model에 담아야하는 데이터는? 전달되는 파라미터가 아닌 경우&lt;br /&gt;즉, 다른 곳(Service, DB)에서 발생한 데이터를 담기 위한 용기&lt;br /&gt;Model에 담는 것은 전달된 데이터는 아닌데 화면에는 필요한 경우 ex) 게시판 - 목록&lt;/li&gt;
&lt;/ul&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;@ModelAttribute&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;내가 이 데이터를 명시적으로(이름으로) 화면에서 쓰겠다. 즉, 전달할 때 jsp에 이름을 바꿔서 쓰겠다.&lt;br /&gt;이름을 명시적으로 해주는 역할을 함. 화면까지 전달해주는 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735630332969&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@GetMapping(&quot;/ex05&quot;)
public String ex05(SampleDTO sampleDTO, int page) {
		log.info(&quot;SampleController ex02List() log.info sampleDTO : &quot; + sampleDTO);
   		log.info(&quot;SampleController ex02List() log.info page : &quot; + page);
		return &quot;sample/ex05&quot;;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를&lt;/p&gt;
&lt;pre id=&quot;code_1735630481896&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@GetMapping(&quot;/ex05&quot;)
public String ex05(SampleDTO sampleDTO, @ModelAttribute(&quot;p&quot;) int page) {
		log.info(&quot;SampleController ex02List() log.info sampleDTO : &quot; + sampleDTO);
   		log.info(&quot;SampleController ex02List() log.info page : &quot; + page);
		return &quot;sample/ex05&quot;;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1735630520897&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;h1&amp;gt;SampleDTO : ${sampleDTO}&amp;lt;/h1&amp;gt;
&amp;lt;h1&amp;gt;page : ${p}&amp;lt;/h1&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;RedirectAttribute&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;화면에 한 번만 전달되는 파라미터를 처리하는 용도&lt;/li&gt;
&lt;li&gt;내부적으로 HttpSession 객체에 담아서 한 번만 사용되고 폐기&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735630628509&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 딱 한 번만 전달
rttr.addFlashAttribute(&quot;name&quot;,&quot;ABC&quot;); 
rttr.addFlashAttribute(&quot;age&quot;,20); 

return &quot;redirect:/&quot;;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어노테이션 이용 방식(자바의 리플렉션 -&amp;gt; 전통적인 방식X)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;String&lt;/b&gt;: jsp를 이용하는 경우에는 jsp 파일의 경로와 파일이름을 나타내기 위해서 사용 &amp;rarr; 분기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;void&lt;/b&gt; : 호출하는 URL과 동일한 이름의 jsp를 의미 &amp;rarr; 배열 요소로 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;VO, DTO 타입&lt;/b&gt; : 주로 JSON 타입의 데이터를 만들어서 반환하는 용도로 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ResponseEntitiy 타입&lt;/b&gt; : response할 때 http 헤더 정보와 내용을 가공하는 용도로 사용&lt;/li&gt;
&lt;li&gt;&lt;s&gt;Model : 데이터를 반환하거나 화면까지 같이 지정하는 경우 사용&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;HttpHeaders : 응답에 내용 없이 http 헤더 메시지만 전달하는 용도로 사용&lt;/s&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;void 타입&lt;/p&gt;
&lt;pre id=&quot;code_1735631426565&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	// void 타입 : 호출 IRL과 동일한 이름의 jsp 파일
	@GetMapping(&quot;/ex05&quot;)
	public void ex05() {
		log.info(&quot;SampleController ex05() log.info&quot;);
	}&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;512&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCmCaM/btsLBhWQtfC/tzs8Du6s7ZE7ANE8pEpuA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCmCaM/btsLBhWQtfC/tzs8Du6s7ZE7ANE8pEpuA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCmCaM/btsLBhWQtfC/tzs8Du6s7ZE7ANE8pEpuA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCmCaM%2FbtsLBhWQtfC%2Ftzs8Du6s7ZE7ANE8pEpuA0%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;512&quot; height=&quot;192&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;192&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;String 타입&lt;/p&gt;
&lt;pre id=&quot;code_1735631600255&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	// 상황에 따라 다른 화면을 보여줄 필요가 있을 경우 유용하게 사용
	// String 타입에는 redirect, forward 키워드를 붙여 사용할 수 있음
	// redirect : 리다이렉트 방식으로 처리하는 경우, forward : 포워드 방식으로 처리하는 경우
    // redirect 예시) re1에서 re2로 가야함(re1을 호출하면 re2로) &amp;rarr; 사용자를 강제로 이동 시킬 때 많이 사용하는 방식
	@GetMapping(&quot;/re1&quot;)
	public String re1() {
		log.info(&quot;SampleController re1() log info&quot;);
		return &quot;redirect:/sample/re2&quot;;
	}
	
	@GetMapping(&quot;/re2&quot;)
	public void re2() {
		log.info(&quot;SampleController re2() log info&quot;);
	}&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;주소줄에 http://localhost:8080/sample/re1 을 입력하면 http://localhost:8080/sample/re2로 이동&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd5uCd/btsLA5hABsq/4ma16cYppD0kTw9DHb0XO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd5uCd/btsLA5hABsq/4ma16cYppD0kTw9DHb0XO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd5uCd/btsLA5hABsq/4ma16cYppD0kTw9DHb0XO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd5uCd%2FbtsLA5hABsq%2F4ma16cYppD0kTw9DHb0XO0%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;902&quot; height=&quot;308&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;308&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;1049&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k4YC9/btsLBX4eMjr/8l7oyrfqck6QaAOL5IpWu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k4YC9/btsLBX4eMjr/8l7oyrfqck6QaAOL5IpWu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k4YC9/btsLBX4eMjr/8l7oyrfqck6QaAOL5IpWu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk4YC9%2FbtsLBX4eMjr%2F8l7oyrfqck6QaAOL5IpWu0%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;1049&quot; height=&quot;183&quot; data-origin-width=&quot;1049&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;redirect는 2번 호출이 일어남(개발자도구에서 Network 탭을 확인)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4SjAv/btsLAYpHm6S/tscxL1HJ9o3oUEgB7HVtH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4SjAv/btsLAYpHm6S/tscxL1HJ9o3oUEgB7HVtH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4SjAv/btsLAYpHm6S/tscxL1HJ9o3oUEgB7HVtH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4SjAv%2FbtsLAYpHm6S%2FtscxL1HJ9o3oUEgB7HVtH1%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;1275&quot; height=&quot;289&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;289&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;1259&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qbsXF/btsLB0mw2yo/qyFZ1CIhb9w9AMCVNCekYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qbsXF/btsLB0mw2yo/qyFZ1CIhb9w9AMCVNCekYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qbsXF/btsLB0mw2yo/qyFZ1CIhb9w9AMCVNCekYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqbsXF%2FbtsLB0mw2yo%2FqyFZ1CIhb9w9AMCVNCekYk%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;1259&quot; height=&quot;544&quot; data-origin-width=&quot;1259&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;re1을 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 서버 응답(re1은 re2로 가야함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 브라우저 request, response를 한번씩 받음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 다른 곳으로 가야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 자동으로 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; re2로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서블릿의 response.sendRedirect()와 같음&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;XML이나 JSON으로 처리&lt;/li&gt;
&lt;li&gt;@ResponseBody 어노테이션과 같이 사용(Ajax)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ResponseEntity&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;HTTP 헤더 정보와 추가적인 데이터를 전달할 때 사&lt;/li&gt;
&lt;/ul&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Servlet 3.0이후(Tomcat 7.0)에는 기본적으로 업로드 되는 파일을 처리할 수 있는 기능이 추가&lt;/li&gt;
&lt;li&gt;별도로 commons-fuleupload 라이브러리 등을 사용&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/321</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-5#entry321comment</comments>
      <pubDate>Tue, 31 Dec 2024 17:41:26 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트 6</title>
      <link>https://001cloudid.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-6</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;BOM&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;자바스크립트 내에 웹 브라우저와 관련된 여러 객체가 미리 정의되어 있기 때문에 특정한 사이트로 이동, 새 탭 열기 등 브라우저와 관련된 여러 가지 효과를 만들 수 있음&lt;/li&gt;
&lt;li&gt;웹 브라우저 창에 문서가 표시되는 순간 브라우저는 HTML 소스를 한 줄씩 읽으면서 화면에 내용을 표시하고 관련된 객체를 만들어냄&lt;/li&gt;
&lt;li&gt;웹 브라우저가 열리면 window 객체가 만들어지고 밑으로 하위 요소에 해당하는 객체들이 나타남&lt;br /&gt;window 하위에는 document, navigator, history, location, screen 객체가 존재&lt;/li&gt;
&lt;li&gt;window : 브라우저 창이 열릴 때마다 하나씩 만들어짐. 브라우저 창 안의 요소 중에서 최상위에 존재&lt;/li&gt;
&lt;li&gt;document : 웹 문서마다 하나씩 있으며 body 태그를 만나면 만들어짐. HTML 문서의 정보가 담겨 있음&lt;/li&gt;
&lt;li&gt;navigator : 현재 사용하는 브라우저의 정보가 들어있음&lt;/li&gt;
&lt;li&gt;history : 현재 창에서 사용자의 방문 기록을 저장&lt;/li&gt;
&lt;li&gt;location : 현재 페이지의 URL 정보가 담여있음&lt;/li&gt;
&lt;li&gt;screen : 현재 사용하는 화면 정보를 다룸&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;window 객체의 프로퍼티&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;window 객체는 웹 브라우저의 상태를 제어하며 자바스크립트의 최상위에 존재, 자바스크립트의 모든 객체는 window 객체 안에 포함&lt;/li&gt;
&lt;li&gt;window 객체의 프로퍼티는 주로 웹 브라우저 창의 정보를 가져오거나 값을 바꿀 때 사용&lt;/li&gt;
&lt;li&gt;프러퍼티를 사용하려면 프로퍼티 이름 앞에 'window.'를 붙임&lt;br /&gt;document : 브라우저 창에 표시된 웹 문서에 접근&lt;br /&gt;frameElement : 현재 창이 다른 요소 안에 포함되어 있을 경우 그 요소를 반환하고, 그렇지 않다면 null을 반환&lt;br /&gt;innerHeight : 내용 영역의 높이&lt;br /&gt;innerWidth : 내부 영역의 너비&lt;br /&gt;localStorage : 웹 브라우저에서 데이터를 저장하는 로컬 스토리지를 반환&lt;br /&gt;location : window 객체의 위치 또는 현재 URL을 나타냄&lt;br /&gt;name : 브라우저 창의 이름을 가져오거나 수정&lt;br /&gt;,....&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;window 객체의 메서드&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;웹 브라우저 창 자체와 관련&lt;/li&gt;
&lt;li&gt;alert()나 prompt()는 windwo 객체의 메서드임. 원래는 window.alert()나 window.prompt()라고 해야하지만 window 객체는 기본 객체이므로 'window.'을 생략해도 사용할 수 있음&lt;/li&gt;
&lt;li&gt;window 객체 메서드&lt;br /&gt;alert() : 알림창&lt;br /&gt;blur() 현재 창에서 포커스를 제거&lt;br /&gt;close() : 현재 창 닫기&lt;br /&gt;confirm() : 확인, 취소 버튼이 있는 확인 창을 표시&lt;br /&gt;focus() : 현재 창에 포커스를 부여&lt;br /&gt;open() : 새로운 창&lt;br /&gt;,....&lt;/li&gt;
&lt;li&gt;새 브라우저 창을 여는 open()&lt;br /&gt;window.open(경로, 창이름, 창옵션)&lt;br /&gt;경로 : 팝업 창에 표시할 문서나 사이트의 경로(주소)를 나타냄&lt;br /&gt;창 이름 : 창 이름을 지정하지 않으면 팝업 창이 계속 새로 나타남&lt;br /&gt;창 옵션 : left, top 속성을 사용해 위치를 정하거나 너비, 높이 속성을 사용해 크기를 지정할 수 있음. 지정하지 않으면 맨 왼쪽 위에 나타남&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735618372372&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        window.open(&quot;popup.html&quot;, &quot;팝업창&quot;, &quot;width=500, height=400&quot;);
    &amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1735618387823&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;popup.html&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;
        문서를 열면 팝업 창이 자동으로 열립니다.
    &amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;732&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CYCuB/btsLAu90Egn/vfPaA64GsQ6HXo8FivrDX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CYCuB/btsLAu90Egn/vfPaA64GsQ6HXo8FivrDX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CYCuB/btsLAu90Egn/vfPaA64GsQ6HXo8FivrDX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCYCuB%2FbtsLAu90Egn%2FvfPaA64GsQ6HXo8FivrDX0%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;732&quot; height=&quot;500&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 최근 웹 브라우저의 팝업 창이 열리지 않도록 하는 것을 기본으로 설정되어 있는 경우가 있음 팝업 창을 여는 함수에서 웹 브라우저의 차단 여부를 확인해 줄 필요가 있음&lt;/p&gt;
&lt;pre id=&quot;code_1735618723874&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 팝업이 차단된 브라우저의 알림 창 표시
        function openPopup(){
            var popup = window.open(&quot;popup.html&quot;, &quot;팝업창&quot;, &quot;width=500, height=400&quot;);
            if(popup == null){
                alert(&quot;팝업이 차단되어 있습니다. 팝업을 허용해주세요.&quot;);
            }
            popup.moveBy(100,100);
        }
    &amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;브라우저 창을 닫는 close()&lt;br /&gt;일반적으로 팝업 창 내용을 모두 살펴본 후 창을 닫을 수 있도록 화면 아래 [닫기] 버튼이나 링크를 포함&lt;br /&gt;window.close()&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735619061558&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;button onclick=&quot;javascript:window.close();&quot;&amp;gt;닫기&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;navigator 객체&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;웹 브라우저 버전을 비롯해 플로그인 설치 정보나 온, 오프라인 등의 여러 정보가 담겨 있음&lt;/li&gt;
&lt;li&gt;사용을 해본 적이 없지만 이를 잘 활용하면 사용자 환경에 맞는 기능을 제공할 수 있을 것 같음&lt;br /&gt;주로 프론트 엔드 개발에 활용도가 높을 것으로 보임&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/Navigator&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/ko/docs/Web/API/Navigator&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;history 객체&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;방문한 사이트 주소가 배열 형태로 저장&lt;/li&gt;
&lt;li&gt;브라우저 히스토리는 보안 문제로 읽기 전용&lt;/li&gt;
&lt;li&gt;프로퍼티&lt;br /&gt;length : 방문한 사이트 개수&lt;/li&gt;
&lt;li&gt;메서드&lt;br /&gt;back() : history 목록에서 이전 페이지를 현재 화면으로 불러옴&lt;br /&gt;forward() : history 목록에서 다음 페이지를 현재 화면으로 불러옴&lt;br /&gt;go() : 현재 페이지를 기준으로 상대적인 위치에 있는 페이지를 현재 화면으로 불러옴&lt;br /&gt;back() == go(-1) / forward() == go(1)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;location 객체&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;브라우저의 주소 표시줄과 관련&lt;/li&gt;
&lt;li&gt;현재 문서의 URL 주소 정보가 들어 있는데 이 정보를 편집하면 현재 브라우저 창에서 열어야 할 사이트나 문서를 지정&lt;/li&gt;
&lt;li&gt;프로퍼티&lt;br /&gt;host : URL의 호스트 이름과 포트 번호를 담고 있음&lt;br /&gt;href : 전체 URL. 이 값을 변경하면 해당 주소로 이동&lt;br /&gt;,...&lt;/li&gt;
&lt;li&gt;메서드&lt;br /&gt;reload() : 현재 문서를 다시 불러옴&lt;br /&gt;replace() : 현재 문서의 URL을 지우고 다른 URL의 문서로 교체&lt;br /&gt;toString() : 현재 문서의 URL을 문자열로 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735622310565&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;div id=&quot;display&quot;&amp;gt;
        &amp;lt;script&amp;gt;
            // 사이트 위치 고정하기
            document.write(&quot;&amp;lt;b&amp;gt;location.href&amp;lt;/b&amp;gt; : &quot; + location.href+&quot; &amp;lt;br&amp;gt; &quot;);
            document.write(&quot;&amp;lt;b&amp;gt;location.host&amp;lt;/b&amp;gt; : &quot; + location.host+&quot; &amp;lt;br&amp;gt; &quot;);
            document.write(&quot;&amp;lt;b&amp;gt;location.protocol&amp;lt;/b&amp;gt; : &quot; + location.protocol+&quot; &amp;lt;br&amp;gt; &quot;);
        &amp;lt;/script&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;button onclick=&quot;location.replace(`https://001cloudid.tistory.com/category/organize/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%8A%B8%EB%A6%BD%ED%8A%B8`)&quot;&amp;gt;블로그 이동하기&amp;lt;/button&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;412&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOQBKQ/btsLDc7gED4/LfH8Jb1mSxIHjJNtTislNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOQBKQ/btsLDc7gED4/LfH8Jb1mSxIHjJNtTislNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOQBKQ/btsLDc7gED4/LfH8Jb1mSxIHjJNtTislNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOQBKQ%2FbtsLDc7gED4%2FLfH8Jb1mSxIHjJNtTislNk%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;412&quot; height=&quot;98&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;98&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;screen 객체&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;사용자의 화면 크기나 정보를 알아 낼 때 사용&lt;/li&gt;
&lt;li&gt;프로퍼티&lt;br /&gt;availHegiht&lt;br /&gt;availWidth&lt;br /&gt;colorDepth : 화면에서 픽셀을 렌더링 할 때 사용하는 색상 수&lt;br /&gt;height&lt;br /&gt;orientation : 화면의 현재 방향&lt;br /&gt;pixelDepth : 화면에서 픽셀을 렌더링할 때 사용하는 비트 수&lt;br /&gt;width&lt;/li&gt;
&lt;li&gt;메서드&lt;br /&gt;lockOrientation() : 화면 방향을 잠금&lt;br /&gt;unlockOrientation() : 화면 방향 잠금을 해제&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735622662015&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // screen 객체로 화면의 너비와 높이 알아내기
        document.write(&quot;&amp;lt;b&amp;gt;screen.availHeight&amp;lt;/b&amp;gt;&quot;+screen.availHeight+&quot;&amp;lt;br&amp;gt;&quot;);
        document.write(&quot;&amp;lt;b&amp;gt;screen.availWidth&amp;lt;/b&amp;gt;&quot;+screen.availWidth+&quot;&amp;lt;br&amp;gt;&quot;);
        document.write(&quot;&amp;lt;b&amp;gt;screen.height&amp;lt;/b&amp;gt;&quot;+screen.height+&quot;&amp;lt;br&amp;gt;&quot;);
        document.write(&quot;&amp;lt;b&amp;gt;screen.width&amp;lt;/b&amp;gt;&quot;+screen.width+&quot;&amp;lt;br&amp;gt;&quot;);
    &amp;lt;/script&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;204&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baSf4T/btsLBeyY675/l005BcsVKU0nOM7ZCK4mx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baSf4T/btsLBeyY675/l005BcsVKU0nOM7ZCK4mx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baSf4T/btsLBeyY675/l005BcsVKU0nOM7ZCK4mx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaSf4T%2FbtsLBeyY675%2Fl005BcsVKU0nOM7ZCK4mx0%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;204&quot; height=&quot;105&quot; data-origin-width=&quot;204&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>organize/자바스트립트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/320</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-6#entry320comment</comments>
      <pubDate>Tue, 31 Dec 2024 14:24:48 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트 5</title>
      <link>https://001cloudid.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-5</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;객체&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;객체(Object) 프로그램에서 인식할 수 있는 모든 대상&lt;/li&gt;
&lt;li&gt;자바스크립트에서는 웹 과 관련된 대상을 모두 객체로 인식&lt;/li&gt;
&lt;li&gt;자바스크립트의 객체&lt;br /&gt;문서 객체 모델(DOM)&lt;br /&gt;웹 문서 자체도 객체이고 그 안에 삽입되어 있는 이미지와 링크, 텍스트 필드 등도 모두 객체. 일반적으로 웹 문서에 삽입하는 document, image, link 객체 등&lt;br /&gt;&lt;br /&gt;브라우저 관련 객체(BOM)&lt;br /&gt;웹 브라우저에서 사용하는 정보를 객체로 나타냄&lt;br /&gt;사용하는 브라우저 정보를 담고 있는 navigator 객체를 비롯해 history, location, screen 객체 등&lt;br /&gt;&lt;br /&gt;내장 객체&lt;br /&gt;웹 프로그래밍을 할 때 자주 사용하는 요소는 자바스크립트 안에 미리 객체로 정의되어 있는데, 이를 내장 객체라고 함&lt;/li&gt;
&lt;/ul&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;객체를 참조 형태로 사용해야 함. 객체가 아니라 인스턴스 형태로 만들어서 사용해야 함&lt;br /&gt;객체의 인스턴스를 만들 때는 new 예약어를 사용하고 new 뒤에 만들려고 하는 객체 이름&lt;br /&gt;new 객체명&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735540013105&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // Date 객체의 인스턴스 만들기
        var date = new Date();
        document.write(&quot;현재 시각은 : &quot; + date);
    &amp;lt;/script&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;508&quot; data-origin-height=&quot;39&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dM4SnT/btsLAeMSGeo/KjgwTqqdDMVhv5GM2Q1DA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dM4SnT/btsLAeMSGeo/KjgwTqqdDMVhv5GM2Q1DA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dM4SnT/btsLAeMSGeo/KjgwTqqdDMVhv5GM2Q1DA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdM4SnT%2FbtsLAeMSGeo%2FKjgwTqqdDMVhv5GM2Q1DA1%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;508&quot; height=&quot;39&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;39&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;프로퍼티는 객체의 특징이나 속성&lt;/li&gt;
&lt;li&gt;메서드는 객체에서 할 수 있는 동작을 표현&lt;/li&gt;
&lt;/ul&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;인스턴스는 객체의 프로퍼티와 메서드를 그대로 물려받아 똑같이 사용&lt;/li&gt;
&lt;li&gt;프로퍼티와 메서드를 표시하려면 인스턴스명 뒤에 마침표를 붙이고 객체의 프로퍼티나 메서드 이름을 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735540340234&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 로컬 형식으로 현재 시각 표시
        var now = new Date();
        document.write(&quot;현재 시각 toLocaleString() : &quot; + now.toLocaleString());
    &amp;lt;/script&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;402&quot; data-origin-height=&quot;39&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BDWHS/btsLB16mm6o/Q4aPAKsCrFD28ZYKPq9ZT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BDWHS/btsLB16mm6o/Q4aPAKsCrFD28ZYKPq9ZT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BDWHS/btsLB16mm6o/Q4aPAKsCrFD28ZYKPq9ZT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBDWHS%2FbtsLB16mm6o%2FQ4aPAKsCrFD28ZYKPq9ZT0%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;402&quot; height=&quot;39&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;39&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;h3 data-ke-size=&quot;size23&quot;&gt;자바스크립트의 내장 객체&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;웹 문서의 계층 구조와 상관없이 나타낼 수 있는 객체가 있음&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects&lt;/a&gt;&amp;nbsp;참고&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Array 객체&lt;/p&gt;
&lt;pre id=&quot;code_1735540709679&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // Array 객체 인스턴스 만들기 초기값이 없는 경우
        var numbers = new Array(); // 배열의 크기를 지정하지 않음
        var numbers = new Array(4); // 배열의 크기를 지정

        var numbers = [&quot;1&quot;,&quot;2&quot;,&quot;3&quot;,&quot;4&quot;] // 배열 선언
        var numbers = Array(&quot;1&quot;,&quot;2&quot;,&quot;3&quot;,&quot;4&quot;); // Array 객체를 사용한 배열 선언언
    &amp;lt;/script&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;Array객체의 메서드&lt;/p&gt;
&lt;pre id=&quot;code_1735541051879&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 배열끼리 합치는 concat()
        var nums = [1,2,3];
        var chars = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;];

        var numsChars = nums.concat(chars);
        var charsNums = chars.concat(nums);
        document.write(numsChars + &quot;&amp;lt;br&amp;gt;&quot;);
        document.write(charsNums);
    &amp;lt;/script&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;106&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o31gx/btsLCJRysbB/jJYeBsbZX2KLoTB86G8m81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o31gx/btsLCJRysbB/jJYeBsbZX2KLoTB86G8m81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o31gx/btsLCJRysbB/jJYeBsbZX2KLoTB86G8m81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo31gx%2FbtsLCJRysbB%2FjJYeBsbZX2KLoTB86G8m81%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;106&quot; height=&quot;57&quot; data-origin-width=&quot;106&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735541229809&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 배열 안의 요소 합치기 join()
        var nums = [1,2,3];
        var chars = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;];

        var string1 = nums.join();
        document.write(string1);
        document.write(&quot;&amp;lt;br&amp;gt;구분&amp;lt;br&amp;gt;&quot;)
        var string2 = chars.join('/');
        document.write(string2);
    &amp;lt;/script&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;82&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X9Vkr/btsLAhJxphQ/lKMI5n3EVKRkaJKIQ2M4L0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X9Vkr/btsLAhJxphQ/lKMI5n3EVKRkaJKIQ2M4L0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X9Vkr/btsLAhJxphQ/lKMI5n3EVKRkaJKIQ2M4L0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX9Vkr%2FbtsLAhJxphQ%2FlKMI5n3EVKRkaJKIQ2M4L0%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;82&quot; height=&quot;79&quot; data-origin-width=&quot;82&quot; data-origin-height=&quot;79&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735541410975&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 새로운 요소를 추가하는 push(), unshift()
        var nums = [1,2,3];
        var ret1 = nums.push(4,5); // 배열 맨 끝에 새로운 요소를 추가
        document.write(&quot;배열의 길이 : &quot; + ret1 + &quot;, 배열의 요소 &quot; + nums);
        document.write(&quot;&amp;lt;br&amp;gt;구분&amp;lt;br&amp;gt;&quot;)
        var ret2 = nums.unshift(0); // 배열 맨 앞에 새로운 요소 추가
        document.write(&quot;배열의 길이 : &quot; + ret2 + &quot;, 배열의 요소 &quot; + nums);
    &amp;lt;/script&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;295&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tN9Dh/btsLCrDBWRz/Ly2UBShhkU1Zh7FSUHwWa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tN9Dh/btsLCrDBWRz/Ly2UBShhkU1Zh7FSUHwWa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tN9Dh/btsLCrDBWRz/Ly2UBShhkU1Zh7FSUHwWa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtN9Dh%2FbtsLCrDBWRz%2FLy2UBShhkU1Zh7FSUHwWa1%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;295&quot; height=&quot;78&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;78&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735541656221&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 배열에서 요소 꺼내기 pop(), shift()
        var nums = [1,2,3];
        var rem1 = nums.pop(); // 마지막 요소를 꺼냄
        document.write(&quot;꺼낸 요소 &quot; + rem1 + &quot;, nums의 요소 : &quot; + nums);
        document.write(&quot;&amp;lt;br&amp;gt;구분&amp;lt;br&amp;gt;&quot;)
        var rem2 = nums.shift(); // 1번째 요소를 꺼냄
        document.write(&quot;꺼낸 요소 &quot; + rem2 + &quot;, nums의 요소 : &quot; +nums);
    &amp;lt;/script&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;251&quot; data-origin-height=&quot;81&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ucP4Z/btsLAtbTssR/SeMNUoQ2UJ7n2kyBARxSu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ucP4Z/btsLAtbTssR/SeMNUoQ2UJ7n2kyBARxSu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ucP4Z/btsLAtbTssR/SeMNUoQ2UJ7n2kyBARxSu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FucP4Z%2FbtsLAtbTssR%2FSeMNUoQ2UJ7n2kyBARxSu0%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;251&quot; height=&quot;81&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;81&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735541822401&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 원하는 위치에 요소를 추가, 삭제하는 splice()
        // splice() 메서드의 인수가 1개인 경우 요소 삭제
        var nums = [1,2,3,4,5];
        var newNums = nums.splice(2);
        document.write(&quot;반환된 배열 : &quot; + newNums + &quot; 변경된 배열 : &quot; + nums);
    &amp;lt;/script&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;281&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBbpng/btsLBuBa7Li/5IzZWUgMvnlnYj6VDEPRn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBbpng/btsLBuBa7Li/5IzZWUgMvnlnYj6VDEPRn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBbpng/btsLBuBa7Li/5IzZWUgMvnlnYj6VDEPRn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBbpng%2FbtsLBuBa7Li%2F5IzZWUgMvnlnYj6VDEPRn1%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;281&quot; height=&quot;44&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;44&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735541946468&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // splice() 메서드의 인수가 2개인 경우. 첫 번째 인수는 인덱스값, 두 번째 인수는 삭제할 요소의 개수
        var lang = [&quot;html&quot;, &quot;css&quot;, &quot;js&quot;, &quot;java&quot;];
        var newLang = lang.splice(2,1);
        document.write(&quot;반환된 배열 : &quot; + newLang + &quot;변경된 배열 : &quot; + lang);
    &amp;lt;/script&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;313&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YBI6N/btsLBxdfEzT/CVAXU1TxKyH5QXO3wIdziK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YBI6N/btsLBxdfEzT/CVAXU1TxKyH5QXO3wIdziK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YBI6N/btsLBxdfEzT/CVAXU1TxKyH5QXO3wIdziK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYBI6N%2FbtsLBxdfEzT%2FCVAXU1TxKyH5QXO3wIdziK%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;313&quot; height=&quot;44&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;44&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735542072599&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // splice() 메서드의 인수가 3개인 경우. 첫 번째 인수는 배열에서 삭제할 시작 위치, 두 번째 인수는 삭제할 개수, 세번째 인수는 삭제한 위치에 새로 추가할 요소 지정
        var lang = [&quot;html&quot;, &quot;css&quot;, &quot;js&quot;, &quot;java&quot;];
        var newLang = lang.splice(1,1,&quot;python&quot;);
        document.write(&quot;반환된 배열 : &quot; + newLang + &quot;변경된 배열 : &quot; + lang);
    &amp;lt;/script&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;375&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKu3Qh/btsLB2Yt5Dn/CKbPaXlwM6BjKczamq49i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKu3Qh/btsLB2Yt5Dn/CKbPaXlwM6BjKczamq49i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKu3Qh/btsLB2Yt5Dn/CKbPaXlwM6BjKczamq49i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKu3Qh%2FbtsLB2Yt5Dn%2FCKbPaXlwM6BjKczamq49i1%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;375&quot; height=&quot;47&quot; data-origin-width=&quot;375&quot; data-origin-height=&quot;47&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735542281776&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;     &amp;lt;script&amp;gt;
        //기존 배열을 바꾸지 않으면서 요소를 꺼내는 slice()
        var color = [&quot;black&quot;, &quot;green&quot;, &quot;yellow&quot;, &quot;blue&quot;];
        var color2 = color.slice(2) // 인덱스 값이 2인 요소부터 마지막 요소까지 꺼내기
        document.write(color2);
    &amp;lt;/script&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;97&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k72bH/btsLCGtSHH7/AZOvMxxv121xJYqlPSSnJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k72bH/btsLCGtSHH7/AZOvMxxv121xJYqlPSSnJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k72bH/btsLCGtSHH7/AZOvMxxv121xJYqlPSSnJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk72bH%2FbtsLCGtSHH7%2FAZOvMxxv121xJYqlPSSnJ0%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;97&quot; height=&quot;41&quot; data-origin-width=&quot;97&quot; data-origin-height=&quot;41&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735542546061&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // slice() 메서드의 인수가 2개인 경우 요소 꺼내기
        var color = [&quot;black&quot;, &quot;green&quot;, &quot;yellow&quot;, &quot;blue&quot;];
        var color2 = color.slice(2,4); // 인덱스값이 2부터 3인 요소까지 꺼내기(두번째 요소의 인덱스)
        document.write(color2);
    &amp;lt;/script&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;99&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bttoJd/btsLBvl8TW4/wfxeKIRSynvwW8Y842PAs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bttoJd/btsLBvl8TW4/wfxeKIRSynvwW8Y842PAs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bttoJd/btsLBvl8TW4/wfxeKIRSynvwW8Y842PAs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbttoJd%2FbtsLBvl8TW4%2FwfxeKIRSynvwW8Y842PAs1%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;99&quot; height=&quot;44&quot; data-origin-width=&quot;99&quot; data-origin-height=&quot;44&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Date 객체&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;날짜와 시간 정보를 나타낼 수 있음&lt;/li&gt;
&lt;li&gt;현재 날짜와 시간을 출력하거나 달력을 표시할 수도 있고, 특정일까지 얼마나 남았는지 알려주는 등 사이트에서 여러가지로 응용할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735545394887&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // Date 객체 인스턴스 만들기
        var date = new Date();
        document.write(date);
    &amp;lt;/script&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;395&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brtrI2/btsLAZuWjLJ/fxqXqqXeAVoxp6FYPi5GqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brtrI2/btsLAZuWjLJ/fxqXqqXeAVoxp6FYPi5GqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brtrI2/btsLAZuWjLJ/fxqXqqXeAVoxp6FYPi5GqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrtrI2%2FbtsLAZuWjLJ%2FfxqXqqXeAVoxp6FYPi5GqK%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;395&quot; height=&quot;38&quot; data-origin-width=&quot;395&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735545411388&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // Date 객체로 특정 날짜 나타내기
        var date = new Date(&quot;2025-01-01&quot;); // 월, 일이 한 자리일 때는 앞에 0을 붙이지 않고 2025-1-1로 작성해도 됨
        document.write(&quot;Date 객체로 특정 날짜 나타내기 &quot; + date);
        document.write(&quot;&amp;lt;br&amp;gt;&quot;)
        // Date 객체로 특정 날짜와 시간 나타내기
        var date1 = new Date(&quot;2024-12-30T17:00:00&quot;);
        document.write(&quot;Date 객체로 특정 날짜와 시간 나타내기 &quot; + date1);
    &amp;lt;/script&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;682&quot; data-origin-height=&quot;54&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5nRrh/btsLAT2xclG/9KKLvlkl7Ea1uEcbEWrgX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5nRrh/btsLAT2xclG/9KKLvlkl7Ea1uEcbEWrgX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5nRrh/btsLAT2xclG/9KKLvlkl7Ea1uEcbEWrgX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5nRrh%2FbtsLAT2xclG%2F9KKLvlkl7Ea1uEcbEWrgX1%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;682&quot; height=&quot;54&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;54&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735545726310&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 자바스크립트의 날짜, 시간 입력 방식 알아보기
        // YYYY 연도, MM 월, DD 일, HH 시간, MM 분, SS 초를 의미
        // 1. YYYY-MM-DD 형식
        new Date(&quot;2024&quot;);
        new Date(&quot;2024-12&quot;);
        new Date(&quot;2024-12-30&quot;);

        // 2. YYYY-MM-DDTHH 형식
        new Date(&quot;2024-12-30T17:00:00&quot;); // 시간을 나타낼 때는 날짜뒤에 T를 붙이고 HH:MM:SS의 형태로 사용
        new Date(&quot;2024-12-30T17:00:00Z&quot;); // 맨 끝에 Z를 붙이면 UTC(국제 표준시)로 표시

        // 3. MM/DD/YYYY 형식
        new Date(&quot;12/30/2024&quot;);

        // 4. 이름 형식
        new Date(&quot;TUE Dec 30 2024 17:00:00 GMT+0900 (대한민국 표준시)&quot;);
    &amp;lt;/script&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;Date 객체 메서드&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 200px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;날짜, 시간 정보 가져오기(get+)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;날짜, 시간 정보 설정하기(set+)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;FullYear() : 연도를 4자리 숫자로 표시&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;FullYear() : 연도를 4자리 숫자로 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;Month() : 0~11 사이 숫자로 월을 표시. 0이 1월을 의미&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;Month() : 0~11 사이 숫자로 월을 설정. 0이 1월을 의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;Date() : 1~31 사이 숫자로 일을 표시&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;Date() : 1~31 사이 숫자로 일을 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;Day() : 0~6 사이 숫자로 요일을 표시. 0은 일요일을 의미&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;Day() : 0~6 사이 숫자로 요일을 설정. 0은 일요일을 의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;Time() : 1970/1/1 자정 이후 시간을 밀리초로 표시&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;Time() : 1970/1/1 자정 이후 시간을 밀리초로 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;Hours() 0~23 사이의 숫자로 시를 표시&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;Hours() 0~23 사이의 숫자로 시를 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;Minutes() : 0~59 사이 숫자로 분을 표시&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;Minutes() : 0~59 사이 숫자로 분을 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;Seconds() : 0~59 사이 숫자를 초로 표시&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;Seconds() : 0~59 사이 숫자를 초로 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;Millisecond() : 0~999 사이 숫자로 밀리초를 표시&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;setMillisecond() : 0~999 사이 숫자로 밀리초를 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table style=&quot;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;width: 16.124%;&quot; rowspan=&quot;2&quot;&gt;날짜, 시간 형식 바꾸기&lt;/td&gt;
&lt;td style=&quot;width: 15.4263%;&quot;&gt;toLocaleString()&lt;/td&gt;
&lt;td style=&quot;width: 68.4496%;&quot;&gt;현재 날짜와 시간을 현지 시간으로 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.4263%;&quot;&gt;toString()&lt;/td&gt;
&lt;td style=&quot;width: 68.4496%;&quot;&gt;Date 객체 타입을 문자열로 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Math 객체&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;수학 계산과 관련된 메서드가 많이 포함&lt;/li&gt;
&lt;li&gt;Date, Array 객체는 new 예약어로 객체의 인스턴스를 만든 후 프로그램에서 사용했지만, Math 객체는 인스턴스를 만들지 않음&lt;/li&gt;
&lt;li&gt;Math.프로퍼티명&lt;br /&gt;Math.메서드명&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Math 객체의 프로퍼티&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;E : 오일러 상수&lt;/li&gt;
&lt;li&gt;PI : 원주율&lt;/li&gt;
&lt;li&gt;SORT2 : 루트2&lt;/li&gt;
&lt;li&gt;SORT1_2 : 1/루트2&lt;/li&gt;
&lt;li&gt;LN2 : 로그e의 2&lt;/li&gt;
&lt;li&gt;LN10 : 로그e의 10&lt;/li&gt;
&lt;li&gt;LOG2E : 로그2의 e&lt;/li&gt;
&lt;li&gt;LOG10 : 로그10의 e&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Math 객체의 메서드&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;수학과 관련된 함수의 결괏값을 반환&lt;/li&gt;
&lt;li&gt;abs() : 절댓값을 반환&lt;/li&gt;
&lt;li&gt;ceil() : 매개변수의 소수점 이하 부분을 올림&lt;/li&gt;
&lt;li&gt;floor() : 매개변수의 소수점 이하 부분을 버림&lt;/li&gt;
&lt;li&gt;log() : 매개변수에 대한 로그값&lt;/li&gt;
&lt;li&gt;max() : 매개변수 중 최댓값을 반환&lt;/li&gt;
&lt;li&gt;min() : 매개변수 중 최솟값을 반환&lt;/li&gt;
&lt;li&gt;pow() : 매개변수의 지숫값을 반환&lt;/li&gt;
&lt;li&gt;random() : 0~1 사이의 무작위 수를 반환&lt;/li&gt;
&lt;li&gt;round() : 매개변수의 소수점 이하 부분을 반올림&lt;/li&gt;
&lt;li&gt;sqrt() : 매개변수에 대한 제곱근을 반환&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>organize/자바스트립트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/319</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-5#entry319comment</comments>
      <pubDate>Mon, 30 Dec 2024 17:20:22 +0900</pubDate>
    </item>
    <item>
      <title>스프링 웹 프로젝트 4</title>
      <link>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MVC(Model-View-Controller)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;대부분의 서블릿 기반 프레임워크들이 사용하는 방식&lt;/li&gt;
&lt;li&gt;데이터와&amp;nbsp; 처리, 화면을 분리하는 방식&lt;/li&gt;
&lt;li&gt;웹에서는 Model 2 방식으로 표현&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;※ Model 2 : 왜 Controller를 따로 분리했을까?, 유지보수가 좋다는 이유는?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller : URL 처리, 화면과 로직 분리&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;※ 서블릿(모델2)과 스프링 MVC Cotroller&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;서블릿&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;스프링 MVC Controller&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;클래스에서 URL 분기&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;클래스 혹은 메서드에서 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;GET/POST는 메서드 선택과 오버라이드&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;@GetMapping/@PostMapping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;고정된 파라미터와 리턴 타입&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;파라미터의 자동 수집(상속이 아님)&lt;br /&gt;상황에 따른 반환 타입 조정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;수동으로 직접 forward&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;자동으로 forward 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;의존성 주입 불가&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;스프링을 통해 다른 객체 주입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;JSON 등의 처리 불편함&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;@RestController&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;기타 어노테이션을 통한 많은 기능 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;다양한 Views 처리 기능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l6Htw/btsLCrpXu6m/5sSSB33us1njUKaKllV2p0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l6Htw/btsLCrpXu6m/5sSSB33us1njUKaKllV2p0/img.png&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;784&quot; data-is-animation=&quot;false&quot; style=&quot;width: 47.7608%; margin-right: 10px;&quot; data-widthpercent=&quot;48.32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l6Htw/btsLCrpXu6m/5sSSB33us1njUKaKllV2p0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl6Htw%2FbtsLCrpXu6m%2F5sSSB33us1njUKaKllV2p0%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;722&quot; height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Igx3W/btsLBfKOWEk/V8ZhBckLhvMt5Wjk7DNEc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Igx3W/btsLBfKOWEk/V8ZhBckLhvMt5Wjk7DNEc1/img.png&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;396&quot; data-is-animation=&quot;false&quot; style=&quot;width: 51.0764%;&quot; data-widthpercent=&quot;51.68&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Igx3W/btsLBfKOWEk/V8ZhBckLhvMt5Wjk7DNEc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIgx3W%2FbtsLBfKOWEk%2FV8ZhBckLhvMt5Wjk7DNEc1%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;390&quot; height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/div&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Legacy Project를 생성하면 버전이 낮다는 단점, 스프링 버전 및 JDK 버전 수정 lombok 라이브러리 다운로드 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pom.xml&lt;/p&gt;
&lt;pre id=&quot;code_1735530814955&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;
	&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
	&amp;lt;groupId&amp;gt;org.zerock&amp;lt;/groupId&amp;gt;
	&amp;lt;artifactId&amp;gt;controller&amp;lt;/artifactId&amp;gt;
	&amp;lt;name&amp;gt;ex01&amp;lt;/name&amp;gt;
	&amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;
	&amp;lt;version&amp;gt;1.0.0-BUILD-SNAPSHOT&amp;lt;/version&amp;gt;
	&amp;lt;properties&amp;gt;
		&amp;lt;java-version&amp;gt;1.6&amp;lt;/java-version&amp;gt;
		&amp;lt;org.springframework-version&amp;gt;5.2.7.RELEASE&amp;lt;/org.springframework-version&amp;gt;
		&amp;lt;org.aspectj-version&amp;gt;1.6.10&amp;lt;/org.aspectj-version&amp;gt;
		&amp;lt;org.slf4j-version&amp;gt;1.6.6&amp;lt;/org.slf4j-version&amp;gt;
	&amp;lt;/properties&amp;gt;
	&amp;lt;dependencies&amp;gt;
		&amp;lt;!-- Spring --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
			&amp;lt;exclusions&amp;gt;
				&amp;lt;!-- Exclude Commons Logging in favor of SLF4j --&amp;gt;
				&amp;lt;exclusion&amp;gt;
					&amp;lt;groupId&amp;gt;commons-logging&amp;lt;/groupId&amp;gt;
					&amp;lt;artifactId&amp;gt;commons-logging&amp;lt;/artifactId&amp;gt;
				&amp;lt;/exclusion&amp;gt;
			&amp;lt;/exclusions&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-test&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;1.18.36&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- AspectJ --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.aspectj&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;aspectjrt&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.aspectj-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- Logging --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.slf4j-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;jcl-over-slf4j&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.slf4j-version}&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.slf4j-version}&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;log4j&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;log4j&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;1.2.17&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- @Inject --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;javax.inject&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;javax.inject&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;1&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- Servlet --&amp;gt;
		&amp;lt;!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;javax.servlet-api&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;4.0.1&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;javax.servlet.jsp&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;jsp-api&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;2.1&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;jstl&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;1.2&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- Test --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;4.12&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;
	&amp;lt;/dependencies&amp;gt;
	&amp;lt;build&amp;gt;
		&amp;lt;plugins&amp;gt;
			&amp;lt;plugin&amp;gt;
				&amp;lt;artifactId&amp;gt;maven-eclipse-plugin&amp;lt;/artifactId&amp;gt;
				&amp;lt;version&amp;gt;2.9&amp;lt;/version&amp;gt;
				&amp;lt;configuration&amp;gt;
					&amp;lt;additionalProjectnatures&amp;gt;
						&amp;lt;projectnature&amp;gt;org.springframework.ide.eclipse.core.springnature&amp;lt;/projectnature&amp;gt;
					&amp;lt;/additionalProjectnatures&amp;gt;
					&amp;lt;additionalBuildcommands&amp;gt;
						&amp;lt;buildcommand&amp;gt;org.springframework.ide.eclipse.core.springbuilder&amp;lt;/buildcommand&amp;gt;
					&amp;lt;/additionalBuildcommands&amp;gt;
					&amp;lt;downloadSources&amp;gt;true&amp;lt;/downloadSources&amp;gt;
					&amp;lt;downloadJavadocs&amp;gt;true&amp;lt;/downloadJavadocs&amp;gt;
				&amp;lt;/configuration&amp;gt;
			&amp;lt;/plugin&amp;gt;
			&amp;lt;plugin&amp;gt;
				&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
				&amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
				&amp;lt;version&amp;gt;2.5.1&amp;lt;/version&amp;gt;
				&amp;lt;configuration&amp;gt;
					&amp;lt;source&amp;gt;1.8&amp;lt;/source&amp;gt;
					&amp;lt;target&amp;gt;1.8&amp;lt;/target&amp;gt;
					&amp;lt;compilerArgument&amp;gt;-Xlint:all&amp;lt;/compilerArgument&amp;gt;
					&amp;lt;showWarnings&amp;gt;true&amp;lt;/showWarnings&amp;gt;
					&amp;lt;showDeprecation&amp;gt;true&amp;lt;/showDeprecation&amp;gt;
				&amp;lt;/configuration&amp;gt;
			&amp;lt;/plugin&amp;gt;
			&amp;lt;plugin&amp;gt;
				&amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
				&amp;lt;artifactId&amp;gt;exec-maven-plugin&amp;lt;/artifactId&amp;gt;
				&amp;lt;version&amp;gt;1.2.1&amp;lt;/version&amp;gt;
				&amp;lt;configuration&amp;gt;
					&amp;lt;mainClass&amp;gt;org.test.int1.Main&amp;lt;/mainClass&amp;gt;
				&amp;lt;/configuration&amp;gt;
			&amp;lt;/plugin&amp;gt;
		&amp;lt;/plugins&amp;gt;
	&amp;lt;/build&amp;gt;
&amp;lt;/project&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 프로젝트는 가능하면 절대 경로를 이용하는 구조를 사용하는 것이 바람직하므로 Server 탭에 Tomcat v9.0을 더블클릭 &amp;rarr; Modules &amp;rarr; 프로젝트 클릭(이 경우 ex01) &amp;rarr; Edit &amp;rarr; Path를 '/' 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDTUL6/btsLBfqz7Bb/CRNZcLVt9IgVdab1jcOVH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDTUL6/btsLBfqz7Bb/CRNZcLVt9IgVdab1jcOVH0/img.png&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;139&quot; data-is-animation=&quot;false&quot; style=&quot;width: 54.9423%; margin-right: 10px;&quot; data-widthpercent=&quot;55.59&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDTUL6/btsLBfqz7Bb/CRNZcLVt9IgVdab1jcOVH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDTUL6%2FbtsLBfqz7Bb%2FCRNZcLVt9IgVdab1jcOVH0%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;401&quot; height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPoyAu/btsLzpnnlCg/26BJyhvayxk4QZveqmwl9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPoyAu/btsLzpnnlCg/26BJyhvayxk4QZveqmwl9K/img.png&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;643&quot; data-is-animation=&quot;false&quot; style=&quot;width: 43.8949%;&quot; data-widthpercent=&quot;44.41&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPoyAu/btsLzpnnlCg/26BJyhvayxk4QZveqmwl9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPoyAu%2FbtsLzpnnlCg%2F26BJyhvayxk4QZveqmwl9K%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;1482&quot; height=&quot;643&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfUQtt/btsLBWRhvCq/YVfC9nfFggO38TSbgSuQD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfUQtt/btsLBWRhvCq/YVfC9nfFggO38TSbgSuQD1/img.png&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;173&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.9213%; margin-right: 10px; margin-top: 10px;&quot; data-widthpercent=&quot;50.51&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfUQtt/btsLBWRhvCq/YVfC9nfFggO38TSbgSuQD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfUQtt%2FbtsLBWRhvCq%2FYVfC9nfFggO38TSbgSuQD1%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;286&quot; height=&quot;173&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbgCdy/btsLB0Gb4rC/gkKvzHuvAQlllmdblVEkAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbgCdy/btsLB0Gb4rC/gkKvzHuvAQlllmdblVEkAK/img.png&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;171&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.9159%; margin-top: 10px;&quot; data-widthpercent=&quot;49.49&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbgCdy/btsLB0Gb4rC/gkKvzHuvAQlllmdblVEkAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbgCdy%2FbtsLB0Gb4rC%2FgkKvzHuvAQlllmdblVEkAK%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;277&quot; height=&quot;171&quot;/&gt;&lt;/span&gt;&lt;/div&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;web.xml&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;dd파일 서블릿과 관련된 설정파일&lt;/li&gt;
&lt;li&gt;web.xml은 프로젝트 구동 시 관여하는 XML 중 하나(나머지는 root-context.xml, servlet-context.xml)&lt;/li&gt;
&lt;li&gt;web.xml은 Tomcat 구동과 관련된 설정이며, 나머지 두 파일은 스프링과 관련된 설정 파일임&lt;/li&gt;
&lt;li&gt;프로젝트 구동은 web.xml에서 시작&lt;br /&gt;web.xml의 상단에는 가장 먼저 구동되는 Context Listener가 등록되어 있음&lt;br /&gt;&amp;rarr; 프로젝트를 실행하면 가정 먼저 로그를 출력하면서 기록함&lt;/li&gt;
&lt;li&gt;root-context.xml이 처리 &amp;rarr; servlet-context.xml이 처리됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 MVC&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1811&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxSqaR/btsLArLPZfY/oxOvFhQenpwyiIBikPRZMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxSqaR/btsLArLPZfY/oxOvFhQenpwyiIBikPRZMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxSqaR/btsLArLPZfY/oxOvFhQenpwyiIBikPRZMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxSqaR%2FbtsLArLPZfY%2FoxOvFhQenpwyiIBikPRZMk%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;1811&quot; height=&quot;937&quot; data-origin-width=&quot;1811&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;사용자의 Request는 DispatcherServlet을 통해 처리&lt;/li&gt;
&lt;li&gt;HandlerMapping은 Request의 처리를 담당하는 컨트롤러를 찾기 위해 존재&lt;/li&gt;
&lt;li&gt;적절한 컨트롤러가 찾아졌다면 HandlerAdapter를 이용해서 해당 컨트롤러를 동작&lt;/li&gt;
&lt;li&gt;Controller는 개발자가 작성해야하는 클래스로 실제 Request를 처리하는 로직을 작성&lt;br /&gt;View에 전달해야 하는 데이터는 주로 Model이라는 객체에 담아서 전달&lt;/li&gt;
&lt;li&gt;Controller는 다양한 타입의 결과를 반환하는 데 이에 대한 처리는 ViewResolver를 이용&lt;/li&gt;
&lt;li&gt;View는 실제로 응답 보내야하는 데이터를 JSP 등을 이용해서 생성하는 역할을 하게 됨&lt;br /&gt;만들어진 응답은 DispatcherServlet을 통해서 전송&lt;/li&gt;
&lt;/ol&gt;
&lt;figure data-ke-type=&quot;image&quot; data-ke-style=&quot;alignCenter&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; data-link=&quot;https://github.com/kenu/springstudy2013/blob/master/0401/01.%EC%8A%A4%ED%94%84%EB%A7%81MVC%EC%9D%98%20%EC%A3%BC%EC%9A%94%20%EA%B5%AC%EC%84%B1%20%EC%9A%94%EC%86%8C%20%EB%B0%8F%20%EC%B2%98%EB%A6%AC%20%ED%9D%90%EB%A6%84.md&quot; data-link-islinknewwindow=&quot;true&quot; data-link-title=&quot;출처&quot;&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면을 반환하려면 jsp이름을 반환값으로 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 화면에 전달하고 싶은 데이터가 있으면 Model 객체에 담아서 전달한다.&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;Controller&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;HttpServletRequest, HttpServletResponse를 사용할 필요 없이 필요한 기능을 구현&lt;/li&gt;
&lt;li&gt;다양한 타입의 파라미터 처리, 다양한 타입의 리턴 타입 사용 가능&lt;/li&gt;
&lt;li&gt;GET 방식, POST 방식 등 전송 방식에 대한 처리를 어노테이션 처리 가능&lt;br /&gt;4버전 이후 @GetMapping, @PostMapping&lt;/li&gt;
&lt;li&gt;상속, 인터페이스 방식 대신 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;어노테이션만으로도 필요한 설정 가능&lt;br /&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오버라이드 규칙이 없어짐&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/318</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-4#entry318comment</comments>
      <pubDate>Mon, 30 Dec 2024 13:42:36 +0900</pubDate>
    </item>
    <item>
      <title>스프링 웹 프로젝트 3</title>
      <link>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-3</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MyBatis와 스프링 연동&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;letter-spacing: 0px;&quot;&gt;연동에 앞서 MyBatis란?&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;SQL Mapping 프레임 워크&lt;br /&gt;SQL과 Object 간의 관계를 매핑해주는 역할&lt;br /&gt;JDBC 코드에 비해 처리하는 부분이 간결해지고, close 처리를 지원&lt;br /&gt;※ JPA와는 다름. JPA(RDBMS -&amp;gt; 객체지향에 접목).&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;MyBatis는 SQL, 객체지향 매핑하는 역할&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Spring에서의 사용&lt;br /&gt;스프링은 MyBatis와의 연결을 위한 mybatis-spring 라이브러리를 이용해서 연동 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MyBatis 세팅&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 dataSource 설정 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pom.xml 라이브러리 추가&lt;/p&gt;
&lt;pre id=&quot;code_1735449672762&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;mybatis&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;3.5.6&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 라이브러리만 추가해도 개발이 가능하지만, 스프링과 연동하면 더 좋아짐. MyBatis Spring 라이브러리도 추가&lt;/p&gt;
&lt;pre id=&quot;code_1735449856121&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;mybatis-spring&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.3.2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적인 설정이 필요 spring-jdbc, spring-tx&lt;/p&gt;
&lt;pre id=&quot;code_1735449929725&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;			&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-jdbc&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-tx&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SqlSeesionFactory의설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root-context.xml에 MyBatis설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MyBatis의 핵심 객체는 SqlSessionFactory 타입의 객체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SqlSessionFactoryBean은 내부적으로 MyBatis의 SqlSessionFactory를 생성&lt;/p&gt;
&lt;pre id=&quot;code_1735450125493&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;bean id=&quot;sqlSessionFactory&quot; class=&quot;org.mybatis.spring.SqlSessionFactoryBean&quot;&amp;gt;
		&amp;lt;property name=&quot;dataSource&quot; ref=&quot;dateSource&quot;&amp;gt;&amp;lt;/property&amp;gt;
	&amp;lt;/bean&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DataSourceTests에 아래 코드를 추가&lt;/p&gt;
&lt;pre id=&quot;code_1735450440977&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.persistence;

(...생략...)

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;)
@Log4j
public class DataSourceTests {

(...생략...)

	@Autowired
	private SqlSessionFactory sqlSessionFactory;

(...생략...)

	@Test
	public void testConnection2() {
		try (SqlSession session = sqlSessionFactory.openSession(); Connection connection = session.getConnection()) {
			log.info(session);
            log.info(connection);
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e.getMessage());
		}
	}
    
}&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;1463&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEDeoO/btsLAiH3U6m/3KRoA6hRk1e5roivRa0jM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEDeoO/btsLAiH3U6m/3KRoA6hRk1e5roivRa0jM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEDeoO/btsLAiH3U6m/3KRoA6hRk1e5roivRa0jM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEDeoO%2FbtsLAiH3U6m%2F3KRoA6hRk1e5roivRa0jM1%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;1463&quot; height=&quot;912&quot; data-origin-width=&quot;1463&quot; data-origin-height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AutoClose하기 때문에 close를 해주지 않아도 됨&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 연동 처리 및 연동 테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src/main/java 폴더 안에 org.zerock.mapper 패키지를 생성 &amp;rarr; TimeMapper 인터페이스&lt;/p&gt;
&lt;pre id=&quot;code_1735451079061&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.mapper;

import org.apache.ibatis.annotations.Select;

public interface TimeMapper {
	
	@Select(&quot;select sysdate from dual&quot;) // 주의 ;(세미콜론)이 없어야함
	public String getTime();
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mapper 설정 root-context.xml에서 Namespaces에서 Mybatis-spring을 체크&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FnlpQ/btsLBvlQNXF/rJ6kJ2h4ihwLza8VYHH7PK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FnlpQ/btsLBvlQNXF/rJ6kJ2h4ihwLza8VYHH7PK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FnlpQ/btsLBvlQNXF/rJ6kJ2h4ihwLza8VYHH7PK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFnlpQ%2FbtsLBvlQNXF%2FrJ6kJ2h4ihwLza8VYHH7PK%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;743&quot; height=&quot;617&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;체크하고 Source를 확인하면 코드가 자동으로 추가됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1331&quot; data-origin-height=&quot;625&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b98TbM/btsLzu9Rx8d/n0qvuMrG2cMHlp15MAc3L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b98TbM/btsLzu9Rx8d/n0qvuMrG2cMHlp15MAc3L1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b98TbM/btsLzu9Rx8d/n0qvuMrG2cMHlp15MAc3L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb98TbM%2FbtsLzu9Rx8d%2Fn0qvuMrG2cMHlp15MAc3L1%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;1331&quot; height=&quot;625&quot; data-origin-width=&quot;1331&quot; data-origin-height=&quot;625&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동 완성 기능이 됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsa0e5/btsLz9D9FJG/vDVkRGFe9KOKWVMyflaKO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsa0e5/btsLz9D9FJG/vDVkRGFe9KOKWVMyflaKO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsa0e5/btsLz9D9FJG/vDVkRGFe9KOKWVMyflaKO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbsa0e5%2FbtsLz9D9FJG%2FvDVkRGFe9KOKWVMyflaKO0%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;902&quot; height=&quot;276&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735451309217&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
	xmlns:mybatis-spring=&quot;http://mybatis.org/schema/mybatis-spring&quot;
	xsi:schemaLocation=&quot;http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd&quot;&amp;gt;
	
	&amp;lt;!-- Root Context: defines shared resources visible to all other web components --&amp;gt;
	
	&amp;lt;bean id=&quot;hikariConnfig&quot; class=&quot;com.zaxxer.hikari.HikariConfig&quot;&amp;gt;
		&amp;lt;property name=&quot;driverClassName&quot; value=&quot;oracle.jdbc.driver.OracleDriver&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;jdbcUrl&quot; value=&quot;jdbc:oracle:thin:@localhost:1521:XE&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;username&quot; value=&quot;book_ex&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;password&quot; value=&quot;book_ex&quot;&amp;gt;&amp;lt;/property&amp;gt;
	&amp;lt;/bean&amp;gt;
	
	&amp;lt;bean id=&quot;dateSource&quot; class=&quot;com.zaxxer.hikari.HikariDataSource&quot; destroy-method=&quot;close&quot;&amp;gt;
		&amp;lt;constructor-arg ref=&quot;hikariConnfig&quot; /&amp;gt;
	&amp;lt;/bean&amp;gt;
	
	&amp;lt;bean id=&quot;sqlSessionFactory&quot; class=&quot;org.mybatis.spring.SqlSessionFactoryBean&quot;&amp;gt;
		&amp;lt;property name=&quot;dataSource&quot; ref=&quot;dateSource&quot;&amp;gt;&amp;lt;/property&amp;gt;
	&amp;lt;/bean&amp;gt;
	
	&amp;lt;mybatis-spring:scan base-package=&quot;org.zerock.mapper&quot;/&amp;gt;
		
	&amp;lt;context:component-scan base-package=&quot;org.zerock.sample&quot;&amp;gt;&amp;lt;/context:component-scan&amp;gt;
		
&amp;lt;/beans&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src/test/java 폴더의 org.zerock.persistence 패키지 안에 TimeMapperTests클래스를 생성&lt;/p&gt;
&lt;pre id=&quot;code_1735451570223&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.persistence;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.mapper.TimeMapper;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;)
@Log4j
public class TimeMapperTests {
	
	@Autowired
	private TimeMapper timeMapper;
	
	@Test
	public void testTime1() {
		
		timeMapper.getTime(); // 호출
	}

}&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;1467&quot; data-origin-height=&quot;875&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYNzfZ/btsLz3xClsZ/2YzV5koTDkXxOQKOaI1ioK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYNzfZ/btsLz3xClsZ/2YzV5koTDkXxOQKOaI1ioK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYNzfZ/btsLz3xClsZ/2YzV5koTDkXxOQKOaI1ioK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYNzfZ%2FbtsLz3xClsZ%2F2YzV5koTDkXxOQKOaI1ioK%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;1467&quot; height=&quot;875&quot; data-origin-width=&quot;1467&quot; data-origin-height=&quot;875&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735451747277&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.persistence;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.mapper.TimeMapper;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;)
@Log4j
public class TimeMapperTests {
	
	@Autowired
	private TimeMapper timeMapper;
	
	@Test
	public void testTime1() {
		
//		timeMapper.getTime(); // 호출
		log.info(timeMapper.getTime());
		
	}

}&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;1468&quot; data-origin-height=&quot;886&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zAFrf/btsLBtPozi4/fc3cWy8ZmHJ8NUV77qHAfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zAFrf/btsLBtPozi4/fc3cWy8ZmHJ8NUV77qHAfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zAFrf/btsLBtPozi4/fc3cWy8ZmHJ8NUV77qHAfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzAFrf%2FbtsLBtPozi4%2Ffc3cWy8ZmHJ8NUV77qHAfk%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;1468&quot; height=&quot;886&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;886&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XML Mapper 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;spring-test를 이용해서 테스트 코드 작성 시 sql이 길어지면 관리가 힘들어짐. XML Mapper와 Mapper 인터페이스를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XML 파일은 src/main/java 폴더 mapper 패키지에 생성하거나 src/main/resources 폴더에 mapper 폴더를 만들고 생성해도 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, src/main/resources 폴더에 만들때 폴더를 만들 때 하나하나씩 만들어야함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;195&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FsFRL/btsLCqEqqRO/OCCY5Nd81HnycJvNMvC6yK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FsFRL/btsLCqEqqRO/OCCY5Nd81HnycJvNMvC6yK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FsFRL/btsLCqEqqRO/OCCY5Nd81HnycJvNMvC6yK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFsFRL%2FbtsLCqEqqRO%2FOCCY5Nd81HnycJvNMvC6yK%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;195&quot; height=&quot;109&quot; data-origin-width=&quot;195&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XML 파일의 이름은 인터페이스 이름과 같게 하면 찾기 편하고 처리할 때도 편함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biY8gG/btsLCmINH6s/XnKzaXeUNZKRH2kfrKUClK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biY8gG/btsLCmINH6s/XnKzaXeUNZKRH2kfrKUClK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biY8gG/btsLCmINH6s/XnKzaXeUNZKRH2kfrKUClK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiY8gG%2FbtsLCmINH6s%2FXnKzaXeUNZKRH2kfrKUClK%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;292&quot; height=&quot;248&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735452565494&quot; class=&quot;xml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
	PUBLIC &quot;-//mybatis.org/DTD Mapper 3.0//EN&quot;
	&quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;uarr; XML 문서를 만들면 dtd -&amp;gt; 자동완성기능&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 작성하면 자동완성기능이 되며, 아래와 같이 쿼리를 작성&lt;/p&gt;
&lt;pre id=&quot;code_1735452562686&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
	PUBLIC &quot;-//mybatis.org/DTD Mapper 3.0//EN&quot;
	&quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;


&amp;lt;mapper namespace=&quot;org.zerock.mapper.TimeMapper&quot;&amp;gt;  &amp;lt;!-- namespace는 인터페이스와 동일하게 --&amp;gt;
	&amp;lt;select id=&quot;getTime2&quot;&amp;gt; &amp;lt;!-- getTime2에는 sql이 없음 -&amp;gt; mybatis는 xml에서 찾아 sql을 실행  --&amp;gt;
		select sysdate from dual
	&amp;lt;/select&amp;gt;
&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 동작 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TimeMapperTests에 코드 추가&lt;/p&gt;
&lt;pre id=&quot;code_1735452673877&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@Test
	public void testTime2() {
		
		log.info(timeMapper.getTime2());
	}&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;1464&quot; data-origin-height=&quot;875&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/45Tp3/btsLBvGbuQ5/HgeXMU5RCPJzELBHEWjSoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/45Tp3/btsLBvGbuQ5/HgeXMU5RCPJzELBHEWjSoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/45Tp3/btsLBvGbuQ5/HgeXMU5RCPJzELBHEWjSoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F45Tp3%2FbtsLBvGbuQ5%2FHgeXMU5RCPJzELBHEWjSoK%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;1464&quot; height=&quot;875&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;875&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sql은 실행되었으나 처리를 어떻게 해야할지 모르겠다는 의미의 에러가 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select의 경우 반환타입이 있어야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TimeMapper.xml 수정&lt;/p&gt;
&lt;pre id=&quot;code_1735452922587&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
	PUBLIC &quot;-//mybatis.org/DTD Mapper 3.0//EN&quot;
	&quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;


&amp;lt;mapper namespace=&quot;org.zerock.mapper.TimeMapper&quot;&amp;gt;
	&amp;lt;select id=&quot;getTime2&quot; resultType=&quot;string&quot;&amp;gt; &amp;lt;!-- getTime2에는 sql이 없음 -&amp;gt; mybatis는 xml에서 찾아 sql을 실행  --&amp;gt;
		select sysdate from dual
	&amp;lt;/select&amp;gt;
&amp;lt;/mapper&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;1460&quot; data-origin-height=&quot;897&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV4wju/btsLAdzJOtI/Z0Key2kJa37o0lro5XhiK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV4wju/btsLAdzJOtI/Z0Key2kJa37o0lro5XhiK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV4wju/btsLAdzJOtI/Z0Key2kJa37o0lro5XhiK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV4wju%2FbtsLAdzJOtI%2FZ0Key2kJa37o0lro5XhiK1%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;1460&quot; height=&quot;897&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;897&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상 동작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mybatis 연동, spring-mybatis연동, xml처리까지 완료&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;log4jdbc-log4j2 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ MyBatis는 내부적으로 PreparedStatement를 이용하기 때문에 좀 더 쉽게 SQL의 로그를 보기 위한 설정 &amp;rarr; DB 버전에 조심해야함. 안될 경우 순수 jdbc로 로그를 찍어야함&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;rarr; 프로퍼티 파일 추가 &amp;rarr; DataSource 설정 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라이브러리 추가&lt;/p&gt;
&lt;pre id=&quot;code_1735453322339&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		&amp;lt;!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4.1 --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.bgee.log4jdbc-log4j2&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;log4jdbc-log4j2-jdbc4.1&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;1.16&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&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;/p&gt;
&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/y1OqM/btsLz6m57YC/swFwgBGg55cwFq4H4CAcl0/log4jdbc.log4j2.Properties?attach=1&amp;amp;knm=tfile.Properties&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;log4jdbc.log4j2.Properties&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&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;이 파일을 src/main/resources에 추가 테스트할 때 불안해서 저자는 src/test/resources에도 함께 추가하는 것을 추천함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;235&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rw0Eh/btsLAzQarN8/lLULag5xw0nZeVhgSFrYm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rw0Eh/btsLAzQarN8/lLULag5xw0nZeVhgSFrYm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rw0Eh/btsLAzQarN8/lLULag5xw0nZeVhgSFrYm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frw0Eh%2FbtsLAzQarN8%2FlLULag5xw0nZeVhgSFrYm1%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;235&quot; height=&quot;168&quot; data-origin-width=&quot;235&quot; data-origin-height=&quot;168&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;DataSource 설정 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root-context.xml에서&lt;/p&gt;
&lt;pre id=&quot;code_1735453811395&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;bean id=&quot;hikariConnfig&quot; class=&quot;com.zaxxer.hikari.HikariConfig&quot;&amp;gt;
		&amp;lt;property name=&quot;driverClassName&quot; value=&quot;oracle.jdbc.driver.OracleDriver&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;jdbcUrl&quot; value=&quot;jdbc:oracle:thin:@localhost:1521:XE&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;username&quot; value=&quot;book_ex&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;password&quot; value=&quot;book_ex&quot;&amp;gt;&amp;lt;/property&amp;gt;
	&amp;lt;/bean&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분을 수정&lt;/p&gt;
&lt;pre id=&quot;code_1735453888012&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;bean id=&quot;hikariConnfig&quot; class=&quot;com.zaxxer.hikari.HikariConfig&quot;&amp;gt;
		&amp;lt;property name=&quot;driverClassName&quot; value=&quot;net.sf.log4jdbc.sql.jdbcapi.DriverSpy&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;jdbcUrl&quot; value=&quot;jdbc:log4jdbc:oracle:thin:@localhost:1521:XE&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;username&quot; value=&quot;book_ex&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;password&quot; value=&quot;book_ex&quot;&amp;gt;&amp;lt;/property&amp;gt;
	&amp;lt;/bean&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태에서 JUnit 테스트&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1463&quot; data-origin-height=&quot;893&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lgc5x/btsLA5BbgY9/lYou5VllGCnc62rBw6Zk4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lgc5x/btsLA5BbgY9/lYou5VllGCnc62rBw6Zk4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lgc5x/btsLA5BbgY9/lYou5VllGCnc62rBw6Zk4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flgc5x%2FbtsLA5BbgY9%2FlYou5VllGCnc62rBw6Zk4K%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;1463&quot; height=&quot;893&quot; data-origin-width=&quot;1463&quot; data-origin-height=&quot;893&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘솔창 내용을 복사 붙여넣기&lt;/p&gt;
&lt;pre id=&quot;code_1735453976557&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;|----------------------|
|sysdate               |
|----------------------|
|2024-12-29 15:31:58.0 |
|----------------------|

INFO : jdbc.resultset - 1. ResultSet.next() returned false
INFO : jdbc.resultset - 1. ResultSet.close() returned void
INFO : jdbc.audit - 1. Connection.getMetaData() returned oracle.jdbc.driver.OracleDatabaseMetaData@5b12012e
INFO : jdbc.audit - 1. PreparedStatement.close() returned 
INFO : jdbc.audit - 1. Connection.clearWarnings() returned 
INFO : org.zerock.persistence.TimeMapperTests - 2024-12-29 15:31:58.0
INFO : com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
INFO : jdbc.connection - 1. Connection closed
INFO : jdbc.audit - 1. Connection.close() returned 
INFO : jdbc.connection - 2. Connection closed
INFO : jdbc.audit - 2. Connection.close() returned 
INFO : jdbc.connection - 3. Connection closed
INFO : jdbc.audit - 3. Connection.close() returned 
INFO : jdbc.connection - 4. Connection closed
INFO : jdbc.audit - 4. Connection.close() returned 
INFO : jdbc.connection - 5. Connection closed
INFO : jdbc.audit - 5. Connection.close() returned 
INFO : jdbc.connection - 6. Connection closed
INFO : jdbc.audit - 6. Connection.close() returned 
INFO : jdbc.connection - 7. Connection closed
INFO : jdbc.audit - 7. Connection.close() returned 
INFO : jdbc.connection - 8. Connection closed
INFO : jdbc.audit - 8. Connection.close() returned 
INFO : jdbc.connection - 9. Connection closed
INFO : jdbc.audit - 9. Connection.close() returned 
INFO : jdbc.connection - 10. Connection closed
INFO : jdbc.audit - 10. Connection.close() returned 
INFO : com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 동작하지 않는다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 전 동작하는지 확인하고 동작 확인이 되는데 안된다면 DB나 JDBC 드라이버의 지원이 안됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/317</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-3#entry317comment</comments>
      <pubDate>Sun, 29 Dec 2024 15:34:37 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트 4</title>
      <link>https://001cloudid.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-4</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;재사용할 수 있는 함수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;함수를 실행하는 데 필요한 값을 함수 밖에서 제공하는 것&lt;/li&gt;
&lt;li&gt;함수 안에서만 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;return&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;결괏값을 함수 밖에서 사용하려면 함수를 실행한 위치로 돌려줘야함. 이러한 동작을 값을 반환한다(return)고 함&lt;/li&gt;
&lt;li&gt;함수의 결괏값을 반환할 때 return을 사용해서 넘겨줄 값을 지정해주면 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735441740550&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 매개 변수를 사용한 함수 선언하기
        function addNum(num1, num2){
            var sum = num1 + num2;
            return sum;
        }        
    &amp;lt;/script&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;인수(argument)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;함수 선언이 끝났다면 실행할 함수를 호출해야함. 매개변수가 있는 함수를 호출할 때 실제 값 부분을 인수라고 함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735441943656&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 매개변수를 사용한 함수 선언하고 호출하기
        function addNum1(num1, num2){
            var sum = num1 + num2;
            return sum;
        }
        var result = addNum1(10, 3);
        document.write(&quot;두 수를 더한 값은 &quot; + result);
    &amp;lt;/script&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;214&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtHXDq/btsLz4QPkvS/JnM0bSPAPfHsNkF9U5bgD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtHXDq/btsLz4QPkvS/JnM0bSPAPfHsNkF9U5bgD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtHXDq/btsLz4QPkvS/JnM0bSPAPfHsNkF9U5bgD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtHXDq%2FbtsLz4QPkvS%2FJnM0bSPAPfHsNkF9U5bgD0%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;500&quot; height=&quot;238&quot; data-origin-width=&quot;214&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735442047364&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 위의 코드를 더 간단하게 작성
        function addNum2(num1, num2){
            return num1 + num2;
        }
        document.write(&quot;두 수를 더한 값은 &quot; + addNum2(10,20));
    &amp;lt;/script&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;ES6부터 함수에서 매개변수를 선언할 때 기본값을 지정하는 기능도 생김&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735442307670&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 매개변수의 기본값 지정
        function multiple(a, b=5, c=10){
            return a * b * c;
        }
        console.log(multiple(5,10,20)); // a = 5, b = 10, c = 20
        console.log(multiple(10,20)); // a = 10, b = 20, c = 10(기본값)
        console.log(multiple(50)); // a = 50, b = 5(기본값), c = 10(기본값)
    &amp;lt;/script&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;214&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rrZ49/btsLBxcXzXF/l2acLgHPGUoN9kYeoGzIXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rrZ49/btsLBxcXzXF/l2acLgHPGUoN9kYeoGzIXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rrZ49/btsLBxcXzXF/l2acLgHPGUoN9kYeoGzIXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrrZ49%2FbtsLBxcXzXF%2Fl2acLgHPGUoN9kYeoGzIXK%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;214&quot; height=&quot;129&quot; data-origin-width=&quot;214&quot; data-origin-height=&quot;129&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;h3 data-ke-size=&quot;size23&quot;&gt;함수표현식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;익명함수&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;이름이 없는 함수, 익명 함수를 선언할 때는 이름을 붙이지 않음&lt;/li&gt;
&lt;li&gt;익명 함수 실행은 익명 함수는 함수 자체가 식이므로 함수를 변수에 할당할 수 있으며, 또한 다른 함수의 매개변수로 사용할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735443378243&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 익명 함수 선언하기
        function(a, b){
            return a + b;
        }
    &amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1735443504888&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 익명함수 실행
        var sum = function(a, b){
            return a + b;
        }
        document.write(&quot;익명 함수 실행 결과 : &quot; + sum(10,20));
    &amp;lt;/script&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;210&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhgCUt/btsLAhbiyKH/XkaRFf4mtJ2QC61ivNupbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhgCUt/btsLAhbiyKH/XkaRFf4mtJ2QC61ivNupbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhgCUt/btsLAhbiyKH/XkaRFf4mtJ2QC61ivNupbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhgCUt%2FbtsLAhbiyKH%2FXkaRFf4mtJ2QC61ivNupbK%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;500&quot; height=&quot;119&quot; data-origin-width=&quot;210&quot; data-origin-height=&quot;50&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;한 번만 실행하는 함수, 함수를 정의하면서 동시에 실행하는 함수를 즉시 실행함수&lt;/li&gt;
&lt;li&gt;함수를 실행하는 순간에 자바스크립트 해석기에서 함수를 해석&lt;/li&gt;
&lt;li&gt;즉시 실행 함수의 기본형식은 함수를 식 형태로 선언하므로 마지막에 세미콜론(;)을 붙임&lt;br /&gt;(function(){&lt;br /&gt;&amp;nbsp; &amp;nbsp; 명령;&lt;br /&gt;}());&lt;br /&gt;또는&lt;br /&gt;(function(매개변수){&lt;br /&gt;&amp;nbsp; &amp;nbsp; 명령;&lt;br /&gt;}(인수))&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735443885266&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 즉시 실행 함수
        (function(){
            var name = prompt(&quot;이름을 입력해주세요.&quot;);
            document.write(&quot;안녕하세요. &amp;lt;b&amp;gt;&quot; + name + &quot;&amp;lt;/b&amp;gt; 님&quot;);
        }());
    &amp;lt;/script&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;179&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/euUl0X/btsLAVr1XXR/6TPaOpS71ZbyTWBLFxjJZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/euUl0X/btsLAVr1XXR/6TPaOpS71ZbyTWBLFxjJZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/euUl0X/btsLAVr1XXR/6TPaOpS71ZbyTWBLFxjJZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeuUl0X%2FbtsLAVr1XXR%2F6TPaOpS71ZbyTWBLFxjJZ0%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;179&quot; height=&quot;41&quot; data-origin-width=&quot;179&quot; data-origin-height=&quot;41&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;매개변수를 사용하는 함수라면 선언 부분 끝에 함수 실행을 위한 인수를 넣어줌&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735444010359&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 매개변수가 있는 즉시 실행 함수
        (function(a,b){
            sum = a + b;
        }(100,200));
        document.write(&quot;함수 실행 결과 &quot; + sum);
    &amp;lt;/script&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;153&quot; data-origin-height=&quot;43&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDUxID/btsLB1EQYLh/0yh145qxdJbJP9uRuo1Zw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDUxID/btsLB1EQYLh/0yh145qxdJbJP9uRuo1Zw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDUxID/btsLB1EQYLh/0yh145qxdJbJP9uRuo1Zw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDUxID%2FbtsLB1EQYLh%2F0yh145qxdJbJP9uRuo1Zw0%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;153&quot; height=&quot;43&quot; data-origin-width=&quot;153&quot; data-origin-height=&quot;43&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;=&amp;gt; 표기법을 사용해 함수 선언을 좀 더 간단하게 작성할 수 있음&lt;br /&gt;(매개변수) =&amp;gt; {함수내용}&lt;/li&gt;
&lt;li&gt;매개변수가 없을 경우&lt;br /&gt;매개변수를 넣는 괄호 안을 비워둠&lt;br /&gt;중괄호 안에 함수 내용이 한 줄이라면 중괄호를 생략. 이때 return문은 생략된 것으로 간주&lt;/li&gt;
&lt;li&gt;매개변수가 1개인 경우&lt;br /&gt;매개변수의 괄호 생략 가능&lt;/li&gt;
&lt;li&gt;매개변수가 2개 이상인 경우&lt;br /&gt;(매개변수) =&amp;gt; {...} 처럼 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735444340377&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 매개변수가 없는 함수
        var hi = function(){
            return &quot;Hello World&quot;;
        }
    &amp;lt;/script&amp;gt;
    
    &amp;lt;script&amp;gt;
        // 매개변수가 없는 화살표 함수
        var hi = () =&amp;gt; {return &quot;Hello World&quot;};
    &amp;lt;/script&amp;gt;
    
    &amp;lt;script&amp;gt;
        // 매개변수가 없는 화살표 함수(중괄호 생략)
        var hi = () =&amp;gt; &quot;Hello World&quot;;
    &amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1735444535143&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 매개변수가 1개인 함수
        var hi = function(user){
            document.write(user + &quot;님 안녕하세요?&quot;);
        }
    &amp;lt;/script&amp;gt;

    &amp;lt;script&amp;gt;
        // 매개변수가 1개인 화살표 함수
        var hi = user =&amp;gt; {document.write(user + &quot;님 안녕하세요?&quot;)};
    &amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1735444589598&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 매개변수가 2개인 함수
        var sum = function(a, b){
            return a + b;
        }
    &amp;lt;/script&amp;gt;

    &amp;lt;script&amp;gt;
        // 매개변수가 2개인 화살표 함수
        var sum = (a,b) =&amp;gt; a + b;
    &amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이벤트와 이벤트 처리기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;웹 브라우저나 사용자가 행하는 어떤 동작&lt;/li&gt;
&lt;li&gt;웹 문서 영역 안에서 이루어지는 동작만을 이야기함&lt;/li&gt;
&lt;li&gt;마우스나 기보드를 사용할 때, 웹 문서를 불러올 때, 폼에 내용을 입력할 때 발생&lt;/li&gt;
&lt;li&gt;마우스 이벤트 : 마우스를 이용해서 버튼이나 휠 버튼을 조작할 때 발생&lt;br /&gt;click, dbclick, mousedown, mousemove,...&lt;/li&gt;
&lt;li&gt;키보드 이벤트 : 키보드에서 특정 키를 조작할 때 발생&lt;br /&gt;keydown, keypress, keyup,...&lt;/li&gt;
&lt;li&gt;문서 로딩 이벤트 : 서버에서 웹 문서를 가져오거나 문서를 위아래로 스크롤하는 등 웹 문서를 브라우저 창에 보여주는 것과 관련된 이벤트&lt;br /&gt;abort, error, load, resize,...&lt;/li&gt;
&lt;li&gt;폼 이벤트 : 폼 요소에 내용을 입력하면서 발생하는 이벤트&lt;br /&gt;blur, change, focus,...&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/ko/docs/Web&lt;/a&gt; 필요한 경우 찾아서 확인&lt;/li&gt;
&lt;/ul&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;이벤트가 발생하면 처리하는 함수&lt;/li&gt;
&lt;li&gt;이벤트 처리하는 기본적인 방법&lt;br /&gt;이벤트가 발생한 HTML 태그에 이벤트처리기를 직접 연결&lt;/li&gt;
&lt;li&gt;이벤트 처리기의 기본 형식&lt;br /&gt;HTML 태그 안에서 'on' 다음 '이벤트명'을 붙여 속성 이름 만들기&lt;br /&gt;&amp;rarr; 실행할 이벤트 처리기의 함수명을 작성&lt;br /&gt;&amp;lt;\태그 on이벤트명 = &quot;함수명&quot;&amp;gt;&lt;/li&gt;
&lt;li&gt;이벤트가 발생한 후 여러 가지 명령을 실행해야 한다면, 그 명령을 묶어 하나의 자바스크립트 함수로 만드는 것이 좋음. 이벤트가 발생할 때 함수 이름과 인수를 지정하여 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735445823395&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;이벤트 처리기&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
    a:link, a:visited {
	color:black;
	text-decoration: none;
}
ul {
	list-style: none;
	width:500px;
	margin:10px auto;
	padding:0;
}
li {
	display:inline-block;
	width:120px;
	border:1px solid #ccc;
	padding:10px 15px;	
	font-size:16px;
	text-align:center;
}
#result {
	width:500px;
	height:300px;
	margin:30px auto;
	border:2px solid #ccc;
	border-radius:15px;
}
p {
	width:80%;
	padding:10px;
	line-height: 2em;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;ul&amp;gt;
        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot; onclick=&quot;alert('Yellow 버튼을 클릭했습니다.')&quot;&amp;gt;Yellow&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot; onclick=&quot;alert('Green 버튼을 클릭했습니다.')&quot;&amp;gt;Green&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot; onclick=&quot;alert('Purple 버튼을 클릭했습니다.')&quot;&amp;gt;Purple&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
    &amp;lt;div id=&quot;result&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;519&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhqQIB/btsLBxcXUdU/mtB9kmHzeEO3L7RuQq0L21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhqQIB/btsLBxcXUdU/mtB9kmHzeEO3L7RuQq0L21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhqQIB/btsLBxcXUdU/mtB9kmHzeEO3L7RuQq0L21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhqQIB%2FbtsLBxcXUdU%2FmtB9kmHzeEO3L7RuQq0L21%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;519&quot; height=&quot;396&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735446008034&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;이벤트 처리기&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
    a:link, a:visited {
	color:black;
	text-decoration: none;
}
ul {
	list-style: none;
	width:500px;
	margin:10px auto;
	padding:0;
}
li {
	display:inline-block;
	width:120px;
	border:1px solid #ccc;
	padding:10px 15px;	
	font-size:16px;
	text-align:center;
}
#result {
	width:500px;
	height:300px;
	margin:30px auto;
	border:2px solid #ccc;
	border-radius:15px;
}
p {
	width:80%;
	padding:10px;
	line-height: 2em;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;ul&amp;gt;
        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot; onclick=&quot;changeBg('yellow')&quot;&amp;gt;Yellow&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot; onclick=&quot;changeBg('green')&quot;&amp;gt;Green&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot; onclick=&quot;changeBg('purple')&quot;&amp;gt;Purple&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
    &amp;lt;div id=&quot;result&quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;script&amp;gt;
        function changeBg(color){
            var result = document.querySelector(&quot;#result&quot;);
            result.style.backgroundColor = color;
        }
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;519&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bByuQQ/btsLzDeS6nO/sdlA9DpqZWzzPceCUYgMXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bByuQQ/btsLzDeS6nO/sdlA9DpqZWzzPceCUYgMXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bByuQQ/btsLzDeS6nO/sdlA9DpqZWzzPceCUYgMXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbByuQQ%2FbtsLzDeS6nO%2FsdlA9DpqZWzzPceCUYgMXk%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;519&quot; height=&quot;397&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;397&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;h3 data-ke-size=&quot;size23&quot;&gt;DOM을 이용한 이벤트 처리기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;DOM을 이용하여 이벤트 처리기를 지정하면 태그와 자바스크립트 소스를 분리해서 유지보수에 도움이 됨&lt;/li&gt;
&lt;li&gt;웹 요소를 클릭했을 때 실행할 함수를 연결하려면&lt;br /&gt;웹 요소.onclick = 함수;&lt;br /&gt;여기서 주의할 점은 함수의 이름만 사용하고 괄호는 붙이지 않아야함&lt;/li&gt;
&lt;li&gt;웹&amp;nbsp; 요소를 가져올 수 있는 방법 중 하나는 querySelector()를 사용&lt;br /&gt;괄호 안에는 클래스 이름, id, 다양한 선택자를 넣을 수 있음&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735446712182&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;DOM을 이용한 이벤트 처리기&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
a:link, a:visited {
	color:black;
	text-decoration: none;
}
ul {
	list-style: none;
	width:500px;
	margin:10px auto;
	padding:0;
}
li {
	display:inline-block;
	width:120px;
	border:1px solid #ccc;
	padding:10px 15px;	
	font-size:16px;
	text-align:center;
}
#result {
	width:500px;
	height:300px;
	margin:30px auto;
	border:2px solid #ccc;
	border-radius:15px;
}
p {
	width:80%;
	padding:10px;
	line-height: 2em;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;button id=&quot;change&quot;&amp;gt;글자색 바꾸기&amp;lt;/button&amp;gt;	
	&amp;lt;p&amp;gt;Reprehenderit tempor do quis sunt eu et exercitation deserunt. Laboris adipisicing est sint aliquip nulla pariatur velit irure elit qui id. Dolore aliquip dolore eu ut irure sint Lorem reprehenderit velit. Duis veniam irure cillum anim excepteur culpa pariatur sunt esse. Eu nulla commodo velit ex id dolore incididunt mollit incididunt nisi labore culpa qui ea. Commodo veniam veniam in ipsum ad minim occaecat qui pariatur adipisicing laborum quis.&amp;lt;/p&amp;gt;
	
	&amp;lt;script&amp;gt;
    // 방법 1: 웹 요소를 변수로 지정 &amp;amp; 미리 만든 함수 사용
    var changeBttn = document.querySelector(&quot;#change&quot;);
    changeBttn.onclick = changeColor;
    
		function changeColor() {
      document.querySelector(&quot;p&quot;).style.color = &quot;#f00&quot;;
    }
   
    // 방법 2: 웹 요소를 따로 변수로 만들지 않고 사용
    // document.querySelector(&quot;#change&quot;).onclick = changeColor;

		// function changeColor() {
    //   document.querySelector(&quot;p&quot;).style.color = &quot;#f00&quot;;
    // }
    
    // 방법 3: 직접 함수를 선언
    // document.querySelector(&quot;#change&quot;).onclick = function() {
    //   document.querySelector(&quot;p&quot;).style.color = &quot;#f00&quot;;
    // };
	&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QtLmQ/btsLBKciLd4/UfmaM2wK6wj1UtlxmPx8EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QtLmQ/btsLBKciLd4/UfmaM2wK6wj1UtlxmPx8EK/img.png&quot; data-origin-width=&quot;1534&quot; data-origin-height=&quot;162&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.6999%; margin-right: 10px;&quot; data-widthpercent=&quot;50.28&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QtLmQ/btsLBKciLd4/UfmaM2wK6wj1UtlxmPx8EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQtLmQ%2FbtsLBKciLd4%2FUfmaM2wK6wj1UtlxmPx8EK%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;1534&quot; height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uILZy/btsLzqM964s/hc8s0gh8oKBSs60wL0L1G0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uILZy/btsLzqM964s/hc8s0gh8oKBSs60wL0L1G0/img.png&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;163&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.1374%;&quot; data-widthpercent=&quot;49.72&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uILZy/btsLzqM964s/hc8s0gh8oKBSs60wL0L1G0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuILZy%2FbtsLzqM964s%2Fhc8s0gh8oKBSs60wL0L1G0%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;1526&quot; height=&quot;163&quot;/&gt;&lt;/span&gt;&lt;/div&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;</description>
      <category>organize/자바스트립트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/316</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-4#entry316comment</comments>
      <pubDate>Sun, 29 Dec 2024 13:33:14 +0900</pubDate>
    </item>
    <item>
      <title>스프링 웹 프로젝트 2</title>
      <link>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-2</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Oracle 11g Express Edition 설치 및 설정&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;설치에 앞서 왜 Oracle 11g인가?, 최신 버전의 Oracle은 안되는가? 라는 질문이 있을 수 있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 질문에 답은 최신 버전일수록 용량이 크고 메모리를 많이 차지함으로서 프로그램이 무겁다기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.oracle.com/database/technologies/xe-prior-release-downloads.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.oracle.com/database/technologies/xe-prior-release-downloads.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;Oracle Database를 설치하면서 가장 주의해야하는 부분은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 설치 폴더 한국어가 있을 경우 문제가 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;&lt;b&gt;System, SYS 계정의 패스워드를 지정하게 되는데, 이 패스워드는 매우매우 중요하기 때문에 반드시 기억&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;해둬야함!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;3. 설치 중 포트 번호(톰캣이 8080 포트를 사용해서 발생할 수 있음)&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;492&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kbr9X/btsLz3jXLiF/7bkefyGiEKla9D9MQxHEK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kbr9X/btsLz3jXLiF/7bkefyGiEKla9D9MQxHEK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kbr9X/btsLz3jXLiF/7bkefyGiEKla9D9MQxHEK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKbr9X%2FbtsLz3jXLiF%2F7bkefyGiEKla9D9MQxHEK1%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;500&quot; height=&quot;377&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호를 간단하게 &lt;u&gt;oracle11g&lt;/u&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;SQL Plus를 사용할 수 있지만 인터페이스가 편하지만은 않다. 따라서&amp;nbsp;무료 SQL Developer도 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.oracle.com/kr/database/sqldeveloper/technologies/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.oracle.com/kr/database/sqldeveloper/technologies/download/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QoIV5/btsLzptSqv1/v3V1w9PNRom2tFuXYCfdq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QoIV5/btsLzptSqv1/v3V1w9PNRom2tFuXYCfdq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QoIV5/btsLzptSqv1/v3V1w9PNRom2tFuXYCfdq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQoIV5%2FbtsLzptSqv1%2Fv3V1w9PNRom2tFuXYCfdq0%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;1387&quot; height=&quot;439&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL Developer의 경우 JDK가 포함된 버전과 그렇지 않은 버전이 있다. 관계는 없는데 환경변수가 잡혀져있으면 JDK가 포함되지 않은 것을 사용해도 됨. sql developer 버전을 20.2를 사용할 예정&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;sqldeveloper.exe를 실행하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbNiyO/btsLAyDzh9i/m0ifP6HdQNl779lzSl7kC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbNiyO/btsLAyDzh9i/m0ifP6HdQNl779lzSl7kC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbNiyO/btsLAyDzh9i/m0ifP6HdQNl779lzSl7kC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbNiyO%2FbtsLAyDzh9i%2Fm0ifP6HdQNl779lzSl7kC1%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;500&quot; height=&quot;349&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1703&quot; data-origin-height=&quot;910&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b23xBH/btsLBwyepix/4samPTBGk0R10dGvyrSsf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b23xBH/btsLBwyepix/4samPTBGk0R10dGvyrSsf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b23xBH/btsLBwyepix/4samPTBGk0R10dGvyrSsf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb23xBH%2FbtsLBwyepix%2F4samPTBGk0R10dGvyrSsf0%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;1703&quot; height=&quot;910&quot; data-origin-width=&quot;1703&quot; data-origin-height=&quot;910&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;759&quot; data-origin-height=&quot;487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz8egT/btsLAeZUqyB/DCIXODNP2hdY6svKfZB6Q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz8egT/btsLAeZUqyB/DCIXODNP2hdY6svKfZB6Q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz8egT/btsLAeZUqyB/DCIXODNP2hdY6svKfZB6Q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz8egT%2FbtsLAeZUqyB%2FDCIXODNP2hdY6svKfZB6Q1%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;500&quot; height=&quot;321&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호는 위에 Oracle을 설치할 때 패스워드 입력 후 테스트를 누르고 상태 성공인 것을 확인한 후 접속을 눌러줘야함&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;SYSTEM 계정은 사용하지 않음 따라서 사용할 계정을 만들어줘야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리에서 다음과 같이 함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1707&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uJghM/btsLyUAObTe/gmzitKi8wSfLVyDCSbUwm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uJghM/btsLyUAObTe/gmzitKi8wSfLVyDCSbUwm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uJghM/btsLyUAObTe/gmzitKi8wSfLVyDCSbUwm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuJghM%2FbtsLyUAObTe%2FgmzitKi8wSfLVyDCSbUwm0%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;1707&quot; height=&quot;914&quot; data-origin-width=&quot;1707&quot; data-origin-height=&quot;914&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ SYSTEM에 하위 항목에서 다른 사용자로 만들 경우 암호화가 되어 사용할 수 없음&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;이후 SYSTEM의 연결을 끊고 새 접속&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkZbrs/btsLBe5QWku/wonhtKRKwX3CVqojoVF211/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkZbrs/btsLBe5QWku/wonhtKRKwX3CVqojoVF211/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkZbrs/btsLBe5QWku/wonhtKRKwX3CVqojoVF211/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkZbrs%2FbtsLBe5QWku%2FwonhtKRKwX3CVqojoVF211%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;500&quot; height=&quot;321&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;485&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;Oracle이 8080포트를 사용 &amp;rarr; 변경 9090 포트로 변경&lt;/p&gt;
&lt;pre id=&quot;code_1735371242379&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;exec dbms_xdb.sethttpport(9090);&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;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JDBC 연결 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의할 점은 JDBC Driver, Oracle은 maven repository&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc6/11.2.0.4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc6/11.2.0.4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1859&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPzj7m/btsLASPARyR/0z5JuoYmcbtJyo4iuCEyD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPzj7m/btsLASPARyR/0z5JuoYmcbtJyo4iuCEyD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPzj7m/btsLASPARyR/0z5JuoYmcbtJyo4iuCEyD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPzj7m%2FbtsLASPARyR%2F0z5JuoYmcbtJyo4iuCEyD0%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;1859&quot; height=&quot;599&quot; data-origin-width=&quot;1859&quot; data-origin-height=&quot;599&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;JDBC 테스트 코드를 위해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src/test/java에서 패키지를 만들고 JDBCTests 클래스를 생성&lt;/p&gt;
&lt;pre id=&quot;code_1735371926575&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.persistence;

import org.junit.Test;

import lombok.extern.log4j.Log4j;

@Log4j
public class JDBCTests {

	@Test
	public void testConnection() throws Exception {
		
		Class clz = Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;);
		
		log.info(clz);
	}
	
}&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;1483&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lJWKl/btsLBj0d3we/iEtL4CiQIVwLYK7yrYK1Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lJWKl/btsLBj0d3we/iEtL4CiQIVwLYK7yrYK1Yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lJWKl/btsLBj0d3we/iEtL4CiQIVwLYK7yrYK1Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlJWKl%2FbtsLBj0d3we%2FiEtL4CiQIVwLYK7yrYK1Yk%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;1483&quot; height=&quot;765&quot; data-origin-width=&quot;1483&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드라이버 로딩에 문제가 없음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1489&quot; data-origin-height=&quot;782&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbTWnI/btsLArLqmgr/F3Kxc08MpqiCsp0M7xqsN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbTWnI/btsLArLqmgr/F3Kxc08MpqiCsp0M7xqsN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbTWnI/btsLArLqmgr/F3Kxc08MpqiCsp0M7xqsN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbTWnI%2FbtsLArLqmgr%2FF3Kxc08MpqiCsp0M7xqsN1%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;1489&quot; height=&quot;782&quot; data-origin-width=&quot;1489&quot; data-origin-height=&quot;782&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 했으면 DB연결에 문제가 없음&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Connection Pool(Hikair CP) 설정(매우 중요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DataSource 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB와 Connection을 맺고 끊은 작업은 리소스의 소모가 많은 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pooling 기법을 통해 객체를 미리 생성하고 빌려 쓰는 방식으로 이용해서 연결 시간을 단축&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Commons DBCP나 HikariCP 등을 활용&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;라이브러리 추가(pom.xml)&lt;/p&gt;
&lt;pre id=&quot;code_1735372312684&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		&amp;lt;!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;com.zaxxer&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;HikariCP&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;3.4.5&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&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;DataSource 설정(root-context.xml)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 DB 세팅과 같음 &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/brettwooldridge/HikariCP&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/brettwooldridge/HikariCP&lt;/a&gt;&amp;nbsp;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root-context.xml에&lt;/p&gt;
&lt;pre id=&quot;code_1735373078638&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
	xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd&quot;&amp;gt;
	
	&amp;lt;!-- Root Context: defines shared resources visible to all other web components --&amp;gt;
	
	&amp;lt;bean id=&quot;hikariConnfig&quot; class=&quot;com.zaxxer.hikari.HikariConfig&quot;&amp;gt;
		&amp;lt;property name=&quot;driverClassName&quot; value=&quot;oracle.jdbc.driver.OracleDriver&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;jdbcUrl&quot; value=&quot;jdbc:oracle:thin:@localhost:1521:XE&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;username&quot; value=&quot;book_ex&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;password&quot; value=&quot;book_ex&quot;&amp;gt;&amp;lt;/property&amp;gt;
	&amp;lt;/bean&amp;gt;
	
	&amp;lt;bean id=&quot;dateSource&quot; class=&quot;com.zaxxer.hikari.HikariDataSource&quot; destroy-method=&quot;close&quot;&amp;gt;
		&amp;lt;constructor-arg ref=&quot;hikariConnfig&quot; /&amp;gt;
	&amp;lt;/bean&amp;gt;
	
	&amp;lt;context:component-scan base-package=&quot;org.zerock.sample&quot;&amp;gt;&amp;lt;/context:component-scan&amp;gt;
		
&amp;lt;/beans&amp;gt;&lt;/code&gt;&lt;/pre&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;456&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJ7K2r/btsLzuojBSz/xDEmROjK7oNkrIChnk2BK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJ7K2r/btsLzuojBSz/xDEmROjK7oNkrIChnk2BK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJ7K2r/btsLzuojBSz/xDEmROjK7oNkrIChnk2BK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJ7K2r%2FbtsLzuojBSz%2FxDEmROjK7oNkrIChnk2BK0%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;500&quot; height=&quot;249&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;227&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;※언제 어노테이션으로 주입? 언제 xml 주입? &amp;rarr; 소스코드가 없으면 어노테이션을 걸지 못함&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;DataSource를 만듦으로서 테스트&lt;/p&gt;
&lt;pre id=&quot;code_1735373831535&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.persistence;

import java.sql.Connection;

import javax.sql.DataSource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;)
@Log4j
public class DataSourceTests {
	
	@Autowired
	private DataSource dataSource;
	
	@Test
	public void testConnection() {
		try(Connection connection = dataSource.getConnection()){
			log.info(connection);
		} catch(Exception e) {
			e.printStackTrace();
			log.error(e.getMessage());
		}
	}
}&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;1470&quot; data-origin-height=&quot;907&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d7QNkx/btsLzrLTOST/A2Kpg58YGjh7HXhibJVaiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d7QNkx/btsLzrLTOST/A2Kpg58YGjh7HXhibJVaiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d7QNkx/btsLzrLTOST/A2Kpg58YGjh7HXhibJVaiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd7QNkx%2FbtsLzrLTOST%2FA2Kpg58YGjh7HXhibJVaiK%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;1470&quot; height=&quot;907&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;907&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/315</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-2#entry315comment</comments>
      <pubDate>Sat, 28 Dec 2024 17:23:06 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트 3</title>
      <link>https://001cloudid.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-3</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동작해야 할 목적대로 묶은 명령을 함수(function)&lt;br /&gt;alert() 함수와 같이 자바스크립트에 미리 만들어 놓은 함수를 '내장 함수'라고 함&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;br /&gt;함수가 어떤 명령을 처리할지 미리 알려주는 것을 함수를 선언한다, 함수를 정의한다 라고 함&lt;/p&gt;
&lt;pre id=&quot;code_1735361826437&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
    funciont 함수명(){
        명령
    }
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수를 선언하는 것만으로 함수가 실행되지 않음. 함수를 선언한 후 따로 실행하는 코드를 작성해야함&lt;br /&gt;함수를 사용하는 것을 함수를 호출한다, 함수를 실행한다 라고 함&lt;/p&gt;
&lt;pre id=&quot;code_1735361851124&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    함수명([변수])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 선언과 실행 순서 : 웹 브라우저에서 자바스크립트 소스를 해석할 때 함수 선언 부분을 가장 먼저 해석. 원하는 어느 곳에 함수를 선언해 놓기만 하면 선언한 위치와 상관없이 함스를 실행할 수 있음&lt;/p&gt;
&lt;pre id=&quot;code_1735361170704&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;함수&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

    &amp;lt;script&amp;gt;
        alert(&quot;자바스크립트에서 미리 만들어 놓은 함수를 내장 함수라고 함&quot;)        
    &amp;lt;/script&amp;gt;

    &amp;lt;script&amp;gt;
        // 두 수를 더하는 함수 만들기
        function addNum(a, b) {
            var sum = a + b;
            alert(sum);
        }
    &amp;lt;/script&amp;gt;

    &amp;lt;script&amp;gt;
        // 함수를 사용하지 않고 두 수 더하기
        var num1 = 10;
        var num2 = 20;
        var sum2 = num1 + num2;
        alert(&quot;함수를 사용하지 않고 두 수 더하기 : &quot; + sum2);
    &amp;lt;/script&amp;gt;

    &amp;lt;script&amp;gt;
        // 함수를 사용해 두 수 더하기
        function addNum2() {
            var num3 = 2;
            var num4 = 3;
            var sum3 = num3 + num4;
            alert(&quot;함수를 사용해 두 수 더하기 : &quot; + sum3);
        }
    &amp;lt;/script&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;var&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스코프 : 변수가 적용되는 범위. 변수가 어디까지 유효한지 범위를 가리키는 영역&lt;br /&gt;지역 변수, 로컬 변수(local variable) : 한 함수 안에서만 사용할 수 있는 변수&lt;br /&gt;전역 변수, 글로벌 변수(global variable) : 스크립트 소스 전체에서 사용할 수 있는 변수&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;지역 변수를 선언할 때 사용하는 예약어 var&lt;/p&gt;
&lt;pre id=&quot;code_1735362016362&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // var 예약어로 지역 변수 선언하기
        function addNumber(){
            var sum = 10 + 20; // 지역 변수 선언
        }
        addNumber(); // 함수 호출
        console.log(sum);
    &amp;lt;/script&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;408&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tiu6T/btsLBuHpou4/YWuPPkdb0yq6db1mTEGtlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tiu6T/btsLBuHpou4/YWuPPkdb0yq6db1mTEGtlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tiu6T/btsLBuHpou4/YWuPPkdb0yq6db1mTEGtlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftiu6T%2FbtsLBuHpou4%2FYWuPPkdb0yq6db1mTEGtlK%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;500&quot; height=&quot;185&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;스크립트 안에서 자유롭게 쓸 수 있는 전역 변수 : 전역 변수를 선언할 때는 var 예약어를 붙이지 않음. 함수 안에 선언한 변수라도 var 예약어를 사용하지 않으면 됨&lt;/p&gt;
&lt;pre id=&quot;code_1735362194464&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // var 예약어를 사용한 지역 변수와 전역 변수
        function addNumber2(){
            var sum = 10 + 20;
            multi = 10 * 20;
        }
        addNumber2();
        console.log(multi);
    &amp;lt;/script&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;297&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbTBJn/btsLAigNOpq/I5SZvsbJcpUDO0HM5AwV2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbTBJn/btsLAigNOpq/I5SZvsbJcpUDO0HM5AwV2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbTBJn/btsLAigNOpq/I5SZvsbJcpUDO0HM5AwV2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbTBJn%2FbtsLAigNOpq%2FI5SZvsbJcpUDO0HM5AwV2K%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;500&quot; height=&quot;285&quot; data-origin-width=&quot;297&quot; data-origin-height=&quot;169&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;var와 호이스팅&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호이스팅은 상황에 따라 변수의 선언과 할당을 분리해서 선언 부분을 스코프의 가장 위쪽으로 끌어올리는 것&lt;/p&gt;
&lt;pre id=&quot;code_1735362468302&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        var x = 10;

        function hoistingEx(){
            console.log(&quot;x = &quot;+x);
            console.log(&quot;y = &quot;+y);
            var y = 20;
        }
        hoistingEx();
    &amp;lt;/script&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;267&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ycUVv/btsLzFjqrok/9bpIrVITXeR3fh446gAN01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ycUVv/btsLzFjqrok/9bpIrVITXeR3fh446gAN01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ycUVv/btsLzFjqrok/9bpIrVITXeR3fh446gAN01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FycUVv%2FbtsLzFjqrok%2F9bpIrVITXeR3fh446gAN01%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;500&quot; height=&quot;206&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ undefined는 변수가 선언되었지만 아직 값이 할당되지 않은 상태일 때의 자료형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 해석기는 함수 소스를 훑어보면서 var를 사용한 변수는 따로 기억해둠. 즉, 변수를 실행하기 전이지만 어떤 변수가 있는지를 기억해 두기 때문에 선언한 것과 같은 효과가 있는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드가 실제 코드라면 자바 스크립트 해석기가 인식하는 코드는&lt;/p&gt;
&lt;pre id=&quot;code_1735362626757&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        var x = 10;

        function hoistingEx(){
        	var y;
            console.log(&quot;x = &quot;+x);
            console.log(&quot;y = &quot;+y);
            y = 20;
        }
        hoistingEx();
    &amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var를 사용한 변수는 재선언과 재할당이 가능함&lt;/p&gt;
&lt;pre id=&quot;code_1735362905678&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // var 예약어를 사용한 변수의 재할당과 재선언
        function addNumber(num1, num2){
            return num1 + num2;
        }
        var sum = addNumber(10, 20);
        console.log(sum); // 30
        sum = 50; // 변수 재할당
        console.log(sum); // 50 
        var sum = 100; // 변수 재선언
        console.log(sum); // 100 
    &amp;lt;/script&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;273&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7lWfZ/btsLzqe5Yjb/rQtcxbbObXyybE61OdcPLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7lWfZ/btsLzqe5Yjb/rQtcxbbObXyybE61OdcPLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7lWfZ/btsLzqe5Yjb/rQtcxbbObXyybE61OdcPLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7lWfZ%2FbtsLzqe5Yjb%2FrQtcxbbObXyybE61OdcPLK%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;500&quot; height=&quot;216&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;118&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;h3 data-ke-size=&quot;size23&quot;&gt;let과 const의 등장&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var 예약어를 사용하는 변수는 함수 영역의 스코프를 가지고, 재할당과 재선언이 가능함. 이는 프로그램 오류를 발생시킬 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var 예약어를 빠뜨리면 의도하지 않게 전역 변수가 되기도 하고, 변수를 재선언하거나 값을 재할당해 버리는 경우가 생김.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문제를 해결하기 위해 let, const가 추가되었고, var 예약어는 사용하지 않을 것이 권장됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var, let, const의 가장 큰 차이는 스코프의 범위인데 var는 함수 영역의 스코프를 가지며, let과 const는 블록 영역의 스코프를 가짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;let&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;let으로 선언한 변수는 변수를 선언한 블록에서만 유효&lt;/p&gt;
&lt;pre id=&quot;code_1735363764161&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 블록 변수 선언
        function calcSum(n){
            let sum = 0;
            for(let i = 1; i &amp;lt; n + 1; i++){
                sum += i;
            }
            console.log(sum);
        }
        calcSum(10);
    &amp;lt;/script&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;366&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbnTA6/btsLAYoGJCN/wxngRcTbs5wqGi7RmleLlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbnTA6/btsLAYoGJCN/wxngRcTbs5wqGi7RmleLlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbnTA6/btsLAYoGJCN/wxngRcTbs5wqGi7RmleLlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbnTA6%2FbtsLAYoGJCN%2FwxngRcTbs5wqGi7RmleLlK%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;500&quot; height=&quot;199&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;146&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;전역 변수를 선언하고 싶다면 let 예약어를 쓰지 않고 변수 이름과 초깃값만 할당하면 됨&lt;/p&gt;
&lt;pre id=&quot;code_1735363892047&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 전역 변수 선언하기
        function caclSum1(n){
            sum = 0;
            for(let i = 0; i &amp;lt;= n; i++){
                sum += i;
            }
        }
        caclSum1(10);
        console.log(sum);
    &amp;lt;/script&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;386&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zw0Lu/btsLzEEILtj/gWEReep8MX5PPLAjpIEMv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zw0Lu/btsLzEEILtj/gWEReep8MX5PPLAjpIEMv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zw0Lu/btsLzEEILtj/gWEReep8MX5PPLAjpIEMv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZw0Lu%2FbtsLzEEILtj%2FgWEReep8MX5PPLAjpIEMv1%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;500&quot; height=&quot;179&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;138&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;let예약어를 사용하여 선언한 변수는 값을 재할당할 수 있지만 변수를 재선언할 수 없음&lt;/p&gt;
&lt;pre id=&quot;code_1735364007936&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 블록 변수의 재할당
        function calcSum2(n){
            let sum = 0;
            for(let i = 0; i &amp;lt;= n; i++){
                sum += i;
            }
            sum = 10; // sum 변수 재할당
            console.log(sum);
        }
        calcSum2(10);
    &amp;lt;/script&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;293&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbZfcx/btsLA7lsOch/HFFsb9nlmyNI35HpZ1Qv40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbZfcx/btsLA7lsOch/HFFsb9nlmyNI35HpZ1Qv40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbZfcx/btsLA7lsOch/HFFsb9nlmyNI35HpZ1Qv40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbZfcx%2FbtsLA7lsOch%2FHFFsb9nlmyNI35HpZ1Qv40%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;500&quot; height=&quot;213&quot; data-origin-width=&quot;293&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735364139919&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 재선언할 수 없는 let 변수
        function caclSum3(n){
            let sum = 0;
            for(let i = 0; i &amp;lt;= n; i++){
                    sum += i;
                }
            let sum;
            console.log(sum);

        }
        calcSum3(10);
    &amp;lt;/script&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;576&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGUAEe/btsLyw1fmWe/KZHHVD19q6GTRMAnMbLH5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGUAEe/btsLyw1fmWe/KZHHVD19q6GTRMAnMbLH5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGUAEe/btsLyw1fmWe/KZHHVD19q6GTRMAnMbLH5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGUAEe%2FbtsLyw1fmWe%2FKZHHVD19q6GTRMAnMbLH5K%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;500&quot; height=&quot;215&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;let 예약어는 같은 변수 이름을 중복해서 사용할 수 없음&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;let 예약어를 사용한 변수는 선언하기 전에 사용할 경우 오류메시지를 나타냄&lt;/p&gt;
&lt;pre id=&quot;code_1735364384580&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        var x = 10;
        function dispalyNum(){
            console.log(&quot;x = &quot; + x);
            console.log(&quot;y = &quot; + y); // 선언되지 않은 y를 사용
            let y = 20; // y 변수 선언
        }
    &amp;lt;/script&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;934&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m3wA0/btsLzButqzs/8UCvLED98VKCKUZQYzuAhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m3wA0/btsLzButqzs/8UCvLED98VKCKUZQYzuAhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m3wA0/btsLzButqzs/8UCvLED98VKCKUZQYzuAhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm3wA0%2FbtsLzButqzs%2F8UCvLED98VKCKUZQYzuAhk%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;500&quot; height=&quot;99&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;184&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;h3 data-ke-size=&quot;size23&quot;&gt;const&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;const로 선언한 변수는 상수 변수(constant variable)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상수는 프로그램 안에서 변하지 않는 값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램 안에서 특정한 상숫값을 자주 사용한다면 변수에 담아서 사용하는 것이 변리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재선언, 재할당 할 수 없음&lt;/p&gt;
&lt;pre id=&quot;code_1735364768431&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 재선언할 수 없는 const 변수
        const currentYear = 2024;
        console.log(currentYear);
        const currentYear;
    &amp;lt;/script&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;599&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biSewI/btsLz01EfAk/6h9sH8szVQg8WypTotdzJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biSewI/btsLz01EfAk/6h9sH8szVQg8WypTotdzJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biSewI/btsLz01EfAk/6h9sH8szVQg8WypTotdzJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiSewI%2FbtsLz01EfAk%2F6h9sH8szVQg8WypTotdzJ0%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;500&quot; height=&quot;122&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735364854993&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;
        // 재할당할 수 없는 const 변수
        const currentYear2 = 2024;
        console.log(currentYear2);
        currentYear2 = 2025;
        console.log(currentYear2);
    &amp;lt;/script&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;462&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c25wzd/btsLByJzKBJ/kjE5g2pbpiSKQEEkITJtAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c25wzd/btsLByJzKBJ/kjE5g2pbpiSKQEEkITJtAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c25wzd/btsLByJzKBJ/kjE5g2pbpiSKQEEkITJtAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc25wzd%2FbtsLByJzKBJ%2FkjE5g2pbpiSKQEEkITJtAK%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;500&quot; height=&quot;189&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;175&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;따라서 변수 때문에 생기는 오류를 줄이려면 let과 const를 사용하는 것이 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값이 자주 바뀌는 변수라면 let을, 재할당이 없는 변수라면 const 예약어를 사용&lt;/p&gt;</description>
      <category>organize/자바스트립트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/314</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-3#entry314comment</comments>
      <pubDate>Sat, 28 Dec 2024 14:49:59 +0900</pubDate>
    </item>
    <item>
      <title>스프링 웹 프로젝트 1</title>
      <link>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-1</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;793&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjxOI1/btsLzC0qPYK/1LpHFXaJFUFxdLIS0pC0I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjxOI1/btsLzC0qPYK/1LpHFXaJFUFxdLIS0pC0I1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjxOI1/btsLzC0qPYK/1LpHFXaJFUFxdLIS0pC0I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjxOI1%2FbtsLzC0qPYK%2F1LpHFXaJFUFxdLIS0pC0I1%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;500&quot; height=&quot;544&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;793&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트에서 패키지명을 대문자로 작성하면 안됨. 그 이유로는&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;자바의 공식 네이밍 규약&lt;br /&gt;자바의 패키지명은 반드시 소문자로 작성해야함&lt;/li&gt;
&lt;li&gt;운영 체제에서의 문제&lt;br /&gt;일부 운영 체제에서는 파일 시스템이 대소문자를 구분(리눅스나 맥OS는 대소문자를 구분하지만, 윈도우는 대소문자를 구분하지 않음)&lt;br /&gt;패키지명을 대문자로 시작하면 프로젝트가 다양한 운영 체제에서 실행될 때 호환성 문제가 발생할 수 있음. 이로 인해 애플리케이션의 배포 및 실행에 문제가 발생할 가능성이 커짐&lt;/li&gt;
&lt;li&gt;URL 경로에서 대소문자 구분 문제&lt;/li&gt;
&lt;li&gt;자바 클래스명과 패키지명 구분&lt;/li&gt;
&lt;li&gt;호환성 및 표준화&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lombok&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;프로젝트를 실행하면 home.jsp가 켜지면서 Console에는 다양한 로그 정보가 찍힘.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 HomeController에 현재 객체를 참조하는 키워드인 this를 찍어내면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;this.toString()을 호출. 오버라이드 하지 않았다면 Object.toString()의 기본 구현인 객체의 클래스명과 해시코드를 포함하는 문자열을 반환할 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1735274333682&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.controller;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {
	
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	/**
	 * Simply selects the home view to render by returning its name.
	 */
	@RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
		logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);
		
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
		
		String formattedDate = dateFormat.format(date);
		
		model.addAttribute(&quot;serverTime&quot;, formattedDate );
		
		System.out.println(this);
		
		return &quot;home&quot;;
	}
	
}&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;886&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sD6yd/btsLx5bgCXt/ZoL8CrTH23pGH9Thetyy51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sD6yd/btsLx5bgCXt/ZoL8CrTH23pGH9Thetyy51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sD6yd/btsLx5bgCXt/ZoL8CrTH23pGH9Thetyy51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsD6yd%2FbtsLx5bgCXt%2FZoL8CrTH23pGH9Thetyy51%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;886&quot; height=&quot;138&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;138&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;이를 lombok을 이용해서 getter/setter, toString(), 생성자 등을 자동으로 생성해주게 끔 설치 및 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://projectlombok.org/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://projectlombok.org/download&lt;/a&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;764&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JaQe2/btsLATmIVLS/x4rymoQSKLvu5T3XXaK8tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JaQe2/btsLATmIVLS/x4rymoQSKLvu5T3XXaK8tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JaQe2/btsLATmIVLS/x4rymoQSKLvu5T3XXaK8tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJaQe2%2FbtsLATmIVLS%2Fx4rymoQSKLvu5T3XXaK8tk%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;500&quot; height=&quot;55&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일을 열면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AGzMf/btsLxDF1nsD/NGyATOrLkcburNH9jLCJek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AGzMf/btsLxDF1nsD/NGyATOrLkcburNH9jLCJek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AGzMf/btsLxDF1nsD/NGyATOrLkcburNH9jLCJek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAGzMf%2FbtsLxDF1nsD%2FNGyATOrLkcburNH9jLCJek%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;500&quot; height=&quot;695&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 뜰 경우에는 cmd창에서 설치&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sdoV7/btsLxM34ZgR/2VSuBzMr7mTAtfUgmegXa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sdoV7/btsLxM34ZgR/2VSuBzMr7mTAtfUgmegXa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sdoV7/btsLxM34ZgR/2VSuBzMr7mTAtfUgmegXa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsdoV7%2FbtsLxM34ZgR%2F2VSuBzMr7mTAtfUgmegXa1%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;500&quot; height=&quot;99&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운받은 디렉토리로 이동 후 명령어 작성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mll30/btsLx5CkFhE/nOICagaMkAplNVo556Q3a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mll30/btsLx5CkFhE/nOICagaMkAplNVo556Q3a0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mll30/btsLx5CkFhE/nOICagaMkAplNVo556Q3a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMll30%2FbtsLx5CkFhE%2FnOICagaMkAplNVo556Q3a0%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;500&quot; height=&quot;290&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기다리면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yx9J6/btsLzBmWEu1/78N313Z9SpL8SoLXyBgcdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yx9J6/btsLzBmWEu1/78N313Z9SpL8SoLXyBgcdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yx9J6/btsLzBmWEu1/78N313Z9SpL8SoLXyBgcdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyx9J6%2FbtsLzBmWEu1%2F78N313Z9SpL8SoLXyBgcdk%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;500&quot; height=&quot;193&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동으로 찾아주면 Install/Update -&amp;gt; Quit Installer&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;잘 설치되었는지 확인하려면, STS에 lombok.jar 파일이 생기고, STS.ini를 열어보면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JMOhM/btsLz6msv6P/K52guD76EjswqJoOVgj6f0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JMOhM/btsLz6msv6P/K52guD76EjswqJoOVgj6f0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JMOhM/btsLz6msv6P/K52guD76EjswqJoOVgj6f0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJMOhM%2FbtsLz6msv6P%2FK52guD76EjswqJoOVgj6f0%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;500&quot; height=&quot;328&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;지금까지는 개발도구에 세팅을 했고, 프로젝트에서는 사용할 수없음. 사용하려면 pom.xml에 lombok 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mvnrepository.com/artifact/org.projectlombok/lombok&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://mvnrepository.com/artifact/org.projectlombok/lombok&lt;/a&gt; 아까 다운 받은 버전과 같은 것을 복사한 후 pom.xml에 추&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HomeController에 @Controller 어노테이션 및에 @ToString 어노테이션을 추가하고 import하면 아래와 같이 됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWhDfp/btsLyvtWBLz/EG1KFSXaQO0WsAjgSEMmR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWhDfp/btsLyvtWBLz/EG1KFSXaQO0WsAjgSEMmR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWhDfp/btsLyvtWBLz/EG1KFSXaQO0WsAjgSEMmR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWhDfp%2FbtsLyvtWBLz%2FEG1KFSXaQO0WsAjgSEMmR1%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;500&quot; height=&quot;288&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 프로젝트를 실행하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1piwK/btsLAWjq4Aw/kBnWnEY0GLDxLQk4OkRG50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1piwK/btsLAWjq4Aw/kBnWnEY0GLDxLQk4OkRG50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1piwK/btsLAWjq4Aw/kBnWnEY0GLDxLQk4OkRG50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1piwK%2FbtsLAWjq4Aw%2FkBnWnEY0GLDxLQk4OkRG50%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;880&quot; height=&quot;140&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의존성 주입 : 스프링을 이용하는 환경에서 각각의 객체를 생성하고 이를 스프링의 설정을 통해서 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링에서 객체를 만들면 이를 사용하기 위해서 bean을 추가해줘야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 어떤 것을 bean으로 추가해주고, 어떤 것을 bean으로 추가할 필요가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 기준은 무엇일까? 바로&amp;nbsp;&lt;u&gt;&lt;b&gt;오래 살아남아야하고 오래 일을 해야하는 것을 bean으로 추가&lt;/b&gt;&lt;/u&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;bean으로 등록하는 방법은? XML 또는 어노테이션을 이용하는 방법이 있다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. @Component 어노테이션 추가&lt;/p&gt;
&lt;pre id=&quot;code_1735276228244&quot; class=&quot;css&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;package org.zerock.sample;

import org.springframework.stereotype.Component;

@Component
public class Chef {

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. root-context.xml에서 Namespaces context 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M7fPr/btsLAVx7G3O/FoknttsQ48ZTh5ubwoR880/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M7fPr/btsLAVx7G3O/FoknttsQ48ZTh5ubwoR880/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M7fPr/btsLAVx7G3O/FoknttsQ48ZTh5ubwoR880/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM7fPr%2FbtsLAVx7G3O%2FFoknttsQ48ZTh5ubwoR880%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;500&quot; height=&quot;395&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Source에서 context:component-scan 태그 추가&lt;/p&gt;
&lt;pre id=&quot;code_1735276270986&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
	xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd&quot;&amp;gt;
	
	&amp;lt;!-- Root Context: defines shared resources visible to all other web components --&amp;gt;
	
	&amp;lt;context:component-scan base-package=&quot;org.zerock.sample&quot;&amp;gt;&amp;lt;/context:component-scan&amp;gt;
	
		
&amp;lt;/beans&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;lombok 이용하기 위해 Chef 클래스에 @Data 어노테이션 추가. 추가하면 자동으로 equals(), hashCode(), toString()이 상속됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/niB2q/btsLA42LXK1/sihrWhcfxSlKhxX9dlxQR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/niB2q/btsLA42LXK1/sihrWhcfxSlKhxX9dlxQR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/niB2q/btsLA42LXK1/sihrWhcfxSlKhxX9dlxQR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FniB2q%2FbtsLA42LXK1%2FsihrWhcfxSlKhxX9dlxQR1%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;500&quot; height=&quot;140&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ Chef.java 파일의 아이콘을 보면 S가 붙어 있는데 이는 '스프링이 빈으로 관리한다'라고 생각하면 됨&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;Restaurant(Chef 클래스를 이용하는 클래스)&lt;/p&gt;
&lt;pre id=&quot;code_1735276541114&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.sample;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import lombok.ToString;

@Component
@ToString
public class Restaurant {
	
	@Autowired
	private Chef chef;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pom.xml에서&lt;/p&gt;
&lt;pre id=&quot;code_1735276677823&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;			&amp;lt;exclusions&amp;gt;
				&amp;lt;exclusion&amp;gt;
					&amp;lt;groupId&amp;gt;javax.mail&amp;lt;/groupId&amp;gt;
					&amp;lt;artifactId&amp;gt;mail&amp;lt;/artifactId&amp;gt;
				&amp;lt;/exclusion&amp;gt;
				&amp;lt;exclusion&amp;gt;
					&amp;lt;groupId&amp;gt;javax.jms&amp;lt;/groupId&amp;gt;
					&amp;lt;artifactId&amp;gt;jms&amp;lt;/artifactId&amp;gt;
				&amp;lt;/exclusion&amp;gt;
				&amp;lt;exclusion&amp;gt;
					&amp;lt;groupId&amp;gt;com.sun.jdmk&amp;lt;/groupId&amp;gt;
					&amp;lt;artifactId&amp;gt;jmxtools&amp;lt;/artifactId&amp;gt;
				&amp;lt;/exclusion&amp;gt;
				&amp;lt;exclusion&amp;gt;
					&amp;lt;groupId&amp;gt;com.sun.jmx&amp;lt;/groupId&amp;gt;
					&amp;lt;artifactId&amp;gt;jmxri&amp;lt;/artifactId&amp;gt;
				&amp;lt;/exclusion&amp;gt;
			&amp;lt;/exclusions&amp;gt;
			&amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+&amp;nbsp;log4j&amp;nbsp;버전&amp;nbsp;1.2.17로&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;/p&gt;
&lt;pre id=&quot;code_1735277031562&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;
	&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
	&amp;lt;groupId&amp;gt;org.zerock&amp;lt;/groupId&amp;gt;
	&amp;lt;artifactId&amp;gt;controller&amp;lt;/artifactId&amp;gt;
	&amp;lt;name&amp;gt;ex00&amp;lt;/name&amp;gt;
	&amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;
	&amp;lt;version&amp;gt;1.0.0-BUILD-SNAPSHOT&amp;lt;/version&amp;gt;
	&amp;lt;properties&amp;gt;
		&amp;lt;java-version&amp;gt;1.6&amp;lt;/java-version&amp;gt;
		&amp;lt;org.springframework-version&amp;gt;5.2.7.RELEASE&amp;lt;/org.springframework-version&amp;gt;
		&amp;lt;org.aspectj-version&amp;gt;1.6.10&amp;lt;/org.aspectj-version&amp;gt;
		&amp;lt;org.slf4j-version&amp;gt;1.6.6&amp;lt;/org.slf4j-version&amp;gt;
	&amp;lt;/properties&amp;gt;
	&amp;lt;dependencies&amp;gt;
		&amp;lt;!-- Spring --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
			&amp;lt;exclusions&amp;gt;
				&amp;lt;!-- Exclude Commons Logging in favor of SLF4j --&amp;gt;
				&amp;lt;exclusion&amp;gt;
					&amp;lt;groupId&amp;gt;commons-logging&amp;lt;/groupId&amp;gt;
					&amp;lt;artifactId&amp;gt;commons-logging&amp;lt;/artifactId&amp;gt;
				&amp;lt;/exclusion&amp;gt;
			&amp;lt;/exclusions&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-test&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;1.18.36&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- AspectJ --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.aspectj&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;aspectjrt&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.aspectj-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- Logging --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.slf4j-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;jcl-over-slf4j&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.slf4j-version}&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.slf4j-version}&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;log4j&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;log4j&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;1.2.17&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- @Inject --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;javax.inject&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;javax.inject&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;1&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- Servlet --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;servlet-api&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;2.5&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;javax.servlet.jsp&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;jsp-api&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;2.1&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;jstl&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;1.2&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- Test --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;4.7&amp;lt;/version&amp;gt;
			&amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;
	&amp;lt;/dependencies&amp;gt;
	&amp;lt;build&amp;gt;
		&amp;lt;plugins&amp;gt;
			&amp;lt;plugin&amp;gt;
				&amp;lt;artifactId&amp;gt;maven-eclipse-plugin&amp;lt;/artifactId&amp;gt;
				&amp;lt;version&amp;gt;2.9&amp;lt;/version&amp;gt;
				&amp;lt;configuration&amp;gt;
					&amp;lt;additionalProjectnatures&amp;gt;
						&amp;lt;projectnature&amp;gt;org.springframework.ide.eclipse.core.springnature&amp;lt;/projectnature&amp;gt;
					&amp;lt;/additionalProjectnatures&amp;gt;
					&amp;lt;additionalBuildcommands&amp;gt;
						&amp;lt;buildcommand&amp;gt;org.springframework.ide.eclipse.core.springbuilder&amp;lt;/buildcommand&amp;gt;
					&amp;lt;/additionalBuildcommands&amp;gt;
					&amp;lt;downloadSources&amp;gt;true&amp;lt;/downloadSources&amp;gt;
					&amp;lt;downloadJavadocs&amp;gt;true&amp;lt;/downloadJavadocs&amp;gt;
				&amp;lt;/configuration&amp;gt;
			&amp;lt;/plugin&amp;gt;
			&amp;lt;plugin&amp;gt;
				&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
				&amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
				&amp;lt;version&amp;gt;2.5.1&amp;lt;/version&amp;gt;
				&amp;lt;configuration&amp;gt;
					&amp;lt;source&amp;gt;1.8&amp;lt;/source&amp;gt;
					&amp;lt;target&amp;gt;1.8&amp;lt;/target&amp;gt;
					&amp;lt;compilerArgument&amp;gt;-Xlint:all&amp;lt;/compilerArgument&amp;gt;
					&amp;lt;showWarnings&amp;gt;true&amp;lt;/showWarnings&amp;gt;
					&amp;lt;showDeprecation&amp;gt;true&amp;lt;/showDeprecation&amp;gt;
				&amp;lt;/configuration&amp;gt;
			&amp;lt;/plugin&amp;gt;
			&amp;lt;plugin&amp;gt;
				&amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
				&amp;lt;artifactId&amp;gt;exec-maven-plugin&amp;lt;/artifactId&amp;gt;
				&amp;lt;version&amp;gt;1.2.1&amp;lt;/version&amp;gt;
				&amp;lt;configuration&amp;gt;
					&amp;lt;mainClass&amp;gt;org.test.int1.Main&amp;lt;/mainClass&amp;gt;
				&amp;lt;/configuration&amp;gt;
			&amp;lt;/plugin&amp;gt;
		&amp;lt;/plugins&amp;gt;
	&amp;lt;/build&amp;gt;
&amp;lt;/project&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;rarr; 경로는 src/test/java안에 패키지 만들기&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;203&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOG3RA/btsLx8lF74o/whKE9210f3sKbY0YmTVAg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOG3RA/btsLx8lF74o/whKE9210f3sKbY0YmTVAg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOG3RA/btsLx8lF74o/whKE9210f3sKbY0YmTVAg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOG3RA%2FbtsLx8lF74o%2FwhKE9210f3sKbY0YmTVAg1%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;500&quot; height=&quot;190&quot; data-origin-width=&quot;203&quot; data-origin-height=&quot;77&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735277161364&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.sample;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;) // 오타 나기 쉬움
@Log4j
public class SampleTests {

	@Test
	public void test1() {
		System.out.println(&quot;test1()&quot;);
		log.info(&quot;test1()&quot;);
	}
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TXZfi/btsLzqlASpW/eDcqGwhAgeenKNZ0KxwFT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TXZfi/btsLzqlASpW/eDcqGwhAgeenKNZ0KxwFT1/img.png&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;838&quot; data-is-animation=&quot;false&quot; width=&quot;500&quot; height=&quot;660&quot; style=&quot;width: 20.481%; margin-right: 10px;&quot; data-widthpercent=&quot;20.72&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TXZfi/btsLzqlASpW/eDcqGwhAgeenKNZ0KxwFT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTXZfi%2FbtsLzqlASpW%2FeDcqGwhAgeenKNZ0KxwFT1%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;635&quot; height=&quot;838&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckHIch/btsLx2Tkcmp/mOOX6CDkK45W2zKeta5Zmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckHIch/btsLx2Tkcmp/mOOX6CDkK45W2zKeta5Zmk/img.png&quot; data-origin-width=&quot;1493&quot; data-origin-height=&quot;515&quot; data-is-animation=&quot;false&quot; width=&quot;500&quot; height=&quot;172&quot; style=&quot;width: 78.3562%;&quot; data-widthpercent=&quot;79.28&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckHIch/btsLx2Tkcmp/mOOX6CDkK45W2zKeta5Zmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckHIch%2FbtsLx2Tkcmp%2FmOOX6CDkK45W2zKeta5Zmk%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;1493&quot; height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결방법은 &lt;a href=&quot;https://developer-syubrofo.tistory.com/41&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer-syubrofo.tistory.com/41&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuxaSF/btsLAwk11Kn/lQcJnnXIHs4Obkw7yFw4Hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuxaSF/btsLAwk11Kn/lQcJnnXIHs4Obkw7yFw4Hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuxaSF/btsLAwk11Kn/lQcJnnXIHs4Obkw7yFw4Hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuxaSF%2FbtsLAwk11Kn%2FlQcJnnXIHs4Obkw7yFw4Hk%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;1482&quot; height=&quot;714&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;714&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;pre id=&quot;code_1735281423659&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.sample;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&quot;file:src/main/webapp/WEB-INF/spring/root-context.xml&quot;) // 오타 나기 쉬움
@Log4j
public class SampleTests {

	@Autowired
	private Restaurant restaurant; // 주입을 받아야함
	
	@Test
	public void test1() {
		System.out.println(&quot;SampleTests test1()&quot;);
		log.info(&quot;Log.info test1()&quot;);
		log.info(restaurant);
	}
	
	
}&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;1481&quot; data-origin-height=&quot;814&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WV9er/btsLz5uQ8dt/5t89CPA1ukAbUxTD4K1Prk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WV9er/btsLz5uQ8dt/5t89CPA1ukAbUxTD4K1Prk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WV9er/btsLz5uQ8dt/5t89CPA1ukAbUxTD4K1Prk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWV9er%2FbtsLz5uQ8dt%2F5t89CPA1ukAbUxTD4K1Prk%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;1481&quot; height=&quot;814&quot; data-origin-width=&quot;1481&quot; data-origin-height=&quot;814&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735281482581&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.sample;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import lombok.ToString;

@Component
@ToString
public class Restaurant {
	
	@Autowired
	private Chef chef;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Restaurant은 만든 것이 없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 스프링 프레임워크 : 필요한 것 -&amp;gt; 선언 -&amp;gt; 어노테이션, 설정 -&amp;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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 필드 주입&lt;/p&gt;
&lt;pre id=&quot;code_1735283438496&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.sample;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import lombok.ToString;

@Component
@ToString
public class Restaurant {

	@Autowired
	private Chef chef;

}&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;1470&quot; data-origin-height=&quot;818&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ISjaK/btsLz672LXP/uKN4zCBkut6LCBMdbuANo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ISjaK/btsLz672LXP/uKN4zCBkut6LCBMdbuANo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ISjaK/btsLz672LXP/uKN4zCBkut6LCBMdbuANo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FISjaK%2FbtsLz672LXP%2FuKN4zCBkut6LCBMdbuANo0%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;1470&quot; height=&quot;818&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;818&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;2. Setter 주입&lt;/p&gt;
&lt;pre id=&quot;code_1735283518933&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.sample;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import lombok.Setter;
import lombok.ToString;

@Component
@ToString
public class Restaurant {

	@Setter(onMethod_ = {@Autowired})
	private Chef chef;

}&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;1462&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgPeiE/btsLAS9qzSb/G1gkH1x7cwJiGO9l37xgRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgPeiE/btsLAS9qzSb/G1gkH1x7cwJiGO9l37xgRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgPeiE/btsLAS9qzSb/G1gkH1x7cwJiGO9l37xgRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgPeiE%2FbtsLAS9qzSb%2FG1gkH1x7cwJiGO9l37xgRK%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;1462&quot; height=&quot;826&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;826&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;3. 생성자 주입&lt;/p&gt;
&lt;pre id=&quot;code_1735283576144&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.sample;

import org.springframework.stereotype.Component;

import lombok.AllArgsConstructor;
import lombok.ToString;

@Component
@ToString
@AllArgsConstructor
public class Restaurant {

	private Chef chef;

}&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;1488&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGg3lT/btsLA8YB5a4/ksrmtzKODDqtvWsGc0KaE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGg3lT/btsLA8YB5a4/ksrmtzKODDqtvWsGc0KaE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGg3lT/btsLA8YB5a4/ksrmtzKODDqtvWsGc0KaE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGg3lT%2FbtsLA8YB5a4%2FksrmtzKODDqtvWsGc0KaE1%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;1488&quot; height=&quot;647&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;647&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;4. 최근 가장 권장하는 방법(5. 이상 버전부터 가능)&lt;/p&gt;
&lt;pre id=&quot;code_1735283684435&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.sample;

import org.springframework.stereotype.Component;

import lombok.RequiredArgsConstructor;
import lombok.ToString;

@Component
@ToString
@RequiredArgsConstructor
public class Restaurant {

	private final Chef chef;

}&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;1467&quot; data-origin-height=&quot;920&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mf3uk/btsLzuawB2g/2g6fhkS69KAsmM7j5xQ5f1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mf3uk/btsLzuawB2g/2g6fhkS69KAsmM7j5xQ5f1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mf3uk/btsLzuawB2g/2g6fhkS69KAsmM7j5xQ5f1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmf3uk%2FbtsLzuawB2g%2F2g6fhkS69KAsmM7j5xQ5f1%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;1467&quot; height=&quot;920&quot; data-origin-width=&quot;1467&quot; data-origin-height=&quot;920&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;final로 된 객체를 찾아서 주입이 됨&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;스프링 설정 파일 root-context.xml(객체), servlet-context.xml(웹) 두 개가 존재&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘로 나눈 이유는? 스프링 프레임워크는 객체 프레임워크 &amp;rarr; 외부 확장 &amp;rarr; 외부에 대한 설정을 가져가는 것을 분리&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;component-scan&lt;/b&gt;이 제대로 되는지 확인해야함&lt;/p&gt;
&lt;pre id=&quot;code_1735284190240&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.sample;

public class SampleHotel {

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SampleHotel의&amp;nbsp;경우&amp;nbsp;생성만&amp;nbsp;했고&amp;nbsp;아무런&amp;nbsp;어노테이션이&amp;nbsp;존재하지&amp;nbsp;않음. &lt;br /&gt;하지만&amp;nbsp;package&amp;nbsp;org.zerock.sample는&amp;nbsp;component-scan&amp;nbsp;대상임&amp;nbsp;-&amp;gt;&amp;nbsp;어노테이션을&amp;nbsp;추가하면&amp;nbsp;스프링에서&amp;nbsp;관리를&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;1133&quot; data-origin-height=&quot;932&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnDuTT/btsLyEdJkht/zJRWJd1tvqv8KKDINdZwp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnDuTT/btsLyEdJkht/zJRWJd1tvqv8KKDINdZwp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnDuTT/btsLyEdJkht/zJRWJd1tvqv8KKDINdZwp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnDuTT%2FbtsLyEdJkht%2FzJRWJd1tvqv8KKDINdZwp0%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;1133&quot; height=&quot;932&quot; data-origin-width=&quot;1133&quot; data-origin-height=&quot;932&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어노테이션을 추가하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;940&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjjUTl/btsLzeeKtio/k9qklghIEkI99T2yaUFn41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjjUTl/btsLzeeKtio/k9qklghIEkI99T2yaUFn41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjjUTl/btsLzeeKtio/k9qklghIEkI99T2yaUFn41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjjUTl%2FbtsLzeeKtio%2Fk9qklghIEkI99T2yaUFn41%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;1298&quot; height=&quot;940&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;940&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;pre id=&quot;code_1735284516929&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.zerock.sample;

import org.springframework.stereotype.Component;

import lombok.ToString;

@Component
@ToString
public class SampleHotel {

	private Chef chef;

	public SampleHotel(Chef chef) {
		super();
		this.chef = chef;
	} 
	
}&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;1491&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1eGw5/btsLBjZS3vB/35CxkGC6Ow3tPe9gJzkJBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1eGw5/btsLBjZS3vB/35CxkGC6Ow3tPe9gJzkJBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1eGw5/btsLBjZS3vB/35CxkGC6Ow3tPe9gJzkJBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1eGw5%2FbtsLBjZS3vB%2F35CxkGC6Ow3tPe9gJzkJBK%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;1491&quot; height=&quot;844&quot; data-origin-width=&quot;1491&quot; data-origin-height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※최근 들어서 추세는 new 예약어로 객체를 만들지 않음. 이유는 new 예약어로 객체를 생성하면 클래스에 종속적이게 되므로 다른 방법으로 객체를 만드는 방법을 선택한다고 함.&lt;/p&gt;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/313</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-1#entry313comment</comments>
      <pubDate>Fri, 27 Dec 2024 16:35:20 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트 2</title>
      <link>https://001cloudid.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-2</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;변수(variable)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;프로그램을 실행하는 동안 값이 여러 번 달라질 수 있는 데이터&lt;br /&gt;&amp;harr; 값을 한 번 지정하면 바뀌지 않는 데이터를 상수(constant)&lt;/li&gt;
&lt;li&gt;변수 선언 규칙&lt;br /&gt;변수를 사용하려면 변수를 구별할 수 있도록 이름을 붙여 주어야 하는데, 이것을 변수 선언&lt;/li&gt;
&lt;li&gt;변수 선언&lt;br /&gt;var || let || const 변수명&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735263834359&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;

&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;변수&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;

	&amp;lt;script&amp;gt;
        // 변수 선언하기
        var currentYear = 2024;
        var birthYear;
        var age;

        // 변수 한꺼번에 선언
        // var currentYear, birthYear, age;

        birthYear = prompt(&quot;태어난 연도를 입력해주세요.(형식 : YYYY)&quot;, &quot;&quot;);
        age = currentYear - birthYear;
        document.write(currentYear + &quot;년 현재, &quot; + age + &quot;입니다.&quot;);

    &amp;lt;/script&amp;gt;

&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baLIEx/btsLzClIulL/vkeswNjlkHrhJs6p8iLj2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baLIEx/btsLzClIulL/vkeswNjlkHrhJs6p8iLj2K/img.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;508&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5992%; margin-right: 10px;&quot; data-widthpercent=&quot;33.38&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baLIEx/btsLzClIulL/vkeswNjlkHrhJs6p8iLj2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaLIEx%2FbtsLzClIulL%2FvkeswNjlkHrhJs6p8iLj2K%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;954&quot; height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bncq9Z/btsLxEdGCSu/aCtNYkWZcSkTAbSy2UwyIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bncq9Z/btsLxEdGCSu/aCtNYkWZcSkTAbSy2UwyIk/img.png&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;511&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.4418%; margin-right: 10px;&quot; data-widthpercent=&quot;33.21&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bncq9Z/btsLxEdGCSu/aCtNYkWZcSkTAbSy2UwyIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbncq9Z%2FbtsLxEdGCSu%2FaCtNYkWZcSkTAbSy2UwyIk%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;955&quot; height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vObYU/btsLyCfmvC4/f1pni9JHivg2G4fTJlACl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vObYU/btsLyCfmvC4/f1pni9JHivg2G4fTJlACl1/img.png&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;508&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.6334%;&quot; data-widthpercent=&quot;33.41&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vObYU/btsLyCfmvC4/f1pni9JHivg2G4fTJlACl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvObYU%2FbtsLyCfmvC4%2Ff1pni9JHivg2G4fTJlACl1%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;955&quot; height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자료형&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터가 처리할 수 있는 자료의 형태. 데이터 유형, 데이터 타입, 데이터형이라고도 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 유형(숫자형, 문자열, 논리형), 복합 유형(배열, 객체), 특수 유형(undefined, null)&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;숫자형(number)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;따옴표 없이 숫자로만 표기&lt;br /&gt;ex) var currentYear = 2024;&lt;/li&gt;
&lt;li&gt;정수 : 소수점이 없는 숫자&lt;/li&gt;
&lt;li&gt;실수 : 소수점이 있는 숫자&lt;br /&gt;ex) var PI = 3.14;&lt;/li&gt;
&lt;li&gt;자바 스크립트에서는 실수를 정밀하게 계산하는 것은 적합하지 않음. 예상하지 못한 계살 결괏값이 나올 때가 있음&lt;br /&gt;따라서 정밀하게 숫자를 계한하는 프로그램을 만들 때 주의&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;115&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6S5T3/btsLxGCv0Hs/xmZwz7l1m6nEV7kakKX7Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6S5T3/btsLxGCv0Hs/xmZwz7l1m6nEV7kakKX7Nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6S5T3/btsLxGCv0Hs/xmZwz7l1m6nEV7kakKX7Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6S5T3%2FbtsLxGCv0Hs%2FxmZwz7l1m6nEV7kakKX7Nk%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;115&quot; height=&quot;74&quot; data-origin-width=&quot;115&quot; data-origin-height=&quot;74&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;문자형(String)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;작은 따옴표나 큰 따옴표로 묶은 데이터를 의미&lt;/li&gt;
&lt;li&gt;숫자도 따옴표로 묶으면 문자열로 인식&lt;/li&gt;
&lt;li&gt;작은 따옴표로 시작한 문자열 데이터는 작은 따옴표로 끝맺음해야함&lt;/li&gt;
&lt;li&gt;따옴표를 중복으로 써야할 경우 중복되지 않도록 속성값은 다른 따옴표로 묶어서 표현&lt;br /&gt;ex) document.write(&quot;&amp;lt;\span style = 'color : red'&amp;gt;&quot;, &quot;hello world&quot;, &quot;&amp;lt;\/span&amp;gt;&quot;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;114&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dd3pi/btsLyVZ0hYY/1NeVH6qxbQhwksKzcz7k6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dd3pi/btsLyVZ0hYY/1NeVH6qxbQhwksKzcz7k6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dd3pi/btsLyVZ0hYY/1NeVH6qxbQhwksKzcz7k6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDd3pi%2FbtsLyVZ0hYY%2F1NeVH6qxbQhwksKzcz7k6K%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;114&quot; height=&quot;62&quot; data-origin-width=&quot;114&quot; data-origin-height=&quot;62&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;논리형(boolean)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;참 혹은 거짓의 값으로 표현하는 자료형&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;90&quot; data-origin-height=&quot;51&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DvXPZ/btsLx5a21Ft/htnnbLOk9f7aIUn6p4rLw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DvXPZ/btsLx5a21Ft/htnnbLOk9f7aIUn6p4rLw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DvXPZ/btsLx5a21Ft/htnnbLOk9f7aIUn6p4rLw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDvXPZ%2FbtsLx5a21Ft%2FhtnnbLOk9f7aIUn6p4rLw0%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;90&quot; height=&quot;51&quot; data-origin-width=&quot;90&quot; data-origin-height=&quot;51&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;undefined&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;자료형이 정의되지 않았을 때의 데이터 상태를 나타냄&lt;/li&gt;
&lt;li&gt;자바스크립트에서 변수를 선언할 때 자료형을 미리 지정하지 않고 값을 할당할 때 결정&lt;/li&gt;
&lt;li&gt;변수 선언만 하고 값이 할당되지 않을 자료형&lt;/li&gt;
&lt;li&gt;변수에 값이 할당 되지 않았다를 뜻함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;null&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;데이터 값이 유효하지 않은 상태&lt;/li&gt;
&lt;/ul&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;변수 하나에 값을 여러 개 저장&lt;/li&gt;
&lt;li&gt;여러 개의 데이터값을 하나의 배열 이름으로 묶어서 선언&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;214&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qMrFA/btsLAVdwAP5/dj1MlzoLsbBkcbAAXUjIg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qMrFA/btsLAVdwAP5/dj1MlzoLsbBkcbAAXUjIg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qMrFA/btsLAVdwAP5/dj1MlzoLsbBkcbAAXUjIg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqMrFA%2FbtsLAVdwAP5%2Fdj1MlzoLsbBkcbAAXUjIg1%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;214&quot; height=&quot;171&quot; data-origin-width=&quot;214&quot; data-origin-height=&quot;171&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;h3 data-ke-size=&quot;size23&quot;&gt;연산자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;+, -, *, /, %, ++, --&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;156&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u8hY0/btsLAu1v9AC/GuO7Gsqn7J853jIjPZVgOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u8hY0/btsLAu1v9AC/GuO7Gsqn7J853jIjPZVgOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u8hY0/btsLAu1v9AC/GuO7Gsqn7J853jIjPZVgOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu8hY0%2FbtsLAu1v9AC%2FGuO7Gsqn7J853jIjPZVgOk%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;156&quot; height=&quot;88&quot; data-origin-width=&quot;156&quot; data-origin-height=&quot;88&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;변수에 값을 할당하거나 연산식의 결과를 변수에 저장할 때 사용&lt;/li&gt;
&lt;li&gt;=, +=, -=, *=, /=, %=&lt;/li&gt;
&lt;/ul&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;둘 이상의 문자열을 합쳐서 하나의 문자열로 만드는 연산자&lt;/li&gt;
&lt;li&gt;+, ,&lt;/li&gt;
&lt;/ul&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;피연산자 2개의 값을 비교해서 참 혹은 거짓으로 결괏값을 반환&lt;/li&gt;
&lt;li&gt;주로 두 값을 비교하므로 어떠한 조건을 체크할 때 사용&lt;/li&gt;
&lt;li&gt;==, ===, !=, !==, &amp;lt;, &amp;lt;=, &amp;gt;, &amp;gt;=&lt;/li&gt;
&lt;li&gt;==, === 연산자 비교&lt;br /&gt;== : 피연산자가 서로 같으면 true&lt;br /&gt;=== : 피연산자도 같고 자료형도 같으면 true&lt;/li&gt;
&lt;/ul&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;true, false를 처리하는 연산자&lt;/li&gt;
&lt;li&gt;||, &amp;amp;&amp;amp;, !&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;조건문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if문&lt;/p&gt;
&lt;pre id=&quot;code_1735265479700&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(조건){
	조건 결과가 true일 때 실행
}&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;if-else&lt;/p&gt;
&lt;pre id=&quot;code_1735265502959&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(조건){
	조건 결과가 true일 때 실행
} else {
	조건 결과가 false일 때 실행
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1735265630187&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;조건문&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

	&amp;lt;script&amp;gt;
        var num = prompt(&quot;숫자를 입력하세요.&quot;);

        if(num%3==0) {
            document.write(&quot;3의 배수&quot;);
        } else {
            document.write(&quot;3의 배수가 아닙니다.&quot;);
        }
    &amp;lt;/script&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSSley/btsLzB8bxjU/7hv10hYV6QfPX7kQCGmcm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSSley/btsLzB8bxjU/7hv10hYV6QfPX7kQCGmcm1/img.png&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;211&quot; data-is-animation=&quot;false&quot; style=&quot;width: 38.231%; margin-right: 10px;&quot; data-widthpercent=&quot;38.68&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSSley/btsLzB8bxjU/7hv10hYV6QfPX7kQCGmcm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSSley%2FbtsLzB8bxjU%2F7hv10hYV6QfPX7kQCGmcm1%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;467&quot; height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cm7Jth/btsLyCGo9Tx/RbuSXxpqzy5Rirv0mZiAv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cm7Jth/btsLyCGo9Tx/RbuSXxpqzy5Rirv0mZiAv1/img.png&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;116&quot; data-is-animation=&quot;false&quot; style=&quot;width: 60.6062%;&quot; data-widthpercent=&quot;61.32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cm7Jth/btsLyCGo9Tx/RbuSXxpqzy5Rirv0mZiAv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcm7Jth%2FbtsLyCGo9Tx%2FRbuSXxpqzy5Rirv0mZiAv1%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;407&quot; height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735265760687&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;조건문&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

    &amp;lt;script&amp;gt;
        var num = prompt(&quot;숫자를 입력하세요.&quot;);

        if(num!=null){
            if(num%3==0) {
            document.write(&quot;3의 배수&quot;);
            } else {
                document.write(&quot;3의 배수가 아닙니다.&quot;);
            }
        } else {
            document.write(&quot;입력이 취소되었습니다.&quot;)
        }

    &amp;lt;/script&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwjHjd/btsLz4hWq9F/u36J3AhEOAU5jOcuUSxkkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwjHjd/btsLz4hWq9F/u36J3AhEOAU5jOcuUSxkkK/img.png&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;205&quot; data-is-animation=&quot;false&quot; style=&quot;width: 38.6723%; margin-right: 10px;&quot; data-widthpercent=&quot;39.13&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwjHjd/btsLz4hWq9F/u36J3AhEOAU5jOcuUSxkkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwjHjd%2FbtsLz4hWq9F%2Fu36J3AhEOAU5jOcuUSxkkK%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;458&quot; height=&quot;205&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lmxHj/btsLz0s1zqr/QKgHZStx8IQvwX1kE8zp61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lmxHj/btsLz0s1zqr/QKgHZStx8IQvwX1kE8zp61/img.png&quot; data-origin-width=&quot;431&quot; data-origin-height=&quot;124&quot; data-is-animation=&quot;false&quot; style=&quot;width: 60.1649%;&quot; data-widthpercent=&quot;60.87&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lmxHj/btsLz0s1zqr/QKgHZStx8IQvwX1kE8zp61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlmxHj%2FbtsLz0s1zqr%2FQKgHZStx8IQvwX1kE8zp61%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;431&quot; height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 조건 계산을 빠르게 하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건이 2가지 이상일 경우 동시에 함께 체크하는 조건식을 만들 때는 첫 번째 조건을 보고 빠르게 판단할 수 있도록 해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약, and(&amp;amp;&amp;amp;) 조건식이 둘 이상일 경우 false가 될 확률이 높은 조건을 첫 번째 조건식으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;or(||) 조건식이 둘 이상일 경우 true가 될 확률이 높은 조건을 첫번째 조건식으로 사용하는 것이 좋음&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;switch&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처리할 명령이 많은 경우 if-else문을 여러 개 사용해서 조건을 확인하는 것보다 switch문이 더 보기 편함&lt;/p&gt;
&lt;pre id=&quot;code_1735266085661&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;switch(조건)
{
	case 값1 : 명령1
    break;
    case 값2 : 명령2
    break;
    ...
    default : 명령 n
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 것은 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;&lt;b&gt;break 작성&lt;/b&gt;&lt;/u&gt;&lt;/span&gt; 유무(자주 까먹어서 값1이 나왔을 때 명령1만 나오면 되는 데 명령2, ... 명령 n까지 실행됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 default에는 break를 작성하지 않음&lt;/p&gt;
&lt;pre id=&quot;code_1735266400650&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;조건문&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;script&amp;gt;
        var switchTest = prompt(&quot;관심 언어를 입력해주세요. 1 : html/css, 2 : javascript, 3. python&quot;);

        switch(switchTest){
            case &quot;1&quot; : document.write(&quot;관심있어하는 언어는 &amp;lt;b&amp;gt;html/css&amp;lt;/b&amp;gt; 입니다.&quot;);
            break;
            case &quot;2&quot; : document.write(&quot;관심있어하는 언어는 &amp;lt;b&amp;gt;javascript&amp;lt;/b&amp;gt; 입니다.&quot;);
            break;
            case &quot;3&quot; : document.write(&quot;관심있어하는 언어는 &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; 입니다.&quot;);
            break;
            default : document.write(&quot;잘 못 입력하셨습니다.&quot;);
        }
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cI3rcl/btsLzBG39pP/R6tPkcWgYgNtSvBE7VFsQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cI3rcl/btsLzBG39pP/R6tPkcWgYgNtSvBE7VFsQ1/img.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;211&quot; data-is-animation=&quot;false&quot; style=&quot;width: 41.8792%; margin-right: 10px;&quot; data-widthpercent=&quot;42.37&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cI3rcl/btsLzBG39pP/R6tPkcWgYgNtSvBE7VFsQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcI3rcl%2FbtsLzBG39pP%2FR6tPkcWgYgNtSvBE7VFsQ1%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;447&quot; height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csRe5g/btsLxGP4Usq/Hh0q7b09zxQkV0H4dRt6r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csRe5g/btsLxGP4Usq/Hh0q7b09zxQkV0H4dRt6r0/img.png&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;160&quot; data-is-animation=&quot;false&quot; style=&quot;width: 56.958%;&quot; data-widthpercent=&quot;57.63&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csRe5g/btsLxGP4Usq/Hh0q7b09zxQkV0H4dRt6r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsRe5g%2FbtsLxGP4Usq%2FHh0q7b09zxQkV0H4dRt6r0%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;461&quot; height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 아래와 같이 break가 없다면?&lt;/p&gt;
&lt;pre id=&quot;code_1735266468506&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;조건문&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;script&amp;gt;
        var switchTest = prompt(&quot;관심 언어를 입력해주세요. 1 : html/css, 2 : javascript, 3. python&quot;);

        switch(switchTest){
            case &quot;1&quot; : document.write(&quot;관심있어하는 언어는 &amp;lt;b&amp;gt;html/css&amp;lt;/b&amp;gt; 입니다.&quot;);
            //break;
            case &quot;2&quot; : document.write(&quot;관심있어하는 언어는 &amp;lt;b&amp;gt;javascript&amp;lt;/b&amp;gt; 입니다.&quot;);
            //break;
            case &quot;3&quot; : document.write(&quot;관심있어하는 언어는 &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; 입니다.&quot;);
            //break;
            default : document.write(&quot;잘 못 입력하셨습니다.&quot;);
        }
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KNRLm/btsLywlSLn4/1SF8xqlPXAgKsDAKl0Fsu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KNRLm/btsLywlSLn4/1SF8xqlPXAgKsDAKl0Fsu1/img.png&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;211&quot; data-is-animation=&quot;false&quot; style=&quot;width: 17.9928%; margin-right: 10px;&quot; data-widthpercent=&quot;18.2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KNRLm/btsLywlSLn4/1SF8xqlPXAgKsDAKl0Fsu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKNRLm%2FbtsLywlSLn4%2F1SF8xqlPXAgKsDAKl0Fsu1%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;436&quot; height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5DXNq/btsLz1MkVjO/cWRn6olahKtanRgZsvLXmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5DXNq/btsLz1MkVjO/cWRn6olahKtanRgZsvLXmK/img.png&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;109&quot; data-is-animation=&quot;false&quot; style=&quot;width: 80.8444%;&quot; data-widthpercent=&quot;81.8&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5DXNq/btsLz1MkVjO/cWRn6olahKtanRgZsvLXmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5DXNq%2FbtsLz1MkVjO%2FcWRn6olahKtanRgZsvLXmK%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;1012&quot; height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;switch에서는 break를 작성해주는게 가장 중요함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;반복문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초깃값 &amp;rarr; 조건 &amp;rarr; 명령 &amp;rarr; 증감식 순서로 진행&lt;/p&gt;
&lt;pre id=&quot;code_1735267499986&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;반복문 for&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

    &amp;lt;script&amp;gt;
        var i;
        var sum = 0;
        for(i = 1; i &amp;lt; 11; i++){
            sum += i;
        }
        document.write(&quot;1부터 10까지 더한 합은 : &quot; + sum);
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;462&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sajuc/btsLz8dhSCq/M8fsm6ttTC0x0fxkx5Zbl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sajuc/btsLz8dhSCq/M8fsm6ttTC0x0fxkx5Zbl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sajuc/btsLz8dhSCq/M8fsm6ttTC0x0fxkx5Zbl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsajuc%2FbtsLz8dhSCq%2FM8fsm6ttTC0x0fxkx5Zbl0%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;462&quot; height=&quot;191&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;191&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;중첩된 for문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for문 안에 다른 for문을 넣어서 사용할 수 있는데 이를 중첩된 for문&lt;/p&gt;
&lt;pre id=&quot;code_1735267709756&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;반복문 중첩 for&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;script&amp;gt;
        var i;
        var j;
        for(i = 2; i &amp;lt; 10; i++){
            document.write(&quot;&amp;lt;h1&amp;gt;&quot;+i+&quot;단&amp;lt;/h1&amp;gt;&quot;);
            for(j = 1; j &amp;lt; 10; j ++){
                document.write(i+&quot; * &quot;+j+&quot; = &quot; + (i*j)+&quot;&amp;lt;br&amp;gt;&quot;);
            }
        }
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;692&quot; data-origin-height=&quot;802&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bza4Ta/btsLx7fHdWi/uStgQ3ay0aIILILBhm2nmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bza4Ta/btsLx7fHdWi/uStgQ3ay0aIILILBhm2nmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bza4Ta/btsLx7fHdWi/uStgQ3ay0aIILILBhm2nmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbza4Ta%2FbtsLx7fHdWi%2FuStgQ3ay0aIILILBhm2nmk%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;692&quot; height=&quot;802&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;802&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;while문&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;while&lt;br /&gt;조건이 참인 동안 명령을 반복&lt;/li&gt;
&lt;li&gt;do-while&lt;br /&gt;조건이 마지막에 붙는데, do문은 일단 명령을 한 번 실행 한 후 while 문에서 조건을 체크&lt;br /&gt;조건이 false라도 최소 한 번은 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735268209133&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;반복문 while&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

    &amp;lt;script&amp;gt;
        var num = prompt(&quot;숫자를 입력해주세요&quot;);
        var result = 1;
        var first = 1;

        while(first&amp;lt;=num){
            result *= first;
            first++;
        }
        document.write(num + &quot;! =  &quot; + result);

    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blAMEo/btsLzcOhx5i/1zeNxQ2wn4SuMj6D91Mm0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blAMEo/btsLzcOhx5i/1zeNxQ2wn4SuMj6D91Mm0K/img.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;192&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.6116%; margin-right: 10px;&quot; data-widthpercent=&quot;46.15&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blAMEo/btsLzcOhx5i/1zeNxQ2wn4SuMj6D91Mm0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblAMEo%2FbtsLzcOhx5i%2F1zeNxQ2wn4SuMj6D91Mm0K%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;447&quot; height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FRSxX/btsLzwlvkQd/L3zDbCQD2tMODWjvJz2kYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FRSxX/btsLzwlvkQd/L3zDbCQD2tMODWjvJz2kYK/img.png&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;173&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.2256%;&quot; data-widthpercent=&quot;53.85&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FRSxX/btsLzwlvkQd/L3zDbCQD2tMODWjvJz2kYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFRSxX%2FbtsLzwlvkQd%2FL3zDbCQD2tMODWjvJz2kYK%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;470&quot; height=&quot;173&quot;/&gt;&lt;/span&gt;&lt;/div&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;continue&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 조건에 해당하는 값을 만나면 해당 반복문을 건너뜀. 반복문의 맨 앞으로 되돌아가 다음 과정으로 넘어감&lt;/p&gt;
&lt;pre id=&quot;code_1735268504746&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;continue&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;script&amp;gt;
        var i;
        var sum = 0;

        for(i = 1; i &amp;lt;= 10; i++){
            if(i%2==0){
                continue;
            }
            sum +=i;
        }
        document.write(&quot;1부터 10까지의 홀수의 합은 &quot; + sum);
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>organize/자바스트립트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/312</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-2#entry312comment</comments>
      <pubDate>Fri, 27 Dec 2024 12:02:09 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트 1</title>
      <link>https://001cloudid.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-1</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바스크립트가 하는 일&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹에서 자바스크립트는 동적이고 인터렉티브한 기능을 구현하는데 사용&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;DOM 조작 : HTML 문서의 구조를 실시간으로 수정하고 업데이트&lt;/li&gt;
&lt;li&gt;이벤트 처리 : 사용자의 입력을 처리하고 이에 반응&lt;/li&gt;
&lt;li&gt;비동기 요청(AJAX) : 서버와 비동기적으로 데이터를 주고받아 페이지 새로고침 없이 동적으로 콘텐츠를 업데이트&lt;/li&gt;
&lt;li&gt;애니메이션 : 페이지 내 요소에 애니메이션 효과를 추가&lt;/li&gt;
&lt;li&gt;클라이언트 측 유효성 검사 : 사용자가 입력한 데이터를 실시간으로 검증하여 오류를 미리 감지&lt;/li&gt;
&lt;li&gt;상태 관리 및 로직 처리 : 페이지 내 상태를 관리하고, 사용자 인터페이스에 맞게 동적인 로직을 처리&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 웹 페이지를 더 동적, 반응형으로 만들어 사용자 경험을 향상시키는 핵심적인 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;웹 브라우저와 자바스크립트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 문서 안에서 &amp;lt;\script&amp;gt; 태그로 자바스크립트를 작성&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&amp;lt;\script&amp;gt;태그는 웹 문서 안의 어디서든 위치할 수 있고 삽입한 위치 그자리에서 바로 실행&lt;/li&gt;
&lt;li&gt;하나의 문서에서 여러 개 사용&lt;/li&gt;
&lt;li&gt;HTML, CSS와 달리 영어 대소문자를 구별&lt;br /&gt;변수의 이름이나 함수를 지정할 때 영어 대소문자를 정확하게 구별해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NewFile01.html&lt;/p&gt;
&lt;pre id=&quot;code_1735181293481&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;글자색 바꾸기&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
	body{text-align: center;}
	heading{color: yellow;}
	text{color: darkslategray; font-size: 20px;}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;h1 id=&quot;heading&quot;&amp;gt;자바스크립트&amp;lt;/h1&amp;gt;
&amp;lt;p id=&quot;text&quot;&amp;gt;위 텍스트를 클릭해보세요&amp;lt;/p&amp;gt;

&amp;lt;script&amp;gt;
//	var heading = document.querySelector(&quot;#heading&quot;);
//	var heading = document.getElementById(&quot;heading&quot;);
	var heading = document.querySelector(&quot;h1&quot;);
	heading.onclick = function(){
		heading.style.color=&quot;red&quot;;
	}
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 위의 코드에서 document.querySelector()와 getElementById()를 바꿔서 사용할 수 있으나 두 메서드는 차이가 존재함&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;document.querySelector()&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;CSS 선택자를 이용해서 요소를 선택&lt;/li&gt;
&lt;li&gt;주어진 선택자에 맞는 첫 번째 요소만 반환&lt;/li&gt;
&lt;li&gt;CSS 스타일의 선택자 문법을 그대로 사용할 수 있어, 아이디, 클래스, 태그 이름, 속성 등 다양한 선택자가 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;document.getElementById()&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;특정 id를 가진 요소를 선택&lt;/li&gt;
&lt;li&gt;id는 페이지 내에서 유일해야 하기 때문에, 항상 단 하나의 요소만 반환&lt;/li&gt;
&lt;li&gt;document.querySelector()보다 속도가 빠름. id가 유일함을 보장하기 때문에 내부적으로 더 간단하게 동작&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deyUHc/btsLztatS4p/wuZOroM9ILelif3I0HOsH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deyUHc/btsLztatS4p/wuZOroM9ILelif3I0HOsH1/img.png&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;487&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.773%; margin-right: 10px;&quot; data-widthpercent=&quot;50.36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deyUHc/btsLztatS4p/wuZOroM9ILelif3I0HOsH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeyUHc%2FbtsLztatS4p%2FwuZOroM9ILelif3I0HOsH1%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;955&quot; height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uogLz/btsLwtpWQub/Hi6Rz15dTX1f20KGehkYgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uogLz/btsLwtpWQub/Hi6Rz15dTX1f20KGehkYgk/img.png&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;493&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.0642%;&quot; data-widthpercent=&quot;49.64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uogLz/btsLwtpWQub/Hi6Rz15dTX1f20KGehkYgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuogLz%2FbtsLwtpWQub%2FHi6Rz15dTX1f20KGehkYgk%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;953&quot; height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 스크립트 파일로 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSS와 마찬가지로 자바스크립트 소스도 따로 파일로 저장한 후 웹 문서에 연결해서 사용할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 웹 문서 안에 직접 자바스크립트 소스가 드러나지 않고 HTML 태그와 CSS만 유지할 수 있어 소스가 깔끔해짐&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;js/NewFile02.js&lt;/p&gt;
&lt;pre id=&quot;code_1735181805265&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * 
 */
	var heading = document.getElementById(&quot;heading&quot;);
//	var heading = document.querySelector(&quot;h1&quot;);
	heading.onclick = function(){
		heading.style.color=&quot;red&quot;;
	}&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;NewFile02.html&lt;/p&gt;
&lt;pre id=&quot;code_1735181844176&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;글자색 바꾸기(외부스크립트)&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
	body{text-align: center;}
	heading{color: yellow;}
	text{color: darkslategray; font-size: 20px;}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1 id=&quot;heading&quot;&amp;gt;자바스크립트&amp;lt;/h1&amp;gt;
&amp;lt;p id=&quot;text&quot;&amp;gt;위 텍스트를 클릭해보세요&amp;lt;/p&amp;gt;

&amp;lt;script src=&quot;js/NewFile02.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5WZqm/btsLyxkcjVI/CRQdMRvrGwukFKuHnIktKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5WZqm/btsLyxkcjVI/CRQdMRvrGwukFKuHnIktKK/img.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;342&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.9451%; margin-right: 10px;&quot; data-widthpercent=&quot;50.53&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5WZqm/btsLyxkcjVI/CRQdMRvrGwukFKuHnIktKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5WZqm%2FbtsLyxkcjVI%2FCRQdMRvrGwukFKuHnIktKK%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;954&quot; height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vLmmY/btsLwJ68XjQ/1RMk7YI4XyrKGpSeGAsJY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vLmmY/btsLwJ68XjQ/1RMk7YI4XyrKGpSeGAsJY0/img.png&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;349&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.8921%;&quot; data-widthpercent=&quot;49.47&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vLmmY/btsLwJ68XjQ/1RMk7YI4XyrKGpSeGAsJY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvLmmY%2FbtsLwJ68XjQ%2F1RMk7YI4XyrKGpSeGAsJY0%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;953&quot; height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 브라우저에서 스크립트 해석 과정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1043&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HJfB6/btsLx6fX8Ne/WeKy4dSEbBJBOvSSDd5Wxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HJfB6/btsLx6fX8Ne/WeKy4dSEbBJBOvSSDd5Wxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HJfB6/btsLx6fX8Ne/WeKy4dSEbBJBOvSSDd5Wxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHJfB6%2FbtsLx6fX8Ne%2FWeKy4dSEbBJBOvSSDd5Wxk%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;1043&quot; height=&quot;350&quot; data-origin-width=&quot;1043&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;1행의 !DOCTPYE html을 보고 웹 문서라는 것을 알게됨.&lt;br /&gt;html태그 사이의 내용을 HTML 표준에 맞춰 읽기 시작&lt;/li&gt;
&lt;li&gt;HTML 태그와 순서와 포함 관계 확인&lt;br /&gt;head 태그 사이, body 태그 사이에 어떤 태그가 있는지 확인.&lt;br /&gt;태그 간의 관계는 어떻게 되어 있는지 등을 분석&lt;/li&gt;
&lt;li&gt;style 태그의 스타일 정보 분석&lt;/li&gt;
&lt;li&gt;16행 script 태그를 만나면 웹 브라우저 안에 포함된 자바스크립트 해석기에게 스크립트 소스를 넘겨 자바스크립트 해석기가 해석&lt;/li&gt;
&lt;li&gt;2,3에서 분석한 정보에 따라 웹 브라우저 화면에 표시&lt;/li&gt;
&lt;li&gt;자바스크립트를 실행해서 결과를 화면에 표시&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;용어와 기본 입출력방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표현식과 명령문&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;표현식&lt;br /&gt;연산식뿐만 아니라 실제 값, 함수를 실행하는 것을 포함&lt;br /&gt;어떤 값을 만들어 낼 수 있다면 모두 식이 될 수 있고, 식은 변수에 저장&lt;/li&gt;
&lt;li&gt;명령문&lt;br /&gt;끝에는 세미콜론을 붙여 구분&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알림창 : 가장 많이 사용하는 간단한 대화상자 알림창을 열어 메시지 표시&lt;/p&gt;
&lt;pre id=&quot;code_1735191053648&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;

&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;간단한 입출력&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;

     &amp;lt;script&amp;gt;
        alert('alert() 알림창')
    &amp;lt;/script&amp;gt;

&amp;lt;/body&amp;gt;

&amp;lt;/html&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;/p&gt;
&lt;pre id=&quot;code_1735192096026&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;

&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;간단한 입출력 confirm()&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
    &amp;lt;script&amp;gt;
        var answer = confirm(&quot;변경하시겠습니까?&quot;);
        document.getElementById(&quot;confirmAnswer&quot;).textContent = answer ? &quot;확인&quot; : &quot;취소&quot;;
    &amp;lt;/script&amp;gt;



&amp;lt;/body&amp;gt;

&amp;lt;/html&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;/p&gt;
&lt;pre id=&quot;code_1735192513221&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;간단한 입출력 prompt()&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    프롬프트 입력 : &amp;lt;span id=&quot;promptAnswer&quot;&amp;gt;&amp;lt;/span&amp;gt;

    &amp;lt;script&amp;gt;
        var name = prompt(&quot;이름을 입력해주세요.&quot;,&quot;홍길동&quot;);
        document.getElementById(&quot;promptAnswer&quot;).textContent = name;
    &amp;lt;/script&amp;gt;
    
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;document.write() : 브라우저 화면에서 결과값을 확인하는 용도로 사용. 웹 문서에서 ()안의 내용을 표시하는 명령문. document.write()의 괄호 안에는 실제 웹 브라우저 화면에 표시할 내용이나 어떤 결과값이 저장된 변수를 넣을 수 있음&lt;/p&gt;
&lt;pre id=&quot;code_1735192144451&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;

&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;간단한입출력 document.write()&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
    브라우저 화면에서 결과값을 확인하는 용도로 사용&amp;lt;br&amp;gt;
    웹 문서에서 ()안의 내용을 표시하는 명령문&amp;lt;br&amp;gt;
    document.write()의 괄호 안에는 실제 웹 브라우저 화면에 표시할 내용이나 어떤 결과값이 저장된 변수를 넣을 수 있음&amp;lt;br&amp;gt;
    document.write(&quot;&quot;)결과&amp;lt;br&amp;gt;
    &amp;lt;script&amp;gt;
        document.write(&quot;&amp;lt;h1&amp;gt;안녕하세요.&amp;lt;/h1&amp;gt;&quot;);

    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&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;/p&gt;
&lt;pre id=&quot;code_1735192401413&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;실습&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;script&amp;gt;
        var name = prompt(&quot;이름을 입력해주세요.&quot;);
        document.write(&quot;&amp;lt;h1&amp;gt;안녕하세요&amp;lt;/h1&amp;gt;&quot;);
        document.write(`&amp;lt;b&amp;gt;`+name+`&amp;lt;/b&amp;gt;`+ &quot;님 안녕하세요&quot;);
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;console.log() : 괄호 안의 내용을 콘솔 창에 표시. 콘솔 창은 웹 브라우저의 개발자 도구 창에 포함되어 있는 공간&lt;/p&gt;
&lt;pre id=&quot;code_1735192656476&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;

&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;간단한입출력 console.log()&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;

    &amp;lt;script&amp;gt;
        var name = prompt(&quot;이름을 입력해주세요.&quot;);
        console.log(&quot;입력한 이름은 &quot; + name + &quot;입니다.&quot;);
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ VS Code에서 Git을 사용하여 로컬 프로젝트를 GitHub(Git 리포지토리)에 올리기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;github에 새 리포지토리를 생성한 후&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;터미널 열기(&lt;b&gt;Ctrl + `&lt;/b&gt;)&lt;/li&gt;
&lt;li&gt;Git 초기화 : &lt;b&gt;git init&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;원격 리포지토리 추가&amp;nbsp;&lt;b&gt;git remote add origin github주소&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;변경 사항 스테이지 : &lt;b&gt;git add .&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;커밋 : &lt;b&gt;git commit -m &quot;커밋사항&quot;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;로컬 리포지토리에서 GitHub 리포지토리로 푸시 : &lt;b&gt;git push -u origin master&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1099&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BpkkS/btsLyugXsai/kOFTK7D3wUj0BewtCKvOxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BpkkS/btsLyugXsai/kOFTK7D3wUj0BewtCKvOxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BpkkS/btsLyugXsai/kOFTK7D3wUj0BewtCKvOxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBpkkS%2FbtsLyugXsai%2FkOFTK7D3wUj0BewtCKvOxK%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;1099&quot; height=&quot;531&quot; data-origin-width=&quot;1099&quot; data-origin-height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>organize/자바스트립트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/311</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-1#entry311comment</comments>
      <pubDate>Thu, 26 Dec 2024 14:59:25 +0900</pubDate>
    </item>
    <item>
      <title>1차 프로젝트 추가 - 암호화2</title>
      <link>https://001cloudid.tistory.com/entry/1%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%B6%94%EA%B0%80-%EC%95%94%ED%98%B8%ED%99%942</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;구현하려고 했던 것&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원 가입 시 사용자가 입력한 평문 비밀번호를 암호화하여 DBMS Member 테이블의 pw 컬럼에 저장하고, 로그인 시 회원가입 시 입력한 비밀번호로 로그인 성공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;발생한 문제&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DBMS Member 테이블에 pw컬럼에 암호화된 비밀번호가 입력, 하지만 로그인 시 회원가입 시 입력한 비밀번호로 로그인 실패, 암호화 된 비밀번호를 입력해야 로그인 성공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;문제 해결을 위한 접근&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 할 때 사용자가 입력한 평문 비밀번호와 DB에 저장된 암호화된 비밀번호를 직접 비교.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Security의 PasswordEncoder 인터페이스에서 제공하는 matches() 메소드를 사용&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;boolean&amp;nbsp;matches(CharSequence&amp;nbsp;rawPassword,&amp;nbsp;String&amp;nbsp;encodedPassword);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;matches() : 입력받은 평문 비밀번호와 DB에 저장된 암호화된 비밀번호를 비교하여 두 값이 일치하는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rawPassword : 사용자가 입력한 평문 비밀번호&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;encodedPassword : DB에 저장된 암호화 비밀번호. 보통 encode() 메소드를 통해 암호화된 후 저장&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;MemberService.java&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;기존 로그인 시 userCheck() 메소드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734924823117&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public MemberDTO userCheck(MemberDTO memberDTO) {
		System.out.println(&quot;MemberService userCheck()&quot;);
		return memberDAO.userCheck(memberDTO);
	}&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;color: #222222; text-align: start;&quot;&gt;MemberService 에서 로그인 처리 과정 로직을 수정&lt;/span&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734924835253&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public MemberDTO userCheck(MemberDTO memberDTO) {
		System.out.println(&quot;MemberService userCheck()&quot;);
		
		 // DB에서 회원 정보를 가져옴
        MemberDTO encodedPassword = memberDAO.userCheck(memberDTO);

        // DB에서 가져온 암호화된 비밀번호와 비교
        if (encodedPassword != null &amp;amp;&amp;amp; passwordEncoder.matches(memberDTO.getPw(), encodedPassword.getPw())) {
            return encodedPassword;
        }
        return null;
	}&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;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start; font-family: 'Noto Serif KR';&quot;&gt;MemberMapper.xml&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 쿼리&lt;/p&gt;
&lt;pre id=&quot;code_1734924969715&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;userCheck&quot; resultType=&quot;com.itwillbs.domain.MemberDTO&quot;&amp;gt;
		select * 
		from member
		where id = #{id} and pw = #{pw} 
	&amp;lt;/select&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;/p&gt;
&lt;pre id=&quot;code_1734924981285&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;userCheck&quot; resultType=&quot;com.itwillbs.domain.MemberDTO&quot;&amp;gt;
		select * 
		from member
		where id = #{id}
	&amp;lt;/select&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;쿼리에서 pw 부분이 없어져야 함. 비밀번호를 직접 비교하는 방식이 아닌 Spring Security의 PasswordEncoder를 사용하여 암호화된 비밀번호를 비교하기 때문임. 평문 비밀번호를 DB 쿼리에서 바로 비교하지 않고, 암호화된 값과 비교하는 방식으로 동작함.&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QJik9/btsLshh6Uof/57fdeimokceH1T1R6vRYdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QJik9/btsLshh6Uof/57fdeimokceH1T1R6vRYdK/img.png&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;332&quot; data-is-animation=&quot;false&quot; style=&quot;width: 33.7624%; margin-right: 10px;&quot; data-widthpercent=&quot;34.16&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QJik9/btsLshh6Uof/57fdeimokceH1T1R6vRYdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQJik9%2FbtsLshh6Uof%2F57fdeimokceH1T1R6vRYdK%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;477&quot; height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DogCX/btsLtv0VYDZ/Jd4wyXOEPdkgd49qtYmwr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DogCX/btsLtv0VYDZ/Jd4wyXOEPdkgd49qtYmwr1/img.png&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;169&quot; data-is-animation=&quot;false&quot; style=&quot;width: 65.0748%;&quot; data-widthpercent=&quot;65.84&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DogCX/btsLtv0VYDZ/Jd4wyXOEPdkgd49qtYmwr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDogCX%2FbtsLtv0VYDZ%2FJd4wyXOEPdkgd49qtYmwr1%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;468&quot; height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;/div&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;평문 암호입력(1234)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P5rqc/btsLrMvTcjy/gy9VAgfBSOnk9AjJnAWlN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P5rqc/btsLrMvTcjy/gy9VAgfBSOnk9AjJnAWlN0/img.png&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;301&quot; data-is-animation=&quot;false&quot; style=&quot;width: 30.2408%; margin-right: 10px;&quot; data-widthpercent=&quot;30.96&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P5rqc/btsLrMvTcjy/gy9VAgfBSOnk9AjJnAWlN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP5rqc%2FbtsLrMvTcjy%2Fgy9VAgfBSOnk9AjJnAWlN0%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;457&quot; height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLIxkg/btsLrOf7Lkg/SK6vBlYflrkMoaj0eUYkkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLIxkg/btsLrOf7Lkg/SK6vBlYflrkMoaj0eUYkkK/img.png&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;281&quot; data-is-animation=&quot;false&quot; style=&quot;width: 23.8164%; margin-right: 10px;&quot; data-widthpercent=&quot;24.38&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLIxkg/btsLrOf7Lkg/SK6vBlYflrkMoaj0eUYkkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLIxkg%2FbtsLrOf7Lkg%2FSK6vBlYflrkMoaj0eUYkkK%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;336&quot; height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mXQK2/btsLtKKzNdx/PrXPd1UqbMF0Q165lGDlT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mXQK2/btsLtKKzNdx/PrXPd1UqbMF0Q165lGDlT0/img.png&quot; data-origin-width=&quot;1338&quot; data-origin-height=&quot;611&quot; data-is-animation=&quot;false&quot; style=&quot;width: 43.6172%;&quot; data-widthpercent=&quot;44.66&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mXQK2/btsLtKKzNdx/PrXPd1UqbMF0Q165lGDlT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmXQK2%2FbtsLtKKzNdx%2FPrXPd1UqbMF0Q165lGDlT0%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;1338&quot; height=&quot;611&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원가입 시 비밀번호 암호화 완료&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원 수정 &amp;rarr; 비밀 번호 변경 시 마찬가지로 암호화를 해줘야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;MemberService.java&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 회원 정보 메소드&lt;/p&gt;
&lt;pre id=&quot;code_1734930231061&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	// 회원 정보 수정
	public void updateMember(MemberDTO memberDTO) {
		System.out.println(&quot;MemberService updateMember()&quot;);
		memberDAO.updateMember(memberDTO);
	}&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;/p&gt;
&lt;pre id=&quot;code_1734930260411&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	// 회원 정보 수정
	public void updateMember(MemberDTO memberDTO) {
		System.out.println(&quot;MemberService updateMember()&quot;);
		
		// 비밀번호가 변경되었으면 암호화
		if(memberDTO.getPw() != null &amp;amp;&amp;amp; !memberDTO.getPw().isEmpty()) {
			String encodedPassword = passwordEncoder.encode(memberDTO.getPw());
			memberDTO.setPw(encodedPassword);
		}

		memberDAO.updateMember(memberDTO);
	}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 다른 문제 사항&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 기존에 회원 가입되어 있던(암호화를 하기 전) 회원들의 로그인이 되지 않음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;54&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lZ8vv/btsLtrK1IbN/OWUKhJ0iGKbqQ2DLtEHobK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lZ8vv/btsLtrK1IbN/OWUKhJ0iGKbqQ2DLtEHobK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lZ8vv/btsLtrK1IbN/OWUKhJ0iGKbqQ2DLtEHobK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlZ8vv%2FbtsLtrK1IbN%2FOWUKhJ0iGKbqQ2DLtEHobK%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;737&quot; height=&quot;54&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;54&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc9e8Y/btsLrxeELSE/BuCZtHxnGAczY3GerWgyV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc9e8Y/btsLrxeELSE/BuCZtHxnGAczY3GerWgyV1/img.png&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;264&quot; data-is-animation=&quot;false&quot; style=&quot;width: 35.4282%; margin-right: 10px;&quot; data-widthpercent=&quot;35.84&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc9e8Y/btsLrxeELSE/BuCZtHxnGAczY3GerWgyV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc9e8Y%2FbtsLrxeELSE%2FBuCZtHxnGAczY3GerWgyV1%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;434&quot; height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EsQV6/btsLrw07iXK/l03YU2Z4MckYqrxxK1kEek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EsQV6/btsLrw07iXK/l03YU2Z4MckYqrxxK1kEek/img.png&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;156&quot; data-is-animation=&quot;false&quot; style=&quot;width: 63.409%;&quot; data-widthpercent=&quot;64.16&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EsQV6/btsLrw07iXK/l03YU2Z4MckYqrxxK1kEek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEsQV6%2FbtsLrw07iXK%2Fl03YU2Z4MckYqrxxK1kEek%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;459&quot; height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqalOC/btsLs2ShpYs/PBHxIq8ZczsUWLb6mCbEWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqalOC/btsLs2ShpYs/PBHxIq8ZczsUWLb6mCbEWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqalOC/btsLs2ShpYs/PBHxIq8ZczsUWLb6mCbEWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqalOC%2FbtsLs2ShpYs%2FPBHxIq8ZczsUWLb6mCbEWK%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;1176&quot; height=&quot;92&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 해결 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MemberService의 userCheck() 메소드에 조건문을 주어 기존 사용자들도 로그인이 가능하게 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;MemberService.java&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1734933204927&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public MemberDTO userCheck(MemberDTO memberDTO) {
		System.out.println(&quot;MemberService userCheck()&quot;);
		
		 // DB에서 회원 정보를 가져옴
        MemberDTO encodedPassword = memberDAO.userCheck(memberDTO);

        // DB에서 가져온 암호화된 비밀번호와 비교
        if (encodedPassword != null &amp;amp;&amp;amp; passwordEncoder.matches(memberDTO.getPw(), encodedPassword.getPw())) {
            return encodedPassword;
        }
        return null;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 아래 코드로 수정&lt;/p&gt;
&lt;pre id=&quot;code_1734933231263&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public MemberDTO userCheck(MemberDTO memberDTO) {
		System.out.println(&quot;MemberService userCheck()&quot;);
		// DB에서 회원 정보를 가져옴
		MemberDTO encodedPassword = memberDAO.userCheck(memberDTO);
		// DB에서 가져온 비밀번호가 평문인 경우
		if (encodedPassword != null &amp;amp;&amp;amp; !encodedPassword.getPw().startsWith(&quot;{bcrypt}&quot;)) { // 기존 비밀번호가 평문인 경우
			// 기존 비밀번호를 암호화하여 업데이트
			String encodedPw = passwordEncoder.encode(encodedPassword.getPw());
			encodedPassword.setPw(encodedPw);
			// 암호화된 비밀번호로 업데이트 (DB에 반영)
			memberDAO.updateMemberPassword(encodedPassword);
		}
		// DB에서 가져온 암호화된 비밀번호와 입력된 비밀번호를 비교
		if (encodedPassword != null &amp;amp;&amp;amp; passwordEncoder.matches(memberDTO.getPw(), encodedPassword.getPw())) {
			return encodedPassword;
		}
		return null; // 로그인 실패
	}&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;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;MemberDAO.java&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1734933845748&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void updateMemberPassword(MemberDTO memberDTO) {
	    System.out.println(&quot;MemberDAO updateMemberPassword()&quot;);
	    // 비밀번호를 암호화된 형태로 DB에 업데이트
	    sqlSession.update(namespace + &quot;.updateMemberPassword&quot;, memberDTO);
	}&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;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;MemberMapper.xml&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1734933868891&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;update id=&quot;updateMemberPassword&quot; parameterType=&quot;com.itwillbs.domain.MemberDTO&quot;&amp;gt;
		update member
		set pw = #{pw}
		where id = #{id}
	&amp;lt;/update&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;26&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj1QS4/btsLrHBwu2q/YenfKRjvVP0K0RifXJeGTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj1QS4/btsLrHBwu2q/YenfKRjvVP0K0RifXJeGTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj1QS4/btsLrHBwu2q/YenfKRjvVP0K0RifXJeGTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj1QS4%2FbtsLrHBwu2q%2FYenfKRjvVP0K0RifXJeGTk%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;840&quot; height=&quot;26&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;26&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&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yblU5/btsLtd0Gx3c/HUHtl020TWmNXXGidRt0Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yblU5/btsLtd0Gx3c/HUHtl020TWmNXXGidRt0Bk/img.png&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;298&quot; data-is-animation=&quot;false&quot; style=&quot;width: 28.9541%; margin-right: 10px;&quot; data-widthpercent=&quot;29.29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yblU5/btsLtd0Gx3c/HUHtl020TWmNXXGidRt0Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyblU5%2FbtsLtd0Gx3c%2FHUHtl020TWmNXXGidRt0Bk%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;483&quot; height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v89FO/btsLt5A6Eua/bIohLQu1lv0NfaCYkbrlPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v89FO/btsLt5A6Eua/bIohLQu1lv0NfaCYkbrlPk/img.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;159&quot; data-is-animation=&quot;false&quot; style=&quot;width: 69.8831%;&quot; data-widthpercent=&quot;70.71&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v89FO/btsLt5A6Eua/bIohLQu1lv0NfaCYkbrlPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv89FO%2FbtsLt5A6Eua%2FbIohLQu1lv0NfaCYkbrlPk%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;622&quot; height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;/div&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;1-1 다음 문제 사항&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호가 암호화가 되지 않은 회원이 로그인 했을 때 평문 비밀번호가 암호화 비밀번호로 변경이 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 비밀번호가 변경 된 후 로그아웃 후 로그인 할 때 평문 비밀번호, 암호화된 비밀번호로 로그인이 안됨&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또 다른 문제 사항 2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호 찾기에서 암호화된 비밀번호는 평문으로 된 비밀번호로 복호화가 불가능하므로 비밀번호 찾기를 시도하고 이후 비밀번호 바꿀 수 있게 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;findPW.jsp&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1734939800972&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
	pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;공티 새 비밀번호 설정&amp;lt;/title&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
#idForm {
	max-width: 400px;
	margin: auto;
	background-color: #fff;
	padding: 20px;
	border-radius: 8px;
	box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}

button {
	background-color: blue;
	color: white;
	padding: 10px;
	border: none;
	border-radius: 4px;
	cursor: pointer;
	width: 100px;
}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;div id=&quot;idForm&quot;&amp;gt;
		&amp;lt;form action=&quot;${pageContext.request.contextPath}/main/findPwPro&quot; method=&quot;post&quot;&amp;gt;
			&amp;lt;h2&amp;gt;새로운 비밀번호&amp;lt;/h2&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;id&quot; value=&quot;${memberDTO2.id}&quot;&amp;gt;
			새로운 비밀번호 &amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; id=&quot;pw&quot;&amp;gt;&amp;lt;br&amp;gt;
			비밀번호 확인 &amp;lt;input type=&quot;password&quot; id=&quot;pw2&quot;&amp;gt;&amp;lt;br&amp;gt;
			&amp;lt;center&amp;gt;
				&amp;lt;button type=&quot;submit&quot; onclick=&quot;return validatePw()&quot;&amp;gt;확인&amp;lt;/button&amp;gt;
				&amp;lt;button type=&quot;reset&quot; value=&quot;취소&quot; class=&quot;cancel&quot;
					onclick=&quot;history.go(-2)&quot;&amp;gt;돌아가기&amp;lt;/button&amp;gt;
			&amp;lt;/center&amp;gt;
		&amp;lt;/form&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;jsp:include page=&quot;../inc/bottom.jsp&quot; /&amp;gt;
	
	&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
		// 비밀번호 확인 함수
		function validatePw(){
			var pw = document.getElementById(&quot;pw&quot;).value;
			var pw2 = document.getElementById(&quot;pw2&quot;).value;
			
			if(pw !== pw2){
				alert(&quot;입력한 비밀번호가 다릅니다.&quot;);
				document.getElementById(&quot;pw&quot;).focus();
				return false;
			}
			return true;
		}
	
	&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;pwChange.jsp&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1734939825206&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;공티 비밀번호 변경 완료&amp;lt;/title&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
#idForm {
	max-width: 400px;
	margin: auto;
	background-color: #fff;
	padding: 20px;
	border-radius: 8px;
	box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}

button {
	background-color: blue;
	color: white;
	padding: 10px;
	border: none;
	border-radius: 4px;
	cursor: pointer;
	width: 100px;
}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;div id=&quot;idForm&quot;&amp;gt;
		&amp;lt;form action=&quot;${pageContext.request.contextPath}/main/findPwPro&quot; method=&quot;post&quot;&amp;gt;
			&amp;lt;h2&amp;gt;비밀번호가 성공적으로 변경되었습니다.&amp;lt;/h2&amp;gt;
			&amp;lt;center&amp;gt;
				&amp;lt;a href=&quot;${pageContext.request.contextPath}/main/login&quot;&amp;gt;로그인 페이지로 가기&amp;lt;/a&amp;gt;
			&amp;lt;/center&amp;gt;
		&amp;lt;/form&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;jsp:include page=&quot;../inc/bottom.jsp&quot; /&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;MemberController.java&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1734939849408&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PostMapping(&quot;/main/findPW&quot;)
public String searchPWPro(MemberDTO memberDTO, Model model) {
System.out.println(&quot;MemberController searchPWPro()&quot;);
MemberDTO memberDTO2 = new MemberDTO();
memberDTO2 = memberService.userCheckPW(memberDTO);
if (memberDTO2 != null) {
model.addAttribute(&quot;memberDTO2&quot;, memberDTO2);
return &quot;/main/findPW&quot;;
} else {
return &quot;/main/msg_search&quot;;
}
}

@PostMapping(&quot;/main/findPwPro&quot;)
public String resetPwPro(MemberDTO memberDTO) {
System.out.println(&quot;MemberController resetPwPro()&quot;);
memberService.updateMemberPassword(memberDTO);
return &quot;/main/pwChange&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;MemberService.java&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1734939872694&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void updateMemberPassword(MemberDTO memberDTO) {
		System.out.println(&quot;MemberService updateMemberPassword()&quot;);
		memberDAO.updateMemberPassword(memberDTO);
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호가 암호화가 되지 않은 회원 비밀번호 찾기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PaGAn/btsLutBWT1D/YBiblklh0CxoXYddK4fF00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PaGAn/btsLutBWT1D/YBiblklh0CxoXYddK4fF00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PaGAn/btsLutBWT1D/YBiblklh0CxoXYddK4fF00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPaGAn%2FbtsLutBWT1D%2FYBiblklh0CxoXYddK4fF00%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;740&quot; height=&quot;160&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfM9A7/btsLtspY1e9/59bjzWBebxdkNOabdyNyck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfM9A7/btsLtspY1e9/59bjzWBebxdkNOabdyNyck/img.png&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;394&quot; data-is-animation=&quot;false&quot; style=&quot;width: 18.8275%; margin-right: 10px;&quot; data-widthpercent=&quot;19.28&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfM9A7/btsLtspY1e9/59bjzWBebxdkNOabdyNyck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfM9A7%2FbtsLtspY1e9%2F59bjzWBebxdkNOabdyNyck%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;450&quot; height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SKnUa/btsLu3bLxMu/fGrTrKB38tKGR01QDfle7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SKnUa/btsLu3bLxMu/fGrTrKB38tKGR01QDfle7K/img.png&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;194&quot; data-is-animation=&quot;false&quot; style=&quot;width: 34.9235%; margin-right: 10px;&quot; data-widthpercent=&quot;35.75&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SKnUa/btsLu3bLxMu/fGrTrKB38tKGR01QDfle7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSKnUa%2FbtsLu3bLxMu%2FfGrTrKB38tKGR01QDfle7K%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;411&quot; height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beiswC/btsLutPzCFY/0D4iCWA9QPwUhKQgRln8T0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beiswC/btsLutPzCFY/0D4iCWA9QPwUhKQgRln8T0/img.png&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;155&quot; data-is-animation=&quot;false&quot; style=&quot;width: 43.9234%;&quot; data-widthpercent=&quot;44.97&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beiswC/btsLutPzCFY/0D4iCWA9QPwUhKQgRln8T0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeiswC%2FbtsLutPzCFY%2F0D4iCWA9QPwUhKQgRln8T0%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;413&quot; height=&quot;155&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;qwer로 변경&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;변경 후 DB확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BoFyV/btsLuHPbwL9/8W2TkP3JYlsnK6ALTYOfjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BoFyV/btsLuHPbwL9/8W2TkP3JYlsnK6ALTYOfjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BoFyV/btsLuHPbwL9/8W2TkP3JYlsnK6ALTYOfjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBoFyV%2FbtsLuHPbwL9%2F8W2TkP3JYlsnK6ALTYOfjK%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;545&quot; height=&quot;140&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호가 변경됨. 하지만 새로운 비밀번호 qwer로 로그인을 시도했을 때 로그인이 안됨. 암호화된 비밀번호로 로그인이 되는 문제&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;MemberService.java&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1735030091160&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public MemberDTO userCheck(MemberDTO memberDTO) {
		System.out.println(&quot;MemberService userCheck()&quot;);
		
		System.out.println(&quot;평문으로 입력한 비밀번호 : &quot; + memberDTO.getPw());
	
		// DB에서 회원 정보를 가져옴
		MemberDTO encodedPassword = memberDAO.userCheck(memberDTO);
		// DB에서 가져온 비밀번호가 평문인 경우
		if (encodedPassword != null &amp;amp;&amp;amp; !encodedPassword.getPw().startsWith(&quot;{bcrypt}&quot;)) { // 기존 비밀번호가 평문인 경우
			return encodedPassword;
		}
		// DB에서 가져온 암호화된 비밀번호와 입력된 비밀번호를 비교
		if (encodedPassword != null &amp;amp;&amp;amp; passwordEncoder.matches(memberDTO.getPw(), encodedPassword.getPw())) {
			return encodedPassword;
		}
		return null; // 로그인 실패
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/310</guid>
      <comments>https://001cloudid.tistory.com/entry/1%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%B6%94%EA%B0%80-%EC%95%94%ED%98%B8%ED%99%942#entry310comment</comments>
      <pubDate>Mon, 23 Dec 2024 17:27:40 +0900</pubDate>
    </item>
    <item>
      <title>1차 프로젝트 추가 - 암호화1</title>
      <link>https://001cloudid.tistory.com/entry/1%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%B6%94%EA%B0%80-%EC%95%94%ED%98%B8%ED%99%941</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&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;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 라이브러리 추가&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 프로젝트 스프링 프레임워크의 버전은 4.3.8이었으나 Spring Security를 이용할때 4.x 버전에 버그가 있다고 하여,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 프레임워크의 버전을 5.0.7로 변경한 후 Maven Dependencies에 추가할 라이브러리를 pom.xml에 작성해주는 것으로부터 시작&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;pom.xml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734850878644&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(...생략...)

	&amp;lt;properties&amp;gt;
		&amp;lt;java-version&amp;gt;11&amp;lt;/java-version&amp;gt;
		&amp;lt;org.springframework-version&amp;gt;5.0.7.RELEASE&amp;lt;/org.springframework-version&amp;gt; &amp;lt;!-- 스프링 시큐리티 4.버전에서 버그가 있음 --&amp;gt;
		&amp;lt;org.aspectj-version&amp;gt;1.6.10&amp;lt;/org.aspectj-version&amp;gt;
		&amp;lt;org.slf4j-version&amp;gt;1.6.6&amp;lt;/org.slf4j-version&amp;gt;
	&amp;lt;/properties&amp;gt;
	&amp;lt;dependencies&amp;gt;

		&amp;lt;!-- Spring Security 적용 추가 --&amp;gt;
		&amp;lt;!-- Spring Security Core (암호화 관련 기능 제공) --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework.security&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-security-core&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt; 
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- Spring Security Crypto (암호화 관련 기능 제공) --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework.security&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-security-crypto&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt; 
		&amp;lt;/dependency&amp;gt;
		&amp;lt;!-- Spring Security 적용 끝 --&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;371&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pargx/btsLsiHy2Xt/FVkP1aKevvKe3V9FQkkOF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pargx/btsLsiHy2Xt/FVkP1aKevvKe3V9FQkkOF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pargx/btsLsiHy2Xt/FVkP1aKevvKe3V9FQkkOF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPargx%2FbtsLsiHy2Xt%2FFVkP1aKevvKe3V9FQkkOF1%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;371&quot; height=&quot;597&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;597&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BCryptPasswordEncoder를 사용할 수 있도록 설정을 추가&lt;/b&gt;&amp;nbsp;방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. root-context.xml과 servlet-context.xml 파일을 통해 필요한 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Java Config 기반의 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;web.xml에 대한 추가 설정은 따로 하지 않음. 실제 암호화 설정은 Spring 설정 파일(root-context.xml 또는 servlet-context.xml에서 다룸)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. root-context.xml&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root-context.xml에서 PasswordEncoder를 빈으로 등록하고 필요한 서비스 클래스에서 이를 사용할 수 있도록 주입받을 수 있음&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;root-context.xml&lt;/p&gt;
&lt;pre id=&quot;code_1734851758688&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd&quot;&amp;gt;

	&amp;lt;!-- BCryptPasswordEncoder 빈 등록 --&amp;gt;
	&amp;lt;bean id=&quot;passwordEncoder&quot; class=&quot;org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder&quot; /&amp;gt;

	(...이하 생략...)
    
&amp;lt;/beans&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. MemberService.java&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PasswordEncoder를 주입하는 곳은 비즈니스 로직을 담당하는 서비스 클래스에 주입받음.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, MemberService에 주입받을 수 있도록해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MemberService.java&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734852514951&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.itwillbs.service;

(...생략...)

@Service
public class MemberService {

	@Inject
	private MemberDAO memberDAO;
	
	private final PasswordEncoder passwordEncoder;
	
	@Autowired
	public MemberService(PasswordEncoder passwordEncoder) {
		this.passwordEncoder = passwordEncoder;
	}

(...생략...)

	// ============회원 가입
	public void insertMember(MemberDTO memberDTO) {
		System.out.println(&quot;MemberService insertMember()&quot;);
		
		// 1. 평문 비밀번호를 암호화
		String encodedPassword = passwordEncoder.encode(memberDTO.getPw());
		
		// 2. 암호화된 비밀번호를 memberDTO로 저장
		memberDTO.setPw(encodedPassword);
		
		// 3. 암호화된 비밀번호와 함께 회원 데이터를 DAO로 전달
		memberDAO.insertMember(memberDTO);
	}

(...생략...)

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 회원 가입&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1371&quot; data-origin-height=&quot;992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpjcbQ/btsLtJxypAi/YDK4yFyC6Rqs7w3HAD0PwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpjcbQ/btsLtJxypAi/YDK4yFyC6Rqs7w3HAD0PwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpjcbQ/btsLtJxypAi/YDK4yFyC6Rqs7w3HAD0PwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpjcbQ%2FbtsLtJxypAi%2FYDK4yFyC6Rqs7w3HAD0PwK%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;1371&quot; height=&quot;992&quot; data-origin-width=&quot;1371&quot; data-origin-height=&quot;992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 오류가 발생됨. 오류가 발생된 이유는 암호화해서 DB에 값을 넣을 때 데이터크기가 맞지 않아서 생기는 문제.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/70u8h/btsLtdyUJwx/ch0oa2SkFRHV2GTQoiChqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/70u8h/btsLtdyUJwx/ch0oa2SkFRHV2GTQoiChqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/70u8h/btsLtdyUJwx/ch0oa2SkFRHV2GTQoiChqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F70u8h%2FbtsLtdyUJwx%2Fch0oa2SkFRHV2GTQoiChqK%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;424&quot; height=&quot;290&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호는 20자인데 암호화된 것은 20자를 넘어간다는 이야기인듯.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 컬럼 타입의 크기를 수정할 필요가 있음&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;1142&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cA7aYX/btsLrzCYTfz/7KXuJFMdR1v75TaaCKHdm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cA7aYX/btsLrzCYTfz/7KXuJFMdR1v75TaaCKHdm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cA7aYX/btsLrzCYTfz/7KXuJFMdR1v75TaaCKHdm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcA7aYX%2FbtsLrzCYTfz%2F7KXuJFMdR1v75TaaCKHdm1%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;1142&quot; height=&quot;236&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확히 어느정도의 크기인지 몰라서 100으로 변경&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/stnCz/btsLsqerxRx/VayovXh0m8UadLk6ZAs090/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/stnCz/btsLsqerxRx/VayovXh0m8UadLk6ZAs090/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/stnCz/btsLsqerxRx/VayovXh0m8UadLk6ZAs090/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FstnCz%2FbtsLsqerxRx%2FVayovXh0m8UadLk6ZAs090%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;677&quot; height=&quot;210&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호화는 성공적으로 된 것을 알 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원가입 시 했던 비밀번호를 입력하고 로그인을 시도&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;987&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEQ7UG/btsLtt9pKGa/R9O4ICMMUkes1HJUaIDJs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEQ7UG/btsLtt9pKGa/R9O4ICMMUkes1HJUaIDJs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEQ7UG/btsLtt9pKGa/R9O4ICMMUkes1HJUaIDJs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEQ7UG%2FbtsLtt9pKGa%2FR9O4ICMMUkes1HJUaIDJs1%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;1918&quot; height=&quot;987&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;987&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;469&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pIACh/btsLrHU8Si8/Km7qA0opnf3BwkmKTRbA1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pIACh/btsLrHU8Si8/Km7qA0opnf3BwkmKTRbA1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pIACh/btsLrHU8Si8/Km7qA0opnf3BwkmKTRbA1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpIACh%2FbtsLrHU8Si8%2FKm7qA0opnf3BwkmKTRbA1K%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;469&quot; height=&quot;157&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호화된 비밀번호를 입력 시&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/29acn/btsLsz97tMb/iBVKLSUtXIAWGYWMLjHf0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/29acn/btsLsz97tMb/iBVKLSUtXIAWGYWMLjHf0k/img.png&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;291&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;32.04&quot; style=&quot;width: 31.6692%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/29acn/btsLsz97tMb/iBVKLSUtXIAWGYWMLjHf0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F29acn%2FbtsLsz97tMb%2FiBVKLSUtXIAWGYWMLjHf0k%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;402&quot; height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0SdIp/btsLrKRUtoy/ez5fukauPLgztwMWnruDH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0SdIp/btsLrKRUtoy/ez5fukauPLgztwMWnruDH1/img.png&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;157&quot; data-is-animation=&quot;false&quot; style=&quot;width: 67.168%;&quot; data-widthpercent=&quot;67.96&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0SdIp/btsLrKRUtoy/ez5fukauPLgztwMWnruDH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0SdIp%2FbtsLrKRUtoy%2Fez5fukauPLgztwMWnruDH1%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;460&quot; height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPxY41/btsLtaWvE0D/qlTkA37EwkFrtd0g4DP7L0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPxY41/btsLtaWvE0D/qlTkA37EwkFrtd0g4DP7L0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPxY41/btsLtaWvE0D/qlTkA37EwkFrtd0g4DP7L0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPxY41%2FbtsLtaWvE0D%2FqlTkA37EwkFrtd0g4DP7L0%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;684&quot; height=&quot;240&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BCrypt로 암호화된 비밀번호는 60자로 현재 varchar(100)을 해놨는데 이는 불필요한 자원을 사용할 수 있으므로 수정이 필요한 것 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CEulS/btsLsfYrocS/ltXaMAJZnAqSQNsWHtfEd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CEulS/btsLsfYrocS/ltXaMAJZnAqSQNsWHtfEd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CEulS/btsLsfYrocS/ltXaMAJZnAqSQNsWHtfEd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCEulS%2FbtsLsfYrocS%2FltXaMAJZnAqSQNsWHtfEd0%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;364&quot; height=&quot;44&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;44&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 암호화 완료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 부트스트랩을 이용해 화면 수정&lt;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/309</guid>
      <comments>https://001cloudid.tistory.com/entry/1%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%B6%94%EA%B0%80-%EC%95%94%ED%98%B8%ED%99%941#entry309comment</comments>
      <pubDate>Sun, 22 Dec 2024 17:01:21 +0900</pubDate>
    </item>
    <item>
      <title>백엔드 엔드(Back-End)</title>
      <link>https://001cloudid.tistory.com/entry/%EB%B0%B1%EC%97%94%EB%93%9C-%EC%97%94%EB%93%9CBack-End%EB%9E%80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;백엔드 개발이 무엇인가에 대한 질문을 받았다. '보이지 않는 곳에서 시스템의 중요한 역할을 하는 것'이라고 답하였다. 과연이게 맞는 것일까&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;백엔드(Back-end)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k8IQo/btsLnRwcJtG/2O3uAnMyy0DpZ58SBaADr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k8IQo/btsLnRwcJtG/2O3uAnMyy0DpZ58SBaADr0/img.png&quot; data-alt=&quot;백엔드?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k8IQo/btsLnRwcJtG/2O3uAnMyy0DpZ58SBaADr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk8IQo%2FbtsLnRwcJtG%2F2O3uAnMyy0DpZ58SBaADr0%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; alt=&quot;백엔드&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;431&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;431&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;백엔드?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;웹이나 앱에서 사용자의 행동을 처리하고, 정보를 저장, 관리, 전달하며, 서버와 데이터베이스를 관리&lt;/li&gt;
&lt;li&gt;서버나 데이터베이스, API&amp;nbsp; 개발을 맡음&lt;/li&gt;
&lt;li&gt;즉, 웹 사이트의 뒷단에서 정보를 처리하고 저장하는 역할을 맡음&lt;/li&gt;
&lt;li&gt;예) 회원가입, 글쓰기&lt;/li&gt;
&lt;/ul&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>organize/웹기초</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/308</guid>
      <comments>https://001cloudid.tistory.com/entry/%EB%B0%B1%EC%97%94%EB%93%9C-%EC%97%94%EB%93%9CBack-End%EB%9E%80#entry308comment</comments>
      <pubDate>Wed, 18 Dec 2024 17:19:35 +0900</pubDate>
    </item>
    <item>
      <title>컬렉션 프레임워크(1) Map</title>
      <link>https://001cloudid.tistory.com/entry/%EC%BB%AC%EB%A0%89%EC%85%98-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC1-Map</link>
      <description>&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;h3 data-ke-size=&quot;size23&quot;&gt;Map 정의 및 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컬렉션 프레임워크에서 키(Key)와 값(Value) 쌍으로 데이터를 저장하고 관리하는 자료 구조.&lt;/li&gt;
&lt;li&gt;데이터를 빠르게 검색, 수정, 삭제할 수 있는 기능을 제공&lt;/li&gt;
&lt;li&gt;키는 유일해야 함. 동일한 키에 대해 여러 값을 저장할 수 없음&lt;/li&gt;
&lt;li&gt;값은 중복이 가능함. 같은 값은 여러 키에 중복될 수 있음&lt;/li&gt;
&lt;li&gt;null의 키와 값 Map의 일부에서는 허용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정의는 쉽게 키-값 쌍으로 저장된 구조로 간단히 정리가 되는데 map은 언제 사용할까? 라는 의문이 들었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Map을 사용해야 하는 상황&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;키와 값의 관계가 필요할 때&lt;/b&gt;&lt;br /&gt;키-값 쌍으로 데이터를 저장하므로, &lt;b&gt;각 키에 대한 고유한 값을 매핑&lt;/b&gt;해야 할 때 유용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;빠른 데이터 조회가 필요할 때&lt;/b&gt;&lt;br /&gt;내부적으로 해시 테이블을 사용하거나 이진 트리 구조를 사용하여 데이터를 저장. 이로 인해 키를 기반으로 한 &lt;b&gt;빠른 조회&lt;/b&gt;가 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;키의 유일성이 필요한 경우&lt;/b&gt;&lt;br /&gt;Map을 가장 잘 나타낸 것이 아이디-비밀번호라고 생각함. 아이디는 중복을 허용하지 않지만, 비밀번호는 중복이 가능하기 때문. 즉 아이디가 키, 비밀번호가 값&lt;br /&gt;단, Map의 경우 동일 키에 대한 값을 덮어쓰게 됨.&lt;br /&gt;중복된 키를 저장할 수 없기 때문에 &lt;b&gt;데이터의 무결성을 보장&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HashMap과 TreeMap&lt;/b&gt;&lt;br /&gt;HashMap 키의 순서가 중요하지 않은 경우&lt;br /&gt;TreeMap 키의 순서가 중요하고, 자동으로 정렬된 순서&lt;/li&gt;
&lt;li&gt;&lt;b&gt;null&lt;/b&gt;&lt;br /&gt;키-값 모두 null을 허용할 수 있음&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Map 인터페이스의 주요 메소드&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;put(K key, V value)&lt;/b&gt;&lt;br /&gt;지정한 키와 값을 Map에 추가함. 단, 동일한 키가 이미 존재하면 기존 값을 덮어씀&lt;/li&gt;
&lt;li&gt;&lt;b&gt;get(Object key)&lt;/b&gt;&lt;br /&gt;지정된 키에 해당하는 값을 반환. 키가 없으면 null을 반환&lt;/li&gt;
&lt;li&gt;&lt;b&gt;remove(Object key)&lt;/b&gt;&lt;br /&gt;지정된 키에 해당하는 항목을 제거&lt;/li&gt;
&lt;li&gt;&lt;b&gt;containsKey(Object key)&lt;/b&gt;&lt;br /&gt;지정한 키가 Map에 존재하는지 여부를 확인&lt;/li&gt;
&lt;li&gt;&lt;b&gt;size()&lt;/b&gt;&lt;br /&gt;Map에 저장된 키-값 쌍의 수를 반환&lt;/li&gt;
&lt;li&gt;&lt;b&gt;isEmpty()&lt;/b&gt;&lt;br /&gt;Map이 비어있는지 확인&lt;/li&gt;
&lt;li&gt;&lt;b&gt;clear()&lt;/b&gt;&lt;br /&gt;Map에 저장된 모든 항목을 제거&lt;/li&gt;
&lt;/ul&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;u&gt;&lt;b&gt;Map은 인터페이스&lt;/b&gt;&lt;/u&gt;이다. 그렇다면 이를 구현해서 사용해야 하는데 구현한 것들은 뭐가 있을까?&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Map을 구현한 클래스&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;HashMap&lt;/b&gt;&lt;br /&gt;가장 널리 사용되는 Map 구현체&lt;br /&gt;해시 테이블을 기반으로 빠른 조회 성능일 제공&lt;br /&gt;순서를 보장하지 않음. 데이터는 삽입 순서와 관계없이 저장&lt;br /&gt;null 키와 null 값 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1733200650714&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Map&amp;lt;String, Integer&amp;gt; map = new HashMap&amp;lt;&amp;gt;();
map.put(&quot;apple&quot;, 1);
map.put(&quot;banana&quot;, 2);
===============================================
import java.util.HashMap;
import java.util.Map;

public class 맵 {
    public static void main(String[] args) {
        // HashMap을 생성 (학생 ID를 키로, 성적을 값으로 저장)
        Map&amp;lt;Integer, String&amp;gt; studentGrades = new HashMap&amp;lt;&amp;gt;();
        
        // 데이터를 삽입 (학생 ID, 성적)
        studentGrades.put(101, &quot;A&quot;);
        studentGrades.put(102, &quot;B&quot;);
        studentGrades.put(103, &quot;A+&quot;);
        
        // 성적 조회
        System.out.println(&quot;학생 101의 성적: &quot; + studentGrades.get(101)); // A
        
        // 특정 학생 ID가 존재하는지 확인
        System.out.println(&quot;학생 102의 성적이 있는지 확인: &quot; + studentGrades.containsKey(102)); // true
        
        // 학생 삭제
        studentGrades.remove(103);
        System.out.println(&quot;학생 103 삭제 후: &quot; + studentGrades);
        
        // Map의 크기 확인
        System.out.println(&quot;학생 수: &quot; + studentGrades.size());
        
        // 모든 항목 순회
        for (Map.Entry&amp;lt;Integer, String&amp;gt; entry : studentGrades.entrySet()) {
            System.out.println(&quot;학생 ID: &quot; + entry.getKey() + &quot;, 성적: &quot; + entry.getValue());
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;TreeMap&lt;/b&gt;&lt;br /&gt;키를 자동으로 정렬(기본적으로 오름차순)&lt;br /&gt;null키 허용하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1733200697232&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Map&amp;lt;String, Integer&amp;gt; map = new TreeMap&amp;lt;&amp;gt;();
map.put(&quot;apple&quot;, 1);
map.put(&quot;banana&quot;, 2);
map.put(&quot;orange&quot;, 3);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;LinkedHashMap&lt;/b&gt;&lt;br /&gt;HashMap처럼 데이터를 해시 테이블에 저장하지만, 삽입 순서를 유지&lt;br /&gt;HashMap처럼 빠른 조회 성능을 제공&lt;br /&gt;삽입 순서대로 데이터를 순회할 수 있음&lt;br /&gt;null키와 null 값 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1733200789002&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Map&amp;lt;String, Integer&amp;gt; map = new LinkedHashMap&amp;lt;&amp;gt;();
map.put(&quot;apple&quot;, 1);
map.put(&quot;banana&quot;, 2);&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;이 외에 ~~HashMap으로 된 클래스가 있지만 프로그래밍을 할 때는 HashMap을 코딩 테스트할 때 LinkedHashMap을 사용하는 경우를 보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터의 키와 쌍을 이루는 경우에 사용하며 Map을 사용하면 효율적으로 데이터 처리와 관리가 가능&lt;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/305</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%BB%AC%EB%A0%89%EC%85%98-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC1-Map#entry305comment</comments>
      <pubDate>Tue, 3 Dec 2024 13:43:39 +0900</pubDate>
    </item>
    <item>
      <title>자바 배열과 배열 정렬</title>
      <link>https://001cloudid.tistory.com/entry/%EC%9E%90%EB%B0%94-%EB%B0%B0%EC%97%B4%EA%B3%BC-%EB%B0%B0%EC%97%B4-%EC%A0%95%EB%A0%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;프로그래머스 Lv0 ~ Lv1을 풀면서 느낀 점은 배열 정렬을 자주 사용한다. 그만큼 배열 정렬은 다양한 상황(데이터 처리나 알고리즘 구현)에서 필요한 기능이다. 하지만 매번 헷갈려서 검색으로 해결했다. 그렇다 보니 한 번 풀고 나면 또 금방 잊어버리는 경우가 많았다. 매 번 검색하는 것도 번거롭고 내 나름대로 정리하고 이것을 머릿속에 넣어두기 위해 정리하고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배열&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서 배열은 여러 종류로 나누어짐. 배열은 데이터를 연속적으로 저장하는 자료 구조로, 특정한 데이터 타입에 맞춰 고정된 크기를 가짐. 배열의 종류로는 &lt;b&gt;기본 배열&lt;/b&gt;(문자 배열, 객체 배열), &lt;b&gt;다차원 배열&lt;/b&gt;(2차원 이상 배열), &lt;b&gt;가변 배열&lt;/b&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;1. 기본 배열&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 데이터 타입(int, char, String 등)의 값들을 하나의 배열로 저장. 배열의 크기는 고정되며 선언 시 배열의 크기를 지정&lt;/p&gt;
&lt;pre id=&quot;code_1733118034235&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class 배열 {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5}; //배열 선언과 초기화
        
        // 배열 출력
        for (int i = 0; i &amp;lt; numbers.length; i++) {
            System.out.println(numbers[i]);
        }
    }
}&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;2. 다차원 배열&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 배열로, 여러 개의 1차원 배열을 요소로 가진 배열. 2차원 이상 배열을 의미.&lt;/p&gt;
&lt;pre id=&quot;code_1733118105322&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class 이차원배열 {
    public static void main(String[] args) {
        // 2차원 배열 선언 및 초기화
        int[][] matrix = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        };
        
        // 2차원 배열 출력
        for (int i = 0; i &amp;lt; matrix.length; i++) {
            for (int j = 0; j &amp;lt; matrix[i].length; j++) {
                System.out.print(matrix[i][j] + &quot; &quot;);
            }
            System.out.println();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1733118112459&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class 삼차원배열 {
    public static void main(String[] args) {
        // 3차원 배열 선언 및 초기화
        int[][][] cube = {
            {{1, 2}, {3, 4}},
            {{5, 6}, {7, 8}}
        };
        
        // 3차원 배열 출력
        for (int i = 0; i &amp;lt; cube.length; i++) {
            for (int j = 0; j &amp;lt; cube[i].length; j++) {
                for (int k = 0; k &amp;lt; cube[i][j].length; k++) {
                    System.out.print(cube[i][j][k] + &quot; &quot;);
                }
                System.out.println();
            }
        }
    }
}&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;3. 가변 배열(ArrayList)&lt;/b&gt;&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_1733118187830&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;

public class 가변배열 {
    public static void main(String[] args) {
        // ArrayList 선언
        ArrayList&amp;lt;Integer&amp;gt; numbers = new ArrayList&amp;lt;&amp;gt;();
        
        // 값 추가
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        
        // 출력
        for (int num : numbers) {
            System.out.println(num);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Arrays 클래스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열을 다룰 때 자주 사용되는 메소드들은 Arrays 클래스에 有. 배열 정렬, 검색, 복사, 비교 등의 작업을 효율적으로 처리할 수 있음&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;1. 배열 길이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 길이(배열의 요소 개수)를 구하려면 length 속성을 사용. 배열의 크기는 고정되므로, 배열이 생성된 후 변경할 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ length와 length() 차이&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YzTmh/btsK4sDC1BX/xBKukmykUbPvzfmllpBGh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YzTmh/btsK4sDC1BX/xBKukmykUbPvzfmllpBGh1/img.png&quot; data-alt=&quot;length와 length() 차이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YzTmh/btsK4sDC1BX/xBKukmykUbPvzfmllpBGh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYzTmh%2FbtsK4sDC1BX%2FxBKukmykUbPvzfmllpBGh1%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;600&quot; height=&quot;124&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;115&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;length와 length() 차이&lt;/figcaption&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;b&gt;2. 배열 복사( Arrays.copyOf(), System.arraycopy() )&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733118919794&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Arrays;

public class ArrayCopyEx {
    public static void main(String[] args) {
        int[] original = {1, 2, 3, 4, 5};
        int[] copy = Arrays.copyOf(original, original.length);  // 배열을 동일한 크기로 복사
        
        System.out.println(&quot;복사된 배열: &quot; + Arrays.toString(copy));  // [1, 2, 3, 4, 5]
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1733118932608&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class SystemArrayCopyEx {
    public static void main(String[] args) {
        int[] original = {1, 2, 3, 4, 5};
        int[] copy = new int[5];
        
        // System.arraycopy(원본 배열, 원본 시작 인덱스, 복사 배열, 복사 시작 인덱스, 복사할 길이)
        System.arraycopy(original, 0, copy, 0, original.length);
        
        System.out.println(&quot;복사된 배열: &quot; + Arrays.toString(copy));  // [1, 2, 3, 4, 5]
    }
}&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;※ 배열을 부분적으로 복사( Arrays.copyOfRange() )&lt;/p&gt;
&lt;pre id=&quot;code_1733119347489&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Arrays;

public class 배열부분적복사 {
    public static void main(String[] args) {
        int[] original = {1, 2, 3, 4, 5};
        
        // 배열의 2번째부터 4번째까지 복사
        int[] copied = Arrays.copyOfRange(original, 1, 4);
        
        System.out.println(&quot;복사된 배열: &quot; + Arrays.toString(copied));  // [2, 3, 4]
    }
}&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;3. 배열 정렬( Arrays.sort() )&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자, 문자, 문자열 유니코드 순서대로 오름차순 정렬&lt;/p&gt;
&lt;pre id=&quot;code_1733119032872&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Arrays;

public class 배열정렬 {
    public static void main(String[] args) {
        int[] numbers = {5, 3, 8, 1, 2};
        
        // 배열 오름차순 정렬
        Arrays.sort(numbers);
        
        System.out.println(&quot;정렬된 배열: &quot; + Arrays.toString(numbers));  // [1, 2, 3, 5, 8]
    }
}&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;4. 배열 역순 정렬( Arrays.sort() + Collections.reverseOrder() )&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733119219975&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Arrays;
import java.util.Collections;

public class 내림차순정렬 {
    public static void main(String[] args) {
        Integer[] numbers = {5, 3, 8, 1, 2};  // Integer 객체 배열
        Arrays.sort(numbers, Collections.reverseOrder());  // 내림차순 정렬
        
        System.out.println(&quot;내림차순 정렬된 배열: &quot; + Arrays.toString(numbers));  // [8, 5, 3, 2, 1]
    }
}&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;5. 배열 비교 ( Arrays.equals() )&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열이 동일한 값을 가지고 있는지 확인할 수 있음&lt;/p&gt;
&lt;pre id=&quot;code_1733119268406&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Arrays;

public class 배열내용비교 {
    public static void main(String[] args) {
        int[] arr1 = {1, 2, 3};
        int[] arr2 = {1, 2, 3};
        
        // 배열 내용 비교
        boolean isEqual = Arrays.equals(arr1, arr2);
        
        System.out.println(&quot;배열이 같은가? &quot; + isEqual);  // true
    }
}&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;6. 배열을 문자열로 변환 ( Arrays.toString() )&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733119308963&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Arrays;

public class 배열을문자열로변환 {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5};
        
        // 배열을 문자열로 변환
        String arrayStr = Arrays.toString(numbers);
        
        System.out.println(&quot;배열을 문자열로 변환: &quot; + arrayStr);  // [1, 2, 3, 4, 5]
    }
}&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;7. 배열 검색 ( Arrays.binarySearch() )&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬된 배열에서 특정 값을 검색할 때 사용. 반드시 정렬이 되어 있어야함. 이진 탐색을 기반&lt;/p&gt;
&lt;pre id=&quot;code_1733119408313&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Arrays;

public class 배열검색 {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5};
        
        // 이진 탐색
        int index = Arrays.binarySearch(numbers, 3);
        
        System.out.println(&quot;값 3의 인덱스: &quot; + index);  // 2
    }
}&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;a href=&quot;https://velog.io/@dlzlqlzl/Java-ArrayList-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-%EC%98%A4%EB%A6%84%EC%B0%A8%EC%88%9C-%EB%82%B4%EB%A6%BC%EC%B0%A8%EC%88%9C-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EC%9D%98-%EC%A0%95%EB%A0%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@dlzlqlzl/Java-ArrayList-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-%EC%98%A4%EB%A6%84%EC%B0%A8%EC%88%9C-%EB%82%B4%EB%A6%BC%EC%B0%A8%EC%88%9C-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EC%9D%98-%EC%A0%95%EB%A0%AC&lt;/a&gt;&lt;/p&gt;</description>
      <category>organize/코딩테스트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/304</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%9E%90%EB%B0%94-%EB%B0%B0%EC%97%B4%EA%B3%BC-%EB%B0%B0%EC%97%B4-%EC%A0%95%EB%A0%AC#entry304comment</comments>
      <pubDate>Mon, 2 Dec 2024 15:04:30 +0900</pubDate>
    </item>
    <item>
      <title>justBoard15 댓글 구현(6) 完</title>
      <link>https://001cloudid.tistory.com/entry/justBoard15-%EB%8C%93%EA%B8%80-%EA%B5%AC%ED%98%846</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oHrtp/btsKD4wcgtR/rkj319dyxmhZx7YV4JBAnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oHrtp/btsKD4wcgtR/rkj319dyxmhZx7YV4JBAnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oHrtp/btsKD4wcgtR/rkj319dyxmhZx7YV4JBAnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoHrtp%2FbtsKD4wcgtR%2Frkj319dyxmhZx7YV4JBAnk%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;1221&quot; height=&quot;707&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;707&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;댓글 페이징 처리를 숨겨야한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731287851238&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;%@ taglib prefix=&quot;fmt&quot; uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 550px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;글 읽기&amp;lt;/h1&amp;gt;
&amp;lt;table &amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;글번호&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.no}&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;${boardDTO.id}&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;${boardDTO.readcount}&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;fmt:formatDate pattern=&quot;yyyy-MM-dd hh:mm:ss&quot; value=&quot;${boardDTO.writetime}&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;${boardDTO.subject}&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;${boardDTO.content}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div style=&quot;display: center&quot;&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;c:if test=&quot;${sessionScope.id eq boardDTO.id}&quot;&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/update?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 수정&quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;${pageContext.request.contextPath}/board/delete?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 삭제&quot;&amp;gt;&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/list&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 목록&quot;&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;hr&amp;gt;
&amp;lt;c:if test=&quot;${empty sessionScope.id }&quot;&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;댓글은 회원만 작성 및 확인 할 수 있습니다. 확인을 위해서 회원 가입해주세요.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
댓글&amp;lt;br&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/board/replyInsertPro&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${boardDTO.no }&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;textarea rows=&quot;5&quot; cols=&quot;30&quot; style=&quot;width: 792px; height: 35px&quot; placeholder=&quot;내용을 작성해주세요.&quot; name=&quot;replyContent&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;&amp;lt;input type=&quot;checkbox&quot; name=&quot;replyHidden&quot; value=&quot;true&quot;&amp;gt;비밀글 &amp;lt;input type=&quot;hidden&quot; name=&quot;replyHidden&quot; value=&quot;false&quot;&amp;gt;&amp;lt;input type=&quot;submit&quot; value=&quot;작성&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
댓글 목록 &amp;lt;sub&amp;gt;비밀 댓글은 굵게 표시됩니다.&amp;lt;/sub&amp;gt;&amp;lt;br&amp;gt;
    &amp;lt;c:if test=&quot;${empty replyList}&quot;&amp;gt;
        작성된 댓글이 없습니다.
    &amp;lt;/c:if&amp;gt;
    &amp;lt;c:if test=&quot;${!empty replyList}&quot;&amp;gt;
        &amp;lt;table&amp;gt;
            &amp;lt;c:forEach var=&quot;replyDTO&quot; items=&quot;${replyList}&quot;&amp;gt;
                &amp;lt;tr&amp;gt;
                    &amp;lt;c:choose&amp;gt;
                        &amp;lt;c:when test=&quot;${replyDTO.replyHidden &amp;amp;&amp;amp; replyDTO.id != sessionScope.id}&quot;&amp;gt;
                            &amp;lt;td style=&quot;width: 600px&quot;&amp;gt;작성자: ${replyDTO.id}&amp;lt;/td&amp;gt;
                            &amp;lt;td style=&quot;width: 1000px&quot;&amp;gt;비밀글입니다.&amp;lt;/td&amp;gt;
                            &amp;lt;td style=&quot;width: 600px&quot;&amp;gt;작성시간: &amp;lt;fmt:formatDate pattern=&quot;yyyy-MM-dd hh:mm:ss&quot; value=&quot;${replyDTO.replyWriteTime}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                        &amp;lt;/c:when&amp;gt;
                        &amp;lt;c:otherwise&amp;gt;
                            &amp;lt;td style=&quot;width: 600px&quot;&amp;gt;작성자: ${replyDTO.id}&amp;lt;/td&amp;gt;
                            &amp;lt;td style=&quot;width: 1000px&quot;&amp;gt;&amp;lt;b&amp;gt;내용: ${replyDTO.replyContent}&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;
                            &amp;lt;td style=&quot;width: 600px&quot;&amp;gt;작성시간: &amp;lt;fmt:formatDate pattern=&quot;yyyy-MM-dd hh:mm:ss&quot; value=&quot;${replyDTO.replyWriteTime}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                        &amp;lt;/c:otherwise&amp;gt;
                    &amp;lt;/c:choose&amp;gt;
                &amp;lt;/tr&amp;gt;
            &amp;lt;/c:forEach&amp;gt;
        &amp;lt;/table&amp;gt;
    &amp;lt;/c:if&amp;gt;
	    &amp;lt;div style=&quot;float: right;&quot;&amp;gt;
	    	&amp;lt;c:if test=&quot;${pageDTO.startPage &amp;gt; pageDTO.pageBlock}&quot;&amp;gt;
	    		&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/content?no=${boardDTO.no}&amp;amp;pageNum=${replyPageDTO.startPage - replyPageDTO.pageBlock}&quot;&amp;gt;Prev&amp;lt;/a&amp;gt;
			&amp;lt;/c:if&amp;gt;
	
			&amp;lt;c:forEach var=&quot;i&quot; begin=&quot;${replyPageDTO.startPage}&quot; end=&quot;${replyPageDTO.endPage}&quot; step=&quot;1&quot;&amp;gt;
	    		&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/content?no=${boardDTO.no}&amp;amp;pageNum=${i}&quot;&amp;gt;${i} &amp;lt;/a&amp;gt;
			&amp;lt;/c:forEach&amp;gt;
			&amp;lt;c:if test=&quot;${replyPageDTO.endPage &amp;lt; replyPageDTO.pageCount}&quot;&amp;gt;
		    	&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/content?no=${boardDTO.no}&amp;amp;pageNum=${replyPageDTO.startPage + replyPageDTO.pageBlock}&quot;&amp;gt;Next&amp;lt;/a&amp;gt;
			&amp;lt;/c:if&amp;gt;
	    &amp;lt;/div&amp;gt;
&amp;lt;/c:if&amp;gt;

&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&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;1230&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UYO6j/btsKCScW77p/3SMaHzji7UawKVpxduryc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UYO6j/btsKCScW77p/3SMaHzji7UawKVpxduryc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UYO6j/btsKCScW77p/3SMaHzji7UawKVpxduryc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUYO6j%2FbtsKCScW77p%2F3SMaHzji7UawKVpxduryc0%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;1230&quot; height=&quot;707&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;707&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;변수명을 잘 못 한 것 같다.&lt;br /&gt;id라는 것이 board, reply, member에 있는데 막상 만들다 보니 점점 어디의 어떤 게 id인지 혼동이 온다.&lt;/li&gt;
&lt;li&gt;유사한 점이 많아 게시판과 댓글을 한 로직에 코드를 작성했다.&lt;br /&gt;막상 점점 분량이 커지다보니 꼬인다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결 방법&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;변수명을 을 한 눈에 알아 볼 수 있도록 작성한다.&lt;br /&gt;id 같은 경우 member_id, board_id, reply_id로 하도록 한다.&lt;/li&gt;
&lt;li&gt;유사한 점이 많더라도 로직을 분리한다.&lt;/li&gt;
&lt;/ol&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇 주동안 일이 생겨서 흐름이 끊긴 것도 큰 것 같다.&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;1217&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQkwo7/btsKDd8KhUr/mUdxmOl4Zcgj9PLum8Z0F0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQkwo7/btsKDd8KhUr/mUdxmOl4Zcgj9PLum8Z0F0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQkwo7/btsKDd8KhUr/mUdxmOl4Zcgj9PLum8Z0F0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQkwo7%2FbtsKDd8KhUr%2FmUdxmOl4Zcgj9PLum8Z0F0%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;1217&quot; height=&quot;701&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1731292609843&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;%@ taglib prefix=&quot;fmt&quot; uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 550px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;글 읽기&amp;lt;/h1&amp;gt;
&amp;lt;table &amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;글번호&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.no}&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;${boardDTO.id}&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;${boardDTO.readcount}&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;fmt:formatDate pattern=&quot;yyyy-MM-dd hh:mm:ss&quot; value=&quot;${boardDTO.writetime}&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;${boardDTO.subject}&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;${boardDTO.content}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div style=&quot;display: center&quot;&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;c:if test=&quot;${sessionScope.id eq boardDTO.id}&quot;&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/update?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 수정&quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;${pageContext.request.contextPath}/board/delete?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 삭제&quot;&amp;gt;&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/list&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 목록&quot;&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;hr&amp;gt;
&amp;lt;c:if test=&quot;${empty sessionScope.id }&quot;&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;댓글은 회원만 작성 및 확인 할 수 있습니다. 확인을 위해서 회원 가입해주세요.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
댓글&amp;lt;br&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/board/replyInsertPro&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${boardDTO.no }&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;textarea rows=&quot;5&quot; cols=&quot;30&quot; style=&quot;width: 792px; height: 35px&quot; placeholder=&quot;내용을 작성해주세요.&quot; name=&quot;replyContent&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;&amp;lt;input type=&quot;submit&quot; value=&quot;작성&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
댓글 목록 &amp;lt;sub&amp;gt;&amp;lt;/sub&amp;gt;&amp;lt;br&amp;gt;
    &amp;lt;c:if test=&quot;${empty replyList}&quot;&amp;gt;
        작성된 댓글이 없습니다.
    &amp;lt;/c:if&amp;gt;
    &amp;lt;c:if test=&quot;${!empty replyList}&quot;&amp;gt;
        &amp;lt;table&amp;gt;
            &amp;lt;c:forEach var=&quot;replyDTO&quot; items=&quot;${replyList}&quot;&amp;gt;
                &amp;lt;tr&amp;gt;
                  &amp;lt;td style=&quot;width: 1600px&quot;&amp;gt;내용: ${replyDTO.replyContent}&amp;lt;/td&amp;gt;
                  &amp;lt;td style=&quot;width: 600px&quot;&amp;gt;작성시간: &amp;lt;fmt:formatDate pattern=&quot;yyyy-MM-dd hh:mm:ss&quot; value=&quot;${replyDTO.replyWriteTime}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;/tr&amp;gt;
            &amp;lt;/c:forEach&amp;gt;
        &amp;lt;/table&amp;gt;
    &amp;lt;/c:if&amp;gt;
	    &amp;lt;div style=&quot;float: right;&quot;&amp;gt;
	    	&amp;lt;c:if test=&quot;${pageDTO.startPage &amp;gt; pageDTO.pageBlock}&quot;&amp;gt;
	    		&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/content?no=${boardDTO.no}&amp;amp;pageNum=${replyPageDTO.startPage - replyPageDTO.pageBlock}&quot;&amp;gt;Prev&amp;lt;/a&amp;gt;
			&amp;lt;/c:if&amp;gt;
	
			&amp;lt;c:forEach var=&quot;i&quot; begin=&quot;${replyPageDTO.startPage}&quot; end=&quot;${replyPageDTO.endPage}&quot; step=&quot;1&quot;&amp;gt;
	    		&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/content?no=${boardDTO.no}&amp;amp;pageNum=${i}&quot;&amp;gt;${i} &amp;lt;/a&amp;gt;
			&amp;lt;/c:forEach&amp;gt;
			&amp;lt;c:if test=&quot;${replyPageDTO.endPage &amp;lt; replyPageDTO.pageCount}&quot;&amp;gt;
		    	&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/content?no=${boardDTO.no}&amp;amp;pageNum=${replyPageDTO.startPage + replyPageDTO.pageBlock}&quot;&amp;gt;Next&amp;lt;/a&amp;gt;
			&amp;lt;/c:if&amp;gt;
	    &amp;lt;/div&amp;gt;
&amp;lt;/c:if&amp;gt;

&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/303</guid>
      <comments>https://001cloudid.tistory.com/entry/justBoard15-%EB%8C%93%EA%B8%80-%EA%B5%AC%ED%98%846#entry303comment</comments>
      <pubDate>Mon, 11 Nov 2024 11:38:02 +0900</pubDate>
    </item>
    <item>
      <title>justBoard15 댓글 구현(5) 댓글 페이지 처리</title>
      <link>https://001cloudid.tistory.com/entry/justBoard15-%EB%8C%93%EA%B8%80-%EA%B5%AC%ED%98%845-%EB%8C%93%EA%B8%80-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%B2%98%EB%A6%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;댓글 페이지 처리는 게시판 글 페이지 처리와 마찬가지로 PageDTO를 이용하면 될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Controller, Service, DAO에 pageDTO객체만 추가해 주면 될 것 같다는 생각이 들었다.&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1729131899643&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/content&quot;)
	public String content(BoardDTO boardDTO, ReplyDTO replyDTO, PageDTO pageDTO,HttpServletRequest request, Model model) {
		System.out.println(&quot;BoardController Content()&quot;);
		boardDTO = boardService.getBoard(boardDTO); //글에 대한 정보
		boardService.readCount(boardDTO); //조회수
		
		//페이지
		int pageSize = 5; //화면에 보여줄 글의 개수
		String pageNum = request.getParameter(&quot;pageNum&quot;);
		if(pageNum ==null) {
			pageNum = &quot;1&quot;;
		}
		int currentPage =Integer.parseInt(pageNum);	//int형 currentPage 변수명에 pageNum을 정수형으로 변경	
		
		//pageDTO에 저장
		pageDTO.setPageSize(pageSize);
		pageDTO.setPageNum(pageNum);
		pageDTO.setCurrentPage(currentPage);
		
		
	    List&amp;lt;ReplyDTO&amp;gt; replyList = boardService.getReplyList(boardDTO.getNo(), pageDTO); // 게시글 번호를 사용
	    
	    model.addAttribute(&quot;pageDTO&quot;,pageDTO);
	    model.addAttribute(&quot;boardDTO&quot;, boardDTO);
	    model.addAttribute(&quot;replyDTO&quot;, replyDTO);
	    model.addAttribute(&quot;replyList&quot;, replyList); // 댓글 리스트 추가
		return &quot;board/content&quot;;
	}&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;BoardSerivce&lt;/p&gt;
&lt;pre id=&quot;code_1729131918000&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public List&amp;lt;ReplyDTO&amp;gt; getReplyList(int no, PageDTO pageDTO) {
		System.out.println(&quot;BoardService getReplyList()&quot;);
		return boardDAO.getReplyList(no, pageDTO);
	}&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;BoardDAO는 return값이 no과 pageDTO 두 개가 되어야하기 때문에 두 값을 Map을 사용하여 두 값을 변환할 수 있다.(검색을 통해 알아보았다.)&lt;/p&gt;
&lt;pre id=&quot;code_1729132278051&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public List&amp;lt;ReplyDTO&amp;gt; getReplyList(int no,PageDTO pageDTO) {
		System.out.println(&quot;BoardDAO getReplyList()&quot;);
		Map&amp;lt;String, Object&amp;gt; params = new HashMap&amp;lt;String, Object&amp;gt;();
		params.put(&quot;no&quot;, no);
		params.put(&quot;startRow&quot;, pageDTO.getStartRow());
		params.put(&quot;pageSize&quot;, pageDTO.getPageSize());
		return sqlSession.selectList(namespace+&quot;.getReplyList&quot;, params);
	}&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;여기서 Map을 배운지도, 사용한지도 오래되어 정리하고 지나가자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Map이란(인터페이스)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&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;br /&gt;요소의 저장 순서를 유지하지 않음.&lt;br /&gt;키는 중복 불가, 값은 중복 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Map 자주 사용하는 메소드&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;put&lt;br /&gt;Map에 데이터를 넣기, 추가&lt;br /&gt;/* 존재하는 경우 맵에서 키에 대한 매핑을 제거 */&lt;br /&gt;입력 시 지정한 타입에 맞게 값을 넣어줘야 함&lt;br /&gt;&lt;br /&gt;예시)&lt;br /&gt;Map&amp;lt;String, Object&amp;gt; param = new HashMap();&lt;br /&gt;param.put(&quot;번호&quot;,no);&lt;br /&gt;param.put(&quot;시작행&quot;, startRow);&lt;br /&gt;param.put(&quot;페이지크기&quot;, pageSize);&lt;br /&gt;&lt;br /&gt;MAP Table&lt;br /&gt;Key&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&amp;nbsp; value&lt;br /&gt;번호&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&amp;nbsp; no&lt;br /&gt;시작행&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&amp;nbsp; startRow&lt;br /&gt;페이지크기&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&amp;nbsp; pageSize&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;get&lt;br /&gt;원하는 데이터 출력&lt;br /&gt;/* 지정된 값을 이 맵의 지정된 키와 연결 */&lt;br /&gt;&lt;br /&gt;예시)&lt;br /&gt;System.out.println(map.get(&quot;번호&quot;)); //no&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;remove&lt;br /&gt;데이터 삭제&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;foreach문을 사용하여 Map 데이터 추출 (출처 : &lt;a href=&quot;https://sin0824.tistory.com/13&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://sin0824.tistory.com/13&lt;/a&gt;)&lt;br /&gt;-getKey : Map에 저장된 Key 출력&lt;br /&gt;-getValue : Map에 저장된 Value 출력&lt;br /&gt;&lt;br /&gt;예시)&lt;br /&gt;for(Entry&amp;lt;String, Object&amp;gt; entry : map.entrySet()){&lt;br /&gt;&amp;nbsp; &amp;nbsp; System.out.println(entry.getKey()); // 또는 System.out.println(entry.getValue());&lt;br /&gt;}&lt;br /&gt;//데이터 한 줄씩 출력&lt;br /&gt;for(Entry&amp;lt;string, object&amp;gt; entry : map.entrySet()){&lt;br /&gt;&amp;nbsp; &amp;nbsp; System.out.println(entry);&lt;br /&gt;}&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면으로 돌아가서 확인해 보니 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/50mcO/btsKcaxwRlw/ttDBoyDbRyiUztg69s79wK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/50mcO/btsKcaxwRlw/ttDBoyDbRyiUztg69s79wK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/50mcO/btsKcaxwRlw/ttDBoyDbRyiUztg69s79wK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F50mcO%2FbtsKcaxwRlw%2FttDBoyDbRyiUztg69s79wK%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;1232&quot; height=&quot;754&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에 보이는 댓글은 5개가 되는데 페이지가 증가하거나 하지 않음. 0을 클릭하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1617&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wfjJV/btsKbDm2u63/RFRgLQzINcygv2nNH2UAr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wfjJV/btsKbDm2u63/RFRgLQzINcygv2nNH2UAr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wfjJV/btsKbDm2u63/RFRgLQzINcygv2nNH2UAr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwfjJV%2FbtsKbDm2u63%2FRFRgLQzINcygv2nNH2UAr1%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;1617&quot; height=&quot;474&quot; data-origin-width=&quot;1617&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;startPage가 0으로 나타나는데 BoardDAO에 코드를 조금 수정해 보았다.&lt;/p&gt;
&lt;pre id=&quot;code_1729391607105&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public List&amp;lt;ReplyDTO&amp;gt; getReplyList(int no,PageDTO pageDTO) {
		System.out.println(&quot;BoardDAO getReplyList()&quot;);
		Map&amp;lt;String, Object&amp;gt; params = new HashMap&amp;lt;String, Object&amp;gt;();
		params.put(&quot;no&quot;, no);
//		params.put(&quot;startRow&quot;, pageDTO.getStartRow());
		params.put(&quot;startRow&quot;, (pageDTO.getCurrentPage()-1) * pageDTO.getPageSize());
		params.put(&quot;pageSize&quot;, pageDTO.getPageSize());
		return sqlSession.selectList(namespace+&quot;.getReplyList&quot;, params);
	}&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;그럼에도 변화가 없다. 댓글과 글의 페이지 처리를 별개로 관리하는 방식으로 해야 할 것 같다. 서로 로직이 비슷한 부분도 있지만 다른 부분도 있어 페이지 처리 로직이 다를 수 있기 때문이다. 따라서 ReplyPageDTO 클래스를 따로 분리해서 만들도록 해야겠다.&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;ReplyPageDTO&lt;/p&gt;
&lt;pre id=&quot;code_1729392263975&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.domain;

public class ReplyPageDTO {

    private int pageSize; //글의 개수
    private int currentPage; //현재 페이지
    private String pageNum;
    
    private int startRow; //시작하는 행 번호
    private int endRow; //끝나는 행 번호
    
    private int pageBlock; //한 화면에 보여 줄 페이지 개수
    private int startPage; //시작 페이지
    private int endPage; //끝 페이지
    
    private int count; //전체 글의 개수
    private int pageCount; //전체 페이지 개수
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public int getCurrentPage() {
		return currentPage;
	}
	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}
	public String getPageNum() {
		return pageNum;
	}
	public void setPageNum(String pageNum) {
		this.pageNum = pageNum;
	}
	public int getStartRow() {
		return startRow;
	}
	public void setStartRow(int startRow) {
		this.startRow = startRow;
	}
	public int getEndRow() {
		return endRow;
	}
	public void setEndRow(int endRow) {
		this.endRow = endRow;
	}
	public int getPageBlock() {
		return pageBlock;
	}
	public void setPageBlock(int pageBlock) {
		this.pageBlock = pageBlock;
	}
	public int getStartPage() {
		return startPage;
	}
	public void setStartPage(int startPage) {
		this.startPage = startPage;
	}
	public int getEndPage() {
		return endPage;
	}
	public void setEndPage(int endPage) {
		this.endPage = endPage;
	}
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
	public int getPageCount() {
		return pageCount;
	}
	public void setPageCount(int pageCount) {
		this.pageCount = pageCount;
	}
    
}&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1729393808951&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/content&quot;)
	public String content(BoardDTO boardDTO, ReplyDTO replyDTO, ReplyPageDTO replyPageDTO,HttpServletRequest request, Model model) {
		System.out.println(&quot;BoardController Content()&quot;);
		boardDTO = boardService.getBoard(boardDTO); //글에 대한 정보
		boardService.readCount(boardDTO); //조회수
		
		//페이지 처리
		int pageSize = 5; //화면에 보여줄 글의 개수
		String pageNum = request.getParameter(&quot;pageNum&quot;);
		if(pageNum ==null) {
			pageNum = &quot;1&quot;;
		}
		int currentPage =Integer.parseInt(pageNum);	//int형 currentPage 변수명에 pageNum을 정수형으로 변경	
		
		//replyPageDTO에 저장
		replyPageDTO.setPageSize(pageSize);
		replyPageDTO.setPageNum(pageNum);
		replyPageDTO.setCurrentPage(currentPage);
		
		//댓글 목록 조회
	    List&amp;lt;ReplyDTO&amp;gt; replyList = boardService.getReplyList(boardDTO.getNo(), replyPageDTO); // 게시글 번호를 사용
	    
	    //댓글 관련 설정
	    int count = boardService.getReplyCount(replyPageDTO); //전체 댓글의 개수 구하기
	    int pageBlock = 5; //한 화면에 보여줄 페이지 개수 설정
	    int startPage = (currentPage - 1) / pageBlock * pageBlock + 1; //한 화면에 보여 줄 시작 페이지
	    int endPage = startPage + pageBlock - 1; //한 화면에 보여 줄 끝 페이지
	    int pageCount = count / pageSize + (count % pageSize == 0? 0 : 1); //전체 페이지 개수
	    if(endPage &amp;gt; pageCount) {
	    	endPage = pageCount;
	    }
	    
	    //댓글 저장
	    replyPageDTO.setCount(count);
	    replyPageDTO.setPageBlock(pageBlock);
	    replyPageDTO.setStartPage(startPage);
	    replyPageDTO.setEndPage(endPage);
	    replyPageDTO.setPageCount(pageCount);
	    
	    model.addAttribute(&quot;replyPageDTO&quot;,replyPageDTO);
	    model.addAttribute(&quot;boardDTO&quot;, boardDTO);
	    model.addAttribute(&quot;replyDTO&quot;, replyDTO);
	    model.addAttribute(&quot;replyList&quot;, replyList); // 댓글 리스트 추가
		return &quot;board/content&quot;;
	}&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;BoardSerivce&lt;/p&gt;
&lt;pre id=&quot;code_1729393824006&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public List&amp;lt;ReplyDTO&amp;gt; getReplyList(int no, ReplyPageDTO replyPageDTO) {
		System.out.println(&quot;BoardService getReplyList()&quot;);
		
		//시작하는 행 번호 구하기(currentPage,pageSize)
		int currentPage = replyPageDTO.getCurrentPage();
		int pageSize = replyPageDTO.getPageSize();
		int startRow = (currentPage - 1) * pageSize + 1;
		int endRow = startRow + pageSize - 1;
		
		replyPageDTO.setStartRow(startRow - 1);
		replyPageDTO.setEndRow(endRow);
		
		return boardDAO.getReplyList(no, replyPageDTO);
	}
	
	public int getReplyCount(ReplyPageDTO replyPageDTO) {
		System.out.println(&quot;BoardSerivce getReplyCount()&quot;);
		return boardDAO.getReplyCount(replyPageDTO);
	}&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;BoardDAO&lt;/p&gt;
&lt;pre id=&quot;code_1729393834808&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public List&amp;lt;ReplyDTO&amp;gt; getReplyList(int no,ReplyPageDTO replyPageDTO) {
		System.out.println(&quot;BoardDAO getReplyList()&quot;);
		Map&amp;lt;String, Object&amp;gt; params = new HashMap&amp;lt;String, Object&amp;gt;();
		params.put(&quot;no&quot;, no);
		params.put(&quot;startRow&quot;, replyPageDTO.getStartRow());
		params.put(&quot;pageSize&quot;, replyPageDTO.getPageSize());
		return sqlSession.selectList(namespace+&quot;.getReplyList&quot;, params);
	}

	public int getReplyCount(ReplyPageDTO replyPageDTO) {
		System.out.println(&quot;BoardDAO getReplyCount()&quot;);
		return sqlSession.selectOne(namespace+&quot;.getReplyCount&quot;, replyPageDTO);
	}&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;boardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1729393849253&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;getReplyList&quot; resultType=&quot;com.mystory001.domain.ReplyDTO&quot;&amp;gt;
		select *
		from reply
		where `no` = #{no}
		order by replyWriteTime desc
		limit #{startRow}, #{pageSize}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;getReplyCount&quot; resultType=&quot;int&quot;&amp;gt;
		select count(*)
		from reply
		where `no` = #{no}
	&amp;lt;/select&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;문득 작성하고 나니 ReplyPageDTO에 no객체가 없어 문제가 생길 것이다. 또한 mapper에 join을 이용해서 sql을 작성해줘야 할 것 같다는 생각이 들었다.&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;679&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btHYXe/btsKccIPVYy/mBcqPTv1Npj3gnHmuMXrn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btHYXe/btsKccIPVYy/mBcqPTv1Npj3gnHmuMXrn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btHYXe/btsKccIPVYy/mBcqPTv1Npj3gnHmuMXrn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtHYXe%2FbtsKccIPVYy%2FmBcqPTv1Npj3gnHmuMXrn1%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;943&quot; height=&quot;679&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;679&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 예측이 맞았다. MyBatis가 ReplyPageDTO 클래스에서 no에 대한 객체에 대한 getter를 찾지 못했기 발생한 오류이다. 따라서 그에 맞는 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ReplyPageDTO&lt;/p&gt;
&lt;pre id=&quot;code_1729394131883&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    private int boardNo; //게시글 번호
    
	public int getBoardNo() {
		return boardNo;
	}
	public void setBoardNo(int boardNo) {
		this.boardNo = boardNo;
	}&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;BoardDTO와 같이 no로 작성하려 했으나 변수명을 보고 어떤 것인지 한눈에 알 수 있어야 하기 때문에 조금 수정했다.&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1729397220684&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/content&quot;)
	public String content(BoardDTO boardDTO, ReplyDTO replyDTO, ReplyPageDTO replyPageDTO,HttpServletRequest request, Model model) {
		System.out.println(&quot;BoardController Content()&quot;);
		boardDTO = boardService.getBoard(boardDTO); //글에 대한 정보
		boardService.readCount(boardDTO); //조회수
		
		//페이지 처리
		int pageSize = 5; //화면에 보여줄 글의 개수
		String pageNum = request.getParameter(&quot;pageNum&quot;);
		if(pageNum ==null) {
			pageNum = &quot;1&quot;;
		}
		int currentPage =Integer.parseInt(pageNum);	//int형 currentPage 변수명에 pageNum을 정수형으로 변경	
		
		//replyPageDTO에 저장
		replyPageDTO.setPageSize(pageSize);
		replyPageDTO.setPageNum(pageNum);
		replyPageDTO.setCurrentPage(currentPage);
		replyPageDTO.setBoardNo(boardDTO.getNo()); //게시글 번호
		
		//댓글 목록 조회
	    List&amp;lt;ReplyDTO&amp;gt; replyList = boardService.getReplyList(replyPageDTO.getBoardNo(), replyPageDTO); // 게시글 번호를 사용
	    
	    //댓글 관련 설정
	    int count = boardService.getReplyCount(replyPageDTO.getBoardNo()); //전체 댓글의 개수 구하기
	    int pageBlock = 5; //한 화면에 보여줄 페이지 개수 설정
	    int startPage = (currentPage - 1) / pageBlock * pageBlock + 1; //한 화면에 보여 줄 시작 페이지
	    int endPage = startPage + pageBlock - 1; //한 화면에 보여 줄 끝 페이지
	    int pageCount = count / pageSize + (count % pageSize == 0? 0 : 1); //전체 페이지 개수
	    if(endPage &amp;gt; pageCount) {
	    	endPage = pageCount;
	    }
	    
	    //댓글 저장
	    replyPageDTO.setCount(count);
	    replyPageDTO.setPageBlock(pageBlock);
	    replyPageDTO.setStartPage(startPage);
	    replyPageDTO.setEndPage(endPage);
	    replyPageDTO.setPageCount(pageCount);
	    
	    model.addAttribute(&quot;replyPageDTO&quot;,replyPageDTO);
	    model.addAttribute(&quot;boardDTO&quot;, boardDTO);
	    model.addAttribute(&quot;replyDTO&quot;, replyDTO);
	    model.addAttribute(&quot;replyList&quot;, replyList); // 댓글 리스트 추가
		return &quot;board/content&quot;;
	}&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;BoardService&lt;/p&gt;
&lt;pre id=&quot;code_1729397233153&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public List&amp;lt;ReplyDTO&amp;gt; getReplyList(int boardNo, ReplyPageDTO replyPageDTO) {
		System.out.println(&quot;BoardService getReplyList()&quot;);
		
		//시작하는 행 번호 구하기(currentPage,pageSize)
		int currentPage = replyPageDTO.getCurrentPage();
		int pageSize = replyPageDTO.getPageSize();
		int startRow = (currentPage - 1) * pageSize + 1;
		int endRow = startRow + pageSize - 1;
		
		replyPageDTO.setStartRow(startRow - 1);
		replyPageDTO.setEndRow(endRow);
		
		return boardDAO.getReplyList(boardNo, replyPageDTO);
	}
	
	public int getReplyCount(int boardNo) {
		System.out.println(&quot;BoardSerivce getReplyCount()&quot;);
		return boardDAO.getReplyCount(boardNo);
	}&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;BoardDAO&lt;/p&gt;
&lt;pre id=&quot;code_1729397248621&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public List&amp;lt;ReplyDTO&amp;gt; getReplyList(int boardNo,ReplyPageDTO replyPageDTO) {
		System.out.println(&quot;BoardDAO getReplyList()&quot;);
		Map&amp;lt;String, Object&amp;gt; params = new HashMap&amp;lt;String, Object&amp;gt;();
		params.put(&quot;boardNo&quot;, boardNo);
		params.put(&quot;startRow&quot;, replyPageDTO.getStartRow());
		params.put(&quot;pageSize&quot;, replyPageDTO.getPageSize());
		return sqlSession.selectList(namespace+&quot;.getReplyList&quot;, params);
	}

	public int getReplyCount(int boardNo) {
		System.out.println(&quot;BoardDAO getReplyCount()&quot;);
		return sqlSession.selectOne(namespace+&quot;.getReplyCount&quot;, boardNo);
	}&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;boardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1729397296465&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;getReplyList&quot; resultType=&quot;com.mystory001.domain.ReplyDTO&quot;&amp;gt;
		select b.id, r.replyContent,r.replyWriteTime,r.`no`
		from board b join reply r on b.`no` = r.`no`
		where b.`no` = #{no}
		order by replyWriteTime desc
		limit #{startRow}, #{pageSize}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;getReplyCount&quot; resultType=&quot;int&quot;&amp;gt;
		select count(*)
		from reply
		where `no` = #{no}
	&amp;lt;/select&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;749&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R6r6m/btsKdxSPb1u/yj3XenlAaI6GwYTUAkekOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R6r6m/btsKdxSPb1u/yj3XenlAaI6GwYTUAkekOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R6r6m/btsKdxSPb1u/yj3XenlAaI6GwYTUAkekOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR6r6m%2FbtsKdxSPb1u%2Fyj3XenlAaI6GwYTUAkekOk%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;1216&quot; height=&quot;749&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;749&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인을 했는데 댓글을 확인할 수 없음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qIM5i/btsKbBbyLv8/fkpZNY5crIKjjwXQeGLe4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qIM5i/btsKbBbyLv8/fkpZNY5crIKjjwXQeGLe4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qIM5i/btsKbBbyLv8/fkpZNY5crIKjjwXQeGLe4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqIM5i%2FbtsKbBbyLv8%2FfkpZNY5crIKjjwXQeGLe4K%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;1217&quot; height=&quot;750&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;그래서 댓글 개수가 넘어오는지에 대해 찾아보니 0으로 뜸&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;669&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Mb7P/btsKdoVYOnz/1CJbIRLFoeheY4n4WvYQM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Mb7P/btsKdoVYOnz/1CJbIRLFoeheY4n4WvYQM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Mb7P/btsKdoVYOnz/1CJbIRLFoeheY4n4WvYQM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Mb7P%2FbtsKdoVYOnz%2F1CJbIRLFoeheY4n4WvYQM1%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;794&quot; height=&quot;669&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;669&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;댓글 개수가 0으로 나온다.&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;content.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1729401333143&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;%@ taglib prefix=&quot;fmt&quot; uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;글 읽기&amp;lt;/h1&amp;gt;
&amp;lt;table &amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;글번호&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.no}&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;${boardDTO.id}&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;${boardDTO.readcount}&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;fmt:formatDate pattern=&quot;yyyy-MM-dd hh:mm:ss&quot; value=&quot;${boardDTO.writetime}&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;${boardDTO.subject}&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;${boardDTO.content}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div style=&quot;display: center&quot;&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;c:if test=&quot;${sessionScope.id eq boardDTO.id}&quot;&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/update?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 수정&quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;${pageContext.request.contextPath}/board/delete?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 삭제&quot;&amp;gt;&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/list&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 목록&quot;&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;hr&amp;gt;
&amp;lt;c:if test=&quot;${empty sessionScope.id }&quot;&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;댓글은 회원만 작성 및 확인 할 수 있습니다. 확인을 위해서 회원 가입해주세요.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
댓글&amp;lt;br&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/board/replyInsertPro&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${replyDTO.no }&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;textarea rows=&quot;5&quot; cols=&quot;30&quot; style=&quot;width: 792px; height: 35px&quot; placeholder=&quot;내용을 작성해주세요.&quot; name=&quot;replyContent&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;&amp;lt;input type=&quot;checkbox&quot; name=&quot;replyHidden&quot; value=&quot;true&quot;&amp;gt;비밀글 &amp;lt;input type=&quot;hidden&quot; name=&quot;replyHidden&quot; value=&quot;false&quot;&amp;gt;&amp;lt;input type=&quot;submit&quot; value=&quot;작성&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
댓글 목록 &amp;lt;sub&amp;gt;비밀 댓글은 굵게 표시됩니다.&amp;lt;/sub&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;c:if test=&quot;${empty replyList }&quot;&amp;gt;
작성된 댓글이 없습니다. 
&amp;lt;/c:if&amp;gt;
&amp;lt;c:if test=&quot;${!empty replyList}&quot;&amp;gt;
    &amp;lt;table&amp;gt;
        &amp;lt;c:forEach var=&quot;replyDTO&quot; items=&quot;${replyList}&quot;&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;c:if test=&quot;${replyDTO.replyHidden == false}&quot;&amp;gt;
                    &amp;lt;td&amp;gt;작성자: ${replyDTO.id}&amp;lt;/td&amp;gt;
                    &amp;lt;td&amp;gt;내용: ${replyDTO.replyContent}&amp;lt;/td&amp;gt;
                    &amp;lt;td&amp;gt;작성시간: &amp;lt;fmt:formatDate pattern=&quot;yyyy-MM-dd hh:mm:ss&quot; value=&quot;${replyDTO.replyWriteTime}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;/c:if&amp;gt;
                &amp;lt;c:if test=&quot;${replyDTO.replyHidden == true}&quot;&amp;gt;
                    &amp;lt;c:if test=&quot;${empty sessionScope.id}&quot;&amp;gt;
                        &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;권한이 없습니다.&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;
                    &amp;lt;/c:if&amp;gt;
                    &amp;lt;c:if test=&quot;${sessionScope.id eq replyDTO.id or sessionScope.id eq boardDTO.id}&quot;&amp;gt;
                        &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;작성자: ${replyDTO.id}&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;
                        &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;내용: ${replyDTO.replyContent}&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;
                        &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;작성시간: &amp;lt;fmt:formatDate pattern=&quot;yyyy-MM-dd hh:mm:ss&quot; value=&quot;${replyDTO.replyWriteTime}&quot; /&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;
                    &amp;lt;/c:if&amp;gt;
                &amp;lt;/c:if&amp;gt;
            &amp;lt;/tr&amp;gt;
        &amp;lt;/c:forEach&amp;gt;
    &amp;lt;/table&amp;gt;
&amp;lt;/c:if&amp;gt;
	&amp;lt;c:if test=&quot;${pageDTO.startPage &amp;gt; pageDTO.pageBlock}&quot;&amp;gt;
    	&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/content?no=${boardDTO.no}&amp;amp;pageNum=${replyPageDTO.startPage - replyPageDTO.pageBlock}&quot;&amp;gt;Prev&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;

	&amp;lt;c:forEach var=&quot;i&quot; begin=&quot;${replyPageDTO.startPage}&quot; end=&quot;${replyPageDTO.endPage}&quot; step=&quot;1&quot;&amp;gt;
    	&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/content?no=${boardDTO.no}&amp;amp;pageNum=${i}&quot;&amp;gt;${i}&amp;lt;/a&amp;gt;
	&amp;lt;/c:forEach&amp;gt;

	&amp;lt;c:if test=&quot;${replyPageDTO.endPage &amp;lt; replyPageDTO.pageCount}&quot;&amp;gt;
    	&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/content?no=${boardDTO.no}&amp;amp;pageNum=${replyPageDTO.startPage + replyPageDTO.pageBlock}&quot;&amp;gt;Next&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1729401348953&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/content&quot;)
	public String content(BoardDTO boardDTO, ReplyDTO replyDTO, ReplyPageDTO replyPageDTO,HttpServletRequest request, Model model) {
		System.out.println(&quot;BoardController Content()&quot;);
		boardDTO = boardService.getBoard(boardDTO); //글에 대한 정보
		boardService.readCount(boardDTO); //조회수
		
		//댓글 페이지 처리
		int pageSize = 5; //화면에 보여줄 글의 개수
		String pageNum = request.getParameter(&quot;pageNum&quot;);
		if(pageNum ==null) {
			pageNum = &quot;1&quot;;
		}
		int currentPage =Integer.parseInt(pageNum);	//int형 currentPage 변수명에 pageNum을 정수형으로 변경	
		
		//replyPageDTO에 저장
		replyPageDTO.setPageSize(pageSize);
		replyPageDTO.setPageNum(pageNum);
		replyPageDTO.setCurrentPage(currentPage);
		replyPageDTO.setBoardNo(boardDTO.getNo()); //게시글 번호
		
		//댓글 목록 조회
		List&amp;lt;ReplyDTO&amp;gt; replyList = boardService.getReplyList(replyPageDTO.getBoardNo(), replyPageDTO); // 게시글 번호를 사용
	    
	    //댓글 관련 설정
	    int count = boardService.getReplyCount(replyPageDTO.getBoardNo()); //전체 댓글의 개수 구하기
	    int pageBlock = 5; //한 화면에 보여줄 페이지 개수 설정
	    int startPage = (currentPage - 1) / pageBlock * pageBlock + 1; //한 화면에 보여 줄 시작 페이지
	    int endPage = startPage + pageBlock - 1; //한 화면에 보여 줄 끝 페이지
	    int pageCount = count / pageSize + (count % pageSize == 0? 0 : 1); //전체 페이지 개수
	    if(endPage &amp;gt; pageCount) {
	    	endPage = pageCount;
	    }
	    
	    //댓글 저장
	    replyPageDTO.setCount(count);
	    replyPageDTO.setPageBlock(pageBlock);
	    replyPageDTO.setStartPage(startPage);
	    replyPageDTO.setEndPage(endPage);
	    replyPageDTO.setPageCount(pageCount);
	    
	    //모델에 데이터 추가
	    model.addAttribute(&quot;replyPageDTO&quot;,replyPageDTO);
	    model.addAttribute(&quot;boardDTO&quot;, boardDTO);
	    model.addAttribute(&quot;replyDTO&quot;, replyDTO);
	    model.addAttribute(&quot;replyList&quot;, replyList); // 댓글 리스트 추가
		return &quot;board/content&quot;;
	}&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;BoardService&lt;/p&gt;
&lt;pre id=&quot;code_1729401363964&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public List&amp;lt;ReplyDTO&amp;gt; getReplyList(int boardNo, ReplyPageDTO replyPageDTO) {
		System.out.println(&quot;BoardService getReplyList()&quot;);
		
		
		//시작하는 행 번호 구하기(currentPage,pageSize)
		int currentPage = replyPageDTO.getCurrentPage();
		int pageSize = replyPageDTO.getPageSize();
		int startRow = (currentPage - 1) * pageSize + 1;
		int endRow = startRow + pageSize - 1;
		
		replyPageDTO.setStartRow(startRow - 1);
		replyPageDTO.setEndRow(endRow);
		
		return boardDAO.getReplyList(boardNo, replyPageDTO);
	}
	
	public int getReplyCount(int boardNo) {
		System.out.println(&quot;BoardSerivce getReplyCount()&quot;);
		return boardDAO.getReplyCount(boardNo);
	}&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;BoardDAO&lt;/p&gt;
&lt;pre id=&quot;code_1729401373538&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public List&amp;lt;ReplyDTO&amp;gt; getReplyList(int boardNo, ReplyPageDTO replyPageDTO) {
		System.out.println(&quot;BoardDAO getReplyList()&quot;);
		
		Map&amp;lt;String, Object&amp;gt; params = new HashMap&amp;lt;String, Object&amp;gt;();
		params.put(&quot;boardNo&quot;, boardNo);
		params.put(&quot;startRow&quot;, replyPageDTO.getStartRow());
		params.put(&quot;pageSize&quot;, replyPageDTO.getPageSize());
		return sqlSession.selectList(namespace+&quot;.getReplyList&quot;, params);
	}

	public int getReplyCount(int boardNo) {
		System.out.println(&quot;BoardDAO getReplyCount()&quot;);
		return sqlSession.selectOne(namespace+&quot;.getReplyCount&quot;, boardNo);
	}&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;boardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1729401385442&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;getReplyList&quot; resultType=&quot;com.mystory001.domain.ReplyDTO&quot;&amp;gt;
		select b.id, r.replyContent,r.replyHidden, r.replyWriteTime,r.`no`
		from board b join reply r on b.`no` = r.`no`
		where b.`no` = #{no}
		order by replyWriteTime desc
		limit #{startRow}, #{pageSize}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;getReplyCount&quot; resultType=&quot;int&quot;&amp;gt;
		select count(*)
		from reply
		where `no` = #{no}
	&amp;lt;/select&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;/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;replyList가 null인 것 같은데 이를 가져와야할 듯하다. 글 번호를 가지고&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1729402629304&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/content&quot;)
	public String content(BoardDTO boardDTO, ReplyDTO replyDTO, ReplyPageDTO replyPageDTO,HttpServletRequest request, Model model) {
		System.out.println(&quot;BoardController Content()&quot;);
		boardDTO = boardService.getBoard(boardDTO); //글에 대한 정보
		boardService.readCount(boardDTO); //조회수
		
		//댓글 페이지 처리
		int pageSize = 5; //화면에 보여줄 글의 개수
		String pageNum = request.getParameter(&quot;pageNum&quot;);
		if(pageNum ==null) {
			pageNum = &quot;1&quot;;
		}
		int currentPage =Integer.parseInt(pageNum);	//int형 currentPage 변수명에 pageNum을 정수형으로 변경	
		
		//replyPageDTO에 저장
		replyPageDTO.setPageSize(pageSize);
		replyPageDTO.setPageNum(pageNum);
		replyPageDTO.setCurrentPage(currentPage);
		replyPageDTO.setBoardNo(boardDTO.getNo()); //게시글 번호
		
		//댓글 목록 조회
		List&amp;lt;ReplyDTO&amp;gt; replyList = boardService.getReplyList(replyPageDTO.getBoardNo(), replyPageDTO); // 게시글 번호를 사용
	    
	    //댓글 관련 설정
	    int count = boardService.getReplyCount(replyPageDTO.getBoardNo()); //전체 댓글의 개수 구하기
	    int pageBlock = 5; //한 화면에 보여줄 페이지 개수 설정
	    int startPage = (currentPage - 1) / pageBlock * pageBlock + 1; //한 화면에 보여 줄 시작 페이지
	    int endPage = startPage + pageBlock - 1; //한 화면에 보여 줄 끝 페이지
	    int pageCount = count / pageSize + (count % pageSize == 0? 0 : 1); //전체 페이지 개수
	    if(endPage &amp;gt; pageCount) {
	    	endPage = pageCount;
	    }
	    
	    //댓글 저장
	    replyPageDTO.setCount(count);
	    replyPageDTO.setPageBlock(pageBlock);
	    replyPageDTO.setStartPage(startPage);
	    replyPageDTO.setEndPage(endPage);
	    replyPageDTO.setPageCount(pageCount);
	    
	    //모델에 데이터 추가
	    model.addAttribute(&quot;replyPageDTO&quot;,replyPageDTO);
	    model.addAttribute(&quot;boardDTO&quot;, boardDTO);
	    model.addAttribute(&quot;replyDTO&quot;, replyDTO);
	    model.addAttribute(&quot;replyList&quot;, replyList); // 댓글 리스트 추가
		return &quot;board/content&quot;;
	}&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;BoardService&lt;/p&gt;
&lt;pre id=&quot;code_1729402643889&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public List&amp;lt;ReplyDTO&amp;gt; getReplyList(int boardNo, ReplyPageDTO replyPageDTO) {
		System.out.println(&quot;BoardService getReplyList()&quot;);
		
		//시작하는 행 번호 구하기(currentPage,pageSize)
		int currentPage = replyPageDTO.getCurrentPage();
		int pageSize = replyPageDTO.getPageSize();
		int startRow = (currentPage - 1) * pageSize + 1;
		int endRow = startRow + pageSize - 1;
		
		replyPageDTO.setStartRow(startRow - 1);
		replyPageDTO.setEndRow(endRow);
		
		return boardDAO.getReplyList(boardNo, replyPageDTO);
	}
	
	public int getReplyCount(int boardNo) {
		System.out.println(&quot;BoardSerivce getReplyCount()&quot;);
		return boardDAO.getReplyCount(boardNo);
	}&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;BoardDAO&lt;/p&gt;
&lt;pre id=&quot;code_1729403016410&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public List&amp;lt;ReplyDTO&amp;gt; getReplyList(int boardNo, ReplyPageDTO replyPageDTO) {
		System.out.println(&quot;BoardDAO getReplyList()&quot;);
		
		Map&amp;lt;String, Object&amp;gt; params = new HashMap&amp;lt;String, Object&amp;gt;();
		params.put(&quot;boardNo&quot;, boardNo);
		params.put(&quot;startRow&quot;, replyPageDTO.getStartRow());
		params.put(&quot;pageSize&quot;, replyPageDTO.getPageSize());
		return sqlSession.selectList(namespace+&quot;.getReplyList&quot;, params);
	}

	public int getReplyCount(int boardNo) {
		System.out.println(&quot;BoardDAO getReplyCount()&quot;);
		return sqlSession.selectOne(namespace+&quot;.getReplyCount&quot;, boardNo);
	}&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;boardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1729403028971&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;getReplyList&quot; resultType=&quot;com.mystory001.domain.ReplyDTO&quot;&amp;gt;
		select b.id, r.replyContent,r.replyHidden, r.replyWriteTime,r.`no`
		from board b join reply r on b.`no` = r.`no`
		where b.`no` = #{boardNo}
		order by r.replyWriteTime desc
		limit #{startRow}, #{pageSize}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;getReplyCount&quot; resultType=&quot;int&quot;&amp;gt;
		select count(*)
		from reply
		where `no` = #{no}
	&amp;lt;/select&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;content.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1729403712285&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;%@ taglib prefix=&quot;fmt&quot; uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 550px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;글 읽기&amp;lt;/h1&amp;gt;
&amp;lt;table &amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;글번호&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.no}&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;${boardDTO.id}&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;${boardDTO.readcount}&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;fmt:formatDate pattern=&quot;yyyy-MM-dd hh:mm:ss&quot; value=&quot;${boardDTO.writetime}&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;${boardDTO.subject}&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;${boardDTO.content}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div style=&quot;display: center&quot;&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;c:if test=&quot;${sessionScope.id eq boardDTO.id}&quot;&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/update?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 수정&quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;${pageContext.request.contextPath}/board/delete?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 삭제&quot;&amp;gt;&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/list&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 목록&quot;&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;hr&amp;gt;
&amp;lt;c:if test=&quot;${empty sessionScope.id }&quot;&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;댓글은 회원만 작성 및 확인 할 수 있습니다. 확인을 위해서 회원 가입해주세요.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
댓글&amp;lt;br&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/board/replyInsertPro&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${replyDTO.no }&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;textarea rows=&quot;5&quot; cols=&quot;30&quot; style=&quot;width: 792px; height: 35px&quot; placeholder=&quot;내용을 작성해주세요.&quot; name=&quot;replyContent&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;&amp;lt;input type=&quot;checkbox&quot; name=&quot;replyHidden&quot; value=&quot;true&quot;&amp;gt;비밀글 &amp;lt;input type=&quot;hidden&quot; name=&quot;replyHidden&quot; value=&quot;false&quot;&amp;gt;&amp;lt;input type=&quot;submit&quot; value=&quot;작성&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
댓글 목록 &amp;lt;sub&amp;gt;비밀 댓글은 굵게 표시됩니다.&amp;lt;/sub&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;c:if test=&quot;${empty replyList }&quot;&amp;gt;
작성된 댓글이 없습니다. 
&amp;lt;/c:if&amp;gt;
&amp;lt;c:if test=&quot;${!empty replyList}&quot;&amp;gt;
&amp;lt;%--     &amp;lt;c:out value=&quot;${replyList.size()}&quot; /&amp;gt; 댓글 개수 --%&amp;gt;
    &amp;lt;table&amp;gt;
        &amp;lt;c:forEach var=&quot;replyDTO&quot; items=&quot;${replyList}&quot;&amp;gt;
            &amp;lt;tr&amp;gt;
            &amp;lt;%-- replyHidden = 1이면 =&amp;gt; 비밀글 =&amp;gt; 굵게.  --%&amp;gt;
                     &amp;lt;c:if test=&quot;${replyDTO.replyHidden &amp;amp;&amp;amp; replyDTO.id != sessionScope.id}&quot;&amp;gt;
                        &amp;lt;td style=&quot;width: 600px&quot;&amp;gt;작성자: ${replyDTO.id}&amp;lt;/td&amp;gt;
                        &amp;lt;td style=&quot;width: 1000px&quot;&amp;gt;비밀글입니다.&amp;lt;/td&amp;gt;
                        &amp;lt;td style=&quot;width: 600px&quot;&amp;gt;작성시간: &amp;lt;fmt:formatDate pattern=&quot;yyyy-MM-dd hh:mm:ss&quot; value=&quot;${replyDTO.replyWriteTime}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                    &amp;lt;/c:if&amp;gt;
                    &amp;lt;c:if test=&quot;${!replyDTO.replyHidden || replyDTO.id == sessionScope.id}&quot;&amp;gt;
                        &amp;lt;td style=&quot;width: 600px&quot;&amp;gt;작성자: ${replyDTO.id}&amp;lt;/td&amp;gt;
                        &amp;lt;td style=&quot;width: 1000px&quot;&amp;gt;&amp;lt;b&amp;gt;내용: ${replyDTO.replyContent}&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;
                        &amp;lt;td style=&quot;width: 600px&quot;&amp;gt;작성시간: &amp;lt;fmt:formatDate pattern=&quot;yyyy-MM-dd hh:mm:ss&quot; value=&quot;${replyDTO.replyWriteTime}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
                    &amp;lt;/c:if&amp;gt;
                &amp;lt;/tr&amp;gt;              
        &amp;lt;/c:forEach&amp;gt;
    &amp;lt;/table&amp;gt;
    
    &amp;lt;div style=&quot;float: right;&quot;&amp;gt;
    
    &amp;lt;c:if test=&quot;${pageDTO.startPage &amp;gt; pageDTO.pageBlock}&quot;&amp;gt;
    	&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/content?no=${boardDTO.no}&amp;amp;pageNum=${replyPageDTO.startPage - replyPageDTO.pageBlock}&quot;&amp;gt;Prev&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;

	&amp;lt;c:forEach var=&quot;i&quot; begin=&quot;${replyPageDTO.startPage}&quot; end=&quot;${replyPageDTO.endPage}&quot; step=&quot;1&quot;&amp;gt;
    	&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/content?no=${boardDTO.no}&amp;amp;pageNum=${i}&quot;&amp;gt;${i} &amp;lt;/a&amp;gt;
	&amp;lt;/c:forEach&amp;gt;

	&amp;lt;c:if test=&quot;${replyPageDTO.endPage &amp;lt; replyPageDTO.pageCount}&quot;&amp;gt;
    	&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/content?no=${boardDTO.no}&amp;amp;pageNum=${replyPageDTO.startPage + replyPageDTO.pageBlock}&quot;&amp;gt;Next&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;
    &amp;lt;/div&amp;gt;

&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUZcwM/btsKb4YvwiI/O8uz1AcxgIZC5MxrHX3s3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUZcwM/btsKb4YvwiI/O8uz1AcxgIZC5MxrHX3s3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUZcwM/btsKb4YvwiI/O8uz1AcxgIZC5MxrHX3s3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUZcwM%2FbtsKb4YvwiI%2FO8uz1AcxgIZC5MxrHX3s3K%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;1217&quot; height=&quot;703&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;댓글 작성자는 d2인데 글 작성자와 같게 되는 문제가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB에는?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0fJ6H/btsKb2T4Mr2/8V3nF5iMNRqlfJRk2BIegk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0fJ6H/btsKb2T4Mr2/8V3nF5iMNRqlfJRk2BIegk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0fJ6H/btsKb2T4Mr2/8V3nF5iMNRqlfJRk2BIegk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0fJ6H%2FbtsKb2T4Mr2%2F8V3nF5iMNRqlfJRk2BIegk%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;724&quot; height=&quot;416&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller에서 세션에 사용자 ID를 가져올 수 있도록 코드를 추가해줘야함&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1729404131887&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/replyInsertPro&quot;)
	public String replyInsertPro(ReplyDTO replyDTO, Model model, HttpServletRequest request) {
		System.out.println(&quot;BoardController replyInsertPro()&quot;);
		
		//세션에 사용자ID 가져오기
		HttpSession session = request.getSession();
		String userID = (String)session.getAttribute(&quot;id&quot;);
		if(userID !=null ) {
			replyDTO.setId(userID); //댓글 작성자 ID 설정
		}
		
		boardService.replyInsert(replyDTO);
		return &quot;redirect:/board/content?no=&quot;+replyDTO.getNo();
	}&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;697&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckmTM8/btsKcNvjPIm/San6PIJA1SmwnUYNok32k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckmTM8/btsKcNvjPIm/San6PIJA1SmwnUYNok32k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckmTM8/btsKcNvjPIm/San6PIJA1SmwnUYNok32k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckmTM8%2FbtsKcNvjPIm%2FSan6PIJA1SmwnUYNok32k0%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;1214&quot; height=&quot;697&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;697&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 작성자가 여전히 글쓴이와 동일함.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHWIug/btsKduu3uDV/DmnXgxqIg0mj8wCdwBgsSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHWIug/btsKduu3uDV/DmnXgxqIg0mj8wCdwBgsSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHWIug/btsKduu3uDV/DmnXgxqIg0mj8wCdwBgsSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHWIug%2FbtsKduu3uDV%2FDmnXgxqIg0mj8wCdwBgsSk%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;831&quot; height=&quot;283&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;283&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;/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;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/301</guid>
      <comments>https://001cloudid.tistory.com/entry/justBoard15-%EB%8C%93%EA%B8%80-%EA%B5%AC%ED%98%845-%EB%8C%93%EA%B8%80-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%B2%98%EB%A6%AC#entry301comment</comments>
      <pubDate>Sun, 20 Oct 2024 15:32:10 +0900</pubDate>
    </item>
    <item>
      <title>justBoard14 댓글 구현(4)</title>
      <link>https://001cloudid.tistory.com/entry/justBoard14-%EB%8C%93%EA%B8%80-%EA%B5%AC%ED%98%844</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;지난번 reply 테이블에 board 테이블의 no를 외래키로 지정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다음과 같이 추가 수정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;content.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1728957825708&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;글 읽기&amp;lt;/h1&amp;gt;
&amp;lt;table &amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;글번호&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.no}&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;${boardDTO.id}&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;${boardDTO.readcount}&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;${boardDTO.writetime}&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;${boardDTO.subject}&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;${boardDTO.content}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div style=&quot;display: center&quot;&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;c:if test=&quot;${sessionScope.id eq boardDTO.id}&quot;&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/update?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 수정&quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;${pageContext.request.contextPath}/board/delete?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 삭제&quot;&amp;gt;&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/list&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 목록&quot;&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;hr&amp;gt;
댓글&amp;lt;br&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/board/replyInsertPro&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${replyDTO.no }&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;textarea rows=&quot;5&quot; cols=&quot;30&quot; style=&quot;width: 792px; height: 60px&quot; placeholder=&quot;내용을 작성해주세요.&quot; name=&quot;replyContent&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;&amp;lt;input type=&quot;checkbox&quot; name=&quot;replyHidden&quot; value=&quot;true&quot;&amp;gt;비밀글 &amp;lt;input type=&quot;hidden&quot; name=&quot;replyHidden&quot; value=&quot;false&quot;&amp;gt;&amp;lt;input type=&quot;submit&quot; value=&quot;작성&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
댓글 목록&amp;lt;br&amp;gt;
&amp;lt;c:forEach var=&quot;replyDTO&quot; items=&quot;${replyList}&quot;&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;${replyDTO.id}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${replyDTO.replyContent}&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/c:forEach&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1728957862065&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/replyInsertPro&quot;)
	public String replyInsertPro(ReplyDTO replyDTO, Model model) {
		System.out.println(&quot;BoardController replyInsertPro()&quot;);
		boardService.replyInsert(replyDTO);
		return &quot;redirect:/board/content?no=&quot;+replyDTO.getNo();
	}
    
	@GetMapping(&quot;/content&quot;)
	public String content(BoardDTO boardDTO, ReplyDTO replyDTO, Model model) {
		System.out.println(&quot;BoardController Content()&quot;);
		boardDTO = boardService.getBoard(boardDTO); //글에 대한 정보
		boardService.readCount(boardDTO); //조회수
		
		List&amp;lt;ReplyDTO&amp;gt; replyList = boardService.getReplyList();
		
		model.addAttribute(&quot;boardDTO&quot;,boardDTO);
		model.addAttribute(&quot;replyDTO&quot;,replyDTO);
		return &quot;board/content&quot;;
	}&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;BoardService 변화 없음&lt;/p&gt;
&lt;pre id=&quot;code_1728957886311&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void replyInsert(ReplyDTO replyDTO) {
		System.out.println(&quot;BoardService replyInsert()&quot;);
//		replyDTO.setNum(boardDAO.getMaxNum()+1); //댓글 번호(PK) 값 설정
		replyDTO.setReplyWriteTime(new Timestamp(System.currentTimeMillis())); //댓글 작성 시간
		boardDAO.replyInsert(replyDTO);
	}

	public List&amp;lt;ReplyDTO&amp;gt; getReplyList() {
		System.out.println(&quot;BoardService getReplyList()&quot;);
		return boardDAO.getReplyList();
	}&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;BoardDAO 변화없음&lt;/p&gt;
&lt;pre id=&quot;code_1728957910302&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void replyInsert(ReplyDTO replyDTO) {
		System.out.println(&quot;BoardDAO replyInsert()&quot;);
		sqlSession.insert(namespace+&quot;.replyInsert&quot;, replyDTO);
	}

	public List&amp;lt;ReplyDTO&amp;gt; getReplyList() {
		System.out.println(&quot;BoardDAO getReplyList()&quot;);
		return sqlSession.selectList(namespace+&quot;.getReplyList&quot;);
	}&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;boardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1728957975203&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;insert id=&quot;replyInsert&quot;&amp;gt;
		insert into reply(num,id,replyContent,replyHidden,replyWriteTime,`no`)
		values(#{num},#{id},#{replyContent},#{replyHidden},#{replyWriteTime},#{no})
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;select id=&quot;getReplyList&quot; resultType=&quot;com.mystory001.domain.ReplyDTO&quot;&amp;gt;
		select *
		from reply
		where `no` = #{no}
		order by replyWriteTime desc
	&amp;lt;/select&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd2ZWx/btsJ6rSKU4v/7mzRIk4ZVw08lYPpAeu1pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd2ZWx/btsJ6rSKU4v/7mzRIk4ZVw08lYPpAeu1pk/img.png&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;531&quot; data-is-animation=&quot;false&quot; style=&quot;width: 56.1436%; margin-right: 10px;&quot; data-widthpercent=&quot;56.8&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd2ZWx/btsJ6rSKU4v/7mzRIk4ZVw08lYPpAeu1pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd2ZWx%2FbtsJ6rSKU4v%2F7mzRIk4ZVw08lYPpAeu1pk%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;1221&quot; height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhPSuf/btsJ6dAqrfJ/RZoeYklMHmYEc1YblnmPYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhPSuf/btsJ6dAqrfJ/RZoeYklMHmYEc1YblnmPYk/img.png&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;700&quot; data-is-animation=&quot;false&quot; style=&quot;width: 42.6936%;&quot; data-widthpercent=&quot;43.2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhPSuf/btsJ6dAqrfJ/RZoeYklMHmYEc1YblnmPYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhPSuf%2FbtsJ6dAqrfJ%2FRZoeYklMHmYEc1YblnmPYk%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;1224&quot; height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;댓글을 작성하면 내가 원하는 방향으로 된다.&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;808&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brjgEn/btsJ587eb8J/PuN8Ic8OoGxOUeo140wP70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brjgEn/btsJ587eb8J/PuN8Ic8OoGxOUeo140wP70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brjgEn/btsJ587eb8J/PuN8Ic8OoGxOUeo140wP70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrjgEn%2FbtsJ587eb8J%2FPuN8Ic8OoGxOUeo140wP70%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;808&quot; height=&quot;439&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reply 테이블 조회를 했을 때 위는 수정하기 전, 아래는 수정 후이기 때문에 no의 값이 차이가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제대로 들어갔음에도 content.jsp에서 보이지 않는 것은 문제가 있다. 이 부분부터 수정해보도록 하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czBOWg/btsJ40a1b7Q/9hsgYiAPKxNmSRMeWx9lXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czBOWg/btsJ40a1b7Q/9hsgYiAPKxNmSRMeWx9lXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czBOWg/btsJ40a1b7Q/9hsgYiAPKxNmSRMeWx9lXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczBOWg%2FbtsJ40a1b7Q%2F9hsgYiAPKxNmSRMeWx9lXk%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;368&quot; height=&quot;263&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;replyList.toString()을 출력해보니 비어있음을 알 수 있다.&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;게시글 번호 전달 확인을 위해 게시 글번호를 전달 및 boolean값 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1728960514469&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/content&quot;)
	public String content(BoardDTO boardDTO, ReplyDTO replyDTO, Model model) {
		System.out.println(&quot;BoardController Content()&quot;);
		boardDTO = boardService.getBoard(boardDTO); //글에 대한 정보
		boardService.readCount(boardDTO); //조회수
		
	    List&amp;lt;ReplyDTO&amp;gt; replyList = boardService.getReplyList(boardDTO.getNo()); // 게시글 번호를 사용
	    System.out.println(replyList.toString()); // 디버깅을 위한 로그 출력
	    model.addAttribute(&quot;boardDTO&quot;, boardDTO);
	    model.addAttribute(&quot;replyDTO&quot;, replyDTO);
	    model.addAttribute(&quot;replyList&quot;, replyList); // 댓글 리스트 추가
		return &quot;board/content&quot;;
	}
    
	@PostMapping(&quot;/replyInsertPro&quot;)
	public String replyInsertPro(ReplyDTO replyDTO, Model model) {
		System.out.println(&quot;BoardController replyInsertPro()&quot;);
		boardService.replyInsert(replyDTO);
		return &quot;redirect:/board/content?no=&quot;+replyDTO.getNo();
	}&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;BoardService&lt;/p&gt;
&lt;pre id=&quot;code_1728960564381&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void replyInsert(ReplyDTO replyDTO) {
		System.out.println(&quot;BoardService replyInsert()&quot;);
		replyDTO.setReplyHidden(false); //Boolean값으로 설정
		replyDTO.setReplyWriteTime(new Timestamp(System.currentTimeMillis())); //댓글 작성 시간
		boardDAO.replyInsert(replyDTO);
	}

	public List&amp;lt;ReplyDTO&amp;gt; getReplyList(int no) {
		System.out.println(&quot;BoardService getReplyList()&quot;);
		return boardDAO.getReplyList(no);
	}&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;BoardDAO&lt;/p&gt;
&lt;pre id=&quot;code_1728960578232&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void replyInsert(ReplyDTO replyDTO) {
		System.out.println(&quot;BoardDAO replyInsert()&quot;);
		sqlSession.insert(namespace+&quot;.replyInsert&quot;, replyDTO);
	}

	public List&amp;lt;ReplyDTO&amp;gt; getReplyList(int no) {
		System.out.println(&quot;BoardDAO getReplyList()&quot;);
		return sqlSession.selectList(namespace+&quot;.getReplyList&quot;, no);
	}&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;boardMapper 변화없음&lt;/p&gt;
&lt;pre id=&quot;code_1728960603521&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;insert id=&quot;replyInsert&quot;&amp;gt;
		insert into reply(num,id,replyContent,replyHidden,replyWriteTime,`no`)
		values(#{num},#{id},#{replyContent},#{replyHidden},#{replyWriteTime},#{no})
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;select id=&quot;getReplyList&quot; resultType=&quot;com.mystory001.domain.ReplyDTO&quot;&amp;gt;
		select *
		from reply
		where `no` = #{no}
		order by replyWriteTime desc
	&amp;lt;/select&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;content.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1728960616644&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;글 읽기&amp;lt;/h1&amp;gt;
&amp;lt;table &amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;글번호&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.no}&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;${boardDTO.id}&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;${boardDTO.readcount}&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;${boardDTO.writetime}&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;${boardDTO.subject}&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;${boardDTO.content}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div style=&quot;display: center&quot;&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;c:if test=&quot;${sessionScope.id eq boardDTO.id}&quot;&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/update?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 수정&quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;${pageContext.request.contextPath}/board/delete?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 삭제&quot;&amp;gt;&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/list&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 목록&quot;&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;hr&amp;gt;
댓글&amp;lt;br&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/board/replyInsertPro&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${replyDTO.no }&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;textarea rows=&quot;5&quot; cols=&quot;30&quot; style=&quot;width: 792px; height: 60px&quot; placeholder=&quot;내용을 작성해주세요.&quot; name=&quot;replyContent&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;&amp;lt;input type=&quot;checkbox&quot; name=&quot;replyHidden&quot; value=&quot;true&quot;&amp;gt;비밀글 &amp;lt;input type=&quot;hidden&quot; name=&quot;replyHidden&quot; value=&quot;false&quot;&amp;gt;&amp;lt;input type=&quot;submit&quot; value=&quot;작성&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
댓글 목록&amp;lt;br&amp;gt;
&amp;lt;%-- &amp;lt;c:forEach var=&quot;replyDTO&quot; items=&quot;${replyList}&quot;&amp;gt; --%&amp;gt;
&amp;lt;!--     &amp;lt;tr&amp;gt; --&amp;gt;
&amp;lt;%--         &amp;lt;c:if test=&quot;${replyDTO.replyHidden ne 1}&quot;&amp;gt; --%&amp;gt;
&amp;lt;%--             &amp;lt;td&amp;gt;${replyDTO.id}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${replyDTO.replyContent}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${replyDTO.replyWriteTime}&amp;lt;/td&amp;gt; --%&amp;gt;
&amp;lt;%--         &amp;lt;/c:if&amp;gt; --%&amp;gt;
&amp;lt;%--         &amp;lt;c:if test=&quot;${replyDTO.replyHidden eq 1}&quot;&amp;gt; --%&amp;gt;
&amp;lt;!--             &amp;lt;td&amp;gt;비밀글입니다.&amp;lt;/td&amp;gt; --&amp;gt;
&amp;lt;%--             &amp;lt;c:if test=&quot;${sessionScope.id eq replyDTO.id or sessionScope.id eq boardDTO.id}&quot;&amp;gt; --%&amp;gt;
&amp;lt;%--                 &amp;lt;td&amp;gt;${replyDTO.id}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${replyDTO.replyContent}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${replyDTO.replyWriteTime}&amp;lt;/td&amp;gt; --%&amp;gt;
&amp;lt;%--             &amp;lt;/c:if&amp;gt; --%&amp;gt;
&amp;lt;%--         &amp;lt;/c:if&amp;gt; --%&amp;gt;
&amp;lt;!--     &amp;lt;/tr&amp;gt; --&amp;gt;
&amp;lt;%-- &amp;lt;/c:forEach&amp;gt; --%&amp;gt;
&amp;lt;c:if test=&quot;${not empty replyList}&quot;&amp;gt;
    &amp;lt;c:forEach var=&quot;replyDTO&quot; items=&quot;${replyList}&quot;&amp;gt;
        &amp;lt;tr&amp;gt;
				&amp;lt;c:if test=&quot;${replyDTO.replyHidden == false}&quot;&amp;gt;
				    &amp;lt;td&amp;gt;작성자 : &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${replyDTO.id}&amp;lt;/td&amp;gt;
				    &amp;lt;td&amp;gt;내용 : &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${replyDTO.replyContent}&amp;lt;/td&amp;gt;
				    &amp;lt;td&amp;gt;작성시간 : &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${replyDTO.replyWriteTime}&amp;lt;/td&amp;gt;&amp;lt;br&amp;gt;
				&amp;lt;/c:if&amp;gt;
				&amp;lt;c:if test=&quot;${replyDTO.replyHidden == true}&quot;&amp;gt;
				    &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;비밀댓글&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;c:if test=&quot;${sessionScope.id eq replyDTO.id or sessionScope.id eq boardDTO.id}&quot;&amp;gt;
                    &amp;lt;td&amp;gt;작성자 : &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${replyDTO.id}&amp;lt;/td&amp;gt;
                    &amp;lt;td&amp;gt;내용 : &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${replyDTO.replyContent}&amp;lt;/td&amp;gt;
                    &amp;lt;td&amp;gt;작성시간 : &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${replyDTO.replyWriteTime}&amp;lt;/td&amp;gt;&amp;lt;br&amp;gt;
                &amp;lt;/c:if&amp;gt;
            &amp;lt;/c:if&amp;gt;
        &amp;lt;/tr&amp;gt;
    &amp;lt;/c:forEach&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;c:if test=&quot;${empty replyList}&quot;&amp;gt;
    &amp;lt;p&amp;gt;댓글이 없습니다.&amp;lt;/p&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;1216&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcfkUr/btsJ427AcUP/88K1SJCT0KN3OHZWR5skK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcfkUr/btsJ427AcUP/88K1SJCT0KN3OHZWR5skK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcfkUr/btsJ427AcUP/88K1SJCT0KN3OHZWR5skK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcfkUr%2FbtsJ427AcUP%2F88K1SJCT0KN3OHZWR5skK1%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;1216&quot; height=&quot;751&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;751&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;792&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1lbSN/btsJ5fFLqZj/3FVhkrNTX9HcgRmQF01MY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1lbSN/btsJ5fFLqZj/3FVhkrNTX9HcgRmQF01MY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1lbSN/btsJ5fFLqZj/3FVhkrNTX9HcgRmQF01MY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1lbSN%2FbtsJ5fFLqZj%2F3FVhkrNTX9HcgRmQF01MY0%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;792&quot; height=&quot;179&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;179&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;747&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMPc5O/btsJ5eGTipF/NwelaNWbBm8qutpaAwaBQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMPc5O/btsJ5eGTipF/NwelaNWbBm8qutpaAwaBQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMPc5O/btsJ5eGTipF/NwelaNWbBm8qutpaAwaBQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMPc5O%2FbtsJ5eGTipF%2FNwelaNWbBm8qutpaAwaBQ1%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;1216&quot; height=&quot;747&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;747&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 구현하는데 급급해서 정리되지 않은 jstl 코드를 수정하고 위의 그림과 같이 로그인이 되지 않았을 때 글을 작성하지 못하도록 댓글 창을 숨기는 작업을 하도록하자.&lt;/p&gt;
&lt;pre id=&quot;code_1728962496719&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 650px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;글 읽기&amp;lt;/h1&amp;gt;
&amp;lt;table &amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;글번호&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.no}&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;${boardDTO.id}&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;${boardDTO.readcount}&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;${boardDTO.writetime}&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;${boardDTO.subject}&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;${boardDTO.content}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div style=&quot;display: center&quot;&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;c:if test=&quot;${sessionScope.id eq boardDTO.id}&quot;&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/update?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 수정&quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;${pageContext.request.contextPath}/board/delete?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 삭제&quot;&amp;gt;&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/list&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 목록&quot;&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;hr&amp;gt;
&amp;lt;c:if test=&quot;${empty sessionScope.id }&quot;&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;댓글은 회원만 작성 및 확인 할 수 있습니다. 확인을 위해서 회원 가입해주세요.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
댓글&amp;lt;br&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/board/replyInsertPro&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${replyDTO.no }&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;textarea rows=&quot;5&quot; cols=&quot;30&quot; style=&quot;width: 792px; height: 60px&quot; placeholder=&quot;내용을 작성해주세요.&quot; name=&quot;replyContent&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;&amp;lt;input type=&quot;checkbox&quot; name=&quot;replyHidden&quot; value=&quot;true&quot;&amp;gt;비밀글 &amp;lt;input type=&quot;hidden&quot; name=&quot;replyHidden&quot; value=&quot;false&quot;&amp;gt;&amp;lt;input type=&quot;submit&quot; value=&quot;작성&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
댓글 목록 &amp;lt;sub&amp;gt;비밀 댓글은 굵게 표시됩니다.&amp;lt;/sub&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;c:if test=&quot;${empty replyList }&quot;&amp;gt;
작성된 댓글이 없습니다. 
&amp;lt;/c:if&amp;gt;
&amp;lt;c:if test=&quot;${!empty replyList}&quot;&amp;gt;
    &amp;lt;c:forEach var=&quot;replyDTO&quot; items=&quot;${replyList}&quot;&amp;gt;
        &amp;lt;tr&amp;gt;
				&amp;lt;c:if test=&quot;${replyDTO.replyHidden == false}&quot;&amp;gt;
				    &amp;lt;td&amp;gt;작성자 : &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${replyDTO.id}&amp;lt;/td&amp;gt;
				    &amp;lt;td&amp;gt;내용 : &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${replyDTO.replyContent}&amp;lt;/td&amp;gt;
				    &amp;lt;td&amp;gt;작성시간 : &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${replyDTO.replyWriteTime}&amp;lt;/td&amp;gt;&amp;lt;br&amp;gt;
				&amp;lt;/c:if&amp;gt;
				&amp;lt;c:if test=&quot;${replyDTO.replyHidden == true}&quot;&amp;gt;
				    &amp;lt;c:if test=&quot;${empty sessionScope.id}&quot;&amp;gt;
				    &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;권한이 없습니다.&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;
				    &amp;lt;/c:if&amp;gt;
                &amp;lt;c:if test=&quot;${sessionScope.id eq replyDTO.id or sessionScope.id eq boardDTO.id}&quot;&amp;gt;
                    &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;작성자 : &amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;${replyDTO.id}&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;
                    &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;내용 : &amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;${replyDTO.replyContent}&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;
                    &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;작성시간 : &amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;${replyDTO.replyWriteTime}&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;br&amp;gt;
                &amp;lt;/c:if&amp;gt;
            &amp;lt;/c:if&amp;gt;
        &amp;lt;/tr&amp;gt;
    &amp;lt;/c:forEach&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;/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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;797&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oTfOP/btsJ5ykNnjV/kLWwEt6XvtC5YATJk87E70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oTfOP/btsJ5ykNnjV/kLWwEt6XvtC5YATJk87E70/img.png&quot; data-alt=&quot;댓글이 있을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oTfOP/btsJ5ykNnjV/kLWwEt6XvtC5YATJk87E70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoTfOP%2FbtsJ5ykNnjV%2FkLWwEt6XvtC5YATJk87E70%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;1221&quot; height=&quot;797&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;797&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;댓글이 있을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;798&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvykP7/btsJ4sySvm0/izh6mBxIFNKwcXvkYyfau1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvykP7/btsJ4sySvm0/izh6mBxIFNKwcXvkYyfau1/img.png&quot; data-alt=&quot;댓글이 없을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvykP7/btsJ4sySvm0/izh6mBxIFNKwcXvkYyfau1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvykP7%2FbtsJ4sySvm0%2Fizh6mBxIFNKwcXvkYyfau1%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;1212&quot; height=&quot;798&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;798&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;댓글이 없을 때&lt;/figcaption&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lPxQ6/btsJ6XcP0Xe/pdrAitf1qbJ54KLiKKlHM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lPxQ6/btsJ6XcP0Xe/pdrAitf1qbJ54KLiKKlHM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lPxQ6/btsJ6XcP0Xe/pdrAitf1qbJ54KLiKKlHM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlPxQ6%2FbtsJ6XcP0Xe%2FpdrAitf1qbJ54KLiKKlHM1%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;1218&quot; height=&quot;804&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;804&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;날짜 형식 변경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSTL fmt로 날짜 형식을 변경해보자. jsp상단에 fmt를 선언하는 것하고 사용하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1728962979858&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ taglib prefix=&quot;fmt&quot; uri=&quot;http://java.sun.com/jsp/jstl/fmt&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;/p&gt;
&lt;pre id=&quot;code_1728963041166&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;fmt:formatDate pattern=&quot;yyyy-MM-dd hh:mm:ss&quot; value=&quot;${}&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 주의할 점은 월은 대문자 M(Month), 분은 소문자 m(minute). 분보다 월이 더 큰 개념이라고 외워두고 더 큰 개념이니까 큰 거 &amp;rarr; 대문자 이렇게 좀 유치하지만 외워두자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728963366007&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;%@ taglib prefix=&quot;fmt&quot; uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 650px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;글 읽기&amp;lt;/h1&amp;gt;
&amp;lt;table &amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;글번호&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.no}&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;${boardDTO.id}&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;${boardDTO.readcount}&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;fmt:formatDate pattern=&quot;yyyy-MM-dd hh:mm:ss&quot; value=&quot;${boardDTO.writetime}&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;${boardDTO.subject}&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;${boardDTO.content}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div style=&quot;display: center&quot;&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;c:if test=&quot;${sessionScope.id eq boardDTO.id}&quot;&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/update?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 수정&quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;${pageContext.request.contextPath}/board/delete?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 삭제&quot;&amp;gt;&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/list&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 목록&quot;&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;hr&amp;gt;
&amp;lt;c:if test=&quot;${empty sessionScope.id }&quot;&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;댓글은 회원만 작성 및 확인 할 수 있습니다. 확인을 위해서 회원 가입해주세요.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
댓글&amp;lt;br&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/board/replyInsertPro&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${replyDTO.no }&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;textarea rows=&quot;5&quot; cols=&quot;30&quot; style=&quot;width: 792px; height: 60px&quot; placeholder=&quot;내용을 작성해주세요.&quot; name=&quot;replyContent&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;&amp;lt;input type=&quot;checkbox&quot; name=&quot;replyHidden&quot; value=&quot;true&quot;&amp;gt;비밀글 &amp;lt;input type=&quot;hidden&quot; name=&quot;replyHidden&quot; value=&quot;false&quot;&amp;gt;&amp;lt;input type=&quot;submit&quot; value=&quot;작성&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
댓글 목록 &amp;lt;sub&amp;gt;비밀 댓글은 굵게 표시됩니다.&amp;lt;/sub&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;c:if test=&quot;${empty replyList }&quot;&amp;gt;
작성된 댓글이 없습니다. 
&amp;lt;/c:if&amp;gt;
&amp;lt;c:if test=&quot;${!empty replyList}&quot;&amp;gt;
    &amp;lt;c:forEach var=&quot;replyDTO&quot; items=&quot;${replyList}&quot;&amp;gt;
        &amp;lt;tr&amp;gt;
				&amp;lt;c:if test=&quot;${replyDTO.replyHidden == false}&quot;&amp;gt;
				    &amp;lt;td&amp;gt;작성자 : &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${replyDTO.id}&amp;lt;/td&amp;gt;
				    &amp;lt;td&amp;gt;내용 : &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${replyDTO.replyContent}&amp;lt;/td&amp;gt;
				    &amp;lt;td&amp;gt;작성시간 : &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;fmt:formatDate pattern=&quot;yyyy-MM-dd hh:mm:ss&quot; value=&quot;${replyDTO.replyWriteTime}&quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;br&amp;gt;
				&amp;lt;/c:if&amp;gt;
				&amp;lt;c:if test=&quot;${replyDTO.replyHidden == true}&quot;&amp;gt;
				    &amp;lt;c:if test=&quot;${empty sessionScope.id}&quot;&amp;gt;
				    &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;권한이 없습니다.&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;
				    &amp;lt;/c:if&amp;gt;
                &amp;lt;c:if test=&quot;${sessionScope.id eq replyDTO.id or sessionScope.id eq boardDTO.id}&quot;&amp;gt;
                    &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;작성자 : &amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;${replyDTO.id}&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;
                    &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;내용 : &amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;${replyDTO.replyContent}&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;
                    &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;작성시간 : &amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;lt;fmt:formatDate pattern=&quot;yyyy-MM-dd hh:mm:ss&quot; value=&quot;${replyDTO.replyWriteTime}&quot; /&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;br&amp;gt;
                &amp;lt;/c:if&amp;gt;
            &amp;lt;/c:if&amp;gt;
        &amp;lt;/tr&amp;gt;
    &amp;lt;/c:forEach&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&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;1217&quot; data-origin-height=&quot;804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTpu8T/btsJ5BBDm0M/GsqR82j1P4GRvNedfmCek0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTpu8T/btsJ5BBDm0M/GsqR82j1P4GRvNedfmCek0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTpu8T/btsJ5BBDm0M/GsqR82j1P4GRvNedfmCek0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTpu8T%2FbtsJ5BBDm0M%2FGsqR82j1P4GRvNedfmCek0%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;1217&quot; height=&quot;804&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;804&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날짜 포멧을 변경하였고, 추가적으로 다른 회원은 비밀 댓글이 작성되었는지 알 수 없다.&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;1216&quot; data-origin-height=&quot;793&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E91Xs/btsJ4hRTdIt/2hGXap7onKvSorWDnD1kC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E91Xs/btsJ4hRTdIt/2hGXap7onKvSorWDnD1kC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E91Xs/btsJ4hRTdIt/2hGXap7onKvSorWDnD1kC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE91Xs%2FbtsJ4hRTdIt%2F2hGXap7onKvSorWDnD1kC1%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;1216&quot; height=&quot;793&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;793&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/300</guid>
      <comments>https://001cloudid.tistory.com/entry/justBoard14-%EB%8C%93%EA%B8%80-%EA%B5%AC%ED%98%844#entry300comment</comments>
      <pubDate>Tue, 15 Oct 2024 12:41:51 +0900</pubDate>
    </item>
    <item>
      <title>justBoard13 댓글 구현(3) 데이터</title>
      <link>https://001cloudid.tistory.com/entry/justBoard13-%EB%8C%93%EA%B8%80-%EA%B5%AC%ED%98%843-%EB%8D%B0%EC%9D%B4%ED%84%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;화면까지 구성했고 어떤 식으로 주소매핑을 해야 할지 정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 주소매핑에서 mapper까지 설정해 보도록 하겠다.&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;이전글에서 Update로 되어있는 부분은 Insert로 수정하였다.&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;댓글을 작성하고 작성 버튼을 누르면 /board/replyInsertPro 여기서 댓글을 작성하는 처리과정을 거치게 된다. 이 과정부터 시작해 보도록 하자&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1728785894133&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/replyInsertPro&quot;)
	public String replyInsertPro(ReplyDTO replyDTO, Model model) {
		System.out.println(&quot;BoardController replyInsertPro()&quot;);
		BoardDTO boardDTO = new BoardDTO();
		boardService.replyUpdatePro(replyDTO);
		return &quot;redirect:/board/content?no=&quot;+boardDTO.getNo();
	}&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;작성하고 나니 굳이 BoardDTO 객체를 안에서 작성할 필요는 없을 것 같다는 생각이 들었다.&lt;/p&gt;
&lt;pre id=&quot;code_1728786218607&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/replyInsertPro&quot;)
	public String replyInsertPro(ReplyDTO replyDTO,BoardDTO boardDTO, Model model) {
		System.out.println(&quot;BoardController replyInsert()&quot;);
		boardService.replyInsert(replyDTO);
		return &quot;redirect:/board/content?no=&quot;+boardDTO.getNo();
	}&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;Controller에서 return 값을 저렇게 써본적은 처음인데 잘 될 거라고 생각한다.&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;BoardService&lt;/p&gt;
&lt;pre id=&quot;code_1728786403297&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void replyInsert(ReplyDTO replyDTO) {
		System.out.println(&quot;BoardService replyInsert()&quot;);
		replyDTO.setNum(boardDAO.getMaxNum()+1); //댓글 번호(PK) 값 설정
		replyDTO.setReplyWriteTime(new Timestamp(System.currentTimeMillis())); //댓글 작성 시간
		boardDAO.replyInsert(replyDTO);
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;댓글 번호는 PK라 어디 보이지 않아도 반드시 필요한 값, 댓글 작성 시간도 따로 값을 지정해주지 않았기 때문에 Service에서 설정이 필요함. 비밀글 처리를 jsp에서 해줘야 할지 Service에서 해야 할지 잘 모르겠다.&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;BoardDAO&lt;/p&gt;
&lt;pre id=&quot;code_1728788785637&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void replyInsert(ReplyDTO replyDTO) {
		System.out.println(&quot;BoardDAO replyInsert()&quot;);
		sqlSession.insert(namespace+&quot;.replyInsert&quot;, replyDTO);
	}
	
	public int getMaxNum() {
		System.out.println(&quot;BoardDAO getMaxNum()&quot;);
		return sqlSession.selectOne(namespace+&quot;.getMaxNum&quot;);
	}&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;boardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1728788798775&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;insert id=&quot;replyInsert&quot;&amp;gt;
		insert into reply(num,id,replyContent,replyHidden,replyWriteTime,re_ref,re_lev,re_sql)
		values(#{num},#{id},#{replyContent},#{replyHidden},#{replyWriteTime},#{re_ref},#{re_lev},#{re_sql})
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;select id=&quot;getMaxNum&quot; resultType=&quot;java.lang.Integer&quot;&amp;gt;
		select max(num) from reply
	&amp;lt;/select&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;884&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/loEpk/btsJ3kAFGNF/WfM1FRaFkNPzW7W2uCG8I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/loEpk/btsJ3kAFGNF/WfM1FRaFkNPzW7W2uCG8I1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/loEpk/btsJ3kAFGNF/WfM1FRaFkNPzW7W2uCG8I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FloEpk%2FbtsJ3kAFGNF%2FWfM1FRaFkNPzW7W2uCG8I1%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;1081&quot; height=&quot;884&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;884&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역시 오류가 뜬다. 어디의 값이 문제인지 toString을 오버라이딩해서 알아보도록 하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ReplyDTO&lt;/p&gt;
&lt;pre id=&quot;code_1728789255988&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@Override
	public String toString() {
		return &quot;ReplyDTO [id=&quot; + id + &quot;, replyContent=&quot; + replyContent + &quot;, replyHidden=&quot; + replyHidden
				+ &quot;, replyWriteTime=&quot; + replyWriteTime + &quot;, re_ref=&quot; + re_ref + &quot;, re_lev=&quot; + re_lev + &quot;, re_seq=&quot;
				+ re_seq + &quot;, num=&quot; + num + &quot;]&quot;;
	}&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1728789272828&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/replyInsertPro&quot;)
	public String replyInsertPro(ReplyDTO replyDTO,BoardDTO boardDTO, Model model) {
		System.out.println(&quot;BoardController replyInsert()&quot;);
		boardService.replyInsert(replyDTO);
		replyDTO.toString();
		return &quot;redirect:/board/content?no=&quot;+boardDTO.getNo();
	}&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;/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;content.jsp에서 댓글form에 num을 hidden으로 넣어보았다. 아마 num값이 넘어오지 않아서 그런가 싶다는 생각이 들었다.&lt;/p&gt;
&lt;pre id=&quot;code_1728791774578&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;hr&amp;gt;
댓글&amp;lt;br&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/board/replyInsertPro&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;num&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;textarea rows=&quot;5&quot; cols=&quot;30&quot; style=&quot;width: 792px; height: 60px&quot; placeholder=&quot;내용을 작성해주세요.&quot; name=&quot;replyContent&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;&amp;lt;input type=&quot;checkbox&quot; name=&quot;replyHidden&quot;&amp;gt;비밀글 &amp;lt;input type=&quot;submit&quot; value=&quot;작성&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
댓글 목록&amp;lt;br&amp;gt;
이곳에 댓글 목록이 나타남. 작성자 - 댓글 내용 순으로
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&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;958&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9tIEa/btsJ3aE7ikO/eG8oXlvuccCjZvftUFIoS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9tIEa/btsJ3aE7ikO/eG8oXlvuccCjZvftUFIoS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9tIEa/btsJ3aE7ikO/eG8oXlvuccCjZvftUFIoS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9tIEa%2FbtsJ3aE7ikO%2FeG8oXlvuccCjZvftUFIoS0%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;958&quot; height=&quot;335&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;HTTP 에러 코드&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;400 : 잘못된 요청으로 문법상 오류가 있어서 서버가 요청을 이해하지 못한 경우 &amp;rarr; 잘못입력한 url인 경우가 많음&lt;/li&gt;
&lt;li&gt;404 : 클라이언트가 요청한 문서를 찾지 못한 경우 &amp;rarr; url이나 캐시 삭제&lt;/li&gt;
&lt;li&gt;405 : request라인에 명시된 메소드를 수행하기 위한 해당 자원의 이용이 허용되지 않았을 경우&lt;/li&gt;
&lt;li&gt;415 : 지원되지 않는 형식으로 클라이언트가 요청해서 서버가 요청에 대한 승인을 거부한 경우&lt;/li&gt;
&lt;li&gt;500 : 웹 서버가 요청사항을 수행할 수 없는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 : &lt;a href=&quot;https://donggu1105.tistory.com/145&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://donggu1105.tistory.com/145&lt;/a&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpTfcT/btsJ3r0BoVr/3uk4CfJ5J04NQBhXszk6o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpTfcT/btsJ3r0BoVr/3uk4CfJ5J04NQBhXszk6o1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpTfcT/btsJ3r0BoVr/3uk4CfJ5J04NQBhXszk6o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpTfcT%2FbtsJ3r0BoVr%2F3uk4CfJ5J04NQBhXszk6o1%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;338&quot; height=&quot;132&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;replyInsertPro()까지 가지 않을 것을 확인할 수 있다.&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;이전 글을 확인해 보니 빠진 부분이 있었다. content.jsp 주소매핑과정에서 ReplyDTO도 추가해줘야 한다는 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1728793411137&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/content&quot;)
	public String content(BoardDTO boardDTO, ReplyDTO replyDTO, Model model) {
		System.out.println(&quot;BoardController Content()&quot;);
		boardDTO = boardService.getBoard(boardDTO); //글에 대한 정보
		boardService.readCount(boardDTO); //조회수
		model.addAttribute(&quot;boardDTO&quot;,boardDTO);
		model.addAttribute(&quot;replyDTO&quot;,replyDTO);
		return &quot;board/content&quot;;
	}&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;이러거나 저러거나 400 오류가 발생함 해당 오류가 발생할 수 있는 이유에 대해서 조금 더 구체적으로 알아보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;400 오류가 발생하는 이유&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;필수 입력 누락&lt;/li&gt;
&lt;li&gt;잘못된 URL 요청&lt;/li&gt;
&lt;li&gt;HTTP 메소드 문제&lt;/li&gt;
&lt;li&gt;서버 세션 유효성 문제&lt;/li&gt;
&lt;li&gt;폼 데이터 불일치&lt;/li&gt;
&lt;li&gt;잘못된 데이터 타입&lt;/li&gt;
&lt;li&gt;Ajax 요청 시 처리 문제&lt;/li&gt;
&lt;li&gt;CORS 정책 문제&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 찾아보니 아무래도 비밀글 체크박스와 관련되어 문제가 생긴 것 같다. true 또는 false가 넘어가야 하고, db에는 0 또는 1로 받아져야 하기 때문이다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;content.jsp에&lt;/p&gt;
&lt;pre id=&quot;code_1728793961208&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;checkbox&quot; name=&quot;replyHidden&quot; value=&quot;true&quot;&amp;gt;비밀글
&amp;lt;input type=&quot;hidden&quot; name=&quot;replyHidden&quot; value=&quot;false&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 체크박스가 체크되었을 때는 true가 전송되고, 체크되지 않았을 때 false가 전송되게 할 수 있다.&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1728794204670&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/replyInsertPro&quot;)
	public String replyInsertPro(ReplyDTO replyDTO,BoardDTO boardDTO, Model model) {
		System.out.println(&quot;BoardController replyInsertPro()&quot;);
		
		//replyHidden을 boolean으로 변환
		if(&quot;true&quot;.equals(replyDTO.isReplyHidden())) {
			replyDTO.setReplyHidden(true);
		} else {
			replyDTO.setReplyHidden(false);
		}
		
		boardService.replyInsert(replyDTO);
		return &quot;board/content?no=&quot;+boardDTO.getNo();
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;replyHidden값을 처리...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;폼 데이터 문제&lt;br /&gt;&amp;rarr; num이 비어있으므로 번호를 제대로 설정&lt;/li&gt;
&lt;li&gt;DTO 데이터 처리&lt;br /&gt;&amp;rarr; isReplyHidden() 메소드는 boolean값을 반환해야 함&lt;/li&gt;
&lt;li&gt;리다이렉션 return&lt;br /&gt;&lt;b&gt; &amp;rarr; &quot;&lt;/b&gt;board/content?no=&quot; 는 단순히 URL을 반환&lt;/li&gt;
&lt;li&gt;DAO 및 매퍼 설정&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;content.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1728794956506&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;hr&amp;gt;
댓글&amp;lt;br&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/board/replyInsertPro&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;num&quot; value=&quot;${replyDTO.num }&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;textarea rows=&quot;5&quot; cols=&quot;30&quot; style=&quot;width: 792px; height: 60px&quot; placeholder=&quot;내용을 작성해주세요.&quot; name=&quot;replyContent&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;&amp;lt;input type=&quot;checkbox&quot; name=&quot;replyHidden&quot; value=&quot;true&quot;&amp;gt;비밀글 &amp;lt;input type=&quot;hidden&quot; name=&quot;replyHidden&quot; value=&quot;false&quot;&amp;gt;&amp;lt;input type=&quot;submit&quot; value=&quot;작성&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
댓글 목록&amp;lt;br&amp;gt;
이곳에 댓글 목록이 나타남. 작성자 - 댓글 내용 순으로
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1728794969777&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/replyInsertPro&quot;)
	public String replyInsertPro(ReplyDTO replyDTO,BoardDTO boardDTO, Model model) {
		System.out.println(&quot;BoardController replyInsertPro()&quot;);
		
		//replyHidden을 boolean으로 변환
		if(&quot;true&quot;.equals(replyDTO.getReplyHidden())) {
			replyDTO.setReplyHidden(true);
		} else {
			replyDTO.setReplyHidden(false);
		}
		
		boardService.replyInsert(replyDTO);
		return &quot;redirect:/board/content?no=&quot;+boardDTO.getNo();
	}&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;BoardService, BoardDAO, boardMapper는 그대로 놔둠.&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;955&quot; data-origin-height=&quot;901&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lw9Qw/btsJ4i9BMbw/cRA3La3mi6tD9iC5xNxDC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lw9Qw/btsJ4i9BMbw/cRA3La3mi6tD9iC5xNxDC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lw9Qw/btsJ4i9BMbw/cRA3La3mi6tD9iC5xNxDC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLw9Qw%2FbtsJ4i9BMbw%2FcRA3La3mi6tD9iC5xNxDC1%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;955&quot; height=&quot;901&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;901&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;문법오류인가? 일단 검색해 보니 Project - Clean 했을 경우 문제가 해결된다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 몰라서 Tomcat까지 Clean을 하고 restart 하고 댓글 작성하니&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;845&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCZj7u/btsJ25RhPpK/zBwAyK9BdfhEzw7EVool4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCZj7u/btsJ25RhPpK/zBwAyK9BdfhEzw7EVool4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCZj7u/btsJ25RhPpK/zBwAyK9BdfhEzw7EVool4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCZj7u%2FbtsJ25RhPpK%2FzBwAyK9BdfhEzw7EVool4K%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;954&quot; height=&quot;845&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;845&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 NullPointerException 발생. 그래도 희망적인 사실은 400 오류 떴을 때보다 콘솔에서 더 많이 진행됨을 확인할 수 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;359&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uOUem/btsJ2RZ2s2u/zwnrLLcIqA5sSp3TjAf7K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uOUem/btsJ2RZ2s2u/zwnrLLcIqA5sSp3TjAf7K0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uOUem/btsJ2RZ2s2u/zwnrLLcIqA5sSp3TjAf7K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuOUem%2FbtsJ2RZ2s2u%2FzwnrLLcIqA5sSp3TjAf7K0%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;359&quot; height=&quot;180&quot; data-origin-width=&quot;359&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;num값이 넘어오지 못하는 것 같다. 가장 쉬운 방법은 db에서 auto_increment 속성을 추가해 주면 될 것 같은데.. 그렇다면 auto_increment 속성을 추가해 보자. 어차피 reply 테이블의 num 컬럼은 테이블의 기본키를 위한 의미 없는 컬럼이기 때문에 바꿔도 상관없을 것 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SkdiM/btsJ27uUM2h/HKqEV7whfFKdZSU6G6iWT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SkdiM/btsJ27uUM2h/HKqEV7whfFKdZSU6G6iWT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SkdiM/btsJ27uUM2h/HKqEV7whfFKdZSU6G6iWT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSkdiM%2FbtsJ27uUM2h%2FHKqEV7whfFKdZSU6G6iWT1%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;565&quot; height=&quot;64&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적으로도 NullPointerException이 발생하였다. 이 과정에서 auto_increment 속성을 걸어뒀는데 getMaxNum()이 필요할까? content.jsp에 num값을 넘겨줘야 할까? BoardController에 replyHidden을 또 boolean으로 변환하는 것이 필요할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 아래와 같이 변경했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;content.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1728796274690&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;글 읽기&amp;lt;/h1&amp;gt;
&amp;lt;table &amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;글번호&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.no}&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;${boardDTO.id}&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;${boardDTO.readcount}&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;${boardDTO.writetime}&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;${boardDTO.subject}&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;${boardDTO.content}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div style=&quot;display: center&quot;&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;c:if test=&quot;${sessionScope.id eq boardDTO.id}&quot;&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/update?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 수정&quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;${pageContext.request.contextPath}/board/delete?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 삭제&quot;&amp;gt;&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/list&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 목록&quot;&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;hr&amp;gt;
댓글&amp;lt;br&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/board/replyInsertPro&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;textarea rows=&quot;5&quot; cols=&quot;30&quot; style=&quot;width: 792px; height: 60px&quot; placeholder=&quot;내용을 작성해주세요.&quot; name=&quot;replyContent&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;&amp;lt;input type=&quot;checkbox&quot; name=&quot;replyHidden&quot; value=&quot;true&quot;&amp;gt;비밀글 &amp;lt;input type=&quot;hidden&quot; name=&quot;replyHidden&quot; value=&quot;false&quot;&amp;gt;&amp;lt;input type=&quot;submit&quot; value=&quot;작성&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
댓글 목록&amp;lt;br&amp;gt;
이곳에 댓글 목록이 나타남. 작성자 - 댓글 내용 순으로
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1728796285802&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/replyInsertPro&quot;)
	public String replyInsertPro(ReplyDTO replyDTO,BoardDTO boardDTO, Model model) {
		System.out.println(&quot;BoardController replyInsertPro()&quot;);
		//replyHidden을 boolean으로 변환
//		if(&quot;true&quot;.equals(replyDTO.getReplyHidden())) {
//			replyDTO.setReplyHidden(true);
//		} else {
//			replyDTO.setReplyHidden(false);
//		}
		boardService.replyInsert(replyDTO);
		return &quot;redirect:/board/content?no=&quot;+boardDTO.getNo();
	}&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;BoardSerivce&lt;/p&gt;
&lt;pre id=&quot;code_1728796297155&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void replyInsert(ReplyDTO replyDTO) {
		System.out.println(&quot;BoardService replyInsert()&quot;);
//		replyDTO.setNum(boardDAO.getMaxNum()+1); //댓글 번호(PK) 값 설정
		replyDTO.setReplyWriteTime(new Timestamp(System.currentTimeMillis())); //댓글 작성 시간
		boardDAO.replyInsert(replyDTO);
	}&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;BoardDAO&lt;/p&gt;
&lt;pre id=&quot;code_1728796315144&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void replyInsert(ReplyDTO replyDTO) {
		System.out.println(&quot;BoardDAO replyInsert()&quot;);
		sqlSession.insert(namespace+&quot;.replyInsert&quot;, replyDTO);
	}
	
//	public int getMaxNum() {
//		System.out.println(&quot;BoardDAO getMaxNum()&quot;);
//		return sqlSession.selectOne(namespace+&quot;.getMaxNum&quot;);
//	}&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;boardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1728796329476&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;insert id=&quot;replyInsert&quot;&amp;gt;
		insert into reply(num,id,replyContent,replyHidden,replyWriteTime)
		values(#{num},#{id},#{replyContent},#{replyHidden},#{replyWriteTime})
	&amp;lt;/insert&amp;gt;
	
&amp;lt;!-- 	&amp;lt;select id=&quot;getMaxNum&quot; resultType=&quot;java.lang.Integer&quot;&amp;gt; --&amp;gt;
&amp;lt;!-- 		select max(num) from reply --&amp;gt;
&amp;lt;!-- 	&amp;lt;/select&amp;gt; --&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qHM1J/btsJ221hRgh/w51yCEFKVYtKSrELVr1MN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qHM1J/btsJ221hRgh/w51yCEFKVYtKSrELVr1MN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qHM1J/btsJ221hRgh/w51yCEFKVYtKSrELVr1MN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqHM1J%2FbtsJ221hRgh%2Fw51yCEFKVYtKSrELVr1MN0%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;959&quot; height=&quot;574&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여전히 오류가 발생하지만 발생하는 이유는 주소줄에서 no=0이라 그런 것 같다. 기존의 no값을 넘겨갈 줄 알았는데 아닌 것 같다. 그래도 값은 들어간 것 같아서 확인해 봤다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4V3u7/btsJ3JtwXAp/u8IChgET68kZKtEhqx7K11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4V3u7/btsJ3JtwXAp/u8IChgET68kZKtEhqx7K11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4V3u7/btsJ3JtwXAp/u8IChgET68kZKtEhqx7K11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4V3u7%2FbtsJ3JtwXAp%2Fu8IChgET68kZKtEhqx7K11%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;742&quot; height=&quot;229&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;229&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;content.jsp에 jstl을 이용해서 나타내기를 하면 될 것 같고, no값이 제대로 받아올 수 있게 수정하면 얼추 될 것 같다.&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;/p&gt;
&lt;pre id=&quot;code_1728797362584&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;글 읽기&amp;lt;/h1&amp;gt;
&amp;lt;table &amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;글번호&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.no}&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;${boardDTO.id}&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;${boardDTO.readcount}&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;${boardDTO.writetime}&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;${boardDTO.subject}&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;${boardDTO.content}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div style=&quot;display: center&quot;&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;c:if test=&quot;${sessionScope.id eq boardDTO.id}&quot;&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/update?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 수정&quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;${pageContext.request.contextPath}/board/delete?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 삭제&quot;&amp;gt;&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/list&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 목록&quot;&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;hr&amp;gt;
댓글&amp;lt;br&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/board/replyInsertPro&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;textarea rows=&quot;5&quot; cols=&quot;30&quot; style=&quot;width: 792px; height: 60px&quot; placeholder=&quot;내용을 작성해주세요.&quot; name=&quot;replyContent&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;&amp;lt;input type=&quot;checkbox&quot; name=&quot;replyHidden&quot; value=&quot;true&quot;&amp;gt;비밀글 &amp;lt;input type=&quot;hidden&quot; name=&quot;replyHidden&quot; value=&quot;false&quot;&amp;gt;&amp;lt;input type=&quot;submit&quot; value=&quot;작성&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
댓글 목록&amp;lt;br&amp;gt;
&amp;lt;c:forEach var=&quot;replyDTO&quot; items=&quot;${replyList}&quot;&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;${replyDTO.id}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${replyDTO.replyContent}&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/c:forEach&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1728797377894&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/replyInsertPro&quot;)
	public String replyInsertPro(ReplyDTO replyDTO,BoardDTO boardDTO, Model model) {
		System.out.println(&quot;BoardController replyInsertPro()&quot;);
		//replyHidden을 boolean으로 변환
//		if(&quot;true&quot;.equals(replyDTO.getReplyHidden())) {
//			replyDTO.setReplyHidden(true);
//		} else {
//			replyDTO.setReplyHidden(false);
//		}
		boardService.replyInsert(replyDTO);
		return &quot;redirect:/board/content?no=&quot;+boardDTO.getNo();
	}
    
	@GetMapping(&quot;/content&quot;)
	public String content(BoardDTO boardDTO, ReplyDTO replyDTO, Model model) {
		System.out.println(&quot;BoardController Content()&quot;);
		boardDTO = boardService.getBoard(boardDTO); //글에 대한 정보
		boardService.readCount(boardDTO); //조회수
		
		List&amp;lt;ReplyDTO&amp;gt; replyList = boardService.getReplyList();
		
		model.addAttribute(&quot;boardDTO&quot;,boardDTO);
		model.addAttribute(&quot;replyDTO&quot;,replyDTO);
		return &quot;board/content&quot;;
	}&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;BoardSerivce&lt;/p&gt;
&lt;pre id=&quot;code_1728797410960&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void replyInsert(ReplyDTO replyDTO) {
		System.out.println(&quot;BoardService replyInsert()&quot;);
//		replyDTO.setNum(boardDAO.getMaxNum()+1); //댓글 번호(PK) 값 설정
		replyDTO.setReplyWriteTime(new Timestamp(System.currentTimeMillis())); //댓글 작성 시간
		boardDAO.replyInsert(replyDTO);
	}

	public List&amp;lt;ReplyDTO&amp;gt; getReplyList() {
		System.out.println(&quot;BoardService getReplyList()&quot;);
		return boardDAO.getReplyList();
	}&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;BoardDAO&lt;/p&gt;
&lt;pre id=&quot;code_1728797423448&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void replyInsert(ReplyDTO replyDTO) {
		System.out.println(&quot;BoardDAO replyInsert()&quot;);
		sqlSession.insert(namespace+&quot;.replyInsert&quot;, replyDTO);
	}

	
//	public int getMaxNum() {
//		System.out.println(&quot;BoardDAO getMaxNum()&quot;);
//		return sqlSession.selectOne(namespace+&quot;.getMaxNum&quot;);
//	}

	public List&amp;lt;ReplyDTO&amp;gt; getReplyList() {
		System.out.println(&quot;BoardDAO getReplyList()&quot;);
		return sqlSession.selectList(namespace+&quot;.getReplyList&quot;);
	}&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;boardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1728797434822&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;insert id=&quot;replyInsert&quot;&amp;gt;
		insert into reply(num,id,replyContent,replyHidden,replyWriteTime)
		values(#{num},#{id},#{replyContent},#{replyHidden},#{replyWriteTime})
	&amp;lt;/insert&amp;gt;
	
&amp;lt;!-- 	&amp;lt;select id=&quot;getMaxNum&quot; resultType=&quot;java.lang.Integer&quot;&amp;gt; --&amp;gt;
&amp;lt;!-- 		select max(num) from reply --&amp;gt;
&amp;lt;!-- 	&amp;lt;/select&amp;gt; --&amp;gt;

	&amp;lt;select id=&quot;getReplyList&quot; resultType=&quot;com.mystory001.domain.ReplyDTO&quot;&amp;gt;
		select *
		from reply
		order by replyWriteTime desc
	&amp;lt;/select&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXerWf/btsJ3lzFLiR/IRgIyxjTVAujjm6MlSvKa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXerWf/btsJ3lzFLiR/IRgIyxjTVAujjm6MlSvKa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXerWf/btsJ3lzFLiR/IRgIyxjTVAujjm6MlSvKa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXerWf%2FbtsJ3lzFLiR%2FIRgIyxjTVAujjm6MlSvKa0%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;891&quot; height=&quot;499&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 이와같은 ERD인데, 테이블 board와 reply는 no로 연결되어야할 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reply 테이블에 no 컬럼을 추가하고 외래키를 지정해주자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnIu5x/btsJ28ObN8z/0Sns4Mi6BPSRHwpgWVR5J1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnIu5x/btsJ28ObN8z/0Sns4Mi6BPSRHwpgWVR5J1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnIu5x/btsJ28ObN8z/0Sns4Mi6BPSRHwpgWVR5J1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnIu5x%2FbtsJ28ObN8z%2F0Sns4Mi6BPSRHwpgWVR5J1%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;782&quot; height=&quot;386&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 ReplyDTO에 no 객체 생성&lt;/p&gt;
&lt;pre id=&quot;code_1728798269528&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	private int no;
	
	
	public int getNo() {
		return no;
	}

	public void setNo(int no) {
		this.no = no;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/299</guid>
      <comments>https://001cloudid.tistory.com/entry/justBoard13-%EB%8C%93%EA%B8%80-%EA%B5%AC%ED%98%843-%EB%8D%B0%EC%9D%B4%ED%84%B0#entry299comment</comments>
      <pubDate>Sun, 13 Oct 2024 11:57:19 +0900</pubDate>
    </item>
    <item>
      <title>justBoard12 댓글 구현(2) 화면</title>
      <link>https://001cloudid.tistory.com/entry/justBoard12-%EB%8C%93%EA%B8%80-%EA%B5%AC%ED%98%842-%ED%99%94%EB%A9%B4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2일 전 화면 구성에 대해서 테이블 생성과 DTO를 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;board/content.jsp에 대충 hr태그와 textarea태그를 넣어서 검사를 통해 크기 조정을 해보았다.&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;1068&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eAxS1Z/btsJ2H4dDpk/pHUtiQm0R153khKYBwrb71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eAxS1Z/btsJ2H4dDpk/pHUtiQm0R153khKYBwrb71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eAxS1Z/btsJ2H4dDpk/pHUtiQm0R153khKYBwrb71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeAxS1Z%2FbtsJ2H4dDpk%2FpHUtiQm0R153khKYBwrb71%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;1068&quot; height=&quot;580&quot; data-origin-width=&quot;1068&quot; data-origin-height=&quot;580&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;/p&gt;
&lt;pre id=&quot;code_1728701571647&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;글 읽기&amp;lt;/h1&amp;gt;
&amp;lt;table &amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;글번호&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.no}&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;${boardDTO.id}&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;${boardDTO.readcount}&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;${boardDTO.writetime}&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;${boardDTO.subject}&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;${boardDTO.content}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div style=&quot;display: center&quot;&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;c:if test=&quot;${sessionScope.id eq boardDTO.id}&quot;&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/update?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 수정&quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;${pageContext.request.contextPath}/board/delete?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 삭제&quot;&amp;gt;&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/list&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 목록&quot;&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;hr&amp;gt;
댓글&amp;lt;br&amp;gt;
&amp;lt;form action=&quot;&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;textarea rows=&quot;5&quot; cols=&quot;30&quot; style=&quot;width: 792px; height: 60px&quot; placeholder=&quot;내용을 작성해주세요.&quot; name=&quot;replyContent&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;&amp;lt;input type=&quot;checkbox&quot; name=&quot;replyHidden&quot;&amp;gt;비밀글 &amp;lt;input type=&quot;submit&quot; value=&quot;작성&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;1219&quot; data-origin-height=&quot;749&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tt0NP/btsJ3gSjMKl/GVeayA2PlKwW37mIY68FO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tt0NP/btsJ3gSjMKl/GVeayA2PlKwW37mIY68FO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tt0NP/btsJ3gSjMKl/GVeayA2PlKwW37mIY68FO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftt0NP%2FbtsJ3gSjMKl%2FGVeayA2PlKwW37mIY68FO1%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;1219&quot; height=&quot;749&quot; data-origin-width=&quot;1219&quot; data-origin-height=&quot;749&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;pre id=&quot;code_1728707830222&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;글 읽기&amp;lt;/h1&amp;gt;
&amp;lt;table &amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;글번호&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.no}&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;${boardDTO.id}&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;${boardDTO.readcount}&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;${boardDTO.writetime}&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;${boardDTO.subject}&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;${boardDTO.content}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div style=&quot;display: center&quot;&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;c:if test=&quot;${sessionScope.id eq boardDTO.id}&quot;&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/update?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 수정&quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;${pageContext.request.contextPath}/board/delete?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 삭제&quot;&amp;gt;&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/list&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 목록&quot;&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;hr&amp;gt;
댓글&amp;lt;br&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/board/replyUpdatePro&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;textarea rows=&quot;5&quot; cols=&quot;30&quot; style=&quot;width: 792px; height: 60px&quot; placeholder=&quot;내용을 작성해주세요.&quot; name=&quot;replyContent&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;&amp;lt;input type=&quot;checkbox&quot; name=&quot;replyHidden&quot;&amp;gt;비밀글 &amp;lt;input type=&quot;submit&quot; value=&quot;작성&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;hr&amp;gt;
댓글 목록&amp;lt;br&amp;gt;
이곳에 댓글 목록이 나타남. 작성자 - 댓글 내용 순으로
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;rarr; 페이지가 새로고침 &amp;rarr; 현재 페이지로 구현하고 싶다. 대부분의 사이트의 경우 ajax로 구현하여 부분만 업데이트 되는 식으로 되어있는 것을 쉽게 확인 할 수 있고, 이 방법은 꽤나 오래된 방법이지 않을까 싶지만 기본부터 다지는 것이 중요하다고 생각되어서 이 방법으로 구현하고 그 후 ajax를 이용해서 구현해 볼 생각이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;내가 구현하고자하는 방법을 어떻게 구현해야할지 감이 오지 않아 검색을 해보았다. 현재 JSP 페이지에서 &lt;b&gt;댓글을 작성하고, 작성 후 현재 글을 새로 고침하는 기능을 추가&lt;/b&gt;하려면 댓글 작성 후 &lt;b&gt;댓글 목록을 포함한 같은 페이지로 리다이렉트&lt;/b&gt;해야한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;즉, 코드로 보자면 먼저 댓글 작성 후 리다이렉트&lt;/p&gt;
&lt;pre id=&quot;code_1728707490385&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PostMapping(&quot;/replyUpdatePro&quot;)
public String replyUpdatePro(ReplyDTO replyDTO) {
    boardService.replyUpdatePro(replyDTO);
    return &quot;redirect:/board/content?no=&quot; + reply.getBoardNo(); // 댓글이 작성된 게시글로 리다이렉트
}&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로&amp;nbsp;JSP 페이지에서 댓글 목록 표시&lt;/p&gt;
&lt;pre id=&quot;code_1728707621030&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@GetMapping(&quot;content&quot;)
public String viewPost(BoardDTO boardDTO,ReplyDTO replyDTO, Model model) {
    BoardDTO boardDTO = boardService.getBoard(boardDTO);
    List&amp;lt;Reply&amp;gt; reply = boardService.getCommentsByPostId(boardDTO);
    model.addAttribute(&quot;boardDTO&quot;, boardDTO);
    model.addAttribute(&quot;replyDTO&quot;, replyDTO);
    return &quot;viewPost&quot;; // 게시글 뷰 JSP
}&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;정리하자면 1. 댓글 작성 후 해당글로 리다이렉트하여 새로 고침된 상태로 보여줌 2. 댓글 목록을 가져와 JSP에서 반복문을 통해 출력.. 막상 이렇게 하려고나니 jQuery작성하는게 조금 복잡하긴하지만 ajax로 구현하는 게 더 편하겠다는 생각이 든다...&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;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/298</guid>
      <comments>https://001cloudid.tistory.com/entry/justBoard12-%EB%8C%93%EA%B8%80-%EA%B5%AC%ED%98%842-%ED%99%94%EB%A9%B4#entry298comment</comments>
      <pubDate>Sat, 12 Oct 2024 13:38:36 +0900</pubDate>
    </item>
    <item>
      <title>justBoard11 댓글 구현(1) DB</title>
      <link>https://001cloudid.tistory.com/entry/justBoard11-%EB%8C%93%EA%B8%80-%EA%B5%AC%ED%98%841</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;댓글을 구현해보고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;객체&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;댓글과 관련된 객체를 먼저 어디에 무엇을 만들지 먼저 생각해 보도록 하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckEPmD/btsJ0e7ioGo/mLNzCBnpqKqgYZibdsF7Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckEPmD/btsJ0e7ioGo/mLNzCBnpqKqgYZibdsF7Q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckEPmD/btsJ0e7ioGo/mLNzCBnpqKqgYZibdsF7Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckEPmD%2FbtsJ0e7ioGo%2FmLNzCBnpqKqgYZibdsF7Q0%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;806&quot; height=&quot;277&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;티스토리의 댓글을 살펴보면 댓글 작성자, 댓글 내용, 댓글 작성 시간, 비밀글 여부 이렇게 생각해 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DTO를 새로 만들어도 될 것 같고, 아니면 기존에 있던 BoardDTO에 객체를 추가하는 방법이 있을 것 같다.&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;만약 새로운 ReplyDTO를 만든다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String id, String replyContent, boolean replyHidden, Timestamp replyWriteTime 이렇게 객체를 만들면 될 것 같다.&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;BoardDTO에 객체를 추가하는 식으로 한다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;String replyContent, boolean replyHidden, Timestamp replyWriteTime을 추가해 주면 될 것이다.&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BjG6Q/btsJZnxnjcY/VZpbkh5q4d9KNPR7TSMBo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BjG6Q/btsJZnxnjcY/VZpbkh5q4d9KNPR7TSMBo1/img.png&quot; data-alt=&quot;댓글과 대댓글&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BjG6Q/btsJZnxnjcY/VZpbkh5q4d9KNPR7TSMBo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBjG6Q%2FbtsJZnxnjcY%2FVZpbkh5q4d9KNPR7TSMBo1%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;657&quot; height=&quot;407&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;댓글과 대댓글&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;댓글이 작성될 때마다 한 칸씩 늘어가는 방식보다는 한 댓글에 대댓글을 나열하는 방식으로 만들고자 한다. 댓글 그룹이 필요할 것이고, 들여 쓰기와 답글 순서가 필요할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int re_ref 댓글그룹, int re_lev 들여쓰기, int re_seq 답글순서도 함께 추가해야 할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구현&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;1. 일반 댓글과 비밀 댓글&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀글 체크박스를 둔다. 체크하고 댓글을 작성했을 때 비밀글이 되며, 글의 작성자와 비밀 댓글 작성자만 볼 수 있으며, 그렇지 않은 이용자는 &quot;비밀 댓글이므로 접근할 수 없습니다.&quot;라고 구현할 것이다. 이는 어렵지 않게 구현할 수 있을 것 같다. 체크박스를 체크하면 replyHidden이 true가 되게 로직을 짜면 될 것이고, jstl을 이용해서 작성자와 댓글 작성자를 확인하는 과정을 거치면 어렵지 않을 것이다.&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;2. 위에서 언급했듯이 처음 작성하는 댓글 re_lev을 0으로 설정하고 그 댓글의 대댓글을 re_lev 1로 설정 그 아래로 계속 대댓글의 댓글을 re_lev 1로만 설정하면 댓글과 대댓글 그림과 같이 구현할 수 있을 것 같다.&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;4. 댓글 수정, 삭제 시 어떻게 구현할지에 대해 두 가지 방법이 있는데 뭘로 할지 아직도 고민 중이다. 수정, 삭제되었을 때 그냥 깔끔하게 완전히 삭제될 것이냐, 아니면 작성자가 삭제했습니다. 와 같은 방식으로 할지... 나는 깔끔한 걸 좋아해서 완전히 삭제되는 것을 선호하나 이것은 둘 다 구현해 보도록 할 예정이다. 만약 작성자가 삭제했습니다. 이 방법으로 구현하려고 하려면 객체가 추가되어야 하므로, 먼저 완전히 삭제되는 방식으로 먼저 구현해 볼 예정이다.&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;5.&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;808&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xqGJd/btsJZ6n8ox5/tm3ij7spOnpAJFkYvHDzQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xqGJd/btsJZ6n8ox5/tm3ij7spOnpAJFkYvHDzQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xqGJd/btsJZ6n8ox5/tm3ij7spOnpAJFkYvHDzQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxqGJd%2FbtsJZ6n8ox5%2Ftm3ij7spOnpAJFkYvHDzQ1%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;808&quot; height=&quot;372&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;댓글을 작성했을 때 페이지가 새로고침 되지 않고 곧장 글이 작성된다. 이 부분은 ajax를 이용한 것 같은데 기본적인 기능을 모두 구현한 후 마지막에 구현하는 것으로 생각해 볼 예정이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DTO 및 테이블 생성&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;먼저 DTO를 어떻게 해야할지 검색하다가 참고할 만한 정리 글을 보았다. &lt;a href=&quot;https://velog.io/@cyseok123/%EB%8C%93%EA%B8%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@cyseok123/%EB%8C%93%EA%B8%80&lt;/a&gt;, &lt;a href=&quot;https://devofroad.tistory.com/59&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devofroad.tistory.com/59&lt;/a&gt; 나중에 막힐 때 힌트식으로 참고하면 될 것 같다. 구현해 놓은 곳을 찾아보면 새로운 DTO(VO)를 만들어서 제작하는 것 같다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그렇다면 왜 따로 만들까? 궁금증이 생겨 찾아봤지만 결국 원하는 대답을 찾기 어려웠다. 무엇보다 어떻게 검색을 해야 할지 어려웠다. 여기에서는 ChatGPT의 도움을 받았다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;BoardDTO에 댓글 객체 추가&lt;br /&gt;&lt;b&gt;장점&lt;br /&gt;&lt;/b&gt;구조가 단순해져서 게시판과 댓글을 함께 다룰 수 있어 편리함&lt;br /&gt;댓글 수가 적고 게시글과 강하게 연관되어 있는 경우, 데이터 조회 시 편리함&lt;br /&gt;&lt;b&gt;단점&lt;br /&gt;&lt;/b&gt;댓글 수가 많아지거나 복잡한 기능(대댓글, 좋아요 등)을 추가할 경우 DTO가 비대해지고 관리하기 어려움&lt;br /&gt;&lt;u&gt;게시글과 댓글의 독립적인 관리&lt;/u&gt;가 어려움&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;ReplyDTO 클래스 만들기&lt;br /&gt;&lt;b&gt;장점&lt;/b&gt;&lt;br /&gt;댓글 관련 기능을 독립적으로 관리할 수 있어 확장성이 높음&lt;br /&gt;게시글과 댓글의 책임을 분리하여 코드의 가독성과 유지보수성을 높일 수 있음&lt;br /&gt;&lt;b&gt;단점&lt;/b&gt;&lt;br /&gt;댓글을 조회할 때 게시글과 댓글을 함께 조합해야 하므로 복잡성을 증가할 수 있음&lt;br /&gt;클래스와 연관 관계를 설정&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다 따로 만드는 것에는 이유가 있었다. 새로운 클래스로 DTO를 만드는 방식으로 구현하도록 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ReplyDTO&lt;/p&gt;
&lt;pre id=&quot;code_1728535027181&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.domain;

import java.sql.Timestamp;

public class ReplyDTO {
	
	private String id; //댓글 작성자
	private String replyConent; //댓글 내용
	private boolean replyHidden; //비밀글 여부(true &amp;rarr; 비밀글, false &amp;rarr; 일반글(default))
	private Timestamp replyWriteTime; //댓글 작성 시간
	private int re_ref; //댓글 그룹
	private int re_lev; //들여쓰기
	private int re_seq; //댓글 순서
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getReplyConent() {
		return replyConent;
	}
	public void setReplyConent(String replyConent) {
		this.replyConent = replyConent;
	}
	public boolean isReplyHidden() {
		return replyHidden;
	}
	public void setReplyHidden(boolean replyHidden) {
		this.replyHidden = replyHidden;
	}
	public Timestamp getReplyWriteTime() {
		return replyWriteTime;
	}
	public void setReplyWriteTime(Timestamp replyWriteTime) {
		this.replyWriteTime = replyWriteTime;
	}
	public int getRe_ref() {
		return re_ref;
	}
	public void setRe_ref(int re_ref) {
		this.re_ref = re_ref;
	}
	public int getRe_lev() {
		return re_lev;
	}
	public void setRe_lev(int re_lev) {
		this.re_lev = re_lev;
	}
	public int getRe_seq() {
		return re_seq;
	}
	public void setRe_seq(int re_seq) {
		this.re_seq = re_seq;
	}

}&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cmd로 스키마(데이터베이스) 조회를 하려고 했는데 예약어가 기억이 안났다. 데이터베이스 조회하기 show databases이다. 참고로 MySQL의 경우 스키마와 데이터베이스가 거의 동일한 의미이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;217&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wQ5Vx/btsJZrmiQuF/JAaufGHtThv7F0mJMiLMlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wQ5Vx/btsJZrmiQuF/JAaufGHtThv7F0mJMiLMlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wQ5Vx/btsJZrmiQuF/JAaufGHtThv7F0mJMiLMlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwQ5Vx%2FbtsJZrmiQuF%2FJAaufGHtThv7F0mJMiLMlk%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;217&quot; height=&quot;325&quot; data-origin-width=&quot;217&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;use test 를 이용해서 데이터베이스를 사용하게 끔하고 테이블 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블을 생성하려고하니 PK를 뭘로해야할지에 대해 문제가 생겼다. 그래서 num이라는 컬럼 PK로 지정히기로 함. 기본키로만 사용하려고 만든 컬럼이다. 또한 ReplyDTO에도 num이라는 객체를 만들어줬으며 conent라고 오타가 있어 함께 수정했다.&lt;/p&gt;
&lt;pre id=&quot;code_1728539357994&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.domain;

import java.sql.Timestamp;

public class ReplyDTO {
	
	private String id; //댓글 작성자(FK - Member)
	private String replyContent; //댓글 내용
	private boolean replyHidden; //비밀글 여부(true &amp;rarr; 비밀글, false &amp;rarr; 일반글(default))
	private Timestamp replyWriteTime; //댓글 작성 시간
	private int re_ref; //댓글 그룹
	private int re_lev; //들여쓰기
	private int re_seq; //댓글 순서
	private int num; //댓글 번호(PK)
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getReplyContent() {
		return replyContent;
	}
	public void setReplyContent(String replyContent) {
		this.replyContent = replyContent;
	}
	public boolean isReplyHidden() {
		return replyHidden;
	}
	public void setReplyHidden(boolean replyHidden) {
		this.replyHidden = replyHidden;
	}
	public Timestamp getReplyWriteTime() {
		return replyWriteTime;
	}
	public void setReplyWriteTime(Timestamp replyWriteTime) {
		this.replyWriteTime = replyWriteTime;
	}
	public int getRe_ref() {
		return re_ref;
	}
	public void setRe_ref(int re_ref) {
		this.re_ref = re_ref;
	}
	public int getRe_lev() {
		return re_lev;
	}
	public void setRe_lev(int re_lev) {
		this.re_lev = re_lev;
	}
	public int getRe_seq() {
		return re_seq;
	}
	public void setRe_seq(int re_seq) {
		this.re_seq = re_seq;
	}

}&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;문뜩 boolean타입이 MySQL에 있었나라는 생각이 들었다. 그래서 과거 프로젝트에서 int로 구분했던 것 같은데.. 찾아보니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서 BOOLEAN 타입이 없기 때문에 TINYINT(1)을 사용하여 BOOLEAN을 대신한다고 되어있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mdkgP/btsJZuRgelB/QBdyFRtPXYKEJwrx17Kx8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mdkgP/btsJZuRgelB/QBdyFRtPXYKEJwrx17Kx8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mdkgP/btsJZuRgelB/QBdyFRtPXYKEJwrx17Kx8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmdkgP%2FbtsJZuRgelB%2FQBdyFRtPXYKEJwrx17Kx8k%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;530&quot; height=&quot;402&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외래키 제약조건을 설정하지 않았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lqK8s/btsJ0bjdXfH/WeWFcqAHPgCax7yW6Oksp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lqK8s/btsJ0bjdXfH/WeWFcqAHPgCax7yW6Oksp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lqK8s/btsJ0bjdXfH/WeWFcqAHPgCax7yW6Oksp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlqK8s%2FbtsJ0bjdXfH%2FWeWFcqAHPgCax7yW6Oksp1%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;610&quot; height=&quot;240&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블을 수정하면서 외래키를 추가하고 싶다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;alter table 테이블명 add foreign key(컬럼명) references 참조테이블(참조컬럼);&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 참조하는 테이블의 PK가 하나라면 참조컬럼은 생략 가능함.&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;542&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PYqst/btsJ1HOHO7L/Xm7DZkZ3tLLQH6cQ84PSwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PYqst/btsJ1HOHO7L/Xm7DZkZ3tLLQH6cQ84PSwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PYqst/btsJ1HOHO7L/Xm7DZkZ3tLLQH6cQ84PSwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPYqst%2FbtsJ1HOHO7L%2FXm7DZkZ3tLLQH6cQ84PSwK%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;542&quot; height=&quot;235&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;235&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;일단 기본적으로 테이블 설계와 DTO를 설정해놨으니 남은 부분은 화면 그리고 기능 구현을 하면 될 것 같다.&lt;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/297</guid>
      <comments>https://001cloudid.tistory.com/entry/justBoard11-%EB%8C%93%EA%B8%80-%EA%B5%AC%ED%98%841#entry297comment</comments>
      <pubDate>Thu, 10 Oct 2024 15:05:40 +0900</pubDate>
    </item>
    <item>
      <title>DBMS</title>
      <link>https://001cloudid.tistory.com/entry/DBMS</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;목차&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;DB와 DBMS&lt;/li&gt;
&lt;li&gt;SQL&lt;/li&gt;
&lt;li&gt;용어&lt;/li&gt;
&lt;li&gt;데이터베이스 구축 절차&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. DB와 DBMS&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OuhNt/btsJWy5IAf8/kgyLksbsE1jnRLvH61K9d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OuhNt/btsJWy5IAf8/kgyLksbsE1jnRLvH61K9d1/img.png&quot; data-alt=&quot;DB와 DBMS 관계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OuhNt/btsJWy5IAf8/kgyLksbsE1jnRLvH61K9d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOuhNt%2FbtsJWy5IAf8%2FkgyLksbsE1jnRLvH61K9d1%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;252&quot; height=&quot;207&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DB와 DBMS 관계&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위의 그림은 DB와 DBMS의 관계를 아주 쉽게 표현해 놓은 것이라고 생각한다. 그렇다면 DB는 무엇이면 DBMS는 무엇인지에 대해 자세히 알아보고자 한다.&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;DB&lt;/b&gt;란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조직화된 정보들의 모음, 데이터의 집합, 데이터의 저장 공간 자체를 의미&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd548P/btsJV3rCW5t/xOLw4iZ3gJhmKlkMI0SqBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd548P/btsJV3rCW5t/xOLw4iZ3gJhmKlkMI0SqBK/img.png&quot; data-alt=&quot;DB의 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd548P/btsJV3rCW5t/xOLw4iZ3gJhmKlkMI0SqBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd548P%2FbtsJV3rCW5t%2FxOLw4iZ3gJhmKlkMI0SqBK%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;633&quot; height=&quot;239&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;239&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DB의 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DBMS&lt;/b&gt;란?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DataBase Management System의 약자로 데이터의 집합인 데이터베이스를 관리해 주는 프로그램을 의미&lt;/li&gt;
&lt;li&gt;데이터베이스 생성부터 데이터베이스의 유지, 저장 공간, 백업/복구 등을 관리&lt;/li&gt;
&lt;li&gt;데이터 검색, 삽입, 수정, 삭제 작업을 함.&lt;/li&gt;
&lt;li&gt;유형 : 관계형, 계층형, 망형, 객체지향형 등&lt;/li&gt;
&lt;li&gt;종류 : Oracle, MySQL, MariaDB, SQL Server, DB2, SQLite 등&lt;/li&gt;
&lt;li&gt;&lt;u&gt;특징&lt;/u&gt;&lt;br /&gt;데이터 무결성 : 제약 조건을 통해 데이터의 오류를 관리&lt;br /&gt;데이터 독립성 : 데이터 베이스가 변경되거나 저장소가 변경되어도 기존 데이터에 영향을 미치지 않음&lt;br /&gt;보안 : 권한, 암호화 등의 보안 기능&lt;br /&gt;데이터 중복의 최소화 : 공유가 가능하므로 동일한 데이터가 중복 저장되는 것을 방지&lt;br /&gt;응용 프로그램 제작 및 유지보수의 편의성 : 여러 응용 프로그램과 호환되어 프로그램 개발 및 유지보수가 쉬움&lt;br /&gt;데이터의 안정성 향상 : 백업, 복구 기능을 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. SQL(Structured Query Language)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;관계형 DBMS에서 사용되는 언어&lt;/li&gt;
&lt;li&gt;ANSI 표준이므로 모든 DBMS에서 동일하게 사용. &lt;br /&gt;단, &lt;u&gt;모든 DBMS의 SQL문이 완벽하게 동일하지 않음&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;표준 SQL과 함께 자체 문법도 포함&lt;br /&gt;Oracle의 경우 +PL/SQL, MySQL의 경우 +SQL, SQL Server : + T-SQL&lt;/li&gt;
&lt;li&gt;&lt;u&gt;구문&lt;/u&gt;&lt;br /&gt;DQL(데이터질의어) : select&lt;br /&gt;DDL(데이터정의어) create alter drop truncate&lt;br /&gt;DML(데이터조작어) insert update delete&lt;br /&gt;DCL(데이터제어어) grant revoke&lt;br /&gt;TCL(트랜잭션제어어) commit rollback savepoint&lt;br /&gt;※ 교재에 따라 select를 DML로 포함한다. 나는 그게 중요한 건 아니라고 생각하는 주의라 그냥 그런가 보다 하고 넘어가면 된다고 생각한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 용어&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스에서 가장 어려운 것 중 하나를 뽑으라면 '용어'라고 대답할 것이다. 같은 의미인데 부르는게 참으로 다양하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mTEU8/btsJV7gvhD6/ImaV3w3D06u4ERreQ7OvA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mTEU8/btsJV7gvhD6/ImaV3w3D06u4ERreQ7OvA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mTEU8/btsJV7gvhD6/ImaV3w3D06u4ERreQ7OvA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmTEU8%2FbtsJV7gvhD6%2FImaV3w3D06u4ERreQ7OvA0%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;761&quot; height=&quot;490&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DBMS(Database Management System)&lt;br /&gt;데이터베이스 관리 시스템의 약자. 데이터베이스를 관리하는 시스템 또는 프로그램&lt;/li&gt;
&lt;li&gt;DB&lt;br /&gt;조직화 된 정보들의 모음 또는 데이터의 집합. DB는 고유한 이름을 가져야 함&lt;/li&gt;
&lt;li&gt;객체(Object)&lt;br /&gt;유무형의 정보를 가지고 있는 독립적인 실체. 종류로는 테이블, 뷰, 인덱스 등이 있음&lt;/li&gt;
&lt;li&gt;테이블(Table)&lt;br /&gt;데이터베이스 내에서 데이터를 저장할 때 가장 많이 사용하는 객체 유형. 행과 열로 이루어져 있음&lt;/li&gt;
&lt;li&gt;데이터(Data)&lt;br /&gt;테이블과 같은 객체에 저장된 실제 정보&lt;/li&gt;
&lt;li&gt;열(Column)&lt;br /&gt;열, 컬럼, 속성, 어트리뷰트(Attribute)라고 부름. 테이블에서 세로 부분, 하나의 테이블은 여러 개의 열로 구성&lt;br /&gt;※ 여기서는 컬럼이라는 용어로 부를 예정&lt;/li&gt;
&lt;li&gt;열 이름(Column name)&lt;br /&gt;각 열을 구분하기 위한 이름. 테이블 내에서 고유해야 함&lt;/li&gt;
&lt;li&gt;행(Row)&lt;br /&gt;행, 로우, 레코드라고도 함. 테이블에서 가로 부분, 데이터 전체를 의미&lt;/li&gt;
&lt;li&gt;SQL&lt;br /&gt;사람과 DBMS가 소통하기 위해 사용하는 언어&lt;/li&gt;
&lt;li&gt;기본키(Primary Key, PK)&lt;br /&gt;테이블의 컬럼을 구분해 줄 수 있는 대표 컬럼에게 부여하는 제약 조건으로, 중복값과 비어 있는 값이 들어 올 수 없음&lt;/li&gt;
&lt;li&gt;외래키(Foreign Key, FK)&lt;br /&gt;테이블과 테이블을 연결해 주는 제약 조건. 테이블에서 FK가 적용된 컬럼을 자식 컬럼, FK가 참조하는 컬럼을 부모 컬럼이라고 함&lt;/li&gt;
&lt;li&gt;스키마(Schema)&lt;br /&gt;데이터를 담는 그릇&lt;br /&gt;※MySQL의 경우 스키마가 &lt;i&gt;&lt;u&gt;DB&lt;/u&gt;&lt;/i&gt;와 동일한 의미로 사용. Oracle에서는 스키마가 &lt;i&gt;&lt;u&gt;유저&lt;/u&gt;&lt;/i&gt;와 동일한 의미로 사용&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 데이터베이스 구축 절차&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yuXsL/btsJVaywoKR/ruygK6GJEmKM1Q7q5Wg1Jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yuXsL/btsJVaywoKR/ruygK6GJEmKM1Q7q5Wg1Jk/img.png&quot; data-alt=&quot;데이터베이스 구축 절차&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yuXsL/btsJVaywoKR/ruygK6GJEmKM1Q7q5Wg1Jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyuXsL%2FbtsJVaywoKR%2FruygK6GJEmKM1Q7q5Wg1Jk%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;764&quot; height=&quot;469&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;469&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터베이스 구축 절차&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DBMS를 설치한 후 『데이터베이스 생성 &amp;rarr; 테이블 생성 &amp;rarr; 데이터 입력 &amp;rarr; 데이터 조회 및 활용』으로 데이터베이스 구축 절차가 이루어진다. 그 이 후 데이터 백업 및 관리나 응용 프로그램 개발 시 데이터 활용 등에 데이터가 사용된다. MySQL을 기준으로 설명할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※SQL문은 대문자로 작성하는 것이 통상적인 관행이다. 하지만 나는 대문자로 작성하는 것이 익숙하지도 않고 오타 날 확률이 높아 소문자로 작성하는 편이다. 앞으로도 그럴 예정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;데이터베이스 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1728188177137&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;create schema 스키마명;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;테이블 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1728188183734&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;create table 테이블명(컬럼명1 데이터타입(컬럼사이즈)[default, 제약조건], 컬럼명2 데이터타입(컬럼사이즈) [default, 제약조건] ,...);&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;p data-ke-size=&quot;size16&quot;&gt;데이터베이스명, 스키마명, 테이블명, 컬럼명 등은 영문을 사용(한글도 가능하나 호환성 문제가 발생할 가능성이 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqlrgK/btsJW7GBzjT/zkm7qaU2IDRTAyYnjNXxaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqlrgK/btsJW7GBzjT/zkm7qaU2IDRTAyYnjNXxaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqlrgK/btsJW7GBzjT/zkm7qaU2IDRTAyYnjNXxaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqlrgK%2FbtsJW7GBzjT%2Fzkm7qaU2IDRTAyYnjNXxaK%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;752&quot; height=&quot;571&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ char와 varchar : 공간효율 varchar, 성능 및 속도 char&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8Gf1p/btsJViww5gU/JlpO5E29lssVrfDIyhvRk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8Gf1p/btsJViww5gU/JlpO5E29lssVrfDIyhvRk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8Gf1p/btsJViww5gU/JlpO5E29lssVrfDIyhvRk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Gf1p%2FbtsJViww5gU%2FJlpO5E29lssVrfDIyhvRk1%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;752&quot; height=&quot;532&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;532&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;b&gt;auto_increment 속성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 삽입 시 자동으로 1부터 시작해서 1씩 증가하는 값이 반환. 시작값과 증가값은 변경 가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, PK, Unique 제약조건이 선언된 컬럼 + 숫자 데이터 타입 걸럼에만 가능&lt;/p&gt;
&lt;pre id=&quot;code_1728189276536&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;create table 테이블명 (컬럼명 int/bigint auto_increment primary key,...); //테이블 생성 시
alter table 테이블명 auto_increment=입력값; //테이블 생성 후 auto_increment 시작값 변경
set @@auto_increment_incrrment=증가값; //증가값 변경&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;데이터 입력, 수정 및 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 입력&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728189433757&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;insert into 테이블명[(컬럼1, 컬럼2,...)]
values (값1, 값2,...);&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;p data-ke-size=&quot;size16&quot;&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;/b&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;pre id=&quot;code_1728189942148&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;update 테이블명 
set 컬럼명1 = 값, 컬럼명2 = 값,...
[where 조건문];&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_1728189992892&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;delete from 테이블명
[where 조건문];&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;데이터 수정, 삭제 시 where문이 없을 경우 컬럼명=값에 대한 모든 데이터가 수정되고, 데이터 모두 삭제됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;데이터 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1728190113234&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select 컬럼명|*
from 테이블명
where 조건문
group by 그룹
having 그룹 조건
order by 컬럼명;&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;select 문의 논리적 실행 순서 from &amp;rarr; where &amp;rarr; group by &amp;rarr; having &amp;rarr; select &amp;rarr; order by&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;예약어 distinct 데이터 값 중복 제거, alias 별칭&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>organize/데이터베이스</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/296</guid>
      <comments>https://001cloudid.tistory.com/entry/DBMS#entry296comment</comments>
      <pubDate>Sun, 6 Oct 2024 13:51:34 +0900</pubDate>
    </item>
    <item>
      <title>웹 시큐리티</title>
      <link>https://001cloudid.tistory.com/entry/%EC%9B%B9-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0</link>
      <description>&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;933&quot; data-origin-height=&quot;635&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLf7qF/btsJVZW3Srv/eJEuCsvDKirSUud2y45610/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLf7qF/btsJVZW3Srv/eJEuCsvDKirSUud2y45610/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLf7qF/btsJVZW3Srv/eJEuCsvDKirSUud2y45610/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLf7qF%2FbtsJVZW3Srv%2FeJEuCsvDKirSUud2y45610%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;933&quot; height=&quot;635&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;635&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;h2 data-ke-size=&quot;size26&quot;&gt;스프링 웹 시큐리티&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바 기반의 스프링 애플리케이션에서 보안을 강화하기 위한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주요 기능&lt;/b&gt;으로는 인증, 인가, CSRF보호, 세션 관리, 비밀번호 암호화 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주요 개념&lt;/b&gt;으로는 SecurityFilterChain, AuthenticationManager, UserDetailsService, GrantedAuthority가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 기능&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;인증(Authentication)&lt;br /&gt;사용자 인증을 통해 애플리케이션에 접근할 수 있는 사용자를 확인&lt;br /&gt;다양한 인증 방식을 지원&lt;/li&gt;
&lt;li&gt;인가(Authorization)&lt;br /&gt;인증된 사용자가 특정 자원에 접근할 수 있는지를 결정&lt;br /&gt;역할 기반 접근 제어 및 권한 기반 접근 제어를 지원&lt;/li&gt;
&lt;li&gt;CSRF 보호&lt;br /&gt;크로스 사이트 요청 위조 공격으로부터 애플리케이션을 보호&lt;/li&gt;
&lt;li&gt;세션 관리&lt;br /&gt;사용자의 세션을 관리하고, 세션 고정 공격을 방지&lt;/li&gt;
&lt;li&gt;비밀번호 암호화&lt;br /&gt;사용자의 비밀번호를 안전하게 저장하기 위해 다양한 암호화 알고리즘을 지원&lt;/li&gt;
&lt;li&gt;커스터마이징&lt;br /&gt;필터, 인터셉터 등을 통해 보안 기능을 커스터마이즈&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 개념&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;SecurityFilterChain&lt;br /&gt;요청을 처리하는 필터 체인으로, 각 필터는 요청을 가로채고 특정 작업을 수행&lt;/li&gt;
&lt;li&gt;AuthenticationManager&lt;br /&gt;인증 요청을 처리하는 컴포넌트로, 사용자 정보를 확인하고 인증 토큰을 생성&lt;/li&gt;
&lt;li&gt;UserDetailsService&lt;br /&gt;사용자 정보를 제공하는 서비스 인터페이스로, 데이터베이스에서 사용자 정보를 로드하는 데 사용&lt;/li&gt;
&lt;li&gt;GrantedAuthority&lt;br /&gt;사용자의 권한을 나타내는 인터페이스로, 특정 권한을 가진 사용자인지를 확인하는 데 사용&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;구현 과정&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;환경 설정&lt;br /&gt;- Maven이나 Gradle을 통해 spring-security-core, spring-security-web, spring-security-config를 시큐리티 관련 의존성 추가&lt;br /&gt;- web.xml 파일에 필터를 설정하여 시큐리티 필터가 작동하도록 함&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;보안 설정 XML 또는 Java 구성&lt;br /&gt;- 보안 설정을 XML 파일 또는 Java 클래스를 통해 구성&lt;br /&gt;1) XML을 설정하면 spring-security.xml 파일에 설정을 정의&lt;br /&gt;2) Java 클래스를 사용하면 WebSecurityConfigurerAdapter 를 확장하여 설정&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;사용자 인증 설정&lt;br /&gt;1) XML 설정&lt;br /&gt;&lt;span&gt;&amp;lt;&lt;span&gt;security:authentication-manager&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;lt;&lt;span&gt;security:authentication-provider&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;lt;&lt;span&gt;security:user-service&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;span&gt;security:user&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;&quot;user&quot;&lt;/span&gt; &lt;span&gt;password&lt;/span&gt;=&lt;span&gt;&quot;password&quot;&lt;/span&gt; &lt;span&gt;authorities&lt;/span&gt;=&lt;span&gt;&quot;ROLE_USER&quot;&lt;/span&gt;/&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;span&gt;security:user&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;&quot;admin&quot;&lt;/span&gt; &lt;span&gt;password&lt;/span&gt;=&lt;span&gt;&quot;admin&quot;&lt;/span&gt; &lt;span&gt;authorities&lt;/span&gt;=&lt;span&gt;&quot;ROLE_ADMIN&quot;&lt;/span&gt;/&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;lt;/&lt;span&gt;security:user-service&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;lt;/&lt;span&gt;security:authentication-provider&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;security:authentication-manager&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;2) Java 설정 : AuthenticationManagerBuilder를 사용해 메모리 기반 인증을 설정&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;HTTP 보안 설정&lt;br /&gt;1) XML 설정&lt;br /&gt;&amp;lt;security:http&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;security:intercept-url&amp;nbsp;pattern=&quot;/admin/**&quot;&amp;nbsp;access=&quot;ROLE_ADMIN&quot;&amp;nbsp;/&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;security:intercept-url&amp;nbsp;pattern=&quot;/&quot;&amp;nbsp;access=&quot;permitAll&quot;&amp;nbsp;/&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;security:intercept-url&amp;nbsp;pattern=&quot;/**&quot;&amp;nbsp;access=&quot;isAuthenticated()&quot;&amp;nbsp;/&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;security:form-login&amp;nbsp;login-page=&quot;/login&quot;&amp;nbsp;permit-all=&quot;true&quot;&amp;nbsp;/&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;security:logout&amp;nbsp;permit-all=&quot;true&quot;&amp;nbsp;/&amp;gt; &lt;br /&gt;&amp;lt;/security:http&amp;gt; &lt;br /&gt;2) Java 설정&lt;br /&gt;HttpSercurity를 사용하여 요청에 대한 접근 권한을 설정. URL 패턴에 따라 권한을 부여하고, 폼 로그인 및 로그아웃 기능을 추가&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;로그인 및 로그아웃 설정&lt;br /&gt;로그인 페이지를 설정하고, 사용자가 로그인을 할 수 있도록 함. 로그아웃 기능을 통해 사용자가 세션을 종료할 수 있도록 설정&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;종합적인 접근 제어&lt;br /&gt;anyRequest().authenticated()와 같은 메소드를 사용하여 인증된 사용자만 접근할 수 있도록 모든 요청에 대한 기본 보안을 설정&lt;/li&gt;
&lt;/ol&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_1728098372720&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser(&quot;user&quot;).password(&quot;{noop}password&quot;).roles(&quot;USER&quot;)
            .and()
            .withUser(&quot;admin&quot;).password(&quot;{noop}admin&quot;).roles(&quot;ADMIN&quot;);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers(&quot;/admin/**&quot;).hasRole(&quot;ADMIN&quot;)
                .antMatchers(&quot;/&quot;, &quot;/home&quot;).permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage(&quot;/login&quot;)
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
}&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;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;예시에 사용된 코드 설명&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Configuration&lt;br /&gt;&amp;rarr; 해당 클래스가 하나 이상의 @Bean 메소드를 포함하고 있으며, Spring IoC 컨테이너에 의해 처리되어야 함을 나타냄. 즉 이 클래스는 스프링의 설정 클래스&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;@EnableWebSecurity&lt;br /&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;rarr;&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;SecurityConfig extends WebSecurityConfigurerAdapter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;rarr;&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;configure(AuthenticationManagerBuilder auth) throws Exception&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;rarr; 사용자 인증을 설정하는 데 사용. AuthenticationManagerBuilder를 통해 인증 관련 설정을 정의&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&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;/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;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/295</guid>
      <comments>https://001cloudid.tistory.com/entry/%EC%9B%B9-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0#entry295comment</comments>
      <pubDate>Sat, 5 Oct 2024 12:39:10 +0900</pubDate>
    </item>
    <item>
      <title>프레임워크, Spring과 Spring Boot</title>
      <link>https://001cloudid.tistory.com/entry/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-Spring%EA%B3%BC-Spring-Boot</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;프레임워크&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&quot;프레임워크가 무엇인가요?&quot;라고 물어본다면 &quot;애플리케이션을 만드는 데 &lt;b&gt;기본적인 골격을 제공&lt;/b&gt;하는 소프트웨어&quot;라고 대답할 것 같다. 정보처리기사에서 프레임워크라는 용어가 나오기 때문에 이렇게 외운 적 있다. 뭔가 부족한 답변인 것도 안다. 그렇다면 프레임워크란 무엇인지에 대해 정리해 보도록 하겠다.&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;&amp;nbsp;프레임워크는 소프트웨어 개발을 위한 일종의 틀이나 구조로, 특정한 문제를 해결하기 위해 미리 설계된 클래스와 라이브러리의 집합이다. 개발자는 이 틀을 기반으로 애플리케이션을 개발하면서 일관성과 생산성을 높일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;프레임워크의 특징으로는 재사용성, 구조 제공, 기능의 확장성이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Spring과 SpringBoot&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자바 프레임워크의 종류&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 프레임워크, 스프링 부트, 자바 서버 페이스스(JavaServer Faces, JSF), 하이버네이트, 스트럿츠 등 다양하게 존재한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공통점&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;자바 기반&lt;/li&gt;
&lt;li&gt;의존성 주입 : 의존성 주입을 활용하여 코드의 모듈성을 높이고, 테스트 용이성을 향상&lt;/li&gt;
&lt;li&gt;모듈화 : 스프링의 다양한 모듈(Spring MVC, Spring Data(사용해본적없음))을 사용할 수 있어 다양한 기능을 지원&lt;/li&gt;
&lt;li&gt;POJO 중심 : Plain Old Java Object를 활용하여 비즈니스 로직을 구현&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;차이점(스프링 - 초록색, 스프링 부트 - 파란색)&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;설정 방식&lt;br /&gt;-&lt;span style=&quot;color: #009a87;&quot;&gt;XML이나 Java Configuration 클래스를 사용해 설정&lt;/span&gt;&lt;br /&gt;-&lt;span style=&quot;color: #006dd7;&quot;&gt;자동 설정 기능을 통해 대부분의 설정을 자동으로 처리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;기본 제공 기능&lt;br /&gt;-&lt;span style=&quot;color: #009a87;&quot;&gt;기본적으로 핵심 기능만 제공되며, 필요한 라이브러리나 설정을 직접 추가&lt;/span&gt;&lt;br /&gt;-&lt;span style=&quot;color: #006dd7;&quot;&gt;내장 웹 서버를 포함하고 있어, 별도의 서버 설정 없이도 애플리케이션을 바로 실행 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;프로젝트 시작&lt;br /&gt;-&lt;span style=&quot;color: #009a87;&quot;&gt;새로운 프로젝트를 시작할 때 필요한 설정이 많고, 초기 설정이 복잡&lt;/span&gt;&lt;br /&gt;-&lt;span style=&quot;color: #006dd7;&quot;&gt;Spring Initializr와 같은 도구를 통해 간편하게 시작할 수 있고, 기본적인 프로젝트 구조가 자동으로 생성&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;의존성 관리&lt;br /&gt;-&lt;span style=&quot;color: #009a87;&quot;&gt;의존성 관리를 수동으로 해야 할 경우가 많음&lt;/span&gt;&lt;br /&gt;-&lt;span style=&quot;color: #006dd7;&quot;&gt;스타터 의존성을 제공하여 필요한 라이브러리를 쉽게 관리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;배포&lt;br /&gt;-&lt;span style=&quot;color: #009a87;&quot;&gt;WAR 파일로 배포하거나 외부 서버에 배포&lt;/span&gt;&lt;br /&gt;-&lt;span style=&quot;color: #006dd7;&quot;&gt;JAR 파일로 패키징하여 독립 실행형 애플리케이션으로 쉽게 배포&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약하자면 &quot;스프링 부트는 스프링의 장점을 더욱 쉽게 활용할 수 있게 해준다.&quot;라고 할 수 있다.&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;/p&gt;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/294</guid>
      <comments>https://001cloudid.tistory.com/entry/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-Spring%EA%B3%BC-Spring-Boot#entry294comment</comments>
      <pubDate>Fri, 4 Oct 2024 15:44:32 +0900</pubDate>
    </item>
    <item>
      <title>redirect, redirect와 RequestDispatcher</title>
      <link>https://001cloudid.tistory.com/entry/redirect</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;redirect&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;redirect가 붙고 안 붙고의 차이에 대해서 알아보고자 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1727925017590&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/insert&quot;)
	public String insert() {
		System.out.println(&quot;BoardController insert()&quot;);
		return &quot;board/insert&quot;;
	}
	
	@PostMapping(&quot;/insertPro&quot;)
	public String insertPro(BoardDTO boardDTO) {
		System.out.println(&quot;BoardController insertPro()&quot;);
		boardService.insert(boardDTO);
		
		return &quot;redirect:/board/list&quot;;
	}&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;그냥 게시판을 만들 때 리턴값을 redirect를 붙이고 안 붙이고 차이가 있다. 사실 전부터 이해가 될 듯 말 듯한 내용이다.&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;655&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5YJM5/btsJUOAzirZ/u6U0q996GbhunmPDwSUhH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5YJM5/btsJUOAzirZ/u6U0q996GbhunmPDwSUhH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5YJM5/btsJUOAzirZ/u6U0q996GbhunmPDwSUhH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5YJM5%2FbtsJUOAzirZ%2Fu6U0q996GbhunmPDwSUhH1%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;655&quot; height=&quot;456&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 list페이지이다. 여기서 글쓰기를 누른다면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ARht5/btsJSKmshk7/6ZIdqGKNIah21mYno7lqs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ARht5/btsJSKmshk7/6ZIdqGKNIah21mYno7lqs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ARht5/btsJSKmshk7/6ZIdqGKNIah21mYno7lqs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FARht5%2FbtsJSKmshk7%2F6ZIdqGKNIah21mYno7lqs0%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;673&quot; height=&quot;475&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;insert페이지로 이동한다. 위의 코드대로 작성하기를 누르면?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oizse/btsJS8tNROS/Z2rjwt1iPmk4yVqn7I1Tl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oizse/btsJS8tNROS/Z2rjwt1iPmk4yVqn7I1Tl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oizse/btsJS8tNROS/Z2rjwt1iPmk4yVqn7I1Tl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foizse%2FbtsJS8tNROS%2FZ2rjwt1iPmk4yVqn7I1Tl1%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;644&quot; height=&quot;477&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;477&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글이 작성되고 list 페이지로 넘어간다. 그렇다면 insertPro() 메소드에서 redirect를 없앤다면?&lt;/p&gt;
&lt;pre id=&quot;code_1727925314750&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/insertPro&quot;)
	public String insertPro(BoardDTO boardDTO) {
		System.out.println(&quot;BoardController insertPro()&quot;);
		boardService.insert(boardDTO);
		
//		return &quot;redirect:/board/list&quot;;
		return &quot;board/list&quot;;
	}&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFYF1c/btsJUuI7SLE/AFkAzEklGAt21ka4Hz4t0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFYF1c/btsJUuI7SLE/AFkAzEklGAt21ka4Hz4t0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFYF1c/btsJUuI7SLE/AFkAzEklGAt21ka4Hz4t0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFYF1c%2FbtsJUuI7SLE%2FAFkAzEklGAt21ka4Hz4t0k%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;620&quot; height=&quot;467&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list페이지로 넘어가지 않고 위의 화면이 나타난다. 그렇다면 글은 작성되었을까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mUP8b/btsJSQfQzAp/Hfb3zunj4c41KkisyuBMf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mUP8b/btsJSQfQzAp/Hfb3zunj4c41KkisyuBMf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mUP8b/btsJSQfQzAp/Hfb3zunj4c41KkisyuBMf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmUP8b%2FbtsJSQfQzAp%2FHfb3zunj4c41KkisyuBMf1%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;659&quot; height=&quot;445&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;즉 redirect가 붙고 안 붙고의 차이를 정리하면,&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;redirect가 붙은 경우&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;클라이언트에게 다른 URL로 이동하도록 지시함. &quot;redirect:/board/list&quot;라고 한다면 서버는 클라이언트에게 /board/list로 새로운 요청을 보내라는 응답을 함. 이 방식은 보통 폼 제출 후에 사용되며, 페이지 새로 고침 시 동일한 요청이 다시 발생하는 것을 방지한다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;redirect가 붙지 않은 경우&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;지정한 뷰의 이름을 반환하고, 해당 뷰를 렌더링하여 클라이언트에게 직접 보내줌. &quot;board/insert&quot;라고 하면, 해당 JSP 페이지를 서버가 렌더링하여 클라이언트에게 응답으로 전달함. 주로 데이터를 입력받는 폼을 표시할 때 사용됨.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, redirect는 &lt;u&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;클라이언트를 다른 URL로 이동&lt;/span&gt;&lt;/u&gt;시키고, redirect가 붙지 않는 경우는 &lt;u&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;지정된 뷰를 직접 보여주는&lt;/span&gt;&lt;/u&gt; 차이가 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;redirect와 RequestDispatcher&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSP에서는 forward보다는 주로 RequestDispatcher를 통해 내부적으로 요청을 포워딩하는 방식으로 처리됨&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;redirect방식&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;고객이 고객센터로 상담원에게 123번으로 전화를 건다.&lt;/li&gt;
&lt;li&gt;상담원은 고객에게 &quot;해당 문의 사항은 124번으로 다시 문의해주시겠어요?&lt;/li&gt;
&lt;li&gt;고객은 통화를 끊고 124번으로 전화를 걸어 일을 처리한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;forward(RequestDispatcher)&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;고객이 고객센터로 상담원에게 123번으로 전화를 건다.&lt;/li&gt;
&lt;li&gt;상담원은 해당 문제를 해결하지 못 해 슈퍼바이저에게 답을 얻는다.&lt;/li&gt;
&lt;li&gt;상담원은 슈퍼바이저에게 얻은 답을 가지고 문제사항을 처리해준다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 :&amp;nbsp;&lt;a href=&quot;https://doublesprogramming.tistory.com/63&quot;&gt;https://doublesprogramming.tistory.com/63&lt;/a&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;redirect&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정의&lt;/b&gt; : 클라이언트에게 새로운 URL로 이동하라고 지시&lt;/li&gt;
&lt;li&gt;&lt;b&gt;작동 방식&lt;/b&gt; : 서버가 클라이언트에게 HTTP 상태 코드를 포함한 응답을 보내며, 새로운 URL로 요청을 보냄&lt;/li&gt;
&lt;li&gt;&lt;b&gt;클라이언트 URL&lt;/b&gt; : 클라이언트의 URL이 변경. 사용자가 보게 되는 URL이 실제로 리다이렉트된 주소로 바뀜&lt;/li&gt;
&lt;li&gt;&lt;b&gt;세션/속성&lt;/b&gt; : 리다이렉션 후에는 요청 속성을 잃어버림. 필요한 데이터는 세션이나 파라미터 등을 통해 전달해야함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 예&lt;/b&gt; : 폼 제출 후, 결과 페이지로 이동할 때 많이 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RequestDispatcher(Forward)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정의&lt;/b&gt; : 요청을 다른 리소스로 내부적으로 전달&lt;/li&gt;
&lt;li&gt;&lt;b&gt;작동 방식&lt;/b&gt; : 서버가 요청을 다른 서블릿이나 JSP 페이지로 포워딩하여 해당 리소스를 처리하도록 함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;클라이언트 URL&lt;/b&gt; : 클라이언트의 URL이 변경되지 않음. URL은 원래 요청한 URL을 그대로 유지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;세션/속성&lt;/b&gt; : 요청 속성과 세션 속성을 모두 공유 할 수 있어 같은 요청 내에서 데이터 전달에 용이&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 예&lt;/b&gt; : 같은 요청 내에서 다른 뷰를 렌더링할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 요약&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL의 변화&lt;br /&gt;redirect - URL이 변경&lt;br /&gt;Forward - URL이 유지&lt;/li&gt;
&lt;li&gt;데이터 전달&lt;br /&gt;redirect - 요청 속성을 잃음&lt;br /&gt;Forward - 속성을 공유&lt;/li&gt;
&lt;li&gt;용도&lt;br /&gt;redirect - 주로 요청 후 결과 페이지로 이동할 때&lt;br /&gt;Forward - 같은 요청 내에서 뷰를 전환할 때&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/293</guid>
      <comments>https://001cloudid.tistory.com/entry/redirect#entry293comment</comments>
      <pubDate>Thu, 3 Oct 2024 13:40:07 +0900</pubDate>
    </item>
    <item>
      <title>CSS</title>
      <link>https://001cloudid.tistory.com/entry/CSS</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;목차&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. CSS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 스타일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 선택자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 우선순위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. CSS&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cascading style sheets의 약자로 HTML태그로 작성한 웹 문서 내용에 디자인으로 옷을 입혀주는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형식은 선택자(태그){속성1:값1; 속성2:값2;....}이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 스타일&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스타일은 3가지가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;인라인 스타일 : 태그에 바로 넣기&lt;/li&gt;
&lt;li&gt;내부 스타일 시트 : head 태그 안에 &amp;lt;style&amp;gt;태그 안에 선택자,태그를 이용해서 스타일 넣기&lt;/li&gt;
&lt;li&gt;외부 스타일 : 외부에 파일을 만들어 가져다 쓰는 방법으로 공통적으로 스타일 적용하기 유용함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 선택자&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;전체 선택자 : *&lt;/li&gt;
&lt;li&gt;태그 선택자 : id=id이름 #id이름 혹은 class=class이름 .class이름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 우선순위&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;!important&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;인라인 스타일&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;id 스타일&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;class 스타일&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;태그 스타일&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>organize/웹기초</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/291</guid>
      <comments>https://001cloudid.tistory.com/entry/CSS#entry291comment</comments>
      <pubDate>Thu, 3 Oct 2024 12:40:07 +0900</pubDate>
    </item>
    <item>
      <title>페이지 처리</title>
      <link>https://001cloudid.tistory.com/entry/%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%B2%98%EB%A6%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;페이지 처리 또는 페이징 처리와 검색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※페이징 처리 기법 X&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;page에 필요한 객체 &amp;rarr; pageDTO&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접근 제어자를 private를 해줌으로써 객체에 직접적으로 접근하지 못하게 함. lombok을 사용하면 어노테이션을 이용해서 getter/setter, 생성자를 작성 안해줘도 된다고 하지만, lombok을 제대로 사용해본적이 없으므로&lt;/p&gt;
&lt;pre id=&quot;code_1727836945031&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class PageDTO {

	private int pageSize; //글의 개수
	private int currentPage; //현재 페이지
	private String pageNum;
	
	private int startRow; //시작하는 행 번호
	private int endRow; //끝나는 행 번호
	
	private int pageBlock; //한 화면에 보여줄 페이지 개수
	private int startPage; //시작 페이지
	private int endPage; //끝 페이지
	
	private int count; //전체 글의 개수
	private int pageCount; //전체 페이지 개수
	
	private String search; //검색어

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public int getCurrentPage() {
		return currentPage;
	}

	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}

	public String getPageNum() {
		return pageNum;
	}

	public void setPageNum(String pageNum) {
		this.pageNum = pageNum;
	}

	public int getStartRow() {
		return startRow;
	}

	public void setStartRow(int startRow) {
		this.startRow = startRow;
	}

	public int getEndRow() {
		return endRow;
	}

	public void setEndRow(int endRow) {
		this.endRow = endRow;
	}

	public int getPageBlock() {
		return pageBlock;
	}

	public void setPageBlock(int pageBlock) {
		this.pageBlock = pageBlock;
	}

	public int getStartPage() {
		return startPage;
	}

	public void setStartPage(int startPage) {
		this.startPage = startPage;
	}

	public int getEndPage() {
		return endPage;
	}

	public void setEndPage(int endPage) {
		this.endPage = endPage;
	}

	public int getCount() {
		return count;
	}

	public void setCount(int count) {
		this.count = count;
	}

	public int getPageCount() {
		return pageCount;
	}

	public void setPageCount(int pageCount) {
		this.pageCount = pageCount;
	}

	public String getSearch() {
		return search;
	}

	public void setSearch(String search) {
		this.search = search;
	}
	
}&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;Controller&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목록이 많은 곳에 작성한다. 예를 들어 게시판이 대표적일 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1727837195869&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/list&quot;)
	public String main(HttpServletRequest request, Model model, PageDTO pageDTO) {
		System.out.println(&quot;BoardController main()&quot;);
		
		String search = request.getParameter(&quot;search&quot;); //검색어 가져오기
		
		//페이지
		int pageSize = 5; //화면에 보여줄 글의 개수
		String pageNum = request.getParameter(&quot;pageNum&quot;);
		if(pageNum ==null) {
			pageNum = &quot;1&quot;;
		}
		int currentPage =Integer.parseInt(pageNum);	//int형 currentPage 변수명에 pageNum을 정수형으로 변경	
		
		//pageDTO에 저장
		pageDTO.setPageSize(pageSize);
		pageDTO.setPageNum(pageNum);
		pageDTO.setCurrentPage(currentPage);
		pageDTO.setSearch(search);
		
		List&amp;lt;BoardDTO&amp;gt; boardList = boardService.getBoardList(pageDTO); //게시물
		
		int count = boardService.getBoardCount(pageDTO); //전체 글의 개수 구하기
		int pageBlock = 5; //한 화면에 보여 줄 페이지 개수 설정
		int startPage = (currentPage - 1) / pageBlock * pageBlock + 1; //한 화면에 보여 줄 시작 페이지(1~10 -&amp;gt; 1, 11~20 -&amp;gt; 11,...)
		int endPage = startPage + pageBlock - 1; //한 화면에 보여 줄 끝 페이지
		int pageCount = count / pageSize + (count%pageSize==0? 0:1); //전체 페이지 개수
		if(endPage&amp;gt;pageCount) {
			endPage = pageCount;
		}
		
		pageDTO.setCount(count);
		pageDTO.setPageBlock(pageBlock);
		pageDTO.setStartPage(startPage);
		pageDTO.setEndPage(endPage);
		pageDTO.setPageCount(pageCount);
		
		model.addAttribute(&quot;boardList&quot;,boardList);
		model.addAttribute(&quot;pageDTO&quot;,pageDTO);
		
		return &quot;board/list&quot;;
	}&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;Service&lt;/p&gt;
&lt;pre id=&quot;code_1727837232610&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public List&amp;lt;BoardDTO&amp;gt; getBoardList(PageDTO pageDTO) {
		System.out.println(&quot;BoardService getBoardList()&quot;);
		
		//시작하는 행 번호 구하기(currentPage,pageSize)
		int currentPage = pageDTO.getCurrentPage();
		int pageSize = pageDTO.getPageSize();
		int startRow = (currentPage - 1) * pageSize + 1;
		int endRow = startRow + pageSize - 1;
		
		pageDTO.setStartRow(startRow - 1);
		pageDTO.setEndRow(endRow);
		
		return boardDAO.getBoardList(pageDTO);
	}&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;DAO&lt;/p&gt;
&lt;pre id=&quot;code_1727837245721&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public List&amp;lt;BoardDTO&amp;gt; getBoardList(PageDTO pageDTO) {
		System.out.println(&quot;BoardDAO getBoardList()&quot;);
		return sqlSession.selectList(namespace+&quot;.getBoardList&quot;, pageDTO);
	}&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;mapper&lt;/p&gt;
&lt;pre id=&quot;code_1727837278001&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;getBoardList&quot; resultType=&quot;com.mystory001.domain.BoardDTO&quot;&amp;gt;
		select *
		from board
		&amp;lt;if test=&quot;search != null&quot;&amp;gt;
		where `subject` like concat('%',#{search},'%')
		&amp;lt;/if&amp;gt;
		order by `no` desc
		limit #{startRow}, #{pageSize}
	&amp;lt;/select&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>organize/스프링</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/292</guid>
      <comments>https://001cloudid.tistory.com/entry/%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%B2%98%EB%A6%AC#entry292comment</comments>
      <pubDate>Wed, 2 Oct 2024 12:50:19 +0900</pubDate>
    </item>
    <item>
      <title>HTML</title>
      <link>https://001cloudid.tistory.com/entry/HTML</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;목차&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. HTML이란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. HTML 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 태그&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. HTML이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;웹 문서를 만드는 언어&lt;/b&gt;&lt;/u&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;HTML은 Hyper Text Markup Language의 약자이다.&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;HyperText란? 문서를 서로 연결해주는 링크를 의미한다. 인터넷에서 링크만 클릭하면 다른 페이지나 사이트로 쉽게 연결할 수 있다.&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;Markup이란? 웹 브라우저에 내용을 보여주는 텍스트, 이미지, 영상 등의 위치를 표시한다는 의미이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. HTML 구조&lt;/h3&gt;
&lt;pre id=&quot;code_1727834861043&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt; : 현재 문서가 HTML5 언어로 작성한 웹 문서라는 뜻
&amp;lt;html&amp;gt;~&amp;lt;/html&amp;gt; : 웹 문서의 시작과 끝을 나타내는 태그. 웹 브라우저가 &amp;lt;html&amp;gt;태그를 만나면 &amp;lt;/html&amp;gt;까지 소스를 읽어 화면에 표시
&amp;lt;head&amp;gt;~&amp;lt;/head&amp;gt; : 웹 브라우저가 웹 문서를 헤석하는 데 필요한 정보를 입력하는 부분
&amp;lt;title&amp;gt;~&amp;lt;/title&amp;gt; : 웹 문서의 타이틀
&amp;lt;body&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 태그&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;제목을 나타내는 태그&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;h1이 가장 큰 제목이고, 점점 작아짐.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;ex)&lt;/span&gt;&lt;br /&gt;&amp;lt;h1&amp;gt;제목1&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;h2&amp;gt;제목2&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;lt;h3&amp;gt;제목3&amp;lt;/h3&amp;gt;&lt;br /&gt;&amp;lt;h4&amp;gt;제목4&amp;lt;/h4&amp;gt;&lt;br /&gt;&amp;lt;h5&amp;gt;제목5&amp;lt;/h5&amp;gt;&lt;br /&gt;&amp;lt;h6&amp;gt;제목6&amp;lt;/h6&amp;gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oUia8/btsJSH26HSS/RJqYICRdtjBkruMs4v4x00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oUia8/btsJSH26HSS/RJqYICRdtjBkruMs4v4x00/img.png&quot; data-alt=&quot;hn 태그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oUia8/btsJSH26HSS/RJqYICRdtjBkruMs4v4x00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoUia8%2FbtsJSH26HSS%2FRJqYICRdtjBkruMs4v4x00%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;700&quot; height=&quot;448&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;hn 태그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;텍스트 단락을 만드는 태그&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;p&amp;gt;내용&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;ex)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;p&amp;gt;본문의 내용은&amp;lt;br&amp;gt; 여기에1&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;p&amp;gt;본문의 내용은 여기에2&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;p&amp;gt;본문의 내용은 여기에3&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OEj4F/btsJSpavs9F/xa8kaejoIQAuAWvHQx1gGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OEj4F/btsJSpavs9F/xa8kaejoIQAuAWvHQx1gGK/img.png&quot; data-alt=&quot;p 태그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OEj4F/btsJSpavs9F/xa8kaejoIQAuAWvHQx1gGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOEj4F%2FbtsJSpavs9F%2Fxa8kaejoIQAuAWvHQx1gGK%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;700&quot; height=&quot;294&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;p 태그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;줄 바꿈&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;편집기에서 줄을 바꾸더라도 웹 브라우저에서는 한 줄로 표시&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;br&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;brake를 뜻한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;ex)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;HTML(Hyper Text Markup Language) : 웹 문서를 만드는 언어&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/span&gt;&lt;br /&gt;안녕하세요&amp;lt;br&amp;gt;&lt;br /&gt;안녕하세요&amp;lt;br&amp;gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3A5Dl/btsJRBQjqQG/zfCZkAbDMIteWOkm58K0P1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3A5Dl/btsJRBQjqQG/zfCZkAbDMIteWOkm58K0P1/img.png&quot; data-alt=&quot;br 태그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3A5Dl/btsJRBQjqQG/zfCZkAbDMIteWOkm58K0P1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3A5Dl%2FbtsJRBQjqQG%2FzfCZkAbDMIteWOkm58K0P1%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;700&quot; height=&quot;170&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;br 태그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;인용할 때 쓰는 태그&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;사용빈도는 그리 높지 않음.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;blockquote&amp;gt; 인용문 내용 &amp;lt;/blockquote&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;ex)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;blockquote&amp;gt;인용문 내용1&amp;lt;br&amp;gt;인용문 내용2&amp;lt;/blockquote&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dn17R6/btsJRXr7ikO/saFVkp7XNrCjOL1ToQWra0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dn17R6/btsJRXr7ikO/saFVkp7XNrCjOL1ToQWra0/img.png&quot; data-alt=&quot;blockquote 태그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dn17R6/btsJRXr7ikO/saFVkp7XNrCjOL1ToQWra0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdn17R6%2FbtsJRXr7ikO%2FsaFVkp7XNrCjOL1ToQWra0%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;700&quot; height=&quot;135&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;65&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;blockquote 태그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;글자 진하게 태그&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;b&amp;gt; 내용 &amp;lt;/b&amp;gt;&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;글자 진하게 강조 태그&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;em&amp;gt; 내용 &amp;lt;/em&amp;gt;&lt;/span&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: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;기울기 태그&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;i&amp;gt; 내용 &amp;lt;/i&amp;gt;&lt;/span&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: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;밑줄 태그&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;u&amp;gt; 내용 &amp;lt;/u&amp;gt;&lt;/span&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: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;취소선 태그&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;s&amp;gt; 내용 &amp;lt;/s&amp;gt;&lt;/span&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: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;위첨자 태그&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;sup&amp;gt; 내용 &amp;lt;/sup&amp;gt;&lt;/span&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: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;아래첨자 태그&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;sub&amp;gt; 내용 &amp;lt;/sub&amp;gt;&lt;/span&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: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;영역 표시 태그&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: &amp;lt;div&amp;gt; 내용 &amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;작은&amp;nbsp; 영역 표시 태그&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: &amp;lt;span&amp;gt; 내용 &amp;lt;/span&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;※ 주로 영역 표 시작은 영역 표시로 쓰인다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;div&amp;gt;영역 표시 &amp;lt;span&amp;gt;작은 영역 표시&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&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: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;텍스트 굵게 강조&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;strong&amp;gt;굵게 강조할 텍스트&amp;lt;/strong&amp;gt;&lt;/span&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: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;주석 달기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;!-- 내용 --&amp;gt; Ctrl + Shift + C&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Ctrl + Shift + /&lt;/span&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: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;모양 정렬&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Ctrl + Shift + F&lt;/span&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: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;공백&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;amp;nbsp;&lt;/span&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공백(\&amp;amp;nbsp\;)를 여러 번 작성하면 여러 번 작성한 만큼 공백이 생기지만, 띄어쓰기(space bar)는 여러 번 작성해도 한 번만 인식&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;목록에는 순서가 있는 것과 순서가 없는 것이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;목록 태그는 &amp;lt;li&amp;gt;&amp;lt;/li&amp;gt;인데, 단독으로 사용할 수 없다. 부모 태그가 있어야 하는데 ,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;부모 태그로는 '순서가 있는 목록 태그 : &amp;lt;ol&amp;gt; &amp;lt;/ol&amp;gt; / 순서가 없는 목록 태그 : &amp;lt;ul&amp;gt; &amp;lt;/ul&amp;gt;'이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;ol&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;li&amp;gt;목록1&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;목록2&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;목록3&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;/ol&amp;gt;&lt;/span&gt;&lt;/blockquote&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;140&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cu3QEw/btsJTdHbT2o/LcvT3jylztP7fDNXTyY4qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cu3QEw/btsJTdHbT2o/LcvT3jylztP7fDNXTyY4qK/img.png&quot; data-alt=&quot;순서가 있는 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cu3QEw/btsJTdHbT2o/LcvT3jylztP7fDNXTyY4qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcu3QEw%2FbtsJTdHbT2o%2FLcvT3jylztP7fDNXTyY4qK%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;500&quot; height=&quot;268&quot; data-origin-width=&quot;140&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;순서가 있는 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;&amp;lt;ol&amp;gt;태그의 속성으로는 type과 start가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;lt;ol&amp;gt;태그 안에 type=&quot;A&quot;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;type=&quot;a&quot;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;type=&quot;I&quot;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;type=&quot;i&quot;를 써준다면&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;순서목록의 타입을 바꿀 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;기본적으로는 숫자이다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;ol type=&quot;A&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;li&amp;gt;목록1&amp;lt;/il&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;목록2&amp;lt;/il&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;목록3&amp;lt;/il&amp;gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;/ol&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;159&quot; data-origin-height=&quot;73&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bANE8X/btsJTAWu2Y5/PQFSO6Th5jZzFpc4s4BVi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bANE8X/btsJTAWu2Y5/PQFSO6Th5jZzFpc4s4BVi1/img.png&quot; data-alt=&quot;순서가 있는 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bANE8X/btsJTAWu2Y5/PQFSO6Th5jZzFpc4s4BVi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbANE8X%2FbtsJTAWu2Y5%2FPQFSO6Th5jZzFpc4s4BVi1%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;500&quot; height=&quot;230&quot; data-origin-width=&quot;159&quot; data-origin-height=&quot;73&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;순서가 있는 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;또한 시작점도 바꿀 수 있는데,&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;ol type=&quot;A&quot; start=&quot;4&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;li&amp;gt;목록4&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;목록5&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;목록6&amp;lt;/li&amp;gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;169&quot; data-origin-height=&quot;69&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxSMPm/btsJSEL4RHD/IMuLBlJf8FKcYK5ac9soik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxSMPm/btsJSEL4RHD/IMuLBlJf8FKcYK5ac9soik/img.png&quot; data-alt=&quot;순서가 있는 목록 시작점 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxSMPm/btsJSEL4RHD/IMuLBlJf8FKcYK5ac9soik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxSMPm%2FbtsJSEL4RHD%2FIMuLBlJf8FKcYK5ac9soik%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;500&quot; height=&quot;204&quot; data-origin-width=&quot;169&quot; data-origin-height=&quot;69&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;순서가 있는 목록 시작점 변경&lt;/figcaption&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: 'Nanum Gothic'; color: #000000;&quot;&gt;순서가 없는 목록 태그&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;li&amp;gt;목록1&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;목록2&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;목록3&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5M4Xa/btsJTAhSLwx/CzSh5BpBqqQ8GWQjgqMTSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5M4Xa/btsJTAhSLwx/CzSh5BpBqqQ8GWQjgqMTSK/img.png&quot; data-alt=&quot;순서가 없는 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5M4Xa/btsJTAhSLwx/CzSh5BpBqqQ8GWQjgqMTSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5M4Xa%2FbtsJTAhSLwx%2FCzSh5BpBqqQ8GWQjgqMTSK%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;700&quot; height=&quot;356&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;순서가 없는 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;ul 속성(type)을 이용하여 타입을 변경해 줄 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;ul type=&quot;circle&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;ul type=&quot;square&quot;&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;설명 목록을 만드는 태그&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;용어와 그에 대한 설명 리스트 형식으로 정의 때 사용하는 태그 : &amp;lt;dl&amp;gt; 내용 &amp;lt;/dl&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;용어나 이름을 나타내는 태그 : &amp;lt;dt&amp;gt; 내용 &amp;lt;/dt&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;요소와 해당 용어에 대한 설명을 나타내는 태그 : &amp;lt;dd&amp;gt; 내용 &amp;lt;/dd&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;h1&amp;gt;설명 목록&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;dl&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;dt&amp;gt;이름&amp;lt;/dt&amp;gt;&lt;br /&gt;&amp;lt;dd&amp;gt;설명1&amp;lt;/dd&amp;gt;&lt;br /&gt;&amp;lt;dd&amp;gt;설명2&amp;lt;/dd&amp;gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;/dl&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciqR7F/btsJRCaElm4/ArXKjGIzWoeITDfKp1nOlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciqR7F/btsJRCaElm4/ArXKjGIzWoeITDfKp1nOlK/img.png&quot; data-alt=&quot;dl, dt, dd 태그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciqR7F/btsJRCaElm4/ArXKjGIzWoeITDfKp1nOlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciqR7F%2FbtsJRCaElm4%2FArXKjGIzWoeITDfKp1nOlK%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;700&quot; height=&quot;343&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;dl, dt, dd 태그&lt;/figcaption&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;b&gt;표를 만드는 태그&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;표 만들기 위해서 필요한 태그는 기본적으로 &amp;lt;table&amp;gt;,&amp;lt;caption&amp;gt;&amp;lt;tr&amp;gt;,&amp;lt;td&amp;gt;,&amp;lt;th&amp;gt;으로 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;표의 시작과 끝을 알려주는 태그 : &amp;lt;table&amp;gt;&amp;lt;/table&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;표 제목을 알려주는 태그 : &amp;lt;caption&amp;gt;&amp;lt;/caption&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;행을 만드는 태그 : &amp;lt;tr&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;셀을 만드는 태그 : &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;, &amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;※tr은 table row, td는 table date, th는 table head&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;table&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;caption&amp;gt;표 제목&amp;lt;/caption&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;1열 제목&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;2열 제목&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1행 1열&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1행 2열&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2행 1열&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2행 2열&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;138&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmKiNE/btsJShjwvEw/MxefRhZSlX7rEuXsnVaas1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmKiNE/btsJShjwvEw/MxefRhZSlX7rEuXsnVaas1/img.png&quot; data-alt=&quot;표&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmKiNE/btsJShjwvEw/MxefRhZSlX7rEuXsnVaas1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmKiNE%2FbtsJShjwvEw%2FMxefRhZSlX7rEuXsnVaas1%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;500&quot; height=&quot;384&quot; data-origin-width=&quot;138&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;표&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그림 13과 같이 행이 합쳐진 경우를 만들고 싶다면, rowspan, colspan 속성을 사용한다.&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;220&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x8ife/btsJTelOIHC/3Je1Rty6JGhePwTO6ZUZSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x8ife/btsJTelOIHC/3Je1Rty6JGhePwTO6ZUZSk/img.png&quot; data-alt=&quot;표 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x8ife/btsJTelOIHC/3Je1Rty6JGhePwTO6ZUZSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx8ife%2FbtsJTelOIHC%2F3Je1Rty6JGhePwTO6ZUZSk%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;500&quot; height=&quot;357&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;표 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;table border=&quot;2&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;caption&amp;gt;선물용과 가정용 상품 구성&amp;lt;/caption&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;용도&amp;lt;/th&amp;gt;&amp;lt;th colspan=&quot;3&quot;&amp;gt;중량, 개수, 가격&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;tr&amp;gt;&amp;lt;td rowspan=&quot;2&quot;&amp;gt;선물용&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3kg&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11~16과&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;35,000원&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;5kg&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;18~26과&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;52,000원&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;tr&amp;gt;&amp;lt;td rowspan=&quot;2&quot;&amp;gt;가정용&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3kg&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11~16과&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;30,000원&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;tr&amp;gt; &amp;nbsp; &amp;nbsp;&amp;lt;td&amp;gt;5kg&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;18~26과&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;47,000원&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;colspan과 rowspan을 이용해서 합쳐주면 된다&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;표의 구조를 지정하는 태그&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;표의 제목 태그 : &amp;lt;thead&amp;gt;&amp;lt;/thead&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;표의 본문 태그 : &amp;lt;tbody&amp;gt;&amp;lt;/tbody&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;표의 요약 태그 : &amp;lt;tfoot&amp;gt;&amp;lt;/tfoot&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이미지 삽입&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;웹에서 사용하는 이미지 형식은&amp;nbsp;jpg/jpeg, gif, png를 가장 많이 사용할 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;html에 이미지를 삽입해 보자. &amp;lt;img&amp;gt;태그를 사용하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;img src=&quot;이미지 파일 경로&quot; alt=&quot;대체용 텍스트&quot;&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;&amp;lt;img&amp;gt;태그에 쓰이는 속성은 이미지 파일 경로를 나타내는 src 속성과 이미지를 텍스트로 대신 설명하는 alt 속성,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;이미지 크기를 조절하는 width, height 속성이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;이미지가&amp;nbsp;html파일과&amp;nbsp;같은&amp;nbsp;경우에는&amp;nbsp;&amp;lt;img&amp;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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;img&amp;nbsp;src=&quot;1.jpg&quot;&amp;nbsp;width=&quot;400&quot;&amp;nbsp;height=&quot;400&quot;&amp;gt;&lt;br /&gt;&amp;lt;img src=&quot;2.jpg&quot; width=&quot;40%&quot; height=&quot;40%&quot;&amp;gt;&lt;br /&gt;px : 이미지 크기를 픽셀단위로 지정, 고정값&lt;br /&gt;% : 이미지 크기를 % 지정, 웹 브라우저 너비, 높이 기준으로 이미지 크기를 표시.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;하지만 이미지 경로가 같은 폴더에 없는 경우에는 하나하나 찾아줘야 한다.&lt;br /&gt;../폴더명/파일명 같은 경우에는 상위(부모) 폴더로 가기&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;../폴더명/폴더명/파일명 : 좀 더 상위 폴더에 이미지가 있는 경우&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;※절대참조&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이미지 파일을 절대 참조로 찾고자 한다면, &amp;lt;img src=&quot;프로젝트/폴더/내부폴더1/내부폴더2/.../찾고자하는이미지&amp;gt;로 하면 된다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;webProject/src/main/webapp/Html1 안의 1.jpg 이미지 파일을 찾고자 한다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그렇다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;img src=&quot;/webProject/Html1/ 1.jpg&quot;&amp;gt; 이렇게 작성하면 된다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;※&amp;lt;img src=&quot;/webProject/src/main/webapp/Html1/1.jpg&quot;&amp;gt; 이렇게 작성하지 않는 이유는 Dynamic Web Project 생성 시 Content directory로 세팅되어&amp;nbsp; &quot;src/main/webapp&quot;이 기본적으로 세팅되어 있기 때문이다.&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;!--http://localhost:8080/webProject/Html1/test4.html--&amp;gt;&lt;br /&gt;&amp;lt;http://localhost:8080/webProject/Html1/1jpg&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;/프로젝트/폴더1/폴더2/.../이미지.이미지형식&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;img src=&quot;/webProject/src/main/webapp/Html1/1.jpg&quot; alt=&quot;경로가 잘못됨&quot;&amp;gt;&lt;br /&gt;&amp;lt;!--src/main/webapp이&amp;nbsp;Dynamic&amp;nbsp;Web&amp;nbsp;Project&amp;nbsp;생성 시&amp;nbsp;Content&amp;nbsp;directory로&amp;nbsp;세팅되어&amp;nbsp;있기&amp;nbsp;때문에--&amp;gt;&lt;br /&gt;&amp;lt;!--즉,&amp;nbsp;webProject/.../폴더명/이미지파일에서&amp;nbsp;/.../에&amp;nbsp;src/main/webapp&amp;nbsp;있으며&amp;nbsp;생략되어 있다&amp;nbsp;생각하자,&amp;nbsp;--&amp;gt;&lt;br /&gt;&amp;lt;img&amp;nbsp;src=&quot;/webProject/Html1/1.jpg&quot;&amp;gt;&lt;br /&gt;&amp;lt;img&amp;nbsp;src=&quot;/webProject/Html1/2.jpg&quot;&amp;gt;&lt;br /&gt;&amp;lt;img&amp;nbsp;src=&quot;/webProject/Html1/img/3.jpg&quot;&amp;gt;&lt;br /&gt;&amp;lt;img&amp;nbsp;src=&quot;/webProject/Html1/img/4.jpg&quot;&amp;gt;&lt;br /&gt;&amp;lt;img&amp;nbsp;src=&quot;/webProject/imgs/5.jpg&quot;&amp;gt;&lt;br /&gt;&amp;lt;img&amp;nbsp;src=&quot;/webProject/imgs/6.jpg&quot;&amp;gt;&lt;br /&gt;&amp;lt;img&amp;nbsp;src=&quot;/webProject/imgs/img/7.jpg&quot;&amp;gt;&lt;br /&gt;&amp;lt;img&amp;nbsp;src=&quot;/webProject/imgs/img/8.jpg&quot;&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;멀티미디어 파일 삽입&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다양한 멀티미디어 파일(오디오, 비디오, 자바 애플릿, PDF 등)을 삽입할 때는 &amp;lt;object&amp;gt;태그를 사용함.&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;object width=&quot;너비&quot; height=&quot;높이&quot; date=&quot;파일&quot;&amp;gt;&amp;lt;/object&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;date 속성에 보여줄 멀티미디어 파일을 지정하고, width, height 속성을 사용해 플레이어의 크기를 지정함&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;오디오, 비디오, 이미지 등 다양한 멀티미디어를 삽입할 수 있는 태그는 &amp;lt;embed&amp;gt;이다.&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;embed src=&quot;파일 경로&quot; width=&quot;너비&quot; height=&quot;높이&quot;&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;src 속성을 사용해 삽입할 멀티미디어 파일을 지정하고, width, height 속성을 사용해 플레이어의 크기를 지정함.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;audio&amp;gt;, &amp;lt;video&amp;gt;, &amp;lt;object&amp;gt; 태그를 지원하지 않는 웹 브라우저를 고려해야 하면 &amp;lt;embed&amp;gt;태그를 사용하여 멀티미디어 파일을 삽입함.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;PDF 파일 삽입&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;object width=&quot;900&quot; height=&quot;800&quot; data=&quot;medias/product.pdf&quot;&amp;gt;&amp;lt;/object&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;오디오, 비디오, 이미지 멀티미디어 파일 삽입&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;embed src=&quot;medias/spring.mp3&quot;&amp;gt;-&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;audio src=&quot;medias/spring.mp3&quot; controls&amp;gt;&amp;lt;/audio&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;video src=&quot;medias/salad.mp4&quot; controls width=&quot;700&quot;&amp;gt;&amp;lt;/video&amp;gt;&lt;br /&gt;&amp;lt;video&amp;nbsp;src=&quot;medias/flower.mp4&quot;&amp;nbsp;controls&amp;nbsp;width=&quot;640&quot;&amp;nbsp;muted&amp;nbsp;autoplay&amp;nbsp;loop&amp;gt;&amp;lt;/video&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;※멀티미디어 파일의 종류&lt;br /&gt;비디오 : mp4(모든 브라우저에서 동작), webm&lt;br /&gt;오디오 : mp3(모든 브라우저에서 동작), mp4, m4a&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;하이퍼링크&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다양한&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일 형식을 넣을 수 있음.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;링크를 삽입하는 태그 &amp;lt;a&amp;gt;태그와 href 속성&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;a href=&quot;링크할 주소&quot;&amp;gt;텍스트 또는 이미지&amp;lt;/a&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;a href=&quot;&amp;lt;a href=https://www.naver.com&amp;gt;https://www.naver.com&amp;lt;/a&amp;gt;&quot;&gt;네이버&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;a&amp;nbsp;href=&quot;test1.html&quot;&amp;gt;test1&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;a&amp;nbsp;href=&quot;ex1.html&quot;&amp;gt;ex1&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;a&amp;nbsp;href=&quot;../imgs/img/7.jpg&quot;&amp;gt;7.jpg&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;a&amp;nbsp;href=&quot;medias/product.pdf&quot;&amp;gt;product.pdf&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하이퍼링크 새로운 창에서 연결하기&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;p&amp;gt;target=&quot;_blank&quot;를 a태그에 넣어주면 된다.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;a&amp;nbsp;href=&quot;&lt;br /&gt;&lt;a href=&quot;https://www.naver.com&quot;&gt;https://www.naver.com&lt;/a&gt;&quot;&amp;nbsp;target=&quot;_blank&quot;&amp;gt;네이버&lt;br /&gt;&lt;br /&gt;&amp;lt;a&amp;nbsp;href=&quot;test1.html&quot;target=&quot;_blank&quot;&amp;gt;test1&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;a&amp;nbsp;href=&quot;ex1.html&quot;target=&quot;_blank&quot;&amp;gt;ex1&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;a&amp;nbsp;href=&quot;../imgs/img/7.jpg&quot;target=&quot;_blank&quot;&amp;gt;7.jpg&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;a&amp;nbsp;href=&quot;medias/product.pdf&quot;&amp;nbsp;target=&quot;_blank&quot;&amp;gt;product.pdf&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이미지에 하이퍼링크 삽입하기&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;p&amp;gt;a태그+img태그&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;a&amp;nbsp;href=&quot;test2.html&quot;&amp;nbsp;target=&quot;_blank&quot;&amp;gt;&amp;lt;img&amp;nbsp;src=&quot;1.jpg&quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;a&amp;nbsp;href=&quot;test3.html&quot;&amp;nbsp;target=&quot;_blank&quot;&amp;gt;&amp;lt;img&amp;nbsp;src=&quot;img/3.jpg&quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하이퍼링크에 걸린 파일을 다운로드하기&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;p&amp;gt; a태그 href=&quot;파일명&quot; download&quot; &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;a&amp;nbsp;href=&quot;../imgs/5.jpg&quot;&amp;nbsp;download&amp;gt;5.jpg&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;a&amp;nbsp;href=&quot;medias/product.pdf&quot;&amp;nbsp;download&amp;gt;product.pdf&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;ol&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;&amp;lt;a&amp;nbsp;href=&quot;ex2.html&quot;&amp;gt;ex2.html&amp;nbsp;연결&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;&amp;lt;a&amp;nbsp;href=&quot;ex3.html&quot;&amp;nbsp;target=&quot;_blank&quot;&amp;gt;ex3.html&amp;nbsp;새창으로&amp;nbsp;연결&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;&amp;lt;a&amp;nbsp;href=&quot;2.jpg&quot;&amp;nbsp;download&amp;gt;2.jpg&amp;nbsp;다운로드&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;dt&amp;gt;&lt;br /&gt;&amp;lt;dd&amp;gt;&amp;lt;a&amp;nbsp;href=&quot;ex2.html&quot;&amp;gt;ex2.html&amp;nbsp;연결&amp;lt;/a&amp;gt;&amp;lt;/dd&amp;gt;&lt;br /&gt;&amp;lt;dd&amp;gt;&amp;lt;a&amp;nbsp;href=&quot;ex3.html&quot;&amp;nbsp;target=&quot;_blank&quot;&amp;gt;ex3.html&amp;nbsp;새창으로&amp;nbsp;연결&amp;lt;/a&amp;gt;&amp;lt;/dd&amp;gt;&lt;br /&gt;&amp;lt;dd&amp;gt;&amp;lt;a href=&quot;2.jpg&quot; download&amp;gt;2.jpg 다운로드&amp;lt;/a&amp;gt;&amp;lt;/dd&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문서 내 하이퍼링크&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;p&amp;gt;문서 내에 특정 위치를 찾아가는 하이퍼링크&amp;lt;br&amp;gt;페이지 안에 페이지 찾기&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;&amp;lt;a&amp;nbsp;href=&quot;#m1&quot;&amp;gt;메뉴1(href=&quot;#1&quot;)&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;&amp;lt;a&amp;nbsp;href=&quot;#m2&quot;&amp;gt;메뉴2(href=&quot;#2&quot;)&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;&amp;lt;a&amp;nbsp;href=&quot;#m3&quot;&amp;gt;메뉴3(href=&quot;#3&quot;)&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;h2&amp;nbsp;id=&quot;m1&quot;&amp;gt;메뉴&amp;nbsp;1&amp;lt;/h2&amp;gt;&lt;br /&gt;id='m1'표시&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;a&amp;nbsp;href=&quot;#top&quot;&amp;gt;맨&amp;nbsp;위로&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;h2&amp;nbsp;id=&quot;m2&quot;&amp;gt;메뉴2&amp;lt;/h2&amp;gt;&lt;br /&gt;id='m2'표시&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;a&amp;nbsp;href=&quot;#top&quot;&amp;gt;맨&amp;nbsp;위로&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;h2&amp;nbsp;id=&quot;m3&quot;&amp;gt;메뉴3&amp;lt;/h2&amp;gt;&lt;br /&gt;id='m3'표시&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;a&amp;nbsp;href=&quot;#top&quot;&amp;gt;맨&amp;nbsp;위로&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;폼 태그&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;form [속성=&quot;속성값&quot;]&amp;gt;여러 폼 요소&amp;lt;/form&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;form 태그의 속성&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;method=&quot;get&quot; : 주소 표시줄에 사용자가 입력한 내용이 그대로 드러남&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;method=&quot;post&quot; : 입력한 내용의 길이에 제한받지 않고 사용자가 입력한 내용도 드러나지 않음.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;name=&quot; &quot; : 자바스크립트로 폼을 제어할 때 사용할 폼의 이름을 지정(백엔드에서는 반드시 써줘야 함.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;action=&quot; &quot; : form태그 안의 내용을 처리해 줄 서버 프로그램을 지정&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;target: action 속성에서 지정한 스크립트 파일을 현재 창이 아닌 다른 위치에서 열도록 함.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;autocomplete=&quot;on/off&quot; : 자동 완성 기능. 기본값은 on.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;폼 요소를 그룹으로 묶는 태그&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;fieldset&amp;gt; 태그는 하나의 폼 안에서 여러 구역을 나누어 표시할 때 사용&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;fieldset [속성=&quot;속성값&quot;]&amp;gt; &amp;lt;/fieldset&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;legend&amp;gt; 태그는 &amp;lt;fieldset&amp;gt; 태그로 묶은 그룹에 제목을 붙일 수 있음&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;fieldset&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;legend&amp;gt; 그룹 이름 &amp;lt;/legend&amp;gt;&lt;br /&gt;&amp;lt;/fieldset&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;여러 줄을 입력하는 텍스트 영역 태그&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;textarea&amp;gt;태그는 게시판에 글을 입력하거나 회원 가입 양식에서 사용자 약관을 표시할 때 자주 사용&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;textarea&amp;gt;내용&amp;lt;/textarea&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;속성으로는 텍스트 영역의 가로 너비를 문자 단위로 지정하는 cols, 텍스 영역의 세로 길이를 줄 단위로 지정하는 rows가 있음.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;드롭다운 목록을 만들어주는 태그&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용자가 내용을 직접 입력하지 않고 여러 옵션 중에서 선택하게 하려면 드롭다운 목록이나 데이터 목록을 사용.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;select&amp;gt;태그로 드롭다운 목록의 시작과 끝을 표시하고, 그 안에 &amp;lt;option&amp;gt;태그를 사용해 원하는 항목을 추가.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;option&amp;gt; 태그에는 value 속성을 이용해 서버로 넘겨주는 값을 지정&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;select&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;option value=&quot;값1&quot;&amp;gt;내용1&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;option value=&quot;값2&quot;&amp;gt;내용2&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;lt;/select&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;select&amp;gt;태그의 속성&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;size : 화면에 표시할 드롭다운 항목의 개수를 지정&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;multiple : 드롭다운 목록에서 둘 이상의 항목을 선택할 때 사용&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;option&amp;gt;태그의 속성&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;value : 해당 항목을 선택할 때 서버로 넘겨줄 값을 지정&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;selected : 드롭다운 메뉴를 삽입할 때 기본적으로 선택해서 보여 줄 항목을 지정&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;버튼을 만들어주는 태그&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;button type=&quot;submit&quot;&amp;gt;내용&amp;lt;/button&amp;gt;&lt;br /&gt;&amp;lt;button type=&quot;reset&quot;&amp;gt;내용&amp;lt;/button&amp;gt;&lt;br /&gt;&amp;lt;button type=&quot;button&quot;&amp;gt;내용&amp;lt;/button&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;폼 요소에 레이블을 붙이는 태그&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;label&amp;gt;태그는 &amp;lt;input&amp;gt;태그와 같은 폼 요소에 레이블을 붙일 때 사용.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;레이블이란 입력란 가까이에 아이디나 비밀번호처럼 붙여 놓은 텍스트를 말함.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;lable&amp;gt;태그를 사용하면 폼 요소와 레이블 ㅌ텍스트가 서로 연결되었다는 것을 웹 브라우저가 알 수 있음.&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;label&amp;gt;레이블명&amp;lt;input&amp;gt;&amp;lt;/label&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;웹 폼의 다양한 곳에서 사용하는 태그&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아이디나 검색어를 입력하는 검색 상자나 로그인 버튼처럼 사용자가 입력할 부분은 주로 &amp;lt;input&amp;gt;태그를 이용.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;input&amp;gt;태그의 type과 속성&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;텍스트와 비밀번호를 나타내는 type 속성&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;input type=&quot;text&quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&quot;password&quot;&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;size : 텍스트와 비밀번호 필드의 길이를 지정&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;value : 텍스트 필드 요소가 화면에 표시될 때 텍스트 필드 부분에 보여주는 내용, 이 속성을 사용하지 않으면 빈 텍스트 필드가 표시, 비밀 번호 필드에서 사용하지 않는 속성&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;maxlength : 텍스트 필드와 비밀번호 필드에 입력할 수 있는 최대 문자 수를 지정&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자동으로 입력 커서를 갖다 놓는 속성&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;input type=&quot;텍스트입력 필드&quot; autofocus required&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;페이지를 불러오자마자 폼에서 원하는 요소에 마우스 포인터를 표시할 수 있음.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;힌트를 표시해 주는 속성&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;input type=&quot;텍스트입력필드&quot; placeholder=텍스트 필드에 표시될 내용&quot;&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;읽기 전용 필드를 만들어주는 속성&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;input type=&quot;텍스트입력필드&quot; readonly&quot;&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용자가 입력하지는 못하고 읽게만 하는 읽기 전용 필드를 만들 수 있음. readonly 속성은 해당 필드를 읽기 전용으로 바꿈&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;필수 입력 필드를 지정하는 속성&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;반드시 입력해야 하는 내용에는 required 속성을 지정해 필수 필드로 만들 수 있음.&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;input type=&quot;텍스트입력 필드&quot; autofocus required&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다양한 용도에 맞게 입력하는 type 속성&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;input type=&quot;search&quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&quot;url&quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&quot;email&quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&quot;tel&quot;&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;체크 박스와 라디오 버튼을 나타내는 type 속성&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;input type=&quot;checkbox&quot;&amp;gt; : 주어진 여러 항목에서 2개 이상을 선택할 수 있는 체크 박스를 넣음&lt;br /&gt;&amp;lt;input type=&quot;radio&quot;&amp;gt; : 주어진 여러 항목에서 1개만 선택할 수 있는 라디오 버튼을 넣음&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;value : 선택한 체크 박스나 라디오 버튼을 서버에게 알려 줄 때 넘겨줄 값을 지정. 이 값은 영문 또는 숫자여야 하며 필수 속성&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;checked : 여러 항목 중에서 기본으로 선택해 놓고 싶은 항목에 사용. 속성값은 따로 없음&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;숫자 입력 필드를 나타내는 type 속성&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;input type=&quot;number&quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&quot;range&quot;&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;min : 필드에 입력할 수 있는 최솟값을 지정. 기본값 0&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;max : 필드에 입력할 수 있는 최댓값을 지정. 기본값 100&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;step : 숫자 간격을 지정. 기본값 1&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;value : 필드에 표시할 초깃값&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;날짜 입력을 나타내는 type 속성&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;input type=&quot;date | month | week&quot;&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;min : 범위를 제한할 때 사용&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;max : 범위를 제한할 때 사용&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;step : 스핀 박스의 화살표를 클릭했을 때 증감시킬 크기를 지정&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;value : 기본적으로 표시할 날짜 지정&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시간 입력을 나타내는 type 속성&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;input type=&quot;time | datetime | datetime-local&quot;&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;min : 범위를 제한할 때 사용&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;max :&lt;span&gt;&amp;nbsp;&lt;/span&gt;범위를 제한할 때 사용&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;step : 스핀 박스의 화살표를 클릭했을 때 증감시킬 크기를 지정&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;value : 기본적으로 표시할 시간 지정&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전송, 리셋 버튼을 나타내는 type 속성&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;input type=&quot;submit&quot; value=&quot;버튼에 표시할 내용&quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&quot;reset&quot; value=&quot;버튼에 표시할 내용&quot;&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;submit은 폼에 입력한 정보를 서버로 전송. 전송된 정보는 &amp;lt;form&amp;gt;태그의 action 속성에서 지정한 폼 처리 프로그램에 넘겨짐&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;reset은 &amp;lt;input&amp;gt; 요소에 입력된 모든 정보를 재설정해서 사용자가 입력한 내용을 지우는 역할을 함. value 속성을 사용해서 버튼에 표시할 내용을 지정&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이미지 버튼을 나타내는 type 속성&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;input type=&quot;image&quot; src=&quot;이미지 경로&quot; alt=&quot;대체 텍스트&quot;&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;submit 버튼과 같은 기능을 하는 이미지 버튼을 나타냄&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 버튼을 나타내는 type 속성&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;input type=&quot;button&quot; value=&quot;버튼에 표시할 내용&quot;&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일을 첨부할 때 사용하는 type 속성&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;input type=&quot;file&quot;&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;히든 필드 만들 때 사용하는 type 속성&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;input type=&quot;hidden&quot; name=&quot;이름&quot; value=&quot;서버로 넘길 값&quot;&amp;gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;히든 필드는 화면의 폼에는 보이지 않지만 사용자가 입력을 마치면 폼과 함께 서버로 전송되는 요소. 사용자에게 굳이 보여 줄 필요는 없지만 관리자가 알아야 하는 정보는 히든 필드로 입력&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>organize/웹기초</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/290</guid>
      <comments>https://001cloudid.tistory.com/entry/HTML#entry290comment</comments>
      <pubDate>Wed, 2 Oct 2024 11:20:45 +0900</pubDate>
    </item>
    <item>
      <title>justBoard10 마무리</title>
      <link>https://001cloudid.tistory.com/entry/justBoard10</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVhswX/btsJReTSAMH/KBLSnnYufiGFKCwfLjHE11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVhswX/btsJReTSAMH/KBLSnnYufiGFKCwfLjHE11/img.png&quot; style=&quot;width: 12.6275%; margin-right: 10px;&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;799&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;12.78&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVhswX/btsJReTSAMH/KBLSnnYufiGFKCwfLjHE11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVhswX%2FbtsJReTSAMH%2FKBLSnnYufiGFKCwfLjHE11%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;1082&quot; height=&quot;799&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0qyaR/btsJQUnO69D/EgTYeX7kSnt7Eb9gaCAUK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0qyaR/btsJQUnO69D/EgTYeX7kSnt7Eb9gaCAUK1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;159&quot; data-origin-width=&quot;1470&quot; style=&quot;width: 86.2097%;&quot; data-widthpercent=&quot;87.22&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0qyaR/btsJQUnO69D/EgTYeX7kSnt7Eb9gaCAUK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0qyaR%2FbtsJQUnO69D%2FEgTYeX7kSnt7Eb9gaCAUK1%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;1470&quot; height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이전글 &lt;a href=&quot;https://001cloudid.tistory.com/entry/justBoard9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;justBoard9&lt;/a&gt;에서 어제 몇 시간동안 왜 오류가 발생하는지에 대해서 이유를 찾지 못했다. 심지어 두 시간동안 고민해보고 gpt에도 물어보았다. 오류가 날 부분에 대해서만 코드를 보여주지 말고 이유만 알려달라고.. 그럼에도 내가 작성한 코드에서는 문제가 없다고 답을 해줬다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;문제를 해결하기 위해 명령 프롬프트에서 다음과 같이 데이터 삽입을 시도해보았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpqHPL/btsJPSqXjBH/tBPRhW6ZjBoIKKEbR6X7JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpqHPL/btsJPSqXjBH/tBPRhW6ZjBoIKKEbR6X7JK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpqHPL/btsJPSqXjBH/tBPRhW6ZjBoIKKEbR6X7JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpqHPL%2FbtsJPSqXjBH%2FtBPRhW6ZjBoIKKEbR6X7JK%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;965&quot; height=&quot;350&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 곳에서도 들어가지 않는 것을 발견할 수 있었다. 이걸보고 오늘에서야 문제를 발견할 수 있었다. 이유는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;&lt;b&gt;컬럼명&lt;/b&gt;&lt;/u&gt;&lt;/span&gt; 때문에 발생한 문제였다. no와 subject는 &lt;u&gt;&lt;b&gt;MySQL 예약어&lt;/b&gt;&lt;/u&gt;였기 때문에 board 테이블을 만들 때 백틱을 이용해서 만들었다. 때문에 컬럼을 찾을 수 없어서 데이터가 입력되지 않았다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;541&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E08Kz/btsJRoB1sxD/WLEdfqvoZMLL1nE2ydnr70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E08Kz/btsJRoB1sxD/WLEdfqvoZMLL1nE2ydnr70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E08Kz/btsJRoB1sxD/WLEdfqvoZMLL1nE2ydnr70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE08Kz%2FbtsJRoB1sxD%2FWLEdfqvoZMLL1nE2ydnr70%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;541&quot; height=&quot;233&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;233&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 예약어는 &lt;a href=&quot;https://dev.mysql.com/doc/refman/5.0/en/reserved-words.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dev.mysql.com/doc/refman/5.0/en/reserved-words.html&lt;/a&gt; 여기서 사용하는 버전에 맞게 확인할 수 있다.(생각보다 예약어가 너무 많아서 정리하기 힘들다. 자바 라이브러리와 마찬가지로 필요할 때 수시로 확인하는 것이 좋은 방법인 것 같다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC6Pdx/btsJQIOuW3Z/CgTLo0ijeWFBql4mdideXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC6Pdx/btsJQIOuW3Z/CgTLo0ijeWFBql4mdideXK/img.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;567&quot; data-is-animation=&quot;false&quot; style=&quot;width: 38.3772%; margin-right: 10px;&quot; data-widthpercent=&quot;38.83&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC6Pdx/btsJQIOuW3Z/CgTLo0ijeWFBql4mdideXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC6Pdx%2FbtsJQIOuW3Z%2FCgTLo0ijeWFBql4mdideXK%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;447&quot; height=&quot;567&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zKxAp/btsJR0Hr9zL/bKzR0mIcWOg9SjCDJsD2mK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zKxAp/btsJR0Hr9zL/bKzR0mIcWOg9SjCDJsD2mK/img.png&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;281&quot; data-is-animation=&quot;false&quot; style=&quot;width: 60.46%;&quot; data-widthpercent=&quot;61.17&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zKxAp/btsJR0Hr9zL/bKzR0mIcWOg9SjCDJsD2mK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzKxAp%2FbtsJR0Hr9zL%2FbKzR0mIcWOg9SjCDJsD2mK%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;349&quot; height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;그렇다면 여기에 맞춰서 수정을 해보도록 하자. DAO는 건드릴 필요없이 mapper만 수정해주면 될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;boardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1727661539355&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
  PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
  &quot;https://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;com.mystory001.mappers.boardMapper&quot;&amp;gt;

	&amp;lt;select id=&quot;getBoardList&quot; resultType=&quot;com.mystory001.domain.BoardDTO&quot;&amp;gt;
		select *
		from board
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;insertBoard&quot;&amp;gt;
		insert into board(`no`, id, `subject`, content, writetime, readcount)
		values(#{`no`}, #{id}, #{`subject`}, #{content}, #{writetime}, #{readcount})
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;select id=&quot;getMaxNo&quot; resultType=&quot;java.lang.Integer&quot;&amp;gt;
		select max(`no`) from board
	&amp;lt;/select&amp;gt;
	
&amp;lt;/mapper&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lkXtM/btsJQyk1g4C/U29fkWfLgJmKTXO9FyoIk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lkXtM/btsJQyk1g4C/U29fkWfLgJmKTXO9FyoIk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lkXtM/btsJQyk1g4C/U29fkWfLgJmKTXO9FyoIk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlkXtM%2FbtsJQyk1g4C%2FU29fkWfLgJmKTXO9FyoIk1%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;1123&quot; height=&quot;811&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;811&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류가 뜬다. SQL문이 잘못 된 것이 확실하다.&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;백틱을 사용한 테이블은 있었지만, 백틱을 이용한 컬럼 사용은 처음이기 때문에 MySQL Workbench를 이용해서 넣는 것을 시도해보았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6kYlx/btsJQJUeADR/TGZUDTT9j9KumiVZnGUeDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6kYlx/btsJQJUeADR/TGZUDTT9j9KumiVZnGUeDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6kYlx/btsJQJUeADR/TGZUDTT9j9KumiVZnGUeDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6kYlx%2FbtsJQJUeADR%2FTGZUDTT9j9KumiVZnGUeDK%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;748&quot; height=&quot;318&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;values에 백틱을 사용하는 컬럼은 백틱으로 묶어줘야하나?, 아니면 리터럴인 부분은 백틱안에 또 작은 따옴표로 묶어줘야하나? 생각했는데 아무리 해도 안됨. 그래서 그냥 백틱은 빼고 시도해보았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/elfhRT/btsJPHQQEtx/SVOPYxGcEHQbr47SsqFNEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/elfhRT/btsJPHQQEtx/SVOPYxGcEHQbr47SsqFNEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/elfhRT/btsJPHQQEtx/SVOPYxGcEHQbr47SsqFNEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FelfhRT%2FbtsJPHQQEtx%2FSVOPYxGcEHQbr47SsqFNEK%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;283&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;283&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬럼에만 백틱을 사용하고 values에는 그냥 데이터 넣듯이 넣으면 된다.&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;boardMapper 수정&lt;/p&gt;
&lt;pre id=&quot;code_1727662275862&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
  PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
  &quot;https://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;com.mystory001.mappers.boardMapper&quot;&amp;gt;

	&amp;lt;select id=&quot;getBoardList&quot; resultType=&quot;com.mystory001.domain.BoardDTO&quot;&amp;gt;
		select *
		from board
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;insertBoard&quot;&amp;gt;
		insert into board(`no`, id, `subject`, content, writetime, readcount)
		values(#{no}, #{id}, #{subject}, #{content}, #{writetime}, #{readcount})
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;select id=&quot;getMaxNo&quot; resultType=&quot;java.lang.Integer&quot;&amp;gt;
		select max(`no`) from board
	&amp;lt;/select&amp;gt;
	
&amp;lt;/mapper&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EwMgN/btsJPSqX77D/m9o8OA5gzvUVWPg7x5QwJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EwMgN/btsJPSqX77D/m9o8OA5gzvUVWPg7x5QwJk/img.png&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;218&quot; data-is-animation=&quot;false&quot; style=&quot;width: 56.091%; margin-right: 10px;&quot; data-widthpercent=&quot;56.75&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EwMgN/btsJPSqX77D/m9o8OA5gzvUVWPg7x5QwJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEwMgN%2FbtsJPSqX77D%2Fm9o8OA5gzvUVWPg7x5QwJk%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;919&quot; height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTcl0P/btsJQH28Klf/dCXwRwrQIPoQj0kA6bsia0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTcl0P/btsJQH28Klf/dCXwRwrQIPoQj0kA6bsia0/img.png&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;174&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;43.25&quot; style=&quot;width: 42.7462%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTcl0P/btsJQH28Klf/dCXwRwrQIPoQj0kA6bsia0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTcl0P%2FbtsJQH28Klf%2FdCXwRwrQIPoQj0kA6bsia0%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;559&quot; height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/div&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;주소 매핑을 잘못해서 404가 뜬 것이지 데이터는 제대로 들어간 것을 확인할 수 있다. 제대로 했다고 생각했는데 안될 때 '이게 외않돼?'하면서 짜증나는데 막상 해결하고나면 뿌듯함.&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;이제 main에서 게시글 목록이 나타나게해보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLVnb3/btsJQUah5Dh/clSy4ZQwzvjyGEjF8CAsbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLVnb3/btsJQUah5Dh/clSy4ZQwzvjyGEjF8CAsbK/img.png&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;736&quot; data-is-animation=&quot;false&quot; style=&quot;width: 39.276%; margin-right: 10px;&quot; data-widthpercent=&quot;39.74&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLVnb3/btsJQUah5Dh/clSy4ZQwzvjyGEjF8CAsbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLVnb3%2FbtsJQUah5Dh%2FclSy4ZQwzvjyGEjF8CAsbK%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;1276&quot; height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2zCFM/btsJQzRQj20/C8VyEbXWxzj5a5DN8cmbr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2zCFM/btsJQzRQj20/C8VyEbXWxzj5a5DN8cmbr0/img.png&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;213&quot; data-is-animation=&quot;false&quot; style=&quot;width: 59.5612%;&quot; data-widthpercent=&quot;60.26&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2zCFM/btsJQzRQj20/C8VyEbXWxzj5a5DN8cmbr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2zCFM%2FbtsJQzRQj20%2FC8VyEbXWxzj5a5DN8cmbr0%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;560&quot; height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;main.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1727664402438&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;%-- 반응형 웹 viewport &amp;rarr; head태그 사이에 작성 --%&amp;gt;
&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}

.header{
	float : right;
	width: 1200px;
	height: 0px;
}

.sidebar{
	float : left;
	width: 200px;
	height: 500px;

}

.content{
	width: 1000px;
	height: 600px;
}

.footer{
	float : right;
	width: 1200px;
	height: 0px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;게시물 목록&amp;lt;/h1&amp;gt;
&amp;lt;table border=&quot;1&quot;&amp;gt;
&amp;lt;tr&amp;gt;
	&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;c:forEach var=&quot;boardDTO&quot; items=&quot;${boardList }&quot;&amp;gt;
&amp;lt;tr onclick=&quot;location.href='${pageContext.request.contextPath}/board?${boardDTO.no }'&quot;&amp;gt;
	&amp;lt;td&amp;gt;${boardDTO.no }&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.subject }&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.id }&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.writetime }&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.readcount }&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/c:forEach&amp;gt;
&amp;lt;%-- 게시글 목록 --%&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;%-- 로그인이 되어 있을 때만 버튼이 보이게--%&amp;gt;
&amp;lt;c:if test=&quot;${! empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;a href=&quot;${pageContext.request.contextPath }/board/insert&quot;&amp;gt;&amp;lt;button&amp;gt;글쓰기&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;%-- 페이지 목록 10개씩 10개의 페이지 --%&amp;gt;
&amp;lt;!-- &amp;lt;form method=&quot;get&quot;&amp;gt; --&amp;gt;
&amp;lt;!--  &amp;lt;input type=&quot;text&quot; name=&quot;search&quot; value=&quot;검색&quot;&amp;gt; --&amp;gt;
&amp;lt;!--  &amp;lt;input type=&quot;submit&quot; value=&quot;검색하기&quot;&amp;gt; --&amp;gt;
&amp;lt;!--  &amp;lt;/form&amp;gt; --&amp;gt;

&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1727664415882&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/&quot;)
	public String main(HttpServletRequest request, Model model) {
		System.out.println(&quot;BoardController main()&quot;);
		
		List&amp;lt;BoardDTO&amp;gt; boardList = boardService.getBoardList(); //게시물
		model.addAttribute(&quot;boardList&quot;,boardList);
		return &quot;/&quot;;
	}&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;메인 화면에서 모든 것을 해결하려고 했으나 조금 복잡해서 글 목록은 list.jsp를 만들어서 그곳에서 확인할 수 있게 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;board/list.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1727665283870&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;%-- 반응형 웹 viewport &amp;rarr; head태그 사이에 작성 --%&amp;gt;
&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}

.header{
	float : right;
	width: 1200px;
	height: 0px;
}

.sidebar{
	float : left;
	width: 200px;
	height: 500px;

}

.content{
	width: 1000px;
	height: 600px;
}

.footer{
	float : right;
	width: 1200px;
	height: 0px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;게시물 목록&amp;lt;/h1&amp;gt;
&amp;lt;table border=&quot;1&quot;&amp;gt;
&amp;lt;tr&amp;gt;
	&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;c:forEach var=&quot;boardDTO&quot; items=&quot;${boardList}&quot;&amp;gt;
&amp;lt;tr onclick=&quot;location.href='${pageContext.request.contextPath}/board/content?no=${boardDTO.no }'&quot;&amp;gt;
	&amp;lt;td&amp;gt;${boardDTO.no }&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.subject }&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.id }&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.writetime }&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.readcount }&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/c:forEach&amp;gt;
&amp;lt;%-- 게시글 목록 --%&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;%-- 로그인이 되어 있을 때만 버튼이 보이게--%&amp;gt;
&amp;lt;c:if test=&quot;${! empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;a href=&quot;${pageContext.request.contextPath }/board/insert&quot;&amp;gt;&amp;lt;button&amp;gt;글쓰기&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;%-- 페이지 목록 10개씩 10개의 페이지 --%&amp;gt;
&amp;lt;!-- &amp;lt;form method=&quot;get&quot;&amp;gt; --&amp;gt;
&amp;lt;!--  &amp;lt;input type=&quot;text&quot; name=&quot;search&quot; value=&quot;검색&quot;&amp;gt; --&amp;gt;
&amp;lt;!--  &amp;lt;input type=&quot;submit&quot; value=&quot;검색하기&quot;&amp;gt; --&amp;gt;
&amp;lt;!--  &amp;lt;/form&amp;gt; --&amp;gt;

&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;Controller&lt;/p&gt;
&lt;pre id=&quot;code_1727665295541&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/list&quot;)
	public String main(HttpServletRequest request, Model model) {
		System.out.println(&quot;BoardController main()&quot;);
		List&amp;lt;BoardDTO&amp;gt; boardList = boardService.getBoardList(); //게시물
		model.addAttribute(&quot;boardList&quot;,boardList);
		return &quot;board/list&quot;;
	}&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;Service, DAO, mapper는 동일. 주소만 바꿈 + 사이드바에 li태그를 이용해서 글 목록을 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlyMMF/btsJRzQ3sUr/3ZA0l0vOBnV413Lq1J1160/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlyMMF/btsJRzQ3sUr/3ZA0l0vOBnV413Lq1J1160/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlyMMF/btsJRzQ3sUr/3ZA0l0vOBnV413Lq1J1160/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlyMMF%2FbtsJRzQ3sUr%2F3ZA0l0vOBnV413Lq1J1160%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;1230&quot; height=&quot;707&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;707&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하니 잘 나옴. 번호가 오름차순이라 작성일이 오래된 것(번호가 낮은 것)이 아래로 가게 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mapper&lt;/p&gt;
&lt;pre id=&quot;code_1727665425162&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;getBoardList&quot; resultType=&quot;com.mystory001.domain.BoardDTO&quot;&amp;gt;
		select *
		from board
		order by `no` desc
	&amp;lt;/select&amp;gt;&lt;/code&gt;&lt;/pre&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;1231&quot; data-origin-height=&quot;713&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKUeQr/btsJRo29oIf/KHbmG4LKVySoGOKAqTtvk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKUeQr/btsJRo29oIf/KHbmG4LKVySoGOKAqTtvk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKUeQr/btsJRo29oIf/KHbmG4LKVySoGOKAqTtvk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKUeQr%2FbtsJRo29oIf%2FKHbmG4LKVySoGOKAqTtvk1%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;1231&quot; height=&quot;713&quot; data-origin-width=&quot;1231&quot; data-origin-height=&quot;713&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1727666019465&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/content&quot;)
	public String content(BoardDTO boardDTO, Model model) {
		System.out.println(&quot;BoardController content()&quot;);
		boardDTO = boardService.getBoard(boardDTO); //글에 대한 정보
		boardService.readCount(boardDTO); //조회수
		model.addAttribute(&quot;boardDTO&quot;,boardDTO);
		return &quot;board/content&quot;;
	}&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;BoardSerivce&lt;/p&gt;
&lt;pre id=&quot;code_1727666031557&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public BoardDTO getBoard(BoardDTO boardDTO) {
		System.out.println(&quot;BoardService getBoard()&quot;);
		return boardDAO.getBoard(boardDTO);
	}

	public void readCount(BoardDTO boardDTO) {
		System.out.println(&quot;BoardService readCount()&quot;);
		int readcount = boardDTO.getReadcount() + 1;
		boardDTO.setReadcount(readcount);
		boardDAO.readCount(boardDTO);
	}&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;BoardDAO&lt;/p&gt;
&lt;pre id=&quot;code_1727666049786&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public BoardDTO getBoard(BoardDTO boardDTO) {
		System.out.println(&quot;BoardDAO getBoard()&quot;);
		return sqlSession.selectOne(namespace+&quot;.getBoard&quot;,boardDTO);
	}

	public void readCount(BoardDTO boardDTO) {
		System.out.println(&quot;BoardDAO readCount&quot;);
		sqlSession.update(namespace+&quot;.readCount&quot;, boardDTO);
	}&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;boardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1727666060279&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;getBoard&quot; resultType=&quot;com.mystory001.domain.BoardDTO&quot;&amp;gt;
		select * 
		from board
		where `no` = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;update id=&quot;readCount&quot;&amp;gt;
		update board
		set readcount = #{readcount}
		where `no` = #{no}
	&amp;lt;/update&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;color: #333333; text-align: start;&quot;&gt;http://localhost:8080/justboard/board/content?no=과&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;http://localhost:8080/justboard/board/content?의 차이에 대해 알아보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8080/justboard/board/content?no= 는 no라는 쿼리 파라미터를 사용하여 값을 전달하고 있음. 서버 측에서 no라는 이름의 파라미터를 읽어 해당 게시물의 id를 참조하는 데 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;http://localhost:8080/justboard/board/content? 는 일반적으로 서버 측에서 처리할 수 있는 유효한 쿼리 파라미터 형식이 아니기 때문에 해석하지 못함&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;color: #333333; text-align: start;&quot;&gt;board/content.jsp&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727666422466&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;글 읽기&amp;lt;/h1&amp;gt;
&amp;lt;table&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;글번호&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.no}&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;${boardDTO.id}&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;${boardDTO.readcount}&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;${boardDTO.writetime}&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;${boardDTO.subject}&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;${boardDTO.content}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&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;1229&quot; data-origin-height=&quot;719&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yzki6/btsJQg56tn1/RzDyc5K8KJhGrzONKlJMbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yzki6/btsJQg56tn1/RzDyc5K8KJhGrzONKlJMbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yzki6/btsJQg56tn1/RzDyc5K8KJhGrzONKlJMbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyzki6%2FbtsJQg56tn1%2FRzDyc5K8KJhGrzONKlJMbk%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;1229&quot; height=&quot;719&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;719&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;color: #333333; text-align: start;&quot;&gt;어찌저찌 페이지가 생기고했지만 글 읽기까지 왔다.&lt;span&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;content.jsp 수정&lt;/p&gt;
&lt;pre id=&quot;code_1727670459209&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;글 읽기&amp;lt;/h1&amp;gt;
&amp;lt;table &amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;글번호&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.no}&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;${boardDTO.id}&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;${boardDTO.readcount}&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;${boardDTO.writetime}&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;${boardDTO.subject}&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;${boardDTO.content}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div style=&quot;display: center&quot;&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;c:if test=&quot;${sessionScope.id eq boardDTO.id}&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;글 수정&quot; onclick=&quot;${pageContext.request.contextPath}/board/update&quot;&amp;gt; &amp;lt;input type=&quot;button&quot; value=&quot;글 삭제&quot; onclick=&quot;${pageContext.request.contextPath}/board/delete&quot;&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;글 목록&quot; onclick=&quot;${pageContext.request.contextPath}/board/content&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션이 있고, 세션 아이디와 글쓴이가 같을 때 글 수정, 글 삭제 버튼이 보이게 만약 세션이 없으면 글 목록만 보이게 함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2ZGMP/btsJRzw1X3L/JyBUzs6FvkOiOxsKbm6Lu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2ZGMP/btsJRzw1X3L/JyBUzs6FvkOiOxsKbm6Lu0/img.png&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;723&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.0105%; margin-right: 10px;&quot; data-widthpercent=&quot;49.59&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2ZGMP/btsJRzw1X3L/JyBUzs6FvkOiOxsKbm6Lu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2ZGMP%2FbtsJRzw1X3L%2FJyBUzs6FvkOiOxsKbm6Lu0%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;1229&quot; height=&quot;723&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mQaRu/btsJQbD9ROu/RRjSUhEo8u6WKC5w2a9pHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mQaRu/btsJQbD9ROu/RRjSUhEo8u6WKC5w2a9pHk/img.png&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;710&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.8267%;&quot; data-widthpercent=&quot;50.41&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mQaRu/btsJQbD9ROu/RRjSUhEo8u6WKC5w2a9pHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmQaRu%2FbtsJQbD9ROu%2FRRjSUhEo8u6WKC5w2a9pHk%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;1227&quot; height=&quot;710&quot;/&gt;&lt;/span&gt;&lt;/div&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;update.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1727671632419&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;게시 글 수정&amp;lt;/h1&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath }/board/updatePro&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${boardDTO.no }&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;subject&quot; value=&quot;${boardDTO.subject }&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;textarea rows=&quot;10&quot; cols=&quot;50&quot;&amp;gt;${boardDTO.content }&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;수정하기&quot;&amp;gt; &amp;lt;a href=&quot;${pageContext.request.contextPath }/board/content?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;뒤로가기&quot;&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1727671654066&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/update&quot;)
	public String update(BoardDTO boardDTO, Model model) {
		System.out.println(&quot;BoardController update()&quot;);
		boardDTO = boardService.getBoard(boardDTO);
		
		model.addAttribute(&quot;boardDTO&quot;, boardDTO);
		return &quot;board/update&quot;;
	}&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;content.jsp를 수정&lt;/p&gt;
&lt;pre id=&quot;code_1727671758248&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;글 읽기&amp;lt;/h1&amp;gt;
&amp;lt;table &amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;글번호&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.no}&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;${boardDTO.id}&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;${boardDTO.readcount}&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;${boardDTO.writetime}&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;${boardDTO.subject}&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;${boardDTO.content}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div style=&quot;display: center&quot;&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;c:if test=&quot;${sessionScope.id eq boardDTO.id}&quot;&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/update?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 수정&quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;${pageContext.request.contextPath}/board/delete?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 삭제&quot;&amp;gt;&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/content&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 목록&quot;&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;763&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VyoyQ/btsJQGKoggs/4YbhNcN3NDqkADxKwbOWC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VyoyQ/btsJQGKoggs/4YbhNcN3NDqkADxKwbOWC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VyoyQ/btsJQGKoggs/4YbhNcN3NDqkADxKwbOWC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVyoyQ%2FbtsJQGKoggs%2F4YbhNcN3NDqkADxKwbOWC1%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;1232&quot; height=&quot;763&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;763&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1727672094994&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/updatePro&quot;)
	public String updatePro(BoardDTO boardDTO) {
		System.out.println(&quot;BoardController update()&quot;);
		boardService.update(boardDTO);
		return &quot;board/content&quot;;
	}
	
	@GetMapping(&quot;delete&quot;)
	public String delete(BoardDTO boardDTO) {
		System.out.println(&quot;BoardController delete()&quot;);
		boardService.delete(boardDTO);
		return &quot;redirect:/board/list&quot;;
	}&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;BoardService&lt;/p&gt;
&lt;pre id=&quot;code_1727672120574&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void update(BoardDTO boardDTO) {
		System.out.println(&quot;BoardService update()&quot;);
		boardDAO.update(boardDTO);
	}
	
	public void delete(BoardDTO boardDTO) {
		System.out.println(&quot;BoardService delete()&quot;);
		boardDAO.delete(boardDTO);
	}&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;BoardDAO&lt;/p&gt;
&lt;pre id=&quot;code_1727672131486&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void update(BoardDTO boardDTO) {
		System.out.println(&quot;BoardDAO update()&quot;);
		sqlSession.update(namespace+&quot;.update&quot;, boardDTO);
	}
	
	public void delete(BoardDTO boardDTO) {
		System.out.println(&quot;BoardDAO delete()&quot;);
		sqlSession.delete(namespace+&quot;.delete&quot;, boardDTO);
	}&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;boardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1727672141900&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;update id=&quot;update&quot;&amp;gt;
		update board
		set `subject`=#{subject}, content=#{content}
		where `no`=#{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;delete id=&quot;delete&quot;&amp;gt;
		delete from board
		where `no`=#{no}
	&amp;lt;/delete&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;/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;/p&gt;
&lt;pre id=&quot;code_1727672374105&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/insertPro&quot;)
	public String insertPro(BoardDTO boardDTO) {
		System.out.println(&quot;BoardController insertPro()&quot;);
		boardService.insert(boardDTO);
		
		return &quot;redirect:/board/list&quot;;
	}&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;board/list.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1727674223817&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;%-- 반응형 웹 viewport &amp;rarr; head태그 사이에 작성 --%&amp;gt;
&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}

.header{
	float : right;
	width: 1200px;
	height: 0px;
}

.sidebar{
	float : left;
	width: 200px;
	height: 500px;

}

.content{
	width: 1000px;
	height: 600px;
}

.footer{
	float : right;
	width: 1200px;
	height: 0px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;게시물 목록&amp;lt;/h1&amp;gt;
&amp;lt;table border=&quot;1&quot;&amp;gt;
&amp;lt;tr&amp;gt;
	&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;c:forEach var=&quot;boardDTO&quot; items=&quot;${boardList}&quot;&amp;gt;
&amp;lt;tr onclick=&quot;location.href='${pageContext.request.contextPath}/board/content?no=${boardDTO.no }'&quot;&amp;gt;
	&amp;lt;td&amp;gt;${boardDTO.no }&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.subject }&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.id }&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.writetime }&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.readcount }&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/c:forEach&amp;gt;
&amp;lt;%-- 게시글 목록 --%&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;%-- 로그인이 되어 있을 때만 버튼이 보이게--%&amp;gt;
&amp;lt;c:if test=&quot;${! empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;a href=&quot;${pageContext.request.contextPath }/board/insert&quot;&amp;gt;&amp;lt;button&amp;gt;글쓰기&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;%-- 페이지 목록 10개씩 10개의 페이지 --%&amp;gt;
&amp;lt;form method=&quot;get&quot; action=&quot;${pageContext.request.contextPath}/board/list&quot;&amp;gt;
 &amp;lt;input type=&quot;text&quot; name=&quot;search&quot; placeholder=&quot;검색&quot;&amp;gt;
 &amp;lt;input type=&quot;submit&quot; value=&quot;검색하기&quot;&amp;gt;
 &amp;lt;/form&amp;gt;
&amp;lt;c:if test=&quot;${pageDTO.startPage &amp;gt; pageDTO.pageBlock }&quot;&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/list?pageNum=${pageDTO.startPage - pageDTO.pageBlock}&amp;amp;search=${pageDTO.search}&quot;&amp;gt;Prev&amp;lt;/a&amp;gt;
&amp;lt;/c:if&amp;gt;

&amp;lt;c:forEach var=&quot;i&quot; begin=&quot;${pageDTO.startPage }&quot; end=&quot;${pageDTO.endPage }&quot; step=&quot;1&quot;&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/list?pageNum=${i}&amp;amp;search=${pageDTO.search}&quot;&amp;gt;${i}&amp;lt;/a&amp;gt;
&amp;lt;/c:forEach&amp;gt;

&amp;lt;c:if test=&quot;${pageDTO.endPage &amp;lt; pageDTO.pageCount}&quot;&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/list?pageNum=${pageDTO.startPage + pageDTO.pageBlock}&amp;amp;search=${pageDTO.search}&quot;&amp;gt;Next&amp;lt;/a&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1727674242502&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;/list&quot;)
	public String main(HttpServletRequest request, Model model, PageDTO pageDTO) {
		System.out.println(&quot;BoardController main()&quot;);
		
		String search = request.getParameter(&quot;search&quot;); //검색어 가져오기
		
		//페이지
		int pageSize = 5; //화면에 보여줄 글의 개수
		String pageNum = request.getParameter(&quot;pageNum&quot;);
		if(pageNum ==null) {
			pageNum = &quot;1&quot;;
		}
		int currentPage =Integer.parseInt(pageNum);	//int형 currentPage 변수명에 pageNum을 정수형으로 변경	
		
		//pageDTO에 저장
		pageDTO.setPageSize(pageSize);
		pageDTO.setPageNum(pageNum);
		pageDTO.setCurrentPage(currentPage);
		pageDTO.setSearch(search);
		
		List&amp;lt;BoardDTO&amp;gt; boardList = boardService.getBoardList(pageDTO); //게시물
		
		int count = boardService.getBoardCount(pageDTO); //전체 글의 개수 구하기
		int pageBlock = 5; //한 화면에 보여 줄 페이지 개수 설정
		int startPage = (currentPage - 1) / pageBlock * pageBlock + 1; //한 화면에 보여 줄 시작 페이지(1~10 -&amp;gt; 1, 11~20 -&amp;gt; 11,...)
		int endPage = startPage + pageBlock - 1; //한 화면에 보여 줄 끝 페이지
		int pageCount = count / pageSize + (count%pageSize==0? 0:1); //전체 페이지 개수
		if(endPage&amp;gt;pageCount) {
			endPage = pageCount;
		}
		
		pageDTO.setCount(count);
		pageDTO.setPageBlock(pageBlock);
		pageDTO.setStartPage(startPage);
		pageDTO.setEndPage(endPage);
		pageDTO.setPageCount(pageCount);
		
		model.addAttribute(&quot;boardList&quot;,boardList);
		model.addAttribute(&quot;pageDTO&quot;,pageDTO);
		
		return &quot;board/list&quot;;
	}&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;BoardService&lt;/p&gt;
&lt;pre id=&quot;code_1727674261912&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public List&amp;lt;BoardDTO&amp;gt; getBoardList(PageDTO pageDTO) {
		System.out.println(&quot;BoardService getBoardList()&quot;);
		
		//시작하는 행 번호 구하기(currentPage,pageSize)
		int currentPage = pageDTO.getCurrentPage();
		int pageSize = pageDTO.getPageSize();
		int startRow = (currentPage - 1) * pageSize + 1;
		int endRow = startRow + pageSize - 1;
		
		pageDTO.setStartRow(startRow - 1);
		pageDTO.setEndRow(endRow);
		
		return boardDAO.getBoardList(pageDTO);
	}
    
    	public int getBoardCount(PageDTO pageDTO) {
		System.out.println(&quot;BoardService getBoardCount()&quot;);
		return boardDAO.getBoardCount(pageDTO);
	}&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;BoardDAO&lt;/p&gt;
&lt;pre id=&quot;code_1727674287896&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public List&amp;lt;BoardDTO&amp;gt; getBoardList(PageDTO pageDTO) {
		System.out.println(&quot;BoardDAO getBoardList()&quot;);
		return sqlSession.selectList(namespace+&quot;.getBoardList&quot;, pageDTO);
	}

	public int getBoardCount(PageDTO pageDTO) {
		System.out.println(&quot;BoardDAO getBoardCount()&quot;);
		return sqlSession.selectOne(namespace+&quot;.getBoardCount&quot;, pageDTO);
	}&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;boardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1727674314988&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;getBoardList&quot; resultType=&quot;com.mystory001.domain.BoardDTO&quot;&amp;gt;
		select * 
		from board
		&amp;lt;if test=&quot;search != null&quot;&amp;gt;
		where subject like concat('%',#{search},'%')
		&amp;lt;/if&amp;gt;
		order by num desc
		limit #{startRow}, #{pageSize}
	&amp;lt;/select&amp;gt;
    
    &amp;lt;select id=&quot;getBoardCount&quot; resultType=&quot;java.lang.Integer&quot;&amp;gt;
		select count(*)
		from board
		&amp;lt;if test=&quot;search != null&quot;&amp;gt;
		where `subject` like concat('%',#{search},'%')
		&amp;lt;/if&amp;gt;
	&amp;lt;/select&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;결과물&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 로그인 안했을 때&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LTfcK/btsJSmRxqww/SoiU3d2IO1qhNlMjf98NS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LTfcK/btsJSmRxqww/SoiU3d2IO1qhNlMjf98NS1/img.png&quot; data-alt=&quot;메인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LTfcK/btsJSmRxqww/SoiU3d2IO1qhNlMjf98NS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLTfcK%2FbtsJSmRxqww%2FSoiU3d2IO1qhNlMjf98NS1%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;1216&quot; height=&quot;752&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YwrMw/btsJQn5Hrdy/tb4PLyLWUek5QQRzkgG9ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YwrMw/btsJQn5Hrdy/tb4PLyLWUek5QQRzkgG9ck/img.png&quot; data-alt=&quot;글 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YwrMw/btsJQn5Hrdy/tb4PLyLWUek5QQRzkgG9ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYwrMw%2FbtsJQn5Hrdy%2Ftb4PLyLWUek5QQRzkgG9ck%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;1218&quot; height=&quot;746&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;글 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1213&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIeTuK/btsJRdgZuHW/rjib9yznBRh2c3lBCoUFRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIeTuK/btsJRdgZuHW/rjib9yznBRh2c3lBCoUFRK/img.png&quot; data-alt=&quot;글 읽기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIeTuK/btsJRdgZuHW/rjib9yznBRh2c3lBCoUFRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIeTuK%2FbtsJRdgZuHW%2Frjib9yznBRh2c3lBCoUFRK%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;1213&quot; height=&quot;748&quot; data-origin-width=&quot;1213&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;글 읽기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 글 목록 버튼을 클릭하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1119&quot; data-origin-height=&quot;831&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TLJTm/btsJRD0FL5v/qkTkcVM26YHEC3qCvhI231/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TLJTm/btsJRD0FL5v/qkTkcVM26YHEC3qCvhI231/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TLJTm/btsJRD0FL5v/qkTkcVM26YHEC3qCvhI231/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTLJTm%2FbtsJRD0FL5v%2FqkTkcVM26YHEC3qCvhI231%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;1119&quot; height=&quot;831&quot; data-origin-width=&quot;1119&quot; data-origin-height=&quot;831&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류가 발생하는데 이는 아무래도 content.jsp에서 글 목록 href를 잘 못 준 것 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1727674526538&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;글 읽기&amp;lt;/h1&amp;gt;
&amp;lt;table &amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;글번호&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;${boardDTO.no}&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;${boardDTO.id}&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;${boardDTO.readcount}&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;${boardDTO.writetime}&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;${boardDTO.subject}&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;${boardDTO.content}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div style=&quot;display: center&quot;&amp;gt;
&amp;lt;c:if test=&quot;${!empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;c:if test=&quot;${sessionScope.id eq boardDTO.id}&quot;&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/update?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 수정&quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;${pageContext.request.contextPath}/board/delete?no=${boardDTO.no}&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 삭제&quot;&amp;gt;&amp;lt;/a&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath}/board/list&quot;&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;글 목록&quot;&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;2) 로그인 했을 때&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7EtOv/btsJRPNuDlV/SUQQ043toFgHBKlXJ8KZS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7EtOv/btsJRPNuDlV/SUQQ043toFgHBKlXJ8KZS0/img.png&quot; data-alt=&quot;메인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7EtOv/btsJRPNuDlV/SUQQ043toFgHBKlXJ8KZS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7EtOv%2FbtsJRPNuDlV%2FSUQQ043toFgHBKlXJ8KZS0%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;1221&quot; height=&quot;751&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;753&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9A0ol/btsJQJgbLv1/uvwiIKcweLLolLcEfBFx31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9A0ol/btsJQJgbLv1/uvwiIKcweLLolLcEfBFx31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9A0ol/btsJQJgbLv1/uvwiIKcweLLolLcEfBFx31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9A0ol%2FbtsJQJgbLv1%2FuvwiIKcweLLolLcEfBFx31%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;1216&quot; height=&quot;753&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;753&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;1214&quot; data-origin-height=&quot;753&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caVMT5/btsJSiPaVZp/ytWyVrJjFIsNK2FLV8koy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caVMT5/btsJSiPaVZp/ytWyVrJjFIsNK2FLV8koy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caVMT5/btsJSiPaVZp/ytWyVrJjFIsNK2FLV8koy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaVMT5%2FbtsJSiPaVZp%2FytWyVrJjFIsNK2FLV8koy1%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;1214&quot; height=&quot;753&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eS000X/btsJSihpu1t/r9ziAayKKjUzKEpzinNYR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eS000X/btsJSihpu1t/r9ziAayKKjUzKEpzinNYR1/img.png&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;749&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.7494%; margin-right: 10px;&quot; data-widthpercent=&quot;33.53&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eS000X/btsJSihpu1t/r9ziAayKKjUzKEpzinNYR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeS000X%2FbtsJSihpu1t%2Fr9ziAayKKjUzKEpzinNYR1%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;1216&quot; height=&quot;749&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AoPQt/btsJStiCcSl/AnHLpWOk30jmM1wSy8d5UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AoPQt/btsJStiCcSl/AnHLpWOk30jmM1wSy8d5UK/img.png&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;753&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.4683%; margin-right: 10px;&quot; data-widthpercent=&quot;33.24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AoPQt/btsJStiCcSl/AnHLpWOk30jmM1wSy8d5UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAoPQt%2FbtsJStiCcSl%2FAnHLpWOk30jmM1wSy8d5UK%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;1212&quot; height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JGuEk/btsJReUvA7B/URnLd6GQZ2iCBPCIa3kmZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JGuEk/btsJReUvA7B/URnLd6GQZ2iCBPCIa3kmZK/img.png&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;757&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.4566%;&quot; data-widthpercent=&quot;33.23&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JGuEk/btsJReUvA7B/URnLd6GQZ2iCBPCIa3kmZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJGuEk%2FbtsJReUvA7B%2FURnLd6GQZ2iCBPCIa3kmZK%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;1218&quot; height=&quot;757&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;글 수정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글 수정 후 주소줄에 http://localhost:8080/justboard/board/updatePro 이를 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardController에 return을 수정&lt;/p&gt;
&lt;pre id=&quot;code_1727674867995&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/updatePro&quot;)
	public String updatePro(BoardDTO boardDTO) {
		System.out.println(&quot;BoardController update()&quot;);
		boardService.update(boardDTO);
		return &quot;redirect:/board/list&quot;;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baBj1R/btsJRxTQe2H/f2jzKsIiyKKhWcPVFDBmGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baBj1R/btsJRxTQe2H/f2jzKsIiyKKhWcPVFDBmGK/img.png&quot; data-origin-width=&quot;1223&quot; data-origin-height=&quot;758&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.3688%; margin-right: 10px;&quot; data-widthpercent=&quot;49.95&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baBj1R/btsJRxTQe2H/f2jzKsIiyKKhWcPVFDBmGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaBj1R%2FbtsJRxTQe2H%2Ff2jzKsIiyKKhWcPVFDBmGK%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;1223&quot; height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nuDWr/btsJRxM3QAF/2ZMlMHRJZhwW7W5S6xF8rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nuDWr/btsJRxM3QAF/2ZMlMHRJZhwW7W5S6xF8rk/img.png&quot; data-origin-width=&quot;1219&quot; data-origin-height=&quot;754&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4684%;&quot; data-widthpercent=&quot;50.05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nuDWr/btsJRxM3QAF/2ZMlMHRJZhwW7W5S6xF8rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnuDWr%2FbtsJRxM3QAF%2F2ZMlMHRJZhwW7W5S6xF8rk%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;1219&quot; height=&quot;754&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;글 삭제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgh2AG/btsJSchopqq/xDvAPZqeuEpeKKUttYcIek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgh2AG/btsJSchopqq/xDvAPZqeuEpeKKUttYcIek/img.png&quot; data-origin-width=&quot;1223&quot; data-origin-height=&quot;751&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4261%; margin-right: 10px;&quot; data-widthpercent=&quot;50.01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgh2AG/btsJSchopqq/xDvAPZqeuEpeKKUttYcIek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgh2AG%2FbtsJSchopqq%2FxDvAPZqeuEpeKKUttYcIek%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;1223&quot; height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/42Vf8/btsJQx1p2Sz/kciQKNLeMFbqM9HPMLwAu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/42Vf8/btsJQx1p2Sz/kciQKNLeMFbqM9HPMLwAu0/img.png&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;750&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4111%;&quot; data-widthpercent=&quot;49.99&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/42Vf8/btsJQx1p2Sz/kciQKNLeMFbqM9HPMLwAu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F42Vf8%2FbtsJQx1p2Sz%2FkciQKNLeMFbqM9HPMLwAu0%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;1221&quot; height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;글 작성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dilD7a/btsJQJN6TQa/51SId0VcPAFwPsP5PxoVyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dilD7a/btsJQJN6TQa/51SId0VcPAFwPsP5PxoVyK/img.png&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;748&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.6737%; margin-right: 10px;&quot; data-widthpercent=&quot;50.26&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dilD7a/btsJQJN6TQa/51SId0VcPAFwPsP5PxoVyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdilD7a%2FbtsJQJN6TQa%2F51SId0VcPAFwPsP5PxoVyK%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;1220&quot; height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v9n8B/btsJRbXPiM6/W1OzSWdVZJRPnVIbZ1SFD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v9n8B/btsJRbXPiM6/W1OzSWdVZJRPnVIbZ1SFD1/img.png&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;757&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.1636%;&quot; data-widthpercent=&quot;49.74&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v9n8B/btsJRbXPiM6/W1OzSWdVZJRPnVIbZ1SFD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv9n8B%2FbtsJRbXPiM6%2FW1OzSWdVZJRPnVIbZ1SFD1%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;1222&quot; height=&quot;757&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;다른 아이디 로그인 시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sNtVO/btsJQgMqpLC/6ugOrqItsD7hDaDEpUX2TK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sNtVO/btsJQgMqpLC/6ugOrqItsD7hDaDEpUX2TK/img.png&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;752&quot; data-is-animation=&quot;false&quot; style=&quot;width: 36.1299%; margin-right: 10px;&quot; data-widthpercent=&quot;36.55&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sNtVO/btsJQgMqpLC/6ugOrqItsD7hDaDEpUX2TK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsNtVO%2FbtsJQgMqpLC%2F6ugOrqItsD7hDaDEpUX2TK%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;1222&quot; height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPAshT/btsJQHQj8bD/Sp3r0dFabT9vDaxepv0fd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPAshT/btsJQHQj8bD/Sp3r0dFabT9vDaxepv0fd1/img.png&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;167&quot; data-is-animation=&quot;false&quot; style=&quot;width: 62.7073%;&quot; data-widthpercent=&quot;63.45&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPAshT/btsJQHQj8bD/Sp3r0dFabT9vDaxepv0fd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPAshT%2FbtsJQHQj8bD%2FSp3r0dFabT9vDaxepv0fd1%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;471&quot; height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;정보 확인에서 비밀번호를 입력하지 않거나 틀리게 작성했을 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1219&quot; data-origin-height=&quot;749&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKEpyp/btsJSj1DSTL/dYOM0HeeoHvwZkT0kpDiqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKEpyp/btsJSj1DSTL/dYOM0HeeoHvwZkT0kpDiqk/img.png&quot; data-alt=&quot;내 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKEpyp/btsJSj1DSTL/dYOM0HeeoHvwZkT0kpDiqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKEpyp%2FbtsJSj1DSTL%2FdYOM0HeeoHvwZkT0kpDiqk%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;1219&quot; height=&quot;749&quot; data-origin-width=&quot;1219&quot; data-origin-height=&quot;749&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;내 정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wg7bU/btsJQnYZTHa/lK4MJ2IbXUHmkDKWePmqW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wg7bU/btsJQnYZTHa/lK4MJ2IbXUHmkDKWePmqW1/img.png&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;189&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.5154%; margin-right: 10px;&quot; data-widthpercent=&quot;49.09&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wg7bU/btsJQnYZTHa/lK4MJ2IbXUHmkDKWePmqW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWg7bU%2FbtsJQnYZTHa%2FlK4MJ2IbXUHmkDKWePmqW1%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;378&quot; height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDU7Ei/btsJQhEAu9g/5bonsP4vuSksBpWkPgL5Vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDU7Ei/btsJQhEAu9g/5bonsP4vuSksBpWkPgL5Vk/img.png&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;188&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.3218%;&quot; data-widthpercent=&quot;50.91&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDU7Ei/btsJQhEAu9g/5bonsP4vuSksBpWkPgL5Vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDU7Ei%2FbtsJQhEAu9g%2F5bonsP4vuSksBpWkPgL5Vk%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;390&quot; height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;비밀번호 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9hlO8/btsJRbDyCgU/MNTDOUOvf8E9mFsY9gs5Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9hlO8/btsJRbDyCgU/MNTDOUOvf8E9mFsY9gs5Bk/img.png&quot; data-alt=&quot;탈퇴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9hlO8/btsJRbDyCgU/MNTDOUOvf8E9mFsY9gs5Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9hlO8%2FbtsJRbDyCgU%2FMNTDOUOvf8E9mFsY9gs5Bk%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;369&quot; height=&quot;166&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;탈퇴&lt;/figcaption&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;3)회원가입&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pIbwG/btsJQzdTZu2/LjuqwQFwZieLteUbL9u0Rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pIbwG/btsJQzdTZu2/LjuqwQFwZieLteUbL9u0Rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pIbwG/btsJQzdTZu2/LjuqwQFwZieLteUbL9u0Rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpIbwG%2FbtsJQzdTZu2%2FLjuqwQFwZieLteUbL9u0Rk%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;1233&quot; height=&quot;758&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvT257/btsJQIBC4sU/XVORiSVQtPrjkKZKEkJuB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvT257/btsJQIBC4sU/XVORiSVQtPrjkKZKEkJuB1/img.png&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;753&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.7806%; margin-right: 10px;&quot; data-widthpercent=&quot;50.37&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvT257/btsJQIBC4sU/XVORiSVQtPrjkKZKEkJuB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvT257%2FbtsJQIBC4sU%2FXVORiSVQtPrjkKZKEkJuB1%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;1227&quot; height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba77MJ/btsJQTQDcya/2EGB8T0Ju2kjKJZO22lYck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba77MJ/btsJQTQDcya/2EGB8T0Ju2kjKJZO22lYck/img.png&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;761&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.0566%;&quot; data-widthpercent=&quot;49.63&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba77MJ/btsJQTQDcya/2EGB8T0Ju2kjKJZO22lYck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba77MJ%2FbtsJQTQDcya%2F2EGB8T0Ju2kjKJZO22lYck%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;1222&quot; height=&quot;761&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;아이디 중복확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgC0Ba/btsJSb3RYMg/TmS9aEZTHgZjOL26RezMh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgC0Ba/btsJSb3RYMg/TmS9aEZTHgZjOL26RezMh1/img.png&quot; data-alt=&quot;중복확인 할 때 네트워크&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgC0Ba/btsJSb3RYMg/TmS9aEZTHgZjOL26RezMh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgC0Ba%2FbtsJSb3RYMg%2FTmS9aEZTHgZjOL26RezMh1%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;1920&quot; height=&quot;332&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;중복확인 할 때 네트워크&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p6CqE/btsJRyZzsk6/54TGPcRH1AZI7bTnFKBhCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p6CqE/btsJRyZzsk6/54TGPcRH1AZI7bTnFKBhCK/img.png&quot; data-alt=&quot;회원가입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p6CqE/btsJRyZzsk6/54TGPcRH1AZI7bTnFKBhCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp6CqE%2FbtsJRyZzsk6%2F54TGPcRH1AZI7bTnFKBhCK%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;371&quot; height=&quot;186&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;회원가입&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cADVH9/btsJScobopr/o10h3NRhqLfqYjSzQfh5Fk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cADVH9/btsJScobopr/o10h3NRhqLfqYjSzQfh5Fk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cADVH9/btsJScobopr/o10h3NRhqLfqYjSzQfh5Fk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcADVH9%2FbtsJScobopr%2Fo10h3NRhqLfqYjSzQfh5Fk%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;1246&quot; height=&quot;642&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;642&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;느낀점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;확실히 많은 도움이 되었다. 여기서 조금조금씩 더 추가해서 유지보수하는 방향으로 나아가야겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 일주일 정도 작업했고 하루 3시간 정도 했으니 시간으로 24시간 소요되었는데 생각보다 빨리 끝난 것 같기도 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/289</guid>
      <comments>https://001cloudid.tistory.com/entry/justBoard10#entry289comment</comments>
      <pubDate>Mon, 30 Sep 2024 14:55:20 +0900</pubDate>
    </item>
    <item>
      <title>justBoard9</title>
      <link>https://001cloudid.tistory.com/entry/justBoard9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;main.jsp 조회수 추가&lt;/p&gt;
&lt;pre id=&quot;code_1727588078415&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;%-- 반응형 웹 viewport &amp;rarr; head태그 사이에 작성 --%&amp;gt;
&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}

.header{
	float : right;
	width: 1200px;
	height: 0px;
}

.sidebar{
	float : left;
	width: 200px;
	height: 500px;

}

.content{
	width: 1000px;
	height: 600px;
}

.footer{
	float : right;
	width: 1200px;
	height: 0px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;게시물 목록&amp;lt;/h1&amp;gt;
&amp;lt;table border=&quot;1&quot;&amp;gt;
&amp;lt;tr&amp;gt;
	&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;%-- 게시글 목록 --%&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;%-- 로그인이 되어 있을 때만 버튼이 보이게--%&amp;gt;
&amp;lt;c:if test=&quot;${! empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;a href=&quot;${pageContext.request.contextPath }/board/insert&quot;&amp;gt;&amp;lt;button&amp;gt;글쓰기&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;%-- 페이지 목록 10개씩 10개의 페이지 --%&amp;gt;
&amp;lt;form method=&quot;get&quot;&amp;gt;
 &amp;lt;input type=&quot;text&quot; name=&quot;search&quot; value=&quot;검색&quot;&amp;gt;
 &amp;lt;input type=&quot;submit&quot; value=&quot;검색하기&quot;&amp;gt;
 &amp;lt;/form&amp;gt;

&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;DBMS에는 조회수 컬럼이 없음. 추가하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ba9Hj/btsJQ4jcYoU/LJ0XWXJFIS6CDGkYA24bCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ba9Hj/btsJQ4jcYoU/LJ0XWXJFIS6CDGkYA24bCk/img.png&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;109&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;46.95&quot; style=&quot;width: 46.4014%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ba9Hj/btsJQ4jcYoU/LJ0XWXJFIS6CDGkYA24bCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBa9Hj%2FbtsJQ4jcYoU%2FLJ0XWXJFIS6CDGkYA24bCk%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;322&quot; height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3Rp6G/btsJPlNKUv4/VqGqLwTyAZgtDdtGrCJ061/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3Rp6G/btsJPlNKUv4/VqGqLwTyAZgtDdtGrCJ061/img.png&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;201&quot; data-is-animation=&quot;false&quot; style=&quot;width: 52.4358%;&quot; data-widthpercent=&quot;53.05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3Rp6G/btsJPlNKUv4/VqGqLwTyAZgtDdtGrCJ061/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3Rp6G%2FbtsJPlNKUv4%2FVqGqLwTyAZgtDdtGrCJ061%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;671&quot; height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;/div&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;BoardDTO에도 int형 readcount 및 getter, setter 추가&lt;/p&gt;
&lt;pre id=&quot;code_1727588579187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.domain;

import java.sql.Timestamp;

public class BoardDTO {
	
	private int no;
	private String id;
	private String subject;
	private String content;
	private Timestamp writetime;
	private int readcount;
	
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public Timestamp getWritetime() {
		return writetime;
	}
	public void setWritetime(Timestamp writetime) {
		this.writetime = writetime;
	}
	public int getReadcount() {
		return readcount;
	}
	public void setReadcount(int readcount) {
		this.readcount = readcount;
	}

}&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1727588197859&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(...생략...)
	
	/* 글쓰기 */
	@GetMapping(&quot;/insert&quot;)
	public String insert() {
		System.out.println(&quot;BoardController insert()&quot;);
		return &quot;board/insert&quot;;
	}
	
	@PostMapping(&quot;/insertPro&quot;)
	public String insertPro(BoardDTO boardDTO, Model model) {
		System.out.println(&quot;BoardController insertPro()&quot;);
		boardService.insert(boardDTO);
		
		return &quot;redirect:/&quot;;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller는 화면과 관련된 작업이므로 글 번호, 작성 시간, 조회수는 로직을 처리하는 Service에서 메소드를 호출하고 처리하게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoardService&lt;/p&gt;
&lt;pre id=&quot;code_1727588881795&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void insert(BoardDTO boardDTO) {
		System.out.println(&quot;BoardService insert()&quot;);
		//글번호, 날짜, 조회수 작업
		boardDTO.setNo(boardDAO.getMaxNo()+1); //글 번호 -&amp;gt; 기본 글 번호 메소드 생성 후 호출 -&amp;gt; 글 번호 + 1로 처리
		boardDTO.setWritetime(new Timestamp(System.currentTimeMillis())); 
		boardDTO.setReadcount(0);
		
		boardDAO.insert(boardDTO);
	}&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;BoardDAO&lt;/p&gt;
&lt;pre id=&quot;code_1727588892289&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void insert(BoardDTO boardDTO) {
		System.out.println(&quot;BoardDAO insert()&quot;);
		sqlSession.insert(namespace+&quot;.insert&quot;, boardDTO);
	}

	public int getMaxNo() {
		System.out.println(&quot;BoardDAO getMaxNo()&quot;);
		return sqlSession.selectOne(namespace+&quot;.getMaxNo&quot;);
	}&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;boardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1727588919937&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;insert id=&quot;insert&quot;&amp;gt;
		insert into board(no, id, subject, content, writetime, readcount)
		values(#{no}, #{id}, #{subject}, #{content}, #{writetime}, #{readcount})
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;select id=&quot;getMaxNo&quot; resultType=&quot;java.lang.Integer&quot;&amp;gt;
		select max(no) from board
	&amp;lt;/select&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFxtAe/btsJPzyqBg1/KVHg1zJBJu89PVrVtle241/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFxtAe/btsJPzyqBg1/KVHg1zJBJu89PVrVtle241/img.png&quot; data-origin-width=&quot;1223&quot; data-origin-height=&quot;709&quot; data-is-animation=&quot;false&quot; style=&quot;width: 55.3693%; margin-right: 10px;&quot; data-widthpercent=&quot;56.02&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFxtAe/btsJPzyqBg1/KVHg1zJBJu89PVrVtle241/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFxtAe%2FbtsJPzyqBg1%2FKVHg1zJBJu89PVrVtle241%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;1223&quot; height=&quot;709&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7Yevb/btsJQFxpw4I/cxOXZJAG104ZU8gk9X3kd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7Yevb/btsJQFxpw4I/cxOXZJAG104ZU8gk9X3kd0/img.png&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;799&quot; data-is-animation=&quot;false&quot; style=&quot;width: 43.4679%;&quot; data-widthpercent=&quot;43.98&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7Yevb/btsJQFxpw4I/cxOXZJAG104ZU8gk9X3kd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7Yevb%2FbtsJQFxpw4I%2FcxOXZJAG104ZU8gk9X3kd0%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;1082&quot; height=&quot;799&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류 발생. 일단 이 오류가 왜 발생하는지에 대해 이유를 알아보았다. 이 경우(NullPointerException)는 쿼리 조건 중에 Null값이 들어갔기 때문이다. 일단 다시 점검해 보았는데 딱히 문제 될만한 상황은 찾아보지 못했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘솔창을 확인해보았는데&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xUHhx/btsJQhKmAYL/aKGAgHxZ5SR5Xy6XKZeXqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xUHhx/btsJQhKmAYL/aKGAgHxZ5SR5Xy6XKZeXqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xUHhx/btsJQhKmAYL/aKGAgHxZ5SR5Xy6XKZeXqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxUHhx%2FbtsJQhKmAYL%2FaKGAgHxZ5SR5Xy6XKZeXqk%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;1470&quot; height=&quot;159&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;159&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;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;BoardDAO의 getMaxNo() 메소드에서 문제가 있다.&lt;/li&gt;
&lt;li&gt;BoardDAO insert() 메서드가 문제가 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 가지로 생각해 볼 수 있다. BoardDAO에 문제가 있다고 생각해 보자면, 어노테이션이 붙었는가? namespace에 오타가 있는가? 가 가장 먼저 생각해 볼 만한 사항이다.&lt;/p&gt;
&lt;pre id=&quot;code_1727593092584&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.dao;

import java.util.List;

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

import com.mystory001.domain.BoardDTO;

@Repository
public class BoardDAO {

	@Inject
	private SqlSession sqlSession;
	
	private static final String namespace = &quot;com.mystory001.mappers.boardMapper&quot;;

	public List&amp;lt;BoardDTO&amp;gt; getBoardList() {
		System.out.println(&quot;BoardDAO getBoardList()&quot;);
		return sqlSession.selectList(namespace+&quot;.getBoardList&quot;);

	}

	public void insert(BoardDTO boardDTO) {
		System.out.println(&quot;BoardDAO insert()&quot;);
		sqlSession.insert(namespace+&quot;.insertBoard&quot;, boardDTO);
	}
	
	public int getMaxNo() {
		System.out.println(&quot;BoardDAO getMaxNo()&quot;);
		return sqlSession.selectOne(namespace+&quot;.getMaxNo&quot;);
	}
	
}&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;spring 폴더 안에 있는 root-context.xml, servlet-context.xml을 확인해 봐도 문제 될 만한 사항이 없다.&lt;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/288</guid>
      <comments>https://001cloudid.tistory.com/entry/justBoard9#entry288comment</comments>
      <pubDate>Sun, 29 Sep 2024 15:25:24 +0900</pubDate>
    </item>
    <item>
      <title>justBoard8 게시판 클래스 작업</title>
      <link>https://001cloudid.tistory.com/entry/justBoard8-%EA%B2%8C%EC%8B%9C%ED%8C%90-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%9E%91%EC%97%85</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&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;BoardDTO&lt;/p&gt;
&lt;pre id=&quot;code_1727491912246&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.domain;

import java.sql.Timestamp;

public class BoardDTO {
	
	private int no;
	private String id;
	private String subject;
	private String content;
	private Timestamp writetime;
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public Timestamp getWritetime() {
		return writetime;
	}
	public void setWritetime(Timestamp writetime) {
		this.writetime = writetime;
	}

}&lt;/code&gt;&lt;/pre&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;673&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YNdE2/btsJPHCDPIe/Bt751b14G9tWQcmDWI11ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YNdE2/btsJPHCDPIe/Bt751b14G9tWQcmDWI11ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YNdE2/btsJPHCDPIe/Bt751b14G9tWQcmDWI11ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYNdE2%2FbtsJPHCDPIe%2FBt751b14G9tWQcmDWI11ck%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;673&quot; height=&quot;226&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;226&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;다음으로 Controller와 Service, DAO 그리고 mapper 파일에 어노테이션부터 넣고 시작하려고 한다.&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1727492088368&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.controller;

import javax.inject.Inject;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.mystory001.service.BoardService;

@Controller
@RequestMapping(&quot;/board/*&quot;)
public class BoardController {
	
	@Inject
	private BoardService boardService;

}&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;@RequestMapping&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MemberController와 달리 @RequestMapping 어노테이션이 추가되었다. 이 어노테이션이 무엇인지 먼저 찾아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-requestmapping.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;docs.spring.io&lt;/a&gt;에서 찾을 수 있었다.&amp;nbsp;@RequestMapping을 사용하여 요청을 컨트롤러 메소드에 매핑할 수 있다. URL, HTTP, 메소드, 요청 매개 변수, 헤더 및 미디어 유형별로 일치시킬 수 있는 다양한 속성이 있다. 클래스 수준에서 공유 매핑을 표현하거나 메소드 수준에서 특정 엔드 포인트 매핑으로 좁힐 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;내가 이해한 것을 설명하자면&lt;u&gt;&lt;b&gt; 경로가 같고 파일명이 다른 파일을 한 번 경로를 설정함으로써 또 작성하지 않게 해줄 수 있다?&lt;/b&gt;&lt;/u&gt;로 볼 수 있을까 @RequestMapping(&quot;/board&quot;)를 써줌으로써 @GetMapping/@PostMapping에()안에 &quot;board/&quot;를 작성해주지 않아도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;더 자세히 정확히 하나라도 알아가야 하므로 열심히 블로그들을 찾아보았다. 그 결과 아주 정리가 잘 된 블로그를 찾았다. &lt;a href=&quot;https://backendcode.tistory.com/227&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://backendcode.tistory.com/227&lt;/a&gt; 여기를 참고하였다. 위치에 따라 역할이 조금 다르다. 메소드와 클래스에 붙일 수 있다. 지금처럼 클래스에 붙였을 때는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;공통되는 URL이 있을 때 메소드에 중복되는 value 값을 없앨 수 있다&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;BoardService&lt;/p&gt;
&lt;pre id=&quot;code_1727493115724&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.service;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.mystory001.dao.BoardDAO;

@Service
public class BoardService {
	
	@Inject
	private BoardDAO boardDAO;

}&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;BoardDAO&lt;/p&gt;
&lt;pre id=&quot;code_1727493132215&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.dao;

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

@Repository
public class BoardDAO {

	@Inject
	private SqlSession sqlSession;
	
	private static final String namespace = &quot;com.mystory001.mappers.boardMapper&quot;;
	
}&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;boardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1727493144628&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
  PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
  &quot;https://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;com.mystory001.mappers.boardMapper&quot;&amp;gt;


&amp;lt;/mapper&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;/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;글쓰기 주소 매핑하고 insert 페이지를 봤는데(따로 확인은 안 함.. 대략적으로 이런 느낌이겠지 하고 만들어만 둠) 생각보다 만족스러움&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1281&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nn2Nx/btsJQnwDk4K/W6aajY7ECJG2sxNNkYQbAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nn2Nx/btsJQnwDk4K/W6aajY7ECJG2sxNNkYQbAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nn2Nx/btsJQnwDk4K/W6aajY7ECJG2sxNNkYQbAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNn2Nx%2FbtsJQnwDk4K%2FW6aajY7ECJG2sxNNkYQbAk%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;1281&quot; height=&quot;792&quot; data-origin-width=&quot;1281&quot; data-origin-height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제목이랑 내용이 너무 붙어 있어 한 칸이나 두 칸 줄 바꾸기 하고 placeholder 속성을 이용하고 제목 : 내용 : 을 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727493849687&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;게시 글 작성&amp;lt;/h1&amp;gt;
&amp;lt;form&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;subject&quot; placeholder=&quot;제목을 작성해주세요&quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;textarea rows=&quot;10&quot; cols=&quot;50&quot; name=&quot;content&quot; placeholder=&quot;내용을 입력해주세요.&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;작성하기&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&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;1248&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmyYiw/btsJRcnBUt8/7gu3F6vLod2MI8Vz3TjRPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmyYiw/btsJRcnBUt8/7gu3F6vLod2MI8Vz3TjRPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmyYiw/btsJRcnBUt8/7gu3F6vLod2MI8Vz3TjRPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmyYiw%2FbtsJRcnBUt8%2F7gu3F6vLod2MI8Vz3TjRPk%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;1248&quot; height=&quot;604&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;604&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;작성하기를 누르면 글 번호가 매겨지고 작성 시간은 알아서 매겨질 것이다. 글 번호를 어떻게 매겨야 할까? 떠오르는 방법은 사실 DB에 board 테이블에 no를 auto-increment 속성을 넣어주면 될 것 같다는 생각이 든다. 교육받을 때는 다른 방법으로 한 것 같은데 기억이 안 난다. 프로젝트 때도 auto-increment속성을 사용해서 그런 것 같다. 교육받을 때는 HttpSession 객체와 Model 객체를 이용해서 나타냄. Model 객체도 좀 알아보고 넘어가야 할 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Model 객체&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;MVC 아키텍처에서 View와 Controller 간 데이터 전달을 담당하는 객체. 로직의 결과를 담아 View에 전달하거나, 사용자 입력을 받아 Controller에 전달하는 역할을 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;K-V 쌍의 컨테이너로 사용됨. Controller에서 데이터를 Model에 저장하고, 이를 View에 전달하여 동적으로 생성되는 웹 페이지를 생성함.&lt;/p&gt;
&lt;pre id=&quot;code_1727495083583&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Controller
@GetMapping(&quot;/main&quot;)
public String main(Model model){
	String str = &quot;Model 객체&quot;;
    model.addAttribute(&quot;str&quot;, str);
    return &quot;main&quot;;
    }
    
//main.jsp
(...생략...)
&amp;lt;h1&amp;gt;${str}&amp;lt;/h1&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;${str} 표현식을 이용해 Model에 저장된 데이터를 사용할 수 있을 것이다.&amp;nbsp; main.jsp에서 &quot;Model 객체&quot;라는 것이 표시될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;즉, Model 객체는 Controller과 View 간의 데이터 전달을 쉽게 처리하기 위한 중간 매개체로 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp; &lt;a href=&quot;https://iknowandyouknow.tistory.com/entry/JAVA-spring-model-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://iknowandyouknow.tistory.com/entry/JAVA-spring-model-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0&lt;/a&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;BoardController&lt;/p&gt;
&lt;pre id=&quot;code_1727501483089&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.controller;

import java.util.List;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.mystory001.domain.BoardDTO;
import com.mystory001.service.BoardService;

@Controller
@RequestMapping(&quot;/board/*&quot;)
public class BoardController {
	
	@Inject
	private BoardService boardService;
	
	/* 게시판 글 들고오기 */
	@GetMapping(&quot;/&quot;)
	public String main(HttpServletRequest request, Model model) {
		System.out.println(&quot;BoardController main()&quot;);
		
		List&amp;lt;BoardDTO&amp;gt; boardList = boardService.getBoardList(); //게시물
		
		
		return &quot;/&quot;;
	}
	
	/* 글쓰기 */
	@GetMapping(&quot;/insert&quot;)
	public String insert() {
		System.out.println(&quot;BoardController&quot;);
		return &quot;board/insert&quot;;
	}
	
	@PostMapping(&quot;/insertPro&quot;)
	public String insertPro() {
		return &quot;&quot;;
	}

}&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;BoardService&lt;/p&gt;
&lt;pre id=&quot;code_1727501500360&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.service;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.mystory001.dao.BoardDAO;
import com.mystory001.domain.BoardDTO;

@Service
public class BoardService {
	
	@Inject
	private BoardDAO boardDAO;

	public List&amp;lt;BoardDTO&amp;gt; getBoardList() {
		System.out.println(&quot;BoardService getBoardList()&quot;);
		return boardDAO.getBoardList();
	}

}&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;BoardDAO&lt;/p&gt;
&lt;pre id=&quot;code_1727501513875&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.dao;

import java.util.List;

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

import com.mystory001.domain.BoardDTO;

@Repository
public class BoardDAO {

	@Inject
	private SqlSession sqlSession;
	
	private static final String namespace = &quot;com.mystory001.mappers.boardMapper&quot;;

	public List&amp;lt;BoardDTO&amp;gt; getBoardList() {
		System.out.println(&quot;BoardDAO getBoardList()&quot;);
		return sqlSession.selectList(namespace+&quot;.getBoardList&quot;);
	}
	
}&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;boardMapper&lt;/p&gt;
&lt;pre id=&quot;code_1727501525912&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
  PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
  &quot;https://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;com.mystory001.mappers.boardMapper&quot;&amp;gt;

	&amp;lt;select id=&quot;getBoardList&quot; resultType=&quot;com.mystory001.domain.BoardDTO&quot;&amp;gt;
		select *
		from board
	&amp;lt;/select&amp;gt;
&amp;lt;/mapper&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;남은 작업 insert, update, delete 마무리 하기&lt;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/287</guid>
      <comments>https://001cloudid.tistory.com/entry/justBoard8-%EA%B2%8C%EC%8B%9C%ED%8C%90-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%9E%91%EC%97%85#entry287comment</comments>
      <pubDate>Sat, 28 Sep 2024 12:47:02 +0900</pubDate>
    </item>
    <item>
      <title>justBoard7 member 마무리, board 준비</title>
      <link>https://001cloudid.tistory.com/entry/justBoard7-member-%EB%A7%88%EB%AC%B4%EB%A6%AC-board</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;남은 작업은&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;member&lt;br /&gt;회원수정&lt;br /&gt;회원탈퇴&lt;/li&gt;
&lt;li&gt;board &lt;br /&gt;글 목록&lt;br /&gt;페이지처리&lt;br /&gt;검색&lt;br /&gt;글 생성&lt;br /&gt;글 삭제&lt;br /&gt;글 수정&lt;br /&gt;글 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업을 시작하기 전&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 내가 이 프로젝트를 혼자서 하는 이유에 대해서 정리하고자 함.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;데이터&lt;br /&gt;데이터의 흐림 이해&lt;br /&gt;원하는 데이터를 어떻게 DB에서 들고 올 것인가/어떻게 DB에 넣을 것인가&lt;br /&gt;데이터를 어떻게 처리할 것인가&lt;/li&gt;
&lt;li&gt;객체, 어노테이션&lt;br /&gt;교육받을 때 팀 프로젝트 때는 여유 없이 객체, 어노테이션이 어떻게 쓰이는지 자세히 알고 지나가지 않아 여유롭게 잘 알고 지나가기 위함&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크게 2가지로 나눌 수 있는데 어느 순간 그건 모르겠고 마무리 지어야 해라는 생각으로 하고 있었나 봄.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목표는 &lt;b&gt;충분히 고민하고 혼자서 해답을 찾을 수 있는 검색 능력과 이해하기&lt;/b&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;/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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk6yVR/btsJLWfsYOD/kzA3xX0cmUUy1XQWRU57w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk6yVR/btsJLWfsYOD/kzA3xX0cmUUy1XQWRU57w0/img.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;764&quot; data-is-animation=&quot;false&quot; style=&quot;width: 47.7669%; margin-right: 10px;&quot; data-widthpercent=&quot;48.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk6yVR/btsJLWfsYOD/kzA3xX0cmUUy1XQWRU57w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk6yVR%2FbtsJLWfsYOD%2FkzA3xX0cmUUy1XQWRU57w0%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;1228&quot; height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wSxih/btsJLZJ0f0v/vjGfkCOEQLCkq5JVWc2ySK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wSxih/btsJLZJ0f0v/vjGfkCOEQLCkq5JVWc2ySK/img.png&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;714&quot; data-is-animation=&quot;false&quot; style=&quot;width: 51.0703%;&quot; data-widthpercent=&quot;51.67&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wSxih/btsJLZJ0f0v/vjGfkCOEQLCkq5JVWc2ySK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwSxih%2FbtsJLZJ0f0v%2FvjGfkCOEQLCkq5JVWc2ySK%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;1227&quot; height=&quot;714&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 사진과 같이 id가 보이지 않는다. id의 경우 readonly로 되어 있기 때문에 문제가 생긴다.&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;session이 남아있기 때문에 mypage.jsp에&lt;/p&gt;
&lt;pre id=&quot;code_1727316551084&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;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능 --%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727317142290&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;내 정보&amp;lt;/h1&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; required=&quot;required&quot; placeholder=&quot;비밀번호&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 대/소문자, 숫자, 특수문자를 사용 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; required=&quot;required&quot; placeholder=&quot;비밀번호재확인&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 비밀번호를 다시 입력 --%&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; required=&quot;required&quot; placeholder=&quot;이름&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 한글, 영문만 입력 가능 --%&amp;gt;
&amp;lt;sub&amp;gt;회원 수정은 비밀번호와 이름을 바꿀 수 있습니다.&amp;lt;br&amp;gt;
'비밀번호'를 변경하기 위해서는 변경할 비밀번호와 변경할 비밀번호 재확인을 입력하고 이름도 입력해주길 바랍니다.&amp;lt;/sub&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath }/member/updatePro&quot;&amp;gt;&amp;lt;button&amp;gt;수정&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath }/member/deletePro&quot;&amp;gt;&amp;lt;button&amp;gt;탈퇴&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath }/&quot;&amp;gt;&amp;lt;button&amp;gt;돌아가기&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;이렇게 작성하고 나니 form태그도 없는데 수정할 때 데이터가 넘어갈까?라는 의문이 들어 검색해 보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가능한데 자바스크립트를 이용해 야한 다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 form태그를 2개 사용하는 방법은 될까? 거기에 대한 답변은 &lt;a href=&quot;https://okky.kr/questions/796732&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://okky.kr/questions/796732&lt;/a&gt; 여기서 확인할 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 어떻게 어떤 방식으로 회원탈퇴와 회원수정을 한 화면에서 처리할 수 있을까에 대해 검색해 보니 가장 마음에 드는 답변을 찾았다. &lt;a href=&quot;https://developerjm.tistory.com/23&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developerjm.tistory.com/23&lt;/a&gt; form태그 하나에 두 개 이상의 submit 버튼으로 각기 다른 요청을 보내는 방법이다. formaction이라는 속성은 한 번도 사용해보지 않아서 어떻게 될지 모르겠지만 한 번 도전해 보기로&lt;/p&gt;
&lt;pre id=&quot;code_1727319316616&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;내 정보&amp;lt;/h1&amp;gt;
&amp;lt;form method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; required=&quot;required&quot; placeholder=&quot;비밀번호&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 대/소문자, 숫자, 특수문자를 사용 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; required=&quot;required&quot; placeholder=&quot;비밀번호재확인&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 비밀번호를 다시 입력 --%&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; required=&quot;required&quot; placeholder=&quot;이름&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 한글, 영문만 입력 가능 --%&amp;gt;
&amp;lt;sub&amp;gt;회원 수정은 비밀번호와 이름을 바꿀 수 있습니다.&amp;lt;br&amp;gt;
'비밀번호'를 변경하기 위해서는 변경할 비밀번호와 변경할 비밀번호 재확인을 입력하고 이름도 입력해주길 바랍니다.&amp;lt;/sub&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;button type=&quot;submit&quot; formaction=&quot;${pageContext.request.contextPath }/member/updatePro&quot;&amp;gt;수정&amp;lt;/button&amp;gt;
&amp;lt;button type=&quot;submit&quot; formaction=&quot;${pageContext.request.contextPath }/member/deletePro&quot;&amp;gt;탈퇴&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath }/&quot;&amp;gt;&amp;lt;button&amp;gt;돌아가기&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;MemberController&lt;/p&gt;
&lt;pre id=&quot;code_1727319679048&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;member/updatePro&quot;)
	public String updatePro(MemberDTO memberDTO) {
		System.out.println(&quot;MemberController updatePro()&quot;);
		memberService.update(memberDTO);
		return &quot;redirect:/&quot;;
	}&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;MemberService&lt;/p&gt;
&lt;pre id=&quot;code_1727319690741&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void update(MemberDTO memberDTO) {
		System.out.println(&quot;MemberService update()&quot;);
		memberDAO.update(memberDTO);
	}&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;MemberDAO&lt;/p&gt;
&lt;pre id=&quot;code_1727319699892&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void update(MemberDTO memberDTO) {
		System.out.println(&quot;MemberDAO update()&quot;);
		sqlSession.update(namespace+&quot;.update&quot;, memberDTO);
	}&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;memberMapper&lt;/p&gt;
&lt;pre id=&quot;code_1727319712878&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;update id=&quot;update&quot;&amp;gt;
		update `member`
		set pw = #{pw}
		where id=#{id}
	&amp;lt;/update&amp;gt;&lt;/code&gt;&lt;/pre&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;370&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWu8TZ/btsJL12caID/uN3OkJBXTFWvSYkkIiL58k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWu8TZ/btsJL12caID/uN3OkJBXTFWvSYkkIiL58k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWu8TZ/btsJL12caID/uN3OkJBXTFWvSYkkIiL58k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWu8TZ%2FbtsJL12caID%2FuN3OkJBXTFWvSYkkIiL58k%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;370&quot; height=&quot;163&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;163&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id가 d인 회원의 비밀번호를 바꿔보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMYP4b/btsJLkg62YV/qrIrkn6K2pomXRwWUqKBl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMYP4b/btsJLkg62YV/qrIrkn6K2pomXRwWUqKBl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMYP4b/btsJLkg62YV/qrIrkn6K2pomXRwWUqKBl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMYP4b%2FbtsJLkg62YV%2FqrIrkn6K2pomXRwWUqKBl0%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;381&quot; height=&quot;157&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MemberController&lt;/p&gt;
&lt;pre id=&quot;code_1727320109226&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;member/deletePro&quot;)
	public String deletePro(MemberDTO memberDTO, HttpSession session) {
		System.out.println(&quot;MemberController deletePro()&quot;);
		memberService.delete(memberDTO);
		session.invalidate();
		return &quot;redirect:/&quot;;
	}&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;MemberService&lt;/p&gt;
&lt;pre id=&quot;code_1727320151685&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void delete(MemberDTO memberDTO) {
		System.out.println(&quot;MemberService delete()&quot;);
		memberDAO.delete(memberDTO);
	}&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;MemberDAO&lt;/p&gt;
&lt;pre id=&quot;code_1727320164666&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public void delete(MemberDTO memberDTO) {
		System.out.println(&quot;MemberDAO delete()&quot;);
		sqlSession.update(namespace+&quot;.delete&quot;, memberDTO);
	}&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;memberMapper&lt;/p&gt;
&lt;pre id=&quot;code_1727320198215&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;delete id=&quot;delete&quot;&amp;gt;
		delete from `member`
		where id=#{id}
	&amp;lt;/delete&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;test라는 아이디를 생성 &amp;rarr; 삭제&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qRJKX/btsJM3LvYoA/2wKgONkzPgRXbBMfr1yoWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qRJKX/btsJM3LvYoA/2wKgONkzPgRXbBMfr1yoWK/img.png&quot; data-origin-width=&quot;375&quot; data-origin-height=&quot;171&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.0759%; margin-right: 10px;&quot; data-widthpercent=&quot;48.64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qRJKX/btsJM3LvYoA/2wKgONkzPgRXbBMfr1yoWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqRJKX%2FbtsJM3LvYoA%2F2wKgONkzPgRXbBMfr1yoWK%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;375&quot; height=&quot;171&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/16X4d/btsJL9TgFXB/JbZT6DazdkV97K9Rc6qa31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/16X4d/btsJL9TgFXB/JbZT6DazdkV97K9Rc6qa31/img.png&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;168&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.7613%;&quot; data-widthpercent=&quot;51.36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/16X4d/btsJL9TgFXB/JbZT6DazdkV97K9Rc6qa31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F16X4d%2FbtsJL9TgFXB%2FJbZT6DazdkV97K9Rc6qa31%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;389&quot; height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;생성과 삭제&lt;/figcaption&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;mypage에서 유효성 검사가 빠짐. &lt;br /&gt;&amp;rarr; 어제 작성한 회원가입 시 비밀번호가 틀리면 페이지가 안 넘어가게 하면 됨&lt;/li&gt;
&lt;li&gt;mypage에서 이름이 회원가입 했을 때 이름과 달라도 회원수정, 탈퇴가 될 것 &lt;br /&gt;&amp;rarr; 로그인할 때 session에 name을 추가하면 될 것&lt;/li&gt;
&lt;li&gt;http://localhost:8080/justboard/member/check 이 페이지를 주소창에 작성하면 들어가 짐&lt;br /&gt;&amp;rarr; 로그인되지 않았을 때는 접근 못하게 제어&lt;/li&gt;
&lt;li&gt;join에서 아이디 중복확인&lt;br /&gt;&amp;rarr; ajax를 이용해서 아이디 중복확인. 아이디 중복 시 회원가입 불가&lt;/li&gt;
&lt;li&gt;inc 사이드바 수정&lt;br /&gt;&amp;rarr; 현재 게시판, 내 정보가 있는데 이를 그냥 홈 화면으로 수정하고 클릭 시 main으로 이동&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727321749154&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;script src=&quot;${pageContext.request.contextPath}/resources/js/jquery-3.7.1.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;내 정보&amp;lt;/h1&amp;gt;
&amp;lt;form method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; id=&quot;pw&quot; required=&quot;required&quot; placeholder=&quot;비밀번호&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 대/소문자, 숫자, 특수문자를 사용 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; id=&quot;pw2&quot; required=&quot;required&quot; placeholder=&quot;비밀번호재확인&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 비밀번호를 다시 입력 --%&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; required=&quot;required&quot; placeholder=&quot;이름&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 한글, 영문만 입력 가능 --%&amp;gt;
&amp;lt;sub&amp;gt;회원 수정은 비밀번호와 이름을 바꿀 수 있습니다.&amp;lt;br&amp;gt;
'비밀번호'를 변경하기 위해서는 변경할 비밀번호와 변경할 비밀번호 재확인을 입력하고 이름도 입력해주길 바랍니다.&amp;lt;/sub&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;button type=&quot;submit&quot; onclick=&quot;return passwordPass()&quot; formaction=&quot;${pageContext.request.contextPath }/member/updatePro&quot;&amp;gt;수정&amp;lt;/button&amp;gt;
&amp;lt;button type=&quot;submit&quot; onclick=&quot;return passwordPass()&quot; formaction=&quot;${pageContext.request.contextPath }/member/deletePro&quot;&amp;gt;탈퇴&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath }/&quot;&amp;gt;&amp;lt;button&amp;gt;돌아가기&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
function passwordPass(){
	var pw = document.getElementById(&quot;pw&quot;);
	var pw2 = document.getElementById(&quot;pw2&quot;);
	
	if(pw &amp;amp;&amp;amp; pw2){
		var pass = pw.value;
		var passConfirm = pw2.value;
		
		if(pass !== passConfirm){
			alert(&quot;비밀번호가 일치하지 않습니다.&quot;);
			pw.focus();
			return false;
		}
	}
	return true;
}
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&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;377&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cppIpQ/btsJLZJ521M/IBY4ZsZ9BDDkevd5SxOxUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cppIpQ/btsJLZJ521M/IBY4ZsZ9BDDkevd5SxOxUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cppIpQ/btsJLZJ521M/IBY4ZsZ9BDDkevd5SxOxUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcppIpQ%2FbtsJLZJ521M%2FIBY4ZsZ9BDDkevd5SxOxUk%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;377&quot; height=&quot;172&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;172&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;1248&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duK1bj/btsJMaLsLns/kUBUYDNSTBXv82u2rZLuaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duK1bj/btsJMaLsLns/kUBUYDNSTBXv82u2rZLuaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duK1bj/btsJMaLsLns/kUBUYDNSTBXv82u2rZLuaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduK1bj%2FbtsJMaLsLns%2FkUBUYDNSTBXv82u2rZLuaK%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;1248&quot; height=&quot;392&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;392&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;1242&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOKOGj/btsJLjvLhFG/KNKWVX4vs0WykeOQfWFhFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOKOGj/btsJLjvLhFG/KNKWVX4vs0WykeOQfWFhFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOKOGj/btsJLjvLhFG/KNKWVX4vs0WykeOQfWFhFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOKOGj%2FbtsJLjvLhFG%2FKNKWVX4vs0WykeOQfWFhFK%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;1242&quot; height=&quot;508&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;form 태그 안에 onClick 속성을 넣으니 비밀번호 입력란에 비밀번호를 입력하고 포커스를 이동할 때마다 알림 창이 떠서 버튼에 onClick 속성을 넣으니 문제없이 잘 됨!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름을 아무렇게나 작성하고 해도 문제없이 비밀번호가 수정됨. 2번에서 수정해 보자&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;2.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MemberController 일부&lt;/p&gt;
&lt;pre id=&quot;code_1727321971505&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	/* 로그인 &amp;rarr; 회원 확인 */
	@PostMapping(&quot;/loginPro&quot;)
	public String loginPro(MemberDTO memberDTO, HttpSession session) {
		System.out.println(&quot;MemberController loginPro()&quot;);
		MemberDTO memberDTO2 = memberService.userCheck(memberDTO); //폼에서 입력받은 데이터가 존재하는지 확인
		
		if(memberDTO2 != null) {
			session.setAttribute(&quot;id&quot;, memberDTO2.getId());
			session.setAttribute(&quot;name&quot;, memberDTO2.getName());
			return &quot;redirect:/&quot;;
		} else {
			return &quot;member/loginmsg&quot;;
		}
	}&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;mypage.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1727323011404&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;script src=&quot;${pageContext.request.contextPath}/resources/js/jquery-3.7.1.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;내 정보&amp;lt;/h1&amp;gt;
&amp;lt;form method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; value=&quot;${sessionScope.id }&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; id=&quot;pw&quot; required=&quot;required&quot; placeholder=&quot;비밀번호&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 대/소문자, 숫자, 특수문자를 사용 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; id=&quot;pw2&quot; required=&quot;required&quot; placeholder=&quot;비밀번호재확인&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 비밀번호를 다시 입력 --%&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; value=&quot;${sessionScope.name}&quot; required=&quot;required&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 한글, 영문만 입력 가능 --%&amp;gt;
&amp;lt;sub&amp;gt;회원 수정은 비밀번호를 바꿀 수 있습니다.&amp;lt;br&amp;gt;
'비밀번호'를 변경하기 위해서는 변경할 비밀번호와 변경할 비밀번호 재확인을 입력해주길 바랍니다.&amp;lt;/sub&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;button type=&quot;submit&quot; onclick=&quot;return passwordPass()&quot; formaction=&quot;${pageContext.request.contextPath }/member/updatePro&quot;&amp;gt;수정&amp;lt;/button&amp;gt;
&amp;lt;button type=&quot;submit&quot; onclick=&quot;return passwordPass()&quot; formaction=&quot;${pageContext.request.contextPath }/member/deletePro&quot;&amp;gt;탈퇴&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;a href=&quot;${pageContext.request.contextPath }/&quot;&amp;gt;&amp;lt;button&amp;gt;돌아가기&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
function passwordPass(){
	var pw = document.getElementById(&quot;pw&quot;);
	var pw2 = document.getElementById(&quot;pw2&quot;);
	
	if(pw &amp;amp;&amp;amp; pw2){
		var pass = pw.value;
		var passConfirm = pw2.value;
		
		if(pass !== passConfirm){
			alert(&quot;비밀번호가 일치하지 않습니다.&quot;);
			pw.focus();
			return false;
		}
	}
	return true;
}
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&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;1248&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmF8Ub/btsJMdOWP3x/iTdZbjg83BYXnTv0HUgS4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmF8Ub/btsJMdOWP3x/iTdZbjg83BYXnTv0HUgS4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmF8Ub/btsJMdOWP3x/iTdZbjg83BYXnTv0HUgS4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmF8Ub%2FbtsJMdOWP3x%2FiTdZbjg83BYXnTv0HUgS4k%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;1248&quot; height=&quot;511&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;511&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;3.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MemberController&lt;/p&gt;
&lt;pre id=&quot;code_1727324165766&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;member/check&quot;)
	public String check(HttpSession session) {
		System.out.println(&quot;MemberController check()&quot;);
		
		if(session.getAttribute(&quot;id&quot;)==null) {
			return &quot;/member/loginmsg2&quot;;
		}
		return &quot;/member/check&quot;;
	}&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;loginmsg2&lt;/p&gt;
&lt;pre id=&quot;code_1727324181465&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
	alert(&quot;로그인을 해주세요.&quot;);
	history.back(); //뒤로 이동
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&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;1120&quot; data-origin-height=&quot;715&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQVmDi/btsJNe7j2UK/uYqL1pxkPpBDx2AcfK80M1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQVmDi/btsJNe7j2UK/uYqL1pxkPpBDx2AcfK80M1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQVmDi/btsJNe7j2UK/uYqL1pxkPpBDx2AcfK80M1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQVmDi%2FbtsJNe7j2UK%2FuYqL1pxkPpBDx2AcfK80M1%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;1120&quot; height=&quot;715&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;715&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;/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;여기서 Redirect와 Forward 차이를 한 번 살펴보고 가자&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;redirect : 클라이언트가 새로운 요청을 보내게 한다. URL이 변경되며, 브라우저에서 새로운 요청을 함&lt;/li&gt;
&lt;li&gt;forward : 서버 내에서 요청을 다른 JSP로 전달. URL은 변경되지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문법이 엄격한 자바에 비해 자바스크립트는 아주 자유롭다 못해 내가 IDE에서는 코드를 작성해도 문법 오류를 알려주지 않으니 이게 외않되? 하며 페이지 검사를 하게 한다. 중괄호, 소괄호 누락된 거 찾는 것보다 다시 작성하는 게 더 편할 정도로 괄호를 많이 쓴다.&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;먼저 AJAX(에이잭스, 아잭스, 아작스,... 나는 에이잭스라고 읽긴 하는데) 이에 대해 알아보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AJAX는 Asynchronous JavaScript And Xml의 약자이다. 가장 쉽게 이해하기 좋은 게 웹 광고이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1407&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w1La5/btsJMyyzBnd/RgY3iswNuGdjkwsZFuzgpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w1La5/btsJMyyzBnd/RgY3iswNuGdjkwsZFuzgpK/img.png&quot; data-alt=&quot;네이버&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w1La5/btsJMyyzBnd/RgY3iswNuGdjkwsZFuzgpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw1La5%2FbtsJMyyzBnd%2FRgY3iswNuGdjkwsZFuzgpK%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;1407&quot; height=&quot;378&quot; data-origin-width=&quot;1407&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;네이버&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사진에서 원을 쳐놓은 부분은 시간이 지나면 다른 광고로 바뀐다. 즉 화면 전환 없이 일부만 바뀌는 것이 AJAX이다.&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;/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;/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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점으로는 AJAX를 사용하지 못하는 브라우저가 있으며, http 클라이언트의 기능이 한정되어 있고, 보안상의 문제가 있다는 점을 들 수 있다.&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;a href=&quot;https://ko.wikipedia.org/wiki/Ajax&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;위키백과 ajax&lt;/a&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;AJAX의 문법에 대해 알아보자&lt;/p&gt;
&lt;pre id=&quot;code_1727325842810&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$.ajax({
    type : '', // get, post 등을 지정
    url : '/url', // 대상 URL을 지정
    async : true, // 비동기화 여부(생략 시 true가 기본값)
    dataType : 'text', // html, xml, json, text 등등
    data : JSON.stringify({ // 보낼 데이터 (Object , String, Array)
    }),
    success : function(result) { // 성공 시
        console.log(result);
    },
    error : function(request, status, error) { // 에러 시
        console.log(error)
    }
})&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;jquery를 사용할 jsp에&lt;/p&gt;
&lt;pre id=&quot;code_1727325896488&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt; //url을 입력해서 사용할 경우
&amp;lt;script src=&quot;${pageContext.request.contextPath}/resources/js/jquery-3.7.1.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt; //파일을 넣어 준 경우&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;jquery의 핵심 기능 중 하나가 ajax이다. jquery를 사용하면 ajax요청을 간편하게 생성하고 처리할 수 있다.&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;join.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1727329891400&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
.formstyle{
	width : 400px;
	
}
.label{
	width : 200px;
}
.validation{
	width: 200px;
	height: 30px;
}
&amp;lt;/style&amp;gt;
&amp;lt;script src=&quot;${pageContext.request.contextPath}/resources/js/jquery-3.7.1.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;회원가입&amp;lt;/h1&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/member/joinPro&quot; method=&quot;post&quot; id=&quot;join&quot; onsubmit=&quot;return formCheck()&quot;&amp;gt;
&amp;lt;div class=&quot;formstyle&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; id=&quot;id&quot; required=&quot;required&quot; placeholder=&quot;아이디&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; id=&quot;pw&quot; required=&quot;required&quot; placeholder=&quot;비밀번호&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 대/소문자, 숫자, 특수문자를 사용 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; id=&quot;pw2&quot; required=&quot;required&quot; placeholder=&quot;비밀번호재확인&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 비밀번호를 다시 입력 --%&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; required=&quot;required&quot; placeholder=&quot;이름&quot;&amp;gt; &amp;lt;%-- 한글, 영문만 입력 가능 --%&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;validation&quot;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;%-- 유효성 검사 시 유효성에 일치않을 때 --%&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;회원가입&quot;&amp;gt; 
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
&amp;lt;%-- 아이디 중복확인 --%&amp;gt;


&amp;lt;%-- 비밀번호와 비밀번호 재확인 --%&amp;gt;
function passwordPass() {
    var pw = document.getElementById(&quot;pw&quot;);
    var pw2 = document.getElementById(&quot;pw2&quot;);

    if (pw &amp;amp;&amp;amp; pw2) {
        var password = pw.value;
        var confirmPassword = pw2.value;

        if (password !== confirmPassword) {
            alert(&quot;비밀번호가 일치하지 않습니다.&quot;);
            pw2.focus(); // 비밀번호 재확인 필드에 포커스
            return false; // 검증 실패
        }
    }
    return true; // 검증 성공
}

&amp;lt;%-- 정규표현식(RegExp). RegExp() : 정규표현식 표시 함수. RegExp(/정규표현식내용/) --%&amp;gt;
function regExp() {
    var id = document.getElementById(&quot;id&quot;);
    var idRegExp = /^[a-z0-9]{2,20}$/; // 영소문자 + 숫자가 하나 이상 포함되며 2~20자

    if (!idRegExp.test(id.value)) {
        alert(&quot;아이디 형식은 영소문자, 숫자로만 가능하며 2~20자까지 가능&quot;);
        id.focus(); // 아이디 필드에 포커스
        return false; // 검증 실패
    }
    return true; // 검증 성공
}

function formCheck(){
    var validId = regExp();
    var validPw = passwordPass();

    if(validId &amp;amp;&amp;amp; validPw) {
        return true; // 모든 검증 통과, 폼 제출
    } else {
        alert(&quot;형식에 맞게 작성해주세요&quot;);
        return false; // 검증 실패, 폼 제출 중지
    }
}

$(function(){
    $('#id').on('blur', function() { // 'id' 입력 필드에 blur 이벤트 추가
        $.ajax({
            url : '${pageContext.request.contextPath}/member/idCheck',
            data : {'id': $('#id').val()}, // $('.id')에서 $('#id')로 수정
            success : function(result){
                if(result == &quot;iddup&quot;){
                    result = &quot;이미 사용 중인 아이디입니다.&quot;;
                    $('.validation').css(&quot;color&quot;, &quot;red&quot;);
                } else {
                	result = &quot;사용이 가능한 아이디입니다.&quot;;
                    $('.validation').css(&quot;color&quot;, &quot;green&quot;);
                }
                $('.validation').html(result); // 결과 메시지를 표시
            }
        });
    });
});

&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;MemberController&lt;/p&gt;
&lt;pre id=&quot;code_1727329906292&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	/* 아이디 중복확인 */
	@GetMapping(&quot;member/idCheck&quot;)
	public String idCheck(MemberDTO memberDTO, HttpServletResponse response){
		System.out.println(&quot;MemberController idCheck()&quot;);
		MemberDTO memberDTO2 = memberService.idCheck(memberDTO.getId());
		String result = &quot;&quot;;
		if(memberDTO2!=null) {
			result = &quot;iddup&quot;;
		} else {
			result = &quot;idnotdup&quot;;
		}
		System.out.println(result);
		return result;
	}&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;MemberService&lt;/p&gt;
&lt;pre id=&quot;code_1727329917540&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public MemberDTO idCheck(String id) {
		System.out.println(&quot;MemberService idCheck()&quot;);
		return memberDAO.idCheck(id);
	}&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;MemberDAO&lt;/p&gt;
&lt;pre id=&quot;code_1727329928760&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public MemberDTO idCheck(String id) {
		System.out.println(&quot;MemberDAO idCheck()&quot;);
		return sqlSession.selectOne(namespace+&quot;.idCheck&quot;, id);
	}&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;memberMapper&lt;/p&gt;
&lt;pre id=&quot;code_1727329943800&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;idCheck&quot; resultType=&quot;com.mystory001.domain.MemberDTO&quot;&amp;gt;
		select * 
		from `member`
		where id = #{id}
	&amp;lt;/select&amp;gt;&lt;/code&gt;&lt;/pre&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;994&quot; data-origin-height=&quot;871&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZXJX6/btsJN1fu1r4/EmAHLBNgPPFZzj6c3RsHB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZXJX6/btsJN1fu1r4/EmAHLBNgPPFZzj6c3RsHB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZXJX6/btsJN1fu1r4/EmAHLBNgPPFZzj6c3RsHB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZXJX6%2FbtsJN1fu1r4%2FEmAHLBNgPPFZzj6c3RsHB0%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;994&quot; height=&quot;871&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;871&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;959&quot; data-origin-height=&quot;863&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CryW4/btsJOaXFWo8/xBcNHRrVAvZUJzsfQ3f7KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CryW4/btsJOaXFWo8/xBcNHRrVAvZUJzsfQ3f7KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CryW4/btsJOaXFWo8/xBcNHRrVAvZUJzsfQ3f7KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCryW4%2FbtsJOaXFWo8%2FxBcNHRrVAvZUJzsfQ3f7KK%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;959&quot; height=&quot;863&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;863&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;955&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwMKnk/btsJN1miSLo/L6wnFB7MQ6euvbj6EfK1Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwMKnk/btsJN1miSLo/L6wnFB7MQ6euvbj6EfK1Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwMKnk/btsJN1miSLo/L6wnFB7MQ6euvbj6EfK1Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwMKnk%2FbtsJN1miSLo%2FL6wnFB7MQ6euvbj6EfK1Z0%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;955&quot; height=&quot;333&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;333&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;30분간 이거 고쳐보고 저거 고쳐보고 했는데 문제를 발견했다. 문제는 Controller에서 @ResponseBody 어노테이션을 빼먹고 왜 안될까 하면서 바보같이 고민했다는 것이다.&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;join.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1727331696274&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
.formstyle{
	width : 400px;
	
}
.label{
	width : 200px;
}
.validation{
	width: 400px;
	height: 30px;
}
&amp;lt;/style&amp;gt;
&amp;lt;script src=&quot;${pageContext.request.contextPath}/resources/js/jquery-3.7.1.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;회원가입&amp;lt;/h1&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/member/joinPro&quot; method=&quot;post&quot; id=&quot;join&quot; onsubmit=&quot;return formCheck()&quot;&amp;gt;
&amp;lt;div class=&quot;formstyle&quot;&amp;gt;
&amp;lt;span class=&quot;validation&quot;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;%-- 유효성 검사 시 유효성에 일치않을 때 --%&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; id=&quot;id&quot; class=&quot;id&quot; required=&quot;required&quot; placeholder=&quot;아이디&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; id=&quot;pw&quot; required=&quot;required&quot; placeholder=&quot;비밀번호&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 대/소문자, 숫자, 특수문자를 사용 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; id=&quot;pw2&quot; required=&quot;required&quot; placeholder=&quot;비밀번호재확인&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 비밀번호를 다시 입력 --%&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; required=&quot;required&quot; placeholder=&quot;이름&quot;&amp;gt; &amp;lt;%-- 한글, 영문만 입력 가능 --%&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;회원가입&quot;&amp;gt; 
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
&amp;lt;%-- 아이디 중복확인 --%&amp;gt;
$(function() {
    $(&quot;#id&quot;).on('blur', function() {
        $.ajax({
            url: '${pageContext.request.contextPath}/member/idCheck',
            data: {'id': $('.id').val()},
            success: function(result) {
                var message;
                if (result == &quot;iddup&quot;) {
                    result = &quot;이미 사용 중인 아이디입니다.&quot;;
                    $('.validation').css(&quot;color&quot;, &quot;red&quot;);
                } else {
                	result = &quot;사용이 가능한 아이디입니다.&quot;;
                    $('.validation').css(&quot;color&quot;, &quot;green&quot;);
                }
                $('.validation').html(result);
            }
        });
    });
});

&amp;lt;%-- 비밀번호와 비밀번호 재확인 --%&amp;gt;
function passwordPass() {
    var pw = document.getElementById(&quot;pw&quot;);
    var pw2 = document.getElementById(&quot;pw2&quot;);

    if (pw &amp;amp;&amp;amp; pw2) {
        var password = pw.value;
        var confirmPassword = pw2.value;

        if (password !== confirmPassword) {
            alert(&quot;비밀번호가 일치하지 않습니다.&quot;);
            pw2.focus(); // 비밀번호 재확인 필드에 포커스
            return false; // 검증 실패
        }
    }
    return true; // 검증 성공
}

&amp;lt;%-- 정규표현식(RegExp). RegExp() : 정규표현식 표시 함수. RegExp(/정규표현식내용/) --%&amp;gt;
function regExp() {
    var id = document.getElementById(&quot;id&quot;);
    var idRegExp = /^[a-z0-9]{2,20}$/; // 영소문자 + 숫자가 하나 이상 포함되며 2~20자

    if (!idRegExp.test(id.value)) {
        alert(&quot;아이디 형식은 영소문자, 숫자로만 가능하며 2~20자까지 가능&quot;);
        id.focus(); // 아이디 필드에 포커스
        return false; // 검증 실패
    }
    return true; // 검증 성공
}

function formCheck(){
    var validId = regExp();
    var validPw = passwordPass();

    if(validId &amp;amp;&amp;amp; validPw) {
        return true; // 모든 검증 통과, 폼 제출
    } else {
        alert(&quot;형식에 맞게 작성해주세요&quot;);
        return false; // 검증 실패, 폼 제출 중지
    }
}

&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;MemberController&lt;/p&gt;
&lt;pre id=&quot;code_1727331716438&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	/* 아이디 중복확인 */
	@GetMapping(&quot;member/idCheck&quot;)
	@ResponseBody
	public String idCheck(MemberDTO memberDTO, HttpServletResponse response){
		System.out.println(&quot;MemberController idCheck()&quot;);
		MemberDTO memberDTO1 = memberService.idCheck(memberDTO.getId());
		String result = &quot;&quot;;
		if(memberDTO1!=null) {
			result = &quot;iddup&quot;;
		} else {
			result = &quot;idOk&quot;;
		}
		System.out.println(result);
		return result;
	}&lt;/code&gt;&lt;/pre&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;611&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rw3cK/btsJM8mrGCK/3kDYVStUBr7fRzquvvCIe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rw3cK/btsJM8mrGCK/3kDYVStUBr7fRzquvvCIe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rw3cK/btsJM8mrGCK/3kDYVStUBr7fRzquvvCIe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRw3cK%2FbtsJM8mrGCK%2F3kDYVStUBr7fRzquvvCIe0%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;611&quot; height=&quot;562&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@ResponseBody : 웹 응답 본문에 바인딩해야하는 메소드 반환값을 나타내주는 어노테이션. 서블릿 환경에서 주석이 있는 핸들러 메소드에 대해 지원. 스프링 비동기 통신, API 통신을 구현하기 위한 어노테이션.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트 &amp;rarr; 서버 요청 : @RequestBody : json 기반의 Http Body를 자바 객체로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 &amp;rarr; 클라이언트 응답 : @ResponseBody : 자바 객체를 json 기반의 Http Body로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 : &lt;a href=&quot;https://velog.io/@nomonday/Spring-RequestBody-ResponseBody-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@nomonday/Spring-RequestBody-ResponseBody-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;읽어보기 : &lt;a href=&quot;https://findmypiece.tistory.com/191&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://findmypiece.tistory.com/191&lt;/a&gt;&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;737&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdknAn/btsJMipz3IQ/RrZtutogeriXVBbALpX3L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdknAn/btsJMipz3IQ/RrZtutogeriXVBbALpX3L1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdknAn/btsJMipz3IQ/RrZtutogeriXVBbALpX3L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdknAn%2FbtsJMipz3IQ%2FRrZtutogeriXVBbALpX3L1%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;737&quot; height=&quot;168&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 개발자 도구 Network에서 볼 수 있는 내용들이다. 사실 Elements, Console, Sources는 자주 봤지만 이 곳은 처음 자세히 보는데 이곳에 대한 내용도 한 번 정리해야 할 것 같다.&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;웹 개발자 도구 Network 탭&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 페이지가 서버와 통신하는 모든 요청과 응답을 모니터링 할 수 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Name&lt;br /&gt;요청한 리소스의 이름이나 경로를 나타냄. 일반적으로 URL이 표시&lt;/li&gt;
&lt;li&gt;Status&lt;br /&gt;서버가 요청을 처리한 결과로 반환한 HTTP 상태 코드를 표시. 각 상태 코드는 각각의 의미를 가지고 있음&lt;br /&gt;200 : 성공적으로 처리됨&lt;br /&gt;404 : 요청한 리소스를 찾을 수 없음&lt;br /&gt;500 : 서버 오류&lt;/li&gt;
&lt;li&gt;Type&lt;br /&gt;요청한 리소스의 유형을 나타냄. 일반적으로 MIME 타입이나 리소스의 종류를 보여줌&lt;br /&gt;Document : HTML 문서&lt;br /&gt;Script : 자바스크립트 파일&lt;br /&gt;XHR : XMLHttpRequest의 약자. Ajax 요청을 뜻함&lt;br /&gt;Image : 이미지 파일&lt;/li&gt;
&lt;li&gt;Initiator&lt;br /&gt;요청을 시작한 원인을 나타냄. 일반적으로 요청을 트리거한 스크립트나 리소스를 보여줌&lt;/li&gt;
&lt;li&gt;Size&lt;br /&gt;요청한 리소스의 크기를 바이트 단위로 표시. 서버에서 반환된 데이터의 크기를 나타냄&lt;/li&gt;
&lt;li&gt;Time&lt;br /&gt;요청이 완료되기까지 소요된 시간을 ms로 표시. 요청과 응답의 전체 시간을 나타냄&lt;/li&gt;
&lt;li&gt;Waterfall&lt;br /&gt;요청의 타이밍을 시각적으로 나타낸 그래프. 요청이 발생한 시점, 응답을 받기까지의 대기 시간, 데이터가 다운로드 되는 시간 등을 보여줌&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.&lt;/p&gt;
&lt;pre id=&quot;code_1727321146637&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.sidebar{
	float : left;
	width: 200px;
	height: 500px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;sidebar&quot;&amp;gt; &amp;lt;%-- sidebar 영역 div --%&amp;gt;
&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;${pageContext.request.contextPath }/&quot;&amp;gt;홈 화면&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; 
&amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- sidebar 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc958o/btsJNNhE2b6/W9wKuJcmNBd9eNk9Q8CDTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc958o/btsJNNhE2b6/W9wKuJcmNBd9eNk9Q8CDTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc958o/btsJNNhE2b6/W9wKuJcmNBd9eNk9Q8CDTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc958o%2FbtsJNNhE2b6%2FW9wKuJcmNBd9eNk9Q8CDTk%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;324&quot; height=&quot;365&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;365&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 board와 관련된 클래스와 xml을 만들어 놓고 시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main.jsp에&lt;/p&gt;
&lt;pre id=&quot;code_1727333524208&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;%-- 반응형 웹 viewport &amp;rarr; head태그 사이에 작성 --%&amp;gt;
&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}

.header{
	float : right;
	width: 1200px;
	height: 0px;
}

.sidebar{
	float : left;
	width: 200px;
	height: 500px;

}

.content{
	width: 1000px;
	height: 600px;
}

.footer{
	float : right;
	width: 1200px;
	height: 0px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;게시물 목록&amp;lt;/h1&amp;gt;
&amp;lt;table border=&quot;1&quot;&amp;gt;
&amp;lt;tr&amp;gt;
	&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;%-- 게시글 목록 --%&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;%-- 페이지 목록 10개씩 10개의 페이지 --%&amp;gt;
&amp;lt;form method=&quot;get&quot;&amp;gt;
 &amp;lt;input type=&quot;text&quot; name=&quot;search&quot; value=&quot;검색&quot;&amp;gt;
 &amp;lt;input type=&quot;submit&quot; value=&quot;검색하기&quot;&amp;gt;
 &amp;lt;/form&amp;gt;
&amp;lt;%-- 로그인이 되어 있을 때만 버튼이 보이게--%&amp;gt;
&amp;lt;c:if test=&quot;${! empty sessionScope.id }&quot;&amp;gt;
	&amp;lt;a href=&quot;${pageContext.request.contextPath }/board/insert&quot;&amp;gt;&amp;lt;button&amp;gt;글쓰기&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같이 만들어 놓고 글이 작성될 때마다 th아래 번호로 내림차순으로 글의 목록이 쌓이게 구현할 것&lt;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/286</guid>
      <comments>https://001cloudid.tistory.com/entry/justBoard7-member-%EB%A7%88%EB%AC%B4%EB%A6%AC-board#entry286comment</comments>
      <pubDate>Thu, 26 Sep 2024 10:42:57 +0900</pubDate>
    </item>
    <item>
      <title>justBoard6 member</title>
      <link>https://001cloudid.tistory.com/entry/justBoard6-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%9E%91%EC%97%85</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Controller &amp;rarr; Service &amp;rarr; DAO &amp;rarr; Mapper&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;DTO&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MemberDTO&lt;/p&gt;
&lt;pre id=&quot;code_1727225901054&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.domain;

import java.sql.Timestamp;

public class MemberDTO {
	
	private String id;
	private String pw;
	private String name;
	private Timestamp date;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public Timestamp getDate() {
		return date;
	}
	public void setDate(Timestamp date) {
		this.date = date;
	}
	
}&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;참조자료형 java.sql.Timestamp는 A thin wrapper around java.util.Date that allowsthe JDBC API to identify this as an SQL TIMESTAMP value.It adds the abilityto hold the SQL TIMESTAMP fractional seconds value, by allowingthe specification of fractional seconds to a precision of nanoseconds.A Timestamp also provides formatting andparsing operations to support the JDBC escape syntax for timestamp values.라고 설명되어 있음. SQL의 timestamp 타입에 대응하기 위해 만들어진 클래스이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;내가 프로젝트를 진행하면서 가장 애를 먹었던 것 중 하나가 Timestamp형을 String형으로 서로 변환하는 과정이었다. 이와 관련되어 볼만한 자료는 &lt;a href=&quot;https://www.devkuma.com/docs/java/timestamp/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.devkuma.com/docs/java/timestamp/&lt;/a&gt;이다. 이곳에 깔끔하게 정리가 잘 되어있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727226869832&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.controller;

import javax.inject.Inject;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import com.mystory001.domain.MemberDTO;
import com.mystory001.service.MemberService;

@Controller
public class MemberController {
	
	//public @interface Controller {
		/**
		 * The value may indicate a suggestion for a logical component name,
		 * to be turned into a Spring bean in case of an autodetected component.
		 * @return the suggested component name, if any
		 */
		//String value() default &quot;&quot;;
	//}
	
	@Inject
	private MemberService memberService;
	
	/* 회원가입 */
	@GetMapping
	public String join() {
		System.out.println(&quot;MemberController join()&quot;);
		return &quot;member/join&quot;; //주소 변경 없이 이동하는 방식(forward)
	}
	
	/* 회원가입처리 */
	@PostMapping
	public String joinPro(MemberDTO memberDTO) {
		System.out.println(&quot;Membe rController joinPro()&quot;);
		memberService.joinPro(memberDTO); //join.jsp에서 입력한 데이터 &amp;rarr; request &amp;rarr; memberDTO 변수에 전달 &amp;rarr; DB 작업 
		return &quot;redirect:/main&quot;; //main으로 주소 변경하면서 이동
	}
	
	
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727226878412&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.service;

import java.sql.Timestamp;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.mystory001.dao.MemberDAO;
import com.mystory001.domain.MemberDTO;

@Service
public class MemberService {

	@Inject
	private MemberDAO memberDAO;
	
	public void joinPro(MemberDTO memberDTO) {
		System.out.println(&quot;MemberService joinPro()&quot;);
		memberDTO.setDate(new Timestamp(System.currentTimeMillis())); //가입 날짜 설정
		memberDAO.joinPro(memberDTO);
	}
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727226884404&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.dao;

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;

import com.mystory001.domain.MemberDTO;

public class MemberDAO {
	
	@Inject
	private SqlSession sqlSession;
	
	private static final String namespace = &quot;com.mystory001.mappers.memberMapper&quot;;

	public void joinPro(MemberDTO memberDTO) {
		System.out.println(&quot;MemberDAO joinPro()&quot;);
		sqlSession.insert(namespace+&quot;.joinPro&quot;,memberDTO);
	}
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727226890772&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&amp;gt;
&amp;lt;!DOCTYPE mapper
  PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
  &quot;https://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;com.mystory001.mappers.memberMapper&quot;&amp;gt;

	&amp;lt;insert id=&quot;joinPro&quot;&amp;gt;
		insert into member(id, pw, name, time)
		values(#{id}, #{pw}, #{name}, #{time})
	&amp;lt;/insert&amp;gt;


&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&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;1614&quot; data-origin-height=&quot;986&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvOPht/btsJKaFfZTJ/drT6dZwB4jnzfeuBtGBWd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvOPht/btsJKaFfZTJ/drT6dZwB4jnzfeuBtGBWd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvOPht/btsJKaFfZTJ/drT6dZwB4jnzfeuBtGBWd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvOPht%2FbtsJKaFfZTJ%2FdrT6dZwB4jnzfeuBtGBWd0%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;1614&quot; height=&quot;986&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;986&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 봤을 때 어노테이션이 빠진 것 같아 보이는데 memberDAO에 어노테이션이 빠져있었다.&lt;/p&gt;
&lt;pre id=&quot;code_1727227031185&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.dao;

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

import com.mystory001.domain.MemberDTO;

@Repository
public class MemberDAO {
	
	@Inject
	private SqlSession sqlSession;
	
	private static final String namespace = &quot;com.mystory001.mappers.memberMapper&quot;;

	public void joinPro(MemberDTO memberDTO) {
		System.out.println(&quot;MemberDAO joinPro()&quot;);
		sqlSession.insert(namespace+&quot;.joinPro&quot;,memberDTO);
	}
	
}&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@Controller : Controller에 작성. 웹 요청과 응답을 처리&lt;/li&gt;
&lt;li&gt;@Service : Service에 작성. 내부에서 자바 로직을 처리&lt;/li&gt;
&lt;li&gt;@Repository : DAO에 작성. DB나 파일 같은 외부 Input/Output 작업을 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB처리를 할 DAO 클래스에 @Repository 어노테이션을 붙여줘야 함. 그렇게 되면 DAO 클래스는 루트 컨테이너에 빈 객체로 생성됨. 루트 컨테이너의 객체는 어디서든 공유가 가능하기 때문에 자동 의존성 주입 어노테이션을 이용해 객체를 받아올 수 있다. (참고 : &lt;a href=&quot;https://codevang.tistory.com/258&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://codevang.tistory.com/258&lt;/a&gt;)&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;1239&quot; data-origin-height=&quot;813&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V828K/btsJLvOIsNc/mbYjB2o4bLkTnfkKKnDKkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V828K/btsJLvOIsNc/mbYjB2o4bLkTnfkKKnDKkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V828K/btsJLvOIsNc/mbYjB2o4bLkTnfkKKnDKkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV828K%2FbtsJLvOIsNc%2FmbYjB2o4bLkTnfkKKnDKkK%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;1239&quot; height=&quot;813&quot; data-origin-width=&quot;1239&quot; data-origin-height=&quot;813&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DAO에 어노테이션을 붙이면 오류가 없어지고 페이지가 뜬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원가입을 진행해보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;793&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m18KC/btsJLdAJv6m/rS3T1vz533hqDrWwEGgeq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m18KC/btsJLdAJv6m/rS3T1vz533hqDrWwEGgeq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m18KC/btsJLdAJv6m/rS3T1vz533hqDrWwEGgeq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm18KC%2FbtsJLdAJv6m%2FrS3T1vz533hqDrWwEGgeq1%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;1230&quot; height=&quot;793&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;793&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;1920&quot; data-origin-height=&quot;637&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sJ6oz/btsJKFdGUGT/CTNN73baLaHjSkm3DfN3I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sJ6oz/btsJKFdGUGT/CTNN73baLaHjSkm3DfN3I0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sJ6oz/btsJKFdGUGT/CTNN73baLaHjSkm3DfN3I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsJ6oz%2FbtsJKFdGUGT%2FCTNN73baLaHjSkm3DfN3I0%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;1920&quot; height=&quot;637&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;637&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;뭔가 오류를 보니 DTO에서 time의 자료형을 Timestamp로 했는데 일치하지 않는다인 것 같음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB는 time 컬럼의 데이터타입을 datetime으로 했어서 문제가 생긴 것 같음. datetime을 timestamp로 바꿨을 때도 에러가 날까? 시도해 보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xVTi3/btsJK7U2fqL/ZxRLuAgSGkXulwunX1AC3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xVTi3/btsJK7U2fqL/ZxRLuAgSGkXulwunX1AC3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xVTi3/btsJK7U2fqL/ZxRLuAgSGkXulwunX1AC3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxVTi3%2FbtsJK7U2fqL%2FZxRLuAgSGkXulwunX1AC3k%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;564&quot; height=&quot;277&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;277&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;490&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B0A9W/btsJKGjok4g/7oZkoDJ5DgKdxNaZjv2t80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B0A9W/btsJKGjok4g/7oZkoDJ5DgKdxNaZjv2t80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B0A9W/btsJKGjok4g/7oZkoDJ5DgKdxNaZjv2t80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB0A9W%2FbtsJKGjok4g%2F7oZkoDJ5DgKdxNaZjv2t80%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;490&quot; height=&quot;256&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 타입이 변경된 것을 알 수 있음. 프로젝트할 때 timestamp를 사용하지 않고 DTO에 날짜를 사용할 변수에 [ String으로 했을 때 잘 들어간 것이 갑자기 생각난다.&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bezUTm/btsJKMXW9Rc/FnXCHQnck0sK7niGbWkgz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bezUTm/btsJKMXW9Rc/FnXCHQnck0sK7niGbWkgz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bezUTm/btsJKMXW9Rc/FnXCHQnck0sK7niGbWkgz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbezUTm%2FbtsJKMXW9Rc%2FFnXCHQnck0sK7niGbWkgz0%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;1920&quot; height=&quot;585&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;585&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HKdYG/btsJK8sPSor/YTNGymzY9dwqwkx4DKYUH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HKdYG/btsJK8sPSor/YTNGymzY9dwqwkx4DKYUH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HKdYG/btsJK8sPSor/YTNGymzY9dwqwkx4DKYUH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHKdYG%2FbtsJK8sPSor%2FYTNGymzY9dwqwkx4DKYUH1%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;656&quot; height=&quot;97&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DTO에 date로 만들었는데 이러니 찾지 못해서 오류가 난 것 같음. 위에 굳이 데이터타입을 변경할 필요가 없었던 것 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cphC7W/btsJLvOIPyy/eHxPG8oZGtiL9qfoVSwcik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cphC7W/btsJLvOIPyy/eHxPG8oZGtiL9qfoVSwcik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cphC7W/btsJLvOIPyy/eHxPG8oZGtiL9qfoVSwcik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcphC7W%2FbtsJLvOIPyy%2FeHxPG8oZGtiL9qfoVSwcik%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;645&quot; height=&quot;107&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;107&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러면 에러 안 나겠지? 했는데&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1731&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buv7XB/btsJK9ZBdpX/iHAy3QTmkgmkf8HyIH1GB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buv7XB/btsJK9ZBdpX/iHAy3QTmkgmkf8HyIH1GB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buv7XB/btsJK9ZBdpX/iHAy3QTmkgmkf8HyIH1GB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbuv7XB%2FbtsJK9ZBdpX%2FiHAy3QTmkgmkf8HyIH1GB0%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;1731&quot; height=&quot;511&quot; data-origin-width=&quot;1731&quot; data-origin-height=&quot;511&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QWWm8/btsJKwuqnVY/o3vHxSBdTvOfsqghl5n6w1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QWWm8/btsJKwuqnVY/o3vHxSBdTvOfsqghl5n6w1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QWWm8/btsJKwuqnVY/o3vHxSBdTvOfsqghl5n6w1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQWWm8%2FbtsJKwuqnVY%2Fo3vHxSBdTvOfsqghl5n6w1%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;658&quot; height=&quot;97&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB에 member 테이블이 아니라 `member`테이블이고 time 컬럼이 `time`컬럼이라 생긴 문제인 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB에서 조회해 보니&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDTlsM/btsJLcPozti/oioHq1nzUACh54HOdOvE31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDTlsM/btsJLcPozti/oioHq1nzUACh54HOdOvE31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDTlsM/btsJLcPozti/oioHq1nzUACh54HOdOvE31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDTlsM%2FbtsJLcPozti%2FoioHq1nzUACh54HOdOvE31%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;709&quot; height=&quot;312&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 들어가긴 했다. 회원가입을 완료하면 주소만 main으로 바뀌고 화면은 회원가입 화면이다. 이를 수정해 보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MemberController 일부만 수정&lt;/p&gt;
&lt;pre id=&quot;code_1727228502341&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	/* 회원가입처리 */
	@PostMapping
	public String joinPro(MemberDTO memberDTO) {
		System.out.println(&quot;Membe rController joinPro()&quot;);
		memberService.joinPro(memberDTO); //join.jsp에서 입력한 데이터 &amp;rarr; request &amp;rarr; memberDTO 변수에 전달 &amp;rarr; DB 작업 
		return &quot;redirect:/&quot;; //main으로 주소 변경하면서 이동
	}&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;이러면 회원가입에서 정보를 작성하고 회원가입을 눌렀을 때 회원가입이 완료되고 화면이 main으로 바뀐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 join.jsp에서 할 일은 정규표현식을 이용해서 정보의 유효성 검사와 ajax를 이용한 아이디 중복 검사를 먼저 처리해야 할 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jquery.js를 resources폴더에 넣어주고 jsp에서 이를 사용하기 위해 경로 설정(body 태그 위에) 작성하고, 자바스크립트 내용은 닫히는 body 태그 위에 작성. 교육받을 때 가끔씩 자바스크립트가 잘 인식이 안 되는 버그? 같은 게 있다고 해서 가장 아래에 작성해 준다고 들었다.&lt;/p&gt;
&lt;pre id=&quot;code_1727228972675&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
.formstyle{
	width : 400px;
	
}
.label{
	width : 200px;
}
.validation{
	widows: 200px;
	height: 30px;
}
&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;${pageContext.request.contextPath}/resources/jquery-3.7.1.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;회원가입&amp;lt;/h1&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/member/joinPro&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;div class=&quot;formstyle&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; required=&quot;required&quot; placeholder=&quot;아이디&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; required=&quot;required&quot; placeholder=&quot;비밀번호&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 대/소문자, 숫자, 특수문자를 사용 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; required=&quot;required&quot; placeholder=&quot;비밀번호재확인&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 비밀번호를 다시 입력 --%&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; required=&quot;required&quot; placeholder=&quot;이름&quot;&amp;gt; &amp;lt;%-- 한글, 영문만 입력 가능 --%&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;validation&quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;%-- 유효성 검사 시 유효성에 일치않을 때 --%&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;회원가입&quot;&amp;gt; 
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
&amp;lt;%-- 이곳에 자바스크립트 내용 작성 --%&amp;gt;

&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 비밀번호가 틀릴 경우 회원가입이 된다는 것 자체가 문제이므로 비밀번호와 비밀번호 재확인이 같을 때 페이지가 넘어가도록 제어해 보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그전에 DOM 요소에 접근하는 것을 알아보자. 많이 있지만 여기서 사용할 것은 id 선택자로 접근, class값으로 접근하는 방법에 대해서만 알아보자&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;id 선택자로 접근 getElementById()&lt;br /&gt;요소명.getElementById(&quot;id이름&quot;)&lt;br /&gt;id속성은 html 안에서 동일한 id 속성이 존재하면 안 됨&lt;/li&gt;
&lt;li&gt;class 값으로 접근 getElementsByClassName()&lt;br /&gt;요소명. getElementsByClassName((&quot;class이름&quot;)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 외에도 태그나 쿼리셀럭터로 접근하는 방법이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※매번 혼란스러운 것을 잠시 정리하자면 id 해시 기호(#), class 마침표(.)&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;지금은 id로도 해보고 class로도 해보고 무슨 차이가 있는지에 대해서도 찾아보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id 선택자로 접근하였을 때는 되었는데, class 값으로 접근하면 되지 않는 것을 확인했다. 이유는 getElementsByClassName()은 컬렉션 객체를 반환하므로 for문을 사용하거나 특정 인덱스를 반환받아 사용할 수 있다.&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;/p&gt;
&lt;pre id=&quot;code_1727233098207&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
.formstyle{
	width : 400px;
	
}
.label{
	width : 200px;
}
.validation{
	widows: 200px;
	height: 30px;
}
&amp;lt;/style&amp;gt;
&amp;lt;script src=&quot;${pageContext.request.contextPath}/resources/js/jquery-3.7.1.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;회원가입&amp;lt;/h1&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/member/joinPro&quot; method=&quot;post&quot; onsubmit=&quot;return passwordPass()&quot;&amp;gt;
&amp;lt;div class=&quot;formstyle&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; class=&quot;id&quot; required=&quot;required&quot; placeholder=&quot;아이디&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; id=&quot;pw&quot; required=&quot;required&quot; placeholder=&quot;비밀번호&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 대/소문자, 숫자, 특수문자를 사용 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; id=&quot;pw2&quot; required=&quot;required&quot; placeholder=&quot;비밀번호재확인&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 비밀번호를 다시 입력 --%&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; required=&quot;required&quot; placeholder=&quot;이름&quot;&amp;gt; &amp;lt;%-- 한글, 영문만 입력 가능 --%&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;validation&quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;%-- 유효성 검사 시 유효성에 일치않을 때 --%&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;회원가입&quot;&amp;gt; 
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
&amp;lt;%-- 비밀번호와 비밀번호 재확인 --%&amp;gt;
function passwordPass(){
	var pw = document.getElementById(&quot;pw&quot;);
	var pw2 = document.getElementById(&quot;pw2&quot;);
	
	if(pw &amp;amp;&amp;amp; pw2){
		var password = pw.value;
		var confirmPassword = pw2.value;
		
		if(password !== confirmPassword){
			alert(&quot;비밀번호가 일치하지 않습니다.&quot;);
			return false; //페이지 넘어가는 것을 막음
		}
		return true;
	}  else{
		console.error(&quot;에러&quot;);
		return false;
	}
}

&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;/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;table style=&quot;border-collapse: collapse; width: 100%; height: 77px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.1628%; height: 20px;&quot;&gt;a-zA-Z&lt;/td&gt;
&lt;td style=&quot;width: 83.8372%; height: 20px;&quot;&gt;영 대소문자(-으로 범위 지정 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.1628%; height: 20px;&quot;&gt;ㄱ-ㅎㅎ가-힣&lt;/td&gt;
&lt;td style=&quot;width: 83.8372%; height: 20px;&quot;&gt;한글 문자(-으로 범위 지정 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.1628%; height: 20px;&quot;&gt;0-9&lt;/td&gt;
&lt;td style=&quot;width: 83.8372%; height: 20px;&quot;&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;p data-ke-size=&quot;size16&quot;&gt;더 다양하게 많지만 여기서 사용할 기호는 3가지 밖에 없다.&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;table style=&quot;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;width: 16.0465%;&quot;&gt;[]&lt;/td&gt;
&lt;td style=&quot;width: 83.9535%;&quot;&gt;대괄호 안 문자들 중 하나. or 처리 묶음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.0465%;&quot;&gt;[^문자]&lt;/td&gt;
&lt;td style=&quot;width: 83.9535%;&quot;&gt;대괄호 안의 문자를 제외&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.0465%;&quot;&gt;^문자열&lt;/td&gt;
&lt;td style=&quot;width: 83.9535%;&quot;&gt;특정 문자열로 시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.0465%;&quot;&gt;문자열$&lt;/td&gt;
&lt;td style=&quot;width: 83.9535%;&quot;&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정규식 개수 반복 패턴&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;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;width: 16.0466%;&quot;&gt;?&lt;/td&gt;
&lt;td style=&quot;width: 83.9534%;&quot;&gt;없거나 최대 한 개&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.0466%;&quot;&gt;*&lt;/td&gt;
&lt;td style=&quot;width: 83.9534%;&quot;&gt;없거나 여러 개 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.0466%;&quot;&gt;+&lt;/td&gt;
&lt;td style=&quot;width: 83.9534%;&quot;&gt;최소 한 개 또는 최소 여러 개&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.0466%;&quot;&gt;*?&lt;/td&gt;
&lt;td style=&quot;width: 83.9534%;&quot;&gt;없거거나 있거나 최대 한 개&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.0466%;&quot;&gt;+?&lt;/td&gt;
&lt;td style=&quot;width: 83.9534%;&quot;&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;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-%EC%A0%95%EA%B7%9C%EC%8B%9D-RegExp-%EB%88%84%EA%B5%AC%EB%82%98-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EC%89%BD%EA%B2%8C-%EC%A0%95%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-%EC%A0%95%EA%B7%9C%EC%8B%9D-RegExp-%EB%88%84%EA%B5%AC%EB%82%98-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EC%89%BD%EA%B2%8C-%EC%A0%95%EB%A6%AC&lt;/a&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;pre id=&quot;code_1727235516372&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
.formstyle{
	width : 400px;
	
}
.label{
	width : 200px;
}
.validation{
	widows: 200px;
	height: 30px;
}
&amp;lt;/style&amp;gt;
&amp;lt;script src=&quot;${pageContext.request.contextPath}/resources/js/jquery-3.7.1.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;회원가입&amp;lt;/h1&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/member/joinPro&quot; method=&quot;post&quot; onsubmit=&quot;return passwordPass()&quot; id=&quot;join&quot;&amp;gt;
&amp;lt;div class=&quot;formstyle&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; class=&quot;id&quot; required=&quot;required&quot; placeholder=&quot;아이디&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; id=&quot;pw&quot; required=&quot;required&quot; placeholder=&quot;비밀번호&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 대/소문자, 숫자, 특수문자를 사용 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; id=&quot;pw2&quot; required=&quot;required&quot; placeholder=&quot;비밀번호재확인&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 비밀번호를 다시 입력 --%&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; required=&quot;required&quot; placeholder=&quot;이름&quot;&amp;gt; &amp;lt;%-- 한글, 영문만 입력 가능 --%&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;validation&quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;%-- 유효성 검사 시 유효성에 일치않을 때 --%&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;회원가입&quot;&amp;gt; 
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
&amp;lt;%-- 비밀번호와 비밀번호 재확인 --%&amp;gt;
function passwordPass(){
	var pw = document.getElementById(&quot;pw&quot;);
	var pw2 = document.getElementById(&quot;pw2&quot;);
	
	if(pw &amp;amp;&amp;amp; pw2){
		var password = pw.value;
		var confirmPassword = pw2.value;
		
		if(password !== confirmPassword){
			alert(&quot;비밀번호가 일치하지 않습니다.&quot;);
			return false; //페이지 넘어가는 것을 막음
		}
		return true;
	}  else{
		console.error(&quot;에러&quot;);
		return false;
	}
}

&amp;lt;%-- 정규표현식(RegExp). RegExp() : 정규표현식 표시 함수. RegExp(/정규표현식내용/) --%&amp;gt;
$(function(){
	&amp;lt;%-- 대상.함수 --%&amp;gt;
	$('#join').submit(function(){
		var idRegExp = RegExp(/^[a-z0-9]{2,20}$/); &amp;lt;%-- 영소문자+숫자가 하나 이상 포함되며 2~20자 --%&amp;gt;
		if(!idRegExp.test($('.id').val())){
			alert(&quot;아이디 형식은 영소문자, 숫자로만 가능하며 2~20자까지 가능&quot;);
			$('.id').focus();
			return false;
		}
	})
})

&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같이 코드를 작성했는데 비밀번호와 비밀번호 재확인은 되는데, 정규표현식은 안된다. 어떻게 검색을 해야 내가 원하는 정보를 찾을 수 있을지 고민해 봐도 되지 않아 어쩔 수 없이 gpt를 사용해서 왜 안되는지만 찾아보았다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;이벤트 핸들링의 순서&lt;br /&gt;현재 코드에서 onsubmit 속성으로 비밀번호를 검사를 수행한 후, jQuery의 submit 이벤트 핸들러가 실행됨. 이로 인해 정규표현식 검사가 진행되지 않을 수 있다.&lt;/li&gt;
&lt;li&gt;submit 이벤트 핸들러의 return&lt;br /&gt;jQuery의 submit 핸들러에서 return false;를 사용해도 페이지 전송을 막을 수 있지만, 이를 어떻게 처리하는지에 따라 결과가 다를 수 있다.&lt;/li&gt;
&lt;li&gt;비밀번호 확인 기능과 ID 검증이 별도의 흐름에서 처리됨&lt;br /&gt;비밀번호 확인이 이미 페이지 전송을 차단했을 경우, ID 검증이 실행되지 않을 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 핸들링이 잘못되었는데 자바스크립트의 개념이 부족한 것인지 사실 잘 모르겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각한 해결방법으로는 아이디 정규표현식, 비밀번호와 비밀번호 재확인을 포커스가 이동했을 때 정보에 문제가 있을 때 알림 창이 뜨게 바꾸면 되지 않을까?&lt;/p&gt;
&lt;pre id=&quot;code_1727236302066&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
.formstyle{
	width : 400px;
	
}
.label{
	width : 200px;
}
.validation{
	widows: 200px;
	height: 30px;
}
&amp;lt;/style&amp;gt;
&amp;lt;script src=&quot;${pageContext.request.contextPath}/resources/js/jquery-3.7.1.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;회원가입&amp;lt;/h1&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/member/joinPro&quot; method=&quot;post&quot; id=&quot;join&quot;&amp;gt;
&amp;lt;div class=&quot;formstyle&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; id=&quot;id&quot; required=&quot;required&quot; placeholder=&quot;아이디&quot; onblur=&quot;return regExp()&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; id=&quot;pw&quot; required=&quot;required&quot; placeholder=&quot;비밀번호&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 대/소문자, 숫자, 특수문자를 사용 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; id=&quot;pw2&quot; required=&quot;required&quot; placeholder=&quot;비밀번호재확인&quot; onblur=&quot;return passwordPass()&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 비밀번호를 다시 입력 --%&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; required=&quot;required&quot; placeholder=&quot;이름&quot;&amp;gt; &amp;lt;%-- 한글, 영문만 입력 가능 --%&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;validation&quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;%-- 유효성 검사 시 유효성에 일치않을 때 --%&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;회원가입&quot;&amp;gt; 
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
&amp;lt;%-- 비밀번호와 비밀번호 재확인 --%&amp;gt;
function passwordPass(){
	var pw = document.getElementById(&quot;pw&quot;);
	var pw2 = document.getElementById(&quot;pw2&quot;);
	
	if(pw &amp;amp;&amp;amp; pw2){
		var password = pw.value;
		var confirmPassword = pw2.value;
		
		if(password !== confirmPassword){
			alert(&quot;비밀번호가 일치하지 않습니다.&quot;);
			return false; //페이지 넘어가는 것을 막음
		}
		return true;
	}  else{
		console.error(&quot;에러&quot;);
		return false;
	}
}

&amp;lt;%-- 정규표현식(RegExp). RegExp() : 정규표현식 표시 함수. RegExp(/정규표현식내용/) --%&amp;gt;
function regExp(){
		var id = document.getElementById(&quot;id&quot;);
		var idRegExp = RegExp(/^[a-z0-9]{2,20}$/); &amp;lt;%-- 영소문자+숫자가 하나 이상 포함되며 2~20자 --%&amp;gt;
// 		if(!idRegExp.test($('.id').val())){
// 			alert(&quot;아이디 형식은 영소문자, 숫자로만 가능하며 2~20자까지 가능&quot;);
// 			$('.id').focus();
// 			return false;
		if(!idRegExp.test(id.value)){
			alert(&quot;아이디 형식은 영소문자, 숫자로만 가능하며 2~20자까지 가능&quot;);
			$('.id').focus();
			return false;
		}
		return true;
}
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;753&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uoIa9/btsJLeT6XqA/2BVYcewRaijkHz5ssEadC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uoIa9/btsJLeT6XqA/2BVYcewRaijkHz5ssEadC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uoIa9/btsJLeT6XqA/2BVYcewRaijkHz5ssEadC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuoIa9%2FbtsJLeT6XqA%2F2BVYcewRaijkHz5ssEadC1%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;753&quot; height=&quot;348&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정규표현식을 사용하라고는 되어있어서 아 되는구나 싶어서 회원가입을 알림 창을 무시하고 해 봤음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/om84p/btsJLAvNXk9/IkeSaACirPELZvkd5ocmzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/om84p/btsJLAvNXk9/IkeSaACirPELZvkd5ocmzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/om84p/btsJLAvNXk9/IkeSaACirPELZvkd5ocmzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fom84p%2FbtsJLAvNXk9%2FIkeSaACirPELZvkd5ocmzk%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;715&quot; height=&quot;284&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;... 뭐지? 뭐가 문제일까... 아무리 고민하고 해 봐도 답이 나오지 않았다. 처음 다짐했을 때는 gpt를 절대 사용하지 않도록 생각했는데 검색 기술이 형편없어서인지 아무리 찾아봐도 답이 나오지 않음... 그래서 해결 방법에 대해 검색해 보았다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;폼 제출 이벤트 가로채기&lt;br /&gt;onsubmit 이벤트를 사용하여 폼이 제출되기 전에 모든 검증을 수행한다.&lt;/li&gt;
&lt;li&gt;각 검증 함수의 결과를 확인&lt;br /&gt;모든 검증이 통과해야만 폼이 제출되도록 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 onsubmit 이벤트를 form 태그에 넣어주고, 유효성검사를 하게 해야 한다라는 것 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1727237525524&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function formCheck(){
    var validId = regExp();
    var validPw = passwordPass();

    if(validId &amp;amp;&amp;amp; validPw) {
        return true; // 모든 검증 통과, 폼 제출
    } else {
        alert(&quot;형식에 맞게 작성해주세요&quot;);
        return false; // 검증 실패, 폼 제출 중지
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넣어주어도 계속 알림 창만 뜰뿐 가입은 가능했다. 그래서 전반적으로 조금씩 바꿔서 원하는 결과를 만들어 낸 것 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1727237562530&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
.formstyle{
	width : 400px;
	
}
.label{
	width : 200px;
}
.validation{
	widows: 200px;
	height: 30px;
}
&amp;lt;/style&amp;gt;
&amp;lt;script src=&quot;${pageContext.request.contextPath}/resources/js/jquery-3.7.1.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;회원가입&amp;lt;/h1&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/member/joinPro&quot; method=&quot;post&quot; id=&quot;join&quot; onsubmit=&quot;return formCheck()&quot;&amp;gt;
&amp;lt;div class=&quot;formstyle&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; id=&quot;id&quot; required=&quot;required&quot; placeholder=&quot;아이디&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; id=&quot;pw&quot; required=&quot;required&quot; placeholder=&quot;비밀번호&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 대/소문자, 숫자, 특수문자를 사용 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; id=&quot;pw2&quot; required=&quot;required&quot; placeholder=&quot;비밀번호재확인&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 비밀번호를 다시 입력 --%&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; required=&quot;required&quot; placeholder=&quot;이름&quot;&amp;gt; &amp;lt;%-- 한글, 영문만 입력 가능 --%&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;validation&quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;%-- 유효성 검사 시 유효성에 일치않을 때 --%&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;회원가입&quot;&amp;gt; 
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
&amp;lt;%-- 비밀번호와 비밀번호 재확인 --%&amp;gt;
function passwordPass() {
    var pw = document.getElementById(&quot;pw&quot;);
    var pw2 = document.getElementById(&quot;pw2&quot;);

    if (pw &amp;amp;&amp;amp; pw2) {
        var password = pw.value;
        var confirmPassword = pw2.value;

        if (password !== confirmPassword) {
            alert(&quot;비밀번호가 일치하지 않습니다.&quot;);
            pw2.focus(); // 비밀번호 재확인 필드에 포커스
            return false; // 검증 실패
        }
    }
    return true; // 검증 성공
}

&amp;lt;%-- 정규표현식(RegExp). RegExp() : 정규표현식 표시 함수. RegExp(/정규표현식내용/) --%&amp;gt;
function regExp() {
    var id = document.getElementById(&quot;id&quot;);
    var idRegExp = /^[a-z0-9]{2,20}$/; // 영소문자 + 숫자가 하나 이상 포함되며 2~20자

    if (!idRegExp.test(id.value)) {
        alert(&quot;아이디 형식은 영소문자, 숫자로만 가능하며 2~20자까지 가능&quot;);
        id.focus(); // 아이디 필드에 포커스
        return false; // 검증 실패
    }
    return true; // 검증 성공
}

function formCheck(){
    var validId = regExp();
    var validPw = passwordPass();

    if(validId &amp;amp;&amp;amp; validPw) {
        return true; // 모든 검증 통과, 폼 제출
    } else {
        alert(&quot;형식에 맞게 작성해주세요&quot;);
        return false; // 검증 실패, 폼 제출 중지
    }
}
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이디와 비밀번호가 일치하면 로그인이 되고, 그렇지 않으면 경고창&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 아이디, 비밀번호가 일치하지 않았을 때 msg창&lt;/p&gt;
&lt;pre id=&quot;code_1727241341628&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
	alert(&quot;존재하지 않는 아이디이거나 비밀번호가 틀렸습니다.&quot;);
	history.back(); //뒤로 이동
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 처리 과정을 살펴보면&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;사용자에게 로그인 정보(아이디, 비밀번호)를 입력받는다.&lt;/li&gt;
&lt;li&gt;입력받은 정보를 DB에서 찾는다.&lt;/li&gt;
&lt;li&gt;1) 가입된 정보가 있으면 로그인이 된다.&lt;br /&gt;2) 가입된 정보가 없으면 로그인이 안된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 입력받은 정보를 조회하기 위해서는 return 값이 존재해야 함&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;MemberController&lt;/p&gt;
&lt;pre id=&quot;code_1727242054214&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	/* 로그인 &amp;rarr; 회원 확인 */
	@PostMapping
	public String loginPro(MemberDTO memberDTO, HttpSession session) {
		System.out.println(&quot;MemberController loginPro()&quot;);
		MemberDTO memberDTO2 = memberService.userCheck(memberDTO); //폼에서 입력받은 데이터가 존재하는지 확인
		
		if(memberDTO2 != null) {
			session.setAttribute(&quot;id&quot;, memberDTO2.getId());
			return &quot;redirect:/&quot;;
		} else {
			return &quot;member/loginmsg&quot;;
		}
	}&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;MemberService&lt;/p&gt;
&lt;pre id=&quot;code_1727242076517&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public MemberDTO userCheck(MemberDTO memberDTO) {
		System.out.println(&quot;MemberService userCheck()&quot;);
		return memberDAO.userCheck(memberDTO);
	}&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;MemberDAO&lt;/p&gt;
&lt;pre id=&quot;code_1727242085961&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public MemberDTO userCheck(MemberDTO memberDTO) {
		System.out.println(&quot;MemberDAO userCheck()&quot;);
		return sqlSession.selectOne(namespace+&quot;.userCheck&quot;, memberDTO);
	}&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;memberMapper&lt;/p&gt;
&lt;pre id=&quot;code_1727242100885&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;userCheck&quot;&amp;gt;
		select *
		from `member`
		where id=#{id} and pw=#{pw}
	&amp;lt;/select&amp;gt;&lt;/code&gt;&lt;/pre&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;1007&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lv4tS/btsJLToTav5/iOPKJSKKVed9KJ8JiRmSI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lv4tS/btsJLToTav5/iOPKJSKKVed9KJ8JiRmSI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lv4tS/btsJLToTav5/iOPKJSKKVed9KJ8JiRmSI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flv4tS%2FbtsJLToTav5%2FiOPKJSKKVed9KJ8JiRmSI1%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;1007&quot; height=&quot;780&quot; data-origin-width=&quot;1007&quot; data-origin-height=&quot;780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류 발생 &amp;rarr; java.lang.IllegalStateException: Ambiguous mapping&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; Controller에서 RequestMapping이 충돌하는 경우 에러가 발생. 동일한 value값이 지정되어 있어 핸들러 매핑이 불가능함.&lt;/p&gt;
&lt;pre id=&quot;code_1727242322683&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.controller;

import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import com.mystory001.domain.MemberDTO;
import com.mystory001.service.MemberService;

@Controller
public class MemberController {
	
	//public @interface Controller {
		/**
		 * The value may indicate a suggestion for a logical component name,
		 * to be turned into a Spring bean in case of an autodetected component.
		 * @return the suggested component name, if any
		 */
		//String value() default &quot;&quot;;
	//}
	
	@Inject
	private MemberService memberService;
	
	/* 회원가입 */
	@GetMapping
	public String join() {
		System.out.println(&quot;MemberController join()&quot;);
		return &quot;member/join&quot;; //주소 변경 없이 이동하는 방식(forward)
	}
	
	/* 회원가입처리 */
	@PostMapping
	public String joinPro(MemberDTO memberDTO) {
		System.out.println(&quot;MemberController joinPro()&quot;);
		memberService.joinPro(memberDTO); //join.jsp에서 입력한 데이터 &amp;rarr; request &amp;rarr; memberDTO 변수에 전달 &amp;rarr; DB 작업 
		return &quot;redirect:/&quot;; //main으로 주소 변경하면서 이동
	}
	
	/* 로그인 &amp;rarr; 회원 확인 */
	@PostMapping
	public String loginPro(MemberDTO memberDTO, HttpSession session) {
		System.out.println(&quot;MemberController loginPro()&quot;);
		MemberDTO memberDTO2 = memberService.userCheck(memberDTO); //폼에서 입력받은 데이터가 존재하는지 확인
		
		if(memberDTO2 != null) {
			session.setAttribute(&quot;id&quot;, memberDTO2.getId());
			return &quot;redirect:/&quot;;
		} else {
			return &quot;member/loginmsg&quot;;
		}
	}
	
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;? 단순히 메소드이름만 문제였던 것은 아니었다. 경로가 명시되지 않아 발생된 오류였다. 각 메소드에 대한 명확한 URL 경로를 지정해줘야 했었던 것 추가적으로 RequestMapping 어노테이션도 빠져있었다.&lt;/p&gt;
&lt;pre id=&quot;code_1727242681222&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mystory001.controller;

import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.mystory001.domain.MemberDTO;
import com.mystory001.service.MemberService;

@Controller
@RequestMapping(&quot;/member/*&quot;)
public class MemberController {
	
	//public @interface Controller {
		/**
		 * The value may indicate a suggestion for a logical component name,
		 * to be turned into a Spring bean in case of an autodetected component.
		 * @return the suggested component name, if any
		 */
		//String value() default &quot;&quot;;
	//}
	
	@Inject
	private MemberService memberService;
	
	/* 회원가입 */
	@GetMapping(&quot;/join&quot;)
	public String join() {
		System.out.println(&quot;MemberController join()&quot;);
		return &quot;member/join&quot;; //주소 변경 없이 이동하는 방식(forward)
	}
	
	/* 회원가입처리 */
	@PostMapping(&quot;/joinPro&quot;)
	public String joinPro(MemberDTO memberDTO) {
		System.out.println(&quot;MemberController joinPro()&quot;);
		memberService.joinPro(memberDTO); //join.jsp에서 입력한 데이터 &amp;rarr; request &amp;rarr; memberDTO 변수에 전달 &amp;rarr; DB 작업 
		return &quot;redirect:/&quot;; //main으로 주소 변경하면서 이동
	}
	
	/* 로그인 &amp;rarr; 회원 확인 */
	@PostMapping(&quot;/loginPro&quot;)
	public String loginPro(MemberDTO memberDTO, HttpSession session) {
		System.out.println(&quot;MemberController loginPro()&quot;);
		MemberDTO memberDTO2 = memberService.userCheck(memberDTO); //폼에서 입력받은 데이터가 존재하는지 확인
		
		if(memberDTO2 != null) {
			session.setAttribute(&quot;id&quot;, memberDTO2.getId());
			return &quot;redirect:/&quot;;
		} else {
			return &quot;member/loginmsg&quot;;
		}
	}
	
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 수정해 주니 오류는 없어졌고 로그인을 해보니 또 다른 오류에 직면했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xUFk2/btsJLetB5oE/lLPE7c9b8HMYkVtOhkctZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xUFk2/btsJLetB5oE/lLPE7c9b8HMYkVtOhkctZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xUFk2/btsJLetB5oE/lLPE7c9b8HMYkVtOhkctZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxUFk2%2FbtsJLetB5oE%2FlLPE7c9b8HMYkVtOhkctZk%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;890&quot; height=&quot;405&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select문 같은 경우 resultType을 작성해줬어야 했는데 누락되어 생긴 오류인 것으로 보인다. memberMapper에서 resultType을 작성해 주면 해결될 문제&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;memberMapper&lt;/p&gt;
&lt;pre id=&quot;code_1727242871951&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;userCheck&quot; resultType=&quot;com.mystory001.domain.MemberDTO&quot;&amp;gt;
		select *
		from `member`
		where id=#{id} and pw=#{pw}
	&amp;lt;/select&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;작성해 주니 되긴 되는데, 로그인이 되는 건 아니다. top.jsp에서 taglib를 이용해서 세션을 유지시키도록해보자&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;top.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1727243514711&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;    
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.header{
	float : right;
	width: 1200px;
	height: 0px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;header&quot;&amp;gt; &amp;lt;%-- header 영역 div --%&amp;gt;
&amp;lt;form method=&quot;post&quot; action=&quot;${pageContext.request.contextPath}/loginPro&quot;&amp;gt;  &amp;lt;%-- post방식 --%&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;
&amp;lt;c:if test=&quot;${empty sessionScope.id }&quot;&amp;gt;
아이디 : &amp;lt;input type=&quot;text&quot; name=&quot;id&quot;&amp;gt;
비밀번호 : &amp;lt;input type=&quot;password&quot; name=&quot;pw&quot;&amp;gt;
&amp;lt;button type=&quot;submit&quot;&amp;gt;로그인 &amp;lt;/button&amp;gt;&amp;lt;a href=&quot;${pageContext.request.contextPath}/member/join&quot;&amp;gt;&amp;lt;button type=&quot;button&quot;&amp;gt;회원가입&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;c:if test=&quot;${! empty sessionScope.id }&quot;&amp;gt;
${sessionScope.id } 님 반갑습니다. | &amp;lt;a href=&quot;${pageContext.request.contextPath }/member/check&quot;&amp;gt;내 정보&amp;lt;/a&amp;gt; | &amp;lt;a href=&quot;${pageContext.request.contextPath }/logout&quot;&amp;gt;로그아웃&amp;lt;/a&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;%-- header 영역 div --%&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;hr&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;check.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1727243527482&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;정보 확인&amp;lt;/h1&amp;gt;
&amp;lt;form method=&quot;post&quot; action=&quot;${pageContext.request.contextPath }/member/mypage&quot;&amp;gt;
${sessionScope.id } 님 비밀번호를 입력해주세요.&amp;lt;br&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot;&amp;gt; &amp;lt;input type=&quot;submit&quot; value=&quot;확인&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;mypage.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1727243537579&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;내 정보&amp;lt;/h1&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; required=&quot;required&quot; placeholder=&quot;비밀번호&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 대/소문자, 숫자, 특수문자를 사용 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; required=&quot;required&quot; placeholder=&quot;비밀번호재확인&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 비밀번호를 다시 입력 --%&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; required=&quot;required&quot; placeholder=&quot;이름&quot;&amp;gt; &amp;lt;%-- 한글, 영문만 입력 가능 --%&amp;gt;
&amp;lt;button&amp;gt;수정&amp;lt;/button&amp;gt;&amp;lt;button&amp;gt;탈퇴&amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&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;1234&quot; data-origin-height=&quot;799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmnrf9/btsJLeNWfit/NnVMhkM3L5dASKzHaVsLrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmnrf9/btsJLeNWfit/NnVMhkM3L5dASKzHaVsLrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmnrf9/btsJLeNWfit/NnVMhkM3L5dASKzHaVsLrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdmnrf9%2FbtsJLeNWfit%2FNnVMhkM3L5dASKzHaVsLrk%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;1234&quot; height=&quot;799&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;799&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;로그아웃 memberController&lt;/p&gt;
&lt;pre id=&quot;code_1727245320681&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	/* 로그아웃 */
	@GetMapping(&quot;/logout&quot;)
	public String logout(HttpSession session) {
		System.out.println(&quot;MemberController logout()&quot;);
		session.invalidate();
		return &quot;redirect:/&quot;;
	}&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;check.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1727245714905&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;정보 확인&amp;lt;/h1&amp;gt;
&amp;lt;form method=&quot;post&quot; action=&quot;${pageContext.request.contextPath }/member/mypage&quot;&amp;gt;
${sessionScope.id } 님 비밀번호를 입력해주세요.&amp;lt;br&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot;&amp;gt; &amp;lt;input type=&quot;submit&quot; value=&quot;확인&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;
&lt;pre id=&quot;code_1727245728768&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;member/check&quot;)
	public String check(HttpSession session) {
		System.out.println(&quot;MemberController check()&quot;);
		
		return &quot;/member/check&quot;;
	}
	
	@PostMapping(&quot;member/mypage&quot;)
	public String mypage(HttpSession session) {
		System.out.println(&quot;MemberController mypage()&quot;);
		return &quot;/member/mypage&quot;;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baPyy4/btsJKRyZ02K/jwujW4bsBLxyZ9CPbIlcj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baPyy4/btsJKRyZ02K/jwujW4bsBLxyZ9CPbIlcj1/img.png&quot; data-origin-width=&quot;1235&quot; data-origin-height=&quot;768&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.3793%; margin-right: 10px;&quot; data-widthpercent=&quot;48.95&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baPyy4/btsJKRyZ02K/jwujW4bsBLxyZ9CPbIlcj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaPyy4%2FbtsJKRyZ02K%2FjwujW4bsBLxyZ9CPbIlcj1%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;1235&quot; height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dN80aG/btsJK8tIKto/grNd2KR6YlmeO6FNJRQnvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dN80aG/btsJK8tIKto/grNd2KR6YlmeO6FNJRQnvK/img.png&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;762&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.4579%;&quot; data-widthpercent=&quot;51.05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dN80aG/btsJK8tIKto/grNd2KR6YlmeO6FNJRQnvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdN80aG%2FbtsJK8tIKto%2FgrNd2KR6YlmeO6FNJRQnvK%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;1278&quot; height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;Controller&lt;/p&gt;
&lt;pre id=&quot;code_1727248029640&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@GetMapping(&quot;member/check&quot;)
	public String check(HttpSession session) {
		System.out.println(&quot;MemberController check()&quot;);
		return &quot;/member/check&quot;;
	}
	
	@PostMapping(&quot;member/checkPro&quot;)
	public String checkPro(HttpSession session) {
		System.out.println(&quot;MemberController checkPro()&quot;);
		String id = (String)session.getAttribute(&quot;id&quot;);
		String inputPw = (String)session.getAttribute(&quot;pw&quot;);
		String pw = memberService.pwCheck(id);
		
		if(pw!=null &amp;amp;&amp;amp; pw.equals(inputPw)) {
			return &quot;/member/mypage&quot;;
		} else {
			return &quot;/member/checkmsg&quot;;
		}
	}&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;Service&lt;/p&gt;
&lt;pre id=&quot;code_1727248046186&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public String pwCheck(String id) {
		System.out.println(&quot;MemberService userPw()&quot;);
		return memberDAO.pwCheck(id);
	}&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;DAO&lt;/p&gt;
&lt;pre id=&quot;code_1727248057787&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public String pwCheck(String id) {
		System.out.println(&quot;MemberDAO pwCheck()&quot;);
		return sqlSession.selectOne(namespace+&quot;.pwCheck&quot;, id);
	}&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;Mapper&lt;/p&gt;
&lt;pre id=&quot;code_1727248070048&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;select id=&quot;pwCheck&quot; resultType=&quot;String&quot;&amp;gt;
		select pw
		from `member`
		where id=#{id}
	&amp;lt;/select&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;checkmsg만 뜰뿐..이었다&lt;/p&gt;
&lt;pre id=&quot;code_1727248915944&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		String inputPw = (String)session.getAttribute(&quot;pw&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현 페이지에서 입력받은 pw이라고 생각하고 했는데, 세션에 저장된 비밀번호를 뜻함. 따라서 원하는 동작이 아님...&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;@RequestParam을 사용함. HTTP 요청 파라미터를 메소드 매개변수로 매핑할 때 사용하는 어노테이션. 사용자가 입력한 데이터를 서버 측에 쉽게 받아올 수 있도록 해줌.&lt;/p&gt;
&lt;pre id=&quot;code_1727249085684&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;member/checkPro&quot;)
	public String checkPro(@RequestParam(&quot;pw&quot;) String inputPw, HttpSession session) {
		System.out.println(&quot;MemberController checkPro()&quot;);
		String id = (String)session.getAttribute(&quot;id&quot;);
		String pw = memberService.pwCheck(id);
		
		if(pw!=null &amp;amp;&amp;amp; pw.equals(inputPw)) {
			return &quot;/member/mypage&quot;;
		} else {
			return &quot;/member/checkmsg&quot;;
		}
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/285</guid>
      <comments>https://001cloudid.tistory.com/entry/justBoard6-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%9E%91%EC%97%85#entry285comment</comments>
      <pubDate>Wed, 25 Sep 2024 12:01:22 +0900</pubDate>
    </item>
    <item>
      <title>justBoard5 화면(view)2</title>
      <link>https://001cloudid.tistory.com/entry/justBoard5-%ED%99%94%EB%A9%B4view2</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;화면 구성을 대략적으로 만들어 봤음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWSxXE/btsJJwHIkyy/wSP7Ao8DbFSzhWjN6ml5SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWSxXE/btsJJwHIkyy/wSP7Ao8DbFSzhWjN6ml5SK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWSxXE/btsJJwHIkyy/wSP7Ao8DbFSzhWjN6ml5SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWSxXE%2FbtsJJwHIkyy%2FwSP7Ao8DbFSzhWjN6ml5SK%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;1440&quot; height=&quot;472&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;472&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;1440&quot; data-origin-height=&quot;902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzQcXr/btsJIijjATE/KSOXXQkUnjKrhGLXypkhoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzQcXr/btsJIijjATE/KSOXXQkUnjKrhGLXypkhoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzQcXr/btsJIijjATE/KSOXXQkUnjKrhGLXypkhoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzQcXr%2FbtsJIijjATE%2FKSOXXQkUnjKrhGLXypkhoK%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;1440&quot; height=&quot;902&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;902&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;화면 구성을 하다보니 중복되는 부분이 있다는 것을 알 수 있음 &amp;rarr; innclude 액션 태그 사용해서 수정에 용이하게 변경&lt;/p&gt;
&lt;pre id=&quot;code_1727148112510&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;%-- 반응형 웹 viewport &amp;rarr; head태그 사이에 작성 --%&amp;gt;
&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}

.header{
	float : right;
	width: 1200px;
	height: 0px;
}

.sidebar{
	float : left;
	width: 200px;
	height: 500px;

}

.content{
	width: 1000px;
	height: 600px;
}

.footer{
	float : right;
	width: 1200px;
	height: 0px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;div class=&quot;header&quot;&amp;gt; &amp;lt;%-- header 영역 div --%&amp;gt;
&amp;lt;form method=&quot;post&quot; action=&quot;${pageContext.request.contextPath}/loginPro&quot;&amp;gt;  &amp;lt;%-- post방식 --%&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;
아이디 : &amp;lt;input type=&quot;text&quot; name=&quot;id&quot;&amp;gt;
비밀번호 : &amp;lt;input type=&quot;password&quot; name=&quot;pw&quot;&amp;gt;
&amp;lt;button type=&quot;submit&quot;&amp;gt;로그인 &amp;lt;/button&amp;gt;&amp;lt;a href=&quot;${pageContext.request.contextPath}/member/join&quot;&amp;gt;&amp;lt;button type=&quot;button&quot;&amp;gt;회원가입&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;%-- header 영역 div --%&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;hr&amp;gt;

&amp;lt;div class=&quot;sidebar&quot;&amp;gt; &amp;lt;%-- sidebar 영역 div --%&amp;gt;
&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;게시판&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; 
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;내 정보&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- sidebar 영역 div --%&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
 내용은 여기에
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;hr&amp;gt;
&amp;lt;div class=&quot;footer&quot;&amp;gt; &amp;lt;%-- footer 영역 div --%&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;시작 날짜 : 2024.09.19 / 끝낸 날짜 : 2024.?.? / 만든이 : 001cloudid&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- footer 영역 div --%&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;주석을 작성해놔서 어렵지 않아보임. top sidebar, footer로 각각 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1727148660536&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;%-- 반응형 웹 viewport &amp;rarr; head태그 사이에 작성 --%&amp;gt;
&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}

.header{
	float : right;
	width: 1200px;
	height: 0px;
}

.sidebar{
	float : left;
	width: 200px;
	height: 500px;

}

.content{
	width: 1000px;
	height: 600px;
}

.footer{
	float : right;
	width: 1200px;
	height: 0px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
 내용은 여기에
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&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;292&quot; data-origin-height=&quot;471&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YJknS/btsJKiIurKE/VCcsSMqe9CkeT6whhG99Ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YJknS/btsJKiIurKE/VCcsSMqe9CkeT6whhG99Ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YJknS/btsJKiIurKE/VCcsSMqe9CkeT6whhG99Ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYJknS%2FbtsJKiIurKE%2FVCcsSMqe9CkeT6whhG99Ck%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;292&quot; height=&quot;471&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;471&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;inc/top&lt;/p&gt;
&lt;pre id=&quot;code_1727148708384&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.header{
	float : right;
	width: 1200px;
	height: 0px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;header&quot;&amp;gt; &amp;lt;%-- header 영역 div --%&amp;gt;
&amp;lt;form method=&quot;post&quot; action=&quot;${pageContext.request.contextPath}/loginPro&quot;&amp;gt;  &amp;lt;%-- post방식 --%&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;
아이디 : &amp;lt;input type=&quot;text&quot; name=&quot;id&quot;&amp;gt;
비밀번호 : &amp;lt;input type=&quot;password&quot; name=&quot;pw&quot;&amp;gt;
&amp;lt;button type=&quot;submit&quot;&amp;gt;로그인 &amp;lt;/button&amp;gt;&amp;lt;a href=&quot;${pageContext.request.contextPath}/member/join&quot;&amp;gt;&amp;lt;button type=&quot;button&quot;&amp;gt;회원가입&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;%-- header 영역 div --%&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;hr&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;inc/sidebar&lt;/p&gt;
&lt;pre id=&quot;code_1727148722891&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.sidebar{
	float : left;
	width: 200px;
	height: 500px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;sidebar&quot;&amp;gt; &amp;lt;%-- sidebar 영역 div --%&amp;gt;
&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;게시판&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; 
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;내 정보&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- sidebar 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;inc/footer&lt;/p&gt;
&lt;pre id=&quot;code_1727148734211&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.footer{
	float : right;
	width: 1200px;
	height: 0px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;hr&amp;gt;
&amp;lt;div class=&quot;footer&quot;&amp;gt; &amp;lt;%-- footer 영역 div --%&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;시작 날짜 : 2024.09.19 / 끝낸 날짜 : 2024.?.? / 만든이 : 001cloudid&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- footer 영역 div --%&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&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;main.jsp에서 바로 게시판 게시물 목록을 볼 수 있으면 편하겠다는 생각이 듦.&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;430&quot; data-origin-height=&quot;577&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpn4oN/btsJKw7L0hP/BbbtKIoU43gKjND9j8KIC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpn4oN/btsJKw7L0hP/BbbtKIoU43gKjND9j8KIC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpn4oN/btsJKw7L0hP/BbbtKIoU43gKjND9j8KIC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcpn4oN%2FbtsJKw7L0hP%2FBbbtKIoU43gKjND9j8KIC0%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;430&quot; height=&quot;577&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;577&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면 구성을 이와 같이 할 것이며, 설명 board폴더는 게시판과 관련된 작업 insert 글 쓰기, update 글 수정. member폴더는 회원과 관련된 작업 join 회원가입, mypage 회원 수정(또는 삭제),check 회원 확인&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;member폴더&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;join.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1727155158715&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
.formstyle{
	width : 400px;
	
}
.label{
	width : 200px;
}
.validation{
	widows: 200px;
	height: 30px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;회원가입&amp;lt;/h1&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/member/joinPro&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;div class=&quot;formstyle&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; required=&quot;required&quot; placeholder=&quot;아이디&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; required=&quot;required&quot; placeholder=&quot;비밀번호&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 대/소문자, 숫자, 특수문자를 사용 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; required=&quot;required&quot; placeholder=&quot;비밀번호재확인&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 비밀번호를 다시 입력 --%&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; required=&quot;required&quot; placeholder=&quot;이름&quot;&amp;gt; &amp;lt;%-- 한글, 영문만 입력 가능 --%&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;validation&quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;%-- 유효성 검사 시 유효성에 일치않을 때 --%&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;회원가입&quot;&amp;gt; 
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&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;check.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1727155178245&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;정보 확인&amp;lt;/h1&amp;gt;
&amp;lt;form method=&quot;post&quot; action=&quot;#&quot;&amp;gt;
비밀번호를 입력해주세요.&amp;lt;br&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot;&amp;gt; &amp;lt;input type=&quot;submit&quot; value=&quot;확인&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;mypage.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1727155212389&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;내 정보&amp;lt;/h1&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; readonly=&quot;readonly&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; required=&quot;required&quot; placeholder=&quot;비밀번호&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 대/소문자, 숫자, 특수문자를 사용 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; required=&quot;required&quot; placeholder=&quot;비밀번호재확인&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 비밀번호를 다시 입력 --%&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; required=&quot;required&quot; placeholder=&quot;이름&quot;&amp;gt; &amp;lt;%-- 한글, 영문만 입력 가능 --%&amp;gt;
&amp;lt;button&amp;gt;수정&amp;lt;/button&amp;gt;&amp;lt;button&amp;gt;탈퇴&amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;include 액션 태그를 사용한 것을 보면 어느 것은 /로 시작하고 또 어떤 것은 ../로 시작하는 것을 알 수 있다. 여기서 경로에 대한 정리를 한 번 하고 지나가자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경로는 상대 경로와 절대 경로가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상대 경로는 지금 파일의 위치에서 상대적으로 가르키는 위치이고, 절대 경로는 지금 파일의 위치와 상관없이 프로젝트에서 가리키는 위치이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A8KtF/btsJJwVNluM/X0tHCm9VAddL5hDLLQFKVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A8KtF/btsJJwVNluM/X0tHCm9VAddL5hDLLQFKVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A8KtF/btsJJwVNluM/X0tHCm9VAddL5hDLLQFKVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA8KtF%2FbtsJJwVNluM%2FX0tHCm9VAddL5hDLLQFKVk%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;384&quot; height=&quot;580&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 main에서 inc에 있는 jsp를 include하기 위해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상대경로의 경우 현재 내가 있는 폴더(views)보다 아래의 폴더인 inc안에 있는 파일을 쓰는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;절대경로의 경우 src-main-views-inc-top.jsp(sidebar.jsp, top.jsp)이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 정리를 하면서 당장은 이해가 쉽게 가지만 다시 볼 때 이해하기 어려울 것 같다는 생각이 들어서 검색을 해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sschoi1994.tistory.com/272&quot;&gt;https://sschoi1994.tistory.com/272&lt;/a&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이 곳을 참조하였다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;절대경로 : 프로젝트의 전체 경로&lt;/li&gt;
&lt;li&gt;상대경로 : 현재 위치에서 다른 파일의 경로를 참조 ../로 한 단계 위 폴더로 올라감을 뜻함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;board 폴더&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;insert.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1727156868257&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;게시 글 작성&amp;lt;/h1&amp;gt;
&amp;lt;form&amp;gt;
제목 : &amp;lt;input type=&quot;text&quot; name=&quot;subject&quot;&amp;gt;&amp;lt;br&amp;gt;
내용 : &amp;lt;textarea rows=&quot;10&quot; cols=&quot;100&quot; &amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;작성하기&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;update.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1727156880440&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}
.content{
	width: 1000px;
	height: 600px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/top.jsp&quot; /&amp;gt;

&amp;lt;jsp:include page=&quot;../inc/sidebar.jsp&quot; /&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;h1&amp;gt;게시 글 수정&amp;lt;/h1&amp;gt;
&amp;lt;form&amp;gt;
제목 : &amp;lt;input type=&quot;text&quot; name=&quot;subject&quot;&amp;gt;&amp;lt;br&amp;gt;
내용 : &amp;lt;textarea rows=&quot;10&quot; cols=&quot;100&quot; &amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;수정하기&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;jsp:include page=&quot;../inc/footer.jsp&quot; /&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목표는 이번주 내에 완성하기&lt;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/284</guid>
      <comments>https://001cloudid.tistory.com/entry/justBoard5-%ED%99%94%EB%A9%B4view2#entry284comment</comments>
      <pubDate>Tue, 24 Sep 2024 14:49:20 +0900</pubDate>
    </item>
    <item>
      <title>justBoard4 화면(view)1</title>
      <link>https://001cloudid.tistory.com/entry/justBoard4-%ED%99%94%EB%A9%B4view1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;화면 구성 main에서 회원가입을 클릭하면 Get 방식으로 회원가입 페이지로 이동 &amp;rarr; 아이디, 비밀번호, 비밀번호 재확인, 이름을 입력 받고 회원가입 버튼을 클릭하면 회원가입이 가능하게 하기 회원가입 과정은 Post 방식을 이용&lt;/p&gt;
&lt;pre id=&quot;code_1727070502129&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;회원가입&amp;lt;/h1&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/member/joinPro&quot; method=&quot;post&quot;&amp;gt;
아이디 : &amp;lt;input type=&quot;text&quot; name=&quot;id&quot; required=&quot;required&quot;&amp;gt;&amp;lt;br&amp;gt;
비밀번호 : &amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; required=&quot;required&quot;&amp;gt;&amp;lt;br&amp;gt;
비밀번호 재확인 : &amp;lt;input type=&quot;password&quot; name=&quot;pwre&quot; required=&quot;required&quot;&amp;gt;&amp;lt;br&amp;gt;
이름 : &amp;lt;input type=&quot;text&quot; name=&quot;name&quot; required=&quot;required&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;회원가입&quot;&amp;gt; 
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;567&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHG07Q/btsJJy5XG8W/vWE0N3WZGWF1KSf3epIDo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHG07Q/btsJJy5XG8W/vWE0N3WZGWF1KSf3epIDo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHG07Q/btsJJy5XG8W/vWE0N3WZGWF1KSf3epIDo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHG07Q%2FbtsJJy5XG8W%2FvWE0N3WZGWF1KSf3epIDo0%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;567&quot; height=&quot;393&quot; data-origin-width=&quot;567&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;화면 구성이 너무 없어보임. input 태그가 정렬 안된 느낌.. 물론 화면이 주는 아니지만 기본적으로 그냥 예의가 없는 화면...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최소한 정보를 입력받는게 정렬되게 바꿔봄&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zSpJG/btsJJv2tD8A/KPNNyGWcPcjIkfpvMKcgC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zSpJG/btsJJv2tD8A/KPNNyGWcPcjIkfpvMKcgC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zSpJG/btsJJv2tD8A/KPNNyGWcPcjIkfpvMKcgC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzSpJG%2FbtsJJv2tD8A%2FKPNNyGWcPcjIkfpvMKcgC1%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;554&quot; height=&quot;438&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;input 태그에 placeholder로 각 항목에 제약사항을 넣어봤는데 짤리는 부분이 있음. 우리나라 최고의 포털사이트 중 하나인 네이버 회원가입을 살펴보면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ppiaR/btsJHS5Bm1x/LquIRkdCDXJDrEd9jWbEcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ppiaR/btsJHS5Bm1x/LquIRkdCDXJDrEd9jWbEcK/img.png&quot; data-alt=&quot;네이버 회원가입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ppiaR/btsJHS5Bm1x/LquIRkdCDXJDrEd9jWbEcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FppiaR%2FbtsJHS5Bm1x%2FLquIRkdCDXJDrEd9jWbEcK%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;482&quot; height=&quot;569&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;569&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;네이버 회원가입&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LW7fR/btsJHPnInXM/tyIqwFn0MO9R45BesMcKTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LW7fR/btsJHPnInXM/tyIqwFn0MO9R45BesMcKTK/img.png&quot; data-alt=&quot;네이버 회원가입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LW7fR/btsJHPnInXM/tyIqwFn0MO9R45BesMcKTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLW7fR%2FbtsJHPnInXM%2FtyIqwFn0MO9R45BesMcKTK%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;515&quot; height=&quot;241&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;네이버 회원가입&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따로 텍스트가 없고, placeholder를 사용하고, jQuery ajax를 이용한다는 것을 알 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최대 포털에서 이렇게 사용한다는 것은 회원 가입을 원하는 이용자가 불편함을 느끼지 않는다는 뜻이라고 생각된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음부터 저렇게 만들면 좋겠지만, 조금조금씩 추가하는 방향으로 하는게 과부하를 방지할 수 있을 것 같음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727072126979&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.formstyle{
	width : 400px;
	
}
.label{
	width : 200px;
}
.validation{
	widows: 200px;
	height: 30px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;회원가입&amp;lt;/h1&amp;gt;
&amp;lt;form action=&quot;${pageContext.request.contextPath}/member/joinPro&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;div class=&quot;formstyle&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; required=&quot;required&quot; placeholder=&quot;아이디&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; required=&quot;required&quot; placeholder=&quot;비밀번호&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 영문 대/소문자, 숫자, 특수문자를 사용 --%&amp;gt;
&amp;lt;input type=&quot;password&quot; name=&quot;pwre&quot; required=&quot;required&quot; placeholder=&quot;비밀번호재확인&quot;&amp;gt;&amp;lt;br&amp;gt; &amp;lt;%-- 비밀번호를 다시 입력 --%&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; required=&quot;required&quot; placeholder=&quot;이름&quot;&amp;gt; &amp;lt;%-- 한글, 영문만 입력 가능 --%&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;validation&quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;%-- 유효성 검사 시 유효성에 일치않을 때 --%&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;회원가입&quot;&amp;gt; 
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;468&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4taVP/btsJImyGhOp/K7PAvrdTmhdLyWE57GUT10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4taVP/btsJImyGhOp/K7PAvrdTmhdLyWE57GUT10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4taVP/btsJImyGhOp/K7PAvrdTmhdLyWE57GUT10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4taVP%2FbtsJImyGhOp%2FK7PAvrdTmhdLyWE57GUT10%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;468&quot; height=&quot;296&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;296&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;비밀번호 재확인에 name을 넣어줬는데, 이 정보는 DB에 저장하는 용도가 아닌 정보 확인용이기 때문에&amp;nbsp; 해당 input 태그에 name이 필요없음 &amp;rarr; 즉 &amp;lt;input&amp;nbsp;type=&quot;password&quot;&amp;nbsp;required=&quot;required&quot;&amp;nbsp;placeholder=&quot;비밀번호재확인&quot;&amp;gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트하면서는 전혀 신경쓰지 않았던 것 &amp;rarr; 어노테이션, 언제쓰는지는 아는데 안에 어떻게 생긴건지 살펴 볼 시간이 없었음.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적으로 @Controller 어노테이션을 살펴보면&lt;/p&gt;
&lt;pre id=&quot;code_1727076074162&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * Copyright 2002-2007 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.stereotype;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Indicates that an annotated class is a &quot;Controller&quot; (e.g. a web controller).
 *
 * &amp;lt;p&amp;gt;This annotation serves as a specialization of {@link Component @Component},
 * allowing for implementation classes to be autodetected through classpath scanning.
 * It is typically used in combination with annotated handler methods based on the
 * {@link org.springframework.web.bind.annotation.RequestMapping} annotation.
 *
 * @author Arjen Poutsma
 * @author Juergen Hoeller
 * @since 2.5
 * @see Component
 * @see org.springframework.web.bind.annotation.RequestMapping
 * @see org.springframework.context.annotation.ClassPathBeanDefinitionScanner
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {

	/**
	 * The value may indicate a suggestion for a logical component name,
	 * to be turned into a Spring bean in case of an autodetected component.
	 * @return the suggested component name, if any
	 */
	String value() default &quot;&quot;;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@interface Controller{} 로 되어 있는 것을 알 수 있는데, 이는 커스텀 어노테이션을 정의하는 방법으로 정의되어있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 커스텀 어노테이션 정의 @interface 어노테이션 이름&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;b&gt;Controller 클래스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아키텍처에서 컨트롤러를 정의할 때 사용&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@Controller MVC&lt;br /&gt;해당 클래스가 웹 애플리케이션의 컨트롤러임을 표시.&amp;nbsp; HTTP 요청을 처리하고 응답을 생성하는 역할을 담당&lt;/li&gt;
&lt;li&gt;@Inject&lt;br /&gt;종속성 주입을 수행하는 데 사용. 클래스의 필드, 생성자, 메소드 등에 적용할 수 있음. 클래스에 필요한 종속성을 자동으로 주입할 수 있음&lt;br /&gt;&lt;br /&gt;public&amp;nbsp;@interface&amp;nbsp;Inject&amp;nbsp;{}&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;@GetMapping&lt;br /&gt;HTTP Get 요청을 처리하는 메소드&lt;br /&gt;&lt;br /&gt;@RequestMapping(method&amp;nbsp;=&amp;nbsp;RequestMethod.GET) &lt;br /&gt;public&amp;nbsp;@interface&amp;nbsp;GetMapping&amp;nbsp;{ &lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt;&amp;nbsp;*&amp;nbsp;Alias&amp;nbsp;for&amp;nbsp;{@link&amp;nbsp;RequestMapping#name}. &lt;br /&gt;&amp;nbsp;*/ &lt;br /&gt;@AliasFor(annotation&amp;nbsp;=&amp;nbsp;RequestMapping.class) &lt;br /&gt;String&amp;nbsp;name()&amp;nbsp;default&amp;nbsp;&quot;&quot;; &lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt;&amp;nbsp;*&amp;nbsp;Alias&amp;nbsp;for&amp;nbsp;{@link&amp;nbsp;RequestMapping#value}. &lt;br /&gt;&amp;nbsp;*/ &lt;br /&gt;@AliasFor(annotation&amp;nbsp;=&amp;nbsp;RequestMapping.class) &lt;br /&gt;String[]&amp;nbsp;value()&amp;nbsp;default&amp;nbsp;{}; &lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt;&amp;nbsp;*&amp;nbsp;Alias&amp;nbsp;for&amp;nbsp;{@link&amp;nbsp;RequestMapping#path}. &lt;br /&gt;&amp;nbsp;*/ &lt;br /&gt;@AliasFor(annotation&amp;nbsp;=&amp;nbsp;RequestMapping.class) &lt;br /&gt;String[]&amp;nbsp;path()&amp;nbsp;default&amp;nbsp;{}; &lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt;&amp;nbsp;*&amp;nbsp;Alias&amp;nbsp;for&amp;nbsp;{@link&amp;nbsp;RequestMapping#params}. &lt;br /&gt;&amp;nbsp;*/ &lt;br /&gt;@AliasFor(annotation&amp;nbsp;=&amp;nbsp;RequestMapping.class) &lt;br /&gt;String[]&amp;nbsp;params()&amp;nbsp;default&amp;nbsp;{}; &lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt;&amp;nbsp;*&amp;nbsp;Alias&amp;nbsp;for&amp;nbsp;{@link&amp;nbsp;RequestMapping#headers}. &lt;br /&gt;&amp;nbsp;*/ &lt;br /&gt;@AliasFor(annotation&amp;nbsp;=&amp;nbsp;RequestMapping.class) &lt;br /&gt;String[]&amp;nbsp;headers()&amp;nbsp;default&amp;nbsp;{}; &lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt;&amp;nbsp;*&amp;nbsp;Alias&amp;nbsp;for&amp;nbsp;{@link&amp;nbsp;RequestMapping#consumes}. &lt;br /&gt;&amp;nbsp;*&amp;nbsp;@since&amp;nbsp;4.3.5 &lt;br /&gt;&amp;nbsp;*/ &lt;br /&gt;@AliasFor(annotation&amp;nbsp;=&amp;nbsp;RequestMapping.class) &lt;br /&gt;String[]&amp;nbsp;consumes()&amp;nbsp;default&amp;nbsp;{}; &lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt;&amp;nbsp;*&amp;nbsp;Alias&amp;nbsp;for&amp;nbsp;{@link&amp;nbsp;RequestMapping#produces}. &lt;br /&gt;&amp;nbsp;*/ &lt;br /&gt;@AliasFor(annotation&amp;nbsp;=&amp;nbsp;RequestMapping.class) &lt;br /&gt;String[]&amp;nbsp;produces()&amp;nbsp;default&amp;nbsp;{};&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;PostMapping&lt;br /&gt;HTTP Post 요청을 처리하는 메소드&lt;br /&gt;&lt;br /&gt;@RequestMapping(method&amp;nbsp;=&amp;nbsp;RequestMethod.POST) &lt;br /&gt;public&amp;nbsp;@interface&amp;nbsp;PostMapping&amp;nbsp;{ &lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt;&amp;nbsp;*&amp;nbsp;Alias&amp;nbsp;for&amp;nbsp;{@link&amp;nbsp;RequestMapping#name}. &lt;br /&gt;&amp;nbsp;*/ &lt;br /&gt;@AliasFor(annotation&amp;nbsp;=&amp;nbsp;RequestMapping.class) &lt;br /&gt;String&amp;nbsp;name()&amp;nbsp;default&amp;nbsp;&quot;&quot;; &lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt;&amp;nbsp;*&amp;nbsp;Alias&amp;nbsp;for&amp;nbsp;{@link&amp;nbsp;RequestMapping#value}. &lt;br /&gt;&amp;nbsp;*/ &lt;br /&gt;@AliasFor(annotation&amp;nbsp;=&amp;nbsp;RequestMapping.class) &lt;br /&gt;String[]&amp;nbsp;value()&amp;nbsp;default&amp;nbsp;{}; &lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt;&amp;nbsp;*&amp;nbsp;Alias&amp;nbsp;for&amp;nbsp;{@link&amp;nbsp;RequestMapping#path}. &lt;br /&gt;&amp;nbsp;*/ &lt;br /&gt;@AliasFor(annotation&amp;nbsp;=&amp;nbsp;RequestMapping.class) &lt;br /&gt;String[]&amp;nbsp;path()&amp;nbsp;default&amp;nbsp;{}; &lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt;&amp;nbsp;*&amp;nbsp;Alias&amp;nbsp;for&amp;nbsp;{@link&amp;nbsp;RequestMapping#params}. &lt;br /&gt;&amp;nbsp;*/ &lt;br /&gt;@AliasFor(annotation&amp;nbsp;=&amp;nbsp;RequestMapping.class) &lt;br /&gt;String[]&amp;nbsp;params()&amp;nbsp;default&amp;nbsp;{}; &lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt;&amp;nbsp;*&amp;nbsp;Alias&amp;nbsp;for&amp;nbsp;{@link&amp;nbsp;RequestMapping#headers}. &lt;br /&gt;&amp;nbsp;*/ &lt;br /&gt;@AliasFor(annotation&amp;nbsp;=&amp;nbsp;RequestMapping.class) &lt;br /&gt;String[]&amp;nbsp;headers()&amp;nbsp;default&amp;nbsp;{}; &lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt;&amp;nbsp;*&amp;nbsp;Alias&amp;nbsp;for&amp;nbsp;{@link&amp;nbsp;RequestMapping#consumes}. &lt;br /&gt;&amp;nbsp;*/ &lt;br /&gt;@AliasFor(annotation&amp;nbsp;=&amp;nbsp;RequestMapping.class) &lt;br /&gt;String[]&amp;nbsp;consumes()&amp;nbsp;default&amp;nbsp;{}; &lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt;&amp;nbsp;*&amp;nbsp;Alias&amp;nbsp;for&amp;nbsp;{@link&amp;nbsp;RequestMapping#produces}. &lt;br /&gt;&amp;nbsp;*/ &lt;br /&gt;@AliasFor(annotation&amp;nbsp;=&amp;nbsp;RequestMapping.class) &lt;br /&gt;String[]&amp;nbsp;produces()&amp;nbsp;default&amp;nbsp;{};&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;@ResponseBody&lt;br /&gt;컨트롤러의 메소드에 적용되어 해당 메소드가 HTTP 응답의 본문을 직접 반환함. 메소드가 반환하는 객체가 HTTP 응답 본문에 직접 포함되어 클라이언트로 전송됨. 일반적으로 컨트롤러의 메소드가 String, JSON, XML 등의 데이터를 반환 할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무리 봐도 DI(의존성 주입)이란걸 정리해둔걸 한 줄로 요약이 되는데, 진짜 이해가 안됨. A가 B를 이용하면 A는 B에 의존한다? 그래서 검색도 해보고 유튜브 검색도 해봤음. 유튜브 &lt;a href=&quot;https://www.youtube.com/watch?v=1vdeIL2iCcM&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;5분개발지식&lt;/a&gt;님이 올려둔 의존성 주입 설명을 캡쳐해보았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buwXIG/btsJJC1GR8R/S8s3eitQ5suH3pEfMNZENK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buwXIG/btsJJC1GR8R/S8s3eitQ5suH3pEfMNZENK/img.png&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;1440&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buwXIG/btsJJC1GR8R/S8s3eitQ5suH3pEfMNZENK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuwXIG%2FbtsJJC1GR8R%2FS8s3eitQ5suH3pEfMNZENK%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;665&quot; height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xh13D/btsJHTQ8c2p/O9FxaQw5k2FFhenNkjejRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xh13D/btsJHTQ8c2p/O9FxaQw5k2FFhenNkjejRK/img.png&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;1440&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xh13D/btsJHTQ8c2p/O9FxaQw5k2FFhenNkjejRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxh13D%2FbtsJHTQ8c2p%2FO9FxaQw5k2FFhenNkjejRK%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;665&quot; height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;출처 : 5분개발지식 - 의존성 주입 3분만에 이해하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림을 본다고해도 이해되는 건 아닌데, 대략적으로 이러이러한 것이다 라고 이야기는 할 수 있지 않을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;rarr; 페이지 작업 &amp;rarr; DB 작업(스키마, 테이블, 컬럼 만들기) &amp;rarr; 클래스 작업으로 하는 것을 선호한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유는 첫째는 페이지를 만들면서, 큰 틀에서 생각해둔 DB를 수정하고 클래스 작업(Controller - Service - DAO - Mapper)을 진행하는 것이 내 입장에서는 편함. 둘째 페이지를 만들면서 이런 기능을 넣으면 좋겠는데? 넣어보자하는게 생기기 때문에 클래스 작업하거나 자바스크립트 사용해 즉각적으로 할 수 있기 때문이다.&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;기본적으로 수요일까지 화면 구성을 끝 마치고 DB작업 후 클래스 작업하는 순서로 진행하고자한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만들어야하는 페이지(view)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;member&lt;br /&gt;회원가입 -&amp;gt; 정규표현식을 이용해서 유효성검사, ajax를 이용하여 중복확인&lt;br /&gt;내 정보 &amp;rarr; 정보 수정(이름, 비밀번호), 탈퇴&lt;/li&gt;
&lt;li&gt;board&lt;br /&gt;게시판 리스트 + 글 조회&lt;br /&gt;글 쓰기(회원만)&lt;br /&gt;글 수정, 글 삭제(작성자만)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 4개의 페이지를 수요일 전까지 만들고 이어서 DB 수정하는 식으로 하자.&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FS5Tg/btsJJLkifVE/XlVLAK6xbdQaoc9YkbJOhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FS5Tg/btsJJLkifVE/XlVLAK6xbdQaoc9YkbJOhK/img.png&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;407&quot; data-is-animation=&quot;false&quot; style=&quot;width: 55.2378%; margin-right: 10px;&quot; data-widthpercent=&quot;55.89&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FS5Tg/btsJJLkifVE/XlVLAK6xbdQaoc9YkbJOhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFS5Tg%2FbtsJJLkifVE%2FXlVLAK6xbdQaoc9YkbJOhK%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;626&quot; height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB7YZ3/btsJJMjdH89/PzqpOugbLJP5c9Ufg5KI9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB7YZ3/btsJJMjdH89/PzqpOugbLJP5c9Ufg5KI9K/img.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;528&quot; data-is-animation=&quot;false&quot; style=&quot;width: 43.5994%;&quot; data-widthpercent=&quot;44.11&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB7YZ3/btsJJMjdH89/PzqpOugbLJP5c9Ufg5KI9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB7YZ3%2FbtsJJMjdH89%2FPzqpOugbLJP5c9Ufg5KI9K%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;641&quot; height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;/div&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;rarr; 접근 제어자 왼쪽은 default, 오른쪽은 public 이 경우 패키지가 다를 경우 접근을 못해서 해당 객체를 사용하지 못 함.&lt;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/283</guid>
      <comments>https://001cloudid.tistory.com/entry/justBoard4-%ED%99%94%EB%A9%B4view1#entry283comment</comments>
      <pubDate>Mon, 23 Sep 2024 16:51:26 +0900</pubDate>
    </item>
    <item>
      <title>justBoard3  xml설정, 프로그램 설치</title>
      <link>https://001cloudid.tistory.com/entry/justBoard3-xml%EC%84%A4%EC%A0%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%84%A4%EC%B9%98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;프로그램 설치(Maven), JDBC, xml 설정하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;xml 설정&lt;/b&gt;&lt;/h3&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;288&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brlif3/btsJHEyFhWP/BT9TLIUYLNIP7Ga9SLf8C0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brlif3/btsJHEyFhWP/BT9TLIUYLNIP7Ga9SLf8C0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brlif3/btsJHEyFhWP/BT9TLIUYLNIP7Ga9SLf8C0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbrlif3%2FbtsJHEyFhWP%2FBT9TLIUYLNIP7Ga9SLf8C0%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;288&quot; height=&quot;399&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;src/main/java : 작성되는 코드의 경로&lt;/li&gt;
&lt;li&gt;src/main/resource : 실행할 때 참고하는 기본 경로(주로 설정 파일들을 넣음)&lt;/li&gt;
&lt;li&gt;src/test/java : 테스트 코드를 넣는 경로&lt;/li&gt;
&lt;li&gt;src/test/resources : 테스트 관련 설정 파일 보관 경로&lt;/li&gt;
&lt;li&gt;servlet-context.xml : 웹과 관련된 스프링 설정 파일&lt;/li&gt;
&lt;li&gt;root-context.xml : 스프링 설정파일&lt;/li&gt;
&lt;li&gt;views : 템플릿 프로젝트의 jsp 파일 경로&lt;/li&gt;
&lt;li&gt;web.xml : Tomcat의 web.xml 파일&lt;/li&gt;
&lt;li&gt;pom.xml : Maven이 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;xml파일을 설정하기 앞서 각각의 xml파일에 대해서 깊게 정리해야할 필요가 있는 것 같음&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;web.xml&lt;br /&gt;배포 서술자(Deployment Descriptor, DD) Java 웹 애플리케이션의 기본적인 설정을 위해 작성하는 파일&lt;br /&gt;JSP와 서블릿으로만 구성된 경우에 web.xml을 사용&lt;br /&gt;web.xml은 WAS에서 톰캣이 최초로 구성될 때 WEB-INF 폴더에 존재하는 web.xml 파일을 읽고 그에 해당하는 웹 애플리케이션을 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1726886384833&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt; &amp;lt;!-- xml 파일이고, 버전 1.0, UTF-8로 인코딩 --&amp;gt;
&amp;lt;web-app version=&quot;2.5&quot; xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;&amp;gt; &amp;lt;!-- web.xml의 루트 엘리먼트. 모든 웹 애플리케이션 설정은 web-app 태그 사이에 존재해야함 --&amp;gt;

	&amp;lt;!-- The definition of the Root Spring Container shared by all Servlets and Filters --&amp;gt;
	&amp;lt;context-param&amp;gt; &amp;lt;!-- context는 이름이나 객체를 바인딩하는 집합의 역할을 담당. 어떠한 객체를 핸들링하기 위한 접근 수단. 사용자가 직접 컨트롤하는 xml파일을 지정해주는 역할 --&amp;gt; &amp;lt;!-- context-param 태그에 설정되어 있는 root-context.xml은 모든 서블릿 필터에서 사용되는 루트 스프링 컨테이너 설정 --&amp;gt;
		&amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt; &amp;lt;!-- param-name 파라미터 이름 --&amp;gt;
		&amp;lt;param-value&amp;gt;/WEB-INF/spring/root-context.xml&amp;lt;/param-value&amp;gt; &amp;lt;!-- param-value 파라미터 값 --&amp;gt;
	&amp;lt;/context-param&amp;gt;
	
	&amp;lt;!-- Creates the Spring Container shared by all Servlets and Filters --&amp;gt;
	&amp;lt;listener&amp;gt; &amp;lt;!-- 모든 서블릿과 필터에 의해 공유되는 스프링 컨테이너를 생성 --&amp;gt;
		&amp;lt;listener-class&amp;gt;org.springframework.web.context.ContextLoaderListener&amp;lt;/listener-class&amp;gt; &amp;lt;!-- ContextLoaderListener 클래스가 생성하는 WebApplicationContext는 웹 애플리케이션에서 루트 컨텍스트가 되며, 자식은 루트가 제공하는 객체(bean)을 사용할 수 있음 --&amp;gt;
	&amp;lt;/listener&amp;gt;

	&amp;lt;!-- Processes application requests --&amp;gt;
	&amp;lt;servlet&amp;gt; &amp;lt;!-- 애플리케이션의 요청을 처리. 클라이언트가 요청을 보내면 그에 따라 요청을 처리할 수 있는 곳으로 넘겨주고, 결과를 서버쪽 응답을 통해 클라이언트에게 넘겨주는 곳을 지정. 이를 진행하는 것이 DispatcherServlet --&amp;gt;
		&amp;lt;servlet-name&amp;gt;appServlet&amp;lt;/servlet-name&amp;gt;
		&amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;
		&amp;lt;init-param&amp;gt;
			&amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;
			&amp;lt;param-value&amp;gt;/WEB-INF/spring/appServlet/servlet-context.xml&amp;lt;/param-value&amp;gt;
		&amp;lt;/init-param&amp;gt;
		&amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;
	&amp;lt;/servlet&amp;gt;
		
	&amp;lt;servlet-mapping&amp;gt;
		&amp;lt;servlet-name&amp;gt;appServlet&amp;lt;/servlet-name&amp;gt;
		&amp;lt;url-pattern&amp;gt;/&amp;lt;/url-pattern&amp;gt;
	&amp;lt;/servlet-mapping&amp;gt;
	
	&amp;lt;!-- 추가 --&amp;gt;
	&amp;lt;filter&amp;gt; &amp;lt;!-- filter 웹 애플리케이션 전반에 걸쳐 특정 URL이나 파일 요청 시 미리 로딩되어 사전에 처리할 작업을 필터링하고 해당 요청을 처리 --&amp;gt;
		&amp;lt;filter-name&amp;gt;encoding&amp;lt;/filter-name&amp;gt;
		&amp;lt;filter-class&amp;gt;org.springframework.web.filter.CharacterEncodingFilter&amp;lt;/filter-class&amp;gt;
		&amp;lt;init-param&amp;gt;
			&amp;lt;param-name&amp;gt;encoding&amp;lt;/param-name&amp;gt;
			&amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt;
		&amp;lt;/init-param&amp;gt;
	&amp;lt;/filter&amp;gt;
	
	&amp;lt;filter-mapping&amp;gt; &amp;lt;!-- 필터를 적용할 name,servlet, url-pattern등을 지정 --&amp;gt;
		&amp;lt;filter-name&amp;gt;encoding&amp;lt;/filter-name&amp;gt;
		&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
	&amp;lt;/filter-mapping&amp;gt;


&amp;lt;/web-app&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;root-context.xml&lt;br /&gt;스프링 MVC 설정과 관련된 여러 처리를 담당&lt;br /&gt;JSP와는 관련없는 객체(Bean)을 설정&lt;br /&gt;&lt;b&gt;DB에 접속하기 위한 설정&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1726887842763&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt; &amp;lt;!-- 스프링 MVC설정과 관련된 여러 처리를 담당. JSP와 관련 없는 객체(Bean)을 설정. 비즈니스 로직을 위한 설정을 하고 공통 Bean을 설정. DB에 접속하기 위한 설정 --&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd&quot;&amp;gt;
	
	&amp;lt;!-- Root Context: defines shared resources visible to all other web components --&amp;gt;
	&amp;lt;bean id=&quot;dataSource&quot; class=&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;&amp;gt;
		&amp;lt;property name=&quot;driverClassName&quot; value=&quot;com.mysql.cj.jdbc.Driver&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;url&quot; value=&quot;jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Seoul&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;username&quot; value=&quot;root&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;password&quot; value=&quot;1234&quot;&amp;gt;&amp;lt;/property&amp;gt;
	&amp;lt;/bean&amp;gt;

	&amp;lt;bean id=&quot;sqlSessionFactory&quot; class=&quot;org.mybatis.spring.SqlSessionFactoryBean&quot;&amp;gt;
		&amp;lt;property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;configLocation&quot; value=&quot;classpath:/mybatis-config.xml&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;mapperLocations&quot; value=&quot;classpath:mappers/**/*Mapper.xml&quot;&amp;gt;&amp;lt;/property&amp;gt;
	&amp;lt;/bean&amp;gt;

	&amp;lt;bean id=&quot;sqlSession&quot; class=&quot;org.mybatis.spring.SqlSessionTemplate&quot; destroy-method=&quot;clearCache&quot;&amp;gt;
		&amp;lt;constructor-arg name=&quot;sqlSessionFactory&quot; ref=&quot;sqlSessionFactory&quot;&amp;gt;&amp;lt;/constructor-arg&amp;gt;
	&amp;lt;/bean&amp;gt;
		
&amp;lt;/beans&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;위와 같이 작성함. 현재 Maven 프로그램이 설치가 안되어 있어 에러가 뜸. pom.xml에 Maven을 추가해두면 없어질 듯&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;servlet-context.xml&lt;br /&gt;web.xml에서 DispatcherServlet의 설정을 기록&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1726888169949&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/mvc&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
	xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
	xsi:schemaLocation=&quot;http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd&quot;&amp;gt;

	&amp;lt;!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --&amp;gt;
	
	&amp;lt;!-- Enables the Spring MVC @Controller programming model --&amp;gt;
	&amp;lt;annotation-driven /&amp;gt; &amp;lt;!-- 스프링 MVC에서 @사용가능하게 함 --&amp;gt;

	&amp;lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&amp;gt;
	&amp;lt;resources mapping=&quot;/resources/**&quot; location=&quot;/resources/&quot; /&amp;gt; &amp;lt;!-- 정적 html 문서 리소스들의 정보를 기술 --&amp;gt;

	&amp;lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&amp;gt;
	&amp;lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&amp;gt; &amp;lt;!-- InternalResourceViewResolver : JSP와 name을 매핑시켜주는 여할 --&amp;gt;
		&amp;lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&amp;gt;
		&amp;lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&amp;gt;
	&amp;lt;/beans:bean&amp;gt;
	
	&amp;lt;context:component-scan base-package=&quot;com.mystory001.justboard&quot; /&amp;gt; &amp;lt;!-- context:component-scan : 해당 패키지에 있는 파일들의 어노테이션을 스캔해서 빈으로 등록하는 역할 --&amp;gt;
	
	
	
&amp;lt;/beans:beans&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;xml 정리 참고 : &lt;a href=&quot;https://m.blog.naver.com/zzang9ha/222069787161&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://m.blog.naver.com/zzang9ha/222069787161&lt;/a&gt;, &lt;a href=&quot;https://kijuk.tistory.com/142&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kijuk.tistory.com/142&lt;/a&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;/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;어느 정도 xml 설정이 끝난 것 같다. servlet-context에 클래스 파일 context:component-scan으로 추가해주는 것만 남은 것 같은데, 하다보면 또 추가해야할 게 많을 수도 있을 것 같음. 설정이 더 필요한 부분은 하면서 추가하도록 할 예정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;프로그램 설치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mvnrepository.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://mvnrepository.com/&lt;/a&gt; 여기서 필요한 리파지토리를 복사해서 pom..xml에 붙여주면 된다. 교육 받을 때 분명히 스프링 버전마다 지원하는 것이 조금씩 다르다고 했던 것 같은데... 아무튼 확인이 필요함 대표적으로 사용할 mybatis의 경우&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9ezSt/btsJGW7TAOH/YVkACzlOD57BDUAqLrsx10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9ezSt/btsJGW7TAOH/YVkACzlOD57BDUAqLrsx10/img.png&quot; data-alt=&quot;https://mybatis.org/spring/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9ezSt/btsJGW7TAOH/YVkACzlOD57BDUAqLrsx10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9ezSt%2FbtsJGW7TAOH%2FYVkACzlOD57BDUAqLrsx10%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;740&quot; height=&quot;180&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://mybatis.org/spring/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링과 mybatis 버전, java버전도 다 함께 맞춰줘야함.&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;pom.xml&lt;/p&gt;
&lt;pre id=&quot;code_1726889286975&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;
	&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
	&amp;lt;groupId&amp;gt;com.mystory001&amp;lt;/groupId&amp;gt;
	&amp;lt;artifactId&amp;gt;justboard&amp;lt;/artifactId&amp;gt;
	&amp;lt;name&amp;gt;justBoard&amp;lt;/name&amp;gt;
	&amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;
	&amp;lt;version&amp;gt;1.0.0-BUILD-SNAPSHOT&amp;lt;/version&amp;gt;
	&amp;lt;properties&amp;gt;
		&amp;lt;java-version&amp;gt;11&amp;lt;/java-version&amp;gt;
		&amp;lt;org.springframework-version&amp;gt;4.3.8.RELEASE&amp;lt;/org.springframework-version&amp;gt;
		&amp;lt;org.aspectj-version&amp;gt;1.6.10&amp;lt;/org.aspectj-version&amp;gt;
		&amp;lt;org.slf4j-version&amp;gt;1.6.6&amp;lt;/org.slf4j-version&amp;gt;
	&amp;lt;/properties&amp;gt;
	&amp;lt;dependencies&amp;gt;
		&amp;lt;!-- Spring --&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
			&amp;lt;exclusions&amp;gt;
				&amp;lt;!-- Exclude Commons Logging in favor of SLF4j --&amp;gt;
				&amp;lt;exclusion&amp;gt;
					&amp;lt;groupId&amp;gt;commons-logging&amp;lt;/groupId&amp;gt;
					&amp;lt;artifactId&amp;gt;commons-logging&amp;lt;/artifactId&amp;gt;
				 &amp;lt;/exclusion&amp;gt;
			&amp;lt;/exclusions&amp;gt;
		&amp;lt;/dependency&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;
		
		&amp;lt;!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j --&amp;gt;
		&amp;lt;dependency&amp;gt;
		   	&amp;lt;groupId&amp;gt;com.mysql&amp;lt;/groupId&amp;gt;
		   	&amp;lt;artifactId&amp;gt;mysql-connector-j&amp;lt;/artifactId&amp;gt;
		   	&amp;lt;version&amp;gt;8.0.33&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;
			
		&amp;lt;!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --&amp;gt;
		&amp;lt;dependency&amp;gt;
		    &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
		    &amp;lt;artifactId&amp;gt;spring-jdbc&amp;lt;/artifactId&amp;gt;
		    &amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;
			
		&amp;lt;!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --&amp;gt;
		&amp;lt;dependency&amp;gt;
		    &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt;
		    &amp;lt;artifactId&amp;gt;mybatis&amp;lt;/artifactId&amp;gt;
		    &amp;lt;version&amp;gt;3.4.1&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;
					
		&amp;lt;!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --&amp;gt;
		&amp;lt;dependency&amp;gt;
		    &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt;
		    &amp;lt;artifactId&amp;gt;mybatis-spring&amp;lt;/artifactId&amp;gt;
		    &amp;lt;version&amp;gt;1.3.1&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;!-- 데이터를 json 형태로 변경하는 프로그램 jackson-databind 설치 --&amp;gt;
		&amp;lt;!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --&amp;gt;
		&amp;lt;dependency&amp;gt;
    		&amp;lt;groupId&amp;gt;com.fasterxml.jackson.core&amp;lt;/groupId&amp;gt;
    		&amp;lt;artifactId&amp;gt;jackson-databind&amp;lt;/artifactId&amp;gt;
    		&amp;lt;version&amp;gt;2.15.2&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;
				
	(...생략...)&lt;/code&gt;&lt;/pre&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;471&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kXaeY/btsJHDftIig/ARtvMA1gr7SPmpVX2RHLp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kXaeY/btsJHDftIig/ARtvMA1gr7SPmpVX2RHLp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kXaeY/btsJHDftIig/ARtvMA1gr7SPmpVX2RHLp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkXaeY%2FbtsJHDftIig%2FARtvMA1gr7SPmpVX2RHLp1%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;471&quot; height=&quot;599&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;599&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pom.xml에 추가한 것들이 Maven Dependencies에 추가됨을 알 수 있음&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;+ root-context를 다시 확인해보면 에러가 없어짐&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckdbxz/btsJIu9V0e7/wqaCbhW4s4kCP8PvW9V7ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckdbxz/btsJIu9V0e7/wqaCbhW4s4kCP8PvW9V7ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckdbxz/btsJIu9V0e7/wqaCbhW4s4kCP8PvW9V7ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fckdbxz%2FbtsJIu9V0e7%2FwqaCbhW4s4kCP8PvW9V7ok%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;955&quot; height=&quot;308&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트하면서 워낙 많이 본 화면인데, 이는 전체 스캔? 확인하면서 xml에 적혀진 파일이 누락되어 있어서 발생하는 경우가 많았다. 아마 root-context.xml에서 Mapper가 있어서 문제가 생긴걸로 판단됨&lt;/p&gt;
&lt;pre id=&quot;code_1726890164704&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt; &amp;lt;!-- 스프링 MVC설정과 관련된 여러 처리를 담당. JSP와 관련 없는 객체(Bean)을 설정. 비즈니스 로직을 위한 설정을 하고 공통 Bean을 설정. DB에 접속하기 위한 설정 --&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd&quot;&amp;gt;
	
	&amp;lt;!-- Root Context: defines shared resources visible to all other web components --&amp;gt;
	&amp;lt;bean id=&quot;dataSource&quot; class=&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;&amp;gt;
		&amp;lt;property name=&quot;driverClassName&quot; value=&quot;com.mysql.cj.jdbc.Driver&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;url&quot; value=&quot;jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Seoul&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;username&quot; value=&quot;root&quot;&amp;gt;&amp;lt;/property&amp;gt;
		&amp;lt;property name=&quot;password&quot; value=&quot;1234&quot;&amp;gt;&amp;lt;/property&amp;gt;
	&amp;lt;/bean&amp;gt;

&amp;lt;!-- 	&amp;lt;bean id=&quot;sqlSessionFactory&quot; class=&quot;org.mybatis.spring.SqlSessionFactoryBean&quot;&amp;gt; --&amp;gt;
&amp;lt;!-- 		&amp;lt;property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;&amp;gt;&amp;lt;/property&amp;gt; --&amp;gt;
&amp;lt;!-- 		&amp;lt;property name=&quot;configLocation&quot; value=&quot;classpath:/mybatis-config.xml&quot;&amp;gt;&amp;lt;/property&amp;gt; --&amp;gt;
&amp;lt;!-- 		&amp;lt;property name=&quot;mapperLocations&quot; value=&quot;classpath:mappers/**/*Mapper.xml&quot;&amp;gt;&amp;lt;/property&amp;gt; --&amp;gt;
&amp;lt;!-- 	&amp;lt;/bean&amp;gt; --&amp;gt;

&amp;lt;!-- 	&amp;lt;bean id=&quot;sqlSession&quot; class=&quot;org.mybatis.spring.SqlSessionTemplate&quot; destroy-method=&quot;clearCache&quot;&amp;gt; --&amp;gt;
&amp;lt;!-- 		&amp;lt;constructor-arg name=&quot;sqlSessionFactory&quot; ref=&quot;sqlSessionFactory&quot;&amp;gt;&amp;lt;/constructor-arg&amp;gt; --&amp;gt;
&amp;lt;!-- 	&amp;lt;/bean&amp;gt; --&amp;gt;
		
&amp;lt;/beans&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주석 처리 함.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;794&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2jguB/btsJHnRLFIt/qLgMMDht4rzWNyJ6w7euFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2jguB/btsJHnRLFIt/qLgMMDht4rzWNyJ6w7euFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2jguB/btsJHnRLFIt/qLgMMDht4rzWNyJ6w7euFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2jguB%2FbtsJHnRLFIt%2FqLgMMDht4rzWNyJ6w7euFk%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;1218&quot; height=&quot;794&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;794&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uClcD/btsJGtSCJnM/HREsjZyXuL1Pmhwq9jpiO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uClcD/btsJGtSCJnM/HREsjZyXuL1Pmhwq9jpiO0/img.png&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;203&quot; data-is-animation=&quot;false&quot; style=&quot;width: 38.7211%; margin-right: 10px;&quot; data-widthpercent=&quot;39.18&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uClcD/btsJGtSCJnM/HREsjZyXuL1Pmhwq9jpiO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuClcD%2FbtsJGtSCJnM%2FHREsjZyXuL1Pmhwq9jpiO0%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;251&quot; height=&quot;203&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBZ6pg/btsJHSjqIyQ/LwPDjNi3uzKf2Yg2FMII51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBZ6pg/btsJHSjqIyQ/LwPDjNi3uzKf2Yg2FMII51/img.png&quot; data-origin-width=&quot;215&quot; data-origin-height=&quot;112&quot; data-is-animation=&quot;false&quot; style=&quot;width: 60.1161%;&quot; data-widthpercent=&quot;60.82&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBZ6pg/btsJHSjqIyQ/LwPDjNi3uzKf2Yg2FMII51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBZ6pg%2FbtsJHSjqIyQ%2FLwPDjNi3uzKf2Yg2FMII51%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;215&quot; height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/div&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;mybatis-config.xml&lt;/p&gt;
&lt;pre id=&quot;code_1726894068099&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&amp;gt;
&amp;lt;!DOCTYPE configuration
  PUBLIC &quot;-//mybatis.org//DTD Config 3.0//EN&quot;
  &quot;https://mybatis.org/dtd/mybatis-3-config.dtd&quot;&amp;gt;
&amp;lt;configuration&amp;gt;
 
&amp;lt;/configuration&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;mybatis에서 사용될 DB를 연동하기 위한 설정값을 작성. mybatis 실행 시 필요한 설정 정보를 담고 있으며, mybatis 프로젝트에서 가장 기본적인 설정파일임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; DB 연동은 root-context에서 설정해뒀기 때문에 따로 해줄 필요가 없는 것 같아보임&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;늘 그렇지만 처음부터 완벽한 웹 애플리케이션이면 좋겠지만, 나 같은 초심자에겐 너무 어렵기도 하고 매 번 수정할 일이 생겨서.. 일단은 차근차근해보도록하자..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src/main/java안의 클래스도 하나하나 수정해야함! 일단 만들어 두기만 했음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/282</guid>
      <comments>https://001cloudid.tistory.com/entry/justBoard3-xml%EC%84%A4%EC%A0%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%84%A4%EC%B9%98#entry282comment</comments>
      <pubDate>Sat, 21 Sep 2024 13:55:52 +0900</pubDate>
    </item>
    <item>
      <title>justBoard2 DB구축</title>
      <link>https://001cloudid.tistory.com/entry/justBoard2-DB%EA%B5%AC%EC%B6%95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2024.09.20&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 전 글에서 정리한 해야할 일&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. DB 구축&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 게시판&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 내 정보&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4. 프로그램 설치(Maven), JDBC, xml 설정&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;에서&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DB구축&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 DB구축을 먼저해야겠다고 생각함. 대략적인 테이블과 컬럼을 만들어 놓고 필요하면 추가하는 식으로 하면 되니까.. 테이블을 수정하는 일은 어렵지 않은데, 처음부터 DB만큼은 완벽하게 해놓고 시작하고 싶은 마음에 항상 나중으로 미뤄놓는 습관이 생김. 이유는 전에 프로젝트하면서 날짜 데이터가 제대로 안들어가서 varchar로 바꿨다가 datetime으로 바꿨다가 최종적으로 varchar 타입으로 여러 번 바꾼 적이 있었기 때문..&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 Oracle과 MySQL을 사용할 줄 알지만, Oracle의 경우 user로 들어가서 하는 게 조금 번거롭기도 하고, 두 번의 프로젝트에서 MySQL을 연동해서 하다보니 그게 편함. 그냥 편한거 사용하자는 생각으로 DBMS는 MySQL로 선정&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;MySQL Workbench 켜고 먼저 기존에 있던 스키마 말고 처음부터 다시 하자는 생각으로..&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;스키마 생성과 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chlpVA/btsJFwH1SOF/lKtWwt33ETykTFLLb8Y5Ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chlpVA/btsJFwH1SOF/lKtWwt33ETykTFLLb8Y5Ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chlpVA/btsJFwH1SOF/lKtWwt33ETykTFLLb8Y5Ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchlpVA%2FbtsJFwH1SOF%2FlKtWwt33ETykTFLLb8Y5Ck%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;273&quot; height=&quot;92&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단은 두 개의 테이블이 존재해야함. 회원 테이블, 게시판 테이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원 테이블&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 88px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;컬럼명&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;타입&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;크기&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;Key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;id&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;varchar&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;PK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;pw&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;varchar&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;NN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;name&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;varchar&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;NN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;time&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;varchar? datetime?&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;default 현재시간, NN&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 time은 가입한 시간&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;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 94px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;컬럼명&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;타입&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;크기&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;Key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;subject&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;varchar&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;50&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;NN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;content&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;varchar&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;500&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;id&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;varchar&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;50&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;FK(회원 테이블 id 참조)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;writetime&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;datetime&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;default 현재시간&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;p data-ke-size=&quot;size16&quot;&gt;만들려고 했더니 에러가 생김&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bprTE3/btsJF5XZ33L/Kl0sW0fUaIvAthQL1u9rqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bprTE3/btsJF5XZ33L/Kl0sW0fUaIvAthQL1u9rqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bprTE3/btsJF5XZ33L/Kl0sW0fUaIvAthQL1u9rqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbprTE3%2FbtsJF5XZ33L%2FKl0sW0fUaIvAthQL1u9rqK%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;557&quot; height=&quot;188&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;188&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. id는 회원테이블의 컬럼을 참조하는 외래키인데 회원 테이블을 먼저 만들지 않아서 오류가 날 것임. 또한 FK의 경우 테이블 레벨 문법을 사용해야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 게시판 테이블에는 PK가 없다. 분명 교육받을 때 PK를 써주는 것이 좋다 라고 배운 것 같기도하고 아닌 것 같기도하고 곰곰히 생각해보니 PK를 넣어주는 게 좋아보인다. 인덱스나 join을 사용할 때 등 여러 가지 경우에 유리하기 때문에 그와 관련된 것을 검색해보니&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bptXpd/btsJGUut8A9/8k8aCtKpyplhYVAI62QOjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bptXpd/btsJGUut8A9/8k8aCtKpyplhYVAI62QOjK/img.png&quot; data-alt=&quot;출처 : https://jongsky.tistory.com/20&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bptXpd/btsJGUut8A9/8k8aCtKpyplhYVAI62QOjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbptXpd%2FbtsJGUut8A9%2F8k8aCtKpyplhYVAI62QOjK%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;595&quot; height=&quot;675&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;675&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://jongsky.tistory.com/20&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 보니 DBMS를 사용하는 이유는 정보를 저장의 목적도 있지만, 정보를 잘 저장하기 위해서도 있다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시판 테이블&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 94px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;컬럼명&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;타입&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;크기&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;Key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;PK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;subject&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;varchar&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;50&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;NN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;content&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;varchar&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;500&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;id&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;varchar&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;50&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;FK(회원 테이블 id 참조)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;writetime&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;datetime&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;default 현재시간&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;no라는 글 번호 컬럼을 추가해주기로 했다.&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sg4QG/btsJF5K7bpC/emEowWZ2DwA24whkfwzlwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sg4QG/btsJF5K7bpC/emEowWZ2DwA24whkfwzlwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sg4QG/btsJF5K7bpC/emEowWZ2DwA24whkfwzlwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSg4QG%2FbtsJF5K7bpC%2FemEowWZ2DwA24whkfwzlwK%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;434&quot; height=&quot;189&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;member를 그대로 사용하기엔 예약어가 있는 것 같아서 생성이 안됨. '`'를 사용해서 강제적?으로 만들었음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;time 컬럼도 마찬가지&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7rFhD/btsJG54d6Xv/e1rRpMMYEygj0yqGok4VQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7rFhD/btsJG54d6Xv/e1rRpMMYEygj0yqGok4VQk/img.png&quot; data-origin-width=&quot;232&quot; data-origin-height=&quot;54&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;9.89&quot; style=&quot;width: 9.77683%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7rFhD/btsJG54d6Xv/e1rRpMMYEygj0yqGok4VQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7rFhD%2FbtsJG54d6Xv%2Fe1rRpMMYEygj0yqGok4VQk%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;232&quot; height=&quot;54&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/urF7v/btsJGzxWU38/7456NnfSkbdYmTBwUc3Q30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/urF7v/btsJGzxWU38/7456NnfSkbdYmTBwUc3Q30/img.png&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;22&quot; data-is-animation=&quot;false&quot; style=&quot;width: 89.0604%;&quot; data-widthpercent=&quot;90.11&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/urF7v/btsJGzxWU38/7456NnfSkbdYmTBwUc3Q30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FurF7v%2FbtsJGzxWU38%2F7456NnfSkbdYmTBwUc3Q30%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;861&quot; height=&quot;22&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 테이블 조회할 때 member를 사용하면 나타나지 않음. '`'를 감싸줘야함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIXjck/btsJHxF8XQI/gmFLqLsKeIhnhUK0aGoHL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIXjck/btsJHxF8XQI/gmFLqLsKeIhnhUK0aGoHL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIXjck/btsJHxF8XQI/gmFLqLsKeIhnhUK0aGoHL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIXjck%2FbtsJHxF8XQI%2FgmFLqLsKeIhnhUK0aGoHL1%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;534&quot; height=&quot;278&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;time 컬럼에 기본값을 현재 시간으로 해두는 것이 편할 것 같다는 생각이 들었음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 ㄱㄱ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsXwRI/btsJGbj2RFI/ugO15XGOmAAP6ofkBItzpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsXwRI/btsJGbj2RFI/ugO15XGOmAAP6ofkBItzpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsXwRI/btsJGbj2RFI/ugO15XGOmAAP6ofkBItzpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsXwRI%2FbtsJGbj2RFI%2FugO15XGOmAAP6ofkBItzpk%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;787&quot; height=&quot;320&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정하는건 매번 헷갈린다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 뒤에 진도 나가기 전에 외워질때까지 정리해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 수정(alter table)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컬럼 추가 : alter table 테이블명 add 컬럼명 타입[(크기)]&lt;/li&gt;
&lt;li&gt;default 값 수정 : alter table 테이블명 add 컬럼명 타입[(크기)] default '값'&lt;/li&gt;
&lt;li&gt;컬럼 가장 앞 추가 : alter table 테이블명 add 컬럼명 타입[(크기)] frist&lt;/li&gt;
&lt;li&gt;특정 컬럼 뒤에 컬럼 추가 : alter table 테이블명 add 컬럼명 타입[(크기)] after 앞에 올 컬럼&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬럼수정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 타입 : alter table 테이블명 modify 컬럼명 변경할데이터타입&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;컬럼 사이즈 : alter table 테이블명 modify 컬럼명 타입(변경할컬럼사이즈)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;default값 변경 : alter table 테이블명 modify 컬럼명 타입[(크기)] default 변경값&lt;br /&gt;단, 기존 default 값이 변경되는 것이 아니라 이후에 입력되는 default값이 변경됨&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;컬럼명 변경 : alter table 테이블명 rename column 기존컬럼명 to 바꿀컬럼명&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;컬럼 삭제 : alter table 테이블명 drop 삭제할컬럼명&lt;br /&gt;단, FK 제약조건이 참조하는 부모 컬럼인 경우 제약조건을 먼저 삭제해야함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 게시판 테이블을 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dK7XiB/btsJFIPYP9m/ODYl1LpBYfSXmw5AkWVE70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dK7XiB/btsJFIPYP9m/ODYl1LpBYfSXmw5AkWVE70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dK7XiB/btsJFIPYP9m/ODYl1LpBYfSXmw5AkWVE70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdK7XiB%2FbtsJFIPYP9m%2FODYl1LpBYfSXmw5AkWVE70%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;633&quot; height=&quot;213&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Error&amp;nbsp;Code:&amp;nbsp;1215.&amp;nbsp;Cannot&amp;nbsp;add&amp;nbsp;foreign&amp;nbsp;key&amp;nbsp;constraint 0.016&amp;nbsp;sec&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;/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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Error Code 1215는 외부키를 생성하는 중 오류가 발생되는 거라는데 이를 해결하기 위해서는 오타, 문법오류, 외부키로 지정하는 컬럼이 기본키인지 여부&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 오타? 어찌보면 가장 하기 쉬우면서도 가장 찾기 힘든게 아닐까 싶다. 내가 봤을 때는 오타가 없다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 문법오류? 만약 문법 오류가 난다면 테이블 레벨 문법과 컬럼 레벨 문법일텐데 외래키는 테이블 레벨 문법이라 이게 맞는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member의 id가 PK이니 외부키로 지정하는 컬럼이 기본키 맞는데?&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;/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;create&amp;nbsp;table&amp;nbsp;board(&amp;nbsp;`no`&amp;nbsp;int&amp;nbsp;primary&amp;nbsp;key,&amp;nbsp;`subject`&amp;nbsp;varchar(50)&amp;nbsp;not&amp;nbsp;null,&amp;nbsp;content&amp;nbsp;varchar(1000),&amp;nbsp;id&amp;nbsp;varchar(20)&amp;nbsp;not&amp;nbsp;null&amp;nbsp;unique,&amp;nbsp;writetime&amp;nbsp;datetime&amp;nbsp;not&amp;nbsp;null&amp;nbsp;default&amp;nbsp;current_timestamp,&amp;nbsp;foreign&amp;nbsp;key(id)&amp;nbsp;references`member`(id))&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;create table 테이블명(컬럼명1 타입[(크기)] [제약조건][,...]);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제약조건&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;not null : null을 허용하지 않음&lt;/li&gt;
&lt;li&gt;unique : 중복값을 허용하지 않음 단, null값은 중복 허용&lt;/li&gt;
&lt;li&gt;primary key : 테이블의 행을 고유하게 식별해 줄 수 있는 대표컬럼, not null+unique&lt;/li&gt;
&lt;li&gt;foreign key&lt;br /&gt;두 테이블 사이의 관계를 선언함으로써 데이터의 무결성을 보장해주는 외래키 제약조건,&lt;br /&gt;자기 자신 테이블이나 다른 테이블의 특정 컬럼을 참조하는 제약조건, &lt;br /&gt;pk또는 unique 제약조건이 선언된 컬럼만 참조 가능&lt;br /&gt;FK가 선언된 컬럼을 자식컬럼이라고 함 &amp;harr; FK가 참조하는 컬럼 부모컬럼&lt;br /&gt;자식 컬럼에는 부모 컬럼에 있는 데이터 중 하나만 삽입, 수정될 수 있음&lt;br /&gt;테이블 레벨 문법 사용&lt;/li&gt;
&lt;li&gt;check : 해당 컬럼이 만족해야하는 조건을 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이거 저거 다 찾아봤는데 &amp;rarr; 문제는 오타였다... (생략)references`member`(id));라고 작성되어있는데 띄어쓰기 실수...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오타가 진짜 가장 어려운 것 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eNciSP/btsJGwIpmVT/6tLiXW9gKTrOK6PNp6hgVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eNciSP/btsJGwIpmVT/6tLiXW9gKTrOK6PNp6hgVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eNciSP/btsJGwIpmVT/6tLiXW9gKTrOK6PNp6hgVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeNciSP%2FbtsJGwIpmVT%2F6tLiXW9gKTrOK6PNp6hgVK%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;724&quot; height=&quot;529&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;529&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;한 두 달전에는 이거 만드는데 10분도 안 걸렸겠지만..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 수정도 까먹어서 truncate 했다가 delete했다가 별의 별 쇼를 다함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문뜩 truncate, delete가 나왔으니 다시 한 번 정리하고 가야겠다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접에서도 빈출이라는데 truncate, delete, drop의 차이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 DML, DDL이라 Auto-commit 유무 테이블의 데이터 삭제, 테이블 삭제 이렇게 되는 걸로 기억한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지는 기억이 잘 안 나는데 사실 기억 안난다. 정리하자&lt;/p&gt;
&lt;table style=&quot;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;width: 33.3333%;&quot;&gt;delete&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;drop&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;truncate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;DML로 commit, rollback할 수 있음&lt;/td&gt;
&lt;td style=&quot;width: 66.6666%;&quot; colspan=&quot;2&quot;&gt;DDL로 auto-commit을 내포하고 있어 한 번 실행하면 되돌릴 수 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;테이블의 특정 행 삭제&lt;br /&gt;where 절 생략 시 모든 행 삭제&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;테이블을 삭제&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;테이블의 모든 행 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;delete from 테이블명&lt;br /&gt;[where 조건]&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;drop table 테이블명&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;truncate table 테이블명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;롤백 가능&lt;/td&gt;
&lt;td style=&quot;width: 66.6666%;&quot; colspan=&quot;2&quot;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnGpGt/btsJHw8ri7t/iO8NbOy6HCabz4Sw2EzHDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnGpGt/btsJHw8ri7t/iO8NbOy6HCabz4Sw2EzHDK/img.png&quot; data-alt=&quot;delete&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnGpGt/btsJHw8ri7t/iO8NbOy6HCabz4Sw2EzHDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnGpGt%2FbtsJHw8ri7t%2FiO8NbOy6HCabz4Sw2EzHDK%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;631&quot; height=&quot;464&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;delete&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beMvw1/btsJGNJDs0z/X43m2CfQQBdcqlBtgBbkK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beMvw1/btsJGNJDs0z/X43m2CfQQBdcqlBtgBbkK0/img.png&quot; data-alt=&quot;truncate&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beMvw1/btsJGNJDs0z/X43m2CfQQBdcqlBtgBbkK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeMvw1%2FbtsJGNJDs0z%2FX43m2CfQQBdcqlBtgBbkK0%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;668&quot; height=&quot;345&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;truncate&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QUSH1/btsJF9mljsq/NFxBWql8WOCeoAI6Adceb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QUSH1/btsJF9mljsq/NFxBWql8WOCeoAI6Adceb1/img.png&quot; data-alt=&quot;drop&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QUSH1/btsJF9mljsq/NFxBWql8WOCeoAI6Adceb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQUSH1%2FbtsJF9mljsq%2FNFxBWql8WOCeoAI6Adceb1%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;632&quot; height=&quot;389&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;drop&lt;/figcaption&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;color: #222222; text-align: start;&quot;&gt;프로그램 설치(Maven), JDBC, xml 설정을 하도록해야겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;내가 생각했을 때 진짜 프로젝트를 시작할 때 가장 까다로운 작업이라고 생각든다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/281</guid>
      <comments>https://001cloudid.tistory.com/entry/justBoard2-DB%EA%B5%AC%EC%B6%95#entry281comment</comments>
      <pubDate>Fri, 20 Sep 2024 11:58:23 +0900</pubDate>
    </item>
    <item>
      <title>justBoard1 아주 간단한 기능 명세서, 스프링 버전 설정, 화면 구성</title>
      <link>https://001cloudid.tistory.com/entry/justBoard1-%EC%95%84%EC%A3%BC-%EA%B0%84%EB%8B%A8%ED%95%9C-%EA%B8%B0%EB%8A%A5-%EB%AA%85%EC%84%B8%EC%84%9C-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B2%84%EC%A0%84-%EC%84%A4%EC%A0%95-%ED%99%94%EB%A9%B4-%EA%B5%AC%EC%84%B1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;만들면서 혼잣말로 질문하고 대답하고 해결하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/thvSn/btsJGIAfjnF/fVIhHMMGnYasZP8lI1rA11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/thvSn/btsJGIAfjnF/fVIhHMMGnYasZP8lI1rA11/img.png&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;824&quot; data-is-animation=&quot;false&quot; style=&quot;width: 46.3956%; margin-right: 10px;&quot; data-widthpercent=&quot;46.94&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/thvSn/btsJGIAfjnF/fVIhHMMGnYasZP8lI1rA11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FthvSn%2FbtsJGIAfjnF%2FfVIhHMMGnYasZP8lI1rA11%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;583&quot; height=&quot;824&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U5XQR/btsJEnknnNz/kV4juLHSYk5mdZLjQE6kK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U5XQR/btsJEnknnNz/kV4juLHSYk5mdZLjQE6kK0/img.png&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;729&quot; data-is-animation=&quot;false&quot; style=&quot;width: 52.4416%;&quot; data-widthpercent=&quot;53.06&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U5XQR/btsJEnknnNz/kV4juLHSYk5mdZLjQE6kK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU5XQR%2FbtsJEnknnNz%2FkV4juLHSYk5mdZLjQE6kK0%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;583&quot; height=&quot;729&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;기능 및 주의사항&lt;/figcaption&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;2024.09.19 시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1일차 기본적인 화면 구성&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;1. 프로젝트 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우클릭 - New - Spring Legacy Project(Project Name : justBoard, Templates : Spring MVC Project) - com.mystory001.justboard&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;2. 버전 변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2FD4R/btsJEGYqaBD/1sPNcpP6ln5AjfwghutKy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2FD4R/btsJEGYqaBD/1sPNcpP6ln5AjfwghutKy1/img.png&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;670&quot; data-is-animation=&quot;false&quot; style=&quot;width: 52.2762%; margin-right: 10px;&quot; data-widthpercent=&quot;52.89&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2FD4R/btsJEGYqaBD/1sPNcpP6ln5AjfwghutKy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2FD4R%2FbtsJEGYqaBD%2F1sPNcpP6ln5AjfwghutKy1%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;991&quot; height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPWoG7/btsJEUa56zF/bkbULUgRiAHnlmnhsi5Oi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPWoG7/btsJEUa56zF/bkbULUgRiAHnlmnhsi5Oi0/img.png&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;753&quot; data-is-animation=&quot;false&quot; style=&quot;width: 46.561%;&quot; data-widthpercent=&quot;47.11&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPWoG7/btsJEUa56zF/bkbULUgRiAHnlmnhsi5Oi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPWoG7%2FbtsJEUa56zF%2FbkbULUgRiAHnlmnhsi5Oi0%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;992&quot; height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Properties&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CCNuL/btsJE3FK1mX/ewx6NjSRTQgsGNdJVYJmfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CCNuL/btsJE3FK1mX/ewx6NjSRTQgsGNdJVYJmfk/img.png&quot; data-alt=&quot;pom.xml&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CCNuL/btsJE3FK1mX/ewx6NjSRTQgsGNdJVYJmfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCCNuL%2FbtsJE3FK1mX%2Fewx6NjSRTQgsGNdJVYJmfk%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;1171&quot; height=&quot;357&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pom.xml&lt;/figcaption&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;3. Run as Server&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;999&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bosJCw/btsJEipZ8Cs/kYLxBV7GrNmLFI0pNkjFX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bosJCw/btsJEipZ8Cs/kYLxBV7GrNmLFI0pNkjFX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bosJCw/btsJEipZ8Cs/kYLxBV7GrNmLFI0pNkjFX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbosJCw%2FbtsJEipZ8Cs%2FkYLxBV7GrNmLFI0pNkjFX1%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;506&quot; height=&quot;527&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;999&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;4. main 페이지 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진짜 간만에 하려니까 하나도 기억이 잘 안남.. 하나하나 기억을 떠올리면서 30분간 만들기 시작..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 세로줄 긋기에서 막힘.&lt;/p&gt;
&lt;pre id=&quot;code_1726731571050&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.vl{

}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div style=&quot;float: right;&quot;&amp;gt; &amp;lt;!-- form태그를 오른쪽으로 --&amp;gt;
&amp;lt;form method=&quot;post&quot;&amp;gt;  &amp;lt;!-- post방식 --&amp;gt;
아이디 : &amp;lt;input type=&quot;text&quot; name=&quot;id&quot;&amp;gt;
비밀번호 : &amp;lt;input type=&quot;password&quot; name=&quot;pw&quot;&amp;gt;
&amp;lt;button type=&quot;submit&quot;&amp;gt;로그인 &amp;lt;/button&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;&amp;lt;button type=&quot;button&quot;&amp;gt;회원가입&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;hr&amp;gt;
&amp;lt;div class=&quot;vl&quot;&amp;gt;
&amp;lt;a href=&quot;#&quot;&amp;gt;게시판&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt; 
&amp;lt;a href=&quot;#&quot;&amp;gt;내 정보&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
dfdfdf
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;961&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2ZTRn/btsJF80ILk7/MRHmQGeBnV6kyS5oKfPZR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2ZTRn/btsJF80ILk7/MRHmQGeBnV6kyS5oKfPZR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2ZTRn/btsJF80ILk7/MRHmQGeBnV6kyS5oKfPZR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2ZTRn%2FbtsJF80ILk7%2FMRHmQGeBnV6kyS5oKfPZR1%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;961&quot; height=&quot;664&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결방법은 여러개 떠오르는데&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;div태그를 이용해서 영역을 잡고 그 영역안에 게시판, 내 정보를 넣고 &lt;br /&gt;본문 내용은 오른쪽에 div 태그를 이용하는 방법&lt;br /&gt;&amp;rarr; 가장 보편적이고 쉬운 방법&lt;/li&gt;
&lt;li&gt;table 태그를 이용하는 방법&lt;br /&gt;&amp;rarr; &amp;nbsp;어쨌든 table 태그를 이용한다고해도 div 태그로 감싸야하니까 1번을 이용해야함&lt;/li&gt;
&lt;li&gt;hr 태그를 세로로 바꾸는 방법&lt;br /&gt;&amp;rarr; 그런건 없단다 애송아..&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목록만들기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서 있는 목록을 만들 때 ordered list : ol 태그와 li 태그&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서 없는 목록을 만들 때 unordered list : ul 태그와 li 태그&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;rarr; 전체 영역을 만들고, 전체 영역 안에서 헤더, 사이드 바, 본문, 푸터 이런식으로 가야함&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;div태그 class=&quot;container&quot; &amp;rarr; 전체 영역&lt;/li&gt;
&lt;li&gt;div태그 class=&quot;header&quot; &amp;rarr; 로그인 영역&lt;/li&gt;
&lt;li&gt;div태그 class=&quot;sidebar&quot; &amp;rarr; 게시판 영역&lt;/li&gt;
&lt;li&gt;div태그 class=&quot;content&quot; &amp;rarr; 본문 영역&lt;/li&gt;
&lt;li&gt;div태그 class=&quot;footer&quot; &amp;rarr; 푸터 영역&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 완성함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m1J7O/btsJD8nEi02/UJWOSPyI7EpJA1eVu1Kpuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m1J7O/btsJD8nEi02/UJWOSPyI7EpJA1eVu1Kpuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m1J7O/btsJD8nEi02/UJWOSPyI7EpJA1eVu1Kpuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm1J7O%2FbtsJD8nEi02%2FUJWOSPyI7EpJA1eVu1Kpuk%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;1920&quot; height=&quot;692&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1726734987431&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}

.header{
	float : right;
	width: 1200px;
	height: 0px;
}

.sidebar{
	float : left;
	width: 200px;
	height: 500px;

}

.content{
	width: 1000px;
	height: 600px;
}

.footer{
	float : right;
	width: 1200px;
	height: 0px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;!-- container 영역 div --&amp;gt;

&amp;lt;div class=&quot;header&quot;&amp;gt; &amp;lt;!-- header 영역 div --&amp;gt;
&amp;lt;form method=&quot;post&quot;&amp;gt;  &amp;lt;!-- post방식 --&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;
아이디 : &amp;lt;input type=&quot;text&quot; name=&quot;id&quot;&amp;gt;
비밀번호 : &amp;lt;input type=&quot;password&quot; name=&quot;pw&quot;&amp;gt;
&amp;lt;button type=&quot;submit&quot;&amp;gt;로그인 &amp;lt;/button&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;&amp;lt;button type=&quot;button&quot;&amp;gt;회원가입&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- header 영역 div --&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;hr&amp;gt;

&amp;lt;div class=&quot;sidebar&quot;&amp;gt; &amp;lt;!-- sidebar 영역 div --&amp;gt;
&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;게시판&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; 
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;내 정보&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;!-- sidebar 영역 div --&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;!-- content영역 div --&amp;gt;
 내용은 여기에
&amp;lt;/div&amp;gt; &amp;lt;!-- content영역 div --&amp;gt;
&amp;lt;hr&amp;gt;
&amp;lt;div class=&quot;footer&quot;&amp;gt; &amp;lt;!-- footer 영역 div --&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;시작 날짜 : 2024.09.19 / 끝낸 날짜 : 2024.?.? / 만든이 : 001cloudid&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;!-- footer 영역 div --&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;!-- container 영역 div --&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;!-- 이 주석을 사용하면 우클릭-검사 했을 때 다 나타나니 보이지 않게 주석을 달면 괜찮겠다는 조언을 들음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1726735178163&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}

.header{
	float : right;
	width: 1200px;
	height: 0px;
}

.sidebar{
	float : left;
	width: 200px;
	height: 500px;

}

.content{
	width: 1000px;
	height: 600px;
}

.footer{
	float : right;
	width: 1200px;
	height: 0px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;div class=&quot;header&quot;&amp;gt; &amp;lt;%-- header 영역 div --%&amp;gt;
&amp;lt;form method=&quot;post&quot;&amp;gt;  &amp;lt;%-- post방식 --%&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;
아이디 : &amp;lt;input type=&quot;text&quot; name=&quot;id&quot;&amp;gt;
비밀번호 : &amp;lt;input type=&quot;password&quot; name=&quot;pw&quot;&amp;gt;
&amp;lt;button type=&quot;submit&quot;&amp;gt;로그인 &amp;lt;/button&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;&amp;lt;button type=&quot;button&quot;&amp;gt;회원가입&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;%-- header 영역 div --%&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;hr&amp;gt;

&amp;lt;div class=&quot;sidebar&quot;&amp;gt; &amp;lt;%-- sidebar 영역 div --%&amp;gt;
&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;게시판&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; 
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;내 정보&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- sidebar 영역 div --%&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
 내용은 여기에
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;hr&amp;gt;
&amp;lt;div class=&quot;footer&quot;&amp;gt; &amp;lt;%-- footer 영역 div --%&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;시작 날짜 : 2024.09.19 / 끝낸 날짜 : 2024.?.? / 만든이 : 001cloudid&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- footer 영역 div --%&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;만들고 나니 페이지 크기가 아쉽다.. 반응형 웹을 추가한다면 괜찮아보일지 한 번 코드를 추가해봄. form 태그에 action 속성이 빠짐을 추가&lt;/p&gt;
&lt;pre id=&quot;code_1726735589427&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;%-- 반응형 웹 viewport &amp;rarr; head태그 사이에 작성 --%&amp;gt;
&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;그냥 게시판&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;style&amp;gt;
.container{
	align-content : center;
	width: 1200px;
	height: 600px;
}

.header{
	float : right;
	width: 1200px;
	height: 0px;
}

.sidebar{
	float : left;
	width: 200px;
	height: 500px;

}

.content{
	width: 1000px;
	height: 600px;
}

.footer{
	float : right;
	width: 1200px;
	height: 0px;
}
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;

&amp;lt;div class=&quot;header&quot;&amp;gt; &amp;lt;%-- header 영역 div --%&amp;gt;
&amp;lt;form method=&quot;post&quot; action=&quot;&quot;&amp;gt;  &amp;lt;%-- post방식 --%&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;
아이디 : &amp;lt;input type=&quot;text&quot; name=&quot;id&quot;&amp;gt;
비밀번호 : &amp;lt;input type=&quot;password&quot; name=&quot;pw&quot;&amp;gt;
&amp;lt;button type=&quot;submit&quot;&amp;gt;로그인 &amp;lt;/button&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;&amp;lt;button type=&quot;button&quot;&amp;gt;회원가입&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/span&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;%-- header 영역 div --%&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;hr&amp;gt;

&amp;lt;div class=&quot;sidebar&quot;&amp;gt; &amp;lt;%-- sidebar 영역 div --%&amp;gt;
&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;게시판&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; 
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;내 정보&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- sidebar 영역 div --%&amp;gt;

&amp;lt;div class=&quot;content&quot;&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
 내용은 여기에
&amp;lt;/div&amp;gt; &amp;lt;%-- content영역 div --%&amp;gt;
&amp;lt;hr&amp;gt;
&amp;lt;div class=&quot;footer&quot;&amp;gt; &amp;lt;%-- footer 영역 div --%&amp;gt;
&amp;lt;span style=&quot;float: right;&quot;&amp;gt;시작 날짜 : 2024.09.19 / 끝낸 날짜 : 2024.?.? / 만든이 : 001cloudid&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- footer 영역 div --%&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;%-- container 영역 div --%&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과를 확인해보니 그다지 큰 차이가 없다. &amp;rarr; 아마도 div영역에 너비(width)와 높이(height)를 고정해서 작성해서 그런 것 같다. 일단은 내용을 꾸미면서 크기 조정을 하도록 할 예정&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. DB 구축 &amp;rarr; 사실 DB 구축을 먼저하고 해야하는데 워낙 계획없이 했기 때문에 수시로 DB도 수정해야할 것 같아서 일단 내일 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 게시판 &amp;rarr; 게시판 내용을 보는 페이지, 게시판 목록을 보는 페이지(페이징 처리 필요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 내 정보 &amp;rarr; 아무래도 내 정보는 로그인을 했을 때 우측 상단에 로그아웃 버튼 옆에 만들기 위치 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rarr; 내 정보보기, 내 정보 수정, 회원 탈퇴 등...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 프로그램 설치(Maven), JDBC, xml 설정&lt;/p&gt;</description>
      <category>organize/프로젝트</category>
      <author>001cloudid</author>
      <guid isPermaLink="true">https://001cloudid.tistory.com/280</guid>
      <comments>https://001cloudid.tistory.com/entry/justBoard1-%EC%95%84%EC%A3%BC-%EA%B0%84%EB%8B%A8%ED%95%9C-%EA%B8%B0%EB%8A%A5-%EB%AA%85%EC%84%B8%EC%84%9C-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B2%84%EC%A0%84-%EC%84%A4%EC%A0%95-%ED%99%94%EB%A9%B4-%EA%B5%AC%EC%84%B1#entry280comment</comments>
      <pubDate>Thu, 19 Sep 2024 17:55:36 +0900</pubDate>
    </item>
  </channel>
</rss>