<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>makeaplayground</title>
    <link>https://makeaplayground.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 6 Jul 2026 22:30:31 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor> 토희</managingEditor>
    <item>
      <title>Github 이슈 라벨(issue labels)</title>
      <link>https://makeaplayground.tistory.com/339</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;p data-ke-size=&quot;size16&quot;&gt;Github 이슈 라벨(issue labels) 의미들&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-21 오후 8.07.52.png&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7dWcj/btsCrXZWBYT/sj87Imk9Tcjsg8rELficRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7dWcj/btsCrXZWBYT/sj87Imk9Tcjsg8rELficRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7dWcj/btsCrXZWBYT/sj87Imk9Tcjsg8rELficRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7dWcj%2FbtsCrXZWBYT%2Fsj87Imk9Tcjsg8rELficRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;436&quot; data-filename=&quot;스크린샷 2023-12-21 오후 8.07.52.png&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;570&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;table style=&quot;border-collapse: collapse; width: 99.7674%; height: 347px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px; text-align: center;&quot;&gt;&lt;b&gt;label&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px; text-align: center;&quot;&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;bug&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;예기치&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt; 않은 문제 또는 의도하지 않은 동작(버그)을 나타냅니다&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;documentation&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;문서를 개선하거나 추가 할 필요가 있음을 나타냅니다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;duplicate&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;해당 이슈 또는 PR이 기존에 있음을 나타냅니다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;enhancement&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;새로운 기능 요청을 나타냅니다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;good first issue&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;처음 기여해볼 사람에게 좋은 문제를 나타냅니다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;help wanted&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;관리자가 문제 또는 PR 요청에 대한 도움을 원함을 나타냅니다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;invalid&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이슈 또는 PR 요청이 더 이상 관련이 없음을 나타냅니다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;question&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이슈 또는 풀 요청에 추가 정보가 필요함을 나타냅니다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;wontfix&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문제나 PR 요청에서 작업이 계속되지 않음을 나타냅니다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;enhancement, bug 밖에 안 쓰게 됨&lt;/p&gt;</description>
      <category>IT/github</category>
      <category>Bug</category>
      <category>Enhancement</category>
      <category>Github</category>
      <category>issuelabels</category>
      <category>Labels</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/339</guid>
      <comments>https://makeaplayground.tistory.com/339#entry339comment</comments>
      <pubDate>Thu, 21 Dec 2023 20:16:14 +0900</pubDate>
    </item>
    <item>
      <title>Swagger 적용 후, 화이트라벨 오류 ( Springboot 3.x 이슈 )</title>
      <link>https://makeaplayground.tistory.com/338</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트에 OpenApi(Swagger)를 적용하고,&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;http://localhost:8080/swagger-ui/index.html 접속하니 화이트라벨 오류가 뜬다. 왜지?!!!!! &lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;기존에 스웨거 잘 적용되어 있는 타 프로젝트 코드를 들고 왔는데, 왜 안되지&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;한참을 구글링하다가 이번 프로젝트는 스프링부트 3.x으로 설정 했다는게 생각났다&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;기존&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1703156342517&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
    implementation 'org.springdoc:springdoc-openapi-ui:1.6.9'
}&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_1703156394167&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;


@Configuration
public class SwaggerConfig {
    @Bean
    public OpenAPI openAPI() {
        Info info = new Info()
                .title(&quot;test api&quot;)
                .version(&quot;v1&quot;)
                .description(&quot;test api&quot;);
        SecurityScheme securityScheme = new SecurityScheme()
                .type(SecurityScheme.Type.APIKEY)
                .scheme(&quot;apiKey&quot;)
                .name(&quot;Authorization&quot;)
                .in(SecurityScheme.In.HEADER);
        SecurityRequirement securityRequirement = new SecurityRequirement().addList(&quot;Auth&quot;);
        return new OpenAPI().components(new Components().addSecuritySchemes(&quot;Auth&quot;, securityScheme))
                .info(info)
                .security(Arrays.asList(securityRequirement));
    }
}&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;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;변경&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SwaggerConfig는 동일하고&lt;/b&gt;, dependencies를 변경해줬다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링부트 3.x 버전에서는 아래 종속성으로 사용하기!&lt;/p&gt;
&lt;pre id=&quot;code_1703156543213&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
    implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.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;&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;참고사이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@kjgi73k/Springboot3%EC%97%90-Swagger3%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@kjgi73k/Springboot3%EC%97%90-Swagger3%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1703156591588&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Springboot 3.x에 Swagger를 적용시켜보자!&quot; data-og-description=&quot;Springboot 3.0.1에서 Swagger 3.0.0을 적용 중 발생하는 에러들을 해결해 보자&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@kjgi73k/Springboot3%EC%97%90-Swagger3%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0&quot; data-og-url=&quot;https://velog.io/@kjgi73k/Springboot3에-Swagger3적용하기&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/3JZll/hyUPK8UPN3/USKk4nKv0N9jeZqHvvDk60/img.png?width=186&amp;amp;height=186&amp;amp;face=0_0_186_186,https://scrap.kakaocdn.net/dn/b5UfrH/hyUPIiY1iE/5cymkDNw7OketLtxhAe0s1/img.png?width=186&amp;amp;height=186&amp;amp;face=0_0_186_186,https://scrap.kakaocdn.net/dn/xfd0Y/hyUPEt7Gg4/lTNjGTkaZas4LAabdk3nL0/img.png?width=1415&amp;amp;height=371&amp;amp;face=0_0_1415_371&quot;&gt;&lt;a href=&quot;https://velog.io/@kjgi73k/Springboot3%EC%97%90-Swagger3%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@kjgi73k/Springboot3%EC%97%90-Swagger3%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/3JZll/hyUPK8UPN3/USKk4nKv0N9jeZqHvvDk60/img.png?width=186&amp;amp;height=186&amp;amp;face=0_0_186_186,https://scrap.kakaocdn.net/dn/b5UfrH/hyUPIiY1iE/5cymkDNw7OketLtxhAe0s1/img.png?width=186&amp;amp;height=186&amp;amp;face=0_0_186_186,https://scrap.kakaocdn.net/dn/xfd0Y/hyUPEt7Gg4/lTNjGTkaZas4LAabdk3nL0/img.png?width=1415&amp;amp;height=371&amp;amp;face=0_0_1415_371');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Springboot 3.x에 Swagger를 적용시켜보자!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Springboot 3.0.1에서 Swagger 3.0.0을 적용 중 발생하는 에러들을 해결해 보자&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/error</category>
      <category>SWAGGER</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/338</guid>
      <comments>https://makeaplayground.tistory.com/338#entry338comment</comments>
      <pubDate>Thu, 21 Dec 2023 20:05:29 +0900</pubDate>
    </item>
    <item>
      <title>MyBatis 오류: Invalid bound statement (not found), properties 경로 오류</title>
      <link>https://makeaplayground.tistory.com/334</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;p data-ke-size=&quot;size16&quot;&gt;애플리케이션을 실행하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;restapi를 postman으로 테스트 하는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Invalid bound statement (not found): com.example.example.user.UserMapper.findByUsername 오류 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나 같은 경우는 application.properties에 경로가 잘못 되어있었다&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-22 오후 2.11.24.png&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RNL05/btsAK8hdWAL/6oRpXosJdKeGvfx4KytBQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RNL05/btsAK8hdWAL/6oRpXosJdKeGvfx4KytBQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RNL05/btsAK8hdWAL/6oRpXosJdKeGvfx4KytBQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRNL05%2FbtsAK8hdWAL%2F6oRpXosJdKeGvfx4KytBQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;214&quot; data-filename=&quot;스크린샷 2023-11-22 오후 2.11.24.png&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;214&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;xml 경로가 이렇게 되어있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;properties에는 아래처럼 되어있었다&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-22 오후 2.08.11.png&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;54&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coSdhp/btsALVu9TQt/bPRp5EMjk7odeKauQcXl91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coSdhp/btsALVu9TQt/bPRp5EMjk7odeKauQcXl91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coSdhp/btsALVu9TQt/bPRp5EMjk7odeKauQcXl91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoSdhp%2FbtsALVu9TQt%2FbPRp5EMjk7odeKauQcXl91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;54&quot; data-filename=&quot;스크린샷 2023-11-22 오후 2.08.11.png&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;54&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-22 오후 2.08.05.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;54&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cd1AO/btsALJnYf5F/LTEtSypx2gZE4cccjRrAvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cd1AO/btsALJnYf5F/LTEtSypx2gZE4cccjRrAvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cd1AO/btsALJnYf5F/LTEtSypx2gZE4cccjRrAvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCd1AO%2FbtsALJnYf5F%2FLTEtSypx2gZE4cccjRrAvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;780&quot; height=&quot;54&quot; data-filename=&quot;스크린샷 2023-11-22 오후 2.08.05.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;54&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;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/error</category>
      <category>mybatis</category>
      <category>mybatis오류</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/334</guid>
      <comments>https://makeaplayground.tistory.com/334#entry334comment</comments>
      <pubDate>Wed, 22 Nov 2023 14:13:40 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] 스프링부트 의존성1 - spring-boot-starter-validation</title>
      <link>https://makeaplayground.tistory.com/333</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;DTO에서 유효성 검사를 하고 싶을때 spring-boot-starter-validation 를 추가해준다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-17 오후 2.03.41.png&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CJFFc/btsAs8JuJjs/wjO1fzgaQz2Hc6w4exZbvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CJFFc/btsAs8JuJjs/wjO1fzgaQz2Hc6w4exZbvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CJFFc/btsAs8JuJjs/wjO1fzgaQz2Hc6w4exZbvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCJFFc%2FbtsAs8JuJjs%2FwjO1fzgaQz2Hc6w4exZbvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;301&quot; data-filename=&quot;스크린샷 2023-11-17 오후 2.03.41.png&quot; data-origin-width=&quot;914&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;의존성 추가&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1700197807116&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Gradle
implementation 'org.springframework.boot:spring-boot-starter-validation'

// Maven
&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;spring-boot-starter-validation&amp;lt;/artifactId&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-filename=&quot;스크린샷 2023-11-17 오후 2.03.58.png&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mnEuk/btsAwpXLkyg/fkfQ9z06SpuHsy8VWRx301/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mnEuk/btsAwpXLkyg/fkfQ9z06SpuHsy8VWRx301/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mnEuk/btsAwpXLkyg/fkfQ9z06SpuHsy8VWRx301/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmnEuk%2FbtsAwpXLkyg%2FfkfQ9z06SpuHsy8VWRx301%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1358&quot; height=&quot;166&quot; data-filename=&quot;스크린샷 2023-11-17 오후 2.03.58.png&quot; data-origin-width=&quot;1358&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;2.7.6버전으로 넣어줌&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-filename=&quot;스크린샷 2023-11-17 오후 2.04.31.png&quot; data-origin-width=&quot;2088&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GsMw6/btsAry2O8II/LBK1wflYLq6WxFDF5FULm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GsMw6/btsAry2O8II/LBK1wflYLq6WxFDF5FULm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GsMw6/btsAry2O8II/LBK1wflYLq6WxFDF5FULm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGsMw6%2FbtsAry2O8II%2FLBK1wflYLq6WxFDF5FULm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2088&quot; height=&quot;488&quot; data-filename=&quot;스크린샷 2023-11-17 오후 2.04.31.png&quot; data-origin-width=&quot;2088&quot; data-origin-height=&quot;488&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-17 오후 2.04.38.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6B51M/btsAvsf73Am/yPERJdvMoOab51iYDlolKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6B51M/btsAvsf73Am/yPERJdvMoOab51iYDlolKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6B51M/btsAvsf73Am/yPERJdvMoOab51iYDlolKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6B51M%2FbtsAvsf73Am%2FyPERJdvMoOab51iYDlolKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;336&quot; data-filename=&quot;스크린샷 2023-11-17 오후 2.04.38.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;654&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;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;자주 사용하는 어노테이션&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@NotNull - &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;해당 값에 Null을 허용하지 않음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@NotBlank - &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;Null을 허용하지 않으며 문자가 한 개 이상 포함되어야 함 (공백 제외)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@NotEmpty - &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;Null을 허용하지 않으며 공백 문자열을 허용하지 않음&lt;/span&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-filename=&quot;스크린샷 2023-11-18 오후 10.18.22.png&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3eDo6/btsAxiLPt8y/rYYEJslREKoB0Ogu4OHmF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3eDo6/btsAxiLPt8y/rYYEJslREKoB0Ogu4OHmF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3eDo6/btsAxiLPt8y/rYYEJslREKoB0Ogu4OHmF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3eDo6%2FbtsAxiLPt8y%2FrYYEJslREKoB0Ogu4OHmF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;94&quot; data-filename=&quot;스크린샷 2023-11-18 오후 10.18.22.png&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;94&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;@Size - 최소, 최대 사이즈 지정 가능, 값이 Max 와 Min 사이에 있는지 확인 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Max - &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;값이 Max보다 큰지 확인&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Min - &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;값이 Min보다 작은지 확인&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>IT/spring</category>
      <category>@Max</category>
      <category>@Min</category>
      <category>@NotBlank</category>
      <category>@NotEmpty</category>
      <category>@NotNull</category>
      <category>@Size</category>
      <category>spring-boot-starter-validation</category>
      <category>validation</category>
      <category>어노테이션</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/333</guid>
      <comments>https://makeaplayground.tistory.com/333#entry333comment</comments>
      <pubDate>Sat, 18 Nov 2023 22:20:44 +0900</pubDate>
    </item>
    <item>
      <title>Spring Boot 3.x 실행이 안될 경우</title>
      <link>https://makeaplayground.tistory.com/332</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-17 오후 12.41.49.png&quot; data-origin-width=&quot;2220&quot; data-origin-height=&quot;1144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qngiE/btsAs7i8xHV/HAWLnGuUVpIpJKJbhVOrL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qngiE/btsAs7i8xHV/HAWLnGuUVpIpJKJbhVOrL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qngiE/btsAs7i8xHV/HAWLnGuUVpIpJKJbhVOrL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqngiE%2FbtsAs7i8xHV%2FHAWLnGuUVpIpJKJbhVOrL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2220&quot; height=&quot;1144&quot; data-filename=&quot;스크린샷 2023-11-17 오후 12.41.49.png&quot; data-origin-width=&quot;2220&quot; data-origin-height=&quot;1144&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;회사 타프로젝트를 서포팅해주라는 얘기를 듣고 깃에서 clone을 했는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Gradle Import를 하니 위와 같은 에러가 뜬다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;No&amp;nbsp;matching&amp;nbsp;variant&amp;nbsp;of&amp;nbsp;org.springframework.boot:spring-boot-gradle-plugin:3.1.5&amp;nbsp;was&amp;nbsp;found&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-17 오후 12.42.47.png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R2kCc/btsAp06t4vc/OnMt0atziazrzTkHZMUUO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R2kCc/btsAp06t4vc/OnMt0atziazrzTkHZMUUO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R2kCc/btsAp06t4vc/OnMt0atziazrzTkHZMUUO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR2kCc%2FbtsAp06t4vc%2FOnMt0atziazrzTkHZMUUO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;444&quot; height=&quot;558&quot; data-filename=&quot;스크린샷 2023-11-17 오후 12.42.47.png&quot; data-origin-width=&quot;946&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글링해보니, 스프링부트 3.x 버전은&amp;nbsp;&lt;b&gt;Java 17부터 지원&lt;/b&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;된다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;나는 Java11로 구동시킬려고 하니, 오류가 발생했다&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #555555;&quot;&gt;해결방법&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;1. 스프링부트 다운그레이트&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;2. Java 17 버전 설치&lt;/span&gt;&lt;/h4&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;회사 동기랑 얘기해서 프로젝트를 11버전으로 바꾸기로 했다&lt;/p&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>IT/error</category>
      <category>Spring Boot 구동오류</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/332</guid>
      <comments>https://makeaplayground.tistory.com/332#entry332comment</comments>
      <pubDate>Fri, 17 Nov 2023 13:26:50 +0900</pubDate>
    </item>
    <item>
      <title>[Redis] 레디스 명령어 정리 redis-cli</title>
      <link>https://makeaplayground.tistory.com/331</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;지난 글에서 M1에서 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Embedded Redis 실행이 안되는 이유를 알아봣다&lt;/span&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;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;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-31 오후 2.29.21.png&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nSgXN/btszuF2DHmV/IMLozOzcG8mXvWRFubn8Fk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nSgXN/btszuF2DHmV/IMLozOzcG8mXvWRFubn8Fk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nSgXN/btszuF2DHmV/IMLozOzcG8mXvWRFubn8Fk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnSgXN%2FbtszuF2DHmV%2FIMLozOzcG8mXvWRFubn8Fk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1706&quot; height=&quot;48&quot; data-filename=&quot;스크린샷 2023-10-31 오후 2.29.21.png&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;48&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;6379가 Redis 기본 포트인데, 결국 Redis에 연결할 수 없다는 거다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 Redis 실행하는 명령어는 어떻게 될까&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Redis 디렉토리로 이동&lt;/p&gt;
&lt;pre id=&quot;code_1698730277798&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd redis-6.0.10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;Redis 서버 실행&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1698730308668&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo src/redis-server&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Embedded Redis오&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-31 오후 2.32.43.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;930&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FzhhO/btszuwriTV4/gtiJBgSGIvhM1flZCKAGQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FzhhO/btszuwriTV4/gtiJBgSGIvhM1flZCKAGQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FzhhO/btszuwriTV4/gtiJBgSGIvhM1flZCKAGQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFzhhO%2FbtszuwriTV4%2FgtiJBgSGIvhM1flZCKAGQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;599&quot; height=&quot;930&quot; data-filename=&quot;스크린샷 2023-10-31 오후 2.32.43.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;930&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Embedded Redis&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 실행되었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행된 상태에서 터미널 창을 하나 더 열어서( command + t )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;redis-cli 접속하기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698730666490&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;src/redis-cli&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2023-10-31 오후 2.38.33.png&quot; data-origin-width=&quot;1712&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQJ69J/btszvhN25h9/sXeKpGthuix01opn8WYXs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQJ69J/btszvhN25h9/sXeKpGthuix01opn8WYXs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQJ69J/btszvhN25h9/sXeKpGthuix01opn8WYXs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQJ69J%2FbtszvhN25h9%2FsXeKpGthuix01opn8WYXs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1712&quot; height=&quot;286&quot; data-filename=&quot;edited_스크린샷 2023-10-31 오후 2.38.33.png&quot; data-origin-width=&quot;1712&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;채널 확인&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1698730536720&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pubsub channels&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-31 오후 2.39.36.png&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3IkNw/btszvC5E8Ko/Q2SC8JkSfKn2I1m06ycKGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3IkNw/btszvC5E8Ko/Q2SC8JkSfKn2I1m06ycKGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3IkNw/btszvC5E8Ko/Q2SC8JkSfKn2I1m06ycKGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3IkNw%2FbtszvC5E8Ko%2FQ2SC8JkSfKn2I1m06ycKGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;62&quot; data-filename=&quot;스크린샷 2023-10-31 오후 2.39.36.png&quot; data-origin-width=&quot;482&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f3c000; color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;채널 구독자수 확인&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1698730858478&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pubsub numsub [채널명]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-31 오후 2.41.53.png&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkjGgp/btszveKGs1D/CRUq9ikkxt00Ym0A2KSmnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkjGgp/btszveKGs1D/CRUq9ikkxt00Ym0A2KSmnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkjGgp/btszveKGs1D/CRUq9ikkxt00Ym0A2KSmnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkjGgp%2FbtszveKGs1D%2FCRUq9ikkxt00Ym0A2KSmnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;128&quot; data-filename=&quot;스크린샷 2023-10-31 오후 2.41.53.png&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채널을 만들어 주고, 구독한 상태에서 &lt;span&gt;pubsub numsub 57668f49-a6ed-4bd9-8c27-03aa35a256c7 하면은&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;구독자 1인 거를 확인 할 수 있다&lt;/span&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-filename=&quot;스크린샷 2023-10-31 오후 2.43.18.png&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV4YNn/btszpAAZqBD/Wpd4zV8DISVAugMK4L8zV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV4YNn/btszpAAZqBD/Wpd4zV8DISVAugMK4L8zV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV4YNn/btszpAAZqBD/Wpd4zV8DISVAugMK4L8zV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV4YNn%2FbtszpAAZqBD%2FWpd4zV8DISVAugMK4L8zV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;94&quot; data-filename=&quot;스크린샷 2023-10-31 오후 2.43.18.png&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;94&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;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start; background-color: #f3c000;&quot;&gt;채널 구독하기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1698731147333&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;subscribe [채널명]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-31 오후 2.47.35.png&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDRJRA/btszyM0uruz/ytr2k4KPemKAgWl6822T31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDRJRA/btszyM0uruz/ytr2k4KPemKAgWl6822T31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDRJRA/btszyM0uruz/ytr2k4KPemKAgWl6822T31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDRJRA%2FbtszyM0uruz%2Fytr2k4KPemKAgWl6822T31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;882&quot; height=&quot;142&quot; data-filename=&quot;스크린샷 2023-10-31 오후 2.47.35.png&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;142&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;인텔리제이 실행 후 local 에서 메세지를 보내면 레디스 서버에 직렬화되서 메세지가 날라오는거를 확인할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;채널에 메세지 보내기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1698731730965&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;publish [채널명] [메세지명]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널을 한개는 57668f49-a6ed-4bd9-8c27-03aa35a256c7 채널을 구독한 상태에서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 터미널에서 publish 57668f49-a6ed-4bd9-8c27-03aa35a256c7 Hello 로 메세지를 보내면 구독한 터미널에 바로 메세지가 가는걸 확인할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&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;참고로 인텔리제이에서 실행한 화면에는 메세지가 안 뜸... 왜냐면 코드에서 메세지를 json 형식으로 보내는걸로 했는데, String 으로 보냈기 때문이다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-31 오후 3.03.46.png&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVBkNS/btszyL1DJRK/O7Mqf9kuglXHeLTDBxTHp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVBkNS/btszyL1DJRK/O7Mqf9kuglXHeLTDBxTHp0/img.png&quot; data-alt=&quot;Hello가 안 뜨고 그대로임&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVBkNS/btszyL1DJRK/O7Mqf9kuglXHeLTDBxTHp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVBkNS%2FbtszyL1DJRK%2FO7Mqf9kuglXHeLTDBxTHp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;177&quot; data-filename=&quot;스크린샷 2023-10-31 오후 3.03.46.png&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Hello가 안 뜨고 그대로임&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-31 오후 3.01.44.png&quot; data-origin-width=&quot;2590&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc7dcl/btszyKV3Fo7/rbNy6XLCOIVUuKvOPdPciK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc7dcl/btszyKV3Fo7/rbNy6XLCOIVUuKvOPdPciK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc7dcl/btszyKV3Fo7/rbNy6XLCOIVUuKvOPdPciK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc7dcl%2FbtszyKV3Fo7%2FrbNy6XLCOIVUuKvOPdPciK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2590&quot; height=&quot;640&quot; data-filename=&quot;스크린샷 2023-10-31 오후 3.01.44.png&quot; data-origin-width=&quot;2590&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 오류 발생, 아래 objectMapper.readValue 에서 터짐&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-filename=&quot;스크린샷 2023-10-31 오후 3.05.15.png&quot; data-origin-width=&quot;1808&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQAil3/btszvFg1Mga/czaQUuRK2mvFhMmGsAbKv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQAil3/btszvFg1Mga/czaQUuRK2mvFhMmGsAbKv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQAil3/btszvFg1Mga/czaQUuRK2mvFhMmGsAbKv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQAil3%2FbtszvFg1Mga%2FczaQUuRK2mvFhMmGsAbKv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1808&quot; height=&quot;600&quot; data-filename=&quot;스크린샷 2023-10-31 오후 3.05.15.png&quot; data-origin-width=&quot;1808&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;&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;구독한 채널 해제&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1698732766891&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;unsubscribe [채널명]&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-filename=&quot;스크린샷 2023-10-31 오후 3.14.10.png&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dur5YC/btszyMlV1Ca/TELUnx1Z7Ye8ThslO7XXZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dur5YC/btszyMlV1Ca/TELUnx1Z7Ye8ThslO7XXZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dur5YC/btszyMlV1Ca/TELUnx1Z7Ye8ThslO7XXZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdur5YC%2FbtszyMlV1Ca%2FTELUnx1Z7Ye8ThslO7XXZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;916&quot; height=&quot;164&quot; data-filename=&quot;스크린샷 2023-10-31 오후 3.14.10.png&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;164&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; background-color: #f3c000;&quot;&gt;&lt;b&gt;Redis 서버 끄기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-31 오후 2.32.43.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;930&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FzhhO/btszuwriTV4/gtiJBgSGIvhM1flZCKAGQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FzhhO/btszuwriTV4/gtiJBgSGIvhM1flZCKAGQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FzhhO/btszuwriTV4/gtiJBgSGIvhM1flZCKAGQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFzhhO%2FbtszuwriTV4%2FgtiJBgSGIvhM1flZCKAGQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;599&quot; height=&quot;930&quot; data-filename=&quot;스크린샷 2023-10-31 오후 2.32.43.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;930&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;터미널에서 control + c 하면 된다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;bye bye... 라고 뜸&lt;/span&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-filename=&quot;스크린샷 2023-10-31 오후 3.28.46.png&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvWnPy/btszy7KagEM/JzpTF1SmFJiav8h8DL4u51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvWnPy/btszy7KagEM/JzpTF1SmFJiav8h8DL4u51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvWnPy/btszy7KagEM/JzpTF1SmFJiav8h8DL4u51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvWnPy%2Fbtszy7KagEM%2FJzpTF1SmFJiav8h8DL4u51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;120&quot; data-filename=&quot;스크린샷 2023-10-31 오후 3.28.46.png&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;120&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로 Redis의 명령어를 알아봤다&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-PUBSUB-%EA%B8%B0%EB%8A%A5-%EC%86%8C%EA%B0%9C-%EC%B1%84%ED%8C%85-%EA%B5%AC%EB%8F%85-%EC%95%8C%EB%A6%BC&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-PUBSUB-%EA%B8%B0%EB%8A%A5-%EC%86%8C%EA%B0%9C-%EC%B1%84%ED%8C%85-%EA%B5%AC%EB%8F%85-%EC%95%8C%EB%A6%BC&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698732975512&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot; ️ REDIS의 PUB/SUB 기능 (채팅 / 구독 알림)&quot; data-og-description=&quot;Redis Publish / Subscribe Publish / Subscribe 란 특정한 주제(topic)에 대하여 해당 topic을 구독한 모두에게 메시지를 발행하는 통신 방법으로 채널을 구독한 수신자(클라이언트) 모두에게 메세지를 전송 하&quot; data-og-host=&quot;inpa.tistory.com&quot; data-og-source-url=&quot;https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-PUBSUB-%EA%B8%B0%EB%8A%A5-%EC%86%8C%EA%B0%9C-%EC%B1%84%ED%8C%85-%EA%B5%AC%EB%8F%85-%EC%95%8C%EB%A6%BC&quot; data-og-url=&quot;https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-PUBSUB-%EA%B8%B0%EB%8A%A5-%EC%86%8C%EA%B0%9C-%EC%B1%84%ED%8C%85-%EA%B5%AC%EB%8F%85-%EC%95%8C%EB%A6%BC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bXeskj/hyUnLme1iL/NyvaUCBHtZCzqXpAAXKFEk/img.jpg?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/WZesx/hyUnNK9oc0/rT0wtPK8AIMxADKukK8Fp1/img.jpg?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/b4nSu9/hyUkbfUjQB/nkeMJ2804pWKajctdXe4OK/img.png?width=1486&amp;amp;height=656&amp;amp;face=0_0_1486_656&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-PUBSUB-%EA%B8%B0%EB%8A%A5-%EC%86%8C%EA%B0%9C-%EC%B1%84%ED%8C%85-%EA%B5%AC%EB%8F%85-%EC%95%8C%EB%A6%BC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-PUBSUB-%EA%B8%B0%EB%8A%A5-%EC%86%8C%EA%B0%9C-%EC%B1%84%ED%8C%85-%EA%B5%AC%EB%8F%85-%EC%95%8C%EB%A6%BC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bXeskj/hyUnLme1iL/NyvaUCBHtZCzqXpAAXKFEk/img.jpg?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/WZesx/hyUnNK9oc0/rT0wtPK8AIMxADKukK8Fp1/img.jpg?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/b4nSu9/hyUkbfUjQB/nkeMJ2804pWKajctdXe4OK/img.png?width=1486&amp;amp;height=656&amp;amp;face=0_0_1486_656');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt; ️ REDIS의 PUB/SUB 기능 (채팅 / 구독 알림)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Redis Publish / Subscribe Publish / Subscribe 란 특정한 주제(topic)에 대하여 해당 topic을 구독한 모두에게 메시지를 발행하는 통신 방법으로 채널을 구독한 수신자(클라이언트) 모두에게 메세지를 전송 하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;inpa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/etc</category>
      <category>redis</category>
      <category>redis명령어</category>
      <category>레디스</category>
      <category>채팅기능</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/331</guid>
      <comments>https://makeaplayground.tistory.com/331#entry331comment</comments>
      <pubDate>Tue, 31 Oct 2023 15:18:25 +0900</pubDate>
    </item>
    <item>
      <title>[Redis] Mac M1에서 Embedded Redis를 실행하지 못하는 이유와 해결 방법</title>
      <link>https://makeaplayground.tistory.com/330</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 회사 팀원들끼리 Redis로 채팅 기능을 구현해보기로 했다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedded Redis config는 셋팅해서 똑같은 환경에서 작업하기로 했는데,&lt;/p&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;M1에서 Embedded Redis를 실행하려고 해서 였다&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;M1에서 Embedded Redis 실행하지 못하는 이유&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis가 M1의 ARM 프로세서 아키텍처에서 실행되는 것을 지원하지 않기 때문이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedded Redis는 애플리이션이 실행될 때 자동으로 시작되고, 애플리케이션이 종료될 때 Redis도 종료된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Redis가 ARM 프로세서 아키텍처에서 실행되지 않기 때문에 M1에서 Embedded Redis 실행 할 수 없다&lt;/p&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;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;해결방법&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 Redis를 터미널에서 다운받았다&lt;/p&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;- Redis 다운로드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698729165747&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wget https://download.redis.io/releases/redis-6.0.10.tar.gz&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;wget 명령어가 오류가 난다면 brew&amp;nbsp;install&amp;nbsp;wget&lt;/p&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;- 다운 받은 Redis 파일 압축 해제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698729304274&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tar -xzf redis-6.0.10.tar.gz&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;- 압축을 해제한 Redis 디렉토리로 이동&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698729383165&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd redis-6.0.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;&lt;b&gt;- Redis를 컴파일한다. make는 소스 코드에서 실행파일을 만드는 명령어이다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698729473307&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;make&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;- Redis 서버 시작&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698729627075&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;src/redis-server&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;권한 오류가 발생하면 앞에 sudo 를 붙혀 sudo src/redis-server로&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;RedisConfig.java&lt;/p&gt;
&lt;pre id=&quot;code_1698730079988&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
public class RedisConfig {
   @Bean
    public RedisConnectionFactory redisConnectionFactory(){
       return new LettuceConnectionFactory(&quot;localhost&quot;, 6379);
   }
}&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;&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Redis 명령어 정리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://makeaplayground.tistory.com/331&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://makeaplayground.tistory.com/331&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699782771647&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Redis] 레디스 명령어 정리 redis-cli&quot; data-og-description=&quot;지난 글에서 M1에서 Embedded Redis 실행이 안되는 이유를 알아봣다 터미널에서 직접 다운 받은 레디스를 활용하는 방법을 알아보도록 하겠다 우선 레디스 서버를 실행하지 않고, 인텔리제이를 실행&quot; data-og-host=&quot;makeaplayground.tistory.com&quot; data-og-source-url=&quot;https://makeaplayground.tistory.com/331&quot; data-og-url=&quot;https://makeaplayground.tistory.com/331&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bdTHVU/hyUuUw6GXe/X6yLFKqmWgxigDCzrsjxn1/img.png?width=308&amp;amp;height=260&amp;amp;face=0_0_308_260,https://scrap.kakaocdn.net/dn/cVJleD/hyUuYM2rc3/SYoWRdrjnIdUHr4eVYhpkk/img.png?width=308&amp;amp;height=260&amp;amp;face=0_0_308_260,https://scrap.kakaocdn.net/dn/ckDGX2/hyUuRUGvdm/qvT89QxlXdu4ml4wyrkifK/img.png?width=2590&amp;amp;height=640&amp;amp;face=0_0_2590_640&quot;&gt;&lt;a href=&quot;https://makeaplayground.tistory.com/331&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://makeaplayground.tistory.com/331&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bdTHVU/hyUuUw6GXe/X6yLFKqmWgxigDCzrsjxn1/img.png?width=308&amp;amp;height=260&amp;amp;face=0_0_308_260,https://scrap.kakaocdn.net/dn/cVJleD/hyUuYM2rc3/SYoWRdrjnIdUHr4eVYhpkk/img.png?width=308&amp;amp;height=260&amp;amp;face=0_0_308_260,https://scrap.kakaocdn.net/dn/ckDGX2/hyUuRUGvdm/qvT89QxlXdu4ml4wyrkifK/img.png?width=2590&amp;amp;height=640&amp;amp;face=0_0_2590_640');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Redis] 레디스 명령어 정리 redis-cli&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;지난 글에서 M1에서 Embedded Redis 실행이 안되는 이유를 알아봣다 터미널에서 직접 다운 받은 레디스를 활용하는 방법을 알아보도록 하겠다 우선 레디스 서버를 실행하지 않고, 인텔리제이를 실행&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;makeaplayground.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;&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;&lt;a href=&quot;https://green-bin.tistory.com/78&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://green-bin.tistory.com/78&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698729793863&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Spring - Mac M1(ARM)에서 Embedded Redis를 실행하지 못하는 이유와 해결 방법&quot; data-og-description=&quot;배경 JWT를 활용한 Spring Security를 작업하면서 Refresh Token을 저장하기 위해서 처음으로 Redis를 Spring에 적용한 후, 로컬 환경과 테스트에서 사용할 Embedded Redis를 힘들게 적용했다. 테스트도 무사히 &quot; data-og-host=&quot;green-bin.tistory.com&quot; data-og-source-url=&quot;https://green-bin.tistory.com/78&quot; data-og-url=&quot;https://green-bin.tistory.com/78&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bHavIq/hyUlulWO1a/yxNjaeYgTC7btqWX9uX8K1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cDUt58/hyUls9r0Ui/Aju4GKmjfQbKDV4boFfxs1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://green-bin.tistory.com/78&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://green-bin.tistory.com/78&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bHavIq/hyUlulWO1a/yxNjaeYgTC7btqWX9uX8K1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cDUt58/hyUls9r0Ui/Aju4GKmjfQbKDV4boFfxs1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spring - Mac M1(ARM)에서 Embedded Redis를 실행하지 못하는 이유와 해결 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;배경 JWT를 활용한 Spring Security를 작업하면서 Refresh Token을 저장하기 위해서 처음으로 Redis를 Spring에 적용한 후, 로컬 환경과 테스트에서 사용할 Embedded Redis를 힘들게 적용했다. 테스트도 무사히&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;green-bin.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/etc</category>
      <category>embedded redis</category>
      <category>M1 Redis 오류</category>
      <category>redis</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/330</guid>
      <comments>https://makeaplayground.tistory.com/330#entry330comment</comments>
      <pubDate>Tue, 31 Oct 2023 14:23:20 +0900</pubDate>
    </item>
    <item>
      <title>[IntelliJ] 인텔리제이 System.out.println() 단축키</title>
      <link>https://makeaplayground.tistory.com/329</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;System.out.println() 단축키&lt;/h4&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #ee2323; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;sout&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #ee2323;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-26 오전 10.03.11.png&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSYNeD/btszeJJvAnO/6IMPpgSCh5r9xNsW5vmSyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSYNeD/btszeJJvAnO/6IMPpgSCh5r9xNsW5vmSyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSYNeD/btszeJJvAnO/6IMPpgSCh5r9xNsW5vmSyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSYNeD%2FbtszeJJvAnO%2F6IMPpgSCh5r9xNsW5vmSyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;554&quot; data-filename=&quot;스크린샷 2023-10-26 오전 10.03.11.png&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;554&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;위의 사진처럼 sout 입력하고 엔터 치면 System.out.print()가 자동으로 생성된다!&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-26 오전 10.03.17.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SgNsz/btszehzvDoR/dA4bT10fkMSiqQIS4NV4Pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SgNsz/btszehzvDoR/dA4bT10fkMSiqQIS4NV4Pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SgNsz/btszehzvDoR/dA4bT10fkMSiqQIS4NV4Pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSgNsz%2FbtszehzvDoR%2FdA4bT10fkMSiqQIS4NV4Pk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;288&quot; data-filename=&quot;스크린샷 2023-10-26 오전 10.03.17.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;454&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>IT/tools</category>
      <category>IntelliJ</category>
      <category>Sout</category>
      <category>Systme.out.print()</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/329</guid>
      <comments>https://makeaplayground.tistory.com/329#entry329comment</comments>
      <pubDate>Thu, 26 Oct 2023 10:06:16 +0900</pubDate>
    </item>
    <item>
      <title>[Intellij] 인텔리제이 언어 영어(English)로 변경하기</title>
      <link>https://makeaplayground.tistory.com/328</link>
      <description>&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;span&gt;Intellij IDEA &amp;gt; Preferences &amp;gt; Plugins&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt; Korean Language Pack&lt;span&gt; 체크 풀기&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Preferences 로 이동&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.47.27.png&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dl3rR/btsy45U3AFV/BGarGJkCe4DZZaigOZumXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dl3rR/btsy45U3AFV/BGarGJkCe4DZZaigOZumXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dl3rR/btsy45U3AFV/BGarGJkCe4DZZaigOZumXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDl3rR%2Fbtsy45U3AFV%2FBGarGJkCe4DZZaigOZumXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;339&quot; height=&quot;416&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.47.27.png&quot; data-origin-width=&quot;412&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;&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;체크를 풀고 나서 적용하면 인텔리제이 다시 실행되면서 영어로 바뀐다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.47.00.png&quot; data-origin-width=&quot;1970&quot; data-origin-height=&quot;1436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IIKhq/btsy4n2wSX8/uz6tAAK6uwERDPFJkkEipk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IIKhq/btsy4n2wSX8/uz6tAAK6uwERDPFJkkEipk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IIKhq/btsy4n2wSX8/uz6tAAK6uwERDPFJkkEipk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIIKhq%2Fbtsy4n2wSX8%2Fuz6tAAK6uwERDPFJkkEipk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1970&quot; height=&quot;1436&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.47.00.png&quot; data-origin-width=&quot;1970&quot; data-origin-height=&quot;1436&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>IT/tools</category>
      <category>IntelliJ</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/328</guid>
      <comments>https://makeaplayground.tistory.com/328#entry328comment</comments>
      <pubDate>Wed, 25 Oct 2023 10:59:12 +0900</pubDate>
    </item>
    <item>
      <title>[Intellij] 인텔리제이 프로젝트 동시에 RUN 하는 방법</title>
      <link>https://makeaplayground.tistory.com/327</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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.27.45.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGpVUK/btsy7RhFwG0/77k8MsBpC5FTrGw2j4yt2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGpVUK/btsy7RhFwG0/77k8MsBpC5FTrGw2j4yt2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGpVUK/btsy7RhFwG0/77k8MsBpC5FTrGw2j4yt2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGpVUK%2Fbtsy7RhFwG0%2F77k8MsBpC5FTrGw2j4yt2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;503&quot; height=&quot;94&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.27.45.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;94&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.28.58.png&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m21iW/btsy35nwlhn/RPdqZlkS926ye2SBWiYfn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m21iW/btsy35nwlhn/RPdqZlkS926ye2SBWiYfn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m21iW/btsy35nwlhn/RPdqZlkS926ye2SBWiYfn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm21iW%2Fbtsy35nwlhn%2FRPdqZlkS926ye2SBWiYfn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;696&quot; height=&quot;560&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.28.58.png&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;560&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.29.27.png&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;1158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZNfz6/btszbjcZfq0/qnICEE8ckYaadD4GYEMQ4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZNfz6/btszbjcZfq0/qnICEE8ckYaadD4GYEMQ4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZNfz6/btszbjcZfq0/qnICEE8ckYaadD4GYEMQ4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZNfz6%2FbtszbjcZfq0%2FqnICEE8ckYaadD4GYEMQ4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;696&quot; height=&quot;557&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.29.27.png&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;1158&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.30.12.png&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l5apc/btsy449EnJg/OSKVK2L6S0kNeTpeVbFM10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l5apc/btsy449EnJg/OSKVK2L6S0kNeTpeVbFM10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l5apc/btsy449EnJg/OSKVK2L6S0kNeTpeVbFM10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl5apc%2Fbtsy449EnJg%2FOSKVK2L6S0kNeTpeVbFM10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;452&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.30.12.png&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;614&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.36.13.png&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd3VT6/btsy8nNZaVj/C1SnKqPr6Q7mtI080Hoddk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd3VT6/btsy8nNZaVj/C1SnKqPr6Q7mtI080Hoddk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd3VT6/btsy8nNZaVj/C1SnKqPr6Q7mtI080Hoddk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd3VT6%2Fbtsy8nNZaVj%2FC1SnKqPr6Q7mtI080Hoddk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;168&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.36.13.png&quot; data-origin-width=&quot;460&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;이미 8080으로 프로젝트가 실행되고 있으니, application.propertie에 8081로 포트를 변경해준다&lt;/p&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;size14&quot;&gt;+포트 변경법 참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://makeaplayground.tistory.com/325&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://makeaplayground.tistory.com/325&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698198103356&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring Boot] 서버 포트 변경하기&quot; data-og-description=&quot;1. application.properties 파일 수정하기 제일 간단하다 applicationl.properties에서 se만 작성해도 인텔리제이에서 자동으로 띄어준다 server.port=8081로 변경하고 실행하면 된다 실행하면 터미널 중간에 이렇&quot; data-og-host=&quot;makeaplayground.tistory.com&quot; data-og-source-url=&quot;https://makeaplayground.tistory.com/325&quot; data-og-url=&quot;https://makeaplayground.tistory.com/325&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tZ1qv/hyUgJwYJnU/w56fapOzfAWzw9trOekwvk/img.png?width=800&amp;amp;height=147&amp;amp;face=0_0_800_147,https://scrap.kakaocdn.net/dn/ciu74q/hyUgNlPOOe/qhia1soe0KLTFY7YFPlxJ0/img.png?width=800&amp;amp;height=147&amp;amp;face=0_0_800_147,https://scrap.kakaocdn.net/dn/p59Y5/hyUkcdbNhH/PZEjymI2E9DAsWJ1JqW1lk/img.png?width=1092&amp;amp;height=202&amp;amp;face=0_0_1092_202&quot;&gt;&lt;a href=&quot;https://makeaplayground.tistory.com/325&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://makeaplayground.tistory.com/325&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tZ1qv/hyUgJwYJnU/w56fapOzfAWzw9trOekwvk/img.png?width=800&amp;amp;height=147&amp;amp;face=0_0_800_147,https://scrap.kakaocdn.net/dn/ciu74q/hyUgNlPOOe/qhia1soe0KLTFY7YFPlxJ0/img.png?width=800&amp;amp;height=147&amp;amp;face=0_0_800_147,https://scrap.kakaocdn.net/dn/p59Y5/hyUkcdbNhH/PZEjymI2E9DAsWJ1JqW1lk/img.png?width=1092&amp;amp;height=202&amp;amp;face=0_0_1092_202');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring Boot] 서버 포트 변경하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. application.properties 파일 수정하기 제일 간단하다 applicationl.properties에서 se만 작성해도 인텔리제이에서 자동으로 띄어준다 server.port=8081로 변경하고 실행하면 된다 실행하면 터미널 중간에 이렇&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;makeaplayground.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.39.02.png&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OtbcA/btsy5govR4A/aU9k0RDcXspyZGi49k1KQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OtbcA/btsy5govR4A/aU9k0RDcXspyZGi49k1KQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OtbcA/btsy5govR4A/aU9k0RDcXspyZGi49k1KQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOtbcA%2Fbtsy5govR4A%2FaU9k0RDcXspyZGi49k1KQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;70&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.39.02.png&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.40.13.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y41Wa/btsy4mbstby/3voLlkvgqhEfY4nKdAkbe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y41Wa/btsy4mbstby/3voLlkvgqhEfY4nKdAkbe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y41Wa/btsy4mbstby/3voLlkvgqhEfY4nKdAkbe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy41Wa%2Fbtsy4mbstby%2F3voLlkvgqhEfY4nKdAkbe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;888&quot; height=&quot;124&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.40.13.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;124&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;&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;[ 영어 버전 ] - 방법은 똑같다&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Run &amp;rarr; Edit Configurations &amp;rarr; Modify options -&amp;gt; Allow multiple instances&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.48.25.png&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJv8o6/btsy37liiXy/tiiiIoWtkWwKsMzQ7qmyak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJv8o6/btsy37liiXy/tiiiIoWtkWwKsMzQ7qmyak/img.png&quot; data-alt=&quot;ce&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJv8o6/btsy37liiXy/tiiiIoWtkWwKsMzQ7qmyak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJv8o6%2Fbtsy37liiXy%2FtiiiIoWtkWwKsMzQ7qmyak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;524&quot; height=&quot;303&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.48.25.png&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ce&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.48.44.png&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tZoTA/btsy5f4eFvo/xI8TBsrL0qukzqQkpox8X1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tZoTA/btsy5f4eFvo/xI8TBsrL0qukzqQkpox8X1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tZoTA/btsy5f4eFvo/xI8TBsrL0qukzqQkpox8X1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtZoTA%2Fbtsy5f4eFvo%2FxI8TBsrL0qukzqQkpox8X1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;314&quot; height=&quot;78&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.48.44.png&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;78&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.48.51.png&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkL6tE/btsy4taBi3v/4MKq86Q0PkTL0OVapNyB80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkL6tE/btsy4taBi3v/4MKq86Q0PkTL0OVapNyB80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkL6tE/btsy4taBi3v/4MKq86Q0PkTL0OVapNyB80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkL6tE%2Fbtsy4taBi3v%2F4MKq86Q0PkTL0OVapNyB80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;510&quot; data-filename=&quot;스크린샷 2023-10-25 오전 10.48.51.png&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;510&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>IT/tools</category>
      <category>IntelliJ</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/327</guid>
      <comments>https://makeaplayground.tistory.com/327#entry327comment</comments>
      <pubDate>Wed, 25 Oct 2023 10:55:34 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] Driver net.sf.log4jdbc.sql.jdbcapi.DriverSpy claims to not accept jdbcUrl</title>
      <link>https://makeaplayground.tistory.com/326</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;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;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;&lt;b&gt;1. 에러사항&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1698107314510&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Driver net.sf.log4jdbc.sql.jdbcapi.DriverSpy claims to not accept jdbcUrl&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;&lt;b&gt;2. 해결방법&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;구글링해보니 Gradle 새로고침을 하면 된다고 한다&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;/span&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-24 오전 9.31.41.png&quot; data-origin-width=&quot;174&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjN0dF/btsyVbVGBaD/36KjCXYJk7UaB75cR7Y27K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjN0dF/btsyVbVGBaD/36KjCXYJk7UaB75cR7Y27K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjN0dF/btsyVbVGBaD/36KjCXYJk7UaB75cR7Y27K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjN0dF%2FbtsyVbVGBaD%2F36KjCXYJk7UaB75cR7Y27K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;174&quot; height=&quot;114&quot; data-filename=&quot;스크린샷 2023-10-24 오전 9.31.41.png&quot; data-origin-width=&quot;174&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;잘 실행된다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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>IT/error</category>
      <category>jdbcurl</category>
      <category>Spring Boot</category>
      <category>스프링부트</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/326</guid>
      <comments>https://makeaplayground.tistory.com/326#entry326comment</comments>
      <pubDate>Tue, 24 Oct 2023 09:33:02 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] 서버 포트 변경하기</title>
      <link>https://makeaplayground.tistory.com/325</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;1. application.properties 파일 수정하기&lt;/b&gt;&lt;/span&gt;&lt;/h2&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;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-23 오후 3.15.41.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXtmcB/btsyVhBqZkU/C8BHw7tMNUh7MxZTVofjAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXtmcB/btsyVhBqZkU/C8BHw7tMNUh7MxZTVofjAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXtmcB/btsyVhBqZkU/C8BHw7tMNUh7MxZTVofjAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXtmcB%2FbtsyVhBqZkU%2FC8BHw7tMNUh7MxZTVofjAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1092&quot; height=&quot;202&quot; data-filename=&quot;스크린샷 2023-10-23 오후 3.15.41.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-23 오후 3.17.15.png&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btmr10/btsyTWj0Ygo/1x08Wv9LmzlO32pzYfyxKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btmr10/btsyTWj0Ygo/1x08Wv9LmzlO32pzYfyxKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btmr10/btsyTWj0Ygo/1x08Wv9LmzlO32pzYfyxKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtmr10%2FbtsyTWj0Ygo%2F1x08Wv9LmzlO32pzYfyxKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;422&quot; height=&quot;131&quot; data-filename=&quot;스크린샷 2023-10-23 오후 3.17.15.png&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;160&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;applicationl.properties에서 se만 작성해도 인텔리제이에서 자동으로 띄어준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;server.port=8081로 변경하고 실행하면 된다&lt;/p&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;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-23 오후 3.17.49.png&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbzWe4/btsy4sgP2A7/bir5ruzQhx85o1kayduKN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbzWe4/btsy4sgP2A7/bir5ruzQhx85o1kayduKN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbzWe4/btsy4sgP2A7/bir5ruzQhx85o1kayduKN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbzWe4%2Fbtsy4sgP2A7%2Fbir5ruzQhx85o1kayduKN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;52&quot; data-filename=&quot;스크린샷 2023-10-23 오후 3.17.49.png&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;56&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;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;2. SpringApplication의 setDefaultProperties&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698042298758&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@SpringBootApplication
public class HelloApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(HelloApplication.class);
        app.setDefaultProperties(Collections.singletonMap(&quot;server.port&quot;, &quot;8081&quot;));
        app.run(args);
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot;&gt;SpringApplication의 setDefaultProperties를 사용하여 port를 변경할 수 있다&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;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/SpringApplication.html#setDefaultProperties(java.util.Map)&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/SpringApplication.html#setDefaultProperties(java.util.Map)&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698042345931&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;SpringApplication (Spring Boot 3.1.5 API)&quot; data-og-description=&quot;setMainApplicationClass public&amp;nbsp;void&amp;nbsp;setMainApplicationClass(Class &amp;nbsp;mainApplicationClass) Set a specific main application class that will be used as a log source and to obtain version information. By default the main application class will be deduced. Ca&quot; data-og-host=&quot;docs.spring.io&quot; data-og-source-url=&quot;https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/SpringApplication.html#setDefaultProperties(java.util.Map)&quot; data-og-url=&quot;https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/SpringApplication.html#setDefaultProperties(java.util.Map)&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/SpringApplication.html#setDefaultProperties(java.util.Map)&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/SpringApplication.html#setDefaultProperties(java.util.Map)&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;SpringApplication (Spring Boot 3.1.5 API)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;setMainApplicationClass public&amp;nbsp;void&amp;nbsp;setMainApplicationClass(Class &amp;nbsp;mainApplicationClass) Set a specific main application class that will be used as a log source and to obtain version information. By default the main application class will be deduced. Ca&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.spring.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;&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;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;이 외에도 포트 변경하는 방법&amp;nbsp;&lt;/span&gt;참고 블로그&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hianna.tistory.com/806&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hianna.tistory.com/806&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698041596661&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring Boot] 서버 포트 변경하기&quot; data-og-description=&quot;application.properties 파일 수정하기 Command Line 옵션 추가하기 WebServerFactoryCustomizer 인터페이스 구현하기 SpringApplication의 setDefaultProperties 1. application.properties 파일 수정하기 server.port = 8081 2. Command Line &quot; data-og-host=&quot;hianna.tistory.com&quot; data-og-source-url=&quot;https://hianna.tistory.com/806&quot; data-og-url=&quot;https://hianna.tistory.com/806&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/y5LNU/hyUgTstJ82/Hi9yrak3FrHZWNFsYNkdKK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/boLY9e/hyUkjXlpn0/VkEpkXm17PRWZNYycSsBtK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/hwShu/hyUj6Kst5s/YMkgkMx43gVbQUcAyFM6Q1/img.jpg?width=1936&amp;amp;height=2592&amp;amp;face=0_0_1936_2592&quot;&gt;&lt;a href=&quot;https://hianna.tistory.com/806&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hianna.tistory.com/806&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/y5LNU/hyUgTstJ82/Hi9yrak3FrHZWNFsYNkdKK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/boLY9e/hyUkjXlpn0/VkEpkXm17PRWZNYycSsBtK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/hwShu/hyUj6Kst5s/YMkgkMx43gVbQUcAyFM6Q1/img.jpg?width=1936&amp;amp;height=2592&amp;amp;face=0_0_1936_2592');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring Boot] 서버 포트 변경하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;application.properties 파일 수정하기 Command Line 옵션 추가하기 WebServerFactoryCustomizer 인터페이스 구현하기 SpringApplication의 setDefaultProperties 1. application.properties 파일 수정하기 server.port = 8081 2. Command Line&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hianna.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/spring</category>
      <category>8081</category>
      <category>Port</category>
      <category>server.port</category>
      <category>Spring Boot</category>
      <category>spring port</category>
      <category>스프링부트</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/325</guid>
      <comments>https://makeaplayground.tistory.com/325#entry325comment</comments>
      <pubDate>Mon, 23 Oct 2023 15:28:23 +0900</pubDate>
    </item>
    <item>
      <title>URL 파라미터 값 가져오기 (쿼리스트링 값)</title>
      <link>https://makeaplayground.tistory.com/324</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;URL 파라미터 값 가져오기&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;1. 전체 URL 가져오기&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;window.location.href&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;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;2. 특정 파라미터값 가져오기&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;roomId 값 가져오기( 아래 사진 및 URL 참고 )&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const urlParams = new URL(location.href).searchParams;
const roomId = urlParams.get('roomId');&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1402&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baHPok/btsy39Iz6gU/e2pUHUQ1v0vdGnZwTK2oX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baHPok/btsy39Iz6gU/e2pUHUQ1v0vdGnZwTK2oX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baHPok/btsy39Iz6gU/e2pUHUQ1v0vdGnZwTK2oX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaHPok%2Fbtsy39Iz6gU%2Fe2pUHUQ1v0vdGnZwTK2oX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;758&quot; height=&quot;440&quot; data-origin-width=&quot;1402&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 이 위의 사진과 같을때,&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RPegN/btsyVbOpNhq/2XrcbPVGZMmJtwuAzpJENk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RPegN/btsyVbOpNhq/2XrcbPVGZMmJtwuAzpJENk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RPegN/btsyVbOpNhq/2XrcbPVGZMmJtwuAzpJENk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRPegN%2FbtsyVbOpNhq%2F2XrcbPVGZMmJtwuAzpJENk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1118&quot; height=&quot;202&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1702&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1GbmU/btsyUgXi2ZD/8HDI5flGabMD3rJF7ek4LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1GbmU/btsyUgXi2ZD/8HDI5flGabMD3rJF7ek4LK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1GbmU/btsyUgXi2ZD/8HDI5flGabMD3rJF7ek4LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1GbmU%2FbtsyUgXi2ZD%2F8HDI5flGabMD3rJF7ek4LK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1702&quot; height=&quot;520&quot; data-origin-width=&quot;1702&quot; data-origin-height=&quot;520&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;콘솔에 전체 URL과 roomId 뒤의 값이 출력 된거를 확인 할 수 있다!&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/js</category>
      <category>javascript</category>
      <category>URL</category>
      <category>URLSearchParams</category>
      <category>자바스크립트</category>
      <category>쿼리스트링</category>
      <category>파라미터</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/324</guid>
      <comments>https://makeaplayground.tistory.com/324#entry324comment</comments>
      <pubDate>Mon, 23 Oct 2023 15:04:14 +0900</pubDate>
    </item>
    <item>
      <title>[html] div 태그와 span 태그의 차이!</title>
      <link>https://makeaplayground.tistory.com/319</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;i&gt;&lt;b&gt;Div vs Span&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;두 태그는 html 마크업을 하면 가장 많이 쓰이는 태그 일 것이다&lt;/span&gt;
&lt;/div&gt;&lt;div&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;둘 태그 다 레이아웃을 구성할때 영역을 설정할때 사용한다&lt;/span&gt;
&lt;/div&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;&lt;i&gt;&lt;b&gt;차이점은 div =&amp;gt; block 요소, span =&amp;gt; inline 요소라는 거다&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;
&lt;/div&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;그러면 block과 inline의 차이는 뭘까?&lt;/span&gt;
&lt;/div&gt;&lt;div&gt;
 &amp;nbsp;
&lt;/div&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;
 &amp;nbsp;
&lt;/div&gt;&lt;p data-ke-size=&quot;size18&quot; style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;u&gt;&lt;b&gt;block&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;- 새로운 줄에서 시작하고, 자동 줄 바꿈이 일어난다&lt;/span&gt;
&lt;/div&gt;&lt;div&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;- 가로, 세로(width, height) 를 지정 할 수 있고, margin, padding도 적용 가능하다&lt;/span&gt;
&lt;/div&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;
 &amp;nbsp;
&lt;/div&gt;&lt;p data-ke-size=&quot;size18&quot; style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;u&gt;&lt;b&gt;inline&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;- 새로운 줄에서 시작하지 않으며, 콘텐츠 영역 만컴의 크기를 차지한다&lt;/span&gt;
&lt;/div&gt;&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;- 가로, 세로(width, height) 를 지정 할 수 없고, 상하 margin, 상하좌우 padding도 적용 불가하다&lt;/span&gt;
&lt;/div&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아래 코드를 보면은 이해가 갈 것이다&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt;두 태그 style에 width랑 heigth를 적용해봤다, span은 width와 height가 적용되지 않고, 콘텐츠 영역만 크기를 차지했다&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그리고 span 밑에 div를 넣으니, 자동 줄바꿈 된거를 확인 할 수 있다&lt;/span&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;
 &amp;nbsp;
&lt;/div&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;1030&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ce79eA/btsx3IGSdGN/mZM51aheYTKl0YISfXgqBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ce79eA/btsx3IGSdGN/mZM51aheYTKl0YISfXgqBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ce79eA/btsx3IGSdGN/mZM51aheYTKl0YISfXgqBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fce79eA%2Fbtsx3IGSdGN%2FmZM51aheYTKl0YISfXgqBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;454&quot; height=&quot;501&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;1030&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;끝!&lt;/p&gt;</description>
      <category>IT/html</category>
      <category>Block</category>
      <category>div</category>
      <category>HTML</category>
      <category>inline</category>
      <category>span</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/319</guid>
      <comments>https://makeaplayground.tistory.com/319#entry319comment</comments>
      <pubDate>Thu, 12 Oct 2023 13:46:34 +0900</pubDate>
    </item>
    <item>
      <title>파이어베이스 실시간 데이터베이스로 채팅 구현2 (코드)</title>
      <link>https://makeaplayground.tistory.com/318</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;구조는 이렇게 구성했다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오후 4.09.01.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3oLGn/btss3YgJ9pd/WiaTQNdboTqNVYgNATuFn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3oLGn/btss3YgJ9pd/WiaTQNdboTqNVYgNATuFn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3oLGn/btss3YgJ9pd/WiaTQNdboTqNVYgNATuFn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3oLGn%2Fbtss3YgJ9pd%2FWiaTQNdboTqNVYgNATuFn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;167&quot; data-filename=&quot;스크린샷 2023-09-05 오후 4.09.01.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 유저 생성 (user_list.html)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오후 12.51.42.png&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W0ncU/btssZd5Pnt8/vxgHouV5EJADCv7z2zvDBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W0ncU/btssZd5Pnt8/vxgHouV5EJADCv7z2zvDBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W0ncU/btssZd5Pnt8/vxgHouV5EJADCv7z2zvDBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW0ncU%2FbtssZd5Pnt8%2FvxgHouV5EJADCv7z2zvDBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;310&quot; data-filename=&quot;스크린샷 2023-09-05 오후 12.51.42.png&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;310&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;b&gt;새 유저 생성&lt;/b&gt; 버튼을 클릭하면, 파이어베이스에 새로운 유저가 생성된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1693886164233&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 새로운 사용자 생성
function createNewUser() {
    const userUID = self.crypto.randomUUID();
    // 새로운 사용자를 Firebase 데이터베이스에 저장
    dbRef.child(userUID).set({
        // 유저의 정보 넣기
        userName : &quot;홍길동&quot;,
        userEmail :&quot;test@naver.com&quot;
    }).then(() =&amp;gt; {
        // 데이터베이스에 사용자를 추가한 후 페이지 다시 로드
        window.location.reload();
    });
}&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오후 12.54.24.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwx9wE/btssVNe9i9W/m6U7E39Ymzm1b0CD4bhfH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwx9wE/btssVNe9i9W/m6U7E39Ymzm1b0CD4bhfH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwx9wE/btssVNe9i9W/m6U7E39Ymzm1b0CD4bhfH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwx9wE%2FbtssVNe9i9W%2Fm6U7E39Ymzm1b0CD4bhfH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;643&quot; height=&quot;157&quot; data-filename=&quot;스크린샷 2023-09-05 오후 12.54.24.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;286&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오후 12.57.22.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmH874/btssVJKBQ7m/P1TYqTSlB5FeNjW2gWFCu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmH874/btssVJKBQ7m/P1TYqTSlB5FeNjW2gWFCu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmH874/btssVJKBQ7m/P1TYqTSlB5FeNjW2gWFCu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmH874%2FbtssVJKBQ7m%2FP1TYqTSlB5FeNjW2gWFCu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;649&quot; height=&quot;510&quot; data-filename=&quot;스크린샷 2023-09-05 오후 12.57.22.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;510&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;채팅은 나 포함 다른 한명 최소 2명이 필요하기 때문에, 유저를 한명 더 만들어 준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헷갈릴 수 있으니, createNewUser() 실행전 userEmail과 userName 를 변경하여 만들어주었다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오후 1.06.32.png&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JBjEO/btssVXbaNF6/HOPum1u04KWkFt8PDgr451/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JBjEO/btssVXbaNF6/HOPum1u04KWkFt8PDgr451/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JBjEO/btssVXbaNF6/HOPum1u04KWkFt8PDgr451/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJBjEO%2FbtssVXbaNF6%2FHOPum1u04KWkFt8PDgr451%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;605&quot; height=&quot;323&quot; data-filename=&quot;스크린샷 2023-09-05 오후 1.06.32.png&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;540&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;userUID가 추가된다&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오후 1.33.45.png&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z07rG/btss88bFVq7/0fDo3LmkSoKKitGlv1yX11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z07rG/btss88bFVq7/0fDo3LmkSoKKitGlv1yX11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z07rG/btss88bFVq7/0fDo3LmkSoKKitGlv1yX11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz07rG%2Fbtss88bFVq7%2F0fDo3LmkSoKKitGlv1yX11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;208&quot; data-filename=&quot;스크린샷 2023-09-05 오후 1.33.45.png&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1693888493257&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 전체 유저 리스트 가져오기
function getAllUsers(callback) {
    const usersList = [];
    dbRef.once(&quot;value&quot;, snapshot =&amp;gt; {
        snapshot.forEach(userSnapshot =&amp;gt; {
            const userUID = userSnapshot.key;
            usersList.push(userUID);
        });
        // 전체 사용자 리스트를 가져온 후에 콜백 함수를 호출하여 전달
        callback(usersList);
    });
}&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_1693888606336&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// getAllUsers에서 usersList 가져와서 동적으로 추가 &amp;amp; 본인 여부 체크 
// &amp;amp; 상대방과 이미 채팅방 있는지 체크(checkExistingChatRoom()) 해서 채팅방 페이지 이동

async function displayAllUsers(usersList) {
    const userListElement = document.getElementById(&quot;userList&quot;);
    userListElement.innerHTML = &quot;&quot;; // 기존 리스트 초기화

    usersList.forEach(userUID =&amp;gt; {
        const li = document.createElement(&quot;li&quot;);
        li.innerText = `유저 : ${userUID}`;
        li.addEventListener(&quot;click&quot;, async () =&amp;gt; {
            // 유저 클릭시 채팅방 만들기
            if (userUID === senderUID) {
                alert(&quot;본인에게는 채팅을 할수 없습니다.&quot;)
            } else {
                const chatRoomNumber = await checkExistingChatRoom(userUID, senderUID);
                if (chatRoomNumber != null) {
                    // 채팅방 있음
                    window.location.href = `chat1?chatRoomNumber=${chatRoomNumber}&amp;amp;userUID=${userUID}&amp;amp;senderUID=${senderUID}`;
                } else {
                    // 채팅방 없음
                    window.location.href = `chat1?userUID=${userUID}&amp;amp;senderUID=${senderUID}`;
                }
            }
        });
        userListElement.appendChild(li);
    });
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1693888723785&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 채팅방이 이미 존재하는지 확인하는 함수
async function checkExistingChatRoom(userUID, currentUserUID) {
    const chatRoomsRef = firebase.database().ref(&quot;chats&quot;);
    const snapshot = await chatRoomsRef.once(&quot;value&quot;);
    const chatSnapshot = snapshot.val();

    for (const chatRoomNumber in chatSnapshot) {
        const participants = chatSnapshot[chatRoomNumber].participants;
        if (participants[userUID] &amp;amp;&amp;amp; participants[currentUserUID]) {
            return chatRoomNumber;  // 이미 채팅방이 존재함
        }
    }
    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;나를 &lt;b&gt;홍길동&lt;/b&gt;으로 가정한다고 하고, 유재석에게 채팅메세지를 보내보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 만들어준 유저에서 홍길동의 UID를 넣어준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재에서는 로그인 개념이 없기 때문에 이렇게 하는거고, 로그인 가능한 프로젝트면 유저정보에서 채팅UID를 가져오면 된다&lt;/p&gt;
&lt;pre id=&quot;code_1693888809967&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 사용자 UID를 가져오는 가정
const senderUID = &quot;0dad4e6f-add4-447f-aef0-a3a096be4e00&quot;; // 회원의 UID&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오후 1.42.26.png&quot; data-origin-width=&quot;1892&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmWVqP/btstbe99D85/K2hgI04U3SnDMoF8aQvv9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmWVqP/btstbe99D85/K2hgI04U3SnDMoF8aQvv9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmWVqP/btstbe99D85/K2hgI04U3SnDMoF8aQvv9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmWVqP%2Fbtstbe99D85%2FK2hgI04U3SnDMoF8aQvv9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1892&quot; height=&quot;518&quot; data-filename=&quot;스크린샷 2023-09-05 오후 1.42.26.png&quot; data-origin-width=&quot;1892&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홍길동의 UID (0dad4e6f-add4-447f-aef0-a3a096be4e00) 를 클릭할 경우, 이렇게 알림창이 뜨고&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-filename=&quot;스크린샷 2023-09-05 오후 1.43.51.png&quot; data-origin-width=&quot;2176&quot; data-origin-height=&quot;1278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBgIvR/btssVJjHAsf/c04KHd9rbD00bKvfDTxtTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBgIvR/btssVJjHAsf/c04KHd9rbD00bKvfDTxtTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBgIvR/btssVJjHAsf/c04KHd9rbD00bKvfDTxtTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBgIvR%2FbtssVJjHAsf%2Fc04KHd9rbD00bKvfDTxtTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2176&quot; height=&quot;1278&quot; data-filename=&quot;스크린샷 2023-09-05 오후 1.43.51.png&quot; data-origin-width=&quot;2176&quot; data-origin-height=&quot;1278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 유저의 UID를 클릭할 경우, 채팅 메세지 보낼수 있는 페이지로 이동한다&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;userUID : 다른 유저의 UID&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;senderUID : 본인의 UID ( 메세지 보내는 사람 )&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;userUID &amp;amp; sendeUID는 각각 마음대로 정하면 된다&amp;nbsp;&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;&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;&lt;b&gt;2. 채팅 메세지 보내기 (chat1.html)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오후 1.46.30.png&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;1158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beTley/btss9ATmcZM/noU0JhQxzQgrxTdCeL4790/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beTley/btss9ATmcZM/noU0JhQxzQgrxTdCeL4790/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beTley/btss9ATmcZM/noU0JhQxzQgrxTdCeL4790/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeTley%2Fbtss9ATmcZM%2FnoU0JhQxzQgrxTdCeL4790%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;471&quot; data-filename=&quot;스크린샷 2023-09-05 오후 1.46.30.png&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;1158&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오후 1.55.19.png&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d26fqr/btss3X9IMmv/Xk9QNdFpmB94ANGy0UmKc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d26fqr/btss3X9IMmv/Xk9QNdFpmB94ANGy0UmKc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d26fqr/btss3X9IMmv/Xk9QNdFpmB94ANGy0UmKc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd26fqr%2Fbtss3X9IMmv%2FXk9QNdFpmB94ANGy0UmKc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;613&quot; height=&quot;405&quot; data-filename=&quot;스크린샷 2023-09-05 오후 1.55.19.png&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;786&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;chats ( 채팅룸, chattingRoom 이렇게 구조화해도 된다 ) 밑에 참여하고 있는 유저 UID를 넣는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 messages에 채팅 UID 를 넣고 그 밑에 메세지 UID 생성 그 밑에 메세지 관련 정보를 넣어줬다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( 보내는 사람의 UID, 메세지, 시간, 상대방의 체크여부 등등을 넣으면 된다 )&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1693890009168&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Firebase 실시간 데이터베이스 참조
const dbRef = firebase.database().ref(&quot;messages&quot;);
const chatsRef = firebase.database().ref(&quot;chats&quot;); // 채팅방

const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
const senderUID = urlParams.get('senderUID'); // 본인 UID
const userUID = urlParams.get('userUID'); // 상대방 UID
let chatRoomNumber = urlParams.get('chatRoomNumber');
if(chatRoomNumber == undefined){
    chatRoomNumber = self.crypto.randomUUID();
}


// userUID 추가해서 메시지 보내기
function sendMessage() {
    const messageInput = document.getElementById(&quot;messageText&quot;);
    const message = messageInput.value;
    if (message.trim() !== &quot;&quot;) {
        // 채팅방이 없으면 새로 만들어주기
        if(urlParams.get('chatRoomNumber') == undefined){
            createChatRoom(chatRoomNumber);
        }
        dbRef.child(chatRoomNumber).push().set({
            senderUID: senderUID,
            text: message,
            timestamp: firebase.database.ServerValue.TIMESTAMP,
            checked: false // 상대방이 읽음 여부, 처음에는 디폴트로 false로, 1:1채팅일 경우 이 구조 다대다 일경우는 구조 변경해야함
        });
        messageInput.value = &quot;&quot;;
    }
}

function createChatRoom(chatRoomNumber) {
    // 임의의 채팅방 번호 생성
    const participants = {
        [senderUID]: true,
        [userUID] : true
        // 여러 사용자가 있다면 추가로 참여자를 넣어주기, 1:1 채팅이니까 지금은 2명이면 됨
    };

    // 채팅방 생성
    chatsRef.child(chatRoomNumber).set({ participants })
}

// 채팅방 메세지 수신
dbRef.child(chatRoomNumber).on(&quot;child_added&quot;, snapshot =&amp;gt; {
    const message = snapshot.val();
    const messageDiv = document.createElement(&quot;div&quot;);
    // messageDiv.innerText = message.userName + message.text;
    messageDiv.innerText = message.text;

    if (message.senderUID === senderUID) {
        // 현재 사용자가 보낸 메시지의 경우 'my_message' 클래스 추가
        messageDiv.classList.add(&quot;my_message&quot;);
    } else {
        // 다른 사용자가 보낸 메시지의 경우 'other_message' 클래스 추가
        messageDiv.classList.add(&quot;other_message&quot;);
        // 상대방이 보낸 메세지 true 처리, 채팅방에 들어올 때도 true 처리하지만,
        // 채팅방 안에 있을때도 상대방 메세지 보내면 true 처리
        if (!message.checked) {
            const messageRef = dbRef.child(chatRoomNumber).child(snapshot.key);
            messageRef.update({ checked: true });
        }
    }

    document.getElementById(&quot;messageAppend&quot;).appendChild(messageDiv);
});&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;메세지에 대한 정보를 넣어서 저장해준다&lt;/p&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 내 채팅방 리스트(user_chat_list.html)&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1693890611066&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 사용자 UID를 가져오는 가정
const senderUID = &quot;0dad4e6f-add4-447f-aef0-a3a096be4e00&quot;; // 회원의 UID&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 미리 말한것 처럼 현재 프로젝트에 로그인 개념이 없기 때문에 senderUID에 내 UID를 넣어준다&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-filename=&quot;스크린샷 2023-09-05 오후 2.10.54.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yxrlV/btstbc5GJ9B/MdY94LcCQQkDOuGkkpUg01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yxrlV/btstbc5GJ9B/MdY94LcCQQkDOuGkkpUg01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yxrlV/btstbc5GJ9B/MdY94LcCQQkDOuGkkpUg01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyxrlV%2Fbtstbc5GJ9B%2FMdY94LcCQQkDOuGkkpUg01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;906&quot; height=&quot;310&quot; data-filename=&quot;스크린샷 2023-09-05 오후 2.10.54.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;310&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_1693890738891&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; window.onload = () =&amp;gt; {
    // getUserChatRooms 함수 호출 시 콜백 함수를 전달하여 데이터를 가져온 후에 displayUserChatRooms 함수 호출
    getUserChatRooms(displayUserChatRooms);
};&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1693890765440&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 사용자의 채팅방 리스트 가져오기
function getUserChatRooms(callback) {
    const userChatRooms = [];
    dbRef.once(&quot;value&quot;, snapshot =&amp;gt; {
        snapshot.forEach(chatSnapshot =&amp;gt; {
            const chatRoomNumber = chatSnapshot.key;
            const participants = chatSnapshot.val().participants;
            if (participants[senderUID]) {
                userChatRooms.push(chatRoomNumber);
            }
        });
        // 채팅방 리스트를 가져온 후에 콜백 함수를 호출하여 전달
        callback(userChatRooms);
    });
}

// 채팅방 li에 추가
async function displayUserChatRooms(chatRooms) {
    const chatRoomList = document.getElementById(&quot;chatRoomList&quot;);

    for (const chatRoomNumber of chatRooms) {
        const li = document.createElement(&quot;li&quot;);
        const unreadCount = await countUnreadMessages(chatRoomNumber, senderUID);

        li.innerText = `채팅방: ${chatRoomNumber} (읽지 않은 메시지: ${unreadCount}개)`;
        li.addEventListener(&quot;click&quot;, async () =&amp;gt; {
            // 클릭한 채팅방 번호를 chat.html로 전달하면서 페이지 이동
            await messageRead(chatRoomNumber, senderUID); // await를 사용하여 messageRead가 완료될 때까지 기다림
            window.location.href = `chat1?chatRoomNumber=${chatRoomNumber}&amp;amp;senderUID=${senderUID}`;
        });

        chatRoomList.appendChild(li);
    }
}

// 안 읽은 메세지 카운트
async function countUnreadMessages(chatRoomNumber, userUID) {
    const messagesRef = firebase.database().ref(`messages/${chatRoomNumber}`);

    let unreadCount = 0;

    // child_added 이벤트 리스너 추가
    messagesRef.on(&quot;child_added&quot;, snapshot =&amp;gt; {
        const message = snapshot.val();
        if (message.senderUID !== userUID &amp;amp;&amp;amp; !message.checked) {
            unreadCount++;
        }
        // 새 메시지가 추가될 때마다 unreadCount가 갱신됩니다.
        console.log(unreadCount);

        // 채팅방 리스트의 내용을 업데이트
        updateChatRoomList(chatRoomNumber, unreadCount);
    });

    // 최초에 메시지를 읽지 않은 메시지들을 카운트하여 반환합니다.
    return unreadCount;

}

// 메시지를 읽었을 때 호출되는 함수
async function messageRead(chatRoomNumber, userUID) {
    return new Promise((resolve, reject) =&amp;gt; {
        const messagesRef = firebase.database().ref(`messages/${chatRoomNumber}`);
        messagesRef.once(&quot;value&quot;, snapshot =&amp;gt; {
            snapshot.forEach(messageSnapshot =&amp;gt; {
                const messageID = messageSnapshot.key;
                const message = messageSnapshot.val();
                if (message.senderUID !== userUID &amp;amp;&amp;amp; !message.checked) {
                    const messageRef = messagesRef.child(messageID);
                    messageRef.update({ checked: true });
                }
            });
            resolve(); // 작업이 끝나면 resolve 호출
        });
    });
}

// 메세지가 추가되면 안 읽은 메시지 count 업데이트, 실시간으로 변동됨
function updateChatRoomList(chatRoomNumber, unreadCount) {
    const chatRoomList = document.getElementById(&quot;chatRoomList&quot;);
    const chatRoomItems = chatRoomList.getElementsByTagName(&quot;li&quot;);

    for (let i = 0; i &amp;lt; chatRoomItems.length; i++) {
        const item = chatRoomItems[i];
        if (item.innerText.includes(`채팅방: ${chatRoomNumber}`)) {
            // 채팅방 리스트에서 해당 채팅방을 찾아 업데이트
            item.innerText = `채팅방: ${chatRoomNumber} (읽지 않은 메시지: ${unreadCount}개)`;
            break; // 해당 채팅방을 찾았으면 루프 종료
        }
    }
}&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;채팅방 리스트 불러오기,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채팅방에 읽지 않은 메세지 count,&lt;/p&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;읽지 않은 메세지 실시간 count 변경해주기&lt;/p&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;파라미터를 보면 이번에는 chatRoomNumber도 보여지는거를 확인할수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8080/chatting/chat1?chatRoomNumber=03b90872-38d3-4687-9f3b-fb0e3b112176&amp;amp;senderUID=0dad4e6f-add4-447f-aef0-a3a096be4e00&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-filename=&quot;스크린샷 2023-09-05 오후 2.17.03.png&quot; data-origin-width=&quot;2334&quot; data-origin-height=&quot;1258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKnVsP/btss8loNSQb/BYXokM7rq0zqsrZw10wcq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKnVsP/btss8loNSQb/BYXokM7rq0zqsrZw10wcq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKnVsP/btss8loNSQb/BYXokM7rq0zqsrZw10wcq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKnVsP%2Fbtss8loNSQb%2FBYXokM7rq0zqsrZw10wcq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2334&quot; height=&quot;1258&quot; data-filename=&quot;스크린샷 2023-09-05 오후 2.17.03.png&quot; data-origin-width=&quot;2334&quot; data-origin-height=&quot;1258&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;senderUID=0dad4e6f-add4-447f-aef0-a3a096be4e00에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 사람의 UID를 넣어줘서 창을 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8080/chatting/chat1?chatRoomNumber=03b90872-38d3-4687-9f3b-fb0e3b112176&amp;amp;senderUID=1c862baa-b109-4218-af02-c8f39343920d&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 창은 senderUID =&lt;span&gt;&amp;nbsp;&lt;/span&gt;0dad4e6f-add4-447f-aef0-a3a096be4e00&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;오른쪽은 senderUID =&lt;span&gt;&amp;nbsp;&lt;/span&gt;1c862baa-b109-4218-af02-c8f39343920d 이다&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;내가 보낸 메세지가 오른쪽에 있도록 ui를 표시했다&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;&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다시 메세지를 보내보고, 읽지 않은 메세지 카운트를 봐본다&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오후 3.11.18.png&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7mJdv/btss87qAnyv/PkNGhm1YwAiutrq7lf4OUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7mJdv/btss87qAnyv/PkNGhm1YwAiutrq7lf4OUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7mJdv/btss87qAnyv/PkNGhm1YwAiutrq7lf4OUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7mJdv%2Fbtss87qAnyv%2FPkNGhm1YwAiutrq7lf4OUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;326&quot; data-filename=&quot;스크린샷 2023-09-05 오후 3.11.18.png&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메세지를 보내고 user_chat_list 페이지로 가면, 내가 읽지 않은 메세지 0개로 표시된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채팅방에 있으면 상대방이 메세지를 보낼때, 바로 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 영상은 내가 user_chat_list 페이지에 있고 상대방이 채팅을 보낼경우, 읽지 않은 메세지가 실시간 올라가는 거를 보여준다&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채팅방을 들어갔다가 나오면은 읽지 않은 메세지 0개로 변경&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&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;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( 1:1 채팅일 경우 채팅방의 &lt;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; href=&quot;https://console.firebase.google.com/u/0/project/chatting-test-8bd76/database/chatting-test-8bd76-default-rtdb/data/~2Fchats~2F03b90872-38d3-4687-9f3b-fb0e3b112176~2Fparticipants?hl=ko&quot;&gt;participants&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;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;1) 새 채팅방 생성(user_chat_list)&lt;/b&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오후 3.38.49.png&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb9jaq/btstbby3UJg/s46uRKk0m1WZP5EuwZtKsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb9jaq/btstbby3UJg/s46uRKk0m1WZP5EuwZtKsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb9jaq/btstbby3UJg/s46uRKk0m1WZP5EuwZtKsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb9jaq%2Fbtstbby3UJg%2Fs46uRKk0m1WZP5EuwZtKsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;386&quot; data-filename=&quot;스크린샷 2023-09-05 오후 3.38.49.png&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1693896012929&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; // 새로운 채팅방 생성
function createChatRoom() {
    // 임의의 채팅방 번호 생성
    const chatRoomNumber = self.crypto.randomUUID();
    const participants = {
        [senderUID]: true,
        // 여러 사용자가 있다면 추가로 참여자를 넣어주기
    };

    // 채팅방 생성
    dbRef.child(chatRoomNumber).set({ participants })
    // chatRoomList 비우고 새로 추가
    const chatRoomList = document.getElementById(&quot;chatRoomList&quot;);
    chatRoomList.innerHTML = &quot;&quot;;
    getUserChatRooms(displayUserChatRooms);
}&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) 전체 채팅방 리스트 가져오기 (all_chat_list.html)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오후 3.42.39.png&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3mjtA/btsteQOQpzU/KCzDjcK3ZrdG2LCg5nVpK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3mjtA/btsteQOQpzU/KCzDjcK3ZrdG2LCg5nVpK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3mjtA/btsteQOQpzU/KCzDjcK3ZrdG2LCg5nVpK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3mjtA%2FbtsteQOQpzU%2FKCzDjcK3ZrdG2LCg5nVpK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;208&quot; data-filename=&quot;스크린샷 2023-09-05 오후 3.42.39.png&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까까지는 03b90872-38d3-4687-9f3b-fb0e3b112176 로 채팅을 구현했고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로 만들어진 ebd7b7e7-a60e-49fa-b2bb-5e85dd173b13 를 리스트로 가져왔다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ebd7b7e7-a60e-49fa-b2bb-5e85dd173b13 에서도 메세지를 보낼수 있지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;다대다 채팅일 경우, 메세지 읽음 여부 checked는 구조를 변경해줘야 한다 (주의!)&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오후 3.48.22.png&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;1278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NQ0sY/btsteSy7M7R/u6ePyRTs71IAUU9BJxHPu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NQ0sY/btsteSy7M7R/u6ePyRTs71IAUU9BJxHPu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NQ0sY/btsteSy7M7R/u6ePyRTs71IAUU9BJxHPu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNQ0sY%2FbtsteSy7M7R%2Fu6ePyRTs71IAUU9BJxHPu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1278&quot; data-filename=&quot;스크린샷 2023-09-05 오후 3.48.22.png&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;1278&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;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;
&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;user_list.html&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1693897045482&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;script src=&quot;https://www.gstatic.com/firebasejs/8.10.1/firebase-app.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;https://www.gstatic.com/firebasejs/8.10.1/firebase-database.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

    &amp;lt;script&amp;gt;
        const firebaseConfig = {
            apiKey: &quot;&quot;,
            authDomain: &quot;&quot;,
            databaseURL: &quot;&quot;,
            projectId: &quot;&quot;,
            storageBucket: &quot;&quot;,
            messagingSenderId: &quot;&quot;,
            appId: &quot;&quot;
        };

        firebase.initializeApp(firebaseConfig);
        // const app = initializeApp(firebaseConfig); // 이거는 9버전 문법

        // Firebase 실시간 데이터베이스 참조
        const dbRef = firebase.database().ref(&quot;users&quot;); // 유저

        // 사용자 UID를 가져오는 가정
        const senderUID = &quot;0dad4e6f-add4-447f-aef0-a3a096be4e00&quot;; // 회원의 UID

        // 새로운 사용자 생성
        function createNewUser() {
            const userUID = self.crypto.randomUUID();
            // 새로운 사용자를 Firebase 데이터베이스에 저장
            dbRef.child(userUID).set({
                // 유저의 정보 넣기
                userName : &quot;유재석&quot;,
                userEmail :&quot;user@naver.com&quot;
            }).then(() =&amp;gt; {
                // 데이터베이스에 사용자를 추가한 후 페이지 다시 로드
                window.location.reload();
            });
        }

        // 전체 유저 리스트 가져오기
        function getAllUsers(callback) {
            const usersList = [];
            dbRef.once(&quot;value&quot;, snapshot =&amp;gt; {
                snapshot.forEach(userSnapshot =&amp;gt; {
                    const userUID = userSnapshot.key;
                    usersList.push(userUID);
                });
                // 전체 사용자 리스트를 가져온 후에 콜백 함수를 호출하여 전달
                callback(usersList);
            });
        }

        // 유저 리스트 가져와서 동적으로 추가
        async function displayAllUsers(usersList) {
            const userListElement = document.getElementById(&quot;userList&quot;);
            userListElement.innerHTML = &quot;&quot;; // 기존 리스트 초기화

            usersList.forEach(userUID =&amp;gt; {
                const li = document.createElement(&quot;li&quot;);
                li.innerText = `유저 : ${userUID}`;
                li.addEventListener(&quot;click&quot;, async () =&amp;gt; {
                    // 유저 클릭시 채팅방 만들기
                    if (userUID === senderUID) {
                        alert(&quot;본인에게는 채팅을 할수 없습니다.&quot;)
                    } else {
                        const chatRoomNumber = await checkExistingChatRoom(userUID, senderUID);
                        if (chatRoomNumber != null) {
                            // 채팅방 있음
                            window.location.href = `chat1?chatRoomNumber=${chatRoomNumber}&amp;amp;userUID=${userUID}&amp;amp;senderUID=${senderUID}`;
                        } else {
                            // 채팅방 없음
                            window.location.href = `chat1?userUID=${userUID}&amp;amp;senderUID=${senderUID}`;
                        }
                    }
                });
                userListElement.appendChild(li);
            });
        }

        // 채팅방이 이미 존재하는지 확인하는 함수
        async function checkExistingChatRoom(userUID, currentUserUID) {
            const chatRoomsRef = firebase.database().ref(&quot;chats&quot;);
            const snapshot = await chatRoomsRef.once(&quot;value&quot;);
            const chatSnapshot = snapshot.val();

            for (const chatRoomNumber in chatSnapshot) {
                const participants = chatSnapshot[chatRoomNumber].participants;
                if (participants[userUID] &amp;amp;&amp;amp; participants[currentUserUID]) {
                    return chatRoomNumber;  // 이미 채팅방이 존재함
                }
            }
            return null; // 채팅방이 없음
        }


        window.onload = () =&amp;gt; {
            // 전체 채팅방 리스트 가져오기
            getAllUsers(displayAllUsers);
        };


    &amp;lt;/script&amp;gt;
    &amp;lt;style&amp;gt;
        #userList li {
            cursor: pointer;
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;button onclick=&quot;createNewUser()&quot;&amp;gt;새 유저 생성&amp;lt;/button&amp;gt;

    &amp;lt;h2&amp;gt;유저 전체 리스트&amp;lt;/h2&amp;gt;
    &amp;lt;ul id=&quot;userList&quot;&amp;gt;
        &amp;lt;!-- 여기에 유저 리스트를 동적으로 추가하는 JavaScript 코드 넣기 --&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;chat1.html&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1693897234096&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;script src=&quot;https://www.gstatic.com/firebasejs/8.10.1/firebase-app.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;https://www.gstatic.com/firebasejs/8.10.1/firebase-database.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

    &amp;lt;script&amp;gt;
        const firebaseConfig = {
            apiKey: &quot;&quot;,
            authDomain: &quot;&quot;,
            databaseURL: &quot;&quot;,
            projectId: &quot;&quot;,
            storageBucket: &quot;&quot;,
            messagingSenderId: &quot;&quot;,
            appId: &quot;&quot;
        };

        firebase.initializeApp(firebaseConfig);
        // const app = initializeApp(firebaseConfig); // 이거는 9버전 문법

        // Firebase 실시간 데이터베이스 참조
        const dbRef = firebase.database().ref(&quot;messages&quot;);
        const chatsRef = firebase.database().ref(&quot;chats&quot;); // 채팅방

        const queryString = window.location.search;
        const urlParams = new URLSearchParams(queryString);
        const senderUID = urlParams.get('senderUID'); // 본인 UID
        const userUID = urlParams.get('userUID'); // 상대방 UID
        let chatRoomNumber = urlParams.get('chatRoomNumber');
        if(chatRoomNumber == undefined){
            chatRoomNumber = self.crypto.randomUUID();
        }

        // userUID 추가해서 메시지 보내기
        function sendMessage() {
            const messageInput = document.getElementById(&quot;messageText&quot;);
            const message = messageInput.value;
            if (message.trim() !== &quot;&quot;) {
                // 채팅방이 없으면 새로 만들어주기
                if(urlParams.get('chatRoomNumber') == undefined){
                    createChatRoom(chatRoomNumber);
                }
                dbRef.child(chatRoomNumber).push().set({
                    senderUID: senderUID,
                    text: message,
                    timestamp: firebase.database.ServerValue.TIMESTAMP,
                    checked: false // 상대방이 읽음 여부, 처음에는 디폴트로 false로, 1:1채팅일 경우 이 구조 다대다 일경우는 구조 변경해야함
                });
                messageInput.value = &quot;&quot;;
            }
        }

        function createChatRoom(chatRoomNumber) {
            // 임의의 채팅방 번호 생성
            const participants = {
                [senderUID]: true,
                [userUID] : true
                // 여러 사용자가 있다면 추가로 참여자를 넣어주기, 1:1 채팅이니까 지금은 2명이면 됨
            };

            // 채팅방 생성
            chatsRef.child(chatRoomNumber).set({ participants })
            // TODO 채팅방 생기면 채탕방 리스트 가져오게 온로드 해야함
        }

        // 채팅방 메세지 수신
        dbRef.child(chatRoomNumber).on(&quot;child_added&quot;, snapshot =&amp;gt; {
            const message = snapshot.val();
            const messageDiv = document.createElement(&quot;div&quot;);
            // messageDiv.innerText = message.userName + message.text;
            messageDiv.innerText = message.text;

            if (message.senderUID === senderUID) {
                // 현재 사용자가 보낸 메시지의 경우 'my_message' 클래스 추가
                messageDiv.classList.add(&quot;my_message&quot;);
            } else {
                // 다른 사용자가 보낸 메시지의 경우 'other_message' 클래스 추가
                messageDiv.classList.add(&quot;other_message&quot;);
                // 상대방이 보낸 메세지 true 처리, 채팅방에 들어올 때도 true 처리하지만,
                // 채팅방 안에 있을때도 상대방 메세지 보내면 true 처리
                if (!message.checked) {
                    const messageRef = dbRef.child(chatRoomNumber).child(snapshot.key);
                    messageRef.update({ checked: true });
                }
            }

            document.getElementById(&quot;messageAppend&quot;).appendChild(messageDiv);
        });

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

    &amp;lt;style&amp;gt;
        .side_bar_wrap{
            display: flex;
            padding-top: 45px;
            padding-bottom: 206px;
        }
        .side_bar_wrap .side_bar{
            margin-left: 30px;
            flex: none;
            width: 270px;
        }
        .side_bar_wrap .side_bar .side_bar_con .top{
            background: #FFFDF3;
            border-radius: 5px;
            padding: 39px 21px;
            box-sizing: border-box;
            height: 550px;
        }
        .side_bar_wrap .side_bar .side_bar_con .top h1{
            text-align: center;
            font-size: 18px;
            font-weight: 500;
            position: relative;
        }
        .side_bar_wrap .side_bar .side_bar_con .top h1 i{
            position: absolute;
            top: -12px;
        }
        .side_bar_wrap .side_bar .side_bar_con .top h5{
            margin-top: 29px;
            text-align: center;
            font-size: 14px;
        }
        .side_bar_wrap .side_bar .side_bar_con .top a{
            display: flex;
            align-items: center;
            justify-content: center;
            margin: 0 auto;
            width: 80px;
            height: 35px;
            line-height: 35px;
            text-align: center;
            background: #FFFFFF;
            border: 1px solid #FFB84D;
            border-radius: 5px;
            margin-top: 13px;
            margin-bottom: 34px;
        }
        .side_bar_wrap .side_bar .side_bar_con .top p{
            font-size: 12px;
            color:  #929292;
            line-height: 20px;
        }
        .side_bar_wrap .side_bar .side_bar_con.on .top{
            padding: 39px 0px;
        }
        .side_bar_wrap .side_bar .side_bar_con.on .top h1{
            text-align: left;
            padding-left: 23px;
        }

        .side_bar_wrap .side_bar .side_bar_con.on .top h1 i{
            position: unset;
            position: relative;
            top: 3px;
        }
        .side_bar_wrap .side_bar .side_bar_con.on .top .comment_box{
            font-size: 11px;
            overflow-y: scroll;
            height: 472px;
            margin-top: 15px;
        }
        .side_bar_wrap .side_bar .side_bar_con.on .top .comment_box .teacher{
            background: #fff;
            border: 1px solid #EBEBEB;
            border-radius: 5px;
            padding: 15px 14px;
            width: 240px;
            box-sizing: border-box;
            margin-left: 20px;
            position: relative;
        }
        .side_bar_wrap .side_bar .side_bar_con.on .top .comment_box &amp;gt; div:nth-child(n + 2){
            margin-top: 9px;
        }
        .side_bar_wrap .side_bar .side_bar_con.on .top .comment_box &amp;gt; div:last-child{
            margin-bottom: 30px;
        }
        .side_bar_wrap .side_bar .side_bar_con .bottom{
            position: relative;
            background: #FBFBFB;
            border: 1px solid #ECECEC;
            border-radius: 0px 0px 5px 5px;
            text-align: center;
            height: 130px;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 13px;
            padding: 0 20px;
        }
        .side_bar_wrap .side_bar .side_bar_con.on .bottom{
            background: #fff;
        }
        .side_bar_wrap .side_bar .bottom .tarsfer button{
            width: 50px;
            height: 25px;
            background: #F1F1F1;
            border-radius: 5px;
            position: absolute;
            right: 14px;
            bottom: 12px;
            font-size: 12px;
        }
        .side_bar_wrap .side_bar .bottom textarea{
            height: 67px;
            border: none;
            resize: none;
            position: relative;
            top: -13px;
            font-size: 12px;
            width: 100%;
        }
        .side_bar_wrap .side_bar .bottom textarea::placeholder{
            text-align: center;
            background: #fff;
            border: none;
        }

        #messageAppend .my_message {
            /* 내가 보낸 메시지의 스타일 지정 */
            background-color: #f5f5f5;
            border-radius: 8px;
            padding: 8px;
            text-align: right;
        }

        #messageAppend .other_message {
            /* 다른 사용자가 보낸 메시지의 스타일 지정 */
            background-color: #eaeaea;
            border-radius: 8px;
            padding: 8px;
            text-align: left;
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;side_bar_wrap&quot;&amp;gt;
        &amp;lt;!-- sidebar --&amp;gt;
        &amp;lt;div class=&quot;side_bar&quot;&amp;gt;
            &amp;lt;div class=&quot;side_bar_con on&quot;&amp;gt;
                &amp;lt;div class=&quot;top &quot;&amp;gt;
                    &amp;lt;h1&amp;gt;채팅&amp;lt;i&amp;gt;&amp;lt;img src=&quot;/assets/images/i_comment.png&quot; alt=&quot;&quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/h1&amp;gt;
                    &amp;lt;div class=&quot;comment_box scrollbar&quot; id=&quot;messageAppend&quot;&amp;gt;&amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div class=&quot;bottom&quot;&amp;gt;
                &amp;lt;textarea class=&quot;scrollbar&quot; name=&quot;&quot; id=&quot;messageText&quot; cols=&quot;30&quot; rows=&quot;10&quot; placeholder=&quot;내용을 작성해 주세요!&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
                    &amp;lt;div class=&quot;tarsfer&quot;&amp;gt;
                        &amp;lt;button type=&quot;button&quot; onclick=&quot;sendMessage()&quot;&amp;gt;전송&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;/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;b&gt;user_chat_list.html&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1693897324065&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;script src=&quot;https://www.gstatic.com/firebasejs/8.10.1/firebase-app.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;https://www.gstatic.com/firebasejs/8.10.1/firebase-database.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

    &amp;lt;script&amp;gt;
        const firebaseConfig = {
            apiKey: &quot;&quot;,
            authDomain: &quot;&quot;,
            databaseURL: &quot;&quot;,
            projectId: &quot;&quot;,
            storageBucket: &quot;&quot;,
            messagingSenderId: &quot;&quot;,
            appId: &quot;&quot;
        };

        firebase.initializeApp(firebaseConfig);
        // const app = initializeApp(firebaseConfig); // 이거는 9버전 문법

        // Firebase 실시간 데이터베이스 참조
        const dbRef = firebase.database().ref(&quot;chats&quot;); // 채팅방

        // 사용자 UID를 가져오는 가정
        const senderUID = &quot;0dad4e6f-add4-447f-aef0-a3a096be4e00&quot;; // 회원의 UID

        // 새로운 채팅방 생성
        function createChatRoom() {
            // 임의의 채팅방 번호 생성
            const chatRoomNumber = self.crypto.randomUUID();
            const participants = {
                [senderUID]: true,
                // 여러 사용자가 있다면 추가로 참여자를 넣어주기
            };

            // 채팅방 생성
            dbRef.child(chatRoomNumber).set({ participants })
            // chatRoomList 비우고 새로 추가
            const chatRoomList = document.getElementById(&quot;chatRoomList&quot;);
            chatRoomList.innerHTML = &quot;&quot;;
            getUserChatRooms(displayUserChatRooms);
        }

        // 사용자의 채팅방 리스트 가져오기
        function getUserChatRooms(callback) {
            const userChatRooms = [];
            dbRef.once(&quot;value&quot;, snapshot =&amp;gt; {
                snapshot.forEach(chatSnapshot =&amp;gt; {
                    const chatRoomNumber = chatSnapshot.key;
                    const participants = chatSnapshot.val().participants;
                    if (participants[senderUID]) {
                        userChatRooms.push(chatRoomNumber);
                    }
                });
                // 채팅방 리스트를 가져온 후에 콜백 함수를 호출하여 전달
                callback(userChatRooms);
            });
        }

        // 채팅방 li에 추가
        async function displayUserChatRooms(chatRooms) {
            const chatRoomList = document.getElementById(&quot;chatRoomList&quot;);

            for (const chatRoomNumber of chatRooms) {
                const li = document.createElement(&quot;li&quot;);
                const unreadCount = await countUnreadMessages(chatRoomNumber, senderUID);

                li.innerText = `채팅방: ${chatRoomNumber} (읽지 않은 메시지: ${unreadCount}개)`;
                li.addEventListener(&quot;click&quot;, async () =&amp;gt; {
                    // 클릭한 채팅방 번호를 chat.html로 전달하면서 페이지 이동
                    await messageRead(chatRoomNumber, senderUID); // await를 사용하여 messageRead가 완료될 때까지 기다림
                    window.location.href = `chat1?chatRoomNumber=${chatRoomNumber}&amp;amp;senderUID=${senderUID}`;
                });

                chatRoomList.appendChild(li);
            }
        }

        // 안 읽은 메세지 카운트
        async function countUnreadMessages(chatRoomNumber, userUID) {
            const messagesRef = firebase.database().ref(`messages/${chatRoomNumber}`);

            let unreadCount = 0;

            // child_added 이벤트 리스너 추가
            messagesRef.on(&quot;child_added&quot;, snapshot =&amp;gt; {
                const message = snapshot.val();
                if (message.senderUID !== userUID &amp;amp;&amp;amp; !message.checked) {
                    unreadCount++;
                }
                // 새 메시지가 추가될 때마다 unreadCount가 갱신됩니다.
                console.log(unreadCount);

                // 채팅방 리스트의 내용을 업데이트
                updateChatRoomList(chatRoomNumber, unreadCount);
            });

            // 최초에 메시지를 읽지 않은 메시지들을 카운트하여 반환합니다.
            return unreadCount;

        }

        // 메시지를 읽었을 때 호출되는 함수
        async function messageRead(chatRoomNumber, userUID) {
            return new Promise((resolve, reject) =&amp;gt; {
                const messagesRef = firebase.database().ref(`messages/${chatRoomNumber}`);
                messagesRef.once(&quot;value&quot;, snapshot =&amp;gt; {
                    snapshot.forEach(messageSnapshot =&amp;gt; {
                        const messageID = messageSnapshot.key;
                        const message = messageSnapshot.val();
                        if (message.senderUID !== userUID &amp;amp;&amp;amp; !message.checked) {
                            const messageRef = messagesRef.child(messageID);
                            messageRef.update({ checked: true });
                        }
                    });
                    resolve(); // 작업이 끝나면 resolve 호출
                });
            });
        }

        // 메세지가 추가되면 안 읽은 메시지 count 업데이트
        function updateChatRoomList(chatRoomNumber, unreadCount) {
            const chatRoomList = document.getElementById(&quot;chatRoomList&quot;);
            const chatRoomItems = chatRoomList.getElementsByTagName(&quot;li&quot;);

            for (let i = 0; i &amp;lt; chatRoomItems.length; i++) {
                const item = chatRoomItems[i];
                if (item.innerText.includes(`채팅방: ${chatRoomNumber}`)) {
                    // 채팅방 리스트에서 해당 채팅방을 찾아 업데이트
                    item.innerText = `채팅방: ${chatRoomNumber} (읽지 않은 메시지: ${unreadCount}개)`;
                    break; // 해당 채팅방을 찾았으면 루프 종료
                }
            }
        }

        window.onload = () =&amp;gt; {
            // getUserChatRooms 함수 호출 시 콜백 함수를 전달하여 데이터를 가져온 후에 displayUserChatRooms 함수 호출
            getUserChatRooms(displayUserChatRooms);
        };


    &amp;lt;/script&amp;gt;
    &amp;lt;style&amp;gt;
        #chatRoomList li {
            cursor: pointer;
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body class=&quot;notosanskr&quot;&amp;gt;
    &amp;lt;button onclick=&quot;createChatRoom()&quot;&amp;gt;새 채팅방 생성&amp;lt;/button&amp;gt;

    &amp;lt;!-- 채팅방 리스트 표시 --&amp;gt;
    &amp;lt;h2&amp;gt;내 채팅방 리스트&amp;lt;/h2&amp;gt;
    &amp;lt;ul id=&quot;chatRoomList&quot;&amp;gt;
        &amp;lt;!-- 채팅방 리스트를 동적으로 추가 --&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;all_chat_list.html&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1693897413459&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;script src=&quot;https://www.gstatic.com/firebasejs/8.10.1/firebase-app.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;https://www.gstatic.com/firebasejs/8.10.1/firebase-database.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

    &amp;lt;script&amp;gt;
        const firebaseConfig = {
            apiKey: &quot;&quot;,
            authDomain: &quot;&quot;,
            databaseURL: &quot;&quot;,
            projectId: &quot;&quot;,
            storageBucket: &quot;&quot;,
            messagingSenderId: &quot;&quot;,
            appId: &quot;&quot;
        };

        firebase.initializeApp(firebaseConfig);
        // const app = initializeApp(firebaseConfig); // 이거는 9버전 문법

        // 사용자 UID를 가져오는 가정
        const senderUID = &quot;0dad4e6f-add4-447f-aef0-a3a096be4e00&quot;; // 회원의 UID

        // Firebase 실시간 데이터베이스 참조
        const dbRef = firebase.database().ref(&quot;chats&quot;); // 채팅방

        // 전체 채팅방 리스트 가져오기
        function getAllChatRooms(callback) {
            const chatRooms = [];
            dbRef.once(&quot;value&quot;, snapshot =&amp;gt; {
                snapshot.forEach(chatSnapshot =&amp;gt; {
                    const chatRoomNumber = chatSnapshot.key;
                    chatRooms.push(chatRoomNumber);
                });
                // 전체 채팅방 리스트를 가져온 후에 콜백 함수를 호출하여 전달
                callback(chatRooms);
            });
        }

        // 전체 채팅방 리스트 가져와서 동적으로 추가
        function displayAllChatRooms(chatRooms) {
            const chatRoomList = document.getElementById(&quot;chatRoomAllList&quot;);
            chatRooms.forEach(chatRoomNumber =&amp;gt; {
                const li = document.createElement(&quot;li&quot;);
                li.innerText = `채팅방: ${chatRoomNumber}`;
                // li 클릭 이벤트
                li.addEventListener(&quot;click&quot;, () =&amp;gt; {
                    // const userUID = self.crypto.randomUUID(); // 회원의 uid가 기존에 있을때지만 지금은 random값으로 만들어줘
                    dbRef.child(chatRoomNumber).child(&quot;participants&quot;).child(senderUID).set(true);
                    window.location.href = `chat1?chatRoomNumber=${chatRoomNumber}&amp;amp;senderUID=${senderUID}`;

                });
                chatRoomList.appendChild(li);
            });
        }

        window.onload = () =&amp;gt; {
            // 전체 채팅방 리스트 가져오기
            getAllChatRooms(displayAllChatRooms);
        };
        

    &amp;lt;/script&amp;gt;
    &amp;lt;style&amp;gt;
        #chatRoomAllList li {
            cursor: pointer;
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h2&amp;gt;채팅방 리스트&amp;lt;/h2&amp;gt;
    &amp;lt;ul id=&quot;chatRoomAllList&quot;&amp;gt;
        &amp;lt;!-- 채팅방 리스트를 동적으로 추가 --&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 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;/p&gt;</description>
      <category>IT/etc</category>
      <category>firebase</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/318</guid>
      <comments>https://makeaplayground.tistory.com/318#entry318comment</comments>
      <pubDate>Tue, 5 Sep 2023 16:04:07 +0900</pubDate>
    </item>
    <item>
      <title>MySQL 연동 시 Public key retrieval is not allowed 오류 해결</title>
      <link>https://makeaplayground.tistory.com/317</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;프로젝트를 빌드하니 해당 오류가 발생하였다&lt;/span&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-filename=&quot;스크린샷 2023-09-05 오전 11.14.24.png&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cS7dFz/btss91iHRRH/d2Neukr5QTKtp7FYYhAl4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cS7dFz/btss91iHRRH/d2Neukr5QTKtp7FYYhAl4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cS7dFz/btss91iHRRH/d2Neukr5QTKtp7FYYhAl4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcS7dFz%2Fbtss91iHRRH%2Fd2Neukr5QTKtp7FYYhAl4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1264&quot; height=&quot;42&quot; data-filename=&quot;스크린샷 2023-09-05 오전 11.14.24.png&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Public&amp;nbsp;key&amp;nbsp;retrieval&amp;nbsp;is&amp;nbsp;not&amp;nbsp;allowed&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;[ 해결 방법 ]&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;application.properties DB 정보에서 url에 &lt;b&gt;allowPublicKeyRetrieval=true&amp;amp;useSSL=false &lt;/b&gt;&lt;span style=&quot;text-align: left;&quot;&gt;를 추가한다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1693885158317&quot; class=&quot;ini&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring.datasource.url = jdbc:mysql://localhost:8080/DB명?useSSL=false&amp;amp;allowPublicKeyRetrieval=true&amp;amp;useUnicode=true&amp;amp;serverTimezone=Asia/Seoul&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;&lt;/p&gt;</description>
      <category>IT/error</category>
      <category>mysql</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/317</guid>
      <comments>https://makeaplayground.tistory.com/317#entry317comment</comments>
      <pubDate>Tue, 5 Sep 2023 12:40:31 +0900</pubDate>
    </item>
    <item>
      <title>nohup: ignoring input and appending output to 'nohup.out'</title>
      <link>https://makeaplayground.tistory.com/316</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;jar 파일을 nohup 명령어로 실행시킬려고 하니, 갑자기 서버 구동이 안됬다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오전 11.13.37.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFLDjy/btssVMmTUGw/AdlgA6Syrjhs44cI8kvib0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFLDjy/btssVMmTUGw/AdlgA6Syrjhs44cI8kvib0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFLDjy/btssVMmTUGw/AdlgA6Syrjhs44cI8kvib0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFLDjy%2FbtssVMmTUGw%2FAdlgA6Syrjhs44cI8kvib0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;226&quot; data-filename=&quot;스크린샷 2023-09-05 오전 11.13.37.png&quot; data-origin-width=&quot;1206&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;구동 후, nohup: ignoring input and appending output to 'nohup.out' 이렇게 뜨더니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8080로 실행되는거를 확인해도 내역이 없다&lt;/p&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;cat nohup.out &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;나 같은 경우, Public key retrieval is not allowed 오류나 떠 있었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 내역을 수정하고 다시 nohup java -jar [파일명].jar &amp;amp; 하니 정상 실행이 되었다!&lt;/p&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;+ &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Public key retrieval is not allowed&lt;span&gt; 오류 해결법&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://makeaplayground.tistory.com/317&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://makeaplayground.tistory.com/317&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1693885259042&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MySQL 연동 시 Public key retrieval is not allowed 오류 해결&quot; data-og-description=&quot;프로젝트를 빌드하니 해당 오류가 발생하였다 Public key retrieval is not allowed [ 해결 방법 ] application.properties DB 정보에서 url에 allowPublicKeyRetrieval=true&amp;amp;useSSL=false 를 추가한다 spring.datasource.url = jdbc:mysql:&quot; data-og-host=&quot;makeaplayground.tistory.com&quot; data-og-source-url=&quot;https://makeaplayground.tistory.com/317&quot; data-og-url=&quot;https://makeaplayground.tistory.com/317&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bJodVJ/hyTPHr5alF/FVuFCIkSW0WppkIk2YE9FK/img.png?width=800&amp;amp;height=26&amp;amp;face=0_0_800_26,https://scrap.kakaocdn.net/dn/beIYnF/hyTPul0mrj/9mmjJUCJkPxVLWf3KSDTkK/img.png?width=800&amp;amp;height=26&amp;amp;face=0_0_800_26,https://scrap.kakaocdn.net/dn/wIomZ/hyTPByDdn3/QK9TgGZvkYETnLrcVENn51/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://makeaplayground.tistory.com/317&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://makeaplayground.tistory.com/317&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bJodVJ/hyTPHr5alF/FVuFCIkSW0WppkIk2YE9FK/img.png?width=800&amp;amp;height=26&amp;amp;face=0_0_800_26,https://scrap.kakaocdn.net/dn/beIYnF/hyTPul0mrj/9mmjJUCJkPxVLWf3KSDTkK/img.png?width=800&amp;amp;height=26&amp;amp;face=0_0_800_26,https://scrap.kakaocdn.net/dn/wIomZ/hyTPByDdn3/QK9TgGZvkYETnLrcVENn51/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MySQL 연동 시 Public key retrieval is not allowed 오류 해결&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트를 빌드하니 해당 오류가 발생하였다 Public key retrieval is not allowed [ 해결 방법 ] application.properties DB 정보에서 url에 allowPublicKeyRetrieval=true&amp;amp;useSSL=false 를 추가한다 spring.datasource.url = jdbc:mysql:&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;makeaplayground.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/etc</category>
      <category>nohup</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/316</guid>
      <comments>https://makeaplayground.tistory.com/316#entry316comment</comments>
      <pubDate>Tue, 5 Sep 2023 12:34:29 +0900</pubDate>
    </item>
    <item>
      <title>파이어베이스 실시간 데이터베이스로 채팅 구현1 (설정, 셋팅)</title>
      <link>https://makeaplayground.tistory.com/315</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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 파이어베이스 접속하여 프로젝트 생성&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.01.03.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSyUpn/btssVGtpRG3/ouEPKYRW2KBpvCEBWQDiL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSyUpn/btssVGtpRG3/ouEPKYRW2KBpvCEBWQDiL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSyUpn/btssVGtpRG3/ouEPKYRW2KBpvCEBWQDiL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSyUpn%2FbtssVGtpRG3%2FouEPKYRW2KBpvCEBWQDiL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;331&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.01.03.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.01.15.png&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2REaf/btssYRIeWIQ/ZJgIfRn1QFhTJEfzKLSCgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2REaf/btssYRIeWIQ/ZJgIfRn1QFhTJEfzKLSCgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2REaf/btssYRIeWIQ/ZJgIfRn1QFhTJEfzKLSCgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2REaf%2FbtssYRIeWIQ%2FZJgIfRn1QFhTJEfzKLSCgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;341&quot; height=&quot;280&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.01.15.png&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.01.36.png&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bf70VN/btssUJYnaCj/IiI3uwOWmYoUtVYAWUZ1Lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bf70VN/btssUJYnaCj/IiI3uwOWmYoUtVYAWUZ1Lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bf70VN/btssUJYnaCj/IiI3uwOWmYoUtVYAWUZ1Lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbf70VN%2FbtssUJYnaCj%2FIiI3uwOWmYoUtVYAWUZ1Lk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;601&quot; height=&quot;425&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.01.36.png&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.01.58.png&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;688&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nEGY9/btssVT7uVz3/pZJVZlErebsHuhn5Lzgew0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nEGY9/btssVT7uVz3/pZJVZlErebsHuhn5Lzgew0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nEGY9/btssVT7uVz3/pZJVZlErebsHuhn5Lzgew0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnEGY9%2FbtssVT7uVz3%2FpZJVZlErebsHuhn5Lzgew0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;604&quot; height=&quot;688&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.01.58.png&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;688&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.03.14.png&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IPFio/btssUOZAxsg/UFTELa1rhLqaKyXkEbfoGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IPFio/btssUOZAxsg/UFTELa1rhLqaKyXkEbfoGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IPFio/btssUOZAxsg/UFTELa1rhLqaKyXkEbfoGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIPFio%2FbtssUOZAxsg%2FUFTELa1rhLqaKyXkEbfoGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;335&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.03.14.png&quot; data-origin-width=&quot;286&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;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Realtime Database (실시간 데이터베이스) 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.03.35.png&quot; data-origin-width=&quot;235&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GCKmT/btstcQ17Jyj/iXx8T9Bws7WUR7J2oHNtWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GCKmT/btstcQ17Jyj/iXx8T9Bws7WUR7J2oHNtWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GCKmT/btstcQ17Jyj/iXx8T9Bws7WUR7J2oHNtWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGCKmT%2FbtstcQ17Jyj%2FiXx8T9Bws7WUR7J2oHNtWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;425&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.03.35.png&quot; data-origin-width=&quot;235&quot; data-origin-height=&quot;425&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.04.12.png&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8IyQJ/btstax9ztZN/29xKchyiKQFdtdSCZTUAjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8IyQJ/btstax9ztZN/29xKchyiKQFdtdSCZTUAjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8IyQJ/btstax9ztZN/29xKchyiKQFdtdSCZTUAjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8IyQJ%2Fbtstax9ztZN%2F29xKchyiKQFdtdSCZTUAjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;415&quot; height=&quot;219&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.04.12.png&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.04.40.png&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uFyEW/btss3HrOhMM/4NwdMmfN0mQTQ7dtfwbha0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uFyEW/btss3HrOhMM/4NwdMmfN0mQTQ7dtfwbha0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uFyEW/btss3HrOhMM/4NwdMmfN0mQTQ7dtfwbha0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuFyEW%2Fbtss3HrOhMM%2F4NwdMmfN0mQTQ7dtfwbha0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;816&quot; height=&quot;380&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.04.40.png&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.04.56.png&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn1dsj/btss74tyijT/kNZalGXW0sEeAzDkobhYEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn1dsj/btss74tyijT/kNZalGXW0sEeAzDkobhYEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn1dsj/btss74tyijT/kNZalGXW0sEeAzDkobhYEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn1dsj%2Fbtss74tyijT%2FkNZalGXW0sEeAzDkobhYEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;810&quot; height=&quot;506&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.04.56.png&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.06.00.png&quot; data-origin-width=&quot;1547&quot; data-origin-height=&quot;902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/STl49/btssUHGhjSn/knglHkuJoTgdWKQhv6sKY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/STl49/btssUHGhjSn/knglHkuJoTgdWKQhv6sKY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/STl49/btssUHGhjSn/knglHkuJoTgdWKQhv6sKY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSTl49%2FbtssUHGhjSn%2FknglHkuJoTgdWKQhv6sKY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1547&quot; height=&quot;902&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.06.00.png&quot; data-origin-width=&quot;1547&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;위와 같이 생성된다&lt;/p&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 프로젝트 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.12.23.png&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;133&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bniauc/btss3VKroAC/WRzEdh4ZE8UjUq9PSVvgL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bniauc/btss3VKroAC/WRzEdh4ZE8UjUq9PSVvgL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bniauc/btss3VKroAC/WRzEdh4ZE8UjUq9PSVvgL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbniauc%2Fbtss3VKroAC%2FWRzEdh4ZE8UjUq9PSVvgL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;373&quot; height=&quot;133&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.12.23.png&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;133&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.12.57.png&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pxr1K/btstaBqCSxL/aNQ7VMtA1gtrCCVCQmkZj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pxr1K/btstaBqCSxL/aNQ7VMtA1gtrCCVCQmkZj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pxr1K/btstaBqCSxL/aNQ7VMtA1gtrCCVCQmkZj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpxr1K%2FbtstaBqCSxL%2FaNQ7VMtA1gtrCCVCQmkZj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1071&quot; height=&quot;306&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.12.57.png&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.13.35.png&quot; data-origin-width=&quot;78&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/criEtR/btss73g6hJI/zkLIQAJYuY2dVCsQav3HZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/criEtR/btss73g6hJI/zkLIQAJYuY2dVCsQav3HZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/criEtR/btss73g6hJI/zkLIQAJYuY2dVCsQav3HZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcriEtR%2Fbtss73g6hJI%2FzkLIQAJYuY2dVCsQav3HZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;78&quot; height=&quot;84&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.13.35.png&quot; data-origin-width=&quot;78&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;&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;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.14.50.png&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tYcvD/btssUcl3dhE/je0lufki2vIX8GytdpnCmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tYcvD/btssUcl3dhE/je0lufki2vIX8GytdpnCmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tYcvD/btssUcl3dhE/je0lufki2vIX8GytdpnCmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtYcvD%2FbtssUcl3dhE%2Fje0lufki2vIX8GytdpnCmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;562&quot; height=&quot;480&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.14.50.png&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.15.23.png&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QSFfw/btss3WP7juK/s4KmTDstveAo2kfNLlTx31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QSFfw/btss3WP7juK/s4KmTDstveAo2kfNLlTx31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QSFfw/btss3WP7juK/s4KmTDstveAo2kfNLlTx31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQSFfw%2Fbtss3WP7juK%2Fs4KmTDstveAo2kfNLlTx31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;594&quot; data-filename=&quot;스크린샷 2023-09-05 오전 10.15.23.png&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;916&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;firebaseConfig는 추후 js 파일에 넣어줄 예정&lt;/p&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;&lt;a href=&quot;https://makeaplayground.tistory.com/318&quot; rel=&quot;noopener&quot;&gt;https://makeaplayground.tistory.com/318&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699782940544&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;파이어베이스 실시간 데이터베이스로 채팅 구현2 (코드)&quot; data-og-description=&quot;구조는 이렇게 구성했다 1. 유저 생성 (user_list.html) 현재 프로젝트는 테스트용으로 만들었기 때문에 유저가 개념이 없어서, 페이지에서 유저를 생성해 준다 새 유저 생성 버튼을 클릭하면, 파이&quot; data-og-host=&quot;makeaplayground.tistory.com&quot; data-og-source-url=&quot;https://makeaplayground.tistory.com/318&quot; data-og-url=&quot;https://makeaplayground.tistory.com/318&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/FvFck/hyUuUYafv6/nkY26xLr0rYevtMLr6VK41/img.png?width=597&amp;amp;height=433&amp;amp;face=0_0_597_433,https://scrap.kakaocdn.net/dn/kqFBC/hyUuZZue2Q/hgAspRxy0slzg5ii0Hrkg0/img.png?width=597&amp;amp;height=433&amp;amp;face=0_0_597_433,https://scrap.kakaocdn.net/dn/bLjQ4K/hyUu5ZHDNA/ZBylSSNfKupYaooQFCPRO0/img.png?width=1190&amp;amp;height=786&amp;amp;face=0_0_1190_786&quot;&gt;&lt;a href=&quot;https://makeaplayground.tistory.com/318&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://makeaplayground.tistory.com/318&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/FvFck/hyUuUYafv6/nkY26xLr0rYevtMLr6VK41/img.png?width=597&amp;amp;height=433&amp;amp;face=0_0_597_433,https://scrap.kakaocdn.net/dn/kqFBC/hyUuZZue2Q/hgAspRxy0slzg5ii0Hrkg0/img.png?width=597&amp;amp;height=433&amp;amp;face=0_0_597_433,https://scrap.kakaocdn.net/dn/bLjQ4K/hyUu5ZHDNA/ZBylSSNfKupYaooQFCPRO0/img.png?width=1190&amp;amp;height=786&amp;amp;face=0_0_1190_786');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;파이어베이스 실시간 데이터베이스로 채팅 구현2 (코드)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;구조는 이렇게 구성했다 1. 유저 생성 (user_list.html) 현재 프로젝트는 테스트용으로 만들었기 때문에 유저가 개념이 없어서, 페이지에서 유저를 생성해 준다 새 유저 생성 버튼을 클릭하면, 파이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;makeaplayground.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/etc</category>
      <category>firebase</category>
      <category>realtime database</category>
      <category>실시간 데이터베이스</category>
      <category>파이어베이스</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/315</guid>
      <comments>https://makeaplayground.tistory.com/315#entry315comment</comments>
      <pubDate>Tue, 5 Sep 2023 10:24:46 +0900</pubDate>
    </item>
    <item>
      <title>[ github ] submodule이란?</title>
      <link>https://makeaplayground.tistory.com/314</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;GitHub&amp;nbsp;Submodule&lt;/b&gt;은 Git 프로젝트에서 다른 Git 프로젝트를 하위 디렉토리에 포함시키는 방법이다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Submodule을 사용하면 하나의 Git 저장소에서 여러 개의 프로젝트를 관리할 수 있으며, 각 프로젝트는 별도의 저장소로 유진된다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이를 통해 복잡한 프로젝트를 여러 저장소로 분할하여 개발, 관리, 배포를 용이하게 할 수 있다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이번에 개인 프로젝트를 진행하면, 포트폴리오를 위한 프로젝트니까 프로젝트를 Public으로 공개하기로 했다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그러면 노출되면 안되는 정보가 있는 application 파일은 어떻게 관리할까 고민하던 중에 submodule를 사용하기로 했다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;보안상 노출이 안되는 키값이 있는 application.yml 파일을 관리하기에는 아래 3가지 방법이 있는것 같다&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&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;Jasypt를 사용하여 설정파일 암호화 &amp;rarr; 라이브러리 설치해야해서 번거로움&lt;/li&gt;
&lt;li&gt;Github Secret 사용 &amp;rarr; application.yml 파일이 수정될 때마다 secret에 들어와서 Base64로 인코딩 된 application.yml 파일을 붙여 넣은 뒤 Github Actions를 실행해서 빌드해야 함. 번거로움&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Github Submodule 사용 &amp;rarr; 선택&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;1. 서브모듈 레파지토리 생성&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Private 레포지토리 생성 후 application.yml을 넣는다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;/src/main/resources 와 /src/test/resources 로 들어갈 설정 파일 2개를 이름을 다르게 지정하여 넣어줌&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CoZdq/btssDLI7L4K/OLkzurgN0sye5IyX5ts5hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CoZdq/btssDLI7L4K/OLkzurgN0sye5IyX5ts5hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CoZdq/btssDLI7L4K/OLkzurgN0sye5IyX5ts5hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCoZdq%2FbtssDLI7L4K%2FOLkzurgN0sye5IyX5ts5hK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;367&quot; height=&quot;319&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1111&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;2. 메인 리포지토리에 서브모듈 추가&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;메인 리포지토리를 로컬로 clone 받고 서브모듈을 추가한다&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1693539884359&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone [메인 리포지토리 url]
git submodule add [서브모듈 리포지토리 url]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 clone 받은 메인 리포지토리에 .gitmodules 파일이 생성된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 메인 리포지토리의 default 브랜치명이 master가 아닐 시, &lt;b&gt;.gitmodules&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;아래는 브랜치명이 main일 경우&lt;/p&gt;
&lt;pre id=&quot;code_1693540048950&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[submodule &quot;submodule-config&quot;]
	path = submodule-config
	url = https://github.com/XXXXXX/submodule-config.git
	branch = 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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;3. application.yml이 수정되었을 경우&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메인 레파지토리 경로에서 아래 명령어로 최신 서브모듈로 업데이트&lt;/p&gt;
&lt;pre id=&quot;code_1693540237853&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 프로젝트와 서브모듈 같이 clone 받는 명령어
git clone --recurse-submodules [프로젝트URL]
// 서브모듈만 clone 받는 명령어
git submodule update --init --recursive
// 서브모듈 최신상태 확인
git submodule status&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1693541196352&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Submodule을 포함시키고자 하는 Git 저장소에 Submodule을 추가
git submodule add [repository-url] [path]
// 서브모듈 초기화
git submodule init
// 서브모듈 업데이트
git submodule update&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;&lt;b&gt;4. build.gradle 추가&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 시 서브모듈의 파일을 복사해서 resources 경로에 넣으려면 &lt;b&gt;build.gradle&lt;/b&gt; 아래와 같이 추가해준다&lt;/p&gt;
&lt;pre id=&quot;code_1693540395210&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;task copyGitSubmodule(type: Copy) {
	from './config'
	include '*.yml'
	into './src/main/resources'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 하는것이 일반적이나, &lt;br /&gt;main과 test 두개의 파일을 copy하면서 이름을 application.yml로 변경해주고 싶으므로 아래와 같이 설정해준다&lt;/p&gt;
&lt;pre id=&quot;code_1693540442276&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;task copyMainResources(type: Copy) {
	copy {
		from './submodule-config'
		include &quot;application-main.yml&quot;
		into './src/main/resources'
		rename { String fileName -&amp;gt;
			fileName.replace(&quot;application-main.yml&quot;, &quot;application.yml&quot;)
		}
	}
}

task copyTestResources(type: Copy) {
	copy {
		from './submodule-config'
		include &quot;application-test.yml&quot;
		into './src/test/resources'
		rename { String fileName -&amp;gt;
			fileName.replace(&quot;application-test.yml&quot;, &quot;application.yml&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;5. .gitignore 파일에 application.yml 추가&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1693540566298&quot; class=&quot;applescript&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;src/main/resources/application.yml
src/test/resources/application.yml&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;6.PAT&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt; (GitHub Personal Access Token) 토큰 발급&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #24292e; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;서브모듈이 private이면 접근권한이 없을 때 clone받을 수 없다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Github에서 PAT (Personal Access Token) 발급 후 &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;Github 사용자 아이콘 클릭 &amp;rarr; Settings &amp;rarr; 왼쪽 아래 Developer settings &amp;rarr; Personal access tokens &amp;rarr; Tokens (classic) &amp;rarr; Generate new token &amp;rarr; (classic) 선택 &amp;rarr; Expiration 30 days, repo만 체크하여 Generate token &amp;rarr; 복사하기&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;890&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2wfZw/btssHCkrNoi/BMt94GkdIrKTnpckqtbmg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2wfZw/btssHCkrNoi/BMt94GkdIrKTnpckqtbmg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2wfZw/btssHCkrNoi/BMt94GkdIrKTnpckqtbmg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2wfZw%2FbtssHCkrNoi%2FBMt94GkdIrKTnpckqtbmg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;518&quot; height=&quot;890&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;890&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;&lt;b&gt;7. 메인 리포지토리에 토큰 적용&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메인 리포지토리 Settings &amp;rarr; Secrets and variables &amp;rarr; Actions &amp;rarr; New repository secret &amp;rarr; Name을 SUBMODULE_TOKEN 으로 설정 후 토큰 붙여넣기 &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;&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>IT/github</category>
      <category>Github</category>
      <category>submodule</category>
      <category>깃헙</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/314</guid>
      <comments>https://makeaplayground.tistory.com/314#entry314comment</comments>
      <pubDate>Fri, 1 Sep 2023 13:07:54 +0900</pubDate>
    </item>
    <item>
      <title>orElseThrow로 코드 가독성을 높이자</title>
      <link>https://makeaplayground.tistory.com/313</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;회사에서 프로젝트 진행시 Optional 객체의 유무를 판단하고 예외를 처리하기 위해 if문을 사용했다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러다가&amp;nbsp;개인 스터디에서 다른 분들이 orElseThrow를 사용하는 거를 보고 코드의 가독성이 높다고 생각하게 되었다&lt;/p&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;아래 if문을 쓸 때와 orElseThrow 사용할 때 코드를 비교해 보면,&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;span style=&quot;color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;예시 코드&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693358079513&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class NoticeService {

   // if 사용
   public void remove(Long noticeId) {
	// select
   	Optional&amp;lt;NoticeResponse&amp;gt; noticeResponse = noticeMapper.findById(noticeId);                               
	// 예외처리
   	if(noticeResponse.isEmpty()){ throw new NoticeNotFoundException(); }
	  	
        if (noticeMapper.deleteById(noticeId) != 1) {
           throw new RemoveFailedException();
    }
}
    
    
    // orElseThrow
    public void remove(Long noticeId) {
    	// select &amp;amp; 예외처리 동시에
        NoticeResponse noticeResponse = noticeMapper.findById(noticeId)
                     .orElseThrow(NoticeNotFoundException::new);
        
        if (noticeMapper.deleteById(noticeId) != 1) {
            throw new RemoveFailedException();
        }
    }

    
}&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;orElseThrow 사용으로 select 와 예외처리를 동시에 하면서 if문보다 코드 한줄이 줄어든게 된다&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/java</category>
      <category>java</category>
      <category>optional</category>
      <category>orElseThrow</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/313</guid>
      <comments>https://makeaplayground.tistory.com/313#entry313comment</comments>
      <pubDate>Wed, 30 Aug 2023 10:30:09 +0900</pubDate>
    </item>
    <item>
      <title>[ github ] 원격 저장소 연결 및 끊기 (git remote)</title>
      <link>https://makeaplayground.tistory.com/312</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;git 에서 default_project를 clone 받은 후, 다른 레파지토리에 push 하려고 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결되어 있는 git 을 어떻게 끊을까?&lt;/p&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;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;연결된 저장소 확인&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693280803170&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git remote -v&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-29 오후 12.47.29.png&quot; data-origin-width=&quot;1834&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCYoG5/btssgI61zEj/D7vWY1WzDlyyDAOkrQfGM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCYoG5/btssgI61zEj/D7vWY1WzDlyyDAOkrQfGM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCYoG5/btssgI61zEj/D7vWY1WzDlyyDAOkrQfGM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCYoG5%2FbtssgI61zEj%2FD7vWY1WzDlyyDAOkrQfGM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1834&quot; height=&quot;136&quot; data-filename=&quot;스크린샷 2023-08-29 오후 12.47.29.png&quot; data-origin-width=&quot;1834&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 &lt;i&gt;&lt;b&gt;git remote -v&lt;/b&gt; &lt;/i&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;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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;연결된 저장소 끊기&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693281108648&quot; class=&quot;maxima&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git remote remove origin&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;&quot;&gt;&lt;i&gt;&lt;b&gt;git remote remove origin&lt;/b&gt;&lt;/i&gt; 후 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;git remote -v 하면은 연결된 저장소가 없는거를 확인 할 수 있다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-29 오후 12.54.57.png&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JmXft/btssk0TbtE5/pJnoRit4r51XHMJX1vT0MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JmXft/btssk0TbtE5/pJnoRit4r51XHMJX1vT0MK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JmXft/btssk0TbtE5/pJnoRit4r51XHMJX1vT0MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJmXft%2Fbtssk0TbtE5%2FpJnoRit4r51XHMJX1vT0MK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1110&quot; height=&quot;116&quot; data-filename=&quot;스크린샷 2023-08-29 오후 12.54.57.png&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;116&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;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;&lt;span style=&quot;color: #ffffff; background-color: #f3c000;&quot;&gt;&lt;b&gt;저장소 연결&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장소 연결이 끊어진 프로젝트를 새로운 저장소에 연결할려면&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-29 오후 12.59.37.png&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/edP6aH/btsslb8vFiq/Cd8EYP92JAP6dFOKAtOdqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/edP6aH/btsslb8vFiq/Cd8EYP92JAP6dFOKAtOdqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/edP6aH/btsslb8vFiq/Cd8EYP92JAP6dFOKAtOdqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FedP6aH%2Fbtsslb8vFiq%2FCd8EYP92JAP6dFOKAtOdqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;596&quot; height=&quot;296&quot; data-filename=&quot;스크린샷 2023-08-29 오후 12.59.37.png&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;394&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_1693281822054&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git remote add origin [저장소 url]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;git remote add origin [저장소 url]&lt;/b&gt; &lt;/i&gt;후 git remote -v 하면은 새로운 저장소가 연결된 걸 확인 할 수 있다&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-filename=&quot;스크린샷 2023-08-29 오후 1.04.27.png&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E9hO1/btsslbOdoNY/5z9aRMf6Uy5TvYBowLDGz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E9hO1/btsslbOdoNY/5z9aRMf6Uy5TvYBowLDGz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E9hO1/btsslbOdoNY/5z9aRMf6Uy5TvYBowLDGz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE9hO1%2FbtsslbOdoNY%2F5z9aRMf6Uy5TvYBowLDGz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;186&quot; data-filename=&quot;스크린샷 2023-08-29 오후 1.04.27.png&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;186&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;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;</description>
      <category>IT/github</category>
      <category>git</category>
      <category>git remote</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/312</guid>
      <comments>https://makeaplayground.tistory.com/312#entry312comment</comments>
      <pubDate>Tue, 29 Aug 2023 13:10:25 +0900</pubDate>
    </item>
    <item>
      <title>[aws] RDS timezone 변경하기</title>
      <link>https://makeaplayground.tistory.com/311</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;background-color: #f6e199; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;aws RDS 시간 변경 순서&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;파라미터 그룹 생성 -&amp;gt; 파라미터 그룹 설정 변경(timezone 변경) -&amp;gt; 해당 DB에 생성한 파라미터 그룹 설정&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;i&gt;&lt;b&gt;1. 파라미터 그룹 생성&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h4&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;&quot;&gt;우선 aws 접속 후 RDS 서비스로 이동한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;왼쪽 메뉴에서 파라미터 그룹에 들어간다&lt;/span&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-filename=&quot;스크린샷 2023-08-28 오전 9.18.14.png&quot; data-origin-width=&quot;2756&quot; data-origin-height=&quot;1248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGcWiB/btssiiZ5hBR/kDafRRD5i2XKCjjWmoy6sK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGcWiB/btssiiZ5hBR/kDafRRD5i2XKCjjWmoy6sK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGcWiB/btssiiZ5hBR/kDafRRD5i2XKCjjWmoy6sK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGcWiB%2FbtssiiZ5hBR%2FkDafRRD5i2XKCjjWmoy6sK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2756&quot; height=&quot;1248&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.18.14.png&quot; data-origin-width=&quot;2756&quot; data-origin-height=&quot;1248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;기본값 탭을 클릭하면 default 파라미터가 있는것을 확인할 수 있다&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: #333333;&quot;&gt;default 파라미터는 변경이 불가능하기 떄문에 파라미터 그룹에 새로 생성해 주어야 한다&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;&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: #333333;&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;&lt;span style=&quot;color: #333333;&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&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AMFp3/btssc8Y0Q3x/hyKudKvTXHhhAafbIeE8H0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1887&quot; data-origin-height=&quot;619&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.21.48.png&quot; /&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: #333333;&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.24.32.png&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lCohc/btssfZtIGdK/Ge9r5oVUnsVR69aiGcpyBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lCohc/btssfZtIGdK/Ge9r5oVUnsVR69aiGcpyBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lCohc/btssfZtIGdK/Ge9r5oVUnsVR69aiGcpyBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlCohc%2FbtssfZtIGdK%2FGe9r5oVUnsVR69aiGcpyBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;615&quot; height=&quot;473&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.24.32.png&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;파라미터 그룹 패밀리에는 본인이 사용하는 데이터베이스를 넣는다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;혹시 사용하고 있는 데이터베이스를 모른다면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;파라미터 그룹에서 기본값 -&amp;gt; default로 설정되어 있는 파라미터 클릭&lt;/span&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-filename=&quot;스크린샷 2023-08-28 오전 9.27.09.png&quot; data-origin-width=&quot;1688&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0j0RQ/btsshwqMdNf/YeYFuCR1uKz8ozKTQPK8I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0j0RQ/btsshwqMdNf/YeYFuCR1uKz8ozKTQPK8I0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0j0RQ/btsshwqMdNf/YeYFuCR1uKz8ozKTQPK8I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0j0RQ%2FbtsshwqMdNf%2FYeYFuCR1uKz8ozKTQPK8I0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1688&quot; height=&quot;243&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.27.09.png&quot; data-origin-width=&quot;1688&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;파라미터 그룹 패밀리에 있는 값을 선택하면 된다 (mysql8.0)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그룹 이름은 DB Parameter Group 선택&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이름과 설명을 timezone 로 해주고 생성!&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;i&gt;&lt;b&gt;2. 파라미터 그룹 설정 변경(timezone 변경)&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h4&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;&quot;&gt;생성한 파라미터 그룹을 클릭해서 들어간다&lt;/span&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-filename=&quot;스크린샷 2023-08-28 오전 9.31.14.png&quot; data-origin-width=&quot;1820&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nk1Du/btssfW4Q9jS/1mXXvyoDmrdKpidHXw3tT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nk1Du/btssfW4Q9jS/1mXXvyoDmrdKpidHXw3tT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nk1Du/btssfW4Q9jS/1mXXvyoDmrdKpidHXw3tT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnk1Du%2FbtssfW4Q9jS%2F1mXXvyoDmrdKpidHXw3tT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1820&quot; height=&quot;258&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.31.14.png&quot; data-origin-width=&quot;1820&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.31.42.png&quot; data-origin-width=&quot;1827&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DfKhc/btssgmPHOxQ/bS1okBlxCCwNsq0l3agamK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DfKhc/btssgmPHOxQ/bS1okBlxCCwNsq0l3agamK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DfKhc/btssgmPHOxQ/bS1okBlxCCwNsq0l3agamK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDfKhc%2FbtssgmPHOxQ%2FbS1okBlxCCwNsq0l3agamK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1827&quot; height=&quot;446&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.31.42.png&quot; data-origin-width=&quot;1827&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&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;color: #333333;&quot;&gt;time_zone으로 검색한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아래에 변경가능한 시간대가 나온다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Asia/Seoul로 적어주고, Save Changes 클릭하여 설정을 변경한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;i&gt;&lt;b&gt;3. 해당 DB에 생성한 파라미터 그룹 설정&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h4&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;&quot;&gt;왼쪽 메뉴 데이터베이스를 클릭한다&lt;/span&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-filename=&quot;스크린샷 2023-08-28 오전 9.34.46.png&quot; data-origin-width=&quot;1869&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bST0th/btssgt2mTUr/7XXJ1kNVljSn50eJIOc65k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bST0th/btssgt2mTUr/7XXJ1kNVljSn50eJIOc65k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bST0th/btssgt2mTUr/7XXJ1kNVljSn50eJIOc65k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbST0th%2Fbtssgt2mTUr%2F7XXJ1kNVljSn50eJIOc65k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1869&quot; height=&quot;608&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.34.46.png&quot; data-origin-width=&quot;1869&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;적용할 데이터베이스를 선택하고 수정을 누른다&lt;/span&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.36.21.png&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ptogE/btssijSgHDM/vkp2MVbfP9kGUPUVuu0wyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ptogE/btssijSgHDM/vkp2MVbfP9kGUPUVuu0wyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ptogE/btssijSgHDM/vkp2MVbfP9kGUPUVuu0wyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FptogE%2FbtssijSgHDM%2Fvkp2MVbfP9kGUPUVuu0wyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;728&quot; height=&quot;274&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.36.21.png&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;추가 구성에서 DB 파라미터 그룹을 아까 생성한 파라미터 그룹으로 변경 후,&amp;nbsp;&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.38.04.png&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Oys9U/btssgma7cwz/9f9y7NTsaNPkVs4k40Gz9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Oys9U/btssgma7cwz/9f9y7NTsaNPkVs4k40Gz9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Oys9U/btssgma7cwz/9f9y7NTsaNPkVs4k40Gz9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOys9U%2Fbtssgma7cwz%2F9f9y7NTsaNPkVs4k40Gz9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;731&quot; height=&quot;274&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.38.04.png&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&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;color: #333333;&quot;&gt;즉시 적용 선택후 DB 인스턴스 수정을 클릭한다&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&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;color: #333333;&quot;&gt;잘 적용됬는지 확인할려면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;인텔리제이 콘솔에서(RDS가 연결되어있다는 가정하에) &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;select now(); 해서 현재 시간을 확인하면 시간이 잘 뜨는 것을 확인할 수 있다&lt;/span&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.41.56.png&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzRNs9/btssqns1RW5/5Wj52vp8EgeIEnFI6SkepK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzRNs9/btssqns1RW5/5Wj52vp8EgeIEnFI6SkepK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzRNs9/btssqns1RW5/5Wj52vp8EgeIEnFI6SkepK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzRNs9%2Fbtssqns1RW5%2F5Wj52vp8EgeIEnFI6SkepK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;348&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.41.56.png&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;또 다른 방법으로는 데이터베이스 메뉴에서 DB 식별자 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;구성으로 들어가면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;DB 인스턴스 파라미터 그룹&lt;/b&gt;에 아까 생성한 파라미터 그룹 옆에 ✔️&lt;b&gt;동기화 중&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.44.09.png&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;863&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SrLws/btssqz7173s/FyVenpBncXuXQ8GylNe78k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SrLws/btssqz7173s/FyVenpBncXuXQ8GylNe78k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SrLws/btssqz7173s/FyVenpBncXuXQ8GylNe78k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSrLws%2Fbtssqz7173s%2FFyVenpBncXuXQ8GylNe78k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1532&quot; height=&quot;863&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.44.09.png&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;863&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;혹시 파라미터 그룹 옆에 &lt;b&gt;재부팅 보류 중 &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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.52.46.png&quot; data-origin-width=&quot;1820&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drdhXU/btssqA0aByW/21Dk55UHlr1ddo932kOaMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drdhXU/btssqA0aByW/21Dk55UHlr1ddo932kOaMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drdhXU/btssqA0aByW/21Dk55UHlr1ddo932kOaMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrdhXU%2FbtssqA0aByW%2F21Dk55UHlr1ddo932kOaMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1820&quot; height=&quot;347&quot; data-filename=&quot;스크린샷 2023-08-28 오전 9.52.46.png&quot; data-origin-width=&quot;1820&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;s&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;처음에 RDS랑 연결된 EC2를 재부팅 했었는데, 안되서 뭐지... 했는데, RDS 재부팅했어야 했다... 어쨌든&lt;/span&gt;&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;i&gt;&lt;b&gt;끝 &lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h4&gt;</description>
      <category>IT/aws</category>
      <category>aws</category>
      <category>rds</category>
      <category>timezone 변경</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/311</guid>
      <comments>https://makeaplayground.tistory.com/311#entry311comment</comments>
      <pubDate>Mon, 28 Aug 2023 09:57:55 +0900</pubDate>
    </item>
    <item>
      <title>mysql 외부 접속시 connection locked 현상 (Unblock with 'mysqladmin flush-hosts' 에러)</title>
      <link>https://makeaplayground.tistory.com/310</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;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-filename=&quot;스크린샷 2023-08-24 오후 4.34.24.png&quot; data-origin-width=&quot;2858&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/spHDD/btssaSz0Kyw/RhQ3m2qCJzKJlkLWdY1GjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/spHDD/btssaSz0Kyw/RhQ3m2qCJzKJlkLWdY1GjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/spHDD/btssaSz0Kyw/RhQ3m2qCJzKJlkLWdY1GjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FspHDD%2FbtssaSz0Kyw%2FRhQ3m2qCJzKJlkLWdY1GjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2858&quot; height=&quot;270&quot; data-filename=&quot;스크린샷 2023-08-24 오후 4.34.24.png&quot; data-origin-width=&quot;2858&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;Host '' is blocked because of many connection errors; &lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;Unblock with 'mysqladmin flush-hosts'&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;i&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;mysql과 연결이 비정상적으로 끊어지면, 해당 횟수를 카운트하여 &lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;global max_connect_errors 에 지정된 값을 넘기면 자동 블럭킹처리 된다&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;해결방안&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;mysql에 접속&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692864605975&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mysql - u root - p&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;max_connect_errors 카운트 확인&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692864634273&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select @@global.max_connect_errors;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;max_connections 카운트 확인&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692864662044&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select @@global.max_connections;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;에러 카운트 초기화&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692864698125&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;flush hosts;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;max_connections 변경&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692864729939&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;set global max_connections=300;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;max_connect_errors 변경&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692864764809&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;set global max_connect_errors=10000;&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-24 오후 5.13.48.png&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5uRni/btsrZyXI2ic/vAcMwds6cvJyowSk5dToPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5uRni/btsrZyXI2ic/vAcMwds6cvJyowSk5dToPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5uRni/btsrZyXI2ic/vAcMwds6cvJyowSk5dToPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5uRni%2FbtsrZyXI2ic%2FvAcMwds6cvJyowSk5dToPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;42&quot; data-filename=&quot;스크린샷 2023-08-24 오후 5.13.48.png&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;66&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;
&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;a href=&quot;https://sd23w.tistory.com/414&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://sd23w.tistory.com/414&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT/db</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/310</guid>
      <comments>https://makeaplayground.tistory.com/310#entry310comment</comments>
      <pubDate>Thu, 24 Aug 2023 17:14:44 +0900</pubDate>
    </item>
    <item>
      <title>vi 파일 맨 끝으로 이동</title>
      <link>https://makeaplayground.tistory.com/309</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;&lt;span style=&quot;background-color: #f3c000; color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;G (Shift + g)&lt;span style=&quot;text-align: left;&quot;&gt;&amp;nbsp;: 마지막 행으로 이동&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>IT/etc</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/309</guid>
      <comments>https://makeaplayground.tistory.com/309#entry309comment</comments>
      <pubDate>Thu, 24 Aug 2023 16:47:45 +0900</pubDate>
    </item>
    <item>
      <title>slack으로 오류사항 받기 2 (slack api)</title>
      <link>https://makeaplayground.tistory.com/306</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;slack으로 오류사항 받기 1 (slack api) 에서 테스트 연동을 하고 이제 프로젝트에 적용해본다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;controllerAdvice&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1691973738794&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestControllerAdvice
@RequiredArgsConstructor
public class ControllerAdvisor {

    private final SlackService slackService;

    @ExceptionHandler(Exception.class)
    public void SlackErrorMessage(Exception e){
        slackService.sendErrorForSlack(e);
    }
    
    @ExceptionHandler(PasswordEmailSendException.class)
    public ResponseEntity&amp;lt;ExceptionResponse&amp;gt; passwordEmailSendException(PasswordEmailSendException e) {
        int statusCode = e.getStatusCode();

        ExceptionResponse response = ExceptionResponse.builder()
                .code(String.valueOf(statusCode))
                .message(e.getMessage())
                .validation(e.getValidation())
                .build();

        return ResponseEntity.status(statusCode).body(response);
    }

 }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;controller&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1691974212866&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
@RequiredArgsConstructor
public class SlackController {
    
    @GetMapping(value = &quot;/error/v1&quot;)
    public String ErrorSlackClient1() {
        throw new ReadOnlyBufferException();
    }

    @GetMapping(value = &quot;/error/v2&quot;)
    public String ErrorSlackClient2() {
        throw new PasswordEmailSendException();
    }

}&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에서 핸들링 해준 에러(PasswordEmailSendException) 와 그렇지 않은 에러(ReadOnlyBufferException) 두 개를 작성해준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Service&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1691974381606&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Slf4j
@Service
@RequiredArgsConstructor
public class SlackService {

    @Value(&quot;${notification.slack.webhook.url}&quot;)
    private String slackWebhookUrl;

    private final HttpServletRequest request;

    public String sendErrorForSlack(Exception exception) {
        Slack slack = Slack.getInstance();
        WebhookResponse response;
        try {
            StringWriter writer = new StringWriter();
            exception.printStackTrace(new PrintWriter(writer));

            String emoji = &quot;\u2620&quot;;
            String errorTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern(&quot;yyyy-MM-dd HH:mm:ss&quot;));
            String errorPath = request.getRequestURI().toString();
            String exceptionName = exception.getClass().toString();
            String exceptionRoot = exception.getStackTrace()[0].toString();
            String message = String.format(&quot;%s [%s] - [%s] - [%s] - [%s]&quot;, emoji, errorTime, errorPath, exceptionName, exceptionRoot);

            Payload payload = Payload.builder().text(message).build();
            response = slack.send(slackWebhookUrl, payload);
            return &quot;Slack Sent = &quot; + response.getCode();

        } catch (IOException e) {
        	// TODO 예외처리
            log.error(&quot;Error sending for slack&quot;, e);
        }
        return null;
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String message 부분에서는 커스텀 해서 마음대로 보내면 된다&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;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;스웨거 테스트&lt;/b&gt;&lt;/h4&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-filename=&quot;스크린샷 2023-08-14 오전 9.57.56.png&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1CbWo/btsrffCJnyR/oPCOSGzmRb49NpjLIMp2L0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1CbWo/btsrffCJnyR/oPCOSGzmRb49NpjLIMp2L0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1CbWo/btsrffCJnyR/oPCOSGzmRb49NpjLIMp2L0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1CbWo%2FbtsrffCJnyR%2FoPCOSGzmRb49NpjLIMp2L0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;594&quot; data-filename=&quot;스크린샷 2023-08-14 오전 9.57.56.png&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;594&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-filename=&quot;스크린샷 2023-08-14 오전 9.57.35.png&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GSw1k/btsrdkxqR6K/JegLaasewK5vWbiuuLcGmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GSw1k/btsrdkxqR6K/JegLaasewK5vWbiuuLcGmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GSw1k/btsrdkxqR6K/JegLaasewK5vWbiuuLcGmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGSw1k%2FbtsrdkxqR6K%2FJegLaasewK5vWbiuuLcGmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1144&quot; height=&quot;622&quot; data-filename=&quot;스크린샷 2023-08-14 오전 9.57.35.png&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;622&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-14 오전 9.57.42.png&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgEMFM/btsras3Aq00/pdRFuSoGdtd2Xx6zIgIhIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgEMFM/btsras3Aq00/pdRFuSoGdtd2Xx6zIgIhIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgEMFM/btsras3Aq00/pdRFuSoGdtd2Xx6zIgIhIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgEMFM%2Fbtsras3Aq00%2FpdRFuSoGdtd2Xx6zIgIhIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1256&quot; height=&quot;75&quot; data-filename=&quot;스크린샷 2023-08-14 오전 9.57.42.png&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;75&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;
&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;controllerAdvice를 위와 같이 작성하니&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;controller 단에서 httpStatus에서 설정을 하면 그 코드가 내려가는게 아니구 200코드로 내려가서&lt;/p&gt;
&lt;pre id=&quot;code_1692691913314&quot; class=&quot;reasonml&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@ExceptionHandler(Exception.class)
public ResponseEntity&amp;lt;ExceptionResponse&amp;gt; SlackErrorMessage(Exception e){
    slackApi.sendErrorForSlack(e);

    ExceptionResponse response = ExceptionResponse.builder()
            .code(String.valueOf(500))
            .message(e.getMessage())
            .build();

    return ResponseEntity.status(500).body(response);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 바꿔줌&lt;/p&gt;</description>
      <category>IT/slack</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/306</guid>
      <comments>https://makeaplayground.tistory.com/306#entry306comment</comments>
      <pubDate>Mon, 14 Aug 2023 10:03:57 +0900</pubDate>
    </item>
    <item>
      <title>slack으로 오류사항 받기 1 (slack api)</title>
      <link>https://makeaplayground.tistory.com/305</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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. slack 워크스페이스 개설&lt;/b&gt;&lt;/h4&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 메세지를 받을 채널을 추가해준다&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-10 오후 2.41.15.png&quot; data-origin-width=&quot;243&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8wxtN/btsqJBOQRPh/QWdbK2viVK0iYQq59a34N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8wxtN/btsqJBOQRPh/QWdbK2viVK0iYQq59a34N1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8wxtN/btsqJBOQRPh/QWdbK2viVK0iYQq59a34N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8wxtN%2FbtsqJBOQRPh%2FQWdbK2viVK0iYQq59a34N1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;243&quot; height=&quot;229&quot; data-filename=&quot;스크린샷 2023-08-10 오후 2.41.15.png&quot; data-origin-width=&quot;243&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;채널명 backend-error로 만들어줌 ( 마음대로 만들면 됨 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. slack api&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://api.slack.com/apps&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://api.slack.com/apps&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1691646180340&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Slack API: Applications | Slack&quot; data-og-description=&quot;Your Apps Don't see an app you're looking for? Sign in to another workspace.&quot; data-og-host=&quot;api.slack.com&quot; data-og-source-url=&quot;https://api.slack.com/apps&quot; data-og-url=&quot;https://api.slack.com/apps&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://api.slack.com/apps&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://api.slack.com/apps&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Slack API: Applications | Slack&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Your Apps Don't see an app you're looking for? Sign in to another workspace.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;api.slack.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-10 오전 10.26.49.png&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buwZRD/btsqRfQ0GOS/6DU7hpAkI3A3vm6VrdyN6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buwZRD/btsqRfQ0GOS/6DU7hpAkI3A3vm6VrdyN6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buwZRD/btsqRfQ0GOS/6DU7hpAkI3A3vm6VrdyN6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuwZRD%2FbtsqRfQ0GOS%2F6DU7hpAkI3A3vm6VrdyN6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;664&quot; data-filename=&quot;스크린샷 2023-08-10 오전 10.26.49.png&quot; data-origin-width=&quot;1396&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;b&gt;Create an App&lt;/b&gt; 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-10 오전 10.26.56.png&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H1Wdr/btsqKzJLC4Y/nKIsOEGWcR7z5jK4wLM7Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H1Wdr/btsqKzJLC4Y/nKIsOEGWcR7z5jK4wLM7Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H1Wdr/btsqKzJLC4Y/nKIsOEGWcR7z5jK4wLM7Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH1Wdr%2FbtsqKzJLC4Y%2FnKIsOEGWcR7z5jK4wLM7Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;377&quot; data-filename=&quot;스크린샷 2023-08-10 오전 10.26.56.png&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;724&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;From scratch&lt;/b&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-10 오전 10.35.55.png&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jaact/btsqLvtBuP1/87MIHpONk3szD992zT7BNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jaact/btsqLvtBuP1/87MIHpONk3szD992zT7BNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jaact/btsqLvtBuP1/87MIHpONk3szD992zT7BNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJaact%2FbtsqLvtBuP1%2F87MIHpONk3szD992zT7BNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;537&quot; height=&quot;516&quot; data-filename=&quot;스크린샷 2023-08-10 오전 10.35.55.png&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;1000&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;App Name과 그 밑에 연결할 워크스페이스를 선택해준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 App Name는 Error Service로 함&lt;/p&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;Incoming Webhooks&lt;/b&gt; 메뉴 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-10 오전 10.37.29.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BTpBA/btsqQ8R0CBF/wcwYKoOtAnn78pMK8bHX7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BTpBA/btsqQ8R0CBF/wcwYKoOtAnn78pMK8bHX7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BTpBA/btsqQ8R0CBF/wcwYKoOtAnn78pMK8bHX7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBTpBA%2FbtsqQ8R0CBF%2FwcwYKoOtAnn78pMK8bHX7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;265&quot; height=&quot;383&quot; data-filename=&quot;스크린샷 2023-08-10 오전 10.37.29.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;716&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;Activate Incoming Webhooks 를 &lt;b&gt;On&lt;/b&gt;으로 하고 밑에 하단을 보면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-10 오전 10.37.36.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyaiPN/btsqLxdSxLW/QWIroUrqwWLkL0UPBwzKw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyaiPN/btsqLxdSxLW/QWIroUrqwWLkL0UPBwzKw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyaiPN/btsqLxdSxLW/QWIroUrqwWLkL0UPBwzKw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyaiPN%2FbtsqLxdSxLW%2FQWIroUrqwWLkL0UPBwzKw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;563&quot; height=&quot;286&quot; data-filename=&quot;스크린샷 2023-08-10 오전 10.37.36.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;286&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;b&gt;Add New Webhook to Workspace&lt;/b&gt; 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-10 오전 10.37.42.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cet1d8/btsqJFqyKtG/MmCU5Ilvd1HLX9rl4mxQJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cet1d8/btsqJFqyKtG/MmCU5Ilvd1HLX9rl4mxQJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cet1d8/btsqJFqyKtG/MmCU5Ilvd1HLX9rl4mxQJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcet1d8%2FbtsqJFqyKtG%2FMmCU5Ilvd1HLX9rl4mxQJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;510&quot; height=&quot;90&quot; data-filename=&quot;스크린샷 2023-08-10 오전 10.37.42.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;102&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-10 오전 10.38.00.png&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;922&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kDDJO/btsqKx6kl5Y/6UmTUOk9aOmtMhWwukimt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kDDJO/btsqKx6kl5Y/6UmTUOk9aOmtMhWwukimt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kDDJO/btsqKx6kl5Y/6UmTUOk9aOmtMhWwukimt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkDDJO%2FbtsqKx6kl5Y%2F6UmTUOk9aOmtMhWwukimt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;401&quot; data-filename=&quot;스크린샷 2023-08-10 오전 10.38.00.png&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;922&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-10 오전 10.38.17.png&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;852&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qV8yp/btsqLwTzKLO/2GEd8XO9kLKqYKpbPodrZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qV8yp/btsqLwTzKLO/2GEd8XO9kLKqYKpbPodrZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qV8yp/btsqLwTzKLO/2GEd8XO9kLKqYKpbPodrZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqV8yp%2FbtsqLwTzKLO%2F2GEd8XO9kLKqYKpbPodrZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;521&quot; height=&quot;852&quot; data-filename=&quot;스크린샷 2023-08-10 오전 10.38.17.png&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;852&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. Spring 에서 Slack 연동&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;build.gradle&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1691651076821&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
	// slack-api
	implementation 'com.slack.api:slack-api-client:1.27.2'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;application.yml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1691651203004&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;notification:
  slack:
    webhook:
      url: https://hooks.slack.com/services/[웹훅]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SlackController.java&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1691651150748&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
@RequiredArgsConstructor
public class SlackController {

    @Value(&quot;${notification.slack.webhook.url}&quot;)
    private String slackWebhookUrl;


    @GetMapping(value = &quot;/error-slack&quot;)
    public String ErrorSlack() throws IOException {
        Slack slack = Slack.getInstance();
        Payload payload = Payload.builder().text(&quot;오류입니다!&quot;).build();
        WebhookResponse response = slack.send(slackWebhookUrl, payload);
        return &quot;Slack Sent = &quot; + response.getCode();

    }
}&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;나는 스웨거가 프로젝트에 연동되어 있어 스웨거로 했다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-10 오후 4.08.14.png&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx2Lsm/btsqM9xhwZA/JJ5uLMiWAs7lpS7G78WB11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx2Lsm/btsqM9xhwZA/JJ5uLMiWAs7lpS7G78WB11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx2Lsm/btsqM9xhwZA/JJ5uLMiWAs7lpS7G78WB11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx2Lsm%2FbtsqM9xhwZA%2FJJ5uLMiWAs7lpS7G78WB11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;553&quot; data-filename=&quot;스크린샷 2023-08-10 오후 4.08.14.png&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;553&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;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-10 오후 2.34.54.png&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/txS2H/btsqRfDBPTw/QR3icO4Sy8B6PF3Rtle1zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/txS2H/btsqRfDBPTw/QR3icO4Sy8B6PF3Rtle1zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/txS2H/btsqRfDBPTw/QR3icO4Sy8B6PF3Rtle1zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtxS2H%2FbtsqRfDBPTw%2FQR3icO4Sy8B6PF3Rtle1zk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;271&quot; height=&quot;83&quot; data-filename=&quot;스크린샷 2023-08-10 오후 2.34.54.png&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;83&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 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;a href=&quot;https://makeaplayground.tistory.com/306&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://makeaplayground.tistory.com/306&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699783029578&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;slack으로 오류사항 받기 2 (slack api)&quot; data-og-description=&quot;slack으로 오류사항 받기 1 (slack api) 에서 테스트 연동을 하고 이제 프로젝트에 적용해본다 controllerAdvice @RestControllerAdvice @RequiredArgsConstructor public class ControllerAdvisor { private final SlackService slackService;&quot; data-og-host=&quot;makeaplayground.tistory.com&quot; data-og-source-url=&quot;https://makeaplayground.tistory.com/306&quot; data-og-url=&quot;https://makeaplayground.tistory.com/306&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cVG5Bs/hyUu38CizO/ApeQDsVpYYuR0JAVOUjQ9K/img.png?width=654&amp;amp;height=244&amp;amp;face=0_0_654_244,https://scrap.kakaocdn.net/dn/bkzVd3/hyUu1JLg1M/zLDVr42kkKbtLm5hUMwAK1/img.png?width=654&amp;amp;height=244&amp;amp;face=0_0_654_244,https://scrap.kakaocdn.net/dn/YT0cV/hyUu1Qv1YY/cfkElOpseRLUxY3Q7Ehkkk/img.png?width=1144&amp;amp;height=622&amp;amp;face=0_0_1144_622&quot;&gt;&lt;a href=&quot;https://makeaplayground.tistory.com/306&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://makeaplayground.tistory.com/306&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cVG5Bs/hyUu38CizO/ApeQDsVpYYuR0JAVOUjQ9K/img.png?width=654&amp;amp;height=244&amp;amp;face=0_0_654_244,https://scrap.kakaocdn.net/dn/bkzVd3/hyUu1JLg1M/zLDVr42kkKbtLm5hUMwAK1/img.png?width=654&amp;amp;height=244&amp;amp;face=0_0_654_244,https://scrap.kakaocdn.net/dn/YT0cV/hyUu1Qv1YY/cfkElOpseRLUxY3Q7Ehkkk/img.png?width=1144&amp;amp;height=622&amp;amp;face=0_0_1144_622');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;slack으로 오류사항 받기 2 (slack api)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;slack으로 오류사항 받기 1 (slack api) 에서 테스트 연동을 하고 이제 프로젝트에 적용해본다 controllerAdvice @RestControllerAdvice @RequiredArgsConstructor public class ControllerAdvisor { private final SlackService slackService;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;makeaplayground.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;&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;&lt;a href=&quot;https://velog.io/@ekxk1234/Slack-Web-Hook%EC%9C%BC%EB%A1%9C-Spring-Boot-%EC%97%B0%EB%8F%99&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@ekxk1234/Slack-Web-Hook%EC%9C%BC%EB%A1%9C-Spring-Boot-%EC%97%B0%EB%8F%99&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1691646544204&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Slack 도입부터 활용&quot; data-og-description=&quot;먼저 slack에 로그인 한 뒤 워크스페이스를 만들어줍니다.만들어준 워크스페이스를 열어줍니다.채널 추가를 눌러서 채널을 만들어줍니다.저는 Slack Api Home Page에 들어가줍니다.create an app을 눌러&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@ekxk1234/Slack-Web-Hook%EC%9C%BC%EB%A1%9C-Spring-Boot-%EC%97%B0%EB%8F%99&quot; data-og-url=&quot;https://velog.io/@ekxk1234/Slack-Web-Hook으로-Spring-Boot-연동&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wEEnN/hyTCCXGM3I/zIVCkcgzxLACgxuq8OTxAK/img.jpg?width=758&amp;amp;height=427&amp;amp;face=0_0_758_427,https://scrap.kakaocdn.net/dn/boKXJy/hyTBDKEw3l/JKup2lYwfNrkrL1tCjnrn0/img.jpg?width=758&amp;amp;height=427&amp;amp;face=0_0_758_427,https://scrap.kakaocdn.net/dn/1n3RD/hyTCC4shVN/DuEm9m8oAmRJro9OVgVyBK/img.png?width=485&amp;amp;height=475&amp;amp;face=0_0_485_475&quot;&gt;&lt;a href=&quot;https://velog.io/@ekxk1234/Slack-Web-Hook%EC%9C%BC%EB%A1%9C-Spring-Boot-%EC%97%B0%EB%8F%99&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@ekxk1234/Slack-Web-Hook%EC%9C%BC%EB%A1%9C-Spring-Boot-%EC%97%B0%EB%8F%99&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wEEnN/hyTCCXGM3I/zIVCkcgzxLACgxuq8OTxAK/img.jpg?width=758&amp;amp;height=427&amp;amp;face=0_0_758_427,https://scrap.kakaocdn.net/dn/boKXJy/hyTBDKEw3l/JKup2lYwfNrkrL1tCjnrn0/img.jpg?width=758&amp;amp;height=427&amp;amp;face=0_0_758_427,https://scrap.kakaocdn.net/dn/1n3RD/hyTCC4shVN/DuEm9m8oAmRJro9OVgVyBK/img.png?width=485&amp;amp;height=475&amp;amp;face=0_0_485_475');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Slack 도입부터 활용&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;먼저 slack에 로그인 한 뒤 워크스페이스를 만들어줍니다.만들어준 워크스페이스를 열어줍니다.채널 추가를 눌러서 채널을 만들어줍니다.저는 Slack Api Home Page에 들어가줍니다.create an app을 눌러&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.naver.com/PostView.naver?blogId=rlaalsdn456456&amp;amp;logNo=222636124804&amp;amp;categoryNo=0&amp;amp;parentCategoryNo=0&amp;amp;viewDate=&amp;amp;currentPage=1&amp;amp;postListTopCurrentPage=1&amp;amp;from=postView&quot;&gt;https://blog.naver.com/PostView.naver?blogId=rlaalsdn456456&amp;amp;logNo=222636124804&amp;amp;categoryNo=0&amp;amp;parentCategoryNo=0&amp;amp;viewDate=&amp;amp;currentPage=1&amp;amp;postListTopCurrentPage=1&amp;amp;from=postView&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1691647461659&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Java] Slack으로 특정 메세지 전송&quot; data-og-description=&quot;요즘 회사에서 웹엑스에서 슬랙으로 변경되면서 생각보다 신세계를 경험하고 있다. 그 중 하나가 메세지 봇...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://blog.naver.com/PostView.naver?blogId=rlaalsdn456456&amp;amp;logNo=222636124804&amp;amp;categoryNo=0&amp;amp;parentCategoryNo=0&amp;amp;viewDate=&amp;amp;currentPage=1&amp;amp;postListTopCurrentPage=1&amp;amp;from=postView&quot; data-og-url=&quot;https://blog.naver.com/rlaalsdn456456/222636124804&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DnYHh/hyTBDjDPWA/7zagMdL2m4Go5krGyUkAak/img.png?width=743&amp;amp;height=430&amp;amp;face=0_0_743_430&quot;&gt;&lt;a href=&quot;https://blog.naver.com/PostView.naver?blogId=rlaalsdn456456&amp;amp;logNo=222636124804&amp;amp;categoryNo=0&amp;amp;parentCategoryNo=0&amp;amp;viewDate=&amp;amp;currentPage=1&amp;amp;postListTopCurrentPage=1&amp;amp;from=postView&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.naver.com/PostView.naver?blogId=rlaalsdn456456&amp;amp;logNo=222636124804&amp;amp;categoryNo=0&amp;amp;parentCategoryNo=0&amp;amp;viewDate=&amp;amp;currentPage=1&amp;amp;postListTopCurrentPage=1&amp;amp;from=postView&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DnYHh/hyTBDjDPWA/7zagMdL2m4Go5krGyUkAak/img.png?width=743&amp;amp;height=430&amp;amp;face=0_0_743_430');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Java] Slack으로 특정 메세지 전송&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;요즘 회사에서 웹엑스에서 슬랙으로 변경되면서 생각보다 신세계를 경험하고 있다. 그 중 하나가 메세지 봇...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/slack</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/305</guid>
      <comments>https://makeaplayground.tistory.com/305#entry305comment</comments>
      <pubDate>Thu, 10 Aug 2023 16:10:52 +0900</pubDate>
    </item>
    <item>
      <title>젠킨스 - 슬랙 연동</title>
      <link>https://makeaplayground.tistory.com/303</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;깃에 push 하면 젠킨스로 자동 빌드 되도록 CI/CD 구축해놨는데,&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 슬랙 워크스페이스 및 채널 생성&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 1.00.37.png&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kE0Ul/btsqrNPG35v/F8tkA0FZWX2nER2rxspnlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kE0Ul/btsqrNPG35v/F8tkA0FZWX2nER2rxspnlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kE0Ul/btsqrNPG35v/F8tkA0FZWX2nER2rxspnlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkE0Ul%2FbtsqrNPG35v%2FF8tkA0FZWX2nER2rxspnlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1271&quot; height=&quot;62&quot; data-filename=&quot;스크린샷 2023-08-08 오후 1.00.37.png&quot; data-origin-width=&quot;1271&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;&lt;b&gt;새 워크스페이스 개설&lt;/b&gt; 버튼 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개설시 워크스페이스 이름은 마음대로 하면 된다, 물론 채널 이름도 마음대로 해도 되지만 젠킨스랑 연동하기 위해 만들었으니, jenkins로 해주었다&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.22.32.png&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WHwxS/btsquBtV8GY/8Q7tuOlTqb8N65SVDcDx4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WHwxS/btsquBtV8GY/8Q7tuOlTqb8N65SVDcDx4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WHwxS/btsquBtV8GY/8Q7tuOlTqb8N65SVDcDx4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWHwxS%2FbtsquBtV8GY%2F8Q7tuOlTqb8N65SVDcDx4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;199&quot; height=&quot;52&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.22.32.png&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;82&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;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;2. Jenkins CI 설치&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;다른 블로그 보는데 Jenkins CI를 어디서 설치해야하는지 못 찾아서 한참 찾음&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.22.36.png&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FYxDg/btsqrC79bUu/kOdNb4lomYPE6qbnUni1H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FYxDg/btsqrC79bUu/kOdNb4lomYPE6qbnUni1H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FYxDg/btsqrC79bUu/kOdNb4lomYPE6qbnUni1H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFYxDg%2FbtsqrC79bUu%2FkOdNb4lomYPE6qbnUni1H1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;317&quot; height=&quot;195&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.22.36.png&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jenkins 채널을 클릭하면은 사이드바 말고 오른쪽 영역 위에 채널 이름이 뜨는데&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;통합 -&amp;gt; 앱&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.22.48.png&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;1250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDA7RY/btsqtV0uL1g/l80fz96AyFH4XSAavrIyPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDA7RY/btsqtV0uL1g/l80fz96AyFH4XSAavrIyPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDA7RY/btsqtV0uL1g/l80fz96AyFH4XSAavrIyPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDA7RY%2FbtsqtV0uL1g%2Fl80fz96AyFH4XSAavrIyPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;449&quot; height=&quot;1250&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.22.48.png&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;1250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jenkins로 검색, &lt;b&gt;Jenkins CI&lt;/b&gt; 설치해준다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.23.06.png&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KVazU/btsqtzC4Bwj/6AkkymhCCKk0lbXSXZXXs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KVazU/btsqtzC4Bwj/6AkkymhCCKk0lbXSXZXXs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KVazU/btsqtzC4Bwj/6AkkymhCCKk0lbXSXZXXs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKVazU%2FbtsqtzC4Bwj%2F6AkkymhCCKk0lbXSXZXXs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;563&quot; height=&quot;250&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.23.06.png&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 후 구성 클릭하고 Slack에 추가 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.23.17.png&quot; data-origin-width=&quot;2122&quot; data-origin-height=&quot;1122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDioZz/btsqm78t0uj/im3aDo9GTawMlpqks9B651/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDioZz/btsqm78t0uj/im3aDo9GTawMlpqks9B651/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDioZz/btsqm78t0uj/im3aDo9GTawMlpqks9B651/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDioZz%2Fbtsqm78t0uj%2Fim3aDo9GTawMlpqks9B651%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;518&quot; height=&quot;274&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.23.17.png&quot; data-origin-width=&quot;2122&quot; data-origin-height=&quot;1122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 생성해둔 채널이름으로 선택하여 Jenkins CI통합 앱 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.23.28.png&quot; data-origin-width=&quot;2026&quot; data-origin-height=&quot;934&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nArBi/btsqh0V6mfi/UKxAMQjkkj9HWqI4tBxUyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nArBi/btsqh0V6mfi/UKxAMQjkkj9HWqI4tBxUyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nArBi/btsqh0V6mfi/UKxAMQjkkj9HWqI4tBxUyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnArBi%2Fbtsqh0V6mfi%2FUKxAMQjkkj9HWqI4tBxUyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;380&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.23.28.png&quot; data-origin-width=&quot;2026&quot; data-origin-height=&quot;934&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;이후 Slack과 Jenkins 연동 가이드가 나옴 근디 지금의 Jenkins의 UI랑은 살짝 다르다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가이드에서 &lt;b&gt;팀 하위 도메인&lt;/b&gt;과 &lt;b&gt;통합 토큰 자격 증명 ID&lt;/b&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-filename=&quot;스크린샷 2023-08-08 오후 12.26.51.png&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;1088&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNRCtY/btsqvhaUihM/SCtZCJWRnIJTSn80SxTTl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNRCtY/btsqvhaUihM/SCtZCJWRnIJTSn80SxTTl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNRCtY/btsqvhaUihM/SCtZCJWRnIJTSn80SxTTl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNRCtY%2FbtsqvhaUihM%2FSCtZCJWRnIJTSn80SxTTl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1736&quot; height=&quot;1088&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.26.51.png&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;1088&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 젠킨스 설정&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.33.17.png&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;888&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z7qTS/btsquDejJS2/YVjeD8B0kTTZ5Pmag7k53k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z7qTS/btsquDejJS2/YVjeD8B0kTTZ5Pmag7k53k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z7qTS/btsquDejJS2/YVjeD8B0kTTZ5Pmag7k53k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ7qTS%2FbtsquDejJS2%2FYVjeD8B0kTTZ5Pmag7k53k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;276&quot; height=&quot;357&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.33.17.png&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;888&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jenkins 관리 - 플러그인 관리&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.33.26.png&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YlW0P/btsqwXXvY6d/To2KRV80f5iFxp8ZwWXiL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YlW0P/btsqwXXvY6d/To2KRV80f5iFxp8ZwWXiL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YlW0P/btsqwXXvY6d/To2KRV80f5iFxp8ZwWXiL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYlW0P%2FbtsqwXXvY6d%2FTo2KRV80f5iFxp8ZwWXiL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;453&quot; height=&quot;199&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.33.26.png&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Slack Notification&lt;/b&gt; 플러그인을 설치한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.33.44.png&quot; data-origin-width=&quot;2612&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XkF4W/btsquDlaVkM/bP3vr6ehQL3ciKcdHQNzMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XkF4W/btsquDlaVkM/bP3vr6ehQL3ciKcdHQNzMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XkF4W/btsquDlaVkM/bP3vr6ehQL3ciKcdHQNzMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXkF4W%2FbtsquDlaVkM%2FbP3vr6ehQL3ciKcdHQNzMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2612&quot; height=&quot;612&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.33.44.png&quot; data-origin-width=&quot;2612&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;b&gt;Jenkins 관리 - 시스템 설정 - Slack 부분&lt;/b&gt;으로 이동&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.40.37.png&quot; data-origin-width=&quot;2452&quot; data-origin-height=&quot;1158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JWwVJ/btsqwAO1b7V/zuUNxshfmHkuu4fandARvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JWwVJ/btsqwAO1b7V/zuUNxshfmHkuu4fandARvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JWwVJ/btsqwAO1b7V/zuUNxshfmHkuu4fandARvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJWwVJ%2FbtsqwAO1b7V%2FzuUNxshfmHkuu4fandARvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2452&quot; height=&quot;1158&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.40.37.png&quot; data-origin-width=&quot;2452&quot; data-origin-height=&quot;1158&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Workspace에 아까 복사해둔 &lt;b&gt;팀 하위 도메인&lt;/b&gt;을 입력해준다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Credential 은 Add 클릭!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Default channel/ member id는 아까 생성해둔 채널이름을 넣어준다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.39.51.png&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;1190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6LGXk/btsqBHfzWyg/uKOeKTIbAgjOIyBD88Iu4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6LGXk/btsqBHfzWyg/uKOeKTIbAgjOIyBD88Iu4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6LGXk/btsqBHfzWyg/uKOeKTIbAgjOIyBD88Iu4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6LGXk%2FbtsqBHfzWyg%2FuKOeKTIbAgjOIyBD88Iu4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2144&quot; height=&quot;1190&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.39.51.png&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;1190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Secret text로 선택하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Secret 부분에 아까 복사해둔 &lt;b&gt;통합 토큰 자격 증명 ID&lt;/b&gt;를 적어둔다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;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;Credential 새로 만든 걸로 선택하고 Test Connection을 하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.40.49.png&quot; data-origin-width=&quot;2408&quot; data-origin-height=&quot;1154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JeZyM/btsqs8GdZEh/IV4dDTJj19PCMIPXKMzaH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JeZyM/btsqs8GdZEh/IV4dDTJj19PCMIPXKMzaH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JeZyM/btsqs8GdZEh/IV4dDTJj19PCMIPXKMzaH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJeZyM%2Fbtsqs8GdZEh%2FIV4dDTJj19PCMIPXKMzaH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2408&quot; height=&quot;1154&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.40.49.png&quot; data-origin-width=&quot;2408&quot; data-origin-height=&quot;1154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Success가 뜨면 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슬랙으로 가서 확인해보면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.41.08.png&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uS2bb/btsqBvsTapp/i2pbkniZXXeE2O7JdmRQH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uS2bb/btsqBvsTapp/i2pbkniZXXeE2O7JdmRQH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uS2bb/btsqBvsTapp/i2pbkniZXXeE2O7JdmRQH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuS2bb%2FbtsqBvsTapp%2Fi2pbkniZXXeE2O7JdmRQH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;612&quot; height=&quot;65&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.41.08.png&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;65&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.43.13.png&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kTeV6/btsqtV7sMhA/96XPnCkeoEKuh8JTorCgFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kTeV6/btsqtV7sMhA/96XPnCkeoEKuh8JTorCgFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kTeV6/btsqtV7sMhA/96XPnCkeoEKuh8JTorCgFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkTeV6%2FbtsqtV7sMhA%2F96XPnCkeoEKuh8JTorCgFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;288&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.43.13.png&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.43.28.png&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxGrxB/btsqBqyqxHP/zuWLkbfoZXjMtbYlQCpNW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxGrxB/btsqBqyqxHP/zuWLkbfoZXjMtbYlQCpNW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxGrxB/btsqBqyqxHP/zuWLkbfoZXjMtbYlQCpNW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxGrxB%2FbtsqBqyqxHP%2FzuWLkbfoZXjMtbYlQCpNW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;408&quot; height=&quot;228&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.43.28.png&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 후 조치 추가에서 &lt;b&gt;Slack Notifications&lt;/b&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.44.19.png&quot; data-origin-width=&quot;1932&quot; data-origin-height=&quot;1344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hi4d4/btsqAw6GhFS/mNxRTck4I9PuniuyTuSliK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hi4d4/btsqAw6GhFS/mNxRTck4I9PuniuyTuSliK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hi4d4/btsqAw6GhFS/mNxRTck4I9PuniuyTuSliK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHi4d4%2FbtsqAw6GhFS%2FmNxRTck4I9PuniuyTuSliK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;1344&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.44.19.png&quot; data-origin-width=&quot;1932&quot; data-origin-height=&quot;1344&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.57.45.png&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mdhw0/btsqBo1GnHo/eyIpr4nk2i88K7K41u0xbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mdhw0/btsqBo1GnHo/eyIpr4nk2i88K7K41u0xbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mdhw0/btsqBo1GnHo/eyIpr4nk2i88K7K41u0xbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmdhw0%2FbtsqBo1GnHo%2FeyIpr4nk2i88K7K41u0xbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;589&quot; height=&quot;146&quot; data-filename=&quot;스크린샷 2023-08-08 오후 12.57.45.png&quot; data-origin-width=&quot;589&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;끝!&lt;/p&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;&lt;a href=&quot;https://dnight.tistory.com/entry/Jenkins-Slack-%EC%95%8C%EB%A6%BC-%EC%97%B0%EB%8F%99&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://dnight.tistory.com/entry/Jenkins-Slack-%EC%95%8C%EB%A6%BC-%EC%97%B0%EB%8F%99&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gksdudrb922.tistory.com/237&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gksdudrb922.tistory.com/237&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/etc</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/303</guid>
      <comments>https://makeaplayground.tistory.com/303#entry303comment</comments>
      <pubDate>Tue, 8 Aug 2023 13:38:29 +0900</pubDate>
    </item>
    <item>
      <title>젠킨스 타임존 변경</title>
      <link>https://makeaplayground.tistory.com/242</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;젠킨스에서 빌드를 하면 시간대가 9시간 뒤로 되어있다&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; 클릭 =&amp;gt; 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-01 오전 12.33.19.png&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OjoFw/btsdpzaEACM/P4xkYA3Z3n0WaPnzxoaceK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OjoFw/btsdpzaEACM/P4xkYA3Z3n0WaPnzxoaceK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OjoFw/btsdpzaEACM/P4xkYA3Z3n0WaPnzxoaceK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOjoFw%2FbtsdpzaEACM%2FP4xkYA3Z3n0WaPnzxoaceK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;94&quot; data-filename=&quot;스크린샷 2023-05-01 오전 12.33.19.png&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;94&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-filename=&quot;스크린샷 2023-05-01 오전 12.33.10.png&quot; data-origin-width=&quot;2010&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y2Er1/btsdjoHuBCV/6ssEKZlh36QQRiKU1J8IQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y2Er1/btsdjoHuBCV/6ssEKZlh36QQRiKU1J8IQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y2Er1/btsdjoHuBCV/6ssEKZlh36QQRiKU1J8IQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy2Er1%2FbtsdjoHuBCV%2F6ssEKZlh36QQRiKU1J8IQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2010&quot; height=&quot;560&quot; data-filename=&quot;스크린샷 2023-05-01 오전 12.33.10.png&quot; data-origin-width=&quot;2010&quot; data-origin-height=&quot;560&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-01 오전 12.34.38.png&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPLgCo/btsddZopniY/PoU6c5fbmBvpK7qKswbmuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPLgCo/btsddZopniY/PoU6c5fbmBvpK7qKswbmuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPLgCo/btsddZopniY/PoU6c5fbmBvpK7qKswbmuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPLgCo%2FbtsddZopniY%2FPoU6c5fbmBvpK7qKswbmuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;277&quot; data-filename=&quot;스크린샷 2023-05-01 오전 12.34.38.png&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;444&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;</description>
      <category>IT/etc</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/242</guid>
      <comments>https://makeaplayground.tistory.com/242#entry242comment</comments>
      <pubDate>Mon, 1 May 2023 00:37:19 +0900</pubDate>
    </item>
    <item>
      <title>스타르타코딩 SQL 강의 숙제 쿼리</title>
      <link>https://makeaplayground.tistory.com/219</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;pre id=&quot;code_1675856178158&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM point_users;


SELECT * FROM orders;

SELECT * FROM point_users pu INNER JOIN orders o on pu.user_id = o.user_id;

SELECT payment_method, round(AVG(point)) FROM point_users pu INNER JOIN orders o on pu.user_id = o.user_id
GROUP BY payment_method;

SELECT * from enrolleds;
SELECT * from users;

SELECT name, count(*)  as cnt from enrolleds e inner join users u on e.user_id = u.user_id
WHERE e.is_registered = 0
GROUP by name order by cnt desc;

SELECT * from courses;
SELECT * from enrolleds;

SELECT e.course_id, title, count(*) FROM courses c inner join enrolleds e on c.course_id = e.course_id
WHERE e.is_registered = 0 GROUP by e.course_id;


select e.enrolled_id, e.user_id, count(done=1) AS max_count from enrolleds e inner join enrolleds_detail ed on e.enrolled_id = ed.enrolled_id
where done =1 Group by enrolled_id order by count(done=1) DESC;&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;3월 sql 셤 홧팅!!!!&lt;/p&gt;</description>
      <category>TIL/myself</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/219</guid>
      <comments>https://makeaplayground.tistory.com/219#entry219comment</comments>
      <pubDate>Wed, 8 Feb 2023 20:38:12 +0900</pubDate>
    </item>
    <item>
      <title>[Thymeleaf] 타임리프 문법 정리</title>
      <link>https://makeaplayground.tistory.com/187</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;&lt;span style=&quot;background-color: #ffffff; color: #111111;&quot;&gt;타임리프는 스프링 부트에서 공식적으로 지원하는 View 템플릿이다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;-타임리프thymeleaf-장점&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;타임리프 장점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 코드를 변경하지 않기 때문에 서버팀과 퍼블팀 간의 협업이 편해진다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- JSP와 달리 Servlet Code로 변환되지 않기 때문에 비즈니스 로직과 분리되어 오로지 View에 집중할 수 있다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 서버상에서 동작하지 않아도 되기 때문에, 서버 동작 없이 화면을 확인할 수 있다, &amp;nbsp;더미 데이터를 넣고 화면 디자인 및 테스트에 용이하다. (서버가 구동하지 않는 경우 정적 컨텐츠)&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #111111;&quot;&gt;타임리프 적용방법&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;메이븐&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;spring-boot-starter-thymeleaf&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;그래들&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;build.gradle&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672572325897&quot; class=&quot;clean&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;application.properties&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672572380337&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Thymeleaf 사용
spring.thymeleaf.enabled=true
# cache 사용 /사용 시 컴파일한 파일만 사용 (개발 시 미사용)
spring.thymeleaf.cache=false
# 템플릿 위치 / View 파일 위치
spring.thymeleaf.prefix=classpath:templates/
# View 파일 기본 확장자 / Controller에서 확장자를 입력하지 않아도 된다.
spring.thymeleaf.suffix=.html&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;타임리프 문법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1672574426657&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
public class mainController {

    @GetMapping(&quot;/user&quot;)
    public String mypage(Model model) {
        model.addAttribute(&quot;data&quot;, &quot;Hello &amp;lt;b&amp;gt;Spring&amp;lt;/b&amp;gt;!&quot;);
        return &quot;user/mypage&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;-thtext&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;⭐️ th:text=&quot;${}&quot;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672572905320&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div&amp;gt;
    &amp;lt;h1 th:text=&quot;${data}&quot;&amp;gt;&amp;lt;/h1&amp;gt;
&amp;lt;/div&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;background-color: #ffffff;&quot;&gt;일반 텍스트를 반환할 때 사용한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;- &lt;/span&gt;HTML 태그도 String 값으로 반환한다 =&amp;gt; 출력: Hello &lt;b&gt;Spring&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- JSP의 EL 표현식인 ${}와 마찬가지로 ${} 표현식을 사용해서 컨트롤러에서 전달받은 데이터에 접근할 수 있다&lt;/p&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;size18&quot;&gt;&lt;b&gt;⭐️ th:utext=&quot;${}&quot;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672574559180&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div&amp;gt;
    &amp;lt;h1 th:utext=&quot;${data}&quot;&amp;gt;&amp;lt;/h1&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #ffffff;&quot;&gt;th:text와 동일하게 텍스트를 반환하지만, HTML 태그를 사용 가능하게 해준다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;=&amp;gt; 출력: Hello &amp;lt;b&amp;gt;Spring&amp;lt;b&amp;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;⭐️th:src=&quot;${}&quot;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672574992437&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; &amp;lt;img class=&quot;img&quot; th:src=&quot;${dataList.IMG_URL}&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이미지 src 사용시&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;⭐️th:href=&quot;@{}&quot;, &lt;b&gt;th:href=&quot;||&quot;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672575133610&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body&amp;gt;
  &amp;lt;a th:hrf=&quot;@{/mypage}&quot;&amp;gt;&amp;lt;/a&amp;gt; // 파라미터 없는 경우
  &amp;lt;a th:hrf=&quot;@{/mypage?userNum={num}}&quot;&amp;gt;&amp;lt;/a&amp;gt; // 파라미터 넘길경우
  &amp;lt;a href=&quot;@{/user/profile(param=${param})}&quot;&amp;gt;&amp;lt;/a&amp;gt; // 파라미터 넘길경우
  &amp;lt;a href=&quot;@{user/product/{param1}(param2=A, param3=B)}&quot;&amp;gt;&amp;lt;/a&amp;gt; // 파라미터 여러개 넘길경우
  &amp;lt;a th:href=&quot;|/mypage?userNum=${num}|&quot;&amp;gt;&amp;lt;&amp;lt;/a&amp;gt; // 이것도 가능
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &amp;lt;a&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;태그의 href 속성과 동일하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 괄호안에 클릭시 이동하고자하는 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;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;-thvalue&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;⭐️th:value=&quot;${}&quot;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672575501124&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; id=&quot;userId&quot; th:value=&quot;${userId} + '의 이름은 ${userName}&quot;/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- input의 value에 값을 삽입할 때 사용한다&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;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;⭐️th:style=&quot;${}&quot;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672576008444&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;img&quot;  th:style=&quot;'background-image:url('+ ${dataList.IMG_URL} +');'&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;input th:style=&quot;${'width:500px'}&quot; type=&quot;text&quot; /&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;- background에서 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;⭐️&lt;/b&gt;th:if=&quot;${}&quot;&lt;/b&gt;&lt;b&gt;, th:unless=&quot;${}&quot;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672575923970&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;/product&quot; th:if=&quot;${session.userAuth == '1'}&quot;&amp;gt;상품등록&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;/product&quot; th:unless=&quot;${session.userAuth == '2'}&quot;&amp;gt;상품등록&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp; 조건문에 해당하는 속성이다. 각각&lt;span&gt;&amp;nbsp;&lt;/span&gt;if와&lt;span&gt;&amp;nbsp;&lt;/span&gt;else를 뜻한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&lt;/b&gt; th:unless는 일반적인 언어의 else 문과는 달리&lt;span&gt;&amp;nbsp;&lt;/span&gt;th:if에 들어가는 조건과 동일한 조건을 지정해야 한다&lt;/p&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt;⭐️&lt;/b&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;th:block, &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;th:each=&quot;변수 : ${list}&quot;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672576538394&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- th:block 미사용 --&amp;gt;
&amp;lt;div th:each=&quot;user : ${userList}&quot;&amp;gt;
	&amp;lt;span th:text=&quot;user.username}&quot;&amp;gt;username&amp;lt;/span&amp;gt;
    &amp;lt;span th:text=&quot;user.age}&quot;&amp;gt;age&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div th:each=&quot;user : ${userList}&quot;&amp;gt;
	&amp;lt;span th:text=&quot;${user.username} + ' &amp;amp; ' + ${user.age}&quot;&amp;gt;username&amp;amp;age&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;!-- th:block 사용 --&amp;gt;

&amp;lt;th:block th:each=&quot;user : ${userList}&quot;&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;span th:text=&quot;user.username}&quot;&amp;gt;username&amp;lt;/span&amp;gt;
        &amp;lt;span th:text=&quot;user.age}&quot;&amp;gt;age&amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;span th:text=&quot;${user.username} + ' &amp;amp; ' + ${user.age}&quot;&amp;gt;username&amp;amp;age&amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;	
&amp;lt;/th:block&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- th:block은 &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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt;⭐️&lt;/b&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;th:classappend=&quot;${}&quot;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672576863985&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;buttonth:classappend=&quot;${i == pageNum} ? 'on'&quot;&amp;gt;&amp;lt;/button&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;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;-thswitch-thcase&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;⭐️&lt;/span&gt;th:switch, th:case&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672577038919&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;th:block th:switch=&quot;${userNum}&quot;&amp;gt; 
  &amp;lt;span th:case=&quot;1&quot;&amp;gt;권한1&amp;lt;/span&amp;gt; 
  &amp;lt;span th:case=&quot;2&quot;&amp;gt;권한2&amp;lt;/span&amp;gt; 
&amp;lt;/th:block&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;- switch-case문과 동일하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- switch case문으로 제어할 태그를&lt;span&gt;&amp;nbsp;&lt;/span&gt;th:block으로 설정하고 그 안에 코드를 작성한다&lt;/p&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;⭐️&lt;/span&gt;th:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672577159613&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div th:seq=&quot;${i.SEQ}&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 태그의 임의 속성 추가시 앞에 th만 붙여주면 된다. ex) th:seq, th:num 등등&lt;/p&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;와우 이런 기능도 있어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;⭐️ 숫자 천만단위에 콤마 찍기!!!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672670018873&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;td th:text=&quot;${#numbers.formatInteger(i.PRICE, 0, 'COMMA')}&quot;&amp;gt;&amp;lt;/td&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;  참고&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@alicesykim95/Thymeleaf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@alicesykim95/Thymeleaf&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1672577676168&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Spring Thymeleaf 기본 문법&quot; data-og-description=&quot;타임리프(Thymeleaf)는 View Templete Engine으로 JSP, Freemarkerd와 같이 서버에서 클라이언트에게 응답할 브라우저 화면을 만들어주는 역할을 한다. 타임리프의 주 목표는 템플릿을 만들 때 유지관리가 쉽&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@alicesykim95/Thymeleaf&quot; data-og-url=&quot;https://velog.io/@alicesykim95/Thymeleaf&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkwhwb/hyQ6TPjvAy/UKfGhHMRQNkmuYbBh3IYCk/img.png?width=4200&amp;amp;height=2550&amp;amp;face=0_0_4200_2550&quot;&gt;&lt;a href=&quot;https://velog.io/@alicesykim95/Thymeleaf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@alicesykim95/Thymeleaf&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkwhwb/hyQ6TPjvAy/UKfGhHMRQNkmuYbBh3IYCk/img.png?width=4200&amp;amp;height=2550&amp;amp;face=0_0_4200_2550');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spring Thymeleaf 기본 문법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;타임리프(Thymeleaf)는 View Templete Engine으로 JSP, Freemarkerd와 같이 서버에서 클라이언트에게 응답할 브라우저 화면을 만들어주는 역할을 한다. 타임리프의 주 목표는 템플릿을 만들 때 유지관리가 쉽&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/etc</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/187</guid>
      <comments>https://makeaplayground.tistory.com/187#entry187comment</comments>
      <pubDate>Sun, 1 Jan 2023 21:55:24 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] SQL 로그 설정 (Log4jdbc) Gradle 적용시키기</title>
      <link>https://makeaplayground.tistory.com/179</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Log4jdbc &lt;span style=&quot;color: #555555;&quot;&gt;Log4j를 JDBC와 연결하여 사용하기 위해 만들어진 오픈소스 프로젝트이다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Log4jdbc는 예전 버전이고 Log4j2와 Slf4j와 연동되는 버전이 나왔다&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;Log4jdbc-log4j2 적용법&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;&lt;i&gt;1&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;&lt;i&gt;. 의존성 주입&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- build.gradle에 Log4jdbc 의존성을 추가한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 밑에 처럼 추가했고&lt;/p&gt;
&lt;pre id=&quot;code_1671943839578&quot; class=&quot;groovy&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
    implementation group: 'org.bgee.log4jdbc-log4j2', name: 'log4jdbc-log4j2-jdbc4.1', version: '1.16'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글링 하면은 아래와 같이 많이 나옴&lt;/p&gt;
&lt;pre id=&quot;code_1671943887371&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
	implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'
}&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;&lt;i&gt;2. log4jdbc.log4j2.properties 생성&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- resources폴더 안에 log4jdbc.log4j2.properties 생성하고&lt;/p&gt;
&lt;pre id=&quot;code_1671944057721&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;3. DB 설정 수정&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;resources폴더 안에 application.properties에 DB설정을 수정해준다&lt;/p&gt;
&lt;pre id=&quot;code_1671944385229&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy

spring.datasource.url = jdbc:log4jdbc:mysql://{URL:port}/{Schema}?useSSL=false&amp;amp;useUnicode=true&amp;amp;serverTimezone=Asia/Seoul
spring.datasource.username ={ID}
spring.datasource.password ={PW}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;driver-class-name 추가해주고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 ur이 jdbc:mysql~~ 이렇게 되어있었을텐데, log4jdbc를 추가해준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 application.properties 안에 출력할 정보에 대한 설정을 해준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 아래와 같이 설정해줬음&lt;/p&gt;
&lt;pre id=&quot;code_1671944980660&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ========== log4jdbc  ==========

# jdbc.sqlonly - SQL문을 보여줌
# jdbc.sqltiming - SQL문과 SQL문 수행하는 시간을 같이 보여줌
# jdbc.resultsettable - SQL 의 결과로 조회된 데이터를 table 형태로 로그를 보여줌
# jdbc.audit - ResultSet 을 제외한 모든 JDBC 호출 정보를 로그로 보여줌, 상당히 많은 양의 로그가 나오기 때문에 권장하지 않음.
# jdbc.resultset - ResultSet 을 포함한 모든 JDBC 호출 정보를 로그로 보여줌, audit 처럼 많은 로그가 나오기 때문에 권장하지 않음.
# jdbc.connection - DB 연결, 연결 해제와 관련된 로그를 보여줌

# off - 사용하지 않음
# info - 정보성 로그
# warn - 경고성 로그
# error - 에러 로그
# fatal - 심각한 문제 로그

logging.level.jdbc.sqlonly=off
logging.level.jdbc.sqltiming=info
logging.level.jdbc.resultsettable=info
logging.level.jdbc.audit=off
logging.level.jdbc.resultset=off
logging.level.jdbc.connection=off

# ================================&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;그리고 서버 구동면 아래같이 DB에 대한 로그가 찍힌다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 설정한대로 sqltiming과 resultsettable에 대한 정보가 뜬다&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-filename=&quot;스크린샷 2022-12-25 오후 1.59.43.png&quot; data-origin-width=&quot;2372&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsOT6l/btrUwprnebz/XluXpGViNVv2WUDctt2TCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsOT6l/btrUwprnebz/XluXpGViNVv2WUDctt2TCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsOT6l/btrUwprnebz/XluXpGViNVv2WUDctt2TCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsOT6l%2FbtrUwprnebz%2FXluXpGViNVv2WUDctt2TCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2372&quot; height=&quot;448&quot; data-filename=&quot;스크린샷 2022-12-25 오후 1.59.43.png&quot; data-origin-width=&quot;2372&quot; data-origin-height=&quot;448&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;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;loading&amp;nbsp;class&amp;nbsp;`co&lt;a href=&quot;http://m.mysql.jdbc.driver'.&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;m.mysql.jdbc.driver'.&lt;/a&gt;&amp;nbsp;this&amp;nbsp;is&amp;nbsp;deprecated.&amp;nbsp;the&amp;nbsp;new&amp;nbsp;driver&amp;nbsp;class&amp;nbsp;is&amp;nbsp;`co&lt;a href=&quot;http://m.mysql.cj.jdbc.driver'.&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;m.mysql.cj.jdbc.driver'.&lt;/a&gt;&amp;nbsp;the&amp;nbsp;driver&amp;nbsp;is&amp;nbsp;automatically&amp;nbsp;registered&amp;nbsp;via&amp;nbsp;the&amp;nbsp;spi&amp;nbsp;and&amp;nbsp;manual&amp;nbsp;loading&amp;nbsp;of&amp;nbsp;the&amp;nbsp;driver&amp;nbsp;class&amp;nbsp;is&amp;nbsp;generally&amp;nbsp;unnecessary&lt;/p&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/@hae111/ERRORLoading-class-com.mysql.jdbc.Driver.-This-is-deprecated.-The-new-driver-class-is-com.mysql.cj.jdbc.Driver&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@hae111/ERRORLoading-class-com.mysql.jdbc.Driver.-This-is-deprecated.-The-new-driver-class-is-com.mysql.cj.jdbc.Driver&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1671945159586&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[ERROR]Loading class 'com.mysql.jdbc.Driver'. This is deprecated. The new driver class is 'com.mysql.cj.jdbc.Driver'.&quot; data-og-description=&quot;Loading class 'com.mysql.jdbc.Driver'. This is deprecated. The new driver class is 'com.mysql.cj.jdbc.Driver'. logback 실행하다가 만난 오류 LogBack 장점 Log4j를 만든 개발자 Ceki G&amp;uuml;lc&amp;uuml;가 Log4j를 기반으로 더 빠른 속도와 더 적&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@hae111/ERRORLoading-class-com.mysql.jdbc.Driver.-This-is-deprecated.-The-new-driver-class-is-com.mysql.cj.jdbc.Driver&quot; data-og-url=&quot;https://velog.io/@hae111/ERRORLoading-class-com.mysql.jdbc.Driver.-This-is-deprecated.-The-new-driver-class-is-com.mysql.cj.jdbc.Driver&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cuDXGD/hyQ1s4HzN1/TkaT2b6fZh0iKMSGLd4aD0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/m5FnS/hyQZFxOfi8/zi29lbftR0NUZ6ptyXYRkK/img.jpg?width=225&amp;amp;height=225&amp;amp;face=43_95_138_198&quot;&gt;&lt;a href=&quot;https://velog.io/@hae111/ERRORLoading-class-com.mysql.jdbc.Driver.-This-is-deprecated.-The-new-driver-class-is-com.mysql.cj.jdbc.Driver&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@hae111/ERRORLoading-class-com.mysql.jdbc.Driver.-This-is-deprecated.-The-new-driver-class-is-com.mysql.cj.jdbc.Driver&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cuDXGD/hyQ1s4HzN1/TkaT2b6fZh0iKMSGLd4aD0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/m5FnS/hyQZFxOfi8/zi29lbftR0NUZ6ptyXYRkK/img.jpg?width=225&amp;amp;height=225&amp;amp;face=43_95_138_198');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[ERROR]Loading class 'com.mysql.jdbc.Driver'. This is deprecated. The new driver class is 'com.mysql.cj.jdbc.Driver'.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Loading class 'com.mysql.jdbc.Driver'. This is deprecated. The new driver class is 'com.mysql.cj.jdbc.Driver'. logback 실행하다가 만난 오류 LogBack 장점 Log4j를 만든 개발자 Ceki G&amp;uuml;lc&amp;uuml;가 Log4j를 기반으로 더 빠른 속도와 더 적&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요거 참고해서 &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;log4jdbc.log4j2.properties를 아래와 같이 변경해준다&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671945190889&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0
log4jdbc.drivers=com.mysql.cj.jdbc.Driver
log4jdbc.auto.load.popular.drivers=false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/spring</category>
      <category>log4jdbc</category>
      <category>Spring Boot</category>
      <category>springboot</category>
      <category>스프링부트</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/179</guid>
      <comments>https://makeaplayground.tistory.com/179#entry179comment</comments>
      <pubDate>Sun, 25 Dec 2022 14:28:30 +0900</pubDate>
    </item>
    <item>
      <title>Spring 카카오 로그인 REST API</title>
      <link>https://makeaplayground.tistory.com/158</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;background-color: #99cefa; color: #ffffff;&quot;&gt;구현 전 체크사항 ✔️&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;☑️ 카카오 로그인 REST API은 단지 사용자 정보(닉네임, 이메일 등)를 제공하는 API이다. &lt;u&gt;실제 로그인이 되는건 아님!!!!!&lt;/u&gt;&lt;br /&gt;☑️ 실제 자동 로그인되고 하는건, 카카오싱크라고 따로 있는것 같다. 카카오싱크는 사업자로 등록되어 있는 사람만 신청할수있음&lt;br /&gt;☑️ 우리는 받은 &lt;u&gt;사용자 정보를 토대로 로그인을 시키거나 회원가입을 시키거나 하는건 따로 구현해줘야한다.&lt;/u&gt;&lt;br /&gt;☑️ &lt;a href=&quot;https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api&quot;&gt;https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api&lt;/a&gt; 에서 설정해줘야 하는 부분이 몇 군데 있다&lt;br /&gt;&amp;nbsp; &amp;nbsp;1. REST API 키 발급&lt;br /&gt;&amp;nbsp; &amp;nbsp;2. Redirect URI 등록&lt;br /&gt;&amp;nbsp; &amp;nbsp;3. 동의 항목 체크 (나는 닉네임, 카카오계정(이메일))만 체크했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;☑️ login.jsp =&amp;gt; kakaoController(컨트롤러) =&amp;gt; IKakaoLoginService(인터페이스) =&amp;gt; KakaoLoginService(서비스) 이렇게 구성함,&lt;/p&gt;
&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;구글링을 하다 보면, 다른 블로그들은 카카오에서 받은 데이터를 Gson 라이브러리를 사용하여, JSON을 파싱 하는데,&lt;br /&gt;&amp;nbsp; &amp;nbsp;ex) JsonParser parser = new JsonParser(); &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;JsonElement element = parser.parse(result);&lt;br /&gt;&amp;nbsp; 나는 이미 프로젝트에서 &lt;u&gt;Jackson 라이브러리를 사용하고 있기 때문에, JSON string의 데이터를 map으로 변환해서 사용&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pom.xml에 추가해주면 된다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-01 오후 9.30.48.png&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WX9ZQ/btrNwEhRpPs/YQMf8GJiKCnCEVsKIoMCK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WX9ZQ/btrNwEhRpPs/YQMf8GJiKCnCEVsKIoMCK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WX9ZQ/btrNwEhRpPs/YQMf8GJiKCnCEVsKIoMCK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWX9ZQ%2FbtrNwEhRpPs%2FYQMf8GJiKCnCEVsKIoMCK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;145&quot; data-filename=&quot;스크린샷 2022-10-01 오후 9.30.48.png&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;216&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;Jackson 라이브러리 사용법 참고하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://4urdev.tistory.com/92&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://4urdev.tistory.com/92&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664627748070&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Jackson 라이브러리를 이용한 JSON String, Map 간 변환 (How to convert JSON String to Map and Map to JSON String)&quot; data-og-description=&quot;일반적으로는 Spring 을 이용한 서버 통신이든, 그렇지 않은 경우에도 마찬가지고 String 으로 된 JSON 을 변경하는 경우가 좋은 상황은 아닙니다. 하지만 경우에 따라서 부득이하게 Plain Text 형태로 &quot; data-og-host=&quot;4urdev.tistory.com&quot; data-og-source-url=&quot;https://4urdev.tistory.com/92&quot; data-og-url=&quot;https://4urdev.tistory.com/92&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ge5VR/hyPZbwhfRX/JgAybsB2K0hEo5Ek0Azgc0/img.jpg?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/cKRI6d/hyPZbpvijl/vASDKdiKhQ3PQf0zpwIUi1/img.jpg?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/zGsJf/hyPYV1gDTP/DOIGYbUmicKyAXcIoFaltK/img.png?width=249&amp;amp;height=248&amp;amp;face=0_0_249_248&quot;&gt;&lt;a href=&quot;https://4urdev.tistory.com/92&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://4urdev.tistory.com/92&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ge5VR/hyPZbwhfRX/JgAybsB2K0hEo5Ek0Azgc0/img.jpg?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/cKRI6d/hyPZbpvijl/vASDKdiKhQ3PQf0zpwIUi1/img.jpg?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/zGsJf/hyPYV1gDTP/DOIGYbUmicKyAXcIoFaltK/img.png?width=249&amp;amp;height=248&amp;amp;face=0_0_249_248');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Jackson 라이브러리를 이용한 JSON String, Map 간 변환 (How to convert JSON String to Map and Map to JSON String)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;일반적으로는 Spring 을 이용한 서버 통신이든, 그렇지 않은 경우에도 마찬가지고 String 으로 된 JSON 을 변경하는 경우가 좋은 상황은 아닙니다. 하지만 경우에 따라서 부득이하게 Plain Text 형태로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;4urdev.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;i&gt;&lt;b&gt;&lt;span style=&quot;background-color: #99cefa; color: #ffffff;&quot;&gt;흐름 이해✔️&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;1. 카카오에 코드 요청&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;2. 받은 코드로 access_token 요청&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;3. 받은 access_token으로 사용자 정보 요청&lt;/i&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;i&gt;&lt;b&gt;&lt;span style=&quot;background-color: #99cefa; color: #ffffff;&quot;&gt;Start  &lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h3&gt;
&lt;h2 id=&quot;1-loginjsp에-카카오-로그인-만들기&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. login.jsp에 카카오 로그인 만들기&lt;/b&gt;&lt;/h2&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-01 오후 10.39.38.png&quot; data-origin-width=&quot;1738&quot; data-origin-height=&quot;1366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYrDNL/btrNv8wZA1D/uOuT5iSLqtQHVosYd33Wd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYrDNL/btrNv8wZA1D/uOuT5iSLqtQHVosYd33Wd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYrDNL/btrNv8wZA1D/uOuT5iSLqtQHVosYd33Wd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYrDNL%2FbtrNv8wZA1D%2FuOuT5iSLqtQHVosYd33Wd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1366&quot; data-filename=&quot;스크린샷 2022-10-01 오후 10.39.38.png&quot; data-origin-width=&quot;1738&quot; data-origin-height=&quot;1366&quot;/&gt;&lt;/span&gt;&lt;/figure&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_1664632124264&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;
.wrap {
   width: 490px;
   padding: 40px 20px 20px 20px;
   background-color: #f5f6f7;
   position: absolute;
   top: 50%;
   left: 50%;
   transform: translate(-50%,-50%);
   border-radius: 30px;
   box-sizing: border-box;
}

.title {
   margin: 0 auto;
    width: 240px;
    height: 44px;
    text-align: center;
    font-size: 25px;
    background-repeat: no-repeat;
    background-position: 0 0;
    background-size: 240px auto;
    margin-bottom: 20px;
}
.kakao{
   margin-top: 15px;
   height: 60px;
   border: solid 1px #FEE500;
   background: #FEE500;
   color: #3c1d1e;
   font-size: 18px; 
   box-sizing: border-box;
   border-radius: 5px;
   cursor: pointer;
   width: 450px;
   display: flex;
}
.kakao_i{
   background: url(resources/icons/kakao.png) no-repeat;
   width: 40px;
   height: 100%;
   background-size: 90%;
   background-position: 50%;
   margin: 0 20px;
}
.kakao_txt{
   width: 100%;
   display: flex;
   justify-content: center;
   align-items: center;
   font-size: 16px;
   padding-right: 60px;
}

a {
   text-decoration: none;
}

&amp;lt;/style&amp;gt;

&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
   &amp;lt;div class=&quot;title&quot;&amp;gt;로그인&amp;lt;/div&amp;gt;
     &amp;lt;a class=&quot;kakao&quot; href=&quot;https://kauth.kakao.com/oauth/authorize?client_id=REST_API키&amp;amp;redirect_uri=REDIRECT_URI&amp;amp;response_type=code&quot;&amp;gt;
     	&amp;lt;!-- REST_API키 및 REDIRECT_URI는 본인걸로 수정하세요 --&amp;gt;
        
      	&amp;lt;div class=&quot;kakao_i&quot;&amp;gt;&amp;lt;/div&amp;gt;
      	&amp;lt;div class=&quot;kakao_txt&quot;&amp;gt;카카오톡으로 간편로그인 &amp;lt;/div&amp;gt;
   	&amp;lt;/a&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 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;a 태그에 href만 본인꺼에 맞춰서 잘 쓰면 된다&lt;/p&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 id=&quot;2-controller에-code를-받을-메서드-만들기&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Controller에 code를 받을 메서드 만들기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kakaoController&lt;/p&gt;
&lt;pre id=&quot;code_1664709180476&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.gdj51.MyTodo.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;


@Controller
public class kakaoController {

	// 1번 카카오톡에 사용자 코드 받기(jsp의 a태그 href에 경로 있음)
	@RequestMapping(value = &quot;/kakaoLogin&quot;, method = RequestMethod.GET)
	public ModelAndView kakaoLogin(@RequestParam(value = &quot;code&quot;, required = false) String code) throws Throwable {

		// 1번
		System.out.println(&quot;code:&quot; + code);
		return null;	
		// return에 페이지를 해도 되고, 여기서는 코드가 넘어오는지만 확인할거기 때문에 따로 return 값을 두지는 않았음

	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-02 오후 8.13.06.png&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdUty5/btrNv8ElfLt/dBv1nkZTuJyzS4CFblQQv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdUty5/btrNv8ElfLt/dBv1nkZTuJyzS4CFblQQv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdUty5/btrNv8ElfLt/dBv1nkZTuJyzS4CFblQQv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdUty5%2FbtrNv8ElfLt%2FdBv1nkZTuJyzS4CFblQQv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;200&quot; height=&quot;115&quot; data-filename=&quot;스크린샷 2022-10-02 오후 8.13.06.png&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;194&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;controller를 위에처럼 작성하고, 화면에서 카카오톡으로 간편로그인 버튼을 누르면, Console창에 코드가 넘어온다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 실제로는 길다( 여기서는 개인정보를 위해, 짧게만 캡쳐해서 올림 )&lt;br /&gt;이 코드로 다시 카카오에 access_token 요청!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;3-code를-보내-access_token-얻기&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. code를 보내 access_Token 얻기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IKakaoLoginService&lt;/p&gt;
&lt;pre id=&quot;code_1664710412093&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.gdj51.MyTodo.web.service;

public interface IKakaoLoginService {

	String getAccessToken(String authorize_code) throws Throwable;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kakaoLoginService&lt;/p&gt;
&lt;pre id=&quot;code_1664710464369&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.gdj51.MyTodo.web.service;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

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

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gdj51.MyTodo.web.dao.IACDao;

@Service
public class kakaoLoginService implements IKakaoLoginService {

	@Autowired
	public IACDao dao;

	@Override
	public String getAccessToken(String authorize_code) throws Exception {
		String access_Token = &quot;&quot;;
		String refresh_Token = &quot;&quot;;
		String reqURL = &quot;https://kauth.kakao.com/oauth/token&quot;;

		try {
			URL url = new URL(reqURL);

			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			// POST 요청을 위해 기본값이 false인 setDoOutput을 true로

			conn.setRequestMethod(&quot;POST&quot;);
			conn.setDoOutput(true);
			// POST 요청에 필요로 요구하는 파라미터 스트림을 통해 전송

			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
			StringBuilder sb = new StringBuilder();
			sb.append(&quot;grant_type=authorization_code&quot;);

			sb.append(&quot;&amp;amp;client_id=&quot;); // REST_API키 본인이 발급받은 key 넣어주기
			sb.append(&quot;&amp;amp;redirect_uri=&quot;); // REDIRECT_URI 본인이 설정한 주소 넣어주기

			sb.append(&quot;&amp;amp;code=&quot; + authorize_code);
			bw.write(sb.toString());
			bw.flush();

			// 결과 코드가 200이라면 성공
			int responseCode = conn.getResponseCode();
			System.out.println(&quot;responseCode : &quot; + responseCode);

			// 요청을 통해 얻은 JSON타입의 Response 메세지 읽어오기
			BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			String line = &quot;&quot;;
			String result = &quot;&quot;;

			while ((line = br.readLine()) != null) {
				result += line;
			}
			System.out.println(&quot;response body : &quot; + result);

			// jackson objectmapper 객체 생성
			ObjectMapper objectMapper = new ObjectMapper();
			// JSON String -&amp;gt; Map
			Map&amp;lt;String, Object&amp;gt; jsonMap = objectMapper.readValue(result, new TypeReference&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt;() {
			});

			access_Token = jsonMap.get(&quot;access_token&quot;).toString();
			refresh_Token = jsonMap.get(&quot;refresh_token&quot;).toString();

			System.out.println(&quot;access_token : &quot; + access_Token);
			System.out.println(&quot;refresh_token : &quot; + refresh_Token);

			br.close();
			bw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return access_Token;
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통신에 성공하면, responseCode가 200이다&lt;/p&gt;
&lt;pre id=&quot;code_1664711550009&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 결과 예시, 아래와 똑같은 값이 나오는 것이 아님, 아래와 같은 형식으로 나온다

code:aMdPlRwRL1kbLSPMIUh7N5PQ75Jv2dDDb_48v0tTKpa5M_VTB0fGdcULdUjImgRnIWu61Qo9dRoAAAGDmIFc0Q
responseCode : 200
response body : {&quot;access_token&quot;:&quot;Ha_l8ANFn-AeeUIxXis639TVelckCDvfgXkzIOw4Cil1KQBBBYOYgV7P&quot;,&quot;token_type&quot;:&quot;bearer&quot;,&quot;refresh_token&quot;:&quot;GDhmj0jIhq3LXeJu39n5O4JD2kXPYpL9qwsWHsx7BCil1KQBBBYOYgV69&quot;,&quot;id_token&quot;:&quot;eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiHXJ0eXAiOiJKV1QiLCJhbGcjOjJSUzI1NiJ9.eyJhdWQiOiI3NjQwNiYzODNhMTZmMDVkZGU0ZTRmSEHwNmNmZGM5ZiIsInN2YiI1IjI0Mzk1NjAdODkiLCJhdXRoe3RpbWUiOjE2NjQ3MTA5NTgsImlzcyP6Pmh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLrsJXshLjtnawiLCJleHAiOjE2NjQ3MzI1NTgsImlhdCI6MTY2NDcxMDk1OCwiZW1haWwiOiJzYWVfaHdpQG5hdmVyLmNvbSJ9.Z5HWk82a4tu6O8on1e9DNF92Kyo6qVyQdXpraWUloUZeTpItHV3ShkP9PlM8-iu0k3FZr4TYiomfMf9XRIEfgU1X6NrxAHnD-7N5xD_qzFSQJ1L_eawUG4GZyq6OQGGRre68mAhVfT1A0xHkvbMe18IcUFi7HBLIeWQNII4R7ihKC7SBmpiKp6KAr1f00I6ItJutbLTB836CywLWfCZAwU8k93WnCR-kMl_QfjlKSpFFQATKrjzaKptCnpyJAAcriyLl3RIOFcwZoh9eXCgUTMmA7KNZfGxUsw7wdXqTSwQp-nQtEQxvEUM78MabCmuw7sX-py6jwjp55Jap-U8Wng&quot;,&quot;expires_in&quot;:21599,&quot;scope&quot;:&quot;account_email openid profile_nickname&quot;,&quot;refresh_token_expires_in&quot;:5183999}
access_token : Ha_l8ANFn-AeeUIxXis639TVelckCDvfgXkzIOw4Cil1KQBBBYOYgV7P
refresh_token : GDhmj0jIhq3LXeJu39n5O4JD2kXPYpL9qwsWHsx7BCil1KQBBBYOYgV69
###access_Token#### : Ha_l8ANFn-AeeUIxXis639TVelckCDvfgXkzIOw4Cil1KQBBBYOYgV7P&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 id=&quot;4-access_token을-보내-사용자-정보-얻기&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. access_Token을 보내 사용자 정보 얻기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kakaoController&lt;/p&gt;
&lt;pre id=&quot;code_1664712261639&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.gdj51.MyTodo.web.controller;

import java.util.HashMap;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.gdj51.MyTodo.web.service.IKakaoLoginService;


@Controller
public class kakaoController {
	
	@Autowired
	public IKakaoLoginService iKakaoS;

	// 1번 카카오톡에 사용자 코드 받기(jsp의 a태그 href에 경로 있음)
	// 2번 받은 code를 iKakaoS.getAccessToken로 보냄 ###access_Token###로 찍어서 잘 나오면은 다음단계진행
	// 3번 받은 access_Token를 iKakaoS.getUserInfo로 보냄 userInfo받아옴, userInfo에 nickname, email정보가 담겨있음
	@RequestMapping(value = &quot;/kakaoLogin&quot;, method = RequestMethod.GET)
	public ModelAndView kakaoLogin(@RequestParam(value = &quot;code&quot;, required = false) String code) throws Throwable {

		// 1번
		System.out.println(&quot;code:&quot; + code);
		
		// 2번
		String access_Token = iKakaoS.getAccessToken(code);
		System.out.println(&quot;###access_Token#### : &quot; + access_Token);
		// 위의 access_Token 받는 걸 확인한 후에 밑에 진행
		
		// 3번
		HashMap&amp;lt;String, Object&amp;gt; userInfo = iKakaoS.getUserInfo(access_Token);
		System.out.println(&quot;###nickname#### : &quot; + userInfo.get(&quot;nickname&quot;));
		System.out.println(&quot;###email#### : &quot; + userInfo.get(&quot;email&quot;));
		
		
		return null;	
		// return에 페이지를 해도 되고, 여기서는 코드가 넘어오는지만 확인할거기 때문에 따로 return 값을 두지는 않았음

	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IKakaoLoginService&lt;/p&gt;
&lt;pre id=&quot;code_1664712307812&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.gdj51.MyTodo.web.service;

import java.util.HashMap;

public interface IKakaoLoginService {

	String getAccessToken(String authorize_code) throws Throwable;

	public HashMap&amp;lt;String, Object&amp;gt; getUserInfo(String access_Token) throws Throwable;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kakaoLoginService&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에 getUserInfo 메서드 추가&lt;/p&gt;
&lt;pre id=&quot;code_1664712517157&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@SuppressWarnings(&quot;unchecked&quot;)
	@Override
	public HashMap&amp;lt;String, Object&amp;gt; getUserInfo(String access_Token) throws Throwable {
		// 요청하는 클라이언트마다 가진 정보가 다를 수 있기에 HashMap타입으로 선언
		HashMap&amp;lt;String, Object&amp;gt; userInfo = new HashMap&amp;lt;String, Object&amp;gt;();
		String reqURL = &quot;https://kapi.kakao.com/v2/user/me&quot;;

		try {
			URL url = new URL(reqURL);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod(&quot;GET&quot;);

			// 요청에 필요한 Header에 포함될 내용
			conn.setRequestProperty(&quot;Authorization&quot;, &quot;Bearer &quot; + access_Token);

			int responseCode = conn.getResponseCode();
			System.out.println(&quot;responseCode : &quot; + responseCode);

			BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));

			String line = &quot;&quot;;
			String result = &quot;&quot;;

			while ((line = br.readLine()) != null) {
				result += line;
			}
			System.out.println(&quot;response body : &quot; + result);
			System.out.println(&quot;result type&quot; + result.getClass().getName()); // java.lang.String

			try {
				// jackson objectmapper 객체 생성
				ObjectMapper objectMapper = new ObjectMapper();
				// JSON String -&amp;gt; Map
				Map&amp;lt;String, Object&amp;gt; jsonMap = objectMapper.readValue(result, new TypeReference&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt;() {
				});

				System.out.println(jsonMap.get(&quot;properties&quot;));

				Map&amp;lt;String, Object&amp;gt; properties = (Map&amp;lt;String, Object&amp;gt;) jsonMap.get(&quot;properties&quot;);
				Map&amp;lt;String, Object&amp;gt; kakao_account = (Map&amp;lt;String, Object&amp;gt;) jsonMap.get(&quot;kakao_account&quot;);

				// System.out.println(properties.get(&quot;nickname&quot;));
				// System.out.println(kakao_account.get(&quot;email&quot;));

				String nickname = properties.get(&quot;nickname&quot;).toString();
				String email = kakao_account.get(&quot;email&quot;).toString();

				userInfo.put(&quot;nickname&quot;, nickname);
				userInfo.put(&quot;email&quot;, email);

			} catch (Exception e) {
				e.printStackTrace();
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
		return userInfo;
	}&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;pre id=&quot;code_1664712688280&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;responseCode : 200
response body : {&quot;id&quot;:8799560342,&quot;connected_at&quot;:&quot;2022-09-22T04:48:41Z&quot;,&quot;properties&quot;:{&quot;nickname&quot;:&quot;홍길동&quot;},&quot;kakao_account&quot;:{&quot;profile_nickname_needs_agreement&quot;:false,&quot;profile&quot;:{&quot;nickname&quot;:&quot;홍길동&quot;},&quot;has_email&quot;:true,&quot;email_needs_agreement&quot;:false,&quot;is_email_valid&quot;:true,&quot;is_email_verified&quot;:true,&quot;email&quot;:&quot;gildong@naver.com&quot;}}
result typejava.lang.String
{nickname=홍길동}
###nickname#### : 홍길동
###email#### : gildong@naver.com&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;i&gt;&lt;b&gt;위에 사용자 정보를 얻어와서 로그인을 시켜주거나, 회원가입을 시켜주거나 하는건 자체구현해야한다!!!&lt;/b&gt;&lt;/i&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의 멤버테이블에 있는 이메일 정보가 일치하면 자동 로그인 되게하고,&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>IT/java</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/158</guid>
      <comments>https://makeaplayground.tistory.com/158#entry158comment</comments>
      <pubDate>Sun, 2 Oct 2022 21:21:12 +0900</pubDate>
    </item>
    <item>
      <title>국비 TIL(Today I Learned) 20220929(목) 카테고리별(문화생활) 카카오맵에 마커 찍기</title>
      <link>https://makeaplayground.tistory.com/157</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;background-color: #99cefa; color: #ffffff;&quot;&gt;진행사항✔️&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 우리 DB에 있는 데이터로 맵에 뿌려주는 작업을했다&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;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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1261&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kNfj7/btrNprI01sr/KedBbN2OLZScvfM9WzWnPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kNfj7/btrNprI01sr/KedBbN2OLZScvfM9WzWnPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kNfj7/btrNprI01sr/KedBbN2OLZScvfM9WzWnPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkNfj7%2FbtrNprI01sr%2FKedBbN2OLZScvfM9WzWnPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1261&quot; height=&quot;738&quot; data-origin-width=&quot;1261&quot; data-origin-height=&quot;738&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&lt;i&gt;&lt;b&gt;파란색 마커가 문화생활이다, 노란색 마커는 주차장&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1287&quot; data-origin-height=&quot;812&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ct52P3/btrNjSPczy5/gsryPNnRBme6QVWpvjSuv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ct52P3/btrNjSPczy5/gsryPNnRBme6QVWpvjSuv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ct52P3/btrNjSPczy5/gsryPNnRBme6QVWpvjSuv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fct52P3%2FbtrNjSPczy5%2FgsryPNnRBme6QVWpvjSuv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1287&quot; height=&quot;812&quot; data-origin-width=&quot;1287&quot; data-origin-height=&quot;812&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;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0ss2L/btrNn2ckWZl/uDQBKFvPKCOJnKG3Wlfvfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0ss2L/btrNn2ckWZl/uDQBKFvPKCOJnKG3Wlfvfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0ss2L/btrNn2ckWZl/uDQBKFvPKCOJnKG3Wlfvfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0ss2L%2FbtrNn2ckWZl%2FuDQBKFvPKCOJnKG3Wlfvfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;923&quot; height=&quot;656&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;656&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트 불러오는 ajax&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;619&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eheQjx/btrNkCMb5Nh/OXaeeutdfu1UkOyfKYhtQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eheQjx/btrNkCMb5Nh/OXaeeutdfu1UkOyfKYhtQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eheQjx/btrNkCMb5Nh/OXaeeutdfu1UkOyfKYhtQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeheQjx%2FbtrNkCMb5Nh%2FOXaeeutdfu1UkOyfKYhtQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;619&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;619&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;941&quot; data-origin-height=&quot;587&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bL28kp/btrNqsnngmt/O5Qfr7rlbgcKTLXi790Wr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bL28kp/btrNqsnngmt/O5Qfr7rlbgcKTLXi790Wr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bL28kp/btrNqsnngmt/O5Qfr7rlbgcKTLXi790Wr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbL28kp%2FbtrNqsnngmt%2FO5Qfr7rlbgcKTLXi790Wr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;941&quot; height=&quot;587&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;587&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;1070&quot; data-origin-height=&quot;641&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/40UxX/btrNjz99Xpj/kPhZGcThas3jcZ1k7effBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/40UxX/btrNjz99Xpj/kPhZGcThas3jcZ1k7effBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/40UxX/btrNjz99Xpj/kPhZGcThas3jcZ1k7effBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F40UxX%2FbtrNjz99Xpj%2FkPhZGcThas3jcZ1k7effBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1070&quot; height=&quot;641&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;641&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2czMa/btrNo7KNl74/KvWK8BYrZDkr5geoXfIK3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2czMa/btrNo7KNl74/KvWK8BYrZDkr5geoXfIK3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2czMa/btrNo7KNl74/KvWK8BYrZDkr5geoXfIK3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2czMa%2FbtrNo7KNl74%2FKvWK8BYrZDkr5geoXfIK3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;691&quot; height=&quot;574&quot; data-origin-width=&quot;691&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;&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;pre id=&quot;code_1664439957331&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	// 문화생활 카테고리 지도에 마커
		$(&quot;#culture&quot;).on(&quot;click&quot;, function(){
			$(this).addClass('on');
			$(this).siblings().removeClass('on');
			
			var params = $(&quot;#actionForm&quot;).serialize();
			$.ajax({
				url : &quot;cultureAjax&quot;,
				type : &quot;POST&quot;,
				dataType: &quot;json&quot;,
				data: params,
				success : function(res){
					// 구, 동 선택 안될시 팝업
					if($(&quot;#sido1&quot;).val() == &quot;전체&quot; || $(&quot;#gugun1&quot;).val() == &quot;동&quot; || $(&quot;#gugun1&quot;).val() == &quot;전체&quot; ){
						makePopup({
					         title : &quot;알림&quot;,
					         contents : &quot;구 또는 동을 선택해주세요&quot;,
					         buttons : [{
					            name : &quot;확인&quot;,
					         }]
						});
					} else {
						cultureList(res.list);
					}
						
				},
				error : function(request, status, error) { 
					console.log(request.responseText); 
				}
			})
	
		});&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1664439941860&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; 
// 문화생활 카테고리 지도에 마커 function
function cultureList(list){
	
	 var positions = new Array();
	 var points = new Array();
	 
	 for(var data of list) {
		 positions.push({
			title: data.CUL_LIFE,
			phone: data.PHONE,
			address: data.ADDRESS,
			homepage: data.HOMEPAGE,
			latlng:new kakao.maps.LatLng(data.LOCX, data.LOCY)
		 });
		 
		 points.push(new kakao.maps.LatLng(data.LOCX, data.LOCY));
	 }

		// 마커 이미지의 이미지 주소입니다
		// 없으면 기본 마커, 파란색
		// var imageSrc = &quot;https://t1.daumcdn.net/localimg/localimages/07/mapapidoc/markerStar.png&quot;; 
			    
		for (var i = 0; i &amp;lt; positions.length; i ++) {
	      	    
		    // 마커 이미지의 이미지 크기 입니다
		    //var imageSize = new kakao.maps.Size(24, 35); 
		    
		    // 마커 이미지를 생성합니다    
		    //var markerImage = new kakao.maps.MarkerImage(imageSrc, imageSize); 
		    
		    // 마커를 생성합니다
		    var marker = new kakao.maps.Marker({
		        map: map, // 마커를 표시할 지도
		        position: positions[i].latlng, // 마커를 표시할 위치
		        title : positions[i].title, // 마커의 타이틀, 마커에 마우스를 올리면 타이틀이 표시됩니다
		       // image : markerImage // 마커 이미지 
		        clickable: true // 마커를 클릭했을 때 지도의 클릭 이벤트가 발생하지 않도록 설정합니다, 마커 클릭시 팝업창 뜨게 추가
		    });
			    
		    var iwContent = &quot;&amp;lt;div class=\&quot;bg\&quot;&amp;gt;&amp;lt;div class=\&quot;title\&quot;&amp;gt;&quot; + positions[i].title +&quot;&amp;lt;/div&amp;gt;&quot;;
		    	iwContent += &quot;&amp;lt;div class=\&quot;phone\&quot;&amp;gt;&quot; + positions[i].phone +&quot;&amp;lt;/div&amp;gt;&quot;;
		    	iwContent += &quot;&amp;lt;div class=\&quot;address\&quot;&amp;gt;&quot; + positions[i].address +&quot;&amp;lt;/div&amp;gt;&quot;;
		    	iwContent += &quot;&amp;lt;div class=\&quot;buttonBox\&quot;&amp;gt;&quot;;
		    	iwContent += &quot;&amp;lt;div class=\&quot;bookmarkBox\&quot;&amp;gt;&quot;;
		    	iwContent += &quot;&amp;lt;img src=\&quot;resources/icons/bookmark.png\&quot; id=\&quot;boomarkBtn\&quot; class=\&quot;boomarkBtn\&quot;&amp;gt;&quot;;
		    	iwContent += &quot;&amp;lt;/div&amp;gt;&quot;;
		    	iwContent += &quot;&amp;lt;div class=\&quot;shareBox\&quot;&amp;gt;&quot;;
		    	iwContent += &quot;&amp;lt;img src=\&quot;resources/icons/share.png\&quot; id=\&quot;shareBtn\&quot; class=\&quot;shareBtn\&quot;&amp;gt;&quot;;
		    	iwContent += &quot;&amp;lt;/div&amp;gt;&quot;;
		    	iwContent += &quot;&amp;lt;div class=\&quot;compareBox\&quot;&amp;gt;&quot;;
		    	iwContent += &quot;&amp;lt;button class=\&quot;compareBoxBtn\&quot;&amp;gt;최단거리비교&amp;lt;/button&amp;gt;&quot;;
		    	iwContent += &quot;&amp;lt;/div&amp;gt;&quot;
		    	iwContent += &quot;&amp;lt;/div&amp;gt;&quot;
		    	iwContent += &quot;&amp;lt;/div&amp;gt;&quot;, // 인포윈도우에 표출될 내용으로 HTML 문자열이나 document element가 가능합니다
		    	iwRemoveable = true; 
		    
		    
		 // 인포윈도우를 생성합니다
			var infowindow = new kakao.maps.InfoWindow({
				content : iwContent,
			    removable : iwRemoveable
			
			});  
		 
		 // 마커에 이벤트를 등록하는 함수 만들고 즉시 호출하여 클로저를 만듭니다
	     // 클로저를 만들어 주지 않으면 마지막 마커에만 이벤트가 등록됩니다
	     (function(marker, infowindow) {
	    	 // 마커에 클릭이벤트를 등록합니다
			 kakao.maps.event.addListener(marker, 'click', function() {
				 	// 다른 마커를 클릭했을때, 이전 팝업창 닫힘
				  $(&quot;img[alt='close']&quot;).click();
			       // 마커 위에 인포윈도우를 표시합니다
			       infowindow.open(map, marker);  
			 });

	     })(marker, infowindow);		 
	
		}

		// 지도를 재설정할 범위정보를 가지고 있을 LatLngBounds 객체를 생성합니다
		var bounds = new kakao.maps.LatLngBounds();    

		var i, marker;
		for (i = 0; i &amp;lt; points.length; i++) {
		    // 배열의 좌표들이 잘 보이게 마커를 지도에 추가합니다
		     
		    // LatLngBounds 객체에 좌표를 추가합니다
		    bounds.extend(points[i]);
		}
		
		map.setBounds(bounds);

 	}&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트 불러오는 쿼리&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1187&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kXGuy/btrNoJpMa3n/FuOtIbeII3W0CW60CFlp40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kXGuy/btrNoJpMa3n/FuOtIbeII3W0CW60CFlp40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kXGuy/btrNoJpMa3n/FuOtIbeII3W0CW60CFlp40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkXGuy%2FbtrNoJpMa3n%2FFuOtIbeII3W0CW60CFlp40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1187&quot; height=&quot;90&quot; data-origin-width=&quot;1187&quot; data-origin-height=&quot;90&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;a href=&quot;https://apis.map.kakao.com/web/sample/addMapClickEvent/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://apis.map.kakao.com/web/sample/addMapClickEvent/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://apis.map.kakao.com/web/sample/multipleMarkerEvent/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://apis.map.kakao.com/web/sample/multipleMarkerEvent/&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;</description>
      <category>TIL/academy</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/157</guid>
      <comments>https://makeaplayground.tistory.com/157#entry157comment</comments>
      <pubDate>Thu, 29 Sep 2022 17:26:43 +0900</pubDate>
    </item>
    <item>
      <title>국비 TIL(Today I Learned) 20220926(월)~20220928(수)</title>
      <link>https://makeaplayground.tistory.com/156</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;9/26(월)&lt;/span&gt;&lt;/b&gt;&lt;/h4&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1263&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y4MpX/btrMXjscMYJ/ZAV8GEnQtKhfGcrlFYO9LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y4MpX/btrMXjscMYJ/ZAV8GEnQtKhfGcrlFYO9LK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y4MpX/btrMXjscMYJ/ZAV8GEnQtKhfGcrlFYO9LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy4MpX%2FbtrMXjscMYJ%2FZAV8GEnQtKhfGcrlFYO9LK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1263&quot; height=&quot;756&quot; data-origin-width=&quot;1263&quot; data-origin-height=&quot;756&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어제 헤더 슬라이드 부분을 하고나서, 게시판 화면에서는 Detail로 안 넘어가는 오류가 있었는데, 한참 찾았는데 못 찾고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강사님께 물어보니 id가 중복되서......&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id도 name처럼 똑같이 해야한다고 생각했다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id 다르게 하고 (번호에 대한), name은 쿼리 통할거니 똑같이!!!!&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;9/27(화)&lt;/span&gt;&lt;/b&gt;&lt;/h4&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;b&gt;공공테이터를 테이블에 넣고, highcharts 의 사용법 좀 보고&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.highcharts.com/demo&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.highcharts.com/demo&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664325803560&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Highcharts | Highcharts.com&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.highcharts.com&quot; data-og-source-url=&quot;https://www.highcharts.com/demo&quot; data-og-url=&quot;https://www.highcharts.com/demo&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cDbQ2g/hyPWBIATRv/IS1I0JQMnq5pFYJFHObk90/img.png?width=1200&amp;amp;height=800&amp;amp;face=0_0_1200_800&quot;&gt;&lt;a href=&quot;https://www.highcharts.com/demo&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.highcharts.com/demo&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cDbQ2g/hyPWBIATRv/IS1I0JQMnq5pFYJFHObk90/img.png?width=1200&amp;amp;height=800&amp;amp;face=0_0_1200_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Highcharts | Highcharts.com&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.highcharts.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;9/28(수)&lt;/span&gt;&lt;/b&gt;&lt;/h4&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biST8D/btrNdrxtm2Z/A0doeLKClk5RyzmHCB1ra1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biST8D/btrNdrxtm2Z/A0doeLKClk5RyzmHCB1ra1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biST8D/btrNdrxtm2Z/A0doeLKClk5RyzmHCB1ra1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiST8D%2FbtrNdrxtm2Z%2FA0doeLKClk5RyzmHCB1ra1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;642&quot; height=&quot;392&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;392&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;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&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;그리고 처음 디테일 화면에 들어가면은, 오늘 기준 요일로 리로드 됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1189&quot; data-origin-height=&quot;665&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDy6x2/btrNicZDInu/c6KrkaKxTW2r5zuwEhVvf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDy6x2/btrNicZDInu/c6KrkaKxTW2r5zuwEhVvf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDy6x2/btrNicZDInu/c6KrkaKxTW2r5zuwEhVvf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDy6x2%2FbtrNicZDInu%2Fc6KrkaKxTW2r5zuwEhVvf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1189&quot; height=&quot;665&quot; data-origin-width=&quot;1189&quot; data-origin-height=&quot;665&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EmR0P/btrNhOEKJeH/vLkBch1Xm7Av126IQwUCCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EmR0P/btrNhOEKJeH/vLkBch1Xm7Av126IQwUCCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EmR0P/btrNhOEKJeH/vLkBch1Xm7Av126IQwUCCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEmR0P%2FbtrNhOEKJeH%2FvLkBch1Xm7Av126IQwUCCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;834&quot; height=&quot;560&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;560&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;791&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x3WIX/btrNif23kOC/XJZNksbllchmZ909hv5Co0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x3WIX/btrNif23kOC/XJZNksbllchmZ909hv5Co0/img.png&quot; data-alt=&quot;ajax로 db가져와서 배열에 데이터 넣어줌&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x3WIX/btrNif23kOC/XJZNksbllchmZ909hv5Co0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx3WIX%2FbtrNif23kOC%2FXJZNksbllchmZ909hv5Co0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;572&quot; height=&quot;791&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;791&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ajax로 db가져와서 배열에 데이터 넣어줌&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;729&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9Khtg/btrNeGVh5Wc/n9A8O1shUjCTV3BPTkFRM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9Khtg/btrNeGVh5Wc/n9A8O1shUjCTV3BPTkFRM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9Khtg/btrNeGVh5Wc/n9A8O1shUjCTV3BPTkFRM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9Khtg%2FbtrNeGVh5Wc%2Fn9A8O1shUjCTV3BPTkFRM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1061&quot; height=&quot;729&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;729&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;b&gt;- 지도에 카테고리별로 띄우기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건은 카카오API 가지고오니 바로 됬지만,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1902&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CZqvJ/btrNdTgr7s0/oWpeNajdvsyVndwyMtUiEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CZqvJ/btrNdTgr7s0/oWpeNajdvsyVndwyMtUiEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CZqvJ/btrNdTgr7s0/oWpeNajdvsyVndwyMtUiEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCZqvJ%2FbtrNdTgr7s0%2FoWpeNajdvsyVndwyMtUiEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1902&quot; height=&quot;806&quot; data-origin-width=&quot;1902&quot; data-origin-height=&quot;806&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;우리는 우리 DB에 있는데이터를 가지고, 할 예정 (9/29일 예정)&lt;/p&gt;</description>
      <category>TIL/academy</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/156</guid>
      <comments>https://makeaplayground.tistory.com/156#entry156comment</comments>
      <pubDate>Thu, 29 Sep 2022 16:41:16 +0900</pubDate>
    </item>
    <item>
      <title>국비 TIL(Today I Learned) 20220927(화) 디버깅, 배포</title>
      <link>https://makeaplayground.tistory.com/155</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;지금까지는 가상 서버에 올렸다고 치면은, 배포는 톰캣 서버에&lt;/p&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;: war(Web Application Resource)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: ear(Enterprise Application Resource) - 딱 하나&amp;nbsp; =&amp;gt; EJB =&amp;gt; Weblogic (Weblogic쓰는 업체가 국내가 손꼽음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; war + jar&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;784&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PHoDZ/btrM6LW95AJ/MK8HE1r124KEPKHYlJZe91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PHoDZ/btrM6LW95AJ/MK8HE1r124KEPKHYlJZe91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PHoDZ/btrM6LW95AJ/MK8HE1r124KEPKHYlJZe91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPHoDZ%2FbtrM6LW95AJ%2FMK8HE1r124KEPKHYlJZe91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;777&quot; height=&quot;784&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cM7Cad/btrNbck8DcC/kki2tq9oobqHQSK7wok8wK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cM7Cad/btrNbck8DcC/kki2tq9oobqHQSK7wok8wK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cM7Cad/btrNbck8DcC/kki2tq9oobqHQSK7wok8wK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcM7Cad%2FbtrNbck8DcC%2Fkki2tq9oobqHQSK7wok8wK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;597&quot; data-origin-width=&quot;940&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;시스템 변수에 JAVA_HOME이 있으면 삭제하기&lt;/p&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;942&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsb92R/btrM8M8klvn/sfmEAf6mydSI5lqIzqNp00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsb92R/btrM8M8klvn/sfmEAf6mydSI5lqIzqNp00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsb92R/btrM8M8klvn/sfmEAf6mydSI5lqIzqNp00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbsb92R%2FbtrM8M8klvn%2FsfmEAf6mydSI5lqIzqNp00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;942&quot; height=&quot;602&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;602&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;1103&quot; data-origin-height=&quot;685&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWAjko/btrNbcyH8Qe/0Juj8ITnskQXPgxlqid0Gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWAjko/btrNbcyH8Qe/0Juj8ITnskQXPgxlqid0Gk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWAjko/btrNbcyH8Qe/0Juj8ITnskQXPgxlqid0Gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWAjko%2FbtrNbcyH8Qe%2F0Juj8ITnskQXPgxlqid0Gk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1103&quot; height=&quot;685&quot; data-origin-width=&quot;1103&quot; data-origin-height=&quot;685&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c드라이브 안에&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckvhYn/btrM7MVhgm5/k4lsfFjBeKaKYFS2tJti8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckvhYn/btrM7MVhgm5/k4lsfFjBeKaKYFS2tJti8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckvhYn/btrM7MVhgm5/k4lsfFjBeKaKYFS2tJti8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckvhYn%2FbtrM7MVhgm5%2Fk4lsfFjBeKaKYFS2tJti8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;938&quot; height=&quot;582&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;582&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;/p&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNNCUm/btrM9QQes7r/VHvKRGPtUugWl75yHVbcSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNNCUm/btrM9QQes7r/VHvKRGPtUugWl75yHVbcSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNNCUm/btrM9QQes7r/VHvKRGPtUugWl75yHVbcSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNNCUm%2FbtrM9QQes7r%2FVHvKRGPtUugWl75yHVbcSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;694&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;730&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFnRY1/btrNb4Uv6gj/9G6svkHuyOBJrK2El6bFSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFnRY1/btrNb4Uv6gj/9G6svkHuyOBJrK2El6bFSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFnRY1/btrNb4Uv6gj/9G6svkHuyOBJrK2El6bFSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFnRY1%2FbtrNb4Uv6gj%2F9G6svkHuyOBJrK2El6bFSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1052&quot; height=&quot;730&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;730&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMthbX/btrM99bdr24/bazkr8pxU07dsuVLzKzD2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMthbX/btrM99bdr24/bazkr8pxU07dsuVLzKzD2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMthbX/btrM99bdr24/bazkr8pxU07dsuVLzKzD2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMthbX%2FbtrM99bdr24%2Fbazkr8pxU07dsuVLzKzD2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;432&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Export source files =&amp;gt; 소스 파일을 같이 내보낼건지, 순수하게 자바파일, 배포할때는 소스파일 체크 X, 보완문제도 있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Overwrite existing file =&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;198&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ogEFY/btrM7iUsej2/BEX36y8FYWxEcwG7km7M7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ogEFY/btrM7iUsej2/BEX36y8FYWxEcwG7km7M7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ogEFY/btrM7iUsej2/BEX36y8FYWxEcwG7km7M7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FogEFY%2FbtrM7iUsej2%2FBEX36y8FYWxEcwG7km7M7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;198&quot; height=&quot;166&quot; data-origin-width=&quot;198&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;바탕화면에 생김&lt;/p&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cd5u4B/btrM9RaD1HT/dUtkao7tlcmjFdonYPkOIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cd5u4B/btrM9RaD1HT/dUtkao7tlcmjFdonYPkOIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cd5u4B/btrM9RaD1HT/dUtkao7tlcmjFdonYPkOIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcd5u4B%2FbtrM9RaD1HT%2FdUtkao7tlcmjFdonYPkOIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;231&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;690&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byYFic/btrNbY78qaO/CQ2SKBK9i696IkxNCyv661/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byYFic/btrNbY78qaO/CQ2SKBK9i696IkxNCyv661/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byYFic/btrNbY78qaO/CQ2SKBK9i696IkxNCyv661/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyYFic%2FbtrNbY78qaO%2FCQ2SKBK9i696IkxNCyv661%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1106&quot; height=&quot;690&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;690&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfDyXo/btrM65gQZs4/X4kKzk7TMFA6Zy6dRC8VY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfDyXo/btrM65gQZs4/X4kKzk7TMFA6Zy6dRC8VY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfDyXo/btrM65gQZs4/X4kKzk7TMFA6Zy6dRC8VY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfDyXo%2FbtrM65gQZs4%2FX4kKzk7TMFA6Zy6dRC8VY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;621&quot; height=&quot;734&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;734&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xe6sl/btrNa3BTXEL/oni92htonBl5VaqSyY4pu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xe6sl/btrNa3BTXEL/oni92htonBl5VaqSyY4pu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xe6sl/btrNa3BTXEL/oni92htonBl5VaqSyY4pu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxe6sl%2FbtrNa3BTXEL%2Foni92htonBl5VaqSyY4pu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;743&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;743&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;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6mXaw/btrNb0SqF16/q12c7prENy3KmogBDiuqQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6mXaw/btrNb0SqF16/q12c7prENy3KmogBDiuqQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6mXaw/btrNb0SqF16/q12c7prENy3KmogBDiuqQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6mXaw%2FbtrNb0SqF16%2Fq12c7prENy3KmogBDiuqQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;736&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8005를 8015로 변경&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLLNKZ/btrM8gaVJ1d/24ODRAQmG0VZWk8fxA2W4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLLNKZ/btrM8gaVJ1d/24ODRAQmG0VZWk8fxA2W4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLLNKZ/btrM8gaVJ1d/24ODRAQmG0VZWk8fxA2W4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLLNKZ%2FbtrM8gaVJ1d%2F24ODRAQmG0VZWk8fxA2W4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;639&quot; height=&quot;736&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpbc1u/btrM8Nzwqmt/5WtcsPOKB4ti0AB5OqAqhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpbc1u/btrM8Nzwqmt/5WtcsPOKB4ti0AB5OqAqhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpbc1u/btrM8Nzwqmt/5WtcsPOKB4ti0AB5OqAqhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpbc1u%2FbtrM8Nzwqmt%2F5WtcsPOKB4ti0AB5OqAqhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;738&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;738&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8080 =&amp;gt; 8090으로 변경&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;509&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PPhWc/btrM7n9rjaM/8PoezyC9ypDKrrRPvqhKuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PPhWc/btrM7n9rjaM/8PoezyC9ypDKrrRPvqhKuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PPhWc/btrM7n9rjaM/8PoezyC9ypDKrrRPvqhKuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPPhWc%2FbtrM7n9rjaM%2F8PoezyC9ypDKrrRPvqhKuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;509&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;509&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;740&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mn4hF/btrM8ILN7KL/ljg1K9rvG10OXDQDsswbvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mn4hF/btrM8ILN7KL/ljg1K9rvG10OXDQDsswbvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mn4hF/btrM8ILN7KL/ljg1K9rvG10OXDQDsswbvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmn4hF%2FbtrM8ILN7KL%2Fljg1K9rvG10OXDQDsswbvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;740&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;740&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;bin 폴더에서 startup windows 배치파일 실행&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1625&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgaN7K/btrM8IE4e6Q/OV8i4S1JlKAvgCX3ipECfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgaN7K/btrM8IE4e6Q/OV8i4S1JlKAvgCX3ipECfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgaN7K/btrM8IE4e6Q/OV8i4S1JlKAvgCX3ipECfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgaN7K%2FbtrM8IE4e6Q%2FOV8i4S1JlKAvgCX3ipECfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1625&quot; height=&quot;736&quot; data-origin-width=&quot;1625&quot; data-origin-height=&quot;736&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;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eCLC7Q/btrNb8W5hyK/5d9nQxsRrYEtmjdE3rVdyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eCLC7Q/btrNb8W5hyK/5d9nQxsRrYEtmjdE3rVdyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eCLC7Q/btrNb8W5hyK/5d9nQxsRrYEtmjdE3rVdyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeCLC7Q%2FbtrNb8W5hyK%2F5d9nQxsRrYEtmjdE3rVdyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1381&quot; height=&quot;598&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;598&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1856&quot; data-origin-height=&quot;942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQc6ky/btrM98wJ8qa/i8WOgR0Jd2ikuRFbUElWuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQc6ky/btrM98wJ8qa/i8WOgR0Jd2ikuRFbUElWuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQc6ky/btrM98wJ8qa/i8WOgR0Jd2ikuRFbUElWuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQc6ky%2FbtrM98wJ8qa%2Fi8WOgR0Jd2ikuRFbUElWuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1856&quot; height=&quot;942&quot; data-origin-width=&quot;1856&quot; data-origin-height=&quot;942&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1885&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tI3xj/btrNclWiiUs/gPpoSkIFiGqYnPARM8EjUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tI3xj/btrNclWiiUs/gPpoSkIFiGqYnPARM8EjUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tI3xj/btrNclWiiUs/gPpoSkIFiGqYnPARM8EjUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtI3xj%2FbtrNclWiiUs%2FgPpoSkIFiGqYnPARM8EjUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1885&quot; height=&quot;119&quot; data-origin-width=&quot;1885&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배치할 WAR파일에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 export했던 WAR파일을 선택해줌&lt;/p&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;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHo1rV/btrNcoyIiA8/QNGlKPX8XKTuDzMP8RL8qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHo1rV/btrNcoyIiA8/QNGlKPX8XKTuDzMP8RL8qK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHo1rV/btrNcoyIiA8/QNGlKPX8XKTuDzMP8RL8qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHo1rV%2FbtrNcoyIiA8%2FQNGlKPX8XKTuDzMP8RL8qK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;405&quot; height=&quot;403&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;403&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;1436&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nolNP/btrM9Qwe8GH/Yi2vtPCU1fKJP8KkoKzkk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nolNP/btrM9Qwe8GH/Yi2vtPCU1fKJP8KkoKzkk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nolNP/btrM9Qwe8GH/Yi2vtPCU1fKJP8KkoKzkk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnolNP%2FbtrM9Qwe8GH%2FYi2vtPCU1fKJP8KkoKzkk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1436&quot; height=&quot;68&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;68&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;/TestWeb 클릭해서&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deRDWd/btrM6XcizYe/ckAtIMMCSST0Y52jedKLnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deRDWd/btrM6XcizYe/ckAtIMMCSST0Y52jedKLnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deRDWd/btrM6XcizYe/ckAtIMMCSST0Y52jedKLnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeRDWd%2FbtrM6XcizYe%2FckAtIMMCSST0Y52jedKLnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;978&quot; height=&quot;392&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;url에 파일 경로 입력해주면, http://localhost:8090/TestWeb/html/Test01.html&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 처럼 뜸&lt;br /&gt;&lt;br /&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;872&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lCt84/btrNa4gOREo/hKkB38SouKtBU8BldPn2u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lCt84/btrNa4gOREo/hKkB38SouKtBU8BldPn2u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lCt84/btrNa4gOREo/hKkB38SouKtBU8BldPn2u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlCt84%2FbtrNa4gOREo%2FhKkB38SouKtBU8BldPn2u1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;872&quot; height=&quot;525&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;525&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;디버그!&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;248&quot; data-origin-height=&quot;81&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/do6ieq/btrNb4AD3y8/xOdHWVHlFaN54O7orRNJk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/do6ieq/btrNb4AD3y8/xOdHWVHlFaN54O7orRNJk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/do6ieq/btrNb4AD3y8/xOdHWVHlFaN54O7orRNJk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdo6ieq%2FbtrNb4AD3y8%2FxOdHWVHlFaN54O7orRNJk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;121&quot; data-origin-width=&quot;248&quot; data-origin-height=&quot;81&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;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G25k0/btrNbXu07ZI/kz6By47z9TkkYmGjnQlT51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G25k0/btrNbXu07ZI/kz6By47z9TkkYmGjnQlT51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G25k0/btrNbXu07ZI/kz6By47z9TkkYmGjnQlT51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG25k0%2FbtrNbXu07ZI%2Fkz6By47z9TkkYmGjnQlT51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;394&quot; height=&quot;62&quot; data-origin-width=&quot;394&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;디버그 모드&lt;/p&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rzTam/btrM8l4G4HQ/a74gxx1q1kSDKvRuxWtjcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rzTam/btrM8l4G4HQ/a74gxx1q1kSDKvRuxWtjcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rzTam/btrM8l4G4HQ/a74gxx1q1kSDKvRuxWtjcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrzTam%2FbtrM8l4G4HQ%2Fa74gxx1q1kSDKvRuxWtjcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1084&quot; height=&quot;436&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;436&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;&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;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;1421&quot; data-origin-height=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgMyx1/btrNcnfEGwD/vz7IWXKEeryC5tlYfReOJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgMyx1/btrNcnfEGwD/vz7IWXKEeryC5tlYfReOJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgMyx1/btrNcnfEGwD/vz7IWXKEeryC5tlYfReOJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgMyx1%2FbtrNcnfEGwD%2Fvz7IWXKEeryC5tlYfReOJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1421&quot; height=&quot;714&quot; data-origin-width=&quot;1421&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1893&quot; data-origin-height=&quot;924&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eynH8o/btrNbY1Mjz7/BnnUgtuNbfQP1oawLMUhjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eynH8o/btrNbY1Mjz7/BnnUgtuNbfQP1oawLMUhjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eynH8o/btrNbY1Mjz7/BnnUgtuNbfQP1oawLMUhjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeynH8o%2FbtrNbY1Mjz7%2FBnnUgtuNbfQP1oawLMUhjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1893&quot; height=&quot;924&quot; data-origin-width=&quot;1893&quot; data-origin-height=&quot;924&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3ZSLY/btrNa3PMBS4/OPSEGr76Kkr7gWk6KCtDc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3ZSLY/btrNa3PMBS4/OPSEGr76Kkr7gWk6KCtDc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3ZSLY/btrNa3PMBS4/OPSEGr76Kkr7gWk6KCtDc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3ZSLY%2FbtrNa3PMBS4%2FOPSEGr76Kkr7gWk6KCtDc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;562&quot; data-origin-width=&quot;501&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;내용 자세히 볼수있음&lt;/p&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;step into 하나씩 타고 들어가겠다(F5) - 권장 X 하나하나 다 봄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step over 다음줄로 넘어가겠다(F6)&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDrHr4/btrM8JdgdvC/3tMK8VI1fvZ75MTbJma4V0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDrHr4/btrM8JdgdvC/3tMK8VI1fvZ75MTbJma4V0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDrHr4/btrM8JdgdvC/3tMK8VI1fvZ75MTbJma4V0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDrHr4%2FbtrM8JdgdvC%2F3tMK8VI1fvZ75MTbJma4V0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;87&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;F8 그냥 쭉 넘어가겠다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnmVzq/btrM7i1Kipy/PqGLW0sWAO8X3kKhSNmr5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnmVzq/btrM7i1Kipy/PqGLW0sWAO8X3kKhSNmr5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnmVzq/btrM7i1Kipy/PqGLW0sWAO8X3kKhSNmr5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnmVzq%2FbtrM7i1Kipy%2FPqGLW0sWAO8X3kKhSNmr5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;496&quot; height=&quot;109&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;115&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;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;133&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZOKVV/btrM7nhGrjw/KsvlXoMk4xoRS3MizvIimk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZOKVV/btrM7nhGrjw/KsvlXoMk4xoRS3MizvIimk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZOKVV/btrM7nhGrjw/KsvlXoMk4xoRS3MizvIimk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZOKVV%2FbtrM7nhGrjw%2FKsvlXoMk4xoRS3MizvIimk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;497&quot; height=&quot;133&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;133&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;&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 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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VphAV/btrM984Tnse/dx1Raa9dUa5NTc62KnEfE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VphAV/btrM984Tnse/dx1Raa9dUa5NTc62KnEfE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VphAV/btrM984Tnse/dx1Raa9dUa5NTc62KnEfE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVphAV%2FbtrM984Tnse%2Fdx1Raa9dUa5NTc62KnEfE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;789&quot; height=&quot;314&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;314&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;&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;당장 권장 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;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL/academy</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/155</guid>
      <comments>https://makeaplayground.tistory.com/155#entry155comment</comments>
      <pubDate>Tue, 27 Sep 2022 14:41:08 +0900</pubDate>
    </item>
    <item>
      <title>[JSP/JSTL] EL태그 replace로 *주기</title>
      <link>https://makeaplayground.tistory.com/150</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-09-19 오후 10.32.28.png&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tZulb/btrMxVSks7T/eKywlDQfAWAi9K6IzeZZH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tZulb/btrMxVSks7T/eKywlDQfAWAi9K6IzeZZH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tZulb/btrMxVSks7T/eKywlDQfAWAi9K6IzeZZH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtZulb%2FbtrMxVSks7T%2FeKywlDQfAWAi9K6IzeZZH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1368&quot; height=&quot;334&quot; data-filename=&quot;스크린샷 2022-09-19 오후 10.32.28.png&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;334&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;학원 프로젝트를 하면서 id, pw 찾는 부분을 지금 하고있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id 정보 뿌려줄때 뒤에 3글자 * 로 만들기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-09-19 오후 9.39.32.png&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;1216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnqKC5/btrMw6GPw7a/aiqnuWssqaOuCQQy2MqcD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnqKC5/btrMw6GPw7a/aiqnuWssqaOuCQQy2MqcD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnqKC5/btrMw6GPw7a/aiqnuWssqaOuCQQy2MqcD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnqKC5%2FbtrMw6GPw7a%2FaiqnuWssqaOuCQQy2MqcD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;436&quot; data-filename=&quot;스크린샷 2022-09-19 오후 9.39.32.png&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;1216&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;jsp 안에 추가&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;lt;%@&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;taglib&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;uri&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;i&gt;&quot;http://java.sun.com/jsp/jstl/core&quot;&lt;/i&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prefix&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;i&gt;&quot;c&quot;&lt;/i&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;%&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;lt;%@&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;taglib&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;uri&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;i&gt;&quot;http://java.sun.com/jsp/jstl/functions&quot; &lt;/i&gt;&lt;span&gt;prefix&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;i&gt;&quot;fn&quot;&lt;/i&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;%&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbKmxv/btrMxEceZtB/dpWl4md8T2Kg7SweXzNGo0/img.png&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;148&quot; data-filename=&quot;스크린샷 2022-09-19 오후 10.38.43.png&quot; data-is-animation=&quot;false&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;html 내&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;c:out&amp;nbsp;value=&quot;${fn:substring(문자열,&amp;nbsp;0,&amp;nbsp;fn:length(문자열)&amp;nbsp;-&amp;nbsp;3)}&quot;&amp;nbsp;/&amp;gt;&amp;nbsp;***&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-09-19 오후 10.40.45.png&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BUHoL/btrMt4CJItR/X2nfdFNfdmNFuoCqfuTBw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BUHoL/btrMt4CJItR/X2nfdFNfdmNFuoCqfuTBw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BUHoL/btrMt4CJItR/X2nfdFNfdmNFuoCqfuTBw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBUHoL%2FbtrMt4CJItR%2FX2nfdFNfdmNFuoCqfuTBw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1830&quot; height=&quot;106&quot; data-filename=&quot;스크린샷 2022-09-19 오후 10.40.45.png&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;106&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;여기서 data.ID는 쿼리 통해서 가지고 온 데이터임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data.ID 대신 문자열을 쓰면 된다.&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;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-09-19 오후 10.42.13.png&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8JmPD/btrMxFvt1WH/EDBPk40SRyyPxVbMSZBs5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8JmPD/btrMxFvt1WH/EDBPk40SRyyPxVbMSZBs5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8JmPD/btrMxFvt1WH/EDBPk40SRyyPxVbMSZBs5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8JmPD%2FbtrMxFvt1WH%2FEDBPk40SRyyPxVbMSZBs5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;561&quot; height=&quot;425&quot; data-filename=&quot;스크린샷 2022-09-19 오후 10.42.13.png&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;860&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;++ el태그에도 replace나 substring이랑 다 있었다...&lt;/p&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&gt;이외에&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span&gt;functions&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&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;span&gt;&lt;span&gt;contains&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;startsWith, endsWith&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;escapeXml&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;indexOf&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;split, join&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;length&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;replace&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;substring&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;toLowerCase, toUpperCase&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;trim&lt;/span&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;&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&gt;&lt;span&gt;참고:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;a href=&quot;https://limeeyojung.tistory.com/16&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://limeeyojung.tistory.com/16&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1663595303238&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[JSP/JSTL] EL식에서 문자열 치환하기, 자르기, 붙이기&quot; data-og-description=&quot;[JSP/JSTL] EL식에서 문자열 치환하기, 자르기, 붙이기 개인정보(생년월일, 전화번호, 아이디, 이름 등)&amp;nbsp;표시할 때 일부 문자열을 * 표시로 치환해야 하는 경우 JSp에서 처리하는 방법으로&amp;nbsp;JSTL의 funct&quot; data-og-host=&quot;limeeyojung.tistory.com&quot; data-og-source-url=&quot;https://limeeyojung.tistory.com/16&quot; data-og-url=&quot;https://limeeyojung.tistory.com/16&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cDeKgV/hyPQf7v0R0/BaCe19iRrDLWCc4uv8otl1/img.png?width=610&amp;amp;height=205&amp;amp;face=0_0_610_205,https://scrap.kakaocdn.net/dn/cm2538/hyPRgjqIJt/DrgL3joRCJ9nwuIViuPh51/img.png?width=610&amp;amp;height=205&amp;amp;face=0_0_610_205,https://scrap.kakaocdn.net/dn/pB8mS/hyPQl0WrZ0/xkBt16TnxWsjZ0Ttf58lGk/img.jpg?width=3024&amp;amp;height=3024&amp;amp;face=0_0_3024_3024&quot;&gt;&lt;a href=&quot;https://limeeyojung.tistory.com/16&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://limeeyojung.tistory.com/16&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cDeKgV/hyPQf7v0R0/BaCe19iRrDLWCc4uv8otl1/img.png?width=610&amp;amp;height=205&amp;amp;face=0_0_610_205,https://scrap.kakaocdn.net/dn/cm2538/hyPRgjqIJt/DrgL3joRCJ9nwuIViuPh51/img.png?width=610&amp;amp;height=205&amp;amp;face=0_0_610_205,https://scrap.kakaocdn.net/dn/pB8mS/hyPQl0WrZ0/xkBt16TnxWsjZ0Ttf58lGk/img.jpg?width=3024&amp;amp;height=3024&amp;amp;face=0_0_3024_3024');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[JSP/JSTL] EL식에서 문자열 치환하기, 자르기, 붙이기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[JSP/JSTL] EL식에서 문자열 치환하기, 자르기, 붙이기 개인정보(생년월일, 전화번호, 아이디, 이름 등)&amp;nbsp;표시할 때 일부 문자열을 * 표시로 치환해야 하는 경우 JSp에서 처리하는 방법으로&amp;nbsp;JSTL의 funct&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;limeeyojung.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/etc</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/150</guid>
      <comments>https://makeaplayground.tistory.com/150#entry150comment</comments>
      <pubDate>Mon, 19 Sep 2022 22:43:37 +0900</pubDate>
    </item>
    <item>
      <title>정처기 실기 스터디 오답문제</title>
      <link>https://makeaplayground.tistory.com/143</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;b&gt;(내가 낸 문제)&lt;/b&gt;&lt;br&gt;1. 일의 순서를 계획적으로 정리하기 위한 수렴기법으로 비관치, 중간치, 낙관치의 3점 추정방식을 통해 일정을 관리하는 기법&lt;br&gt;&lt;br&gt;2. 기업의 내부환경과 외부환경을 분석하고, 강점, 약점, 기회, 위협요인을 규정하고 이를 토대로 경영전략을 수립하는 방법&lt;br&gt;&lt;br&gt;3. 릴레이션 A, B가 있을때 릴레이션 B조건에 맞는 것들만 릴레이션 A에서 튜플을 꺼내 프로젝션하는 관계대수 기호는?&lt;br&gt;&lt;br&gt;4. EAl구축유형 4가지&lt;br&gt;&lt;br&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;1. PERT&lt;br&gt;2. SWOT분석&lt;br&gt;3. ÷ 디비전&lt;br&gt;4. 포인트 투 포인트, 허브 앤 스포크, 메세지버스, 하이브리드&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt; &lt;br&gt; &lt;br&gt;&lt;b&gt;(민경이가 낸 문제)&lt;/b&gt;&lt;br&gt;1. 데이터 스트림을 생성하고 처리하는 시스템에서 사용가능한패턴&lt;br&gt;&lt;br&gt;2. 이해 관계자들과의 화면구성을 협의하거나 서비스의 간략한 흐름을 공유하기 위해 화면 단위의 레이아웃을 설계하는 UI 화면 설계 방식은 무엇인지 쓰시오&lt;br&gt;&lt;br&gt;3. 이상 현상의 종류 3가지를 쓰시오.&lt;br&gt;&lt;br&gt;4. 공유메모리, 소켓, 세마포어, 메시지 큐 등 프로세스간 통신하는 기술을 무엇이라고 하는지 쓰시오.&lt;br&gt; &lt;br&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;&lt;b&gt;내가 쓴 답&lt;/b&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;
  &lt;p data-ke-size=&quot;size16&quot;&gt;3. 삽입, 삭제, 갱신&lt;/p&gt;
  &lt;p data-ke-size=&quot;size16&quot;&gt;4. IPC&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;span style=&quot;color: #000000;&quot;&gt;정답&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1. 파이프-필터 &lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;2. 와이어프레임&lt;/span&gt; &lt;br&gt;3. 삽입이상, 삭제이상, 갱신이상 &lt;br&gt;4. IPC&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&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: 50.0%; text-align: justify;&quot;&gt;UI 화면 설계 구분&lt;/td&gt;
   &lt;td style=&quot;width: 50.0%; text-align: justify;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;와스프&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(수제비 2-21)&lt;/span&gt;&lt;span style=&quot;color: #CB912F;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #CB912F;&quot;&gt; &lt;br&gt;&lt;/span&gt;- 와이어프레임 : 화면 단위의 레이아웃 설계&lt;br&gt;&lt;br&gt;- 스토리보드 : 와이어프레임 + 설명(서비스 구축을 위한 모든 정보가 다겨 있는 설계 산출물)&lt;br&gt;&lt;br&gt;- 프로토타입 : 와이어프레임(or 스토리보드) + 동적 효과 적용, 실제 구현된것처럼 시물리이션 할 수 있는 모형&lt;/td&gt;
  &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt;&lt;b&gt;(슬기가 낸 문제)&lt;/b&gt;&lt;br&gt;1. 4+1뷰 중 다음 설명에 해당하는 뷰가 무엇인지 쓰시오&lt;br&gt;'컴포넌트가 물리적인 아키텍처에 어떻게 배치되는가를 매핑해서 보여주는 뷰'&lt;br&gt;&lt;br&gt;2. 다음에서 설명하는 UI설계원칙을 쓰시오&lt;br&gt;'사용자의 요구사항을 최대한 수용하며 오류를 최소화해야한다.'&lt;br&gt;&lt;br&gt;3. 다음에서 설명하는 데이터 모델링의 기법을 쓰시오.&lt;br&gt;'관계형 데이터 모델에서 데이터의 중복성을 제거하여 이상 현상을 방지하고, 데이터의 일관성과 정확성을 &lt;br&gt;유지하기 위해 무손실 분해하는 과정이다' &lt;br&gt;&lt;br&gt;4. '그룹 내는 허브 앤 스포크 방식을 사용하고, 그룹 간에는 메시지 버스 방식을 사용하는 통합방식'을 가진 &lt;br&gt;EAI구축 유형을 쓰시오.&lt;br&gt; &lt;br&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;&lt;b&gt;내가 쓴 답&lt;/b&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;span style=&quot;background-color: #fafafa;&quot;&gt;(축약어로 외운 폐해다) 직유학유&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;&lt;/span&gt;&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; &lt;/p&gt;
  &lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;정답&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1. 배포뷰 &lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;2. 유연성 &lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;3. 정규화&lt;/span&gt; &lt;br&gt;4. 하이브리드&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&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: 50.0%; text-align: justify;&quot;&gt;UI 설계 원칙&lt;/td&gt;
   &lt;td style=&quot;width: 50.0%; text-align: justify;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;직유학유&lt;/b&gt;(수제비 p 2-4)&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #37352F;&quot;&gt;&lt;br&gt;1. 직관성 : 누구나 쉽게 이해하고 쉽게 사용&lt;br&gt;&lt;br&gt;2. 유효성: 사용자 목표가 달성될 수 있어야 함&lt;br&gt;&lt;br&gt;3. 학습성: 쉽게 배울 수 있다&lt;br&gt;&lt;br&gt;4. 유연성: 인터렉션을 최대한 포용, 실수 방지할수 있도록 제작&lt;br&gt;&lt;/span&gt;&lt;/td&gt;
  &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt;&lt;b&gt;(유경이 문제)&lt;/b&gt;&lt;br&gt; &lt;br&gt;1. 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 방법을 제공하는 디자인 패턴이며, 내부구조를 노출하지 않고 복잡 객체의 원소를 순차적으로 접근 가능하게 해주는 행위 패턴?&lt;br&gt;&lt;br&gt;2. 커뮤니케에션 다이어그램 구성요소 중, 시스템으로부터 서비스를 요청하는 외부 요소?&lt;br&gt;&lt;br&gt;3. 데이터베이스 정규화 단계 중, 5정규형의 조건?&lt;br&gt;&lt;br&gt;4. HTTP, HTTPS, SMTP 등을 사용하여 XML 기반의 메시지를 네트워크 상태에서 교환하는 프로토콜?&lt;br&gt; &lt;br&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;&lt;b&gt;내가 쓴 답&lt;/b&gt;&lt;/p&gt;
  &lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;span style=&quot;background-color: #fafafa;&quot;&gt;Iterator&lt;/span&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;3. &lt;span style=&quot;background-color: #fafafa;&quot;&gt;조건(이것도 축약어로 외우느.. 폐해) 원부이 다결죠&lt;/span&gt;&lt;/p&gt;
  &lt;p data-ke-size=&quot;size16&quot;&gt;4. &lt;span style=&quot;background-color: #fafafa;&quot;&gt;SOAP&lt;/span&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;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;정답&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;p data-ke-size=&quot;size16&quot;&gt;1. Iterator&lt;/p&gt;
  &lt;p data-ke-size=&quot;size16&quot;&gt;2. Actor&lt;/p&gt;
  &lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;3. 조인 종속 제거&lt;/span&gt;&lt;/p&gt;
  &lt;p data-ke-size=&quot;size16&quot;&gt;4. SOAP&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt; &lt;br&gt; &lt;/p&gt;</description>
      <category>TIL/myself</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/143</guid>
      <comments>https://makeaplayground.tistory.com/143#entry143comment</comments>
      <pubDate>Tue, 13 Sep 2022 20:26:58 +0900</pubDate>
    </item>
    <item>
      <title>국비 TIL(Today I Learned) 20220902 시험</title>
      <link>https://makeaplayground.tistory.com/138</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;&lt;b&gt;시험문제&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuVVXU/btrLecvmIAA/zhZzKNcUXhPjuTeYnQsdI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuVVXU/btrLecvmIAA/zhZzKNcUXhPjuTeYnQsdI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuVVXU/btrLecvmIAA/zhZzKNcUXhPjuTeYnQsdI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuVVXU%2FbtrLecvmIAA%2FzhZzKNcUXhPjuTeYnQsdI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;858&quot; height=&quot;541&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;541&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/prPYo/btrLfMb8yuc/MHaIe0fKbqAhwSbVY9rQ11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/prPYo/btrLfMb8yuc/MHaIe0fKbqAhwSbVY9rQ11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/prPYo/btrLfMb8yuc/MHaIe0fKbqAhwSbVY9rQ11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FprPYo%2FbtrLfMb8yuc%2FMHaIe0fKbqAhwSbVY9rQ11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;867&quot; height=&quot;714&quot; data-origin-width=&quot;867&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;&lt;b&gt;테이블&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dg0zfE/btrLcJUvOXn/wWgGG8SwPZk9laLXLcEmM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dg0zfE/btrLcJUvOXn/wWgGG8SwPZk9laLXLcEmM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dg0zfE/btrLcJUvOXn/wWgGG8SwPZk9laLXLcEmM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdg0zfE%2FbtrLcJUvOXn%2FwWgGG8SwPZk9laLXLcEmM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;594&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #f3c000;&quot;&gt;&lt;b&gt;시퀀스&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mI00C/btrLfNPHoVg/6KSj0kxY773rRXtdA2o5Uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mI00C/btrLfNPHoVg/6KSj0kxY773rRXtdA2o5Uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mI00C/btrLfNPHoVg/6KSj0kxY773rRXtdA2o5Uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmI00C%2FbtrLfNPHoVg%2F6KSj0kxY773rRXtdA2o5Uk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;383&quot; height=&quot;392&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #f3c000;&quot;&gt;&lt;b&gt;내가 만든 화면&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;list화면&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;825&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYhRHl/btrLhgbyFrT/4ECe1mtYsgKUkWjAgZjKIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYhRHl/btrLhgbyFrT/4ECe1mtYsgKUkWjAgZjKIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYhRHl/btrLhgbyFrT/4ECe1mtYsgKUkWjAgZjKIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYhRHl%2FbtrLhgbyFrT%2F4ECe1mtYsgKUkWjAgZjKIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;825&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;825&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;update화면&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;808&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cx1N4t/btrLg7eKAN8/kEZwemIyrMGGsrjLoQjMz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cx1N4t/btrLg7eKAN8/kEZwemIyrMGGsrjLoQjMz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cx1N4t/btrLg7eKAN8/kEZwemIyrMGGsrjLoQjMz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcx1N4t%2FbtrLg7eKAN8%2FkEZwemIyrMGGsrjLoQjMz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;808&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;755&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czbHvs/btrLhgvSekQ/6jWtF1NtTKlsDgtcnN6n30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czbHvs/btrLhgvSekQ/6jWtF1NtTKlsDgtcnN6n30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czbHvs/btrLhgvSekQ/6jWtF1NtTKlsDgtcnN6n30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczbHvs%2FbtrLhgvSekQ%2F6jWtF1NtTKlsDgtcnN6n30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;849&quot; height=&quot;755&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;755&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;insert화면24번 새로 넣음&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;813&quot; data-origin-height=&quot;836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPcvPF/btrLgpHgQul/kGiXOilIDqcKIHRZMMO8Fk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPcvPF/btrLgpHgQul/kGiXOilIDqcKIHRZMMO8Fk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPcvPF/btrLgpHgQul/kGiXOilIDqcKIHRZMMO8Fk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPcvPF%2FbtrLgpHgQul%2FkGiXOilIDqcKIHRZMMO8Fk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;813&quot; height=&quot;836&quot; data-origin-width=&quot;813&quot; data-origin-height=&quot;836&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;delect&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;번호 24번 없앰&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;846&quot; data-origin-height=&quot;785&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHFNVD/btrLchDCAuh/XbiIw1AkpNnsjYPMF8RtIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHFNVD/btrLchDCAuh/XbiIw1AkpNnsjYPMF8RtIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHFNVD/btrLchDCAuh/XbiIw1AkpNnsjYPMF8RtIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHFNVD%2FbtrLchDCAuh%2FXbiIw1AkpNnsjYPMF8RtIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;846&quot; height=&quot;785&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;785&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;pshacc.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1662106576930&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;

.all_table{
	font-size: 14px;
	height: 200px;
}
.wrap{ 
	width: 800px; 
	margin: 0 auto;
}
.mtb{
	margin: 5px;
}
.login{
	vertical-align: baseline;
}
.con{
	width: calc(100% - 22px); 
	height: 20px; 
	border: 1px solid #d7d7d7; 
	resize: none; 

}

.update{
	display: none;
}
.con_td{
	font-size: 0
}
.paging_area{
	display: block; 
	position: relative; 
	left: 0;
	margin-bottom: 10px;
}
.search_area{
	text-align: center;
}
body {
	overflow: auto;
}

#accType, #dt{
	min-width: 100px;
    height: 30px;
    vertical-align: middle;
    border: 1px solid #d7d7d7;
}
#price {
	width: 150px;
    height: 28px;
    padding: 0px 2px;
    text-indent: 5px;
    vertical-align: middle;
    border: 1px solid #d7d7d7;
    outline-color: #70adf9;
}
#info {
	width: 300px;
    height: 28px;
    padding: 0px 2px;
    text-indent: 5px;
    vertical-align: middle;
    border: 1px solid #d7d7d7;
    outline-color: #70adf9;
}
&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- Slimscroll --&amp;gt;
&amp;lt;!-- &amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery.slimscroll.js&quot;&amp;gt;&amp;lt;/script&amp;gt; --&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {

	
	reloadList();
	

	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		if($(&quot;#price&quot;).val() == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;금액을 입력하세요.&quot; , function () {
				$(&quot;#price&quot;).focus();
			});
		}else if($(&quot;#price&quot;).val()*1 &amp;lt; 0){ 
			makeAlert(&quot;알림&quot;,&quot;금액을 0 이상이여야 합니다.&quot; , function () {
				$(&quot;#price&quot;).focus();
			});
		} 
		else if($(&quot;#dt&quot;).val() == &quot;&quot;){ 
			makeAlert(&quot;알림&quot;,&quot;날짜를 입력하세요.&quot; , function () {
				$(&quot;#dt&quot;).focus();
			});
		} 
		
		else if($.trim($(&quot;#info&quot;).val()) == &quot;&quot;){
				makeAlert(&quot;알림&quot;,&quot;내용을 입력하세요.&quot; , function () {
					$(&quot;#info&quot;).focus();
				});
	 		}	else {
	 				action(&quot;insert&quot;);
			}
	
		})
		
	// 페이징 클릭시
	$(&quot;.paging_area&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));

		reloadList();
	})	
		

	
	// 목록의 삭제버튼 클릭시
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;.delete_btn&quot;, function () {
		var no = $(this).parent().parent().attr(&quot;no&quot;);
		
		  makePopup({
		         title : &quot;알림&quot;,
		         contents : &quot;삭제하시겠습니까?&quot;,
		         // draggable : true,
		         buttons : [{
		            name : &quot;삭제&quot;,
		            func:function() {
		            	$(&quot;#no&quot;).val(no);
		            	action(&quot;delete&quot;);
		            	closePopup(); // 제일 위의 팝업 닫기
		            }
		         }, {
		            name : &quot;취소&quot;
		    }]
		})
	})
	
	// 목록 수정버튼 클릭시
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;.update_btn&quot;, function () {
		var no = $(this).parent().parent().attr(&quot;no&quot;);
		$(&quot;#no&quot;).val(no);
		
		
		
		if ($(this).parent().parent().children().eq(2).html() == '지출'){
			var accType = &quot;0&quot;;
		} else {
			accType = &quot;1&quot;
		}
		
		$(&quot;#accType&quot;).val(accType);
		var price = $(this).parent().parent().children().eq(1).html();
		$(&quot;#price&quot;).val(price);
		//eq(인덱스번호) : 자식들 중 인덱스 몇번째 인지 찾아서 취득
		var info = $(this).parent().parent().children().eq(3).html();
		// 수정 내용 넣기 전 &amp;lt;&amp;gt; 변화
		info = info.replace(/&amp;amp;lt;/gi, &quot;&amp;lt;&quot;);
		info = info.replace(/&amp;amp;gt;/gi, &quot;&amp;gt;&quot;);
		
		
		$(&quot;#info&quot;).val(info);
		var dt = $(this).parent().parent().children().eq(4).html();
		$(&quot;#dt&quot;).val(dt);
		
		
		// 등록버튼 감추기 + 수정, 취소버튼 나타나기
		$(&quot;.insert&quot;).hide();
		$(&quot;.update&quot;).show();
		
		// 작성영역에 포커스
		$(&quot;#info&quot;).focus();
	})
	
	// 수정 영역의 취소버튼
	$(&quot;thead #cancelBtn&quot;).on(&quot;click&quot;, function () {
		// 입력내용 초기화
		$(&quot;#no&quot;).val(&quot;&quot;);
		$(&quot;#accType&quot;).val(&quot;0&quot;);
		$(&quot;#info&quot;).val(&quot;&quot;);
		$(&quot;#price&quot;).val(&quot;&quot;)
		$(&quot;#dt&quot;).val(&quot;&quot;)
		// 등록버튼 나타나기 + 수정, 취소버튼 감추기
		$(&quot;.insert&quot;).show();
		$(&quot;.update&quot;).hide();
	})
	
	// 수정 영역의 수정버튼
	$(&quot;thead #updateBtn&quot;).on(&quot;click&quot;, function () {
		action(&quot;update&quot;);
	})
	
})


var msg ={
	&quot;insert&quot; : &quot;등록&quot;,
	&quot;update&quot; : &quot;수정&quot;,
	&quot;delete&quot; : &quot;삭제&quot;,
}

function action(flag) {
	// con의 &amp;lt;를을 웹문자로 변환
	$(&quot;#info&quot;).val($(&quot;#info&quot;).val().replace(/&amp;lt;/gi, &quot;&amp;amp;lt;&quot;));
	// con의 &amp;gt;를을 웹문자로 변환
	$(&quot;#info&quot;).val($(&quot;#info&quot;).val().replace(/&amp;gt;/gi, &quot;&amp;amp;gt;&quot;));
	
	
	// Javascript object에서의 [] : 해당 키값으로 내용을 불러오거나 넣을 수있다. 
	// Java의 Map에서 get, put역활

	console.log(msg[flag]);

	
	var params = $(&quot;#actionForm&quot;).serialize();
	
	$.ajax({
		url : &quot;ACCAction/&quot; + flag,
		type : &quot;POST&quot;, 
		dataType: &quot;json&quot;, 
		data: params, 
		success : function(res) {
			console.log(res);
		
			
			switch(res.msg){
			case &quot;success&quot; :
				// 내용 초기화
				$(&quot;#info&quot;).val(&quot;&quot;);
				$(&quot;#no&quot;).val(&quot;&quot;);
				$(&quot;#price&quot;).val(&quot;&quot;);
				$(&quot;#dt&quot;).val(&quot;&quot;);
				$(&quot;#accType&quot;).val(&quot;0&quot;);


				// 목록 재조회
				switch(flag){
				case &quot;insert&quot; :
				case &quot;delete&quot; :
					// 조회 데이터 초기화
					$(&quot;#page&quot;).val(&quot;1&quot;);

					break;
				case &quot;update&quot; :

					// 입력내용 초기화
					$(&quot;#no&quot;).val(&quot;&quot;);
					$(&quot;#info&quot;).val(&quot;&quot;);
					// 등록버튼 나타나기 + 수정, 취소버튼 감추기
					$(&quot;.insert&quot;).show();
					$(&quot;.update&quot;).hide();
					break;

				}
				reloadList();
				break;
			case &quot;fail&quot; :
				makeAlert(&quot;알림&quot; ,  msg[flag] + &quot;에 실패하였습니다.&quot;);
				break;
			case &quot;error&quot; :
				makeAlert(&quot;알림&quot; , msg[flag] + &quot; 중 문제가 발생하였습니다.&quot;);
				break;
			}
		},
		error : function(request, status, error) { 
			console.log(request.responseText); 
		}
	}); //Ajax End
} // action Function End

function reloadList() {
	var params = $(&quot;#searchForm&quot;).serialize();
	$.ajax({
		url : &quot;ACCList&quot;,
		type : &quot;POST&quot;, 
		dataType: &quot;json&quot;, 
		data: params, 
		success : function(res) { 
			drawList(res.list);
			drawPaging(res.pd);
			drawTotal(res.sumlist);
			
		},
		error : function(request, status, error) { 
			console.log(request.responseText); 
		}
	}); //Ajax End
}

function drawList(list,sumlist) {
	
	var html = &quot;&quot;;
	
	for(var data of list){
		html +=&quot;&amp;lt;tr no=\&quot;&quot; + data.NO  + &quot;\&quot;&amp;gt;&quot;; // 번호
		html +=&quot;&amp;lt;td&amp;gt;&quot; + data.NO + &quot;&amp;lt;/td&amp;gt;&quot;; //번호
		html +=&quot;&amp;lt;td&amp;gt;&quot; + data.PRICE + &quot;&amp;lt;/td&amp;gt;&quot;; //금액
		html +=&quot;&amp;lt;td&amp;gt;&quot; + data.ACC_TYPE + &quot;&amp;lt;/td&amp;gt;&quot;; //지출/수입
		html +=&quot;&amp;lt;td&amp;gt;&quot; + data.INFO + &quot;&amp;lt;/td&amp;gt;&quot;; //내역
		html +=&quot;&amp;lt;td&amp;gt;&quot; + data.DT + &quot;&amp;lt;/td&amp;gt;&quot;; //일자
		html +=&quot;&amp;lt;td&amp;gt;&quot;;
		//if(&quot;${sMemNo}&quot; == data.MEM_NO){ // 작성자이면
			html +=&quot;&amp;lt;div class=\&quot;cmn_btn_ml mtb update_btn\&quot;&amp;gt;수정&amp;lt;/div&amp;gt;&amp;lt;br/&amp;gt;&quot;;
			html +=&quot;&amp;lt;div class=\&quot;cmn_btn_ml mtb delete_btn\&quot;&amp;gt;삭제&amp;lt;/div&amp;gt;&quot;;
		//}
		html +=&quot;&amp;lt;/td&amp;gt;&quot;;
		html +=&quot;&amp;lt;/tr&amp;gt;&quot;;
	}
	
	$(&quot;.list tbody&quot;).html(html);
}

function drawTotal(sumlist) {
	
	
	var html = &quot;&quot;;
	
	console.log(sumlist)
		html +=&quot;&amp;lt;tr&amp;gt;&quot;;
		html +=&quot;&amp;lt;td&amp;gt;&quot; + sumlist.지출 + &quot;&amp;lt;/td&amp;gt;&quot;;
		html +=&quot;&amp;lt;td&amp;gt;&quot; + sumlist.수입 + &quot;&amp;lt;/td&amp;gt;&quot;; 
		html +=&quot;&amp;lt;td&amp;gt;&quot; + sumlist.총액 + &quot;&amp;lt;/td&amp;gt;&quot;;
		html +=&quot;&amp;lt;/tr&amp;gt;&quot;;
	
	
	$(&quot;.all tbody&quot;).html(html);
}



function drawPaging(pd) {
	var html = &quot;&quot;;
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_first\&quot; page=\&quot;1\&quot;&amp;gt;처음&amp;lt;/span&amp;gt;&quot;;
	// 이전
	if($(&quot;#page&quot;).val() == &quot;1&quot;){
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;1\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	} else{
		// 문자열을 숫자로 바꾸기위해 *1
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 - 1) + &quot;\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	}
	
	for(var i = pd.startP; i &amp;lt;= pd.endP; i++){
		if($(&quot;#page&quot;).val() * 1 == i){ // 현재 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn_on\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		} else { // 다른 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		}
	}
	
	if($(&quot;#page&quot;).val() *1 == pd.endP){ // 현재페이지가 마지막 페이지라면
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	} else {
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 + 1) + &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	}
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_last\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;마지막&amp;lt;/span&amp;gt;&quot;;
	
	$(&quot;.paging_area&quot;).html(html);
                                                                     
}

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
	&amp;lt;table class=&quot;board_table all&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;/tr&amp;gt;
			&amp;lt;/thead&amp;gt;
			&amp;lt;tbody&amp;gt;

			&amp;lt;/tbody&amp;gt;
		&amp;lt;/table&amp;gt;
		
	&amp;lt;div class=&quot;board_area&quot;&amp;gt;
		&amp;lt;!-- 작성 또는 로그인 --&amp;gt;
		
		&amp;lt;!-- 목록 --&amp;gt;
		&amp;lt;table class=&quot;board_table list&quot;&amp;gt;
			&amp;lt;colgroup&amp;gt;
				&amp;lt;col width=&quot;100&quot;&amp;gt; &amp;lt;!-- 번호 --&amp;gt;
				&amp;lt;col width=&quot;100&quot;&amp;gt; &amp;lt;!-- 금액 --&amp;gt;
				&amp;lt;col width=&quot;100&quot;&amp;gt; &amp;lt;!-- 지출/수입 --&amp;gt;
				&amp;lt;col width=&quot;300&quot;&amp;gt; &amp;lt;!-- 내용 --&amp;gt;
				&amp;lt;col width=&quot;100&quot;&amp;gt; &amp;lt;!-- 날짜 --&amp;gt;
				&amp;lt;col width=&quot;100&quot;&amp;gt; &amp;lt;!-- 버튼 --&amp;gt;
			&amp;lt;/colgroup&amp;gt;
			&amp;lt;thead&amp;gt;
						&amp;lt;tr &amp;gt;
							&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot;&amp;gt;
								&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; id=&quot;no&quot;&amp;gt;
							&amp;lt;td colspan=&quot;1&quot;&amp;gt;
								&amp;lt;select name=&quot;accType&quot; id=&quot;accType&quot; value=&quot;0&quot;&amp;gt;
									&amp;lt;option value=&quot;0&quot;&amp;gt;지출&amp;lt;/option&amp;gt;
									&amp;lt;option value=&quot;1&quot;&amp;gt;수입&amp;lt;/option&amp;gt;
								&amp;lt;/select&amp;gt;
							&amp;lt;/td&amp;gt;
							&amp;lt;td colspan=&quot;1&quot;&amp;gt;
								&amp;lt;input  type=&quot;number&quot;  class=&quot;price&quot; name=&quot;price&quot; id=&quot;price&quot; placeholder=&quot;금액&quot; /&amp;gt;
							&amp;lt;/td&amp;gt;
							&amp;lt;td colspan=&quot;2&quot;&amp;gt;
								&amp;lt;input type=&quot;text&quot; class=&quot;info&quot; name=&quot;info&quot; id=&quot;info&quot; placeholder=&quot;내역&quot; /&amp;gt;
							&amp;lt;/td&amp;gt;
							&amp;lt;td colspan=&quot;1&quot;&amp;gt;
								&amp;lt;input type=&quot;date&quot; name=&quot;dt&quot; id=&quot;dt&quot;/&amp;gt;  
							&amp;lt;/td&amp;gt;
							&amp;lt;/form&amp;gt;
							&amp;lt;td&amp;gt;
								&amp;lt;div class=&quot;insert&quot;&amp;gt;
									&amp;lt;div class=&quot;cmn_btn_ml&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&amp;gt;
								&amp;lt;/div&amp;gt; 
								&amp;lt;div class=&quot;update&quot;&amp;gt;
									&amp;lt;div class=&quot;cmn_btn_ml mtb&quot; id=&quot;updateBtn&quot;&amp;gt;수정&amp;lt;/div&amp;gt;&amp;lt;br/&amp;gt;
									&amp;lt;div class=&quot;cmn_btn_ml mtb&quot; id=&quot;cancelBtn&quot;&amp;gt;취소&amp;lt;/div&amp;gt;
								&amp;lt;/div&amp;gt;
							&amp;lt;/td&amp;gt;
						&amp;lt;/tr&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;th&amp;gt;&amp;amp;nbsp;&amp;lt;/th&amp;gt;
				&amp;lt;/tr&amp;gt;
			&amp;lt;/thead&amp;gt;
			&amp;lt;tbody&amp;gt;
				
			&amp;lt;/tbody&amp;gt;
		&amp;lt;/table&amp;gt;
		&amp;lt;!-- 페이징 --&amp;gt;
		&amp;lt;div class=&quot;paging_area&quot;&amp;gt;&amp;lt;/div&amp;gt;
		&amp;lt;form action=&quot;#&quot; id=&quot;searchForm&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; id=&quot;page&quot; value=&quot;1&quot; /&amp;gt;
		
		&amp;lt;/form&amp;gt;
	&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PshAccController.java&lt;/p&gt;
&lt;pre id=&quot;code_1662106632386&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.Controller;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.spring.sample.common.service.IPagingService;
import com.spring.sample.web.testa.dao.IACDao;

@Controller
public class PshAccController {
	@Autowired
	public IACDao dao;

	@Autowired
	public IPagingService ips;

	// DB안 붙으니 예외처리 x
	@RequestMapping(value = &quot;ACC&quot;)
	public ModelAndView ACC(ModelAndView mav) {
		mav.setViewName(&quot;testa/pshAcc/pshacc&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/ACCAction/{gbn}&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String ACCAction(@PathVariable String gbn, @RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		int cnt = 0;

		try {
			switch (gbn) {
			case &quot;insert&quot;:
				System.out.println(params.toString());
				cnt = dao.insert(&quot;acc.insertAcc&quot;, params);
				break;
			case &quot;update&quot;:
				cnt = dao.update(&quot;acc.updateAcc&quot;, params);
				break;
			case &quot;delete&quot;:
				cnt = dao.update(&quot;acc.deleteAcc&quot;, params);
				break;
			}

			if (cnt &amp;gt; 0) {
				model.put(&quot;msg&quot;, &quot;success&quot;);
			} else {
				model.put(&quot;msg&quot;, &quot;fail&quot;);
			}
		} catch (Exception e) {
			e.printStackTrace();
			model.put(&quot;msg&quot;, &quot;error&quot;);
		}

		return mapper.writeValueAsString(model);
	}

	@RequestMapping(value = &quot;/ACCList&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String ACCList(@RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		// 페이지 받아오게 되어있음
		int cnt = dao.getInt(&quot;acc.getAccCnt&quot;, params);

		HashMap&amp;lt;String, Integer&amp;gt; pd = ips.getPagingData(Integer.parseInt(params.get(&quot;page&quot;)), cnt, 10, 5);

		params.put(&quot;start&quot;, Integer.toString(pd.get(&quot;start&quot;)));
		params.put(&quot;end&quot;, Integer.toString(pd.get(&quot;end&quot;)));

		List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; list = dao.getList(&quot;acc.getAccList&quot;, params);
		HashMap&amp;lt;String, String&amp;gt; sumlist = dao.getMap(&quot;acc.getsumList&quot;);

		model.put(&quot;list&quot;, list);
		model.put(&quot;sumlist&quot;, sumlist);
		model.put(&quot;pd&quot;, pd);

		System.out.println(params.toString());

		return mapper.writeValueAsString(model);
	}
}&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;ACC_SQL.xml&lt;/p&gt;
&lt;pre id=&quot;code_1662106676953&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;acc&quot;&amp;gt;
	&amp;lt;insert id=&quot;insertAcc&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		 INSERT INTO ACCBOOK(NO, PRICE, ACC_TYPE, INFO, DT) VALUES (ACCBOOK_SEQ.NEXTVAL, #{price}, #{accType}, #{info}, #{dt})
	&amp;lt;/insert&amp;gt;
	&amp;lt;update id=&quot;updateAcc&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE ACCBOOK SET INFO = #{info},
		PRICE = #{price},
		ACC_TYPE = #{accType},
		DT = #{dt}
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	&amp;lt;update id=&quot;deleteAcc&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE ACCBOOK SET DEL = 0
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	&amp;lt;select id=&quot;getAccCnt&quot; parameterType=&quot;hashmap&quot; resultType=&quot;Integer&quot;&amp;gt;
		SELECT COUNT(*) AS CNT
			FROM ACCBOOK 
		WHERE DEL = 1

	&amp;lt;/select&amp;gt;
	&amp;lt;select id=&quot;getAccList&quot; parameterType=&quot;hashmap&quot; resultType=&quot;hashmap&quot;&amp;gt;
		 SELECT A.NO, A.PRICE, A.ACC_TYPE, A.INFO, A.DT
        FROM (SELECT NO, PRICE, CASE WHEN ACC_TYPE  = '0' THEN '지출'
            ELSE '수입' END AS ACC_TYPE, INFO,
              TO_CHAR(DT,'YYYY-MM-DD') AS DT, 
               ROW_NUMBER() OVER(ORDER BY NO DESC) AS RNUM
	      FROM ACCBOOK  
	      WHERE DEL = 1) A
          	WHERE A.RNUM BETWEEN #{start} AND #{end}
  
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;getsumList&quot; parameterType=&quot;hashmap&quot; resultType=&quot;hashmap&quot;&amp;gt;

    SELECT MAX(DECODE(ACC_TYPE, 0, SUM, NULL)) AS &quot;지출&quot;, MIN(DECODE(ACC_TYPE, 1, SUM, NULL)) AS &quot;수입&quot;, MIN(DECODE(ACC_TYPE, 1, SUM, NULL))
       - (MAX(DECODE(ACC_TYPE, 0, SUM, NULL))) AS &quot;총액&quot;
  	FROM (SELECT SUM(PRICE) AS SUM ,ACC_TYPE FROM ACCBOOK WHERE DEL = 1 GROUP BY ACC_TYPE)
  
	&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;IACDao.java&lt;/p&gt;
&lt;pre id=&quot;code_1662106875834&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.dao;

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

public interface IACDao {
	// 숫자 취득
	public int getInt(String sql) throws Throwable; // 값 안 주고, 쿼리만 부를때

	public int getInt(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable; // 값까지 줄때

	// 문자열 취득
	public String getString(String sql) throws Throwable;

	public String getString(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	// HashMap 취득
	public HashMap&amp;lt;String, String&amp;gt; getMap(String sql) throws Throwable;

	public HashMap&amp;lt;String, String&amp;gt; getMap(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	// List 취득
	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getList(String sql) throws Throwable;

	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getList(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	// 등록
	public int insert(String sql) throws Throwable;

	public int insert(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	// 수정
	public int update(String sql) throws Throwable;

	public int update(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	// 삭제
	public int delete(String sql) throws Throwable;

	public int delete(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ACDao.java&lt;/p&gt;
&lt;pre id=&quot;code_1662106893473&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.dao;

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

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class ACDao implements IACDao {
	@Autowired
	public SqlSession sqlSession;

	@Override
	public int getInt(String sql) throws Throwable {
		return sqlSession.selectOne(sql);
	}

	@Override
	public int getInt(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectOne(sql, params);
	}

	@Override
	public String getString(String sql) throws Throwable {
		return sqlSession.selectOne(sql);
	}

	@Override
	public String getString(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectOne(sql, params);
	}

	@Override
	public HashMap&amp;lt;String, String&amp;gt; getMap(String sql) throws Throwable {
		return sqlSession.selectOne(sql);
	}

	@Override
	public HashMap&amp;lt;String, String&amp;gt; getMap(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectOne(sql, params);
	}

	@Override
	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getList(String sql) throws Throwable {
		return sqlSession.selectList(sql);
	}

	@Override
	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getList(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectList(sql, params);
	}

	@Override
	public int insert(String sql) throws Throwable {
		return sqlSession.insert(sql);
	}

	@Override
	public int insert(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.insert(sql, params);
	}

	@Override
	public int update(String sql) throws Throwable {
		return sqlSession.update(sql);
	}

	@Override
	public int update(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.update(sql, params);
	}

	@Override
	public int delete(String sql) throws Throwable {
		return sqlSession.delete(sql);
	}

	@Override
	public int delete(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.delete(sql, 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;&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6GFnm/btrLc7A1spK/SVPWA5o2zcnMkHQKmdHLaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6GFnm/btrLc7A1spK/SVPWA5o2zcnMkHQKmdHLaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6GFnm/btrLc7A1spK/SVPWA5o2zcnMkHQKmdHLaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6GFnm%2FbtrLc7A1spK%2FSVPWA5o2zcnMkHQKmdHLaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;848&quot; height=&quot;752&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;752&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDaLHR/btrLgY3yD3F/qt1MrKM9Iv7rWfRdHnCiek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDaLHR/btrLgY3yD3F/qt1MrKM9Iv7rWfRdHnCiek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDaLHR/btrLgY3yD3F/qt1MrKM9Iv7rWfRdHnCiek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDaLHR%2FbtrLgY3yD3F%2Fqt1MrKM9Iv7rWfRdHnCiek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1040&quot; height=&quot;243&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B0gFm/btrLgZnTiz4/XCrJAcSPwNLRzxCDo0zGMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B0gFm/btrLgZnTiz4/XCrJAcSPwNLRzxCDo0zGMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B0gFm/btrLgZnTiz4/XCrJAcSPwNLRzxCDo0zGMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB0gFm%2FbtrLgZnTiz4%2FXCrJAcSPwNLRzxCDo0zGMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;147&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;147&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;controller에서 이렇게 받음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/53zKw/btrLhPSuHtk/9qKFFMd7LW6NR8xWRzetxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/53zKw/btrLhPSuHtk/9qKFFMd7LW6NR8xWRzetxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/53zKw/btrLhPSuHtk/9qKFFMd7LW6NR8xWRzetxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F53zKw%2FbtrLhPSuHtk%2F9qKFFMd7LW6NR8xWRzetxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;499&quot; data-origin-width=&quot;1006&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;처음에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 getAccList받은것처럼 list형식으로 했다가 map으로 변경했는데, 안되서 왜 안되지 했는데..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HashMap&amp;lt;String, String&amp;gt; sumlist = dao.getMap(&quot;acc.getsumList&quot;, &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;params&lt;/span&gt;)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;u&gt;&lt;i&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;params를 빼야하는데 안 뻈던거&lt;/span&gt;&lt;/i&gt;&lt;/u&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&gt;HashMap&amp;lt;String, String&amp;gt; sumlist = dao.getMap(&quot;acc.getsumList&quot;&lt;/span&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jsp에서는 테이블 2개를 각각 하나씩 그려주고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwxZOy/btrLfNWxuBr/dNkUU7t2wGIvJvhFGkSCRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwxZOy/btrLfNWxuBr/dNkUU7t2wGIvJvhFGkSCRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwxZOy/btrLfNWxuBr/dNkUU7t2wGIvJvhFGkSCRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwxZOy%2FbtrLfNWxuBr%2FdNkUU7t2wGIvJvhFGkSCRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;718&quot; height=&quot;743&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;743&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w9edQ/btrLgOmI8uM/vJ8eMSBJoKocUfZbGnXQDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w9edQ/btrLgOmI8uM/vJ8eMSBJoKocUfZbGnXQDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w9edQ/btrLgOmI8uM/vJ8eMSBJoKocUfZbGnXQDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw9edQ%2FbtrLgOmI8uM%2FvJ8eMSBJoKocUfZbGnXQDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;527&quot; height=&quot;368&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;368&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;reload될때 그려줌&lt;/p&gt;</description>
      <category>TIL/academy</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/138</guid>
      <comments>https://makeaplayground.tistory.com/138#entry138comment</comments>
      <pubDate>Fri, 2 Sep 2022 17:51:42 +0900</pubDate>
    </item>
    <item>
      <title>맥mac 이클립스 스프링 개발 이미지 업로드 파일 경로(윈도우에서 옮겨오면서 생긴 일), 해결중...</title>
      <link>https://makeaplayground.tistory.com/137</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://makeaplayground.tistory.com/136&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://makeaplayground.tistory.com/136&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1662042079217&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;국비 TIL(Today I Learned) 20220901 갤러리 실습&quot; data-og-description=&quot;어제꺼 복습 EXCEPTION_INFO.jsp 예외발생했을때 exceptionResolver가 esception 객체를 돌려줌 첨부파일 할때 name이 있어야 작동함!! 아래 코드는 기존 T/update.jsp임 FileController.java에서 getFileMap()..&quot; data-og-host=&quot;makeaplayground.tistory.com&quot; data-og-source-url=&quot;https://makeaplayground.tistory.com/136&quot; data-og-url=&quot;https://makeaplayground.tistory.com/136&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DO4lL/hyPEP8z5eH/zexsud8HKoxz152EAtmXA0/img.png?width=605&amp;amp;height=402&amp;amp;face=0_0_605_402,https://scrap.kakaocdn.net/dn/twnU5/hyPEOBPcPN/MCXto5I6v0JghrxOgUitk0/img.png?width=605&amp;amp;height=402&amp;amp;face=0_0_605_402,https://scrap.kakaocdn.net/dn/bOUvhc/hyPEA4KKLo/37UwyeZvk3bkHFv9NX3jqk/img.png?width=1085&amp;amp;height=651&amp;amp;face=0_0_1085_651&quot;&gt;&lt;a href=&quot;https://makeaplayground.tistory.com/136&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://makeaplayground.tistory.com/136&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DO4lL/hyPEP8z5eH/zexsud8HKoxz152EAtmXA0/img.png?width=605&amp;amp;height=402&amp;amp;face=0_0_605_402,https://scrap.kakaocdn.net/dn/twnU5/hyPEOBPcPN/MCXto5I6v0JghrxOgUitk0/img.png?width=605&amp;amp;height=402&amp;amp;face=0_0_605_402,https://scrap.kakaocdn.net/dn/bOUvhc/hyPEA4KKLo/37UwyeZvk3bkHFv9NX3jqk/img.png?width=1085&amp;amp;height=651&amp;amp;face=0_0_1085_651');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;국비 TIL(Today I Learned) 20220901 갤러리 실습&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;어제꺼 복습 EXCEPTION_INFO.jsp 예외발생했을때 exceptionResolver가 esception 객체를 돌려줌 첨부파일 할때 name이 있어야 작동함!! 아래 코드는 기존 T/update.jsp임 FileController.java에서 getFileMap()..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;makeaplayground.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘(2022.09.01) 학원에서 실습한 갤러리 게시판이 맥으로 옮겨오니,&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-filename=&quot;스크린샷 2022-09-01 오후 11.19.58.png&quot; data-origin-width=&quot;2440&quot; data-origin-height=&quot;1320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNdLrs/btrK6Qzs8WO/luL724sjBaExwpkuaSCA3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNdLrs/btrK6Qzs8WO/luL724sjBaExwpkuaSCA3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNdLrs/btrK6Qzs8WO/luL724sjBaExwpkuaSCA3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNdLrs%2FbtrK6Qzs8WO%2FluL724sjBaExwpkuaSCA3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2440&quot; height=&quot;1320&quot; data-filename=&quot;스크린샷 2022-09-01 오후 11.19.58.png&quot; data-origin-width=&quot;2440&quot; data-origin-height=&quot;1320&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;C:\\MyWork\\workspace\\.metadata\\.plugins\\org.eclipse.wst.server.&lt;span style=&quot;color: #555555;&quot;&gt;core&quot;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #555555;&quot;&gt;+ &quot;\\tmp0\\wtpwebapps\\SampleSpring\\resources\\upload&quot;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1085&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFkK5N/btrLaj1JsWT/0I5LYOka9ehmQO04XhGBLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFkK5N/btrLaj1JsWT/0I5LYOka9ehmQO04XhGBLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFkK5N/btrLaj1JsWT/0I5LYOka9ehmQO04XhGBLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFkK5N%2FbtrLaj1JsWT%2F0I5LYOka9ehmQO04XhGBLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1085&quot; height=&quot;179&quot; data-origin-width=&quot;1085&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;이 경로였는데,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://makeaplayground.tistory.com/128&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://makeaplayground.tistory.com/128&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1662042415012&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;국비 TIL(Today I Learned) 20220822 ajaxForm으로 파일 첨부, 다운받기&quot; data-og-description=&quot;&amp;nbsp;Fileupload : 사용자 컴퓨터의 파일을 서버에 올림 샘플 스프링에 예시가 있음!~ input type=&amp;quot;file&amp;quot;로 할려고 하면, enctype이 필요 기존 serialize()는 파일이 안 넘어가서 추가 기능 필요 form의 객체..&quot; data-og-host=&quot;makeaplayground.tistory.com&quot; data-og-source-url=&quot;https://makeaplayground.tistory.com/128&quot; data-og-url=&quot;https://makeaplayground.tistory.com/128&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dod9Jt/hyPEGX2mw7/MUwKoiG4UW5sjovwwXAdF1/img.png?width=498&amp;amp;height=748&amp;amp;face=0_0_498_748,https://scrap.kakaocdn.net/dn/ckRHm2/hyPECH9xMn/58kuccq6KDYsWKfILRHD6K/img.png?width=498&amp;amp;height=748&amp;amp;face=0_0_498_748,https://scrap.kakaocdn.net/dn/3Tip6/hyPEBigffM/wwZwVQWvQZY3NkTLjp48NK/img.png?width=1159&amp;amp;height=704&amp;amp;face=0_0_1159_704&quot;&gt;&lt;a href=&quot;https://makeaplayground.tistory.com/128&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://makeaplayground.tistory.com/128&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dod9Jt/hyPEGX2mw7/MUwKoiG4UW5sjovwwXAdF1/img.png?width=498&amp;amp;height=748&amp;amp;face=0_0_498_748,https://scrap.kakaocdn.net/dn/ckRHm2/hyPECH9xMn/58kuccq6KDYsWKfILRHD6K/img.png?width=498&amp;amp;height=748&amp;amp;face=0_0_498_748,https://scrap.kakaocdn.net/dn/3Tip6/hyPEBigffM/wwZwVQWvQZY3NkTLjp48NK/img.png?width=1159&amp;amp;height=704&amp;amp;face=0_0_1159_704');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;국비 TIL(Today I Learned) 20220822 ajaxForm으로 파일 첨부, 다운받기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Fileupload : 사용자 컴퓨터의 파일을 서버에 올림 샘플 스프링에 예시가 있음!~ input type=&quot;file&quot;로 할려고 하면, enctype이 필요 기존 serialize()는 파일이 안 넘어가서 추가 기능 필요 form의 객체..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;makeaplayground.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;.metadata&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;폴더가 없다!!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-09-01 오후 11.27.32.png&quot; data-origin-width=&quot;1582&quot; data-origin-height=&quot;928&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dv9LzG/btrLbwTDjUc/ynrtdizuAn6VED6HIfwjG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dv9LzG/btrLbwTDjUc/ynrtdizuAn6VED6HIfwjG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dv9LzG/btrLbwTDjUc/ynrtdizuAn6VED6HIfwjG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdv9LzG%2FbtrLbwTDjUc%2FynrtdizuAn6VED6HIfwjG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;556&quot; height=&quot;928&quot; data-filename=&quot;스크린샷 2022-09-01 오후 11.27.32.png&quot; data-origin-width=&quot;1582&quot; data-origin-height=&quot;928&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;u&gt;&lt;i&gt;&lt;b&gt;shift + command + . 을 누르면 숨긴 폴더를 볼 수 있다&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/u&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-filename=&quot;스크린샷 2022-09-01 오후 11.30.14.png&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;918&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZYwfX/btrLaV0pIDn/mX12g8kuMyXZTj2LQ3kUbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZYwfX/btrLaV0pIDn/mX12g8kuMyXZTj2LQ3kUbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZYwfX/btrLaV0pIDn/mX12g8kuMyXZTj2LQ3kUbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZYwfX%2FbtrLaV0pIDn%2FmX12g8kuMyXZTj2LQ3kUbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1830&quot; height=&quot;918&quot; data-filename=&quot;스크린샷 2022-09-01 오후 11.30.14.png&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;918&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.metadata가 뜬다!&lt;/p&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;그럼 다음 학원에서 했던 경로로 upload 폴더까지 가서&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-filename=&quot;스크린샷 2022-09-01 오후 11.32.27.png&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCmf2W/btrK90VJKIe/Sj9lv7NVKsP5dzrtwYsnB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCmf2W/btrK90VJKIe/Sj9lv7NVKsP5dzrtwYsnB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCmf2W/btrK90VJKIe/Sj9lv7NVKsP5dzrtwYsnB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCmf2W%2FbtrK90VJKIe%2FSj9lv7NVKsP5dzrtwYsnB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1198&quot; height=&quot;984&quot; data-filename=&quot;스크린샷 2022-09-01 오후 11.32.27.png&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-09-01 오후 11.37.07.png&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;872&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKeDQE/btrLawGAvuo/534aKfHbHuxu5bU9vrRT0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKeDQE/btrLawGAvuo/534aKfHbHuxu5bU9vrRT0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKeDQE/btrLawGAvuo/534aKfHbHuxu5bU9vrRT0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKeDQE%2FbtrLawGAvuo%2F534aKfHbHuxu5bU9vrRT0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2268&quot; height=&quot;872&quot; data-filename=&quot;스크린샷 2022-09-01 오후 11.37.07.png&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;872&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-filename=&quot;스크린샷 2022-09-01 오후 11.50.14.png&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Scfon/btrK8fMy1MX/OPpX0fKdKigYOCORRQKyOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Scfon/btrK8fMy1MX/OPpX0fKdKigYOCORRQKyOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Scfon/btrK8fMy1MX/OPpX0fKdKigYOCORRQKyOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FScfon%2FbtrK8fMy1MX%2FOPpX0fKdKigYOCORRQKyOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1452&quot; height=&quot;210&quot; data-filename=&quot;스크린샷 2022-09-01 오후 11.50.14.png&quot; data-origin-width=&quot;1452&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;&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;이러면... insert는 하면 등록은 되는데!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;19번이 새로 등록한거, 근데 아직도 이미지가 안뜸&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-09-02 오전 12.11.50.png&quot; data-origin-width=&quot;2620&quot; data-origin-height=&quot;1460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDOBmB/btrK94w170n/eYiUL6B3WsPX3O6zrZvSak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDOBmB/btrK94w170n/eYiUL6B3WsPX3O6zrZvSak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDOBmB/btrK94w170n/eYiUL6B3WsPX3O6zrZvSak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDOBmB%2FbtrK94w170n%2FeYiUL6B3WsPX3O6zrZvSak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2620&quot; height=&quot;1460&quot; data-filename=&quot;스크린샷 2022-09-02 오전 12.11.50.png&quot; data-origin-width=&quot;2620&quot; data-origin-height=&quot;1460&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-filename=&quot;스크린샷 2022-09-02 오전 12.12.32.png&quot; data-origin-width=&quot;1656&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JpSvH/btrK9a5qoeG/kTCWHrKVjwSaxkNZjwKz8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JpSvH/btrK9a5qoeG/kTCWHrKVjwSaxkNZjwKz8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JpSvH/btrK9a5qoeG/kTCWHrKVjwSaxkNZjwKz8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJpSvH%2FbtrK9a5qoeG%2FkTCWHrKVjwSaxkNZjwKz8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1656&quot; height=&quot;474&quot; data-filename=&quot;스크린샷 2022-09-02 오전 12.12.32.png&quot; data-origin-width=&quot;1656&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;한글이 문제 였음&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-filename=&quot;2.png&quot; data-origin-width=&quot;2786&quot; data-origin-height=&quot;1426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXmflR/btrLcgdwxvr/oB3H3giMyyE6svGtDEIqRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXmflR/btrLcgdwxvr/oB3H3giMyyE6svGtDEIqRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXmflR/btrLcgdwxvr/oB3H3giMyyE6svGtDEIqRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXmflR%2FbtrLcgdwxvr%2FoB3H3giMyyE6svGtDEIqRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2786&quot; height=&quot;1426&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;2786&quot; data-origin-height=&quot;1426&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;강사님이 이부분을 고쳐주셨으나(URIEncoding-&quot;UTF-8&quot;이 추가됨).. 안된다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;1938&quot; data-origin-height=&quot;698&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rBhem/btrLb5iRvnE/UIn9keKRAhj7s6nnrz0zrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rBhem/btrLb5iRvnE/UIn9keKRAhj7s6nnrz0zrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rBhem/btrLb5iRvnE/UIn9keKRAhj7s6nnrz0zrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrBhem%2FbtrLb5iRvnE%2FUIn9keKRAhj7s6nnrz0zrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1938&quot; height=&quot;698&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;1938&quot; data-origin-height=&quot;698&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>IT/java</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/137</guid>
      <comments>https://makeaplayground.tistory.com/137#entry137comment</comments>
      <pubDate>Fri, 2 Sep 2022 16:03:32 +0900</pubDate>
    </item>
    <item>
      <title>국비 TIL(Today I Learned) 20220901 갤러리 실습</title>
      <link>https://makeaplayground.tistory.com/136</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;어제꺼 복습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EXCEPTION_INFO.jsp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3qO7e/btrK7CeRjXA/YfECBP6khHZTPUUqQxT9MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3qO7e/btrK7CeRjXA/YfECBP6khHZTPUUqQxT9MK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3qO7e/btrK7CeRjXA/YfECBP6khHZTPUUqQxT9MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3qO7e%2FbtrK7CeRjXA%2FYfECBP6khHZTPUUqQxT9MK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;605&quot; height=&quot;402&quot; data-origin-width=&quot;605&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;예외발생했을때 exceptionResolver가 esception 객체를 돌려줌&lt;/p&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;첨부파일 할때 name이 있어야 작동함!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드는 기존 T/update.jsp임&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKivPA/btrK91052Y6/c8OhBPhDzXMF22Kq0s1jB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKivPA/btrK91052Y6/c8OhBPhDzXMF22Kq0s1jB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKivPA/btrK91052Y6/c8OhBPhDzXMF22Kq0s1jB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKivPA%2FbtrK91052Y6%2Fc8OhBPhDzXMF22Kq0s1jB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;518&quot; height=&quot;207&quot; data-origin-width=&quot;518&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tji8Y/btrK6d9eBLA/iSM1jKXjIdAQjMRzJ31a30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tji8Y/btrK6d9eBLA/iSM1jKXjIdAQjMRzJ31a30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tji8Y/btrK6d9eBLA/iSM1jKXjIdAQjMRzJ31a30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftji8Y%2FbtrK6d9eBLA%2FiSM1jKXjIdAQjMRzJ31a30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;272&quot; data-origin-width=&quot;369&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;1131&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC12bM/btrLaWEMDu8/wnsiAyhXYKnY36o64Perk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC12bM/btrLaWEMDu8/wnsiAyhXYKnY36o64Perk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC12bM/btrLaWEMDu8/wnsiAyhXYKnY36o64Perk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC12bM%2FbtrLaWEMDu8%2FwnsiAyhXYKnY36o64Perk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1003&quot; height=&quot;584&quot; data-origin-width=&quot;1131&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FileController.java에서 getFileMap()에서 name을 받아옴!!!&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1812&quot; data-origin-height=&quot;829&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l0RG0/btrK9xTp0sI/cuKlaU7MWFKfGwC5rK28y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l0RG0/btrK9xTp0sI/cuKlaU7MWFKfGwC5rK28y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l0RG0/btrK9xTp0sI/cuKlaU7MWFKfGwC5rK28y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl0RG0%2FbtrK9xTp0sI%2FcuKlaU7MWFKfGwC5rK28y0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1812&quot; height=&quot;829&quot; data-origin-width=&quot;1812&quot; data-origin-height=&quot;829&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 list랑 detail의 jsp가 분리되어있었다면, 이번에 만들때는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list가 오른쪽, detail이 왼쪽으로 가게끔 함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1812&quot; data-origin-height=&quot;829&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVvPf0/btrLbwZ6hmR/Y8m9iCNHKJCkUpJkIplahk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVvPf0/btrLbwZ6hmR/Y8m9iCNHKJCkUpJkIplahk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVvPf0/btrLbwZ6hmR/Y8m9iCNHKJCkUpJkIplahk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVvPf0%2FbtrLbwZ6hmR%2FY8m9iCNHKJCkUpJkIplahk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1812&quot; height=&quot;829&quot; data-origin-width=&quot;1812&quot; data-origin-height=&quot;829&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;그래서 detail.jsp는 없고, ajax 처리함&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1805&quot; data-origin-height=&quot;871&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4cTBL/btrLaWdFayo/W45nFHVn81AqtYMmcApGa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4cTBL/btrLaWdFayo/W45nFHVn81AqtYMmcApGa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4cTBL/btrLaWdFayo/W45nFHVn81AqtYMmcApGa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4cTBL%2FbtrLaWdFayo%2FW45nFHVn81AqtYMmcApGa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1805&quot; height=&quot;871&quot; data-origin-width=&quot;1805&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;로그인 한 사람이 글 작성한 사람이면 수정, 삭제 버튼이 활성화된다&lt;/p&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1911&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpdcfD/btrK89E4yh5/UDsAclxB5lJXvsfholZ93k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpdcfD/btrK89E4yh5/UDsAclxB5lJXvsfholZ93k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpdcfD/btrK89E4yh5/UDsAclxB5lJXvsfholZ93k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpdcfD%2FbtrK89E4yh5%2FUDsAclxB5lJXvsfholZ93k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;900&quot; data-origin-width=&quot;1911&quot; data-origin-height=&quot;900&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;update(수정)은 페이지가 이동하게끔 함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;915&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSNcAl/btrK7C8Eg3b/TYJzgtQ7za8FOuNxE5SYO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSNcAl/btrK7C8Eg3b/TYJzgtQ7za8FOuNxE5SYO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSNcAl/btrK7C8Eg3b/TYJzgtQ7za8FOuNxE5SYO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSNcAl%2FbtrK7C8Eg3b%2FTYJzgtQ7za8FOuNxE5SYO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;915&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;915&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 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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AGController.java&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662026676763&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.Controller;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.spring.sample.common.service.IPagingService;
import com.spring.sample.web.testa.dao.IACDao;

@Controller
public class AGController {
	@Autowired
	public IACDao iACDao;

	@Autowired
	public IPagingService ips;

	@RequestMapping(value = &quot;/AGList&quot;)
	public ModelAndView AGList(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {

		int page = 1;

		if (params.get(&quot;page&quot;) != null &amp;amp;&amp;amp; params.get(&quot;page&quot;) != &quot;&quot;) {
			page = Integer.parseInt(params.get(&quot;page&quot;));
		}

		mav.addObject(&quot;page&quot;, page);
		mav.setViewName(&quot;testa/G/list&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/AGListAjax&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String AGListAjax(@RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		// 페이지 받아오게 되어있음
		int cnt = iACDao.getInt(&quot;G.getGCnt&quot;, params);

		HashMap&amp;lt;String, Integer&amp;gt; pd = ips.getPagingData(Integer.parseInt(params.get(&quot;page&quot;)), cnt, 9, 5);

		params.put(&quot;start&quot;, Integer.toString(pd.get(&quot;start&quot;)));
		params.put(&quot;end&quot;, Integer.toString(pd.get(&quot;end&quot;)));

		List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; list = iACDao.getList(&quot;G.getGList&quot;, params);

		model.put(&quot;list&quot;, list);
		model.put(&quot;pd&quot;, pd);

		System.out.println(params.toString());

		return mapper.writeValueAsString(model);
	}

	@RequestMapping(value = &quot;/AGInsert&quot;)
	public ModelAndView aGInsert(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {

		System.out.println(params.toString());

		mav.setViewName(&quot;testa/G/insert&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/AGAction/{gbn}&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String AGAction(@PathVariable String gbn, @RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		int cnt = 0;

		try {
			switch (gbn) {
			case &quot;insert&quot;:
				cnt = iACDao.insert(&quot;G.insertG&quot;, params);
				break;
			case &quot;update&quot;:
				cnt = iACDao.update(&quot;G.updateG&quot;, params);
				break;
			case &quot;delete&quot;:
				cnt = iACDao.update(&quot;G.deleteG&quot;, params);
				break;
			}

			if (cnt &amp;gt; 0) {
				model.put(&quot;msg&quot;, &quot;success&quot;);
			} else {
				model.put(&quot;msg&quot;, &quot;fail&quot;);
			}
		} catch (Exception e) {
			e.printStackTrace();
			model.put(&quot;msg&quot;, &quot;error&quot;);
		}

		return mapper.writeValueAsString(model);
	}

	// 가져오고 변경되는게 없기 때문에 비동기 처리로 안되도 됨
//	@RequestMapping(value = &quot;/AGDetail&quot;)
//	public ModelAndView aGDetail(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {
//		// 글번호 안 넘어왔을때 처리
//		if (params.get(&quot;no&quot;) != null &amp;amp;&amp;amp; params.get(&quot;no&quot;) != &quot;&quot;) {
//			// 조회수
//			iACDao.update(&quot;G.updateGHit&quot;, params);
//			HashMap&amp;lt;String, String&amp;gt; data = iACDao.getMap(&quot;G.getG&quot;, params);
//
//			mav.addObject(&quot;data&quot;, data);
//
//			mav.setViewName(&quot;testa/G/list&quot;);
//		}
//		/*
//		 * else { mav.setViewName(&quot;redirect:AGList&quot;); }
//		 */
//		return mav;
//	}

	@RequestMapping(value = &quot;/AGDetailAjax&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String AGDetailAjax(@RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		HashMap&amp;lt;String, String&amp;gt; data = iACDao.getMap(&quot;G.getG&quot;, params);

		model.put(&quot;data&quot;, data);

		System.out.println(params.toString());

		return mapper.writeValueAsString(model);
	}

	@RequestMapping(value = &quot;/AGUpdate&quot;)
	public ModelAndView aGUpdate(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {

		System.out.println(params.toString());

		// 글번호 안 넘어왔을때 처리
		if (params.get(&quot;no&quot;) != null &amp;amp;&amp;amp; params.get(&quot;no&quot;) != &quot;&quot;) {
			HashMap&amp;lt;String, String&amp;gt; data = iACDao.getMap(&quot;G.getG&quot;, params);

			mav.addObject(&quot;data&quot;, data);

			mav.setViewName(&quot;testa/G/update&quot;);
		} else {
			mav.setViewName(&quot;redirect:AGList&quot;);
		}

		return mav;
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1085&quot; data-origin-height=&quot;651&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LKzgA/btrK91GNMsm/YD5qKK64q9K6PvhVoJfnHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LKzgA/btrK91GNMsm/YD5qKK64q9K6PvhVoJfnHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LKzgA/btrK91GNMsm/YD5qKK64q9K6PvhVoJfnHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLKzgA%2FbtrK91GNMsm%2FYD5qKK64q9K6PvhVoJfnHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1085&quot; height=&quot;651&quot; data-origin-width=&quot;1085&quot; data-origin-height=&quot;651&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;밑에 AGDetailAjax가 이번에 만든부분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주석 처리된곳이 기존에 detail&lt;/p&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;G_SQL.xml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662026822899&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;G&quot;&amp;gt;
	&amp;lt;select id=&quot;getGCnt&quot; resultType=&quot;Integer&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT COUNT(*) AS CNT
		FROM GALLERY G INNER JOIN MEM M ON G.MEM_NO = M.MEM_NO
		AND M.DEL = 1
		WHERE G.DEL_DT IS NULL
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;getGList&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT G.NO, G.PIC, G.TITLE, G.DISCRIPT, G.HIT, G.DT
		FROM (
		SELECT G.NO, G.PIC, G.TITLE, G.DISCRIPT, G.HIT, 
		CASE WHEN TO_CHAR(G.REG_DT,'YY.MM.DD') = TO_CHAR(SYSDATE, 'YY.MM.DD')
		        THEN TO_CHAR(G.REG_DT, 'HH24:MI')
		        ELSE TO_CHAR(G.REG_DT, 'YY.MM.DD')
		        END AS DT, 
                 ROW_NUMBER() OVER(ORDER BY G.NO DESC) AS RNUM
				FROM GALLERY G INNER JOIN MEM M ON G.MEM_NO = M.MEM_NO
                AND M.DEL = 1
				WHERE G.DEL_DT IS NULL ) G
                WHERE G.RNUM BETWEEN #{start} AND #{end}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;insertG&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO GALLERY(NO, TITLE, MEM_NO, PIC, DISCRIPT)
		VALUES (GALLERY_SEQ.NEXTVAL, #{title} , #{memNo}, #{pic}, #{discript})
	&amp;lt;/insert&amp;gt;
	 
	&amp;lt;select id=&quot;getG&quot; parameterType=&quot;hashmap&quot;  resultType=&quot;hashmap&quot;&amp;gt;
		SELECT G.NO, G.TITLE, G.MEM_NO, G.PIC, G.HIT, G.DISCRIPT,
	    TO_CHAR(G.REG_DT, 'YYYY-MM-DD') AS DT
		FROM GALLERY G INNER JOIN MEM M ON G.MEM_NO = M.MEM_NO
		AND M.DEL = 1
		WHERE G.DEL_DT IS NULL
		AND G.NO = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;update id=&quot;updateGHit&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE GALLERY SET HIT = HIT + 1
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;update id=&quot;deleteG&quot;  parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE GALLERY SET DEL_DT = TO_CHAR(SYSDATE, 'YY.MM.DD')
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;update id=&quot;updateG&quot;  parameterType=&quot;hashmap&quot;&amp;gt;		
		UPDATE GALLERY SET TITLE = #{title},
		PIC = #{pic},
		DISCRIPT = #{discript}
		WHERE NO = #{no}
	&amp;lt;/update&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;b&gt;IACDao.java&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662026965554&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.dao;

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

public interface IACDao {
	// 숫자 취득
	public int getInt(String sql) throws Throwable; // 값 안 주고, 쿼리만 부를때

	public int getInt(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable; // 값까지 줄때

	// 문자열 취득
	public String getString(String sql) throws Throwable;

	public String getString(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	// HashMap 취득
	public HashMap&amp;lt;String, String&amp;gt; getMap(String sql) throws Throwable;

	public HashMap&amp;lt;String, String&amp;gt; getMap(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	// List 취득
	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getList(String sql) throws Throwable;

	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getList(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	// 등록
	public int insert(String sql) throws Throwable;

	public int insert(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	// 수정
	public int update(String sql) throws Throwable;

	public int update(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	// 삭제
	public int delete(String sql) throws Throwable;

	public int delete(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ACDao.java&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662026982826&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.dao;

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

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class ACDao implements IACDao {
	@Autowired
	public SqlSession sqlSession;

	@Override
	public int getInt(String sql) throws Throwable {
		return sqlSession.selectOne(sql);
	}

	@Override
	public int getInt(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectOne(sql, params);
	}

	@Override
	public String getString(String sql) throws Throwable {
		return sqlSession.selectOne(sql);
	}

	@Override
	public String getString(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectOne(sql, params);
	}

	@Override
	public HashMap&amp;lt;String, String&amp;gt; getMap(String sql) throws Throwable {
		return sqlSession.selectOne(sql);
	}

	@Override
	public HashMap&amp;lt;String, String&amp;gt; getMap(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectOne(sql, params);
	}

	@Override
	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getList(String sql) throws Throwable {
		return sqlSession.selectList(sql);
	}

	@Override
	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getList(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectList(sql, params);
	}

	@Override
	public int insert(String sql) throws Throwable {
		return sqlSession.insert(sql);
	}

	@Override
	public int insert(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.insert(sql, params);
	}

	@Override
	public int update(String sql) throws Throwable {
		return sqlSession.update(sql);
	}

	@Override
	public int update(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.update(sql, params);
	}

	@Override
	public int delete(String sql) throws Throwable {
		return sqlSession.delete(sql);
	}

	@Override
	public int delete(String sql, HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.delete(sql, params);
	}
}&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;151&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zMNj3/btrLaVMExjg/b91LBPOyGkIahp5CG64dZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zMNj3/btrLaVMExjg/b91LBPOyGkIahp5CG64dZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zMNj3/btrLaVMExjg/b91LBPOyGkIahp5CG64dZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzMNj3%2FbtrLaVMExjg%2Fb91LBPOyGkIahp5CG64dZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;151&quot; height=&quot;164&quot; data-origin-width=&quot;151&quot; data-origin-height=&quot;164&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;list.jsp (밑에 재수정한 코드 있음, 밑에 걸로 참고!!!)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662027018964&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.paging_area{
	display: block; 
	position: relative; 
	left: 0;
	margin-bottom: 10px;
	font-size: 14px;
}

.main{
	display: flex;
	padding: 100px 200px;
	justify-content: space-between;
}
.main &amp;gt; div {
	width: 700px;	
}

.left_area img {
	width: 680px;
	height: 400px;
	border-radius: 15px;
	
}



.table {
	border-collapse: collapse;
	width: 100%;
	margin: 15px 0px;
}

.right_area img{ 
	width: 200px;
	height: 180px;
	/* object-fit: cover; */
}

.table tbody tr {
	height: 40px;
	text-align: center;
	color: #7b7b7b;
	font-size: 10.5pt;
}

.table tbody tr {
	
}

.tbody img{
	cursor: pointer;
}

&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
var flag = true;
$(document).ready(function () {

	//목록 조회
	reloadList();
	
	
	//페이징 버튼
	$(&quot;.paging_area&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));
		
		reloadList();
	})
	
	// 등록버튼
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		console.log(&quot;1&quot;);
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;, &quot;AGInsert&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	

	$(&quot;.tbody&quot;).on(&quot;click&quot;, &quot;td&quot;, function () {
		$(&quot;#no&quot;).val($(this).attr(&quot;no&quot;));
		
	 	/* $(&quot;#actionForm&quot;).attr(&quot;action&quot;, &quot;AGDetail&quot;);
		$(&quot;#actionForm&quot;).submit();  */
		
		// 단건을 ajax로 보내서 왼쪽 화면에 그려
		var params = $(&quot;#actionForm&quot;).serialize();
		
		
		$.ajax({
			url : &quot;AGDetailAjax&quot;, //경로
			type : &quot;POST&quot;, // 전송방식(GET: 주소형태, POST : 주소 헤더 형태)
			dataType: &quot;json&quot;, // 데이터 형태
			data: params, // 보낼데이터
			success : function(res) { //성공했을 때 결과를 res에 받고 함수 실행
				//console.log(res); // 콘솔에  pd랑 list 값이 보임
				
				var html = &quot;&quot;;
				
				html += &quot;&amp;lt;tr&amp;gt;&quot;;
				html += &quot;&amp;lt;td colspan=\&quot;2\&quot;&amp;gt;&quot;;
				html += &quot;&amp;lt;img alt=\&quot;\&quot; src=\&quot;resources/upload/&quot;+ res.data.PIC +&quot;\&quot;&amp;gt;&quot;;
				html += &quot;&amp;lt;/td&amp;gt;&quot;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
				html += &quot;&amp;lt;tr&amp;gt;&quot;;
				html += &quot;&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;&quot;
				html += &quot;&amp;lt;td&amp;gt;&quot; + res.data.NO+ &quot;&amp;lt;/td&amp;gt;&quot;;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
				html += &quot;&amp;lt;tr&amp;gt;&quot;;
				html += &quot;&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;&quot;
				html += &quot;&amp;lt;td&amp;gt;&quot; + res.data.TITLE+ &quot;&amp;lt;/td&amp;gt;&quot;;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
				html += &quot;&amp;lt;tr&amp;gt;&quot;;
				html += &quot;&amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;&quot;
				html += &quot;&amp;lt;td&amp;gt;&quot; + res.data.DT+ &quot;&amp;lt;/td&amp;gt;&quot;;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
				html += &quot;&amp;lt;tr&amp;gt;&quot;;
				html += &quot;&amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;&quot;
				html += &quot;&amp;lt;td&amp;gt;&quot; + res.data.HIT+ &quot;&amp;lt;/td&amp;gt;&quot;;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
				html += &quot;&amp;lt;th&amp;gt;내용&amp;lt;/th&amp;gt;&quot;
				html += &quot;&amp;lt;td&amp;gt;&quot; + res.data.DISCRIPT+ &quot;&amp;lt;/td&amp;gt;&quot;;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
			

				$(&quot;.left_area tbody&quot;).html(html);
				
				
			 	var html1 =&quot;&quot;;
				
		
				if(&quot;${sMemNo}&quot; == res.data.MEM_NO){
					html1 += &quot;&amp;lt;div class=\&quot;cmn_btn_ml float_right_btn\&quot; id=\&quot;deleteBtn\&quot; onclick=\&quot;deleteF()\&quot;&amp;gt;삭제&amp;lt;/div&amp;gt;&quot;;
					html1 += &quot;&amp;lt;div class=\&quot;cmn_btn_ml float_right_btn\&quot; id=\&quot;updateBtn\&quot;&amp;gt;수정&amp;lt;/div&amp;gt;&quot;;
				}
			
				$(&quot;.left_area .btn_wrap&quot;).html(html1); 
				
				

			},
			error : function(request, status, error) { // 실패했을 때 함수실행
				console.log(request.responseText); // 실패 상세 태역
			}
		});
		
	})
	

	$(&quot;.btn_wrap&quot;).on(&quot;click&quot;, &quot;#updateBtn&quot;, function () {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;AGUpdate&quot;);
		$(&quot;#actionForm&quot;).submit();
		
	});
	
});

function deleteF() {
	// ajax사용 예정
	$(&quot;#deleteBtn&quot;).on(&quot;click&quot;, function () {
		  makePopup({
		         title : &quot;알림&quot;,
		         contents : &quot;삭제하시겠습니까?&quot;,
		         // draggable : true,
		         buttons : [{
		            name : &quot;삭제&quot;,
		            func:function() {
		            	var params = $(&quot;#actionForm&quot;).serialize();
		    			
		    			$.ajax({
		    				url : &quot;AGAction/delete&quot;, //restful api라는게 여기서 시작한다고?
		    				type : &quot;POST&quot;, 
		    				dataType: &quot;json&quot;, 
		    				data: params, 
		    				success : function(res) { 
		    					switch(res.msg){
		    					case &quot;success&quot; : 
		    						// 카테고리를 유지하고 나머지 정보 초기화
									$(&quot;#page&quot;).val(&quot;1&quot;);
								

									$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;AGList&quot;);
									$(&quot;#actionForm&quot;).submit();
		    						break;
		    					case &quot;fail&quot; :
		    						makeAlert(&quot;알림&quot; , &quot;삭제에 실패하였습니다.&quot;);
		    						break;
		    					case &quot;error&quot; :
		    						makeAlert(&quot;알림&quot; , &quot;삭제 중 문제가 발생하였습니다.&quot;);
		    						break;
		    					}
		    				},
		    				error : function(request, status, error) { 
		    					console.log(request.responseText); 
		    				}
		    			});
		            }
		         }, {
		            name : &quot;취소&quot;
		    }]
		});
	});
}


// 목록 조회 호출, ajax불러오기
function reloadList() {
	var params = $(&quot;#actionForm&quot;).serialize();
	
	$.ajax({
		url : &quot;AGListAjax&quot;, //경로
		type : &quot;POST&quot;, // 전송방식(GET: 주소형태, POST : 주소 헤더 형태)
		dataType: &quot;json&quot;, // 데이터 형태
		data: params, // 보낼데이터
		success : function(res) { //성공했을 때 결과를 res에 받고 함수 실행
			console.log(res); // 콘솔에  pd랑 list 값이 보임
			drawList(res.list);
			drawPaging(res.pd);
	
			
		},
		error : function(request, status, error) { // 실패했을 때 함수실행
			console.log(request.responseText); // 실패 상세 태역
		}
	});
	
}


function drawList(list) {
	var html = &quot;&quot;;

	var cnt = 0;
  	console.log(list[0].PIC);
  	
	for(var data of list){
		if(cnt == 0) {
			html += &quot;&amp;lt;tr&amp;gt;&quot;;
		}
		
		html += &quot;&amp;lt;td no=\&quot;&quot; + data.NO + &quot;\&quot;&amp;gt;&quot;;
		html += &quot;&amp;lt;img alt=\&quot;\&quot; src=\&quot;resources/upload/&quot;+ data.PIC +&quot;\&quot;&amp;gt;&quot;;
		html += &quot;&amp;lt;/td&amp;gt;&quot;
		
		if(cnt == 2) {
			html += &quot;&amp;lt;/tr&amp;gt;&quot;;
		}
		cnt++;
		
		if(cnt &amp;gt;= 3) {
			cnt = 0;
		}
	}   
	$(&quot;.tbody&quot;).html(html);
	
	
	//처음일때만..
	// 강제로 tr td
	// enter키 누린것처럼
	

	if(&quot;${param.no}&quot; != &quot;&quot;) { // param.no가 있다면
		console.log(&quot;${param.no}&quot;);
		flag = false; // 이거 없어도 되는데??음????
		
		$(&quot;td[no='${param.no}']&quot;).click();
	} else if(flag) {
		console.log(&quot;else&quot;)
		flag = false; // 이게 없으면 페이징하면 그 페이지에 첫번째로 다시 로드됨, 내가 보고있던 디테일이 아니라
		
		if($(&quot;.tbody&quot;).html() != &quot;&quot;) { // .tbody에 데이터가 있다면
			$(&quot;.tbody&quot;).children().eq(0).children().eq(0).click(); // click()는 위에 있는 클릭이벤트를 지칭
		}
		
	}
	
}


function drawPaging(pd) {
	var html = &quot;&quot;;
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_first\&quot; page=\&quot;1\&quot;&amp;gt;처음&amp;lt;/span&amp;gt;&quot;;
	// 이전
	if($(&quot;#page&quot;).val() == &quot;1&quot;){
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;1\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	} else{
		// 문자열을 숫자로 바꾸기위해 *1
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 - 1) + &quot;\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	}
	
	for(var i = pd.startP; i &amp;lt;= pd.endP; i++){
		if($(&quot;#page&quot;).val() * 1 == i){ // 현재 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn_on\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		} else { // 다른 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		}
	}
	
	if($(&quot;#page&quot;).val() *1 == pd.endP){ // 현재페이지가 마지막 페이지라면
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	} else {
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 + 1) + &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	}
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_last\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;마지막&amp;lt;/span&amp;gt;&quot;;
	
	$(&quot;.paging_area&quot;).html(html);
                                                                     
}
&amp;lt;/script&amp;gt;		
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;hr/&amp;gt;
&amp;lt;div class=&quot;main&quot;&amp;gt;
&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; id=&quot;no&quot; value=&quot;${data.NO}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; id=&quot;page&quot; value=&quot;${page}&quot; /&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;div class=&quot;left_area&quot;&amp;gt;
&amp;lt;table class=&quot;board_table&quot;&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;600&quot; /&amp;gt;
	&amp;lt;/colgroup&amp;gt;	
	&amp;lt;thead&amp;gt;
	&amp;lt;/thead&amp;gt;
	&amp;lt;tbody&amp;gt;
	
	&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div class=&quot;btn_wrap&quot;&amp;gt;

&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;right_area&quot;&amp;gt;
&amp;lt;table class=&quot;table&quot;&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
	&amp;lt;/colgroup&amp;gt;
	&amp;lt;tbody class=&quot;tbody&quot;&amp;gt;
	&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div class=&quot;paging_area&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;c:if test=&quot;${!empty sMemNo}&quot;&amp;gt;
			&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOtnG0/btrLaBgucFA/ARXl01SfqKFsb41rf68Mqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOtnG0/btrLaBgucFA/ARXl01SfqKFsb41rf68Mqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOtnG0/btrLaBgucFA/ARXl01SfqKFsb41rf68Mqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOtnG0%2FbtrLaBgucFA%2FARXl01SfqKFsb41rf68Mqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1144&quot; height=&quot;597&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;597&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;1310&quot; data-origin-height=&quot;790&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WrkY1/btrK7DzHSyH/TgP4Kwimp7gKuDQeVLGDVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WrkY1/btrK7DzHSyH/TgP4Kwimp7gKuDQeVLGDVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WrkY1/btrK7DzHSyH/TgP4Kwimp7gKuDQeVLGDVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWrkY1%2FbtrK7DzHSyH%2FTgP4Kwimp7gKuDQeVLGDVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1310&quot; height=&quot;790&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;790&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;insert.jsp&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662027073441&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{
	width: 800px;
	margin: 0 auto;
}


&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery.form.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- CKEditor --&amp;gt;
&amp;lt;!-- 제이쿼리 뒤에 나와야함, 제이쿼리 기반으로 동작하기 때문에 --&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/ckeditor/ckeditor.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	// 에디터 연결
	// CKEDITOR.replace(아이디, 옵션)
	CKEDITOR.replace(&quot;discript&quot;, {
		resize_enabled: false, // resize_enabled : 크기조절기능 활용여부
		language : &quot;ko&quot;, // 사용언어
		enterMode: &quot;2&quot;, // 엔터키처리방법. 2번이면 &amp;lt;br/&amp;gt;
		width : &quot;100%&quot;, // 숫자일경우 px, 문자열일경우 css크기
		height : 400
	});
	
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#backForm&quot;).submit();
	});
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		// CKEditor의 값 취득
		// CKEDITOR.instances[아이디] : CKEditor중 아이디가 같은 것을 찾겠다.
		//.getData() : 작성중인 내용을 취득하겠다.
		$(&quot;#discript&quot;).val(CKEDITOR.instances['discript'].getData());
		
		if($.trim($(&quot;#title&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;제목 입력하세요.&quot; , function () {
				$(&quot;#title&quot;).focus();
			})
		} else if($.trim($(&quot;#discript&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;내용을 입력하세요.&quot; , function () {
				$(&quot;#discript&quot;).focus();
			})
		} else {
			// 1. 파입업로드 -&amp;gt; 2. 업로드 파일명 취득 -&amp;gt; 3. 글 저장
			// 폼 객체 취득
			var form = $(&quot;#actionForm&quot;);
			// ajaxForm 적용
			form.ajaxForm({
				success: function (res) { // 데이터 주고 받기 성공시
					if(res.result == &quot;SUCCESS&quot;){ // 파일 전송 성공
						// 올라간 파일이 존재한다면, 첨부파일이 없을 수도 있으니 조건문 처리
						if(res.fileName.length &amp;gt; 0){
							$(&quot;#pic&quot;).val(res.fileName[0]); // 올라간 파일명 보관		
						}
						// 3번 단계 글저장 시작, 기존테이터
						var params = $(&quot;#actionForm&quot;).serialize();
						
						$.ajax({
							url : &quot;AGAction/insert&quot;, //restful api라는게 여기서 시작한다고?
							type : &quot;POST&quot;, 
							dataType: &quot;json&quot;, 
							data: params, 
							success : function(res) { 
								switch(res.msg){
								case &quot;success&quot; : 
									// 카테고리를 유지하고 나머지 정보 초기화
									$(&quot;#page&quot;).val(&quot;1&quot;);
								
									$(&quot;#backForm&quot;).submit();
									break;
								case &quot;fail&quot; :
									makeAlert(&quot;알림&quot; , &quot;등록에 실패하였습니다.&quot;);
									break;
								case &quot;error&quot; :
									makeAlert(&quot;알림&quot; , &quot;등록 중 문제가 발생하였습니다.&quot;);
									break;
								}
							},
							error : function(request, status, error) { 
								console.log(request.responseText); 
							}
						});  // 글저장 끝
						
					} else { // 문제발생
						makeAlert(&quot;알림&quot;, &quot;파일 업로드에&amp;lt;br/&amp;gt;문제가 발생하였습니다.&quot;)
					}
				},
				error: function () { // 에러시
					makeAlert(&quot;알림&quot;, &quot;파일 업로드에&amp;lt;br/&amp;gt;문제가 발생하였습니다.&quot;)
				}
			}); // ajaxForm 설정 끝
			
			
			// ajaxForm 실행
			form.submit();
			
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;form action=&quot;AGList&quot; id=&quot;backForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; id=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;!-- ajax쓰기 때문에 gbn 지움 --&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
	&amp;lt;form action=&quot;fileUploadAjax&quot; id=&quot;actionForm&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
		&amp;lt;input type=&quot;hidden&quot; name=&quot;pic&quot; id=&quot;pic&quot; /&amp;gt; &amp;lt;!-- 실 저장된 파일명 보관용 --&amp;gt;
		&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot; /&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;${sMemNm}&amp;lt;input type=&quot;hidden&quot; name=&quot;memNo&quot; value=&quot;${sMemNo}&quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th colspan=&quot;2&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th colspan=&quot;2&quot;&amp;gt;&amp;lt;textarea rows=&quot;10&quot; cols=&quot;30&quot; name=&quot;discript&quot; id=discript&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;			
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;첨부파일&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;file&quot; name=&quot;pic&quot; /&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/form&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;listBtn&quot;&amp;gt;목록&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;update.jsp&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662027095434&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- jsl의 functions : el tag 추가옵션 --&amp;gt;
&amp;lt;%@ taglib prefix=&quot;fn&quot; uri=&quot;http://java.sun.com/jsp/jstl/functions&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{
	width: 800px;
	margin: 0 auto;
}

.pic {
	display: none;
}


&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery.form.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- CKEditor --&amp;gt;
&amp;lt;!-- 제이쿼리 뒤에 나와야함, 제이쿼리 기반으로 동작하기 때문에 --&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/ckeditor/ckeditor.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	// 에디터 연결
	// CKEDITOR.replace(아이디, 옵션)
	CKEDITOR.replace(&quot;discript&quot;, {
		resize_enabled: false, // resize_enabled : 크기조절기능 활용여부
		language : &quot;ko&quot;, // 사용언어
		enterMode: &quot;2&quot;, // 엔터키처리방법. 2번이면 &amp;lt;br/&amp;gt;
		width : &quot;100%&quot;, // 숫자일경우 px, 문자열일경우 css크기
		height : 400
	});
	
	$(&quot;#cancelBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#backForm&quot;).submit();
	});
	
	// 첨부파일 파일삭제 버튼 클릭시
	$(&quot;#fileDelBtn&quot;).on(&quot;click&quot;, function () {
		// 기존 파일 내역 영역 제거
		$(&quot;.picOld&quot;).remove();
		// 기존 값 제거
		$(&quot;#pic&quot;).val(&quot;&quot;);
		// 파일 선택 영역 제공 
		$(&quot;.pic&quot;).show();
	});
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		// CKEditor의 값 취득
		// CKEDITOR.instances[아이디] : CKEditor중 아이디가 같은 것을 찾겠다.
		//.getData() : 작성중인 내용을 취득하겠다.
		$(&quot;#discript&quot;).val(CKEDITOR.instances['discript'].getData());
		
		if($.trim($(&quot;#title&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;제목 입력하세요.&quot; , function () {
				$(&quot;#title&quot;).focus();
			})
		} else if($.trim($(&quot;#discript&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;내용을 입력하세요.&quot; , function () {
				$(&quot;#discript&quot;).focus();
			})
		} else {
			// 1. 파입업로드 -&amp;gt; 2. 업로드 파일명 취득 -&amp;gt; 3. 글 저장
			// 폼 객체 취득
			var form = $(&quot;#actionForm&quot;);
			// ajaxForm 적용
			form.ajaxForm({
				success: function (res) { // 데이터 주고 받기 성공시
					if(res.result == &quot;SUCCESS&quot;){ // 파일 전송 성공
						// 올라간 파일이 존재한다면, 첨부파일이 없을 수도 있으니 조건문 처리
						if(res.fileName.length &amp;gt; 0){
							$(&quot;#pic&quot;).val(res.fileName[0]); // 올라간 파일명 보관		
						}
						// 3번 단계 글저장 시작, 기존테이터
						var params = $(&quot;#actionForm&quot;).serialize();
						
						$.ajax({
							url : &quot;AGAction/update&quot;, //restful api라는게 여기서 시작한다고?
							type : &quot;POST&quot;, 
							dataType: &quot;json&quot;, 
							data: params, 
							success : function(res) { 
								switch(res.msg){
								case &quot;success&quot; : 
									$('#backForm').submit();
									break;
								case &quot;fail&quot; :
									makeAlert(&quot;알림&quot; , &quot;등록에 실패하였습니다.&quot;);
									break;
								case &quot;error&quot; :
									makeAlert(&quot;알림&quot; , &quot;등록 중 문제가 발생하였습니다.&quot;);
									break;
								}
							},
							error : function(request, status, error) { 
								console.log(request.responseText); 
							}
						});  // 글저장 끝
						
					} else { // 문제발생
						makeAlert(&quot;알림&quot;, &quot;파일 업로드에&amp;lt;br/&amp;gt;문제가 발생하였습니다.&quot;)
					}
				},
				error: function () { // 에러시
					makeAlert(&quot;알림&quot;, &quot;파일 업로드에&amp;lt;br/&amp;gt;문제가 발생하였습니다.&quot;)
				}
			}); // ajaxForm 설정 끝
			
			
			// ajaxForm 실행
			form.submit();
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;form action=&quot;AGList&quot; id=&quot;backForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.NO}&quot; /&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;!-- ajax쓰기 때문에 gbn 지움 --&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
	&amp;lt;form action=&quot;fileUploadAjax&quot; id=&quot;actionForm&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.NO}&quot; /&amp;gt;
		&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;${data.NO}&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot; value=&quot;${data.TITLE}&quot;/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;${sMemNm}&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th colspan=&quot;2&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th colspan=&quot;2&quot;&amp;gt;&amp;lt;textarea rows=&quot;10&quot; cols=&quot;30&quot; name=discript id=&quot;discript&quot;&amp;gt;${data.DISCRIPT}&amp;lt;/textarea&amp;gt;&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;첨부파일&amp;lt;/th&amp;gt;
				&amp;lt;c:choose&amp;gt;
					&amp;lt;c:when test=&quot;${empty data.PIC}&quot;&amp;gt;
						&amp;lt;!-- 파일이 없을때 --&amp;gt;
						&amp;lt;td&amp;gt;
							&amp;lt;input type=&quot;file&quot; name=&quot;picFile&quot; /&amp;gt;
							&amp;lt;input type=&quot;hidden&quot; name=&quot;pic&quot; id=&quot;pic&quot;/&amp;gt;
						&amp;lt;/td&amp;gt;
					&amp;lt;/c:when&amp;gt;
					&amp;lt;c:otherwise&amp;gt;
					&amp;lt;!-- 파일이 있을때 --&amp;gt;
						&amp;lt;td&amp;gt;
							&amp;lt;span class=&quot;attOld&quot;&amp;gt; &amp;lt;!-- 기존 파일 --&amp;gt;
								&amp;lt;!-- fn:length(대상) : 대상 문자열의 길이나 배열, 리스트의 크기를 가져온다 --&amp;gt;
								&amp;lt;c:set var=&quot;fileLength&quot; value=&quot;${fn:length(data.PIC)}&quot;&amp;gt;&amp;lt;/c:set&amp;gt;
								&amp;lt;!-- fn:substring(값, 숫자1, 숫자2) : 값을 숫자1이상부터, 숫자2미만까지, 인덱스 기준으로 자른다. --&amp;gt;
								&amp;lt;c:set var=&quot;fileName&quot; value=&quot;${fn:substring(data.PIC, 20, fileLength)}&quot;&amp;gt;&amp;lt;/c:set&amp;gt;
								${fileName}
								&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;fileDelBtn&quot;&amp;gt;파일삭제&amp;lt;/div&amp;gt;
							&amp;lt;/span&amp;gt;
							&amp;lt;span class=&quot;att&quot;&amp;gt; &amp;lt;!-- 기존 파일 삭제 후 새 파일 용도 --&amp;gt;
								&amp;lt;input type=&quot;file&quot; name=&quot;picFile&quot; /&amp;gt;
								&amp;lt;input type=&quot;hidden&quot; name=&quot;pic&quot; id=&quot;pic&quot; value=&quot;${data.PIC}&quot;/&amp;gt;
							&amp;lt;/span&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;/table&amp;gt;
	&amp;lt;/form&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;cancelBtn&quot;&amp;gt;취소&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;updateBtn&quot;&amp;gt;수정&amp;lt;/div&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 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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PuOiq/btrLbxreY0E/WMn18jIsuB6V3MBBNQGM6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PuOiq/btrLbxreY0E/WMn18jIsuB6V3MBBNQGM6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PuOiq/btrLbxreY0E/WMn18jIsuB6V3MBBNQGM6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPuOiq%2FbtrLbxreY0E%2FWMn18jIsuB6V3MBBNQGM6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;741&quot; height=&quot;492&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 이런 function이 있으면 왜 data.PIC 대신 ${data.PIC}을 못쓰는지 질문했다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;${data.PIC}... el태그....&lt;/p&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://epthffh.tistory.com/entry/Javascript-%EC%97%90%EC%84%9C-JSTL-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-%EC%99%80-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://epthffh.tistory.com/entry/Javascript-%EC%97%90%EC%84%9C-JSTL-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-%EC%99%80-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1662027285159&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Javascript 에서 JSTL 사용하기 와 주의사항&quot; data-og-description=&quot;기본적으로 JSTL은 자바 코드를 다루기에 적합한 커스텀 태그 라이브러리이고 Javascript는 웹 브라우저에서 사용되는 스크립트 프로그래밍 언어이고 내장객체에도 접근이 가능하다는 장점이있다 &quot; data-og-host=&quot;epthffh.tistory.com&quot; data-og-source-url=&quot;https://epthffh.tistory.com/entry/Javascript-%EC%97%90%EC%84%9C-JSTL-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-%EC%99%80-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD&quot; data-og-url=&quot;https://epthffh.tistory.com/entry/Javascript-%EC%97%90%EC%84%9C-JSTL-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-%EC%99%80-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b9Qf5T/hyPEMcD3W1/YLTIu7okicYXZKBUw9Ygr0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/6HurM/hyPEFdwfjK/zuwqwIMkNTTrWkg20GzGqK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://epthffh.tistory.com/entry/Javascript-%EC%97%90%EC%84%9C-JSTL-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-%EC%99%80-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://epthffh.tistory.com/entry/Javascript-%EC%97%90%EC%84%9C-JSTL-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-%EC%99%80-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b9Qf5T/hyPEMcD3W1/YLTIu7okicYXZKBUw9Ygr0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/6HurM/hyPEFdwfjK/zuwqwIMkNTTrWkg20GzGqK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Javascript 에서 JSTL 사용하기 와 주의사항&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;기본적으로 JSTL은 자바 코드를 다루기에 적합한 커스텀 태그 라이브러리이고 Javascript는 웹 브라우저에서 사용되는 스크립트 프로그래밍 언어이고 내장객체에도 접근이 가능하다는 장점이있다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;epthffh.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://epthffh.tistory.com/entry/JSTL-%EA%B3%BC-Javascript-%ED%98%BC%EC%9A%A9-%EC%82%AC%EC%9A%A9%EC%9D%98-%EC%8B%A4%EC%A0%9C%EC%82%AC%EB%A1%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://epthffh.tistory.com/entry/JSTL-%EA%B3%BC-Javascript-%ED%98%BC%EC%9A%A9-%EC%82%AC%EC%9A%A9%EC%9D%98-%EC%8B%A4%EC%A0%9C%EC%82%AC%EB%A1%80&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1662027291895&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;JSTL 과 Javascript 혼용 사용의 실제사례&quot; data-og-description=&quot;원글 :&amp;nbsp;https://okky.kr/article/432665 실무 개발중 Javascript 와 JSTL의 사용법을 헷갈려 해서 도움을 청하신분에게 답변을 해드렸습니다 잘못된 코드를 먼저 보겠습니다 -잘못된 코드1 1 2 3 4 5 6 7 8 9 10..&quot; data-og-host=&quot;epthffh.tistory.com&quot; data-og-source-url=&quot;https://epthffh.tistory.com/entry/JSTL-%EA%B3%BC-Javascript-%ED%98%BC%EC%9A%A9-%EC%82%AC%EC%9A%A9%EC%9D%98-%EC%8B%A4%EC%A0%9C%EC%82%AC%EB%A1%80&quot; data-og-url=&quot;https://epthffh.tistory.com/entry/JSTL-%EA%B3%BC-Javascript-%ED%98%BC%EC%9A%A9-%EC%82%AC%EC%9A%A9%EC%9D%98-%EC%8B%A4%EC%A0%9C%EC%82%AC%EB%A1%80&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d4pMEo/hyPEJmE4Ij/GHah37DHoFmRlD5lKUw58k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/u13ch/hyPEHoRTJk/hwDwHKuR0KUlKiP72tG761/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://epthffh.tistory.com/entry/JSTL-%EA%B3%BC-Javascript-%ED%98%BC%EC%9A%A9-%EC%82%AC%EC%9A%A9%EC%9D%98-%EC%8B%A4%EC%A0%9C%EC%82%AC%EB%A1%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://epthffh.tistory.com/entry/JSTL-%EA%B3%BC-Javascript-%ED%98%BC%EC%9A%A9-%EC%82%AC%EC%9A%A9%EC%9D%98-%EC%8B%A4%EC%A0%9C%EC%82%AC%EB%A1%80&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d4pMEo/hyPEJmE4Ij/GHah37DHoFmRlD5lKUw58k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/u13ch/hyPEHoRTJk/hwDwHKuR0KUlKiP72tG761/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;JSTL 과 Javascript 혼용 사용의 실제사례&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;원글 :&amp;nbsp;https://okky.kr/article/432665 실무 개발중 Javascript 와 JSTL의 사용법을 헷갈려 해서 도움을 청하신분에게 답변을 해드렸습니다 잘못된 코드를 먼저 보겠습니다 -잘못된 코드1 1 2 3 4 5 6 7 8 9 10..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;epthffh.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;java(jstl) =&amp;gt; html(js) 이런순으로!!!!&lt;/p&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;디테일을 팝업으로 뜨게 함, list.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1662028836951&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
html, body{
   margin: 0;
   padding: 0;
   background-color: gray;
}

img {
   width: 200px;
   height: 180px;
}

.list{
   width: 100%;
   padding: 0;
   margin: 0; 
}
.list img{
   float: left;
   
}


@media screen and (max-width:991px) {
  .list div{
     width: 33.333333%;
  }
}

@media screen and (max-width:768px) {
  .list div{
     width: 50%;
  }
}

#searchTxt {
   width : 161px;
   height : 28px;
   padding : 0px 2px;
   text-indent: 5px;
   vertical-align : middle;
   border: 1px solid #d7d7d7;
   outline-color : #70adf9
}
.search_area {
   width: 700px;
   text-align: right;
   margin: 0 auto;
}

.board_area {
   width: 700px;
   margin: 0 auto;
}

.board_detail_table tbody .pconr {
   height: 220px;
}

.board_detail_table tbody .pcon {
   overflow: auto;
   width: 600px;
    height: 220px;
}

.att {
   display: inline-block;
   vertical-align: top;
   width: 18px;
   height: 18px;
   background-image: url('resources/images/attFile.png');
   background-size: cover;
}

#cateNo {
   min-width: 100px;
   height: 30px;
   vertical-align: middle;
   border: 1px solid #d7d7d7;
   float: left;
}
&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;
      src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;
      src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;   
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function() {
   var params = $(&quot;#actionForm&quot;).serialize();
   
   // 등록 버튼
   $(&quot;#insertBtn&quot;).on(&quot;click&quot;, function() {
      
      $(&quot;#actionForm&quot;).attr(&quot;action&quot;, &quot;AGalInsert&quot;);
      $(&quot;#actionForm&quot;).submit();      
   });
   
   $.ajax({
      url : &quot;AGAListAjax&quot;, 
      type : &quot;POST&quot;, 
      dataType : &quot;json&quot;, 
      data : params, 
      success : function(res) {
         drawList(res.list);
      },
      error : function(request, status, error) { 
         console.log(request.responseText); 
      }
   });
   
   $(&quot;body&quot;).on(&quot;click&quot;, &quot;div&quot;, function() {
      $(&quot;#no&quot;).val($(this).attr(&quot;no&quot;));
      var params = $(&quot;#actionForm&quot;).serialize();
      
      
      $.ajax({
         type : &quot;post&quot;,
         url : &quot;AGADetailAjax&quot;,
         dataType : &quot;json&quot;,
         data : params,
         success : function(res) {
            console.log(res);
      var html = &quot;&quot;;      
      
      html += &quot;      &amp;lt;form id=\&quot;boardForm\&quot;&amp;gt;&quot;;
      html += &quot;         &amp;lt;table class=\&quot;board_detail_table\&quot;&amp;gt;&quot;;
      html += &quot;            &amp;lt;colgroup&amp;gt;&quot;;
      html += &quot;               &amp;lt;col width=\&quot;100\&quot;/&amp;gt;&quot;;
      html += &quot;               &amp;lt;col width=\&quot;600\&quot;/&amp;gt;&quot;;
      html += &quot;            &amp;lt;/colgroup&amp;gt;&quot;;
      html += &quot;            &amp;lt;tbody&amp;gt;&quot;;
      html += &quot;            &amp;lt;tr&amp;gt;&quot;;
      html += &quot;               &amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;&quot;;
      html += &quot;               &amp;lt;td class=\&quot;list\&quot;&amp;gt;&quot; + res.data[0].TITLE  + &quot;&amp;lt;/td&amp;gt;&quot;;
      html += &quot;            &amp;lt;/tr&amp;gt;&quot;; 
      html += &quot;            &amp;lt;/tbody&amp;gt;&quot;;
      html += &quot;         &amp;lt;/table&amp;gt;&quot;;
      html += &quot;      &amp;lt;/form&amp;gt;   &quot;;  
      
         makePopup({
            depth : 2,
            width : 720,
            height : 500,
            bg : true,
            bgClose : false,
            title : &quot;상세보기&quot;,
            contents : html,
            draggable : false,
            buttons : [{
               name : &quot;수정&quot;,
               func:function() {
                  checkPass(function(res) {
                     if(result == &quot;TRUE&quot;) {
                        closePopup(2);
                        updatePopup();
                     } else {
                        makeAlert(&quot;알림&quot;, &quot;비밀번호가 틀렸습니다.&quot;);
                     }
                  });
               }
            }, {
               name : &quot;취소&quot;,
   
            }]
         });
      } 
   });
});
   
 
}); // document

function drawList(list) {
   var html = &quot;&quot;;
                         
   
   
   for(var data of list) {
         
      html += &quot;&amp;lt;div no=\&quot;&quot; + data.NO + &quot;\&quot;&amp;gt;&quot;;         
      html += &quot;&amp;lt;img src=\&quot;resources/upload/&quot; + data.PIC + &quot;\&quot;&amp;gt;&quot;;        
      html += &quot;&amp;lt;/div&amp;gt;&quot;;         
                            
   }                                                 
                                                     
   $(&quot;.list&quot;).html(html);
}
&amp;lt;/script&amp;gt;         
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;div class=&quot;search_area&quot;&amp;gt;
   &amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
      &amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; id=&quot;no&quot; /&amp;gt;
      &amp;lt;div class=&quot;cmn_btn_ml&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&amp;gt;
   &amp;lt;/form&amp;gt;   
&amp;lt;/div&amp;gt;
   &amp;lt;div class=&quot;list&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img1.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img2.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img3.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img4.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img5.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img6.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img7.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img8.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img9.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img10.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img11.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img12.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img13.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img14.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img15.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img16.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img17.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img18.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img19.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img20.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img21.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img22.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img23.jpg&quot;&amp;gt;
         &amp;lt;img src=&quot;resources/images/gal/img24.jpg&quot;&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;table&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;/tbody&amp;gt;
      &amp;lt;/table&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;9.2일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;++&amp;nbsp; list화면에서 삭제시에는 detail쪽에 이미지가 안뜨는 문제가 있어서 코드 수정함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 내가 한거&lt;/p&gt;
&lt;pre id=&quot;code_1662101392936&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.paging_area{
	display: block; 
	position: relative; 
	left: 0;
	margin-bottom: 10px;
	font-size: 14px;
}

.main{
	display: flex;
	padding: 100px 200px;
	justify-content: space-between;
}
.main &amp;gt; div {
	width: 700px;	
}

.left_area img {
	width: 680px;
	height: 400px;
	border-radius: 15px;
	
}



.table {
	border-collapse: collapse;
	width: 100%;
	margin: 15px 0px;
}

.right_area img{ 
	width: 200px;
	height: 180px;
	/* object-fit: cover; */
}

.table tbody tr {
	height: 40px;
	text-align: center;
	color: #7b7b7b;
	font-size: 10.5pt;
}

.table tbody tr {
	
}

.tbody img{
	cursor: pointer;
}

&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
var flag = true;
$(document).ready(function () {

	//목록 조회
	reloadList();
	
	
	//페이징 버튼
	$(&quot;.paging_area&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));
		
		reloadList();
	})
	
	// 등록버튼
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		console.log(&quot;1&quot;);
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;, &quot;AGInsert&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	

	$(&quot;.tbody&quot;).on(&quot;click&quot;, &quot;td&quot;, function () {
		$(&quot;#no&quot;).val($(this).attr(&quot;no&quot;));
		
	 	/* $(&quot;#actionForm&quot;).attr(&quot;action&quot;, &quot;AGDetail&quot;);
		$(&quot;#actionForm&quot;).submit();  */
		
		// 단건을 ajax로 보내서 왼쪽 화면에 그려
		var params = $(&quot;#actionForm&quot;).serialize();
		
		
		$.ajax({
			url : &quot;AGDetailAjax&quot;, //경로
			type : &quot;POST&quot;, // 전송방식(GET: 주소형태, POST : 주소 헤더 형태)
			dataType: &quot;json&quot;, // 데이터 형태
			data: params, // 보낼데이터
			success : function(res) { //성공했을 때 결과를 res에 받고 함수 실행
				console.log(res); // 콘솔에  pd랑 list 값이 보임
				
				var html = &quot;&quot;;
				
				html += &quot;&amp;lt;tr&amp;gt;&quot;;
				html += &quot;&amp;lt;td colspan=\&quot;2\&quot;&amp;gt;&quot;;
				html += &quot;&amp;lt;img alt=\&quot;\&quot; src=\&quot;resources/upload/&quot;+ res.data.PIC +&quot;\&quot;&amp;gt;&quot;;
				html += &quot;&amp;lt;/td&amp;gt;&quot;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
				html += &quot;&amp;lt;tr&amp;gt;&quot;;
				html += &quot;&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;&quot;
				html += &quot;&amp;lt;td&amp;gt;&quot; + res.data.NO+ &quot;&amp;lt;/td&amp;gt;&quot;;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
				html += &quot;&amp;lt;tr&amp;gt;&quot;;
				html += &quot;&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;&quot;
				html += &quot;&amp;lt;td&amp;gt;&quot; + res.data.TITLE+ &quot;&amp;lt;/td&amp;gt;&quot;;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
				html += &quot;&amp;lt;tr&amp;gt;&quot;;
				html += &quot;&amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;&quot;
				html += &quot;&amp;lt;td&amp;gt;&quot; + res.data.DT+ &quot;&amp;lt;/td&amp;gt;&quot;;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
				html += &quot;&amp;lt;tr&amp;gt;&quot;;
				html += &quot;&amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;&quot;
				html += &quot;&amp;lt;td&amp;gt;&quot; + res.data.HIT+ &quot;&amp;lt;/td&amp;gt;&quot;;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
				html += &quot;&amp;lt;th&amp;gt;내용&amp;lt;/th&amp;gt;&quot;
				html += &quot;&amp;lt;td&amp;gt;&quot; + res.data.DISCRIPT+ &quot;&amp;lt;/td&amp;gt;&quot;;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
			

				$(&quot;.left_area tbody&quot;).html(html);
				
				
			 	var html1 =&quot;&quot;;
				
		
				if(&quot;${sMemNo}&quot; == res.data.MEM_NO){
					html1 += &quot;&amp;lt;div class=\&quot;cmn_btn_ml float_right_btn\&quot; id=\&quot;deleteBtn\&quot; onclick=\&quot;deleteF()\&quot;&amp;gt;삭제&amp;lt;/div&amp;gt;&quot;;
					html1 += &quot;&amp;lt;div class=\&quot;cmn_btn_ml float_right_btn\&quot; id=\&quot;updateBtn\&quot;&amp;gt;수정&amp;lt;/div&amp;gt;&quot;;
				}
			
				$(&quot;.left_area .btn_wrap&quot;).html(html1); 
				
				

			},
			error : function(request, status, error) { // 실패했을 때 함수실행
				console.log(request.responseText); // 실패 상세 태역
			}
		});
		
	})
	

	$(&quot;.btn_wrap&quot;).on(&quot;click&quot;, &quot;#updateBtn&quot;, function () {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;AGUpdate&quot;);
		$(&quot;#actionForm&quot;).submit();
		
	});
	
});

function deleteF() {
	// ajax사용 예정
	$(&quot;#deleteBtn&quot;).on(&quot;click&quot;, function () {
		  makePopup({
		         title : &quot;알림&quot;,
		         contents : &quot;삭제하시겠습니까?&quot;,
		         // draggable : true,
		         buttons : [{
		            name : &quot;삭제&quot;,
		            func:function() {
		            	var params = $(&quot;#actionForm&quot;).serialize();
		    			
		    			$.ajax({
		    				url : &quot;AGAction/delete&quot;, //restful api라는게 여기서 시작한다고?
		    				type : &quot;POST&quot;, 
		    				dataType: &quot;json&quot;, 
		    				data: params, 
		    				success : function(res) { 
		    					switch(res.msg){
		    					case &quot;success&quot; : 
		    						// 카테고리를 유지하고 나머지 정보 초기화
									$(&quot;#page&quot;).val(&quot;1&quot;);
								

									$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;AGList&quot;);
									$(&quot;#actionForm&quot;).submit();
		    						break;
		    					case &quot;fail&quot; :
		    						makeAlert(&quot;알림&quot; , &quot;삭제에 실패하였습니다.&quot;);
		    						break;
		    					case &quot;error&quot; :
		    						makeAlert(&quot;알림&quot; , &quot;삭제 중 문제가 발생하였습니다.&quot;);
		    						break;
		    					}
		    				},
		    				error : function(request, status, error) { 
		    					console.log(request.responseText); 
		    				}
		    			});
		            }
		         }, {
		            name : &quot;취소&quot;
		    }]
		});
	});
}


// 목록 조회 호출, ajax불러오기
function reloadList() {
	var params = $(&quot;#actionForm&quot;).serialize();
	
	$.ajax({
		url : &quot;AGListAjax&quot;, //경로
		type : &quot;POST&quot;, // 전송방식(GET: 주소형태, POST : 주소 헤더 형태)
		dataType: &quot;json&quot;, // 데이터 형태
		data: params, // 보낼데이터
		success : function(res) { //성공했을 때 결과를 res에 받고 함수 실행
			console.log(res); // 콘솔에  pd랑 list 값이 보임
			drawList(res.list);
			drawPaging(res.pd);
	
			
		},
		error : function(request, status, error) { // 실패했을 때 함수실행
			console.log(request.responseText); // 실패 상세 태역
		}
	});
	
}


function drawList(list) {
	var html = &quot;&quot;;

	var cnt = 0;
  	console.log(list[0].PIC);
  	
	for(var data of list){
		if(cnt == 0) {
			html += &quot;&amp;lt;tr&amp;gt;&quot;;
		}
		
		html += &quot;&amp;lt;td no=\&quot;&quot; + data.NO + &quot;\&quot;&amp;gt;&quot;;
		html += &quot;&amp;lt;img alt=\&quot;\&quot; src=\&quot;resources/upload/&quot;+ data.PIC +&quot;\&quot;&amp;gt;&quot;;
		html += &quot;&amp;lt;/td&amp;gt;&quot;
		
		if(cnt == 2) {
			html += &quot;&amp;lt;/tr&amp;gt;&quot;;
		}
		cnt++;
		
		if(cnt &amp;gt;= 3) {
			cnt = 0;
		}
	}   
	$(&quot;.tbody&quot;).html(html);
	
	
	//처음일때만..
	// 강제로 tr td
	// enter키 누린것처럼
	

	if(&quot;${param.no}&quot; != &quot;&quot;) { // param.no가 있다면
		console.log(&quot;${param.no}&quot;);
		flag = false; 
		
		if($(&quot;td[no='${param.no}']&quot;).length == 0){ // 삭제 
			$(&quot;.tbody&quot;).children().eq(0).children().eq(0).click();
		} else { // 수정
			$(&quot;td[no='${param.no}']&quot;).click();
		}

	} else if(flag) {
		console.log(&quot;else&quot;)
		flag = false; // 이게 없으면 페이징하면 그 페이지에 첫번째로 다시 로드됨, 내가 보고있던 디테일이 아니라
		
		if($(&quot;.tbody&quot;).html() != &quot;&quot;) { // .tbody에 데이터가 있다면
			$(&quot;.tbody&quot;).children().eq(0).children().eq(0).click(); // click()는 위에 있는 클릭이벤트를 지칭
		}
		
	}
	
}


function drawPaging(pd) {
	var html = &quot;&quot;;
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_first\&quot; page=\&quot;1\&quot;&amp;gt;처음&amp;lt;/span&amp;gt;&quot;;
	// 이전
	if($(&quot;#page&quot;).val() == &quot;1&quot;){
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;1\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	} else{
		// 문자열을 숫자로 바꾸기위해 *1
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 - 1) + &quot;\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	}
	
	for(var i = pd.startP; i &amp;lt;= pd.endP; i++){
		if($(&quot;#page&quot;).val() * 1 == i){ // 현재 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn_on\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		} else { // 다른 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		}
	}
	
	if($(&quot;#page&quot;).val() *1 == pd.endP){ // 현재페이지가 마지막 페이지라면
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	} else {
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 + 1) + &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	}
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_last\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;마지막&amp;lt;/span&amp;gt;&quot;;
	
	$(&quot;.paging_area&quot;).html(html);
                                                                     
}
&amp;lt;/script&amp;gt;		
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;hr/&amp;gt;
&amp;lt;div class=&quot;main&quot;&amp;gt;
&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; id=&quot;no&quot; value=&quot;${data.NO}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; id=&quot;page&quot; value=&quot;${page}&quot; /&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;div class=&quot;left_area&quot;&amp;gt;
&amp;lt;table class=&quot;board_table&quot;&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;600&quot; /&amp;gt;
	&amp;lt;/colgroup&amp;gt;	
	&amp;lt;thead&amp;gt;
	&amp;lt;/thead&amp;gt;
	&amp;lt;tbody&amp;gt;
	
	&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div class=&quot;btn_wrap&quot;&amp;gt;

&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;right_area&quot;&amp;gt;
&amp;lt;table class=&quot;table&quot;&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
	&amp;lt;/colgroup&amp;gt;
	&amp;lt;tbody class=&quot;tbody&quot;&amp;gt;
	&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div class=&quot;paging_area&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;c:if test=&quot;${!empty sMemNo}&quot;&amp;gt;
			&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;/div&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-filename=&quot;1.png&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sISWQ/btrLfMW62SQ/3prsBCPCbPiNEj69Ekhgq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sISWQ/btrLfMW62SQ/3prsBCPCbPiNEj69Ekhgq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sISWQ/btrLfMW62SQ/3prsBCPCbPiNEj69Ekhgq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsISWQ%2FbtrLfMW62SQ%2F3prsBCPCbPiNEj69Ekhgq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1458&quot; height=&quot;592&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;592&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;b&gt;강사님이 고쳐주신거&lt;/b&gt; (flag 사용) 강사님 삭제버튼도 고쳐주심, onclick이벤트 말고, 변하지 않는곳에 이벤트 걸음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662100942769&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.paging_area{
	display: block; 
	position: relative; 
	left: 0;
	margin-bottom: 10px;
	font-size: 14px;
}

.main{
	display: flex;
	padding: 100px 200px;
	justify-content: space-between;
}
.main &amp;gt; div {
	width: 700px;	
}

.left_area img {
	width: 680px;
	height: 400px;
	border-radius: 15px;
	
}



.table {
	border-collapse: collapse;
	width: 100%;
	margin: 15px 0px;
}

.right_area img{ 
	width: 200px;
	height: 180px;
	/* object-fit: cover; */
}

.table tbody tr {
	height: 40px;
	text-align: center;
	color: #7b7b7b;
	font-size: 10.5pt;
}

.table tbody tr {
	
}

.tbody img{
	cursor: pointer;
}

&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
var flag = true;
$(document).ready(function () {

	//목록 조회
	reloadList();
	
	
	//페이징 버튼
	$(&quot;.paging_area&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));
		
		reloadList();
	})
	
	// 등록버튼
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		console.log(&quot;1&quot;);
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;, &quot;AGInsert&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	

	$(&quot;.tbody&quot;).on(&quot;click&quot;, &quot;td&quot;, function () {
		$(&quot;#no&quot;).val($(this).attr(&quot;no&quot;));
		
	 	/* $(&quot;#actionForm&quot;).attr(&quot;action&quot;, &quot;AGDetail&quot;);
		$(&quot;#actionForm&quot;).submit();  */
		
		// 단건을 ajax로 보내서 왼쪽 화면에 그려
		var params = $(&quot;#actionForm&quot;).serialize();
		
		
		$.ajax({
			url : &quot;AGDetailAjax&quot;, //경로
			type : &quot;POST&quot;, // 전송방식(GET: 주소형태, POST : 주소 헤더 형태)
			dataType: &quot;json&quot;, // 데이터 형태
			data: params, // 보낼데이터
			success : function(res) { //성공했을 때 결과를 res에 받고 함수 실행
				console.log(res); // 콘솔에  pd랑 list 값이 보임
				
				var html = &quot;&quot;;
				
				html += &quot;&amp;lt;tr&amp;gt;&quot;;
				html += &quot;&amp;lt;td colspan=\&quot;2\&quot;&amp;gt;&quot;;
				html += &quot;&amp;lt;img alt=\&quot;\&quot; src=\&quot;resources/upload/&quot;+ res.data.PIC +&quot;\&quot;&amp;gt;&quot;;
				html += &quot;&amp;lt;/td&amp;gt;&quot;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
				html += &quot;&amp;lt;tr&amp;gt;&quot;;
				html += &quot;&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;&quot;
				html += &quot;&amp;lt;td&amp;gt;&quot; + res.data.NO+ &quot;&amp;lt;/td&amp;gt;&quot;;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
				html += &quot;&amp;lt;tr&amp;gt;&quot;;
				html += &quot;&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;&quot;
				html += &quot;&amp;lt;td&amp;gt;&quot; + res.data.TITLE+ &quot;&amp;lt;/td&amp;gt;&quot;;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
				html += &quot;&amp;lt;tr&amp;gt;&quot;;
				html += &quot;&amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;&quot;
				html += &quot;&amp;lt;td&amp;gt;&quot; + res.data.DT+ &quot;&amp;lt;/td&amp;gt;&quot;;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
				html += &quot;&amp;lt;tr&amp;gt;&quot;;
				html += &quot;&amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;&quot;
				html += &quot;&amp;lt;td&amp;gt;&quot; + res.data.HIT+ &quot;&amp;lt;/td&amp;gt;&quot;;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
				html += &quot;&amp;lt;th&amp;gt;내용&amp;lt;/th&amp;gt;&quot;
				html += &quot;&amp;lt;td&amp;gt;&quot; + res.data.DISCRIPT+ &quot;&amp;lt;/td&amp;gt;&quot;;
				html += &quot;&amp;lt;/tr&amp;gt;&quot;
			

				$(&quot;.left_area tbody&quot;).html(html);
				
				
			 	var html1 =&quot;&quot;;
				
		
				if(&quot;${sMemNo}&quot; == res.data.MEM_NO){
					html1 += &quot;&amp;lt;div class=\&quot;cmn_btn_ml float_right_btn\&quot; id=\&quot;deleteBtn\&quot;&amp;gt;삭제&amp;lt;/div&amp;gt;&quot;;
					html1 += &quot;&amp;lt;div class=\&quot;cmn_btn_ml float_right_btn\&quot; id=\&quot;updateBtn\&quot;&amp;gt;수정&amp;lt;/div&amp;gt;&quot;;
				}
			
				$(&quot;.left_area .btn_wrap&quot;).html(html1); 
				
				

			},
			error : function(request, status, error) { // 실패했을 때 함수실행
				console.log(request.responseText); // 실패 상세 태역
			}
		});
		
	})
	

	$(&quot;.btn_wrap&quot;).on(&quot;click&quot;, &quot;#updateBtn&quot;, function () {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;AGUpdate&quot;);
		$(&quot;#actionForm&quot;).submit();
		
	});
	
	$(&quot;body&quot;).on(&quot;click&quot;, &quot;#deleteBtn&quot;, function () {
		  makePopup({
		         title : &quot;알림&quot;,
		         contents : &quot;삭제하시겠습니까?&quot;,
		         // draggable : true,
		         buttons : [{
		            name : &quot;삭제&quot;,
		            func:function() {
		            	var params = $(&quot;#actionForm&quot;).serialize();
		    			
		    			$.ajax({
		    				url : &quot;AGAction/delete&quot;, //restful api라는게 여기서 시작한다고?
		    				type : &quot;POST&quot;, 
		    				dataType: &quot;json&quot;, 
		    				data: params, 
		    				success : function(res) { 
		    					switch(res.msg){
		    					case &quot;success&quot; : 
		    						flag = true; // 여기 수정
		    						
		    						// 카테고리를 유지하고 나머지 정보 초기화
									$(&quot;#page&quot;).val(&quot;1&quot;);
								
 
									reloadList(); // 여기 수정
									
									closePopup(); // 여기 수정
		    						break;
		    					case &quot;fail&quot; :
		    						makeAlert(&quot;알림&quot; , &quot;삭제에 실패하였습니다.&quot;);
		    						break;
		    					case &quot;error&quot; :
		    						makeAlert(&quot;알림&quot; , &quot;삭제 중 문제가 발생하였습니다.&quot;);
		    						break;
		    					}
		    				},
		    				error : function(request, status, error) { 
		    					console.log(request.responseText); 
		    				}
		    			});
		            }
		         }, {
		            name : &quot;취소&quot;
		    }]
		});
	});
	
});


// 목록 조회 호출, ajax불러오기
function reloadList() {
	var params = $(&quot;#actionForm&quot;).serialize();
	
	$.ajax({
		url : &quot;AGListAjax&quot;, //경로
		type : &quot;POST&quot;, // 전송방식(GET: 주소형태, POST : 주소 헤더 형태)
		dataType: &quot;json&quot;, // 데이터 형태
		data: params, // 보낼데이터
		success : function(res) { //성공했을 때 결과를 res에 받고 함수 실행
			console.log(res); // 콘솔에  pd랑 list 값이 보임
			drawList(res.list);
			drawPaging(res.pd);
	
			
		},
		error : function(request, status, error) { // 실패했을 때 함수실행
			console.log(request.responseText); // 실패 상세 태역
		}
	});
	
}


function drawList(list) {
	var html = &quot;&quot;;

	var cnt = 0;
  	console.log(list[0].PIC);
  	
	for(var data of list){
		if(cnt == 0) {
			html += &quot;&amp;lt;tr&amp;gt;&quot;;
		}
		
		html += &quot;&amp;lt;td no=\&quot;&quot; + data.NO + &quot;\&quot;&amp;gt;&quot;;
		html += &quot;&amp;lt;img alt=\&quot;\&quot; src=\&quot;resources/upload/&quot;+ data.PIC +&quot;\&quot;&amp;gt;&quot;;
		html += &quot;&amp;lt;/td&amp;gt;&quot;
		
		if(cnt == 2) {
			html += &quot;&amp;lt;/tr&amp;gt;&quot;;
		}
		cnt++;
		
		if(cnt &amp;gt;= 3) {
			cnt = 0;
		}
	}   
	$(&quot;.tbody&quot;).html(html);
	
	
	//처음일때만..
	// 강제로 tr td
	// enter키 누린것처럼
	

	if(&quot;${param.no}&quot; != &quot;&quot;) { // param.no가 있다면
		flag = false; // 이거 없어도 되는데??음????

		$(&quot;td[no='${param.no}']&quot;).click(); // 수정
	} else if(flag) {
		console.log(&quot;else&quot;)
		flag = false; // 이게 없으면 페이징하면 그 페이지에 첫번째로 다시 로드됨, 내가 보고있던 디테일이 아니라
		
		if($(&quot;.tbody&quot;).html() != &quot;&quot;) { // .tbody에 데이터가 있다면
			$(&quot;.tbody&quot;).children().eq(0).children().eq(0).click(); // click()는 위에 있는 클릭이벤트를 지칭
		}
		
	}
	
}


function drawPaging(pd) {
	var html = &quot;&quot;;
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_first\&quot; page=\&quot;1\&quot;&amp;gt;처음&amp;lt;/span&amp;gt;&quot;;
	// 이전
	if($(&quot;#page&quot;).val() == &quot;1&quot;){
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;1\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	} else{
		// 문자열을 숫자로 바꾸기위해 *1
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 - 1) + &quot;\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	}
	
	for(var i = pd.startP; i &amp;lt;= pd.endP; i++){
		if($(&quot;#page&quot;).val() * 1 == i){ // 현재 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn_on\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		} else { // 다른 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		}
	}
	
	if($(&quot;#page&quot;).val() *1 == pd.endP){ // 현재페이지가 마지막 페이지라면
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	} else {
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 + 1) + &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	}
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_last\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;마지막&amp;lt;/span&amp;gt;&quot;;
	
	$(&quot;.paging_area&quot;).html(html);
                                                                     
}
&amp;lt;/script&amp;gt;		
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;hr/&amp;gt;
&amp;lt;div class=&quot;main&quot;&amp;gt;
&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; id=&quot;no&quot; value=&quot;${data.NO}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; id=&quot;page&quot; value=&quot;${page}&quot; /&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;div class=&quot;left_area&quot;&amp;gt;
&amp;lt;table class=&quot;board_table&quot;&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;600&quot; /&amp;gt;
	&amp;lt;/colgroup&amp;gt;	
	&amp;lt;thead&amp;gt;
	&amp;lt;/thead&amp;gt;
	&amp;lt;tbody&amp;gt;
	
	&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div class=&quot;btn_wrap&quot;&amp;gt;

&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;right_area&quot;&amp;gt;
&amp;lt;table class=&quot;table&quot;&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
	&amp;lt;/colgroup&amp;gt;
	&amp;lt;tbody class=&quot;tbody&quot;&amp;gt;
	&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div class=&quot;paging_area&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;c:if test=&quot;${!empty sMemNo}&quot;&amp;gt;
			&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;기존&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220902_154517362.png&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;1242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/codGkh/btrLgey1JQN/krIK3FC86cp61k8kxbByi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/codGkh/btrLgey1JQN/krIK3FC86cp61k8kxbByi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/codGkh/btrLgey1JQN/krIK3FC86cp61k8kxbByi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcodGkh%2FbtrLgey1JQN%2FkrIK3FC86cp61k8kxbByi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1242&quot; data-filename=&quot;KakaoTalk_20220902_154517362.png&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;1242&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1uEwe/btrLc78owr6/osJKQLn3PCKHJGwGVGiCy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1uEwe/btrLc78owr6/osJKQLn3PCKHJGwGVGiCy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1uEwe/btrLc78owr6/osJKQLn3PCKHJGwGVGiCy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1uEwe%2FbtrLc78owr6%2FosJKQLn3PCKHJGwGVGiCy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;780&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>TIL/academy</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/136</guid>
      <comments>https://makeaplayground.tistory.com/136#entry136comment</comments>
      <pubDate>Thu, 1 Sep 2022 19:41:20 +0900</pubDate>
    </item>
    <item>
      <title>국비 TIL(Today I Learned) 20220826 카테고리별 게시판</title>
      <link>https://makeaplayground.tistory.com/132</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;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;844&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMKdim/btrKBqs13ev/n17ZvVD4FHkFfcchK22kcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMKdim/btrKBqs13ev/n17ZvVD4FHkFfcchK22kcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMKdim/btrKBqs13ev/n17ZvVD4FHkFfcchK22kcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMKdim%2FbtrKBqs13ev%2Fn17ZvVD4FHkFfcchK22kcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;391&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;391&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mMffi/btrKz3kRMLc/mLpnJMlfDeHWf0BDUzzxV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mMffi/btrKz3kRMLc/mLpnJMlfDeHWf0BDUzzxV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mMffi/btrKz3kRMLc/mLpnJMlfDeHWf0BDUzzxV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmMffi%2FbtrKz3kRMLc%2FmLpnJMlfDeHWf0BDUzzxV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;325&quot; height=&quot;137&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;137&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1023&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7EzBs/btrKz4qvJ9c/6HIs0bJamgBEoEKu5njk2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7EzBs/btrKz4qvJ9c/6HIs0bJamgBEoEKu5njk2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7EzBs/btrKz4qvJ9c/6HIs0bJamgBEoEKu5njk2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7EzBs%2FbtrKz4qvJ9c%2F6HIs0bJamgBEoEKu5njk2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;492&quot; data-origin-width=&quot;1023&quot; data-origin-height=&quot;492&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;list.jsp 변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHLVZG/btrKyrteWTb/zLbFVb67FiWk5t8WkT5LAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHLVZG/btrKyrteWTb/zLbFVb67FiWk5t8WkT5LAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHLVZG/btrKyrteWTb/zLbFVb67FiWk5t8WkT5LAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHLVZG%2FbtrKyrteWTb%2FzLbFVb67FiWk5t8WkT5LAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;592&quot; height=&quot;99&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;99&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;T_SQL.XML에 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AND T.CATE_NO = #{cateNo} 등등 cata관련 추가&lt;/p&gt;
&lt;pre id=&quot;code_1661481595332&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;T&quot;&amp;gt;
	&amp;lt;select id=&quot;getTCnt&quot; resultType=&quot;Integer&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT COUNT(*) AS CNT
		FROM TBOARD T INNER JOIN MEM M ON T.MEM_NO = M.MEM_NO
		AND M.DEL = 1
		WHERE T.DEL = 1
		AND T.CATE_NO = #{cateNo}
		&amp;lt;if test=&quot;searchTxt != null and searchTxt !=''&quot;&amp;gt;
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 0&quot;&amp;gt;
					AND T.TITLE LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 1&quot;&amp;gt;
					AND M.MEM_NM LIKE '%' ||  #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;getTList&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT T.NO, T.TITLE, T.MEM_NM, T.HIT, T.DT, T.ATT
		FROM(
		SELECT T.NO, T.TITLE, M.MEM_NM, T.HIT,
		CASE WHEN TO_CHAR(DT,'YY.MM.DD') = TO_CHAR(SYSDATE, 'YY.MM.DD')
		        THEN TO_CHAR(DT, 'HH24:MI')
		        ELSE TO_CHAR(DT, 'YY.MM.DD')
		        END AS DT, ATT,
		        ROW_NUMBER() OVER(ORDER BY T.NO DESC) AS RNUM
				FROM TBOARD T INNER JOIN MEM M ON T.MEM_NO = M.MEM_NO
				AND M.DEL = 1
		WHERE T.DEL = 1
		AND T.CATE_NO = #{cateNo}
		&amp;lt;if test=&quot;searchTxt != null and searchTxt !=''&quot;&amp;gt;
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 0&quot;&amp;gt;
					AND T.TITLE LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 1&quot;&amp;gt;
					AND M.MEM_NM LIKE '%' ||  #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;) T
		WHERE T.RNUM BETWEEN #{start} AND #{end}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;insertT&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO TBOARD(NO, TITLE, MEM_NO, CON, ATT, CATE_NO)
		VALUES (TBOARD_SEQ.NEXTVAL, #{title} , #{memNo}, #{con}, #{att}, #{cateNo})
	&amp;lt;/insert&amp;gt;
	 
	&amp;lt;select id=&quot;getT&quot; parameterType=&quot;hashmap&quot;  resultType=&quot;hashmap&quot;&amp;gt;
		SELECT T.NO, T.TITLE, M.MEM_NO, M.MEM_NM, T.CON, T.HIT,
	    TO_CHAR(T.DT, 'YYYY-MM-DD') AS DT, T.ATT
		FROM TBOARD T INNER JOIN MEM M ON T.MEM_NO = M.MEM_NO
		AND M.DEL = 1
		WHERE T.DEL = 1
		AND T.NO = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;update id=&quot;updateTHit&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE TBOARD SET HIT = HIT + 1
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;update id=&quot;deleteT&quot;  parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE TBOARD SET DEL = 0
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;update id=&quot;updateT&quot;  parameterType=&quot;hashmap&quot;&amp;gt;		
		UPDATE TBOARD SET TITLE = #{title},
		CON = #{con},
		ATT = #{att}
		WHERE NO = #{no}
	&amp;lt;/update&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bu8VnO/btrKz4Ep2Sd/zqSD0GilKHmCi37cCH8jvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bu8VnO/btrKz4Ep2Sd/zqSD0GilKHmCi37cCH8jvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bu8VnO/btrKz4Ep2Sd/zqSD0GilKHmCi37cCH8jvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbu8VnO%2FbtrKz4Ep2Sd%2FzqSD0GilKHmCi37cCH8jvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;819&quot; height=&quot;554&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;554&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;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;&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;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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Restful Controller -&amp;gt; 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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;222&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UW7vZ/btrKFvtwQuX/Inr4ZU54otcPWWDo9ZdKa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UW7vZ/btrKFvtwQuX/Inr4ZU54otcPWWDo9ZdKa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UW7vZ/btrKFvtwQuX/Inr4ZU54otcPWWDo9ZdKa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUW7vZ%2FbtrKFvtwQuX%2FInr4ZU54otcPWWDo9ZdKa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;222&quot; height=&quot;596&quot; data-origin-width=&quot;222&quot; data-origin-height=&quot;596&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;T에 있는 화면 수정 T를 카테고리 자유게시판으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1661487640584&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
#searchTxt{
width: 160px;
height: 30px; 
padding: 0px 2px;
text-indent: 5px;
vertical-align: middle;
border: 1px solid #d7d7d7; 
outline-color: #70adf9;
box-sizing: border-box;
}
.search_area{
	width: 800px;
	text-align: right;
	margin: 0 auto;
}
.board_area{
	width: 800px;
	margin: 0 auto;
}

.att {
	display: inline-block; 
	vertical-align: top; 
	width: 18px; 
	height: 18px; 
	background-image: url('resources/images/attFile.png'); 
	background-size: cover;
}
#cateNo { 
	min-width: 100px; 
	height: 30px; 
	vertical-align: middle; 
	boder: 1px soild #d7d7d7; 
	float: left
}

&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	if(&quot;${params.searchGbn}&quot; != &quot;&quot;){
		$(&quot;#searchGbn&quot;).val(&quot;${param.searchGbn}&quot;);
	} else {
		$(&quot;#oldGbn&quot;).val(&quot;0&quot;);
	}
	
	// 카테고리 설정
	if(&quot;${param.cateNo}&quot; != &quot;&quot;){
		$(&quot;#cateNo&quot;).val(&quot;${param.cateNo}&quot;);
	}
	// 카테고리 변경시
	$(&quot;#cateNo&quot;).on(&quot;change&quot;, function () {
		// 검색 및 페이징 초기화
		$(&quot;#page&quot;).val(&quot;1&quot;);
		$(&quot;#searchGbn&quot;).val(&quot;0&quot;);
		$(&quot;#searchTxt&quot;).val(&quot;&quot;);
		$(&quot;#oldGbn&quot;).val(&quot;0&quot;);
		$(&quot;#oldTxt&quot;).val(&quot;&quot;);
		//목록 조회
		reloadList();
	})
	
	
	//목록 조회
	reloadList();
	
	//검색버튼
	$(&quot;#searchBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#page&quot;).val(&quot;1&quot;);
		// 이동을 안하다보니 문제가 기존검색값 셋팅을 안해줌
		// 그래서  신규 상태 적용
		$(&quot;#oldGbn&quot;).val($(&quot;#searchGbn&quot;).val());
		$(&quot;#oldTxt&quot;).val($(&quot;#searchTxt&quot;).val());
		
		
		// 데이터만 가져와서 다시 그려줌, 화면 이동 없음
		reloadList();
	});
	
	//페이징 버튼
	$(&quot;.paging_area&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		// 기존 검색상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
			
		
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));
		
		reloadList();
	})
	
	// 등록버튼
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		// 기존 검색상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;, &quot;ATInsert&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;tr&quot;, function () {
		$(&quot;#no&quot;).val($(this).attr(&quot;no&quot;));
		
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;, &quot;ATDetail&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
});

// 목록 조회 호출, ajax불러오기
function reloadList() {
	var params = $(&quot;#actionForm&quot;).serialize();
	
	$.ajax({
		url : &quot;ATListAjax&quot;, //경로
		type : &quot;POST&quot;, // 전송방식(GET: 주소형태, POST : 주소 헤더 형태)
		dataType: &quot;json&quot;, // 데이터 형태
		data: params, // 보낼데이터
		success : function(res) { //성공했을 때 결과를 res에 받고 함수 실행
			console.log(res); // 콘솔에  pd랑 list 값이 보임
			drawList(res.list);
			drawPaging(res.pd);
		},
		error : function(request, status, error) { // 실패했을 때 함수실행
			console.log(request.responseText); // 실패 상세 태역
		}
	});
	
}

function drawList(list) {
	var html = &quot;&quot;;
	
	// list에는 map이 들어있으니까 하나씩 꺼내오겠다
	for(var data of list){
		console.log(typeof(data.ATT) !=&quot;undefined&quot;);
		html += &quot;&amp;lt;tr no=\&quot;&quot; + data.NO + &quot;\&quot;&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.NO + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot;;
		html += data.TITLE;
		if(typeof(data.ATT) !=&quot;undefined&quot;){ // 첨부파일이 있다면
			html += &quot;&amp;lt;span class=\&quot;att\&quot;&amp;gt;&amp;lt;/span&amp;gt;&quot;;
		}
		html += &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.MEM_NM + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.DT + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.HIT + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;/tr&amp;gt;&quot;;
	}   
	
	$(&quot;tbody&quot;).html(html);
}

function drawPaging(pd) {
	var html = &quot;&quot;;
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_first\&quot; page=\&quot;1\&quot;&amp;gt;처음&amp;lt;/span&amp;gt;&quot;;
	// 이전
	if($(&quot;#page&quot;).val() == &quot;1&quot;){
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;1\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	} else{
		// 문자열을 숫자로 바꾸기위해 *1
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 - 1) + &quot;\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	}
	
	for(var i = pd.startP; i &amp;lt;= pd.endP; i++){
		if($(&quot;#page&quot;).val() * 1 == i){ // 현재 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn_on\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		} else { // 다른 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		}
	}
	
	if($(&quot;#page&quot;).val() *1 == pd.endP){ // 현재페이지가 마지막 페이지라면
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	} else {
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 + 1) + &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	}
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_last\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;마지막&amp;lt;/span&amp;gt;&quot;;
	
	$(&quot;.paging_area&quot;).html(html);
                                                                     
}
&amp;lt;/script&amp;gt;		
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;hr/&amp;gt;
&amp;lt;!-- 페이징 때 기존 검색 내용 유지용 --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;

&amp;lt;!-- 데이터 후 처리해서 로딩이 빨라 --&amp;gt;
&amp;lt;div class=&quot;search_area&quot;&amp;gt;
	&amp;lt;!--  method=&quot;post&quot;는 나중에 쓸 예정, no 보낼때 --&amp;gt;
	&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;select name=&quot;cateNo&quot; id=&quot;cateNo&quot;&amp;gt;
		&amp;lt;c:forEach var=&quot;data&quot; items=&quot;${cate}&quot;&amp;gt;
			&amp;lt;option value=&quot;${data.CATE_NO}&quot;&amp;gt;${data.CATE_NM}&amp;lt;/option&amp;gt;
		&amp;lt;/c:forEach&amp;gt;
	&amp;lt;/select&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; id=&quot;no&quot; /&amp;gt;
		&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; id=&quot;page&quot; value=&quot;${page}&quot; /&amp;gt;
		&amp;lt;select name=&quot;searchGbn&quot; id=&quot;searchGbn&quot;&amp;gt;
			&amp;lt;option value=&quot;0&quot;&amp;gt;제목&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;1&quot;&amp;gt;작성자&amp;lt;/option&amp;gt;
		&amp;lt;/select&amp;gt;
		&amp;lt;input type=&quot;text&quot; name=&quot;searchTxt&quot; id=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot; /&amp;gt;
		&amp;lt;div class=&quot;cmn_btn_ml&quot; id=&quot;searchBtn&quot;&amp;gt;검색&amp;lt;/div&amp;gt;
		&amp;lt;c:if test=&quot;${!empty sMemNo}&quot;&amp;gt;
			&amp;lt;div class=&quot;cmn_btn_ml&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&amp;gt;
		&amp;lt;/c:if&amp;gt;
	&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;board_area&quot;&amp;gt;
&amp;lt;table class=&quot;board_table&quot;&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;400&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
	&amp;lt;/colgroup&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;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div class=&quot;paging_area&quot;&amp;gt;&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;insert.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1661487676975&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{
	width: 800px;
	margin: 0 auto;
}


&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery.form.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- CKEditor --&amp;gt;
&amp;lt;!-- 제이쿼리 뒤에 나와야함, 제이쿼리 기반으로 동작하기 때문에 --&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/ckeditor/ckeditor.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	// 에디터 연결
	// CKEDITOR.replace(아이디, 옵션)
	CKEDITOR.replace(&quot;con&quot;, {
		resize_enabled: false, // resize_enabled : 크기조절기능 활용여부
		language : &quot;ko&quot;, // 사용언어
		enterMode: &quot;2&quot;, // 엔터키처리방법. 2번이면 &amp;lt;br/&amp;gt;
		width : &quot;100%&quot;, // 숫자일경우 px, 문자열일경우 css크기
		height : 400
	});
	
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#backForm&quot;).submit();
	});
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		// CKEditor의 값 취득
		// CKEDITOR.instances[아이디] : CKEditor중 아이디가 같은 것을 찾겠다.
		//.getData() : 작성중인 내용을 취득하겠다.
		$(&quot;#con&quot;).val(CKEDITOR.instances['con'].getData());
		
		if($.trim($(&quot;#title&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;제목 입력하세요.&quot; , function () {
				$(&quot;#title&quot;).focus();
			})
		} else if($.trim($(&quot;#con&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;내용을 입력하세요.&quot; , function () {
				$(&quot;#con&quot;).focus();
			})
		} else {
			// 1. 파입업로드 -&amp;gt; 2. 업로드 파일명 취득 -&amp;gt; 3. 글 저장
			// 폼 객체 취득
			var form = $(&quot;#actionForm&quot;);
			// ajaxForm 적용
			form.ajaxForm({
				success: function (res) { // 데이터 주고 받기 성공시
					if(res.result == &quot;SUCCESS&quot;){ // 파일 전송 성공
						// 올라간 파일이 존재한다면, 첨부파일이 없을 수도 있으니 조건문 처리
						if(res.fileName.length &amp;gt; 0){
							$(&quot;#att&quot;).val(res.fileName[0]); // 올라간 파일명 보관		
						}
						// 3번 단계 글저장 시작, 기존테이터
						var params = $(&quot;#actionForm&quot;).serialize();
						
						$.ajax({
							url : &quot;ATAction/insert&quot;, //restful api라는게 여기서 시작한다고?
							type : &quot;POST&quot;, 
							dataType: &quot;json&quot;, 
							data: params, 
							success : function(res) { 
								switch(res.msg){
								case &quot;success&quot; : 
									// 카테고리를 유지하고 나머지 정보 초기화
									$(&quot;#page&quot;).val(&quot;1&quot;);
									$(&quot;#searchGbn&quot;).val(&quot;0&quot;);
									$(&quot;#searchTxt&quot;).val(&quot;&quot;);
								
									$(&quot;#backForm&quot;).submit();
									break;
								case &quot;fail&quot; :
									makeAlert(&quot;알림&quot; , &quot;등록에 실패하였습니다.&quot;);
									break;
								case &quot;error&quot; :
									makeAlert(&quot;알림&quot; , &quot;등록 중 문제가 발생하였습니다.&quot;);
									break;
								}
							},
							error : function(request, status, error) { 
								console.log(request.responseText); 
							}
						});  // 글저장 끝
						
					} else { // 문제발생
						makeAlert(&quot;알림&quot;, &quot;파일 업로드에&amp;lt;br/&amp;gt;문제가 발생하였습니다.&quot;)
					}
				},
				error: function () { // 에러시
					makeAlert(&quot;알림&quot;, &quot;파일 업로드에&amp;lt;br/&amp;gt;문제가 발생하였습니다.&quot;)
				}
			}); // ajaxForm 설정 끝
			
			
			// ajaxForm 실행
			form.submit();
			
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;form action=&quot;ATList&quot; id=&quot;backForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; id=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; id=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; id=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
	&amp;lt;!-- 전화면에서 넘어온 카테고리 번호 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;cateNo&quot;value=&quot;${param.cateNo}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;!-- ajax쓰기 때문에 gbn 지움 --&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
	&amp;lt;form action=&quot;fileUploadAjax&quot; id=&quot;actionForm&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
		&amp;lt;input type=&quot;hidden&quot; name=&quot;att&quot; id=&quot;att&quot; /&amp;gt; &amp;lt;!-- 실 저장된 파일명 보관용 --&amp;gt;
		&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;카테고리&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;${cateNm}&amp;lt;input type=&quot;hidden&quot; name=&quot;cateNo&quot;value=&quot;${param.cateNo}&quot;/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot; /&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;${sMemNm}&amp;lt;input type=&quot;hidden&quot; name=&quot;memNo&quot; value=&quot;${sMemNo}&quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th colspan=&quot;2&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th colspan=&quot;2&quot;&amp;gt;&amp;lt;textarea rows=&quot;10&quot; cols=&quot;30&quot; name=&quot;con&quot; id=&quot;con&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;첨부파일&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;file&quot; name=&quot;attFile&quot; /&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/form&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;listBtn&quot;&amp;gt;목록&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;detail.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1661487691582&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- jsl의 functions : el tag 추가옵션 --&amp;gt;
&amp;lt;%@ taglib prefix=&quot;fn&quot; uri=&quot;http://java.sun.com/jsp/jstl/functions&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{
	width: 800px;
	margin: 0 auto;
}
.con{
text-align: left; 
min-height: 400px;
}
&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function() {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;ATList&quot;); 
		$(&quot;#actionForm&quot;).submit();
	});
	
	// ajax사용 예정
	$(&quot;#deleteBtn&quot;).on(&quot;click&quot;, function () {
		  makePopup({
		         title : &quot;알림&quot;,
		         contents : &quot;삭제하시겠습니까?&quot;,
		         // draggable : true,
		         buttons : [{
		            name : &quot;삭제&quot;,
		            func:function() {
		            	var params = $(&quot;#actionForm&quot;).serialize();
		    			
		    			$.ajax({
		    				url : &quot;ATAction/delete&quot;, //restful api라는게 여기서 시작한다고?
		    				type : &quot;POST&quot;, 
		    				dataType: &quot;json&quot;, 
		    				data: params, 
		    				success : function(res) { 
		    					switch(res.msg){
		    					case &quot;success&quot; : 
		    						// 카테고리를 유지하고 나머지 정보 초기화
									$(&quot;#page&quot;).val(&quot;1&quot;);
									$(&quot;#searchGbn&quot;).val(&quot;0&quot;);
									$(&quot;#searchTxt&quot;).val(&quot;&quot;);
								

									$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;ATList&quot;);
									$(&quot;#actionForm&quot;).submit();
		    						break;
		    					case &quot;fail&quot; :
		    						makeAlert(&quot;알림&quot; , &quot;삭제에 실패하였습니다.&quot;);
		    						break;
		    					case &quot;error&quot; :
		    						makeAlert(&quot;알림&quot; , &quot;삭제 중 문제가 발생하였습니다.&quot;);
		    						break;
		    					}
		    				},
		    				error : function(request, status, error) { 
		    					console.log(request.responseText); 
		    				}
		    			});
		            }
		         }, {
		            name : &quot;취소&quot;
		    }]
		});
	});
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;ATUpdate&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;d&quot;&amp;gt; &amp;lt;!-- selRes는 gbn을 받게 되어있어서 값을 추가해줘야함, 이 화면에서는 없어도 됨 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.NO}&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; id=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
		&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot;  id=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot;  id=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
	&amp;lt;!-- 전화면에서 넘어온 카테고리 번호 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;cateNo&quot;value=&quot;${param.cateNo}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;카테고리&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${cateNm}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.NO}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.TITLE}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.MEM_NM}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt; ${data.HIT}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt; ${data.DT}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th colspan=&quot;2&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;td class=&quot;con&quot; colspan=&quot;2&quot;&amp;gt;${data.CON}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;c:if test=&quot;${!empty data.ATT}&quot;&amp;gt;
	&amp;lt;!-- fn:length(대상) : 대상 문자열의 길이나 배열, 리스트의 크기를 가져온다 --&amp;gt;
	&amp;lt;c:set var=&quot;fileLength&quot; value=&quot;${fn:length(data.ATT)}&quot;&amp;gt;&amp;lt;/c:set&amp;gt;
	&amp;lt;!-- fn:substring(값, 숫자1, 숫자2) : 값을 숫자1이상부터, 숫자2미만까지, 인덱스 기준으로 자른다. --&amp;gt;
	&amp;lt;c:set var=&quot;fileName&quot; value=&quot;${fn:substring(data.ATT, 20, fileLength)}&quot;&amp;gt;&amp;lt;/c:set&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;첨부파일&amp;lt;/th&amp;gt;
		&amp;lt;!-- download 없으면 이미지를 브라우저에 띄움, 파일을 안 받고 --&amp;gt;
		&amp;lt;!-- download=&quot;${fileName}&quot; 옵션을 줘야 다운받을때도 파일명으로 받아짐 --&amp;gt;
		&amp;lt;td&amp;gt;&amp;lt;a href=&quot;resouces/upload/${data.ATT}&quot; download=&quot;${fileName}&quot;&amp;gt;${fileName}&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/table&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;listBtn&quot;&amp;gt;목록&amp;lt;/div&amp;gt;
	&amp;lt;c:if test=&quot;${sMemNo eq data.MEM_NO}&quot;&amp;gt;
		&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;deleteBtn&quot;&amp;gt;삭제&amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;updateBtn&quot;&amp;gt;수정&amp;lt;/div&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/div&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;update.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1661487735870&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- jsl의 functions : el tag 추가옵션 --&amp;gt;
&amp;lt;%@ taglib prefix=&quot;fn&quot; uri=&quot;http://java.sun.com/jsp/jstl/functions&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{
	width: 800px;
	margin: 0 auto;
}

.att {
	display: none;
}


&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery.form.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- CKEditor --&amp;gt;
&amp;lt;!-- 제이쿼리 뒤에 나와야함, 제이쿼리 기반으로 동작하기 때문에 --&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/ckeditor/ckeditor.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	// 에디터 연결
	// CKEDITOR.replace(아이디, 옵션)
	CKEDITOR.replace(&quot;con&quot;, {
		resize_enabled: false, // resize_enabled : 크기조절기능 활용여부
		language : &quot;ko&quot;, // 사용언어
		enterMode: &quot;2&quot;, // 엔터키처리방법. 2번이면 &amp;lt;br/&amp;gt;
		width : &quot;100%&quot;, // 숫자일경우 px, 문자열일경우 css크기
		height : 400
	});
	
	$(&quot;#cancelBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#backForm&quot;).submit();
	});
	
	// 첨부파일 파일삭제 버튼 클릭시
	$(&quot;#fileDelBtn&quot;).on(&quot;click&quot;, function () {
		// 기존 파일 내역 영역 제거
		$(&quot;.attOld&quot;).remove();
		// 기존 값 제거
		$(&quot;#att&quot;).val(&quot;&quot;);
		// 파일 선택 영역 제공 
		$(&quot;.att&quot;).show();
	});
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		// CKEditor의 값 취득
		// CKEDITOR.instances[아이디] : CKEditor중 아이디가 같은 것을 찾겠다.
		//.getData() : 작성중인 내용을 취득하겠다.
		$(&quot;#con&quot;).val(CKEDITOR.instances['con'].getData());
		
		if($.trim($(&quot;#title&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;제목 입력하세요.&quot; , function () {
				$(&quot;#title&quot;).focus();
			})
		} else if($.trim($(&quot;#con&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;내용을 입력하세요.&quot; , function () {
				$(&quot;#con&quot;).focus();
			})
		} else {
			// 1. 파입업로드 -&amp;gt; 2. 업로드 파일명 취득 -&amp;gt; 3. 글 저장
			// 폼 객체 취득
			var form = $(&quot;#actionForm&quot;);
			// ajaxForm 적용
			form.ajaxForm({
				success: function (res) { // 데이터 주고 받기 성공시
					if(res.result == &quot;SUCCESS&quot;){ // 파일 전송 성공
						// 올라간 파일이 존재한다면, 첨부파일이 없을 수도 있으니 조건문 처리
						if(res.fileName.length &amp;gt; 0){
							$(&quot;#att&quot;).val(res.fileName[0]); // 올라간 파일명 보관		
						}
						// 3번 단계 글저장 시작, 기존테이터
						var params = $(&quot;#actionForm&quot;).serialize();
						
						$.ajax({
							url : &quot;ATAction/update&quot;, //restful api라는게 여기서 시작한다고?
							type : &quot;POST&quot;, 
							dataType: &quot;json&quot;, 
							data: params, 
							success : function(res) { 
								switch(res.msg){
								case &quot;success&quot; : 
									$('#backForm').submit();
									break;
								case &quot;fail&quot; :
									makeAlert(&quot;알림&quot; , &quot;등록에 실패하였습니다.&quot;);
									break;
								case &quot;error&quot; :
									makeAlert(&quot;알림&quot; , &quot;등록 중 문제가 발생하였습니다.&quot;);
									break;
								}
							},
							error : function(request, status, error) { 
								console.log(request.responseText); 
							}
						});  // 글저장 끝
						
					} else { // 문제발생
						makeAlert(&quot;알림&quot;, &quot;파일 업로드에&amp;lt;br/&amp;gt;문제가 발생하였습니다.&quot;)
					}
				},
				error: function () { // 에러시
					makeAlert(&quot;알림&quot;, &quot;파일 업로드에&amp;lt;br/&amp;gt;문제가 발생하였습니다.&quot;)
				}
			}); // ajaxForm 설정 끝
			
			
			// ajaxForm 실행
			form.submit();
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;form action=&quot;ATDetail&quot; id=&quot;backForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.NO}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;cateNo&quot;value=&quot;${param.cateNo}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;!-- ajax쓰기 때문에 gbn 지움 --&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
	&amp;lt;form action=&quot;fileUploadAjax&quot; id=&quot;actionForm&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.NO}&quot; /&amp;gt;
	&amp;lt;!-- 전화면에서 넘어온 카테고리 번호 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;cateNo&quot;value=&quot;${param.cateNo}&quot;/&amp;gt;
		&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;카테고리&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;${cateNm}&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;${data.NO}&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot; value=&quot;${data.TITLE}&quot;/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;${sMemNm}&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th colspan=&quot;2&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th colspan=&quot;2&quot;&amp;gt;&amp;lt;textarea rows=&quot;10&quot; cols=&quot;30&quot; name=&quot;con&quot; id=&quot;con&quot;&amp;gt;${data.CON}&amp;lt;/textarea&amp;gt;&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;첨부파일&amp;lt;/th&amp;gt;
				&amp;lt;c:choose&amp;gt;
					&amp;lt;c:when test=&quot;${empty data.ATT}&quot;&amp;gt;
						&amp;lt;!-- 파일이 없을때 --&amp;gt;
						&amp;lt;td&amp;gt;
							&amp;lt;input type=&quot;file&quot; name=&quot;attFile&quot; /&amp;gt;
							&amp;lt;input type=&quot;hidden&quot; name=&quot;att&quot; id=&quot;att&quot;/&amp;gt;
						&amp;lt;/td&amp;gt;
					&amp;lt;/c:when&amp;gt;
					&amp;lt;c:otherwise&amp;gt;
					&amp;lt;!-- 파일이 있을때 --&amp;gt;
						&amp;lt;td&amp;gt;
							&amp;lt;span class=&quot;attOld&quot;&amp;gt; &amp;lt;!-- 기존 파일 --&amp;gt;
								&amp;lt;!-- fn:length(대상) : 대상 문자열의 길이나 배열, 리스트의 크기를 가져온다 --&amp;gt;
								&amp;lt;c:set var=&quot;fileLength&quot; value=&quot;${fn:length(data.ATT)}&quot;&amp;gt;&amp;lt;/c:set&amp;gt;
								&amp;lt;!-- fn:substring(값, 숫자1, 숫자2) : 값을 숫자1이상부터, 숫자2미만까지, 인덱스 기준으로 자른다. --&amp;gt;
								&amp;lt;c:set var=&quot;fileName&quot; value=&quot;${fn:substring(data.ATT, 20, fileLength)}&quot;&amp;gt;&amp;lt;/c:set&amp;gt;
								${fileName}
								&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;fileDelBtn&quot;&amp;gt;파일삭제&amp;lt;/div&amp;gt;
							&amp;lt;/span&amp;gt;
							&amp;lt;span class=&quot;att&quot;&amp;gt; &amp;lt;!-- 기존 파일 삭제 후 새 파일 용도 --&amp;gt;
								&amp;lt;input type=&quot;file&quot; name=&quot;attFile&quot; /&amp;gt;
								&amp;lt;input type=&quot;hidden&quot; name=&quot;att&quot; id=&quot;att&quot; value=&quot;${data.ATT}&quot;/&amp;gt;
							&amp;lt;/span&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;/table&amp;gt;
	&amp;lt;/form&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;cancelBtn&quot;&amp;gt;취소&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;updateBtn&quot;&amp;gt;수정&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ATController.java&lt;/p&gt;
&lt;pre id=&quot;code_1661487767165&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.Controller;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.spring.sample.common.service.IPagingService;
import com.spring.sample.web.testa.dao.IACDao;

@Controller
public class ATController {
	@Autowired
	public IACDao iACDao;

	@Autowired
	public IPagingService ips;

	@RequestMapping(value = &quot;/ATList&quot;)
	public ModelAndView ATList(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {

		// 비동기가 되면 일단 아무것도 처음에 셋팅 X,
		// 페이지만 셋팅
		int page = 1;

		if (params.get(&quot;page&quot;) != null &amp;amp;&amp;amp; params.get(&quot;page&quot;) != &quot;&quot;) {
			page = Integer.parseInt(params.get(&quot;page&quot;));
		}

		// 카테고리 목록 취득
		List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; cate = iACDao.getList(&quot;cob.getCateAllList&quot;);

		mav.addObject(&quot;page&quot;, page);
		mav.addObject(&quot;cate&quot;, cate);
		mav.setViewName(&quot;testa/T/list&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/ATListAjax&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String ATListAjax(@RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		// 페이지 받아오게 되어있음
		int cnt = iACDao.getInt(&quot;T.getTCnt&quot;, params);

		HashMap&amp;lt;String, Integer&amp;gt; pd = ips.getPagingData(Integer.parseInt(params.get(&quot;page&quot;)), cnt, 10, 5);

		params.put(&quot;start&quot;, Integer.toString(pd.get(&quot;start&quot;)));
		params.put(&quot;end&quot;, Integer.toString(pd.get(&quot;end&quot;)));

		List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; list = iACDao.getList(&quot;T.getTList&quot;, params);

		model.put(&quot;list&quot;, list);
		model.put(&quot;pd&quot;, pd);

		return mapper.writeValueAsString(model);
	}

	@RequestMapping(value = &quot;/ATInsert&quot;)
	public ModelAndView aTInsert(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {
		String cateNm = iACDao.getString(&quot;cob.getCate&quot;, params);

		mav.addObject(&quot;cateNm&quot;, cateNm);

		mav.setViewName(&quot;testa/T/insert&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/ATAction/{gbn}&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String ATAction(@PathVariable String gbn, @RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		int cnt = 0;

		try {
			switch (gbn) {
			case &quot;insert&quot;:
				cnt = iACDao.insert(&quot;T.insertT&quot;, params);
				break;
			case &quot;update&quot;:
				cnt = iACDao.update(&quot;T.updateT&quot;, params);
				break;
			case &quot;delete&quot;:
				cnt = iACDao.update(&quot;T.deleteT&quot;, params);
				break;
			}

			if (cnt &amp;gt; 0) {
				model.put(&quot;msg&quot;, &quot;success&quot;);
			} else {
				model.put(&quot;msg&quot;, &quot;fail&quot;);
			}
		} catch (Exception e) {
			e.printStackTrace();
			model.put(&quot;msg&quot;, &quot;error&quot;);
		}

		return mapper.writeValueAsString(model);
	}

	// 가져오고 변경되는게 없기 때문에 비동기 처리로 안되도 됨
	@RequestMapping(value = &quot;/ATDetail&quot;)
	public ModelAndView aTDetail(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {
		// 글번호 안 넘어왔을때 처리
		if (params.get(&quot;no&quot;) != null &amp;amp;&amp;amp; params.get(&quot;no&quot;) != &quot;&quot;) {
			// 조회수
			iACDao.update(&quot;T.updateTHit&quot;, params);
			HashMap&amp;lt;String, String&amp;gt; data = iACDao.getMap(&quot;T.getT&quot;, params);

			String cateNm = iACDao.getString(&quot;cob.getCate&quot;, params);

			mav.addObject(&quot;cateNm&quot;, cateNm);

			mav.addObject(&quot;data&quot;, data);

			mav.setViewName(&quot;testa/T/detail&quot;);
		} else {
			mav.setViewName(&quot;redirect:ATList&quot;);
		}

		return mav;
	}

	@RequestMapping(value = &quot;/ATUpdate&quot;)
	public ModelAndView aTUpdate(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {
		// 글번호 안 넘어왔을때 처리
		if (params.get(&quot;no&quot;) != null &amp;amp;&amp;amp; params.get(&quot;no&quot;) != &quot;&quot;) {
			HashMap&amp;lt;String, String&amp;gt; data = iACDao.getMap(&quot;T.getT&quot;, params);

			String cateNm = iACDao.getString(&quot;cob.getCate&quot;, params);

			mav.addObject(&quot;cateNm&quot;, cateNm);

			mav.addObject(&quot;data&quot;, data);

			mav.setViewName(&quot;testa/T/update&quot;);
		} else {
			mav.setViewName(&quot;redirect:ATList&quot;);
		}

		return mav;
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cate_SQL.xml&lt;/p&gt;
&lt;pre id=&quot;code_1661487856950&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;cob&quot;&amp;gt;
	&amp;lt;insert id=&quot;insertOb&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO CATE(CATE_NO, CATE_NM) VALUES (CATE_SEQ.NEXTVAL, #{cateNm})
	&amp;lt;/insert&amp;gt;
	&amp;lt;update id=&quot;updateOb&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE CATE SET CATE_NM = #{cateNm}
		WHERE CATE_NO = #{no}
	&amp;lt;/update&amp;gt;
	&amp;lt;update id=&quot;deleteOb&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE CATE SET DEL = 0
		WHERE CATE_NO = #{no}
	&amp;lt;/update&amp;gt;
	&amp;lt;select id=&quot;getObCnt&quot; parameterType=&quot;hashmap&quot; resultType=&quot;Integer&quot;&amp;gt;
		SELECT COUNT(*) AS CNT
			FROM CATE
		WHERE DEL = 1
		&amp;lt;if test=&quot;searchText != null and searchText != ''&quot;&amp;gt;
			&amp;lt;choose&amp;gt;
			 	&amp;lt;when test=&quot;searchGbn eq 0&quot;&amp;gt;
			 			AND CATE_NO = #{searchText} 
			 	&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 1&quot;&amp;gt;
			 			AND CATE_NM LIKE '%' || #{searchText} || '%'
			 	&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;
	&amp;lt;/select&amp;gt;
	&amp;lt;select id=&quot;getObList&quot; parameterType=&quot;hashmap&quot; resultType=&quot;hashmap&quot;&amp;gt;
		SELECT S.CATE_NO, S.CATE_NM
		FROM(SELECT CATE_NO, CATE_NM, 
		ROW_NUMBER() OVER(ORDER BY CATE_NO DESC, CATE_NM DESC) AS RNK
		FROM CATE
		 WHERE DEL = 1
	      &amp;lt;if test=&quot;searchText != null and searchText != ''&quot;&amp;gt;
				&amp;lt;choose&amp;gt;
				 	&amp;lt;when test=&quot;searchGbn eq 0&quot;&amp;gt;
				 			AND CATE_NO = #{searchText} 
				 	&amp;lt;/when&amp;gt;
					&amp;lt;when test=&quot;searchGbn eq 1&quot;&amp;gt;

				 			AND CATE_NM LIKE '%' || #{searchText} || '%'
				 	&amp;lt;/when&amp;gt;
				&amp;lt;/choose&amp;gt;
			&amp;lt;/if&amp;gt;
	      ) S
		WHERE S.RNK BETWEEN #{start} AND #{end}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;getCateAllList&quot; resultType=&quot;hashmap&quot;&amp;gt;
		SELECT CATE_NO, CATE_NM
		FROM CATE
		WHERE DEL = 1
	&amp;lt;/select&amp;gt;
	
	&amp;lt;!-- 이름 취득용 --&amp;gt;
	&amp;lt;select id=&quot;getCate&quot; parameterType=&quot;hashmap&quot; resultType=&quot;String&quot;&amp;gt;
		SELECT CATE_NM
		FROM CATE
		WHERE DEL = 1
		AND CATE_NO = #{cateNo}
	&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;총 수정한곳 7군데&lt;/p&gt;</description>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/132</guid>
      <comments>https://makeaplayground.tistory.com/132#entry132comment</comments>
      <pubDate>Fri, 26 Aug 2022 13:27:37 +0900</pubDate>
    </item>
    <item>
      <title>국비 TIL(Today I Learned) 20220825 AOP(Aspect Oriented Programming) : 관점지향 프로그래밍</title>
      <link>https://makeaplayground.tistory.com/131</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;오늘의 요약!!!!!!!!!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;오전만에 수업이 끝남 그리고 CRUD 게시판 만드는거 실습&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&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;AOP&lt;/li&gt;
&lt;li&gt;AOP&lt;/li&gt;
&lt;li&gt;AOP&lt;/li&gt;
&lt;/ul&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;&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;&lt;b&gt;AOP(Aspect Oriented Programming) : 관점지향 프로그래밍&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;Advice: 관점 지점 &lt;i&gt;(아래 사진의 검정색, 쪼갠 시점)&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Joinpoint: 진행중인 흐름&lt;i&gt; (아래 사진의 주황색 부분)&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pointcut: 적용 대상&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;1014&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KO1Cy/btrKvPzLPq3/zZTKMGayIohi5MtS1iNxR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KO1Cy/btrKvPzLPq3/zZTKMGayIohi5MtS1iNxR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KO1Cy/btrKvPzLPq3/zZTKMGayIohi5MtS1iNxR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKO1Cy%2FbtrKvPzLPq3%2FzZTKMGayIohi5MtS1iNxR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1014&quot; height=&quot;420&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;420&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;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;858&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHSuRo/btrKwiPaQiT/49KVx2WtjrkdekBrZivbfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHSuRo/btrKwiPaQiT/49KVx2WtjrkdekBrZivbfk/img.png&quot; data-alt=&quot;이런 부분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHSuRo/btrKwiPaQiT/49KVx2WtjrkdekBrZivbfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHSuRo%2FbtrKwiPaQiT%2F49KVx2WtjrkdekBrZivbfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;858&quot; height=&quot;183&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;183&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQbjPE/btrKvQyDs8J/fOhByNMIB7q3bWTzJ87wo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQbjPE/btrKvQyDs8J/fOhByNMIB7q3bWTzJ87wo1/img.png&quot; data-alt=&quot;경로&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQbjPE/btrKvQyDs8J/fOhByNMIB7q3bWTzJ87wo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQbjPE%2FbtrKvQyDs8J%2FfOhByNMIB7q3bWTzJ87wo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;276&quot; height=&quot;382&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;경로&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjD2HD/btrKuucf1oT/tB7LoYklqouVkGG0Bqe0Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjD2HD/btrKuucf1oT/tB7LoYklqouVkGG0Bqe0Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjD2HD/btrKuucf1oT/tB7LoYklqouVkGG0Bqe0Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjD2HD%2FbtrKuucf1oT%2FtB7LoYklqouVkGG0Bqe0Xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1175&quot; height=&quot;284&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2faxS/btrKvGbLwPO/Cxp2DAq4zj6M6zcSnYYC0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2faxS/btrKvGbLwPO/Cxp2DAq4zj6M6zcSnYYC0K/img.png&quot; data-alt=&quot;예전에는 이렇게 썼다. 지금은 안 써서 주석처리해놓으심&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2faxS/btrKvGbLwPO/Cxp2DAq4zj6M6zcSnYYC0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2faxS%2FbtrKvGbLwPO%2FCxp2DAq4zj6M6zcSnYYC0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;78&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;78&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4yp7v/btrKuHJhfk9/ruPBC0yRELvqz73ZAEqpv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4yp7v/btrKuHJhfk9/ruPBC0yRELvqz73ZAEqpv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4yp7v/btrKuHJhfk9/ruPBC0yRELvqz73ZAEqpv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4yp7v%2FbtrKuHJhfk9%2FruPBC0yRELvqz73ZAEqpv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;326&quot; height=&quot;316&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SgsAY/btrKvFRsB6K/qZggrBNWShpkFPyT3uK2Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SgsAY/btrKvFRsB6K/qZggrBNWShpkFPyT3uK2Nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SgsAY/btrKvFRsB6K/qZggrBNWShpkFPyT3uK2Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSgsAY%2FbtrKvFRsB6K%2FqZggrBNWShpkFPyT3uK2Nk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;369&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://araikuma.tistory.com/309&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://araikuma.tistory.com/309&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1661402344988&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] AspectJ 이용&quot; data-og-description=&quot;AOP를 실현하는 것으로, Java에서는 &amp;quot;AspectJ&amp;quot;라는 라이브러리가 널리 사용되고 있다. Spring AOP에서이 AspectJ를 이용한 AOP 처리에 대해 설명한다. AspectJ와 pom.xml 수정 AOP에 대해 조사해 보면, 아마 &amp;quot;Aspe..&quot; data-og-host=&quot;araikuma.tistory.com&quot; data-og-source-url=&quot;https://araikuma.tistory.com/309&quot; data-og-url=&quot;https://araikuma.tistory.com/309&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/w01cJ/hyPzqHHsd9/iBJbUGtWxPEBk0ldiYSwU0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cvwagO/hyPzzkqASK/QuezL137kgKk1v59OkJmuk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://araikuma.tistory.com/309&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://araikuma.tistory.com/309&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/w01cJ/hyPzqHHsd9/iBJbUGtWxPEBk0ldiYSwU0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cvwagO/hyPzzkqASK/QuezL137kgKk1v59OkJmuk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring] AspectJ 이용&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AOP를 실현하는 것으로, Java에서는 &quot;AspectJ&quot;라는 라이브러리가 널리 사용되고 있다. Spring AOP에서이 AspectJ를 이용한 AOP 처리에 대해 설명한다. AspectJ와 pom.xml 수정 AOP에 대해 조사해 보면, 아마 &quot;Aspe..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;araikuma.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MJe2v/btrKuVOpo0h/1uzAlJBel2CWkztjRsZMK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MJe2v/btrKuVOpo0h/1uzAlJBel2CWkztjRsZMK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MJe2v/btrKuVOpo0h/1uzAlJBel2CWkztjRsZMK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMJe2v%2FbtrKuVOpo0h%2F1uzAlJBel2CWkztjRsZMK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;75&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AspectJ에 대한 설정이 pom.xml에 있음!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dS1B2Y/btrKuuqfMj3/4526VS5QU6Jfqt9VHQfobK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dS1B2Y/btrKuuqfMj3/4526VS5QU6Jfqt9VHQfobK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dS1B2Y/btrKuuqfMj3/4526VS5QU6Jfqt9VHQfobK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdS1B2Y%2FbtrKuuqfMj3%2F4526VS5QU6Jfqt9VHQfobK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;838&quot; height=&quot;405&quot; data-origin-width=&quot;838&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 &lt;span style=&quot;color: #000000;&quot;&gt;AOPComponent&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4If8m/btrKuSjuy3Q/QmmKss9X9eEJ1ITfEVqd11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4If8m/btrKuSjuy3Q/QmmKss9X9eEJ1ITfEVqd11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4If8m/btrKuSjuy3Q/QmmKss9X9eEJ1ITfEVqd11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4If8m%2FbtrKuSjuy3Q%2FQmmKss9X9eEJ1ITfEVqd11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;778&quot; height=&quot;92&quot; data-origin-width=&quot;778&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;span style=&quot;color: #ef5369;&quot;&gt;생각해보니, 서버 실행될때, 콘솔창이 testAOP() 뜨는 거 많이 봄!!!&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;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;AOPComponent.java&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1661388650113&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.common.component;

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.ModelAndView;

@Aspect // AOP용 클래스
@Component // 객체 생성
@EnableAspectJAutoProxy // AspectJ 기능 활성화
public class AOPComponent {
	// Pointcut -&amp;gt; 적용범위
	// @Pointcut(범위설정)
	/*
	 * 범위 
	 * execution -&amp;gt; include필터 나 포함할래
	 * !execution -&amp;gt; exclude필터 나 포함 안할래 
	 * * -&amp;gt; 모든것
	 * *(..) -&amp;gt; 모든 메소드 
	 * .. -&amp;gt; 모든 경로
	 *  &amp;amp;&amp;amp;, || -&amp;gt; 필터 추가
	 *  
	 *  execution(접근권환 반환타입 범위): 접근권한의 경우 필수가 아님
	 */
	
	// com.spring.sample.. 밑에 있는 모든 경로(..)에서 HomeController를 찾고, 모든 메서드인데, 인자도 상관없어
	@Pointcut(&quot;execution(* com.spring.sample..HomeController.*(..))&quot;)
	public void testAOP() { // 내용이 없어서 void로 하면 되고, pointcut의 이름과 같은 역활
	}

	// ProceedingJoinPoint -&amp;gt; 대상 적용 이벤트 필터, 진행중인 현재상태
	/*
	 * Advice
	 * @Before -&amp;gt; 메소드 실행 전
	 * 
	 * @After -&amp;gt; 메소드 실행 후
	 * 
	 * @After-returning -&amp;gt; 메소드 정상실행 후
	 * 
	 * @After-throwing -&amp;gt; 메소드 예외 발생 후
	 * 
	 * @Around -&amp;gt; 모든 동작시점
	 */
	@Around(&quot;testAOP()&quot;) //&quot;execution(* com.spring.sample..HomeController.*(..))&quot; 한테서  @Around 모든 동작 시점에 체크해볼래
	public ModelAndView testAOP(ProceedingJoinPoint joinPoint) throws Throwable {
		ModelAndView mav = new ModelAndView();

		// Request 객체 취득
		// RequestContextHolder 
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
				.getRequest();

		mav = (ModelAndView) joinPoint.proceed(); // 기존 이벤트 처리 행위를 이어서 진행

		System.out.println(&quot;------- testAOP 실행됨 ------&quot;);

		return mav;
	}
}&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://engkimbs.tistory.com/746&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://engkimbs.tistory.com/746&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1661389458852&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] 스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP&quot; data-og-description=&quot;| 스프링 AOP ( Aspect Oriented Programming ) AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으..&quot; data-og-host=&quot;engkimbs.tistory.com&quot; data-og-source-url=&quot;https://engkimbs.tistory.com/746&quot; data-og-url=&quot;https://engkimbs.tistory.com/746&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bBue2Y/hyPzwAQNwG/HxRrhTOye5BBEO5kFYkgv0/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/bqcGcb/hyPzwHDXif/Jg5OJEkkPOJM2hAlANxmLK/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/b72cZN/hyPznqp5Zi/rgPtLPZ0AoJocy2JcIi4xk/img.png?width=443&amp;amp;height=500&amp;amp;face=0_0_443_500&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/746&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engkimbs.tistory.com/746&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bBue2Y/hyPzwAQNwG/HxRrhTOye5BBEO5kFYkgv0/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/bqcGcb/hyPzwHDXif/Jg5OJEkkPOJM2hAlANxmLK/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/b72cZN/hyPznqp5Zi/rgPtLPZ0AoJocy2JcIi4xk/img.png?width=443&amp;amp;height=500&amp;amp;face=0_0_443_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring] 스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;| 스프링 AOP ( Aspect Oriented Programming ) AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engkimbs.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sjh836.tistory.com/157&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://sjh836.tistory.com/157&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1661389464150&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Spring AOP (개념, 용어, 원리, 포인트컷 표현식, JoinPoint API)&quot; data-og-description=&quot;1. AOP란? Aspect Oriented Programming 의 약자로 관점지향 프로그래밍이라고 부른다. IoC가 낮은 결합도와 관련된 것이라면 AOP 는 높은 응집도와 관련되어 있다. 서비스들의 비즈니스 메소드들은 복잡한 &quot; data-og-host=&quot;sjh836.tistory.com&quot; data-og-source-url=&quot;https://sjh836.tistory.com/157&quot; data-og-url=&quot;https://sjh836.tistory.com/157&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b6H91W/hyPzn40B75/o6SOeGk1697fzxoGhBVSkK/img.jpg?width=504&amp;amp;height=272&amp;amp;face=0_0_504_272,https://scrap.kakaocdn.net/dn/c6Zgtf/hyPzkHfv7F/ljcnzkJguQrpLUFosgWKt0/img.jpg?width=504&amp;amp;height=272&amp;amp;face=0_0_504_272,https://scrap.kakaocdn.net/dn/dmlTt8/hyPzq8txmG/yosxLxzhfi1lQRxKlLmOKK/img.jpg?width=504&amp;amp;height=272&amp;amp;face=0_0_504_272&quot;&gt;&lt;a href=&quot;https://sjh836.tistory.com/157&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sjh836.tistory.com/157&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b6H91W/hyPzn40B75/o6SOeGk1697fzxoGhBVSkK/img.jpg?width=504&amp;amp;height=272&amp;amp;face=0_0_504_272,https://scrap.kakaocdn.net/dn/c6Zgtf/hyPzkHfv7F/ljcnzkJguQrpLUFosgWKt0/img.jpg?width=504&amp;amp;height=272&amp;amp;face=0_0_504_272,https://scrap.kakaocdn.net/dn/dmlTt8/hyPzq8txmG/yosxLxzhfi1lQRxKlLmOKK/img.jpg?width=504&amp;amp;height=272&amp;amp;face=0_0_504_272');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spring AOP (개념, 용어, 원리, 포인트컷 표현식, JoinPoint API)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. AOP란? Aspect Oriented Programming 의 약자로 관점지향 프로그래밍이라고 부른다. IoC가 낮은 결합도와 관련된 것이라면 AOP 는 높은 응집도와 관련되어 있다. 서비스들의 비즈니스 메소드들은 복잡한&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sjh836.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;&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;pointcut 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TSqUH/btrKtAxcFka/mdpBkz5qlrR8V9ZDnsh4dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TSqUH/btrKtAxcFka/mdpBkz5qlrR8V9ZDnsh4dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TSqUH/btrKtAxcFka/mdpBkz5qlrR8V9ZDnsh4dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTSqUH%2FbtrKtAxcFka%2FmdpBkz5qlrR8V9ZDnsh4dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;884&quot; height=&quot;397&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cERuxF/btrKsPnrtj8/kF2dEkIkMqbNjYwZV37m40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cERuxF/btrKsPnrtj8/kF2dEkIkMqbNjYwZV37m40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cERuxF/btrKsPnrtj8/kF2dEkIkMqbNjYwZV37m40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcERuxF%2FbtrKsPnrtj8%2FkF2dEkIkMqbNjYwZV37m40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;868&quot; height=&quot;130&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;130&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;59&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwpCwA/btrKvFqnwUf/vsk3ncKGwqrnrW4dKXiZbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwpCwA/btrKvFqnwUf/vsk3ncKGwqrnrW4dKXiZbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwpCwA/btrKvFqnwUf/vsk3ncKGwqrnrW4dKXiZbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwpCwA%2FbtrKvFqnwUf%2Fvsk3ncKGwqrnrW4dKXiZbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;793&quot; height=&quot;59&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;59&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9ASkw/btrKxRjk78c/jwEBCInm4MpIbXwC7jItf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9ASkw/btrKxRjk78c/jwEBCInm4MpIbXwC7jItf1/img.png&quot; data-alt=&quot;pointcut atAOP() 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9ASkw/btrKxRjk78c/jwEBCInm4MpIbXwC7jItf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9ASkw%2FbtrKxRjk78c%2FjwEBCInm4MpIbXwC7jItf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1138&quot; height=&quot;457&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pointcut atAOP() 추가&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;span style=&quot;color: #000000;&quot;&gt;AOPComponent.java &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;atAOP 추가 이후 전체코드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1661391224402&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.common.component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.ModelAndView;

@Aspect // AOP용 클래스
@Component // 객체 생성
@EnableAspectJAutoProxy // AspectJ 기능 활성화
public class AOPComponent {
	// Pointcut -&amp;gt; 적용범위
	// @Pointcut(범위설정)
	/*
	 * 범위 execution -&amp;gt; include필터 나 포함할래 
	 * !execution -&amp;gt; exclude필터 나 포함 안할래 
	 * * -&amp;gt; 모든것
	 * *(..) -&amp;gt; 모든 메소드 
	 * .. -&amp;gt; 모든 경로 
	 * &amp;amp;&amp;amp;, || -&amp;gt; 필터 추가
	 * 
	 * execution(접근권환 반환타입 범위): 접근권한의 경우 필수가 아님
	 */

	// com.spring.sample.. 밑에 있는 모든 경로(..)에서 HomeController를 찾고, 모든 메서드인데, 인자도 상관없어
	@Pointcut(&quot;execution(* com.spring.sample..HomeController.*(..))&quot;)
	public void testAOP() { // 내용이 없어서 void로 하면 되고, pointcut의 이름과 같은 역활
	}

	// ProceedingJoinPoint -&amp;gt; 대상 적용 이벤트 필터, 진행중인 현재상태
	/*
	 * Advice
	 * 
	 * @Before -&amp;gt; 메소드 실행 전
	 * 
	 * @After -&amp;gt; 메소드 실행 후
	 * 
	 * @After-returning -&amp;gt; 메소드 정상실행 후
	 * 
	 * @After-throwing -&amp;gt; 메소드 예외 발생 후
	 * 
	 * @Around -&amp;gt; 모든 동작시점
	 */
	@Around(&quot;testAOP()&quot;) // &quot;execution(* com.spring.sample..HomeController.*(..))&quot; 한테서 @Around 모든 동작 시점에
							// 체크해볼래
	public ModelAndView testAOP(ProceedingJoinPoint joinPoint) throws Throwable {
		ModelAndView mav = new ModelAndView();

		// Request 객체 취득
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
				.getRequest();

		mav = (ModelAndView) joinPoint.proceed(); // 기존 이벤트 처리 행위를 이어서 진행

		System.out.println(&quot;------- testAOP 실행됨 ------&quot;);

		return mav;
	}

	// pointcut 여러개 써도됨
	// 이렇게 했을때 AJAX를 문제, Ajax는 결국 string을 돌려주는데 우리는 지금 ModelAndView로 돌려주게 해놨기 때문에 따로
	// 처리해야함
	@Pointcut(&quot;execution(* com.spring.sample..Controller.ATController.*Insert(..))&quot;
			+ &quot;|| execution(* com.spring.sample..Controller.ATController.*Update(..))&quot;)
	public void atAOP() {
	}

	@Around(&quot;atAOP()&quot;) // atAOP()를 가져와서 써
	public ModelAndView atAOP(ProceedingJoinPoint joinPoint) throws Throwable {
		ModelAndView mav = new ModelAndView();

		// Request 객체 취득
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
				.getRequest();

		HttpSession session = request.getSession();

		if (session.getAttribute(&quot;sMemNm&quot;) != null &amp;amp;&amp;amp; session.getAttribute(&quot;sMemNm&quot;) != &quot;&quot;) { // 로그인 중인 경우
			mav = (ModelAndView) joinPoint.proceed(); // 기존 이벤트 처리 행위를 이어서 진행
		} else { // 비 로그인의 경우
			mav.setViewName(&quot;redirect:testALogin&quot;);
		}
		return mav;
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aop건 이후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ATController의 insert부분&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHSuRo/btrKwiPaQiT/49KVx2WtjrkdekBrZivbfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHSuRo/btrKwiPaQiT/49KVx2WtjrkdekBrZivbfk/img.png&quot; data-alt=&quot;기존&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHSuRo/btrKwiPaQiT/49KVx2WtjrkdekBrZivbfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHSuRo%2FbtrKwiPaQiT%2F49KVx2WtjrkdekBrZivbfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;858&quot; height=&quot;183&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기존&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cifqkL/btrKrrtwI1Z/l0saf4KmGsKDwYQeezUU4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cifqkL/btrKrrtwI1Z/l0saf4KmGsKDwYQeezUU4k/img.png&quot; data-alt=&quot;변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cifqkL/btrKrrtwI1Z/l0saf4KmGsKDwYQeezUU4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcifqkL%2FbtrKrrtwI1Z%2Fl0saf4KmGsKDwYQeezUU4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;475&quot; height=&quot;148&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;148&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;&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;276&quot; data-origin-height=&quot;37&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Li3ok/btrKyrLC8ZU/Occi0gTT098R0kLmWkNOE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Li3ok/btrKyrLC8ZU/Occi0gTT098R0kLmWkNOE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Li3ok/btrKyrLC8ZU/Occi0gTT098R0kLmWkNOE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLi3ok%2FbtrKyrLC8ZU%2FOcci0gTT098R0kLmWkNOE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;276&quot; height=&quot;37&quot; data-origin-width=&quot;276&quot; data-origin-height=&quot;37&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;30&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mYgaN/btrKwcVPBlX/J9uGq1P3V1VuavVksyCVOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mYgaN/btrKwcVPBlX/J9uGq1P3V1VuavVksyCVOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mYgaN/btrKwcVPBlX/J9uGq1P3V1VuavVksyCVOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmYgaN%2FbtrKwcVPBlX%2FJ9uGq1P3V1VuavVksyCVOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;29&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;30&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ATinsert, ATUpdate에 들어갈려고 하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDkrl9/btrKux71sgF/UvEZKmyTgmqPVBjn8suyz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDkrl9/btrKux71sgF/UvEZKmyTgmqPVBjn8suyz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDkrl9/btrKux71sgF/UvEZKmyTgmqPVBjn8suyz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDkrl9%2FbtrKux71sgF%2FUvEZKmyTgmqPVBjn8suyz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;410&quot; height=&quot;92&quot; data-origin-width=&quot;410&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ATController.java&lt;/p&gt;
&lt;pre id=&quot;code_1661393491654&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.Controller;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.spring.sample.common.service.IPagingService;
import com.spring.sample.web.testa.dao.IACDao;

@Controller
public class ATController {
	@Autowired
	public IACDao iACDao;

	@Autowired
	public IPagingService ips;

	@RequestMapping(value = &quot;/ATList&quot;)
	public ModelAndView ATList(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) {

		// 비동기가 되면 일단 아무것도 처음에 셋팅 X,
		// 페이지만 셋팅
		int page = 1;

		if (params.get(&quot;page&quot;) != null &amp;amp;&amp;amp; params.get(&quot;page&quot;) != &quot;&quot;) {
			page = Integer.parseInt(params.get(&quot;page&quot;));
		}

		mav.addObject(&quot;page&quot;, page);
		mav.setViewName(&quot;testa/T/list&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/ATListAjax&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String ATListAjax(@RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		// 페이지 받아오게 되어있음
		int cnt = iACDao.getInt(&quot;T.getTCnt&quot;, params);

		HashMap&amp;lt;String, Integer&amp;gt; pd = ips.getPagingData(Integer.parseInt(params.get(&quot;page&quot;)), cnt, 10, 5);

		params.put(&quot;start&quot;, Integer.toString(pd.get(&quot;start&quot;)));
		params.put(&quot;end&quot;, Integer.toString(pd.get(&quot;end&quot;)));

		List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; list = iACDao.getList(&quot;T.getTList&quot;, params);

		model.put(&quot;list&quot;, list);
		model.put(&quot;pd&quot;, pd);

		return mapper.writeValueAsString(model);
	}

	@RequestMapping(value = &quot;/ATInsert&quot;)
	public ModelAndView aTInsert(ModelAndView mav) {

		mav.setViewName(&quot;testa/T/insert&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/ATAction/{gbn}&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String ATAction(@PathVariable String gbn, @RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		int cnt = 0;

		try {
			switch (gbn) {
			case &quot;insert&quot;:
				cnt = iACDao.insert(&quot;T.insertT&quot;, params);
				break;
			case &quot;update&quot;:
				cnt = iACDao.update(&quot;T.updateT&quot;, params);
				break;
			case &quot;delete&quot;:
				cnt = iACDao.update(&quot;T.deleteT&quot;, params);
				break;
			}

			if (cnt &amp;gt; 0) {
				model.put(&quot;msg&quot;, &quot;success&quot;);
			} else {
				model.put(&quot;msg&quot;, &quot;fail&quot;);
			}
		} catch (Exception e) {
			e.printStackTrace();
			model.put(&quot;msg&quot;, &quot;error&quot;);
		}

		return mapper.writeValueAsString(model);
	}

	// 가져오고 변경되는게 없기 때문에 비동기 처리로 안되도 됨
	@RequestMapping(value = &quot;/ATDetail&quot;)
	public ModelAndView aTDetail(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {
		// 글번호 안 넘어왔을때 처리
		if (params.get(&quot;no&quot;) != null &amp;amp;&amp;amp; params.get(&quot;no&quot;) != &quot;&quot;) {
			// 조회수
			iACDao.update(&quot;T.updateTHit&quot;, params);
			HashMap&amp;lt;String, String&amp;gt; data = iACDao.getMap(&quot;T.getT&quot;, params);

			mav.addObject(&quot;data&quot;, data);

			mav.setViewName(&quot;testa/T/detail&quot;);
		} else {
			mav.setViewName(&quot;redirect:ATList&quot;);
		}

		return mav;
	}

	@RequestMapping(value = &quot;/ATUpdate&quot;)
	public ModelAndView aTUpdate(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {
		// 글번호 안 넘어왔을때 처리
		if (params.get(&quot;no&quot;) != null &amp;amp;&amp;amp; params.get(&quot;no&quot;) != &quot;&quot;) {
			HashMap&amp;lt;String, String&amp;gt; data = iACDao.getMap(&quot;T.getT&quot;, params);

			mav.addObject(&quot;data&quot;, data);

			mav.setViewName(&quot;testa/T/update&quot;);
		} else {
			mav.setViewName(&quot;redirect:ATList&quot;);
		}

		return mav;
	}

}&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;&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;TBOARD테이블 수정 CATE_NO 컬럼 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;587&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gsda5/btrKwFwJ6sd/Hqt8qCnwk8ZwJEJStKRbm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gsda5/btrKwFwJ6sd/Hqt8qCnwk8ZwJEJStKRbm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gsda5/btrKwFwJ6sd/Hqt8qCnwk8ZwJEJStKRbm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGsda5%2FbtrKwFwJ6sd%2FHqt8qCnwk8ZwJEJStKRbm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;778&quot; height=&quot;587&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;587&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;CATE테이블 만듬&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nDUpV/btrKuHCAjLx/J0QKWX0Jmto27zcsnat1q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nDUpV/btrKuHCAjLx/J0QKWX0Jmto27zcsnat1q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nDUpV/btrKuHCAjLx/J0QKWX0Jmto27zcsnat1q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnDUpV%2FbtrKuHCAjLx%2FJ0QKWX0Jmto27zcsnat1q1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;111&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lppLr/btrKvihScqx/N9l3pGgvUBm7tfG6lMHhB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lppLr/btrKvihScqx/N9l3pGgvUBm7tfG6lMHhB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lppLr/btrKvihScqx/N9l3pGgvUBm7tfG6lMHhB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlppLr%2FbtrKvihScqx%2FN9l3pGgvUBm7tfG6lMHhB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;784&quot; height=&quot;592&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5IIM9/btrKuIBsbgT/10ybFCdkF7r9netIjcy811/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5IIM9/btrKuIBsbgT/10ybFCdkF7r9netIjcy811/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5IIM9/btrKuIBsbgT/10ybFCdkF7r9netIjcy811/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5IIM9%2FbtrKuIBsbgT%2F10ybFCdkF7r9netIjcy811%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;585&quot; data-origin-width=&quot;787&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;CATE 테이블이랑 TBOARD랑 외래키 설정&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNpIXv/btrKwHadFUv/nHCovWKkYFrFiqwvHRSSEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNpIXv/btrKwHadFUv/nHCovWKkYFrFiqwvHRSSEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNpIXv/btrKwHadFUv/nHCovWKkYFrFiqwvHRSSEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNpIXv%2FbtrKwHadFUv%2FnHCovWKkYFrFiqwvHRSSEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;394&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;394&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CRUD게시판 만들기 실습(한줄 게시판 느낌으로 만듬, 강사님이랑 같이 한건 아님)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ACateController.java&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1661401252658&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.Controller;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.spring.sample.common.service.IPagingService;
import com.spring.sample.web.testa.dao.IACDao;

@Controller
public class ACateController {
	@Autowired
	public IACDao dao;

	@Autowired
	public IPagingService ips;

	// DB안 붙으니 예외처리 x
	@RequestMapping(value = &quot;ACOB&quot;)
	public ModelAndView aob(ModelAndView mav) {
		mav.setViewName(&quot;testa/Cate/cob&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/ACOBAction/{gbn}&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String AOBAction(@PathVariable String gbn, @RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		int cnt = 0;

		try {
			switch (gbn) {
			case &quot;insert&quot;:
				cnt = dao.insert(&quot;cob.insertOb&quot;, params);
				break;
			case &quot;update&quot;:
				cnt = dao.update(&quot;cob.updateOb&quot;, params);
				break;
			case &quot;delete&quot;:
				cnt = dao.update(&quot;cob.deleteOb&quot;, params);
				break;
			}

			if (cnt &amp;gt; 0) {
				model.put(&quot;msg&quot;, &quot;success&quot;);
			} else {
				model.put(&quot;msg&quot;, &quot;fail&quot;);
			}
		} catch (Exception e) {
			e.printStackTrace();
			model.put(&quot;msg&quot;, &quot;error&quot;);
		}

		return mapper.writeValueAsString(model);
	}

	@RequestMapping(value = &quot;/ACOBList&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String AOBList(@RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		// 페이지 받아오게 되어있음
		int cnt = dao.getInt(&quot;cob.getObCnt&quot;, params);

		HashMap&amp;lt;String, Integer&amp;gt; pd = ips.getPagingData(Integer.parseInt(params.get(&quot;page&quot;)), cnt, 10, 5);

		params.put(&quot;start&quot;, Integer.toString(pd.get(&quot;start&quot;)));
		params.put(&quot;end&quot;, Integer.toString(pd.get(&quot;end&quot;)));

		List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; list = dao.getList(&quot;cob.getObList&quot;, params);

		model.put(&quot;list&quot;, list);
		model.put(&quot;pd&quot;, pd);

		return mapper.writeValueAsString(model);
	}
}&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;cob.jsp&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1661401296178&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{ 
	width: 600px; 
	margin: 0 auto;
}
.mtb{
	margin: 5px;
}
.login{
	vertical-align: baseline;
}
.cateNm{
	width: calc(100% - 22px); 
	height: 40px; 
	border: 1px solid #d7d7d7; 
	resize: none; 
	padding: 10px
}

.update{
	display: none;
}
.con_td{
	font-size: 0
}
.paging_area{
	display: block; 
	position: relative; 
	left: 0;
	margin-bottom: 10px;
}
.search_area{
	text-align: center;
}
body {
	overflow: auto;
}
&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- Slimscroll --&amp;gt;
&amp;lt;!-- &amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery.slimscroll.js&quot;&amp;gt;&amp;lt;/script&amp;gt; --&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {

	
	reloadList();
	
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
	 		if($.trim($(&quot;#cateNm&quot;).val()) == &quot;&quot;){
				makeAlert(&quot;알림&quot;,&quot;카테고리를 입력하세요.&quot; , function () {
					$(&quot;#cateNm&quot;).focus();
				});
	 		}	else {
	 				action(&quot;insert&quot;);
			}
	
		})
		
	// 페이징 클릭시
	$(&quot;.paging_area&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));
		//기존 값 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchText&quot;).val($(&quot;#oldText&quot;).val());
		
		reloadList();
	})	
		
	// 검색 클릭시
	$(&quot;#searchBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#page&quot;).val(&quot;1&quot;);
		//기존 값 새값으로 변경
		$(&quot;#oldGbn&quot;).val($(&quot;#searchGbn&quot;).val());
		$(&quot;#oldText&quot;).val($(&quot;#searchText&quot;).val());
		
		reloadList();
	})
	
	// 목록의 삭제버튼 클릭시
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;.delete_btn&quot;, function () {
		var no = $(this).parent().parent().attr(&quot;no&quot;);
		
		  makePopup({
		         title : &quot;알림&quot;,
		         contents : &quot;삭제하시겠습니까?&quot;,
		         // draggable : true,
		         buttons : [{
		            name : &quot;삭제&quot;,
		            func:function() {
		            	$(&quot;#no&quot;).val(no);
		            	action(&quot;delete&quot;);
		            	closePopup(); // 제일 위의 팝업 닫기
		            }
		         }, {
		            name : &quot;취소&quot;
		    }]
		})
	})
	
	// 목록 수정버튼 클릭시
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;.update_btn&quot;, function () {
		var no = $(this).parent().parent().attr(&quot;no&quot;);
		$(&quot;#no&quot;).val(no);

		
		//eq(인덱스번호) : 자식들 중 인덱스 몇번째 인지 찾아서 취득
		var con = $(this).parent().parent().children().eq(1).html();
		// 수정 내용 넣기 전 &amp;lt;&amp;gt; 변화
		con = con.replace(/&amp;amp;lt;/gi, &quot;&amp;lt;&quot;);
		con = con.replace(/&amp;amp;gt;/gi, &quot;&amp;gt;&quot;);
		
		
		$(&quot;#cateNm&quot;).val(con);
		
		
		// 등록버튼 감추기 + 수정, 취소버튼 나타나기
		$(&quot;.insert&quot;).hide();
		$(&quot;.update&quot;).show();
		
		// 작성영역에 포커스
		$(&quot;#cateNm&quot;).focus();
	})
	
	// 수정 영역의 취소버튼
	$(&quot;thead #cancelBtn&quot;).on(&quot;click&quot;, function () {
		// 입력내용 초기화
		$(&quot;#no&quot;).val(&quot;&quot;);
		$(&quot;#cateNm&quot;).val(&quot;&quot;);
		// 등록버튼 나타나기 + 수정, 취소버튼 감추기
		$(&quot;.insert&quot;).show();
		$(&quot;.update&quot;).hide();
	})
	
	// 수정 영역의 수정버튼
	$(&quot;thead #updateBtn&quot;).on(&quot;click&quot;, function () {
		action(&quot;update&quot;);
		console.log(&quot;1&quot;);
	})
	
})


var msg ={
	&quot;insert&quot; : &quot;등록&quot;,
	&quot;update&quot; : &quot;수정&quot;,
	&quot;delete&quot; : &quot;삭제&quot;,
}

function action(flag) {
	// con의 &amp;lt;를을 웹문자로 변환
	$(&quot;#cateNm&quot;).val($(&quot;#cateNm&quot;).val().replace(/&amp;lt;/gi, &quot;&amp;amp;lt;&quot;));
	// con의 &amp;gt;를을 웹문자로 변환
	$(&quot;#cateNm&quot;).val($(&quot;#cateNm&quot;).val().replace(/&amp;gt;/gi, &quot;&amp;amp;gt;&quot;));
	
	
	// Javascript object에서의 [] : 해당 키값으로 내용을 불러오거나 넣을 수있다. 
	// Java의 Map에서 get, put역활
	console.log(msg[flag]);
	
	var params = $(&quot;#actionForm&quot;).serialize();
	
	$.ajax({
		url : &quot;ACOBAction/&quot; + flag,
		type : &quot;POST&quot;, 
		dataType: &quot;json&quot;, 
		data: params, 
		success : function(res) { 
			switch(res.msg){
			case &quot;success&quot; :
				// 내용 초기화
				$(&quot;#cateNm&quot;).val(&quot;&quot;);
				$(&quot;#no&quot;).val(&quot;&quot;);

				// 목록 재조회
				switch(flag){
				case &quot;insert&quot; :
				case &quot;delete&quot; :
					// 조회 데이터 초기화
					$(&quot;#page&quot;).val(&quot;1&quot;);
					$(&quot;#searchGbn&quot;).val(&quot;0&quot;);
					$(&quot;#searchText&quot;).val(&quot;&quot;);
					$(&quot;#oldGbn&quot;).val(&quot;0&quot;);
					$(&quot;#oldText&quot;).val(&quot;&quot;);
					break;
				case &quot;update&quot; :
					// 기존값 유지
					$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
					$(&quot;#searchText&quot;).val($(&quot;#oldText&quot;).val());

					// 입력내용 초기화
					$(&quot;#no&quot;).val(&quot;&quot;);
					$(&quot;#cateNm&quot;).val(&quot;&quot;);
					// 등록버튼 나타나기 + 수정, 취소버튼 감추기
					$(&quot;.insert&quot;).show();
					$(&quot;.update&quot;).hide();
					break;
					
			
				}
				reloadList();
				break;
			case &quot;fail&quot; :
				makeAlert(&quot;알림&quot; ,  msg[flag] + &quot;에 실패하였습니다.&quot;);
				break;
			case &quot;error&quot; :
				makeAlert(&quot;알림&quot; , msg[flag] + &quot; 중 문제가 발생하였습니다.&quot;);
				break;
			}
		},
		error : function(request, status, error) { 
			console.log(request.responseText); 
		}
	}); //Ajax End
} // action Function End

function reloadList() {
	var params = $(&quot;#searchForm&quot;).serialize();
	$.ajax({
		url : &quot;ACOBList&quot;,
		type : &quot;POST&quot;, 
		dataType: &quot;json&quot;, 
		data: params, 
		success : function(res) { 
			drawList(res.list);
			drawPaging(res.pd);
		},
		error : function(request, status, error) { 
			console.log(request.responseText); 
		}
	}); //Ajax End
}

function drawList(list) {
	var html = &quot;&quot;;
	
	for(var data of list){
		html +=&quot;&amp;lt;tr no=\&quot;&quot; + data.CATE_NO  + &quot;\&quot;&amp;gt;&quot;;
		html +=&quot;&amp;lt;td&amp;gt;&quot; + data.CATE_NO + &quot;&amp;lt;/td&amp;gt;&quot;;
		html +=&quot;&amp;lt;td&amp;gt;&quot; + data.CATE_NM + &quot;&amp;lt;/td&amp;gt;&quot;;
		html +=&quot;&amp;lt;td&amp;gt;&quot;;
			html +=&quot;&amp;lt;div class=\&quot;cmn_btn_ml mtb update_btn\&quot;&amp;gt;수정&amp;lt;/div&amp;gt;&amp;lt;br/&amp;gt;&quot;;
			html +=&quot;&amp;lt;div class=\&quot;cmn_btn_ml mtb delete_btn\&quot;&amp;gt;삭제&amp;lt;/div&amp;gt;&quot;;
		html +=&quot;&amp;lt;/td&amp;gt;&quot;;
		html +=&quot;&amp;lt;/tr&amp;gt;&quot;;
	}
	
	$(&quot;tbody&quot;).html(html);
}



function drawPaging(pd) {
	var html = &quot;&quot;;
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_first\&quot; page=\&quot;1\&quot;&amp;gt;처음&amp;lt;/span&amp;gt;&quot;;
	// 이전
	if($(&quot;#page&quot;).val() == &quot;1&quot;){
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;1\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	} else{
		// 문자열을 숫자로 바꾸기위해 *1
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 - 1) + &quot;\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	}
	
	for(var i = pd.startP; i &amp;lt;= pd.endP; i++){
		if($(&quot;#page&quot;).val() * 1 == i){ // 현재 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn_on\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		} else { // 다른 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		}
	}
	
	if($(&quot;#page&quot;).val() *1 == pd.endP){ // 현재페이지가 마지막 페이지라면
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	} else {
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 + 1) + &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	}
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_last\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;마지막&amp;lt;/span&amp;gt;&quot;;
	
	$(&quot;.paging_area&quot;).html(html);
                                                                     
}

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;hr/&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
	&amp;lt;div class=&quot;board_area&quot;&amp;gt;
		&amp;lt;!-- 작성 또는 로그인 --&amp;gt;
		
		&amp;lt;!-- 목록 --&amp;gt;
		&amp;lt;table class=&quot;board_table&quot;&amp;gt;
			&amp;lt;colgroup&amp;gt;
				&amp;lt;col width=&quot;100&quot;&amp;gt; &amp;lt;!-- 번호 --&amp;gt;
				&amp;lt;col width=&quot;500&quot;&amp;gt; &amp;lt;!-- 카테고리명 --&amp;gt;
			&amp;lt;/colgroup&amp;gt;
			&amp;lt;thead&amp;gt;
						&amp;lt;tr&amp;gt;
							&amp;lt;td colspan=&quot;3&quot; class=&quot;con_td&quot;&amp;gt;
								&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot;&amp;gt;
									&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; id=&quot;no&quot;&amp;gt;
									&amp;lt;textarea class=&quot;cateNm&quot; name=&quot;cateNm&quot; id=&quot;cateNm&quot; placeholder=&quot;카테고리명을 입력해주세요&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
								&amp;lt;/form&amp;gt;
							&amp;lt;/td&amp;gt;
							&amp;lt;td&amp;gt;
								&amp;lt;div class=&quot;insert&quot;&amp;gt;
									&amp;lt;div class=&quot;cmn_btn_ml&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&amp;gt;
								&amp;lt;/div&amp;gt; 
								&amp;lt;div class=&quot;update&quot;&amp;gt;
									&amp;lt;div class=&quot;cmn_btn_ml mtb&quot; id=&quot;updateBtn&quot;&amp;gt;수정&amp;lt;/div&amp;gt;&amp;lt;br/&amp;gt;
									&amp;lt;div class=&quot;cmn_btn_ml mtb&quot; id=&quot;cancelBtn&quot;&amp;gt;취소&amp;lt;/div&amp;gt;
								&amp;lt;/div&amp;gt;
							&amp;lt;/td&amp;gt;
						&amp;lt;/tr&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;/tr&amp;gt;
			&amp;lt;/thead&amp;gt;
			&amp;lt;tbody&amp;gt;
				
			&amp;lt;/tbody&amp;gt;
		&amp;lt;/table&amp;gt;
		&amp;lt;!-- 페이징 --&amp;gt;
		&amp;lt;div class=&quot;paging_area&quot;&amp;gt;&amp;lt;/div&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;search_area&quot;&amp;gt;
		&amp;lt;!-- 검색어 유지용 --&amp;gt;
		&amp;lt;input type=&quot;hidden&quot; id=&quot;oldGbn&quot; value=&quot;0&quot; /&amp;gt;
		&amp;lt;input type=&quot;hidden&quot; id=&quot;oldText&quot; /&amp;gt;
		&amp;lt;form action=&quot;#&quot; id=&quot;searchForm&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; id=&quot;page&quot; value=&quot;1&quot; /&amp;gt;
			&amp;lt;select name=&quot;searchGbn&quot; id=&quot;searchGbn&quot;&amp;gt;
				&amp;lt;option value=&quot;0&quot;&amp;gt;번호&amp;lt;/option&amp;gt;
				&amp;lt;option value=&quot;1&quot;&amp;gt;카테고리명&amp;lt;/option&amp;gt;
			&amp;lt;/select&amp;gt;
			&amp;lt;input type=&quot;text&quot; name=&quot;searchText&quot; id=&quot;searchText&quot;/&amp;gt;
			&amp;lt;div class=&quot;cmn_btn_ml&quot; id=&quot;searchBtn&quot;&amp;gt;검색&amp;lt;/div&amp;gt;
		&amp;lt;/form&amp;gt;
	&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cate_SQL.xml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1661401364688&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;cob&quot;&amp;gt;
	&amp;lt;insert id=&quot;insertOb&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO CATE(CATE_NO, CATE_NM) VALUES (CATE_SEQ.NEXTVAL, #{cateNm})
	&amp;lt;/insert&amp;gt;
	&amp;lt;update id=&quot;updateOb&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE CATE SET CATE_NM = #{cateNm}
		WHERE CATE_NO = #{no}
	&amp;lt;/update&amp;gt;
	&amp;lt;update id=&quot;deleteOb&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE CATE SET DEL = 0
		WHERE CATE_NO = #{no}
	&amp;lt;/update&amp;gt;
	&amp;lt;select id=&quot;getObCnt&quot; parameterType=&quot;hashmap&quot; resultType=&quot;Integer&quot;&amp;gt;
		SELECT COUNT(*) AS CNT
			FROM CATE
		WHERE DEL = 1
		&amp;lt;if test=&quot;searchText != null and searchText != ''&quot;&amp;gt;
			&amp;lt;choose&amp;gt;
			 	&amp;lt;when test=&quot;searchGbn eq 0&quot;&amp;gt;
			 			AND CATE_NO = #{searchText} 
			 	&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 1&quot;&amp;gt;
			 			AND CATE_NM LIKE '%' || #{searchText} || '%'
			 	&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;
	&amp;lt;/select&amp;gt;
	&amp;lt;select id=&quot;getObList&quot; parameterType=&quot;hashmap&quot; resultType=&quot;hashmap&quot;&amp;gt;
		SELECT S.CATE_NO, S.CATE_NM
		FROM(SELECT CATE_NO, CATE_NM, 
		ROW_NUMBER() OVER(ORDER BY CATE_NO DESC, CATE_NM DESC) AS RNK
		FROM CATE
		 WHERE DEL = 1
	      &amp;lt;if test=&quot;searchText != null and searchText != ''&quot;&amp;gt;
				&amp;lt;choose&amp;gt;
				 	&amp;lt;when test=&quot;searchGbn eq 0&quot;&amp;gt;
				 			AND CATE_NO = #{searchText} 
				 	&amp;lt;/when&amp;gt;
					&amp;lt;when test=&quot;searchGbn eq 1&quot;&amp;gt;

				 			AND CATE_NM LIKE '%' || #{searchText} || '%'
				 	&amp;lt;/when&amp;gt;
				&amp;lt;/choose&amp;gt;
			&amp;lt;/if&amp;gt;
	      ) S
		WHERE S.RNK BETWEEN #{start} AND #{end}
	&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;b&gt;결과화면&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;861&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dhpau/btrKwiPy9OI/anFp1bWxFJX1hsk5P3uTC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dhpau/btrKwiPy9OI/anFp1bWxFJX1hsk5P3uTC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dhpau/btrKwiPy9OI/anFp1bWxFJX1hsk5P3uTC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDhpau%2FbtrKwiPy9OI%2FanFp1bWxFJX1hsk5P3uTC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;861&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;861&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;&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;개인적으로 패스트캠퍼스의 강의 들음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AOP&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;
&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;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. 관심사&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분리하고 myAdvice 클래스에서 reflection API 통해서 호출하면, 더 변경에 유리한 코드가 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reflection API&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tecoble.techcourse.co.kr/post/2020-07-16-reflection-api/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://tecoble.techcourse.co.kr/post/2020-07-16-reflection-api/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1661403515666&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Reflection API 간단히 알아보자.&quot; data-og-description=&quot;Spring Framework를 학습하다 보면 Java Reflection API를 자주 접하게 된다. 하지만 Reflection API&amp;hellip;&quot; data-og-host=&quot;tecoble.techcourse.co.kr&quot; data-og-source-url=&quot;https://tecoble.techcourse.co.kr/post/2020-07-16-reflection-api/&quot; data-og-url=&quot;https://post/2020-07-16-reflection-api/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cbmYoo/hyPzzx0SLM/dKIc1SqKk9UEvzLJ5voGSk/img.png?width=2542&amp;amp;height=1414&amp;amp;face=0_0_2542_1414&quot;&gt;&lt;a href=&quot;https://tecoble.techcourse.co.kr/post/2020-07-16-reflection-api/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tecoble.techcourse.co.kr/post/2020-07-16-reflection-api/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cbmYoo/hyPzzx0SLM/dKIc1SqKk9UEvzLJ5voGSk/img.png?width=2542&amp;amp;height=1414&amp;amp;face=0_0_2542_1414');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Reflection API 간단히 알아보자.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring Framework를 학습하다 보면 Java Reflection API를 자주 접하게 된다. 하지만 Reflection API&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tecoble.techcourse.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;강의에서는 reflection API사용했구, 우리는 AspectJ 라이브러리 했고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭔가 aop제외하는것도 다름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;AspectJ&lt;span&gt; 에서는 !~~~ 이렇게, 강의에서는 pattern으로 정의해서 사용&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;&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&gt;&lt;span&gt;&lt;a href=&quot;https://sabarada.tistory.com/97&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://sabarada.tistory.com/97&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1661404293087&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] Spring AOP - 원리편&quot; data-og-description=&quot;안녕하세요. 오늘은 Spring AOP의 3번째 시간으로 마지막 시간입니다. 오늘은 AOP가 Spring 내부에서 구현되는 원리에 대해서 한번 알아보는 시간을 가져보도록 하겠습니다. AOP를 사용하는 방법 및 기&quot; data-og-host=&quot;sabarada.tistory.com&quot; data-og-source-url=&quot;https://sabarada.tistory.com/97&quot; data-og-url=&quot;https://sabarada.tistory.com/97&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zgDhu/hyPzvWAfn0/XI7HSHTcuX20Xa8ur58aU0/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/sYRI7/hyPzwVwA61/HJoEeqO9XGBDMWcF4Wr6ak/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/AEKFp/hyPzmFn47W/7uLsCXLcGXL9mLD9x7VdwK/img.png?width=1328&amp;amp;height=652&amp;amp;face=0_0_1328_652&quot;&gt;&lt;a href=&quot;https://sabarada.tistory.com/97&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sabarada.tistory.com/97&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zgDhu/hyPzvWAfn0/XI7HSHTcuX20Xa8ur58aU0/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/sYRI7/hyPzwVwA61/HJoEeqO9XGBDMWcF4Wr6ak/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/AEKFp/hyPzmFn47W/7uLsCXLcGXL9mLD9x7VdwK/img.png?width=1328&amp;amp;height=652&amp;amp;face=0_0_1328_652');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring] Spring AOP - 원리편&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 오늘은 Spring AOP의 3번째 시간으로 마지막 시간입니다. 오늘은 AOP가 Spring 내부에서 구현되는 원리에 대해서 한번 알아보는 시간을 가져보도록 하겠습니다. AOP를 사용하는 방법 및 기&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sabarada.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL/academy</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/131</guid>
      <comments>https://makeaplayground.tistory.com/131#entry131comment</comments>
      <pubDate>Thu, 25 Aug 2022 15:37:17 +0900</pubDate>
    </item>
    <item>
      <title>국비 TIL(Today I Learned) 20220824 시험, CRUD 게시판 만들기, SELL테이블로, 팀별프로젝트</title>
      <link>https://makeaplayground.tistory.com/130</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘의 시험 내역&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsaTBT/btrKrqU7vMX/1lZGheKNksSCAkFskWsqBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsaTBT/btrKrqU7vMX/1lZGheKNksSCAkFskWsqBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsaTBT/btrKrqU7vMX/1lZGheKNksSCAkFskWsqBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsaTBT%2FbtrKrqU7vMX%2F1lZGheKNksSCAkFskWsqBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;582&quot; height=&quot;772&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;772&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ1v6a/btrKvgwVUhE/aEtIPSDEP33PIYk0fI9Pkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ1v6a/btrKvgwVUhE/aEtIPSDEP33PIYk0fI9Pkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ1v6a/btrKvgwVUhE/aEtIPSDEP33PIYk0fI9Pkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ1v6a%2FbtrKvgwVUhE%2FaEtIPSDEP33PIYk0fI9Pkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;855&quot; height=&quot;227&quot; data-origin-width=&quot;855&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;기존에 SELL테이블이 있어서 SELL1로 했더니 깎였고,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bu6o49/btrKvdUAaKP/PWKZAEVY20WrHF4EeJbsuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bu6o49/btrKvdUAaKP/PWKZAEVY20WrHF4EeJbsuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bu6o49/btrKvdUAaKP/PWKZAEVY20WrHF4EeJbsuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbu6o49%2FbtrKvdUAaKP%2FPWKZAEVY20WrHF4EeJbsuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;525&quot; height=&quot;449&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 controller에서 delete할때 delete써야 하는데 update로 씀...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 코드에서는 삭제를 실제삭제가 아니고 테이블에서 del을 내용을 바꿔서 테이블에서 안보이게 했던것 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;delete로 수정해야 하는데 깜박함&lt;/p&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;PshController.java&lt;/p&gt;
&lt;pre id=&quot;code_1661329069702&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.Controller;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.spring.sample.common.service.IPagingService;
import com.spring.sample.web.testa.dao.IACDao;

@Controller
public class PshController {
	@Autowired
	public IACDao iACDao;

	@Autowired
	public IPagingService ips;

	@RequestMapping(value = &quot;/ASELLList&quot;)
	public ModelAndView ASELLlList(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) {

		// 비동기가 되면 일단 아무것도 처음에 셋팅 X,
		// 페이지만 셋팅
		int page = 1;

		if (params.get(&quot;page&quot;) != null &amp;amp;&amp;amp; params.get(&quot;page&quot;) != &quot;&quot;) {
			page = Integer.parseInt(params.get(&quot;page&quot;));
		}

		mav.addObject(&quot;page&quot;, page);
		mav.setViewName(&quot;testa/pshSell/pshlist&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/ASELLListAjax&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String ASELLListAjax(@RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		// 페이지 받아오게 되어있음
		int cnt = iACDao.getInt(&quot;sell.getSellCnt&quot;, params);

		HashMap&amp;lt;String, Integer&amp;gt; pd = ips.getPagingData(Integer.parseInt(params.get(&quot;page&quot;)), cnt, 10, 5);

		params.put(&quot;start&quot;, Integer.toString(pd.get(&quot;start&quot;)));
		params.put(&quot;end&quot;, Integer.toString(pd.get(&quot;end&quot;)));

		List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; list = iACDao.getList(&quot;sell.getSellList&quot;, params);

		model.put(&quot;list&quot;, list);
		model.put(&quot;pd&quot;, pd);

		System.out.println(params.toString());

		return mapper.writeValueAsString(model);
	}

	@RequestMapping(value = &quot;/ASELLInsert&quot;)
	public ModelAndView aTInsert(ModelAndView mav) {

		mav.setViewName(&quot;testa/pshSell/pshinsert&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/ASELLAction/{gbn}&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String ASELLAction(@PathVariable String gbn, @RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		int cnt = 0;

		try {
			switch (gbn) {
			case &quot;insert&quot;:
				cnt = iACDao.insert(&quot;sell.insertSell&quot;, params);
				break;
			case &quot;update&quot;:
				cnt = iACDao.update(&quot;sell.updateSell&quot;, params);
				break;
			case &quot;delete&quot;:
				cnt = iACDao.delete(&quot;sell.deleteSell&quot;, params);
				break;
			}

			if (cnt &amp;gt; 0) {
				model.put(&quot;msg&quot;, &quot;success&quot;);
			} else {
				model.put(&quot;msg&quot;, &quot;fail&quot;);
			}
		} catch (Exception e) {
			e.printStackTrace();
			model.put(&quot;msg&quot;, &quot;error&quot;);
		}

		return mapper.writeValueAsString(model);
	}

	// 가져오고 변경되는게 없기 때문에 비동기 처리로 안되도 됨
	@RequestMapping(value = &quot;/ASELLDetail&quot;)
	public ModelAndView ASELLDetail(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {
		// 글번호 안 넘어왔을때 처리
		if (params.get(&quot;no&quot;) != null &amp;amp;&amp;amp; params.get(&quot;no&quot;) != &quot;&quot;) {

			HashMap&amp;lt;String, String&amp;gt; data = iACDao.getMap(&quot;sell.getSell&quot;, params);

			mav.addObject(&quot;data&quot;, data);

			mav.setViewName(&quot;testa/pshSell/pshdetail&quot;);
		} else {
			mav.setViewName(&quot;redirect:ASELLList&quot;);
		}

		return mav;
	}

	@RequestMapping(value = &quot;/ASELLUpdate&quot;)
	public ModelAndView sellUpdate(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {
		// 글번호 안 넘어왔을때 처리
		if (params.get(&quot;no&quot;) != null &amp;amp;&amp;amp; params.get(&quot;no&quot;) != &quot;&quot;) {
			HashMap&amp;lt;String, String&amp;gt; data = iACDao.getMap(&quot;sell.getSell&quot;, params);

			mav.addObject(&quot;data&quot;, data);

			mav.setViewName(&quot;testa/pshSell/pshupdate&quot;);
		} else {
			mav.setViewName(&quot;redirect:ASELLList&quot;);
		}

		return mav;
	}

}&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;pshlist.jap&lt;/p&gt;
&lt;pre id=&quot;code_1661329123941&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
#searchTxt{
width: 160px;
height: 30px; 
padding: 0px 2px;
text-indent: 5px;
vertical-align: middle;
border: 1px solid #d7d7d7; 
outline-color: #70adf9;
box-sizing: border-box;
}
.search_area{
	width: 800px;
	text-align: right;
	margin: 0 auto;
}
.board_area{
	width: 800px;
	margin: 0 auto;
}

&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	if(&quot;${param.searchGbn}&quot; != &quot;&quot;){
		$(&quot;#searchGbn&quot;).val(&quot;${param.searchGbn}&quot;);
	} else {
		$(&quot;#oldGbn&quot;).val(&quot;0&quot;);
	}
	
	//목록 조회
	reloadList();
	
	$(&quot;#actionForm&quot;).on(&quot;keypress&quot;,&quot;input&quot;, function(event) {

		if(event.keyCode == 13){
			$(&quot;#searchBtn&quot;).click();
			return false;
		
		}
	})
	
	//검색버튼
	$(&quot;#searchBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#page&quot;).val(&quot;1&quot;);
		// 이동을 안하다보니 문제가 기존검색값 셋팅을 안해줌
		// 그래서  신규 상태 적용
		$(&quot;#oldGbn&quot;).val($(&quot;#searchGbn&quot;).val());
		$(&quot;#oldTxt&quot;).val($(&quot;#searchTxt&quot;).val());
		
		
		// 데이터만 가져와서 다시 그려줌, 화면 이동 없음
		reloadList();
	});
	
	//페이징 버튼
	$(&quot;.paging_area&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		// 기존 검색상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
			
		
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));
		
		reloadList();
	})
	
	// 등록버튼
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		// 기존 검색상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;, &quot;ASELLInsert&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;tr&quot;, function () {
		$(&quot;#no&quot;).val($(this).attr(&quot;no&quot;));
		
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;, &quot;ASELLDetail&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
});

// 목록 조회 호출, ajax불러오기
function reloadList() {
	var params = $(&quot;#actionForm&quot;).serialize();
	
	$.ajax({
		url : &quot;ASELLListAjax&quot;, //경로
		type : &quot;POST&quot;, // 전송방식(GET: 주소형태, POST : 주소 헤더 형태)
		dataType: &quot;json&quot;, // 데이터 형태
		data: params, // 보낼데이터
		success : function(res) { //성공했을 때 결과를 res에 받고 함수 실행
			console.log(res); // 콘솔에  pd랑 list 값이 보임
			drawList(res.list);
			drawPaging(res.pd);
		},
		error : function(request, status, error) { // 실패했을 때 함수실행
			console.log(request.responseText); // 실패 상세 태역
		}
	});
	
}

function drawList(list) {
	var html = &quot;&quot;;
	
	// list에는 map이 들어있으니까 하나씩 꺼내오겠다
	for(var data of list){
		html += &quot;&amp;lt;tr no=\&quot;&quot; + data.SELL_NO + &quot;\&quot;&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.SELL_NO + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.ITEM_NAME + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.COUNT + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.SELL_DT + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;/tr&amp;gt;&quot;;
	}   
	
	$(&quot;tbody&quot;).html(html);
}

function drawPaging(pd) {
	var html = &quot;&quot;;
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_first\&quot; page=\&quot;1\&quot;&amp;gt;처음&amp;lt;/span&amp;gt;&quot;;
	// 이전
	if($(&quot;#page&quot;).val() == &quot;1&quot;){
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;1\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	} else{
		// 문자열을 숫자로 바꾸기위해 *1
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 - 1) + &quot;\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	}
	
	for(var i = pd.startP; i &amp;lt;= pd.endP; i++){
		if($(&quot;#page&quot;).val() * 1 == i){ // 현재 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn_on\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		} else { // 다른 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		}
	}
	
	if($(&quot;#page&quot;).val() *1 == pd.endP){ // 현재페이지가 마지막 페이지라면
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	} else {
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 + 1) + &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	}
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_last\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;마지막&amp;lt;/span&amp;gt;&quot;;
	
	$(&quot;.paging_area&quot;).html(html);
                                                                     
}





&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;div class=&quot;search_area&quot;&amp;gt;
	&amp;lt;!--  method=&quot;post&quot;는 나중에 쓸 예정, no 보낼때 --&amp;gt;
	&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; id=&quot;no&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; id=&quot;page&quot; value=&quot;${page}&quot; /&amp;gt;
		&amp;lt;select name=&quot;searchGbn&quot; id=&quot;searchGbn&quot;&amp;gt;
			&amp;lt;option value=&quot;0&quot;&amp;gt;상품명&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;1&quot;&amp;gt;판매량&amp;lt;/option&amp;gt;
		&amp;lt;/select&amp;gt;
		&amp;lt;input type=&quot;text&quot; name=&quot;searchTxt&quot; id=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot; /&amp;gt;
		&amp;lt;div class=&quot;cmn_btn_ml&quot; id=&quot;searchBtn&quot;&amp;gt;검색&amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;cmn_btn_ml&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&amp;gt;
	&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;board_area&quot;&amp;gt;
&amp;lt;table class=&quot;board_table&quot;&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
	&amp;lt;/colgroup&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;/tr&amp;gt;
	&amp;lt;/thead&amp;gt;
	&amp;lt;tbody&amp;gt;&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div class=&quot;paging_area&quot;&amp;gt;&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pshinsert.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1661329151708&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{
	width: 800px;
	margin: 0 auto;
}
&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {

	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#backForm&quot;).submit();
	});
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		
		if($.trim($(&quot;#ItemName&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;상품명 입력하세요.&quot; , function () {
				$(&quot;#ItemName&quot;).focus();
			})
		} else if($.trim($(&quot;#Count&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;판매량를 입력세요.&quot; , function () {
				$(&quot;#Count&quot;).focus();
			})
		} else if($(&quot;#Count&quot;).val()*1 &amp;lt; 1){ 
			makeAlert(&quot;알림&quot;,&quot;판매량은 1개 이상이여야합니다.&quot; , function () {
				$(&quot;#Count&quot;).focus();
			})
		} else if($.trim($(&quot;#SellDt&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;판매일자를 입력하세요&quot; , function () {
				$(&quot;#SellDt&quot;).focus();
			})
		} else {
			var params = $(&quot;#actionForm&quot;).serialize();
			
			$.ajax({
				url : &quot;ASELLAction/insert&quot;, //restful api라는게 여기서 시작한다고?
				type : &quot;POST&quot;, 
				dataType: &quot;json&quot;, 
				data: params, 
				success : function(res) { 
					switch(res.msg){
					case &quot;success&quot; : 
						location.href =&quot;ASELLList&quot;;
						break;
					case &quot;fail&quot; :
						makeAlert(&quot;알림&quot; , &quot;등록에 실패하였습니다.&quot;);
						break;
					case &quot;error&quot; :
						makeAlert(&quot;알림&quot; , &quot;등록 중 문제가 발생하였습니다.&quot;);
						break;
					}
				},
				error : function(request, status, error) { 
					console.log(request.responseText); 
				}
			});
			
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;form action=&quot;ASELLList&quot; id=&quot;backForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
	&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
		&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;상품명&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;
					&amp;lt;select name=&quot;ItemName&quot;  id=&quot;ItemName&quot;&amp;gt;
						&amp;lt;option value=&quot;감자&quot;&amp;gt;감자&amp;lt;/option&amp;gt;
						&amp;lt;option value=&quot;고구마&quot;&amp;gt;고구마&amp;lt;/option&amp;gt;
						&amp;lt;option value=&quot;애호박&quot;&amp;gt;애호박&amp;lt;/option&amp;gt;
						&amp;lt;option value=&quot;호박&quot;&amp;gt;호박&amp;lt;/option&amp;gt;
						&amp;lt;option value=&quot;호박고구마&quot;&amp;gt;호박고구마&amp;lt;/option&amp;gt;
					&amp;lt;/select&amp;gt;
				&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;판매량&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;number&quot; name=&quot;Count&quot; id=&quot;Count&quot; value=&quot;0&quot; /&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;판매일자&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;date&quot; name=&quot;SellDt&quot; id=&quot;SellDt&quot; /&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/form&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;listBtn&quot;&amp;gt;목록&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;pshdetail.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1661329175532&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{
	width: 800px;
	margin: 0 auto;
}
&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function() {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;ASELLList&quot;); 
		$(&quot;#actionForm&quot;).submit();
	});
	
	// ajax사용 예정
	$(&quot;#deleteBtn&quot;).on(&quot;click&quot;, function () {
		  makePopup({
		         title : &quot;알림&quot;,
		         contents : &quot;삭제하시겠습니까?&quot;,
		         // draggable : true,
		         buttons : [{
		            name : &quot;삭제&quot;,
		            func:function() {
		            	var params = $(&quot;#actionForm&quot;).serialize();
		    			
		    			$.ajax({
		    				url : &quot;ASELLAction/delete&quot;, //restful api라는게 여기서 시작한다고?
		    				type : &quot;POST&quot;, 
		    				dataType: &quot;json&quot;, 
		    				data: params, 
		    				success : function(res) { 
		    					switch(res.msg){
		    					case &quot;success&quot; : 
		    						location.href =&quot;ASELLList&quot;;
		    						break;
		    					case &quot;fail&quot; :
		    						makeAlert(&quot;알림&quot; , &quot;삭제에 실패하였습니다.&quot;);
		    						break;
		    					case &quot;error&quot; :
		    						makeAlert(&quot;알림&quot; , &quot;삭제 중 문제가 발생하였습니다.&quot;);
		    						break;
		    					}
		    				},
		    				error : function(request, status, error) { 
		    					console.log(request.responseText); 
		    				}
		    			});
		            }
		         }, {
		            name : &quot;취소&quot;
		    }]
		});
	});
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;ASELLUpdate&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
});
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.SELL_NO}&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
		&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;상품번호&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.SELL_NO}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;상품명&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.ITEM_NAME}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;판매량&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.COUNT}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;판매일자&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.SELL_DT}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;

&amp;lt;/table&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;listBtn&quot;&amp;gt;목록&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;deleteBtn&quot;&amp;gt;삭제&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;updateBtn&quot;&amp;gt;수정&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;pshupdate.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1661329192413&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{
	width: 800px;
	margin: 0 auto;
}

&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	// 기존값으로 셀렉트박스 선택 내용 변경
	$(&quot;#ItemName&quot;).val(&quot;${data.ITEM_NAME}&quot;);
	
	$(&quot;#cancelBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#backForm&quot;).submit();
	});
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		
		if($.trim($(&quot;#ItemName&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;상품명 입력하세요.&quot; , function () {
				$(&quot;#ItemName&quot;).focus();
			})
		} else if($.trim($(&quot;#Count&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;판매량를 입력세요.&quot; , function () {
				$(&quot;#Count&quot;).focus();
			})
		} else if($(&quot;#Count&quot;).val()*1 &amp;lt; 1){ 
			makeAlert(&quot;알림&quot;,&quot;판매량은 1개 이상이여야합니다.&quot; , function () {
				$(&quot;#Count&quot;).focus();
			})
		} else if($.trim($(&quot;#SellDt&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;판매일자를 입력하세요&quot; , function () {
				$(&quot;#SellDt&quot;).focus();
			})
		} else {
			var params = $(&quot;#actionForm&quot;).serialize();
			
			$.ajax({
				url : &quot;ASELLAction/update&quot;,
				type : &quot;POST&quot;, 
				dataType: &quot;json&quot;, 
				data: params, 
				success : function(res) { 
					switch(res.msg){
					case &quot;success&quot; : 
						$(&quot;#backForm&quot;).submit();
						break;
					case &quot;fail&quot; :
						makeAlert(&quot;알림&quot; , &quot;수정에 실패하였습니다.&quot;);
						break;
					case &quot;error&quot; :
						makeAlert(&quot;알림&quot; , &quot;수정 중 문제가 발생하였습니다.&quot;);
						break;
					}
				},
				error : function(request, status, error) { 
					console.log(request.responseText); 
				}
			});
			
		}
	});
});


&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;ASELLDetail&quot; id=&quot;backForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.SELL_NO}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;!-- ajax쓰기 때문에 gbn 지움 --&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
	&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.SELL_NO}&quot; /&amp;gt;
		&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;상품명&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;
					&amp;lt;select name=&quot;ItemName&quot; id=&quot;ItemName&quot;&amp;gt;
						&amp;lt;option value=&quot;감자&quot;&amp;gt;감자&amp;lt;/option&amp;gt;
						&amp;lt;option value=&quot;고구마&quot;&amp;gt;고구마&amp;lt;/option&amp;gt;
						&amp;lt;option value=&quot;애호박&quot;&amp;gt;애호박&amp;lt;/option&amp;gt;
						&amp;lt;option value=&quot;호박&quot;&amp;gt;호박&amp;lt;/option&amp;gt;
						&amp;lt;option value=&quot;호박고구마&quot;&amp;gt;호박고구마&amp;lt;/option&amp;gt;
					&amp;lt;/select&amp;gt;
				&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;판매량&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;Count&quot; id=&quot;Count&quot; value=&quot;${data.COUNT}&quot; /&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;판매일자&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;date&quot; name=&quot;SellDt&quot; id=&quot;SellDt&quot; value=&quot;${data.SELL_DT}&quot;/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/form&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;cancelBtn&quot;&amp;gt;취소&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;updateBtn&quot;&amp;gt;수정&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pshSell.xml&lt;/p&gt;
&lt;pre id=&quot;code_1661329225572&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- namespace : 클래스와 동일, 이 파일의 대표명 --&amp;gt;
&amp;lt;mapper namespace=&quot;sell&quot;&amp;gt;
	&amp;lt;!-- select : 조회 
		id: 구분자, 메소드명과 동일
		resultType : 조회 결과 중 한줄에 대한 자료 형태를 지정
		hashmap: mybatis-config.xml에서 별칭 지정해놔서 줄여쓸수있는거임
		쿼리 삽입시 주의사항: ;이 있는경우 문제가 발생한다. 이유는 해당 쿼리 실행시 자동으로 추가되기 때문
	--&amp;gt;
	&amp;lt;select id=&quot;getSellList&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT S.SELL_NO, S.ITEM_NAME, S.COUNT, S.SELL_DT
		FROM (SELECT SELL_NO, ITEM_NAME, COUNT, TO_CHAR(SELL_DT,'YYYY-MM-DD') AS SELL_DT,
       		  ROW_NUMBER() OVER(ORDER BY SELL_DT DESC, SELL_NO DESC) AS RNK
			  FROM SELL1
			  WHERE 1 = 1
			&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; &amp;lt;!-- 검색어가 있다면 --&amp;gt;
				&amp;lt;choose&amp;gt;
					&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt; &amp;lt;!-- 품목 --&amp;gt;
						AND ITEM_NAME LIKE '%' || #{searchTxt} || '%'
					&amp;lt;/when&amp;gt;
					&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt; &amp;lt;!-- 수량 --&amp;gt;
						AND COUNT = #{searchTxt}
					&amp;lt;/when&amp;gt;
				&amp;lt;/choose&amp;gt;
			&amp;lt;/if&amp;gt;
             ) S
		WHERE S.RNK BETWEEN #{start} AND #{end}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;getSell&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT SELL_NO, ITEM_NAME, COUNT, TO_CHAR(SELL_DT,'YYYY-MM-DD') AS SELL_DT
		FROM SELL1
		WHERE SELL_NO = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;insertSell&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO SELL1(SELL_NO, ITEM_NAME, COUNT, SELL_DT)
		VALUES(SELL1_SEQ.NEXTVAL, #{ItemName}, #{Count}, #{SellDt})
	&amp;lt;/insert&amp;gt;
	
	
	&amp;lt;delete id=&quot;deleteSell&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		DELETE FROM SELL1
		WHERE SELL_NO = #{no}
	&amp;lt;/delete&amp;gt;
	
	&amp;lt;update id=&quot;updateSell&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE SELL1 SET ITEM_NAME = #{ItemName},
                COUNT = #{Count},
                 SELL_DT = #{SellDt}
       	WHERE SELL_NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;select id=&quot;getSellCnt&quot; parameterType=&quot;hashmap&quot; resultType=&quot;Integer&quot;&amp;gt;
		SELECT COUNT(*) AS CNT 
		FROM SELL1
		WHERE 1 = 1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; &amp;lt;!-- 검색어가 있다면 --&amp;gt;
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt; &amp;lt;!-- 상품명 --&amp;gt;
					AND ITEM_NAME LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt; &amp;lt;!-- 개수 --&amp;gt;
					AND COUNT = #{searchTxt}
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;207&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3Z8lh/btrKrrfoYuN/JtF5K8jwHpVhXgSbD8leK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3Z8lh/btrKrrfoYuN/JtF5K8jwHpVhXgSbD8leK0/img.png&quot; data-alt=&quot;폴더, 파일구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3Z8lh/btrKrrfoYuN/JtF5K8jwHpVhXgSbD8leK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3Z8lh%2FbtrKrrfoYuN%2FJtF5K8jwHpVhXgSbD8leK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;207&quot; height=&quot;369&quot; data-origin-width=&quot;207&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;폴더, 파일구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JfHDD/btrKsGcCNDy/Mkk54JkkOV7Bfldfn1Ulbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JfHDD/btrKsGcCNDy/Mkk54JkkOV7Bfldfn1Ulbk/img.png&quot; data-alt=&quot;테이블 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JfHDD/btrKsGcCNDy/Mkk54JkkOV7Bfldfn1Ulbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJfHDD%2FbtrKsGcCNDy%2FMkk54JkkOV7Bfldfn1Ulbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;790&quot; height=&quot;592&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;592&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;&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;&lt;b&gt;&lt;i&gt;내일 배울 내용&lt;/i&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;resolve 특정행위를 했을때 납치하는거??&lt;/p&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;i&gt;&lt;b&gt;금요일 배울 내용&lt;/b&gt;&lt;/i&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;</description>
      <category>TIL/academy</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/130</guid>
      <comments>https://makeaplayground.tistory.com/130#entry130comment</comments>
      <pubDate>Wed, 24 Aug 2022 17:25:49 +0900</pubDate>
    </item>
    <item>
      <title>국비 TIL(Today I Learned) 20220823 한줄 게시판(댓글) 만들기</title>
      <link>https://makeaplayground.tistory.com/129</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;multipart: 파일을 포함한 데이터&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/99LDt/btrKksLYiKI/aCRK7F1osU7RerArh68ss0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/99LDt/btrKksLYiKI/aCRK7F1osU7RerArh68ss0/img.png&quot; data-alt=&quot;여기에 밑에 내용이 있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/99LDt/btrKksLYiKI/aCRK7F1osU7RerArh68ss0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F99LDt%2FbtrKksLYiKI%2FaCRK7F1osU7RerArh68ss0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;274&quot; height=&quot;429&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;여기에 밑에 내용이 있음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1007&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZxLUL/btrKi8gbnED/sUSqCk7xiWmPAHx0WfD4yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZxLUL/btrKi8gbnED/sUSqCk7xiWmPAHx0WfD4yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZxLUL/btrKi8gbnED/sUSqCk7xiWmPAHx0WfD4yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZxLUL%2FbtrKi8gbnED%2FsUSqCk7xiWmPAHx0WfD4yk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;90&quot; data-origin-width=&quot;1007&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;maxUploadSize 한번에 올릴수있는 사이즈&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;multipartResolver : 올릴수 있는 파일에 대한 허용을 걸어둔거임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ajaxForm을 통해 submit으로 하게되면 스프링으로 넘어왔을때 &lt;span&gt;multipartResolver작동, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;0은 안 걸려짐, 최대크기가 지정가능&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;size18&quot;&gt;&lt;u&gt;viewResolver도 있음?&lt;/u&gt;&lt;i&gt;&lt;b&gt;&amp;nbsp;찾아보기!!!!&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://galid1.tistory.com/527&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://galid1.tistory.com/527&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1661214526564&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;SpringMVC - Spring MVC 동작원리 - 5 (ViewResolver, DispatcherServlet 기본전략 등록 과정)&quot; data-og-description=&quot;DispatcherServlet의 initViewResolver SpringBoot나 이미 설정되어있는 Spring을 사용하신 분들은 위와같이 Controller의 handler들에서 간단히 view(문자열)이름만을 반환하면 사용자에게 해당 view가 보이게..&quot; data-og-host=&quot;galid1.tistory.com&quot; data-og-source-url=&quot;https://galid1.tistory.com/527&quot; data-og-url=&quot;https://galid1.tistory.com/527&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/slc9X/hyPywts2az/RzC5rocKe7cwHg9ocaVgf1/img.png?width=286&amp;amp;height=267&amp;amp;face=0_0_286_267,https://scrap.kakaocdn.net/dn/TsXxL/hyPywfVtGQ/IcJJ3oN9lH6kwDfzkqkvrK/img.png?width=286&amp;amp;height=267&amp;amp;face=0_0_286_267,https://scrap.kakaocdn.net/dn/uTpYx/hyPxpbCwjF/yVfvbgayK6dAFJpkJmvEn0/img.png?width=564&amp;amp;height=521&amp;amp;face=0_0_564_521&quot;&gt;&lt;a href=&quot;https://galid1.tistory.com/527&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://galid1.tistory.com/527&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/slc9X/hyPywts2az/RzC5rocKe7cwHg9ocaVgf1/img.png?width=286&amp;amp;height=267&amp;amp;face=0_0_286_267,https://scrap.kakaocdn.net/dn/TsXxL/hyPywfVtGQ/IcJJ3oN9lH6kwDfzkqkvrK/img.png?width=286&amp;amp;height=267&amp;amp;face=0_0_286_267,https://scrap.kakaocdn.net/dn/uTpYx/hyPxpbCwjF/yVfvbgayK6dAFJpkJmvEn0/img.png?width=564&amp;amp;height=521&amp;amp;face=0_0_564_521');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;SpringMVC - Spring MVC 동작원리 - 5 (ViewResolver, DispatcherServlet 기본전략 등록 과정)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;DispatcherServlet의 initViewResolver SpringBoot나 이미 설정되어있는 Spring을 사용하신 분들은 위와같이 Controller의 handler들에서 간단히 view(문자열)이름만을 반환하면 사용자에게 해당 view가 보이게..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;galid1.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;&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;size18&quot;&gt;&lt;b&gt;한줄 게시판! 댓글&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;테이블 생성먼저&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NcOSN/btrKktD91tX/de0xLHuHDKtFBXn1aqmYPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NcOSN/btrKktD91tX/de0xLHuHDKtFBXn1aqmYPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NcOSN/btrKktD91tX/de0xLHuHDKtFBXn1aqmYPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNcOSN%2FbtrKktD91tX%2Fde0xLHuHDKtFBXn1aqmYPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;788&quot; height=&quot;594&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1ObBD/btrKi8mZyuV/qKk3CwnxEwSnDsiJeM4wQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1ObBD/btrKi8mZyuV/qKk3CwnxEwSnDsiJeM4wQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1ObBD/btrKi8mZyuV/qKk3CwnxEwSnDsiJeM4wQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1ObBD%2FbtrKi8mZyuV%2FqKk3CwnxEwSnDsiJeM4wQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;791&quot; height=&quot;594&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CXzW7/btrKgtE668O/AnhN1joKkKm4AbddEV9IC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CXzW7/btrKgtE668O/AnhN1joKkKm4AbddEV9IC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CXzW7/btrKgtE668O/AnhN1joKkKm4AbddEV9IC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCXzW7%2FbtrKgtE668O%2FAnhN1joKkKm4AbddEV9IC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;392&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;392&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;controller 만듬&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;241&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SMTsM/btrKmFcv4F7/U5fX3lNBGJaOPNTo4RcjUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SMTsM/btrKmFcv4F7/U5fX3lNBGJaOPNTo4RcjUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SMTsM/btrKmFcv4F7/U5fX3lNBGJaOPNTo4RcjUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSMTsM%2FbtrKmFcv4F7%2FU5fX3lNBGJaOPNTo4RcjUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;241&quot; height=&quot;166&quot; data-origin-width=&quot;241&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;533&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRuAz/btrKkubYG0r/fVgAylmPrnBls8ZDLh9Ce1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRuAz/btrKkubYG0r/fVgAylmPrnBls8ZDLh9Ce1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRuAz/btrKkubYG0r/fVgAylmPrnBls8ZDLh9Ce1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRuAz%2FbtrKkubYG0r%2FfVgAylmPrnBls8ZDLh9Ce1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;609&quot; height=&quot;533&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;533&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;b&gt;jsp&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JnGfn/btrKlUOjJIm/rZz27JUKJKLJ2COZwOkHQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JnGfn/btrKlUOjJIm/rZz27JUKJKLJ2COZwOkHQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JnGfn/btrKlUOjJIm/rZz27JUKJKLJ2COZwOkHQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJnGfn%2FbtrKlUOjJIm%2FrZz27JUKJKLJ2COZwOkHQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;350&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2bj22/btrKb9fqZZS/okcaT7KGSnsKvIMQp1FxUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2bj22/btrKb9fqZZS/okcaT7KGSnsKvIMQp1FxUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2bj22/btrKb9fqZZS/okcaT7KGSnsKvIMQp1FxUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2bj22%2FbtrKb9fqZZS%2FokcaT7KGSnsKvIMQp1FxUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;781&quot; height=&quot;448&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cotroller에 action작성하고&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;OB_SQL.xml&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;869&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lcnF0/btrKpzbXE7W/8lMYdmjPz8EatdqryZZqZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lcnF0/btrKpzbXE7W/8lMYdmjPz8EatdqryZZqZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lcnF0/btrKpzbXE7W/8lMYdmjPz8EatdqryZZqZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlcnF0%2FbtrKpzbXE7W%2F8lMYdmjPz8EatdqryZZqZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;869&quot; height=&quot;492&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;788&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VOJOE/btrKkndhAzW/kY18lwM7imn5EEc2l4xM2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VOJOE/btrKkndhAzW/kY18lwM7imn5EEc2l4xM2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VOJOE/btrKkndhAzW/kY18lwM7imn5EEc2l4xM2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVOJOE%2FbtrKkndhAzW%2FkY18lwM7imn5EEc2l4xM2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;788&quot; data-origin-width=&quot;626&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;&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AwmLT/btrKpDTrDEX/RvgQm7d6PpdNUvxUuuAwok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AwmLT/btrKpDTrDEX/RvgQm7d6PpdNUvxUuuAwok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AwmLT/btrKpDTrDEX/RvgQm7d6PpdNUvxUuuAwok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAwmLT%2FbtrKpDTrDEX%2FRvgQm7d6PpdNUvxUuuAwok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;284&quot; height=&quot;420&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;420&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;main.jsp 기존 로그인관련&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;167&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1u2Sg/btrKkm0bKbi/UtDkiPPZuZRpwot93JkeMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1u2Sg/btrKkm0bKbi/UtDkiPPZuZRpwot93JkeMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1u2Sg/btrKkm0bKbi/UtDkiPPZuZRpwot93JkeMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1u2Sg%2FbtrKkm0bKbi%2FUtDkiPPZuZRpwot93JkeMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;167&quot; height=&quot;278&quot; data-origin-width=&quot;167&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ApHSl/btrKl3FVIho/3jcrwddTNNYwQhFu4HQpy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ApHSl/btrKl3FVIho/3jcrwddTNNYwQhFu4HQpy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ApHSl/btrKl3FVIho/3jcrwddTNNYwQhFu4HQpy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FApHSl%2FbtrKl3FVIho%2F3jcrwddTNNYwQhFu4HQpy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;451&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;451&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;ob.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1661241743705&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{ 
	width: 800px; 
	margin: 0 auto;
}
.mtb{
	margin: 5px;
}
.login{
	vertical-align: baseline;
}
.con{
	width: calc(100% - 22px); 
	height: 60px; 
	border: 1px solid #d7d7d7; 
	resize: none; 
	padding: 10px
}

.update{
	display: none;
}
.con_td{
	font-size: 0
}
.paging_area{
	display: block; 
	position: relative; 
	left: 0;
	margin-bottom: 10px;
}
.search_area{
	text-align: center;
}
body {
	overflow: auto;
}
&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- Slimscroll --&amp;gt;
&amp;lt;!-- &amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery.slimscroll.js&quot;&amp;gt;&amp;lt;/script&amp;gt; --&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {

	
	reloadList();
	
	$(&quot;.board_table #loginBtn&quot;).on(&quot;click&quot;, function () {
		location.href = &quot;testALogin&quot;;
	})
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
	 		if($.trim($(&quot;#con&quot;).val()) == &quot;&quot;){
				makeAlert(&quot;알림&quot;,&quot;내용을 입력하세요.&quot; , function () {
					$(&quot;#con&quot;).focus();
				});
	 		}	else {
	 				action(&quot;insert&quot;);
			}
	
		})
		
	// 페이징 클릭시
	$(&quot;.paging_area&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));
		//기존 값 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchText&quot;).val($(&quot;#oldText&quot;).val());
		
		reloadList();
	})	
		
	// 검색 클릭시
	$(&quot;#searchBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#page&quot;).val(&quot;1&quot;);
		//기존 값 새값으로 변경
		$(&quot;#oldGbn&quot;).val($(&quot;#searchGbn&quot;).val());
		$(&quot;#oldText&quot;).val($(&quot;#searchText&quot;).val());
		
		reloadList();
	})
	
	// 목록의 삭제버튼 클릭시
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;.delete_btn&quot;, function () {
		var no = $(this).parent().parent().attr(&quot;no&quot;);
		
		  makePopup({
		         title : &quot;알림&quot;,
		         contents : &quot;삭제하시겠습니까?&quot;,
		         // draggable : true,
		         buttons : [{
		            name : &quot;삭제&quot;,
		            func:function() {
		            	$(&quot;#no&quot;).val(no);
		            	action(&quot;delete&quot;);
		            	closePopup(); // 제일 위의 팝업 닫기
		            }
		         }, {
		            name : &quot;취소&quot;
		    }]
		})
	})
	
	// 목록 수정버튼 클릭시
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;.update_btn&quot;, function () {
		var no = $(this).parent().parent().attr(&quot;no&quot;);
		$(&quot;#no&quot;).val(no);

		
		//eq(인덱스번호) : 자식들 중 인덱스 몇번째 인지 찾아서 취득
		var con = $(this).parent().parent().children().eq(1).html();
		// 수정 내용 넣기 전 &amp;lt;&amp;gt; 변화
		con = con.replace(/&amp;amp;lt;/gi, &quot;&amp;lt;&quot;);
		con = con.replace(/&amp;amp;gt;/gi, &quot;&amp;gt;&quot;);
		
		
		$(&quot;#con&quot;).val(con);
		
		
		// 등록버튼 감추기 + 수정, 취소버튼 나타나기
		$(&quot;.insert&quot;).hide();
		$(&quot;.update&quot;).show();
		
		// 작성영역에 포커스
		$(&quot;#con&quot;).focus();
	})
	
	// 수정 영역의 취소버튼
	$(&quot;thead #cancelBtn&quot;).on(&quot;click&quot;, function () {
		// 입력내용 초기화
		$(&quot;#no&quot;).val(&quot;&quot;);
		$(&quot;#con&quot;).val(&quot;&quot;);
		// 등록버튼 나타나기 + 수정, 취소버튼 감추기
		$(&quot;.insert&quot;).show();
		$(&quot;.update&quot;).hide();
	})
	
	// 수정 영역의 수정버튼
	$(&quot;thead #updateBtn&quot;).on(&quot;click&quot;, function () {
		action(&quot;update&quot;);
	})
	
})


var msg ={
	&quot;insert&quot; : &quot;등록&quot;,
	&quot;update&quot; : &quot;수정&quot;,
	&quot;delete&quot; : &quot;삭제&quot;,
}

function action(flag) {
	// con의 &amp;lt;를을 웹문자로 변환
	$(&quot;#con&quot;).val($(&quot;#con&quot;).val().replace(/&amp;lt;/gi, &quot;&amp;amp;lt;&quot;));
	// con의 &amp;gt;를을 웹문자로 변환
	$(&quot;#con&quot;).val($(&quot;#con&quot;).val().replace(/&amp;gt;/gi, &quot;&amp;amp;gt;&quot;));
	
	
	// Javascript object에서의 [] : 해당 키값으로 내용을 불러오거나 넣을 수있다. 
	// Java의 Map에서 get, put역활
	console.log(msg[flag]);
	
	var params = $(&quot;#actionForm&quot;).serialize();
	
	$.ajax({
		url : &quot;AOBAction/&quot; + flag,
		type : &quot;POST&quot;, 
		dataType: &quot;json&quot;, 
		data: params, 
		success : function(res) { 
			switch(res.msg){
			case &quot;success&quot; :
				// 내용 초기화
				$(&quot;#con&quot;).val(&quot;&quot;);
				$(&quot;#no&quot;).val(&quot;&quot;);

				// 목록 재조회
				switch(flag){
				case &quot;insert&quot; :
				case &quot;delete&quot; :
					// 조회 데이터 초기화
					$(&quot;#page&quot;).val(&quot;1&quot;);
					$(&quot;#searchGbn&quot;).val(&quot;0&quot;);
					$(&quot;#searchText&quot;).val(&quot;&quot;);
					$(&quot;#oldGbn&quot;).val(&quot;0&quot;);
					$(&quot;#oldText&quot;).val(&quot;&quot;);
					break;
				case &quot;update&quot; :
					// 기존값 유지
					$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
					$(&quot;#searchText&quot;).val($(&quot;#oldText&quot;).val());

					// 입력내용 초기화
					$(&quot;#no&quot;).val(&quot;&quot;);
					$(&quot;#con&quot;).val(&quot;&quot;);
					// 등록버튼 나타나기 + 수정, 취소버튼 감추기
					$(&quot;.insert&quot;).show();
					$(&quot;.update&quot;).hide();
					break;
					
			
				}
				reloadList();
				break;
			case &quot;fail&quot; :
				makeAlert(&quot;알림&quot; ,  msg[flag] + &quot;에 실패하였습니다.&quot;);
				break;
			case &quot;error&quot; :
				makeAlert(&quot;알림&quot; , msg[flag] + &quot; 중 문제가 발생하였습니다.&quot;);
				break;
			}
		},
		error : function(request, status, error) { 
			console.log(request.responseText); 
		}
	}); //Ajax End
} // action Function End

function reloadList() {
	var params = $(&quot;#searchForm&quot;).serialize();
	$.ajax({
		url : &quot;AOBList&quot;,
		type : &quot;POST&quot;, 
		dataType: &quot;json&quot;, 
		data: params, 
		success : function(res) { 
			drawList(res.list);
			drawPaging(res.pd);
		},
		error : function(request, status, error) { 
			console.log(request.responseText); 
		}
	}); //Ajax End
}

function drawList(list) {
	var html = &quot;&quot;;
	
	for(var data of list){
		html +=&quot;&amp;lt;tr no=\&quot;&quot; + data.NO  + &quot;\&quot;&amp;gt;&quot;;
		html +=&quot;&amp;lt;td&amp;gt;&quot; + data.MEM_NM + &quot;&amp;lt;/td&amp;gt;&quot;;
		html +=&quot;&amp;lt;td&amp;gt;&quot; + data.CON + &quot;&amp;lt;/td&amp;gt;&quot;;
		html +=&quot;&amp;lt;td&amp;gt;&quot; + data.DT + &quot;&amp;lt;/td&amp;gt;&quot;;
		html +=&quot;&amp;lt;td&amp;gt;&quot;;
		if(&quot;${sMemNo}&quot; == data.MEM_NO){ // 작성자이면
			html +=&quot;&amp;lt;div class=\&quot;cmn_btn_ml mtb update_btn\&quot;&amp;gt;수정&amp;lt;/div&amp;gt;&amp;lt;br/&amp;gt;&quot;;
			html +=&quot;&amp;lt;div class=\&quot;cmn_btn_ml mtb delete_btn\&quot;&amp;gt;삭제&amp;lt;/div&amp;gt;&quot;;
		}
		html +=&quot;&amp;lt;/td&amp;gt;&quot;;
		html +=&quot;&amp;lt;/tr&amp;gt;&quot;;
	}
	
	$(&quot;tbody&quot;).html(html);
}



function drawPaging(pd) {
	var html = &quot;&quot;;
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_first\&quot; page=\&quot;1\&quot;&amp;gt;처음&amp;lt;/span&amp;gt;&quot;;
	// 이전
	if($(&quot;#page&quot;).val() == &quot;1&quot;){
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;1\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	} else{
		// 문자열을 숫자로 바꾸기위해 *1
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 - 1) + &quot;\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	}
	
	for(var i = pd.startP; i &amp;lt;= pd.endP; i++){
		if($(&quot;#page&quot;).val() * 1 == i){ // 현재 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn_on\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		} else { // 다른 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		}
	}
	
	if($(&quot;#page&quot;).val() *1 == pd.endP){ // 현재페이지가 마지막 페이지라면
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	} else {
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 + 1) + &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	}
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_last\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;마지막&amp;lt;/span&amp;gt;&quot;;
	
	$(&quot;.paging_area&quot;).html(html);
                                                                     
}

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;hr/&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
	&amp;lt;div class=&quot;board_area&quot;&amp;gt;
		&amp;lt;!-- 작성 또는 로그인 --&amp;gt;
		
		&amp;lt;!-- 목록 --&amp;gt;
		&amp;lt;table class=&quot;board_table&quot;&amp;gt;
			&amp;lt;colgroup&amp;gt;
				&amp;lt;col width=&quot;100&quot;&amp;gt; &amp;lt;!-- 작성자 --&amp;gt;
				&amp;lt;col width=&quot;500&quot;&amp;gt; &amp;lt;!-- 내용 --&amp;gt;
				&amp;lt;col width=&quot;100&quot;&amp;gt; &amp;lt;!-- 날짜 --&amp;gt;
				&amp;lt;col width=&quot;100&quot;&amp;gt; &amp;lt;!-- 버튼 --&amp;gt;
			&amp;lt;/colgroup&amp;gt;
			&amp;lt;thead&amp;gt;
				&amp;lt;c:choose&amp;gt;
					&amp;lt;%-- 이 주석 써야함--%&amp;gt;
					&amp;lt;c:when test=&quot;${empty sMemNo}&quot;&amp;gt;&amp;lt;!-- 비 로그인시 --&amp;gt;
						&amp;lt;tr&amp;gt;
							&amp;lt;th colspan=&quot;4&quot;&amp;gt;
								로그인이 필요한 서비스입니다.
								&amp;lt;div class=&quot;cmn_btn_ml login&quot; id=&quot;loginBtn&quot;&amp;gt;로그인&amp;lt;/div&amp;gt;
							&amp;lt;/th&amp;gt;
						&amp;lt;/tr&amp;gt;
					&amp;lt;/c:when&amp;gt;
					&amp;lt;c:otherwise&amp;gt;&amp;lt;!-- 로그인시 --&amp;gt;
						&amp;lt;tr&amp;gt;
							&amp;lt;th&amp;gt;${sMemNm}&amp;lt;/th&amp;gt;
							&amp;lt;td colspan=&quot;2&quot; class=&quot;con_td&quot;&amp;gt;
								&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot;&amp;gt;
									&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; id=&quot;no&quot;&amp;gt;
									&amp;lt;input type=&quot;hidden&quot; name=&quot;memNo&quot; value=&quot;${sMemNo}&quot;&amp;gt;
									&amp;lt;textarea class=&quot;con&quot; name=&quot;con&quot; id=&quot;con&quot;&amp;gt;Hi&amp;lt;/textarea&amp;gt;
								&amp;lt;/form&amp;gt;
							&amp;lt;/td&amp;gt;
							&amp;lt;td&amp;gt;
								&amp;lt;div class=&quot;insert&quot;&amp;gt;
									&amp;lt;div class=&quot;cmn_btn_ml&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&amp;gt;
								&amp;lt;/div&amp;gt; 
								&amp;lt;div class=&quot;update&quot;&amp;gt;
									&amp;lt;div class=&quot;cmn_btn_ml mtb&quot; id=&quot;updateBtn&quot;&amp;gt;수정&amp;lt;/div&amp;gt;&amp;lt;br/&amp;gt;
									&amp;lt;div class=&quot;cmn_btn_ml mtb&quot; id=&quot;cancelBtn&quot;&amp;gt;취소&amp;lt;/div&amp;gt;
								&amp;lt;/div&amp;gt;
							&amp;lt;/td&amp;gt;
						&amp;lt;/tr&amp;gt;
					&amp;lt;/c:otherwise&amp;gt;
				&amp;lt;/c:choose&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;amp;nbsp;&amp;lt;/th&amp;gt;
				&amp;lt;/tr&amp;gt;
			&amp;lt;/thead&amp;gt;
			&amp;lt;tbody&amp;gt;
				
			&amp;lt;/tbody&amp;gt;
		&amp;lt;/table&amp;gt;
		&amp;lt;!-- 페이징 --&amp;gt;
		&amp;lt;div class=&quot;paging_area&quot;&amp;gt;&amp;lt;/div&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;search_area&quot;&amp;gt;
		&amp;lt;!-- 검색어 유지용 --&amp;gt;
		&amp;lt;input type=&quot;hidden&quot; id=&quot;oldGbn&quot; value=&quot;0&quot; /&amp;gt;
		&amp;lt;input type=&quot;hidden&quot; id=&quot;oldText&quot; /&amp;gt;
		&amp;lt;form action=&quot;#&quot; id=&quot;searchForm&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; id=&quot;page&quot; value=&quot;1&quot; /&amp;gt;
			&amp;lt;select name=&quot;searchGbn&quot; id=&quot;searchGbn&quot;&amp;gt;
				&amp;lt;option value=&quot;0&quot;&amp;gt;작성자&amp;lt;/option&amp;gt;
				&amp;lt;option value=&quot;1&quot;&amp;gt;내용&amp;lt;/option&amp;gt;
			&amp;lt;/select&amp;gt;
			&amp;lt;input type=&quot;text&quot; name=&quot;searchText&quot; id=&quot;searchText&quot;/&amp;gt;
			&amp;lt;div class=&quot;cmn_btn_ml&quot; id=&quot;searchBtn&quot;&amp;gt;검색&amp;lt;/div&amp;gt;
		&amp;lt;/form&amp;gt;
	&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AOBController.java&lt;/p&gt;
&lt;pre id=&quot;code_1661241788736&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.Controller;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.spring.sample.common.service.IPagingService;
import com.spring.sample.web.testa.dao.IACDao;

@Controller
public class AOBController {
	@Autowired
	public IACDao dao;

	@Autowired
	public IPagingService ips;

	// DB안 붙으니 예외처리 x
	@RequestMapping(value = &quot;AOB&quot;)
	public ModelAndView aob(ModelAndView mav) {
		mav.setViewName(&quot;testa/AOB/ob&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/AOBAction/{gbn}&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String AOBAction(@PathVariable String gbn, @RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		int cnt = 0;

		try {
			switch (gbn) {
			case &quot;insert&quot;:
				cnt = dao.insert(&quot;ob.insertOb&quot;, params);
				break;
			case &quot;update&quot;:
				cnt = dao.update(&quot;ob.updateOb&quot;, params);
				break;
			case &quot;delete&quot;:
				cnt = dao.update(&quot;ob.deleteOb&quot;, params);
				break;
			}

			if (cnt &amp;gt; 0) {
				model.put(&quot;msg&quot;, &quot;success&quot;);
			} else {
				model.put(&quot;msg&quot;, &quot;fail&quot;);
			}
		} catch (Exception e) {
			e.printStackTrace();
			model.put(&quot;msg&quot;, &quot;error&quot;);
		}

		return mapper.writeValueAsString(model);
	}

	@RequestMapping(value = &quot;/AOBList&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String AOBList(@RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		// 페이지 받아오게 되어있음
		int cnt = dao.getInt(&quot;ob.getObCnt&quot;, params);

		HashMap&amp;lt;String, Integer&amp;gt; pd = ips.getPagingData(Integer.parseInt(params.get(&quot;page&quot;)), cnt, 10, 5);

		params.put(&quot;start&quot;, Integer.toString(pd.get(&quot;start&quot;)));
		params.put(&quot;end&quot;, Integer.toString(pd.get(&quot;end&quot;)));

		List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; list = dao.getList(&quot;ob.getObList&quot;, params);

		model.put(&quot;list&quot;, list);
		model.put(&quot;pd&quot;, pd);

		return mapper.writeValueAsString(model);
	}
}&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;OB_SQL.xml&lt;/p&gt;
&lt;pre id=&quot;code_1661241819823&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;ob&quot;&amp;gt;
	&amp;lt;insert id=&quot;insertOb&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO OB(NO, MEM_NO, CON) VALUES (OB_SEQ.NEXTVAL, #{memNo}, #{con})
	&amp;lt;/insert&amp;gt;
	&amp;lt;update id=&quot;updateOb&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE OB SET CON = #{con}
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	&amp;lt;update id=&quot;deleteOb&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE OB SET DEL = 0
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	&amp;lt;select id=&quot;getObCnt&quot; parameterType=&quot;hashmap&quot; resultType=&quot;Integer&quot;&amp;gt;
		SELECT COUNT(*) AS CNT
			FROM OB O INNER JOIN MEM M ON O.MEM_NO = M.MEM_NO
			AND M.DEL=1
		WHERE O.DEL = 1
		&amp;lt;if test=&quot;searchText != null and searchText != ''&quot;&amp;gt;
			&amp;lt;choose&amp;gt;
			 	&amp;lt;when test=&quot;searchGbn eq 0&quot;&amp;gt;
			 	&amp;lt;!-- 작성자 검색 --&amp;gt;
			 			AND M.MEM_NM LIKE '%' || #{searchText} || '%'
			 	&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 1&quot;&amp;gt;
				&amp;lt;!-- 내용 검색 --&amp;gt;
			 			AND O.CON LIKE '%' || #{searchText} || '%'
			 	&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;
	&amp;lt;/select&amp;gt;
	&amp;lt;select id=&quot;getObList&quot; parameterType=&quot;hashmap&quot; resultType=&quot;hashmap&quot;&amp;gt;
		SELECT O.NO, O.MEM_NO, O.MEM_NM, O.CON, O.DT   
		FROM (SELECT O.NO, O.MEM_NO, M.MEM_NM, O.CON,
             CASE WHEN TO_CHAR(O.DT, 'YY.MM.DD') = TO_CHAR(SYSDATE, 'YY.MM.DD') 
                  THEN TO_CHAR(O.DT, 'HH24:MI')
                  ELSE TO_CHAR(O.DT, 'YY.MM.DD')
             END AS DT, 
               ROW_NUMBER() OVER(ORDER BY O.NO DESC) AS RNUM
	      FROM OB O INNER JOIN MEM M
	                  ON O.MEM_NO = M.MEM_NO
	                 AND M.DEL = 1
	      WHERE O.DEL = 1
	      &amp;lt;if test=&quot;searchText != null and searchText != ''&quot;&amp;gt;
				&amp;lt;choose&amp;gt;
				 	&amp;lt;when test=&quot;searchGbn eq 0&quot;&amp;gt;
				 	&amp;lt;!-- 작성자 검색 --&amp;gt;
				 			AND M.MEM_NM LIKE '%' || #{searchText} || '%'
				 	&amp;lt;/when&amp;gt;
					&amp;lt;when test=&quot;searchGbn eq 1&quot;&amp;gt;
					&amp;lt;!-- 내용 검색 --&amp;gt;
				 			AND O.CON LIKE '%' || #{searchText} || '%'
				 	&amp;lt;/when&amp;gt;
				&amp;lt;/choose&amp;gt;
			&amp;lt;/if&amp;gt;
	      ) O
		WHERE O.RNUM BETWEEN #{start} AND #{end}
	&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;</description>
      <category>TIL/academy</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/129</guid>
      <comments>https://makeaplayground.tistory.com/129#entry129comment</comments>
      <pubDate>Tue, 23 Aug 2022 17:06:06 +0900</pubDate>
    </item>
    <item>
      <title>국비 TIL(Today I Learned) 20220822 ajaxForm으로 파일 첨부, 다운받기</title>
      <link>https://makeaplayground.tistory.com/128</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Fileupload : 사용자 컴퓨터의 파일을 서버에 올림&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;힛힛.png&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vk4gX/btrJ8ZcLVIg/zhaMgRuaZTeZIge6ADwnIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vk4gX/btrJ8ZcLVIg/zhaMgRuaZTeZIge6ADwnIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vk4gX/btrJ8ZcLVIg/zhaMgRuaZTeZIge6ADwnIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvk4gX%2FbtrJ8ZcLVIg%2FzhaMgRuaZTeZIge6ADwnIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;445&quot; height=&quot;320&quot; data-filename=&quot;힛힛.png&quot; data-origin-width=&quot;669&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/46LQN/btrKhRw9gih/kzfPZjZHtz1a6FEs2PCSbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/46LQN/btrKhRw9gih/kzfPZjZHtz1a6FEs2PCSbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/46LQN/btrKhRw9gih/kzfPZjZHtz1a6FEs2PCSbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F46LQN%2FbtrKhRw9gih%2FkzfPZjZHtz1a6FEs2PCSbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;539&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;748&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;input type=&quot;file&quot;로 할려고 하면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;37&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PjDRK/btrKay0enNY/dD72q871qdkqdtbnTqElR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PjDRK/btrKay0enNY/dD72q871qdkqdtbnTqElR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PjDRK/btrKay0enNY/dD72q871qdkqdtbnTqElR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPjDRK%2FbtrKay0enNY%2FdD72q871qdkqdtbnTqElR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;37&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;37&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;enctype이 필요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XU00P/btrKeuibVC3/6Rwdnvee1HuNT1xwGkOqdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XU00P/btrKeuibVC3/6Rwdnvee1HuNT1xwGkOqdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XU00P/btrKeuibVC3/6Rwdnvee1HuNT1xwGkOqdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXU00P%2FbtrKeuibVC3%2F6Rwdnvee1HuNT1xwGkOqdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;361&quot; height=&quot;82&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;82&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;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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/21yvR/btrKdRxVd3e/cokpFM6jHJwKoydz56g5P1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/21yvR/btrKdRxVd3e/cokpFM6jHJwKoydz56g5P1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/21yvR/btrKdRxVd3e/cokpFM6jHJwKoydz56g5P1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F21yvR%2FbtrKdRxVd3e%2FcokpFM6jHJwKoydz56g5P1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;445&quot; height=&quot;76&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;serialize()는 파일이 안 넘어가서 추가 기능 필요&lt;/p&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G60uW/btrKgtDiX82/7kkmxu7QlYa5prCjQHYcDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G60uW/btrKgtDiX82/7kkmxu7QlYa5prCjQHYcDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G60uW/btrKgtDiX82/7kkmxu7QlYa5prCjQHYcDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG60uW%2FbtrKgtDiX82%2F7kkmxu7QlYa5prCjQHYcDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1034&quot; height=&quot;746&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;form의 객체 가져옴, ajaxFORM 이 있음&lt;/p&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;175&quot; data-origin-height=&quot;37&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pbDMQ/btrJ8IIYuGa/74WNlJRQdmnLOLph4FK1XK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pbDMQ/btrJ8IIYuGa/74WNlJRQdmnLOLph4FK1XK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pbDMQ/btrJ8IIYuGa/74WNlJRQdmnLOLph4FK1XK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpbDMQ%2FbtrJ8IIYuGa%2F74WNlJRQdmnLOLph4FK1XK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;175&quot; height=&quot;37&quot; data-origin-width=&quot;175&quot; data-origin-height=&quot;37&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 해야 ajax로 동작을 함&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://yoondeng.tistory.com/41&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://yoondeng.tistory.com/41&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1661129388640&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[ajax] jQuery ajaxForm 사용하기&quot; data-og-description=&quot;프로젝트를 진행하던 중 파일을 업로드 기능을 만들게 되었다. 항상 form submit을 사용하다가 이번 프로젝트의 경우 비동기식으로 처리를 하였다. ajax 처리를 찾아보던 중 ajaxForm이라는 블라블라&quot; data-og-host=&quot;yoondeng.tistory.com&quot; data-og-source-url=&quot;https://yoondeng.tistory.com/41&quot; data-og-url=&quot;https://yoondeng.tistory.com/41&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cmqAOH/hyPxqf556R/HJcfzRuUxcGhdmizaw8vT1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/mt0dX/hyPxgq0XhP/wf4uOC24C0MMUgQuipu8oK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://yoondeng.tistory.com/41&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yoondeng.tistory.com/41&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cmqAOH/hyPxqf556R/HJcfzRuUxcGhdmizaw8vT1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/mt0dX/hyPxgq0XhP/wf4uOC24C0MMUgQuipu8oK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[ajax] jQuery ajaxForm 사용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트를 진행하던 중 파일을 업로드 기능을 만들게 되었다. 항상 form submit을 사용하다가 이번 프로젝트의 경우 비동기식으로 처리를 하였다. ajax 처리를 찾아보던 중 ajaxForm이라는 블라블라&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yoondeng.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;Controller&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;557&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HKHMX/btrJ7Oa6Sfi/Rqj019K2dxRAHAirmRnkd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HKHMX/btrJ7Oa6Sfi/Rqj019K2dxRAHAirmRnkd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HKHMX/btrJ7Oa6Sfi/Rqj019K2dxRAHAirmRnkd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHKHMX%2FbtrJ7Oa6Sfi%2FRqj019K2dxRAHAirmRnkd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;756&quot; height=&quot;557&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;557&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxxGIb/btrKdQy2K15/FKrX9EJ8K9dZ7bMHKJkTe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxxGIb/btrKdQy2K15/FKrX9EJ8K9dZ7bMHKJkTe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxxGIb/btrKdQy2K15/FKrX9EJ8K9dZ7bMHKJkTe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxxGIb%2FbtrKdQy2K15%2FFKrX9EJ8K9dZ7bMHKJkTe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;196&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FILE_EXT에서 F3누르면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFhdfL/btrKeuCsEVN/5Kqpi441vrPubRSkfuAe7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFhdfL/btrKeuCsEVN/5Kqpi441vrPubRSkfuAe7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFhdfL/btrKeuCsEVN/5Kqpi441vrPubRSkfuAe7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFhdfL%2FbtrKeuCsEVN%2F5Kqpi441vrPubRSkfuAe7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1159&quot; height=&quot;704&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;704&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;파일 업로드 경로&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8XI1C/btrKhQ57R5j/53oCEDTPMknJkOYSj9lEy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8XI1C/btrKhQ57R5j/53oCEDTPMknJkOYSj9lEy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8XI1C/btrKhQ57R5j/53oCEDTPMknJkOYSj9lEy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8XI1C%2FbtrKhQ57R5j%2F53oCEDTPMknJkOYSj9lEy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;906&quot; height=&quot;137&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6G5Jq/btrKcvIHyPW/C3OpJLvBQg7iKao4KYB1Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6G5Jq/btrKcvIHyPW/C3OpJLvBQg7iKao4KYB1Sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6G5Jq/btrKcvIHyPW/C3OpJLvBQg7iKao4KYB1Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6G5Jq%2FbtrKcvIHyPW%2FC3OpJLvBQg7iKao4KYB1Sk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;254&quot; height=&quot;255&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;255&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;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 위치정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더a&amp;nbsp; --------------------------------------- 폴더a 바로가기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 폴더a 바로가기를 요청하면 위치정보로 폴더a반환&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 위치정보+ 폴더a로 인식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더a&amp;nbsp; --------------------------------------- 폴더a 심볼릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더a와 폴더a 심볼릭을 동일시화함, 사용자가 요청하면 폴더a가 폴더a 심볼릭 반환, 폴더a 심볼릭를 사용자에게 반환&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;힛.png&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;471&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd5SNR/btrKkua5VwJ/QMa5W9KaBpkUDMyvwFMAKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd5SNR/btrKkua5VwJ/QMa5W9KaBpkUDMyvwFMAKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd5SNR/btrKkua5VwJ/QMa5W9KaBpkUDMyvwFMAKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd5SNR%2FbtrKkua5VwJ%2FQMa5W9KaBpkUDMyvwFMAKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;471&quot; data-filename=&quot;힛.png&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;471&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;12.jpg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1081&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEmMe2/btrJ8ZwaP3C/lsDMnMzk7I0HNOYoaJ5UUk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEmMe2/btrJ8ZwaP3C/lsDMnMzk7I0HNOYoaJ5UUk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEmMe2/btrJ8ZwaP3C/lsDMnMzk7I0HNOYoaJ5UUk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEmMe2%2FbtrJ8ZwaP3C%2FlsDMnMzk7I0HNOYoaJ5UUk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1081&quot; data-filename=&quot;12.jpg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1081&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;심볼릭 링크&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;톰캣이 C드라이브에서 돌고있으면은 D드라이브에게 접근 가능, 파일은 D드라이브에 쌓이고, C드라이브에는 톰캣만 돌고, 공간적 효율 올라감&lt;/p&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;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNSzDs/btrJ9vvSe6x/f8iP8GjYxBIylrmldxPVlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNSzDs/btrJ9vvSe6x/f8iP8GjYxBIylrmldxPVlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNSzDs/btrJ9vvSe6x/f8iP8GjYxBIylrmldxPVlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNSzDs%2FbtrJ9vvSe6x%2Ff8iP8GjYxBIylrmldxPVlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;907&quot; height=&quot;121&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;getPrimaryKey()에서 F3누르면 해당 메서드로 감&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4eNB2/btrKayFThPU/izXzWvossXe2ASfzSPzwUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4eNB2/btrKayFThPU/izXzWvossXe2ASfzSPzwUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4eNB2/btrKayFThPU/izXzWvossXe2ASfzSPzwUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4eNB2%2FbtrKayFThPU%2FizXzWvossXe2ASfzSPzwUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;803&quot; height=&quot;99&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;99&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ygoKC/btrKgtwAXPb/k6kVXqPCZxE19XYSsECACK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ygoKC/btrKgtwAXPb/k6kVXqPCZxE19XYSsECACK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ygoKC/btrKgtwAXPb/k6kVXqPCZxE19XYSsECACK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FygoKC%2FbtrKgtwAXPb%2Fk6kVXqPCZxE19XYSsECACK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;934&quot; height=&quot;528&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;528&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;transferTo&lt;/b&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;jsp 파일 업로드 cos.jar 이런것도 있고, &lt;span&gt;cos.jar&lt;span&gt; 는 어노셋이라든가 추가 설정이 더 필요한데&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;a href=&quot;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=heartflow89&amp;amp;logNo=221009083830&quot;&gt;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=heartflow89&amp;amp;logNo=221009083830&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1661131758530&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[JSP] cos.jar 이용 파일 업로드 구현 방법&quot; data-og-description=&quot;JAVA에서는 기본적으로 파일을 업로드하는 기능을 제공하지 않는다. 업로드 기능을 개발자가 구현하여 ...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=heartflow89&amp;amp;logNo=221009083830&quot; data-og-url=&quot;https://blog.naver.com/heartflow89/221009083830&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bUkd8s/hyPxmLzEpk/Vo7Acke6lQQ6GAyTvqd0Ck/img.png?width=743&amp;amp;height=457&amp;amp;face=0_0_743_457,https://scrap.kakaocdn.net/dn/cns4Sy/hyPvSMbIaQ/h6z34qwcaRoxWQ8SMXISMK/img.png?width=80&amp;amp;height=49&amp;amp;face=0_0_80_49,https://scrap.kakaocdn.net/dn/bBd1xt/hyPv2HW5eV/s1eAfqRwGSmG3Uo9r9lFd1/img.png?width=80&amp;amp;height=55&amp;amp;face=0_0_80_55&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=heartflow89&amp;amp;logNo=221009083830&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=heartflow89&amp;amp;logNo=221009083830&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bUkd8s/hyPxmLzEpk/Vo7Acke6lQQ6GAyTvqd0Ck/img.png?width=743&amp;amp;height=457&amp;amp;face=0_0_743_457,https://scrap.kakaocdn.net/dn/cns4Sy/hyPvSMbIaQ/h6z34qwcaRoxWQ8SMXISMK/img.png?width=80&amp;amp;height=49&amp;amp;face=0_0_80_49,https://scrap.kakaocdn.net/dn/bBd1xt/hyPv2HW5eV/s1eAfqRwGSmG3Uo9r9lFd1/img.png?width=80&amp;amp;height=55&amp;amp;face=0_0_80_55');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[JSP] cos.jar 이용 파일 업로드 구현 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JAVA에서는 기본적으로 파일을 업로드하는 기능을 제공하지 않는다. 업로드 기능을 개발자가 구현하여 ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;transferTo는 스프링 셋팅이 따라서 따로 설정을 해줄게 없뎅&lt;/span&gt;&lt;/span&gt;&lt;span&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;&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K3E6Z/btrKgrMkYLK/m1RU62hwkYJEXzku83fi6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K3E6Z/btrKgrMkYLK/m1RU62hwkYJEXzku83fi6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K3E6Z/btrKgrMkYLK/m1RU62hwkYJEXzku83fi6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK3E6Z%2FbtrKgrMkYLK%2Fm1RU62hwkYJEXzku83fi6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;700&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DUPVG/btrKhRDZZQU/bwW2DfHDU2RNh3JuUghus1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DUPVG/btrKhRDZZQU/bwW2DfHDU2RNh3JuUghus1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DUPVG/btrKhRDZZQU/bwW2DfHDU2RNh3JuUghus1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDUPVG%2FbtrKhRDZZQU%2FbwW2DfHDU2RNh3JuUghus1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1126&quot; height=&quot;694&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU5OoF/btrKax1kIFR/bRdPjp9aWUr1mlnvkiKe10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU5OoF/btrKax1kIFR/bRdPjp9aWUr1mlnvkiKe10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU5OoF/btrKax1kIFR/bRdPjp9aWUr1mlnvkiKe10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU5OoF%2FbtrKax1kIFR%2FbRdPjp9aWUr1mlnvkiKe10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;968&quot; height=&quot;588&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;588&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;693&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HJJbs/btrJ7MYFxrs/pN0FJ2htPC4umoh0bkmYtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HJJbs/btrJ7MYFxrs/pN0FJ2htPC4umoh0bkmYtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HJJbs/btrJ7MYFxrs/pN0FJ2htPC4umoh0bkmYtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHJJbs%2FbtrJ7MYFxrs%2FpN0FJ2htPC4umoh0bkmYtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;693&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;693&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;upload폴더 없으면 만들면 된데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C:\MyWork\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\SampleSpring\resources\upload&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1085&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/waLQx/btrKcw8HxAE/nmtC5Bywep1UK8qGMmxQG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/waLQx/btrKcw8HxAE/nmtC5Bywep1UK8qGMmxQG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/waLQx/btrKcw8HxAE/nmtC5Bywep1UK8qGMmxQG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwaLQx%2FbtrKcw8HxAE%2FnmtC5Bywep1UK8qGMmxQG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1085&quot; height=&quot;179&quot; data-origin-width=&quot;1085&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;경로 설정&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1333&quot; data-origin-height=&quot;483&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bH6PPd/btrKhldUZ3w/OSS8PlQ89xNLw1XWGwVKK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bH6PPd/btrKhldUZ3w/OSS8PlQ89xNLw1XWGwVKK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bH6PPd/btrKhldUZ3w/OSS8PlQ89xNLw1XWGwVKK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbH6PPd%2FbtrKhldUZ3w%2FOSS8PlQ89xNLw1XWGwVKK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;483&quot; data-origin-width=&quot;1333&quot; data-origin-height=&quot;483&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0QgL7/btrKhlyetHJ/1r1hT5d70d8Y6hhKMSK0Ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0QgL7/btrKhlyetHJ/1r1hT5d70d8Y6hhKMSK0Ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0QgL7/btrKhlyetHJ/1r1hT5d70d8Y6hhKMSK0Ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0QgL7%2FbtrKhlyetHJ%2F1r1hT5d70d8Y6hhKMSK0Ek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;242&quot; height=&quot;97&quot; data-origin-width=&quot;242&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;&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 그 폴더로 가면 실제 파일이 올라와져 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIZUUL/btrKhRRyXXB/8MtE2r3P4KzlfDUxtyqcH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIZUUL/btrKhRRyXXB/8MtE2r3P4KzlfDUxtyqcH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIZUUL/btrKhRRyXXB/8MtE2r3P4KzlfDUxtyqcH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIZUUL%2FbtrKhRRyXXB%2F8MtE2r3P4KzlfDUxtyqcH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;700&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;700&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;ck에디터 붙인거에서 이미지 파일 업로드가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3wN7M/btrKcwAUl7i/TxS1OzXyPKKK6LdgsPX0uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3wN7M/btrKcwAUl7i/TxS1OzXyPKKK6LdgsPX0uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3wN7M/btrKcwAUl7i/TxS1OzXyPKKK6LdgsPX0uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3wN7M%2FbtrKcwAUl7i%2FTxS1OzXyPKKK6LdgsPX0uk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;878&quot; height=&quot;752&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RnJNt/btrKb7m1aMx/mlN3rJoHCyKsrh59mGu12k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RnJNt/btrKb7m1aMx/mlN3rJoHCyKsrh59mGu12k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RnJNt/btrKb7m1aMx/mlN3rJoHCyKsrh59mGu12k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRnJNt%2FbtrKb7m1aMx%2FmlN3rJoHCyKsrh59mGu12k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;297&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;297&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;(서버)&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;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;기존 TBOARD 테이블 수정 ATT 추가함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o2bqC/btrKb7m1kTU/tbyM1RK2qAeYG6Jh94JwFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o2bqC/btrKb7m1kTU/tbyM1RK2qAeYG6Jh94JwFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o2bqC/btrKb7m1kTU/tbyM1RK2qAeYG6Jh94JwFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo2bqC%2FbtrKb7m1kTU%2FtbyM1RK2qAeYG6Jh94JwFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;600&quot; data-origin-width=&quot;787&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;DB에는 파일명만 올라가게끔 할 예정&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;244&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwBSUw/btrKdQsl9xu/iqHLhhaaV5TDnLs9laL4fk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwBSUw/btrKdQsl9xu/iqHLhhaaV5TDnLs9laL4fk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwBSUw/btrKdQsl9xu/iqHLhhaaV5TDnLs9laL4fk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwBSUw%2FbtrKdQsl9xu%2FiqHLhhaaV5TDnLs9laL4fk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;244&quot; height=&quot;272&quot; data-origin-width=&quot;244&quot; data-origin-height=&quot;272&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GDTX4/btrKbser4C6/way9CsQGL7NB2OyMWmlmLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GDTX4/btrKbser4C6/way9CsQGL7NB2OyMWmlmLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GDTX4/btrKbser4C6/way9CsQGL7NB2OyMWmlmLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGDTX4%2FbtrKbser4C6%2Fway9CsQGL7NB2OyMWmlmLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;896&quot; height=&quot;531&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8090/SampleSpring/ATInsert 경로&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b40YTj/btrKdQePpYP/kteleB4zRm27wzRsbmKT31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b40YTj/btrKdQePpYP/kteleB4zRm27wzRsbmKT31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b40YTj/btrKdQePpYP/kteleB4zRm27wzRsbmKT31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb40YTj%2FbtrKdQePpYP%2FkteleB4zRm27wzRsbmKT31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1363&quot; height=&quot;834&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;834&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s43bt/btrKbsMfaMp/9ofhPSeBHc2t8Evj0bBqRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s43bt/btrKbsMfaMp/9ofhPSeBHc2t8Evj0bBqRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s43bt/btrKbsMfaMp/9ofhPSeBHc2t8Evj0bBqRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs43bt%2FbtrKbsMfaMp%2F9ofhPSeBHc2t8Evj0bBqRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;195&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;form.js 추가&lt;/p&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.jsp &lt;b&gt;스크립트&lt;/b&gt; 부분 수정&lt;/p&gt;
&lt;pre id=&quot;code_1661141407674&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	// 에디터 연결
	// CKEDITOR.replace(아이디, 옵션)
	CKEDITOR.replace(&quot;con&quot;, {
		resize_enabled: false, // resize_enabled : 크기조절기능 활용여부
		language : &quot;ko&quot;, // 사용언어
		enterMode: &quot;2&quot;, // 엔터키처리방법. 2번이면 &amp;lt;br/&amp;gt;
		width : &quot;100%&quot;, // 숫자일경우 px, 문자열일경우 css크기
		height : 400
	});
	
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#backForm&quot;).submit();
	});
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		// CKEditor의 값 취득
		// CKEDITOR.instances[아이디] : CKEditor중 아이디가 같은 것을 찾겠다.
		//.getData() : 작성중인 내용을 취득하겠다.
		$(&quot;#con&quot;).val(CKEDITOR.instances['con'].getData());
		
		if($.trim($(&quot;#title&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;제목 입력하세요.&quot; , function () {
				$(&quot;#title&quot;).focus();
			})
		} else if($.trim($(&quot;#con&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;내용을 입력하세요.&quot; , function () {
				$(&quot;#con&quot;).focus();
			})
		} else {
			// 1. 파입업로드 -&amp;gt; 2. 업로드 파일명 취득 -&amp;gt; 3. 글 저장
			// 폼 객체 취득
			var form = $(&quot;#actionForm&quot;);
			// ajaxForm 적용
			form.ajaxForm({
				success: function (res) { // 데이터 주고 받기 성공시
					if(res.result == &quot;SUCCESS&quot;){ // 파일 전송 성공
						// 올라간 파일이 존재한다면, 첨부파일이 없을 수도 있으니 조건문 처리
						if(res.fileName.length &amp;gt; 0){
							$(&quot;#att&quot;).val(res.fileName[0]); // 올라간 파일명 보관		
						}
						// 3번 단계 글저장 시작, 기존테이터
						var params = $(&quot;#actionForm&quot;).serialize();
						
						$.ajax({
							url : &quot;ATAction/insert&quot;, //restful api라는게 여기서 시작한다고?
							type : &quot;POST&quot;, 
							dataType: &quot;json&quot;, 
							data: params, 
							success : function(res) { 
								switch(res.msg){
								case &quot;success&quot; : 
									location.href =&quot;ATList&quot;;
									break;
								case &quot;fail&quot; :
									makeAlert(&quot;알림&quot; , &quot;등록에 실패하였습니다.&quot;);
									break;
								case &quot;error&quot; :
									makeAlert(&quot;알림&quot; , &quot;등록 중 문제가 발생하였습니다.&quot;);
									break;
								}
							},
							error : function(request, status, error) { 
								console.log(request.responseText); 
							}
						});  // 글저장 끝
						
					} else { // 문제발생
						makeAlert(&quot;알림&quot;, &quot;파일 업로드에&amp;lt;br/&amp;gt;문제가 발생하였습니다.&quot;)
					}
				},
				error: function () { // 에러시
					makeAlert(&quot;알림&quot;, &quot;파일 업로드에&amp;lt;br/&amp;gt;문제가 발생하였습니다.&quot;)
				}
			}); // ajaxForm 설정 끝
			
			
			// ajaxForm 실행
			form.submit();
			
		}
	});
});

&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;sql도 수정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCznBG/btrJ9uX47UL/DjkODzIeEnHxeoGS88rmP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCznBG/btrJ9uX47UL/DjkODzIeEnHxeoGS88rmP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCznBG/btrJ9uX47UL/DjkODzIeEnHxeoGS88rmP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCznBG%2FbtrJ9uX47UL%2FDjkODzIeEnHxeoGS88rmP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;247&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;247&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;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbuy97/btrJ8JBel0v/Gswz7OtVGEkjdYCfN3bDak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbuy97/btrJ8JBel0v/Gswz7OtVGEkjdYCfN3bDak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbuy97/btrJ8JBel0v/Gswz7OtVGEkjdYCfN3bDak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcbuy97%2FbtrJ8JBel0v%2FGswz7OtVGEkjdYCfN3bDak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;451&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEWy6U/btrKcvINjfi/cFkLVEvdec4H45ZjE0LUlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEWy6U/btrKcvINjfi/cFkLVEvdec4H45ZjE0LUlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEWy6U/btrKcvINjfi/cFkLVEvdec4H45ZjE0LUlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEWy6U%2FbtrKcvINjfi%2FcFkLVEvdec4H45ZjE0LUlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;609&quot; height=&quot;163&quot; data-origin-width=&quot;609&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;&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1495&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HD2RA/btrKhRqLQDI/oiMI2K3Ky7SktsiPpXkDZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HD2RA/btrKhRqLQDI/oiMI2K3Ky7SktsiPpXkDZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HD2RA/btrKhRqLQDI/oiMI2K3Ky7SktsiPpXkDZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHD2RA%2FbtrKhRqLQDI%2FoiMI2K3Ky7SktsiPpXkDZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1495&quot; height=&quot;537&quot; data-origin-width=&quot;1495&quot; data-origin-height=&quot;537&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;js의 typeOf&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJayG/btrKetYeGiF/zi2Iee7OfD6Y7FjxFqR3D0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJayG/btrKetYeGiF/zi2Iee7OfD6Y7FjxFqR3D0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJayG/btrKetYeGiF/zi2Iee7OfD6Y7FjxFqR3D0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJayG%2FbtrKetYeGiF%2Fzi2Iee7OfD6Y7FjxFqR3D0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;360&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sBjdp/btrKhSpGIXQ/MYwM8J9Hr3ep5xGPwBEkI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sBjdp/btrKhSpGIXQ/MYwM8J9Hr3ep5xGPwBEkI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sBjdp/btrKhSpGIXQ/MYwM8J9Hr3ep5xGPwBEkI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsBjdp%2FbtrKhSpGIXQ%2FMYwM8J9Hr3ep5xGPwBEkI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;518&quot; height=&quot;181&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;181&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJIXDf/btrKcwVuWM0/uAAeQBWbyXFxCpdXO7hHq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJIXDf/btrKcwVuWM0/uAAeQBWbyXFxCpdXO7hHq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJIXDf/btrKcwVuWM0/uAAeQBWbyXFxCpdXO7hHq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJIXDf%2FbtrKcwVuWM0%2FuAAeQBWbyXFxCpdXO7hHq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;723&quot; height=&quot;159&quot; data-origin-width=&quot;559&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0mZVp/btrJ76izyNr/SHoVf94VU01FtKGer8abB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0mZVp/btrJ76izyNr/SHoVf94VU01FtKGer8abB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0mZVp/btrJ76izyNr/SHoVf94VU01FtKGer8abB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0mZVp%2FbtrJ76izyNr%2FSHoVf94VU01FtKGer8abB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;838&quot; height=&quot;569&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;569&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;detail.jsp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1XA2B/btrKhkGtfWs/VYU9zivXA3FTTJCKI0CWGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1XA2B/btrKhkGtfWs/VYU9zivXA3FTTJCKI0CWGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1XA2B/btrKhkGtfWs/VYU9zivXA3FTTJCKI0CWGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1XA2B%2FbtrKhkGtfWs%2FVYU9zivXA3FTTJCKI0CWGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;707&quot; height=&quot;136&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lh7TL/btrKhlrQqqF/HO04mdgK2fLioS4KfvfoY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lh7TL/btrKhlrQqqF/HO04mdgK2fLioS4KfvfoY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lh7TL/btrKhlrQqqF/HO04mdgK2fLioS4KfvfoY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flh7TL%2FbtrKhlrQqqF%2FHO04mdgK2fLioS4KfvfoY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;866&quot; height=&quot;467&quot; data-origin-width=&quot;866&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;상세보기에 파일이름이 보임&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;DB에서 처리할수도 있고&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB에서 처리는 쉬우니까 jsp에서 처리하는법&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUQxDH/btrKevBUGz9/72jPngSkDy5hOmax1IyFFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUQxDH/btrKevBUGz9/72jPngSkDy5hOmax1IyFFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUQxDH/btrKevBUGz9/72jPngSkDy5hOmax1IyFFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUQxDH%2FbtrKevBUGz9%2F72jPngSkDy5hOmax1IyFFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;846&quot; height=&quot;59&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6x5iS/btrKbr77tA6/gUSkAnjZyK4KI6ObefU8i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6x5iS/btrKbr77tA6/gUSkAnjZyK4KI6ObefU8i0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6x5iS/btrKbr77tA6/gUSkAnjZyK4KI6ObefU8i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6x5iS%2FbtrKbr77tA6%2FgUSkAnjZyK4KI6ObefU8i0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;229&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;229&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8wAyJ/btrKaupDh2H/5hN1bBfvpfRuGkTg23z2PK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8wAyJ/btrKaupDh2H/5hN1bBfvpfRuGkTg23z2PK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8wAyJ/btrKaupDh2H/5hN1bBfvpfRuGkTg23z2PK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8wAyJ%2FbtrKaupDh2H%2F5hN1bBfvpfRuGkTg23z2PK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;888&quot; height=&quot;421&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;421&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;update.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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buHuDX/btrKknbTZ6N/yqsBpEgqHS9j3hxigSW0j0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buHuDX/btrKknbTZ6N/yqsBpEgqHS9j3hxigSW0j0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buHuDX/btrKknbTZ6N/yqsBpEgqHS9j3hxigSW0j0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuHuDX%2FbtrKknbTZ6N%2FyqsBpEgqHS9j3hxigSW0j0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;499&quot; data-origin-width=&quot;898&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;updateBtn 스크립트 부분&lt;/p&gt;
&lt;pre id=&quot;code_1661146605309&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		// CKEditor의 값 취득
		// CKEDITOR.instances[아이디] : CKEditor중 아이디가 같은 것을 찾겠다.
		//.getData() : 작성중인 내용을 취득하겠다.
		$(&quot;#con&quot;).val(CKEDITOR.instances['con'].getData());
		
		if($.trim($(&quot;#title&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;제목 입력하세요.&quot; , function () {
				$(&quot;#title&quot;).focus();
			})
		} else if($.trim($(&quot;#con&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;내용을 입력하세요.&quot; , function () {
				$(&quot;#con&quot;).focus();
			})
		} else {
			// 1. 파입업로드 -&amp;gt; 2. 업로드 파일명 취득 -&amp;gt; 3. 글 저장
			// 폼 객체 취득
			var form = $(&quot;#actionForm&quot;);
			// ajaxForm 적용
			form.ajaxForm({
				success: function (res) { // 데이터 주고 받기 성공시
					if(res.result == &quot;SUCCESS&quot;){ // 파일 전송 성공
						// 올라간 파일이 존재한다면, 첨부파일이 없을 수도 있으니 조건문 처리
						if(res.fileName.length &amp;gt; 0){
							$(&quot;#att&quot;).val(res.fileName[0]); // 올라간 파일명 보관		
						}
						// 3번 단계 글저장 시작, 기존테이터
						var params = $(&quot;#actionForm&quot;).serialize();
						
						$.ajax({
							url : &quot;ATAction/update&quot;, //restful api라는게 여기서 시작한다고?
							type : &quot;POST&quot;, 
							dataType: &quot;json&quot;, 
							data: params, 
							success : function(res) { 
								switch(res.msg){
								case &quot;success&quot; : 
									$('#backForm').submit();
									break;
								case &quot;fail&quot; :
									makeAlert(&quot;알림&quot; , &quot;등록에 실패하였습니다.&quot;);
									break;
								case &quot;error&quot; :
									makeAlert(&quot;알림&quot; , &quot;등록 중 문제가 발생하였습니다.&quot;);
									break;
								}
							},
							error : function(request, status, error) { 
								console.log(request.responseText); 
							}
						});  // 글저장 끝
						
					} else { // 문제발생
						makeAlert(&quot;알림&quot;, &quot;파일 업로드에&amp;lt;br/&amp;gt;문제가 발생하였습니다.&quot;)
					}
				},
				error: function () { // 에러시
					makeAlert(&quot;알림&quot;, &quot;파일 업로드에&amp;lt;br/&amp;gt;문제가 발생하였습니다.&quot;)
				}
			}); // ajaxForm 설정 끝
			
			
			// ajaxForm 실행
			form.submit();
		}
	});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qj8Ma/btrKi9ylFsB/aJmr4a5Cu18uKXdXKquxT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qj8Ma/btrKi9ylFsB/aJmr4a5Cu18uKXdXKquxT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qj8Ma/btrKi9ylFsB/aJmr4a5Cu18uKXdXKquxT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQj8Ma%2FbtrKi9ylFsB%2FaJmr4a5Cu18uKXdXKquxT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;189&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;203&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wUldo/btrKdRFr1D4/9kpnkJZOq4xYaOhnzVbruK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wUldo/btrKdRFr1D4/9kpnkJZOq4xYaOhnzVbruK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wUldo/btrKdRFr1D4/9kpnkJZOq4xYaOhnzVbruK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwUldo%2FbtrKdRFr1D4%2F9kpnkJZOq4xYaOhnzVbruK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;203&quot; height=&quot;79&quot; data-origin-width=&quot;203&quot; data-origin-height=&quot;79&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmwWIH/btrKkt36hhf/fMnmc4C2bRZAnMqf4JkHzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmwWIH/btrKkt36hhf/fMnmc4C2bRZAnMqf4JkHzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmwWIH/btrKkt36hhf/fMnmc4C2bRZAnMqf4JkHzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmwWIH%2FbtrKkt36hhf%2FfMnmc4C2bRZAnMqf4JkHzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;786&quot; height=&quot;74&quot; data-origin-width=&quot;786&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;이런 오류가 떠서 왜인자 했더니 c:choose 바로 밑에 주석 넣을수없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hclee2575.tistory.com/133&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hclee2575.tistory.com/133&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1661145713638&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[JSP] Illegal text inside &amp;quot;c:choose&amp;quot; tag: JSTL오류&quot; data-og-description=&quot;출처 http://m.blog.naver.com/sontaemoo/70106360327 원래 소스는 아래와 같았다. &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 이렇게 사용하니 choose 태그 밑의 바로 밑 부분 주석을 인식을 못했다. 그래서 아래와 같이 바꾸니 아주..&quot; data-og-host=&quot;hclee2575.tistory.com&quot; data-og-source-url=&quot;https://hclee2575.tistory.com/133&quot; data-og-url=&quot;https://hclee2575.tistory.com/133&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Hd5jW/hyPxmSw7Y8/As2Atiu2jD09KYTqqIbKt0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/FrAIK/hyPxfsk2XW/x4ekmJZ245zrkuv0kO7L61/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://hclee2575.tistory.com/133&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hclee2575.tistory.com/133&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Hd5jW/hyPxmSw7Y8/As2Atiu2jD09KYTqqIbKt0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/FrAIK/hyPxfsk2XW/x4ekmJZ245zrkuv0kO7L61/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[JSP] Illegal text inside &quot;c:choose&quot; tag: JSTL오류&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 http://m.blog.naver.com/sontaemoo/70106360327 원래 소스는 아래와 같았다. &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 이렇게 사용하니 choose 태그 밑의 바로 밑 부분 주석을 인식을 못했다. 그래서 아래와 같이 바꾸니 아주..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hclee2575.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AkFL4/btrKhREFhHW/KXulh348MslcFyMZKmATz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AkFL4/btrKhREFhHW/KXulh348MslcFyMZKmATz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AkFL4/btrKhREFhHW/KXulh348MslcFyMZKmATz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAkFL4%2FbtrKhREFhHW%2FKXulh348MslcFyMZKmATz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;812&quot; height=&quot;131&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IJDea/btrKeuJXFxC/xgCBuCfyI7KIoze75iZStK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IJDea/btrKeuJXFxC/xgCBuCfyI7KIoze75iZStK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IJDea/btrKeuJXFxC/xgCBuCfyI7KIoze75iZStK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIJDea%2FbtrKeuJXFxC%2FxgCBuCfyI7KIoze75iZStK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;809&quot; height=&quot;113&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;113&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;840&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lxq32/btrKhmdv1NW/wck3KmhzWUSE1wi0WMKO20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lxq32/btrKhmdv1NW/wck3KmhzWUSE1wi0WMKO20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lxq32/btrKhmdv1NW/wck3KmhzWUSE1wi0WMKO20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flxq32%2FbtrKhmdv1NW%2Fwck3KmhzWUSE1wi0WMKO20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;98&quot; data-origin-width=&quot;840&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;&lt;a href=&quot;https://blog.munilive.com/posts/input-file-type-accept-attribute.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.munilive.com/posts/input-file-type-accept-attribute.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1661147294469&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;파일 첨부 시 특정 파일 확장자만 선택하게 하기&quot; data-og-description=&quot;태그의 accept 속성을 이용해서 첨부파일 추가 시 특정 파일만 선택 가능하도록 하는 방법에 대한 글이다.&quot; data-og-host=&quot;blog.munilive.com&quot; data-og-source-url=&quot;https://blog.munilive.com/posts/input-file-type-accept-attribute.html&quot; data-og-url=&quot;https://blog.munilive.com/posts/input-file-type-accept-attribute.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bf3wa6/hyPxoQoRa8/pz4u2yQjgpoU79pJpbbBzK/img.png?width=960&amp;amp;height=766&amp;amp;face=0_0_960_766,https://scrap.kakaocdn.net/dn/Zk9aT/hyPxgLy0Gh/dW5Qm7iu0DmaZJC2rr3bg1/img.png?width=960&amp;amp;height=766&amp;amp;face=0_0_960_766&quot;&gt;&lt;a href=&quot;https://blog.munilive.com/posts/input-file-type-accept-attribute.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.munilive.com/posts/input-file-type-accept-attribute.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bf3wa6/hyPxoQoRa8/pz4u2yQjgpoU79pJpbbBzK/img.png?width=960&amp;amp;height=766&amp;amp;face=0_0_960_766,https://scrap.kakaocdn.net/dn/Zk9aT/hyPxgLy0Gh/dW5Qm7iu0DmaZJC2rr3bg1/img.png?width=960&amp;amp;height=766&amp;amp;face=0_0_960_766');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;파일 첨부 시 특정 파일 확장자만 선택하게 하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;태그의 accept 속성을 이용해서 첨부파일 추가 시 특정 파일만 선택 가능하도록 하는 방법에 대한 글이다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.munilive.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #575757;&quot;&gt;input type=&quot;file&quot; accept=&quot;파일 확장자|audio/*|video/*|image/*|미디어 타입&quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 확장자 지정해줄수 있음, but 모든 파일 살아있음&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fileUpload.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1661147195854&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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 http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;FileUpload Test&amp;lt;/title&amp;gt;
&amp;lt;link rel=&quot;shortcut icon&quot; href=&quot;resources/favicon/favicon.ico&quot;&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap {
	width: 700px;
	margin: 0 auto;
}

.btn_wrap {
	height: 30px;
}

#uploadInfo {
	margin-top: 10px;
	padding: 5px;
	width: calc(100% - 10px);
	height: 80px;
	overflow: auto;
	border: 1px solid #7b7b7b;
	font-size: 10.5pt;
}
&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery.form.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/common.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function() {
	$(&quot;#uploadBtn&quot;).on(&quot;click&quot;, function(){
		var fileForm = $(&quot;#fileForm&quot;);
		// ajaxForm : form의 동작을 동기화에서 비동기화 방식으로 변경
		fileForm.ajaxForm({
			// res 파일이름들이 담겨져있음
			success: function(res){
				if(res.result ==&quot;SUCCESS&quot;){
					alert(&quot;저장완료&quot;);
					
					console.log(res);
					if(res.fileName.length &amp;gt; 0) {
						let html = &quot;&quot;;
						for(file of res.fileName) {
							html += &quot;&amp;lt;a href=\&quot;resources/upload/&quot; + file + &quot;\&quot; download&amp;gt;&quot; + file + &quot;&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;&quot;;
						}
						
						$(&quot;#uploadInfo&quot;).append(html);
					}
					
				} else {
					alert(&quot;저장실패&quot;);
				} 
			}, //ajax error
			error: function(){
				alert(&quot;에러발생!!&quot;); 
			}
		});
		
		fileForm.submit();
	});
});
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;cmn_title&quot;&amp;gt;파일 업로드/다운로드 샘플&amp;lt;div class=&quot;cmn_btn_mr float_right_btn&quot; id=&quot;sampleListBtn&quot;&amp;gt;샘플목록&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;!-- 
	enctype : form전송 데이터 형태
	multipart : 파일데이터를 포함한 형태
 --&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
&amp;lt;form id=&quot;fileForm&quot; name=&quot;fileForm&quot; action=&quot;fileUploadAjax&quot; 
	  method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
&amp;lt;div class=&quot;headline&quot;&amp;gt;첨부파일&amp;lt;/div&amp;gt;
&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;600&quot; /&amp;gt;
	&amp;lt;/colgroup&amp;gt;
	&amp;lt;tbody&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;첨부파일1&amp;lt;/th&amp;gt;
		&amp;lt;td class=&quot;board_cont_left&quot;&amp;gt;&amp;lt;input type=&quot;file&quot; name=&quot;attFile1&quot; size=&quot;85&quot; /&amp;gt;&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;첨부파일2&amp;lt;/th&amp;gt;
		&amp;lt;td class=&quot;board_cont_left&quot;&amp;gt;&amp;lt;input type=&quot;file&quot; name=&quot;attFile2&quot; size=&quot;85&quot; /&amp;gt;&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;첨부파일3&amp;lt;/th&amp;gt;
		&amp;lt;td class=&quot;board_cont_left&quot;&amp;gt;&amp;lt;input type=&quot;file&quot; name=&quot;attFile3&quot; size=&quot;85&quot; /&amp;gt;&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;div class=&quot;btn_wrap&quot;&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;uploadBtn&quot;&amp;gt;저장&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;headline&quot;&amp;gt;첨부결과&amp;lt;/div&amp;gt;
&amp;lt;div id=&quot;uploadInfo&quot;&amp;gt;&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FileController.java, &lt;span&gt;우리는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;fileUploadAjax 만 씀&lt;/p&gt;
&lt;pre id=&quot;code_1661147377374&quot; class=&quot;arduino&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.common.controller;

import java.io.File;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FilenameUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.spring.sample.common.CommonProperties;
import com.spring.sample.util.Utils;

@Controller
public class FileController {
	@RequestMapping(value = &quot;/fileUploadAjax&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String fileUploadAjax(HttpServletRequest request, ModelAndView modelAndView) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		HashMap&amp;lt;String, Object&amp;gt; modelMap = new HashMap&amp;lt;String, Object&amp;gt;();

		/* File Upload Logic */
		// 다운 캐스팅 한거래 넘겨 받은 request를 multipartRequest형태로 변환
		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

		String uploadExts = CommonProperties.FILE_EXT;
		String uploadPath = CommonProperties.FILE_UPLOAD_PATH;
		String fileFullName = &quot;&quot;;

		// 폴더 또는 파일을 나타냄
		File folder = new File(uploadPath);

		if (!folder.exists()) { // 폴더 존재여부, 폴더 존재하지 않으면
			folder.mkdir(); // 폴더 생성
		}

		List&amp;lt;String&amp;gt; fileNames = new ArrayList&amp;lt;String&amp;gt;();
		try {
			@SuppressWarnings(&quot;rawtypes&quot;) // 노란줄 보기 싫어서 달아준거
			final Map files = multipartRequest.getFileMap();
			Iterator&amp;lt;String&amp;gt; iterator = multipartRequest.getFileNames();

			while (iterator.hasNext()) {
				String key = iterator.next();
				MultipartFile file = (MultipartFile) files.get(key);
				if (file.getSize() &amp;gt; 0) {
					String fileRealName = file.getOriginalFilename(); // 실제파일명
					String fileTmpName = Utils.getPrimaryKey(); // 고유 날짜키 받기
					String fileExt = FilenameUtils.getExtension(file.getOriginalFilename()).toLowerCase(); // 파일
					// 확장자추출

					if (uploadExts.toLowerCase().indexOf(fileExt) &amp;lt; 0) {
						throw new Exception(&quot;Not allowded file extension : &quot; + fileExt.toLowerCase());
					} else {
						// 물리적으로 저장되는 파일명(실제파일명을 그대로 저장할지 rename해서 저장할지는 협의 필요)
						fileFullName = fileTmpName + fileRealName;
						// File(경로) - 폴더
						// File(경로, 파일명) - 파일
						// new File(new File(uploadPath), fileFullName)
						// uploadPath경로의 폴더에 fileFullName 이름의 파일
						// 파일.transferTo(새파일) - 새파일에 파일의 내용을 전송
						file.transferTo(new File(new File(uploadPath), fileFullName));

						fileNames.add(fileFullName);
					}
				}
			}

			modelMap.put(&quot;result&quot;, CommonProperties.RESULT_SUCCESS);
		} catch (Exception e) {
			// 공통 Exception 처리
			e.printStackTrace();
			modelMap.put(&quot;result&quot;, CommonProperties.RESULT_ERROR);
		}

		modelMap.put(&quot;fileName&quot;, fileNames);

		return mapper.writeValueAsString(modelMap);
	}

	@RequestMapping(value = &quot;/imageUploadAjax&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String imageUploadAjax(HttpServletRequest request, ModelAndView modelAndView) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		HashMap&amp;lt;String, Object&amp;gt; modelMap = new HashMap&amp;lt;String, Object&amp;gt;();

		/* File Upload Logic */
		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

		String uploadExts = CommonProperties.IMG_EXT;
		String uploadPath = CommonProperties.FILE_UPLOAD_PATH;
		String fileFullName = &quot;&quot;;

		File folder = new File(uploadPath);

		if (!folder.exists()) { // 폴더 존재여부
			folder.mkdir(); // 폴더 생성
		}

		List&amp;lt;String&amp;gt; fileNames = new ArrayList&amp;lt;String&amp;gt;();
		try {
			@SuppressWarnings(&quot;rawtypes&quot;)
			final Map files = multipartRequest.getFileMap();
			Iterator&amp;lt;String&amp;gt; iterator = multipartRequest.getFileNames();

			// 첨부파일 있을때
			while (iterator.hasNext()) {
				String key = iterator.next(); // 파일 취득
				MultipartFile file = (MultipartFile) files.get(key); // 만약 제네릭 뒀으면 형변환 안해도 됨
				if (file.getSize() &amp;gt; 0) {
					String fileRealName = file.getOriginalFilename(); // 실제파일명
					String fileTmpName = Utils.getPrimaryKey(); // 동일한 파일명이 넘어오면 덮어씌움 그런거 방지하기 위해, 고유 날짜키 받기
					String fileExt = FilenameUtils.getExtension(file.getOriginalFilename()).toLowerCase(); // 파일
					// 확장자추출

					if (uploadExts.toLowerCase().indexOf(fileExt) &amp;lt; 0) {
						throw new Exception(&quot;Not allowded image file extension : &quot; + fileExt.toLowerCase());
					} else {
						// 물리적으로 저장되는 파일명(실제파일명을 그대로 저장할지 rename해서 저장할지는 협의필요
						fileFullName = fileTmpName + fileRealName;
						// File(경로) - 폴더
						// File(경로, 파일명) - 파일
						// (new File(new File(uploadPath), fileFullName)
						// uploadPath(경로의 폴더에 fileFullName 이름의 파일
						// file.transferTo(새파일) - 새파일에 파일의 내용을 전송
						// transferTo 스프링에서 새로 나왔데
						file.transferTo(new File(new File(uploadPath), fileFullName));

						fileNames.add(fileFullName);
					}
				}
			}

			modelMap.put(&quot;result&quot;, CommonProperties.RESULT_SUCCESS);
		} catch (Exception e) {
			// 공통 Exception 처리
			e.printStackTrace();
			modelMap.put(&quot;result&quot;, CommonProperties.RESULT_ERROR);
		}

		modelMap.put(&quot;fileName&quot;, fileNames);

		return mapper.writeValueAsString(modelMap);
	}

	/**
	 * CKEditor용 image업로드
	 **/
	@RequestMapping(value = &quot;/imageUpload&quot;, method = RequestMethod.POST)
	public void editorImageUploadAjax(HttpServletRequest request, HttpServletResponse response,
			@RequestParam MultipartFile upload, ModelAndView modelAndView) throws Throwable {
		PrintWriter printWriter = null;
		try {
			String uploadExts = CommonProperties.IMG_EXT; // 확장자
			String uploadPath = CommonProperties.FILE_UPLOAD_PATH; // 업로드경로
			String fileFullName = &quot;&quot;;

			File fileDir = new File(uploadPath);

			if (!fileDir.exists()) {
				fileDir.mkdirs(); // 디렉토리가 존재하지 않는다면 생성
			}

			if (upload.getSize() &amp;gt; 0) {
				String fileRealName = upload.getOriginalFilename().replace(&quot; &quot;, &quot;_&quot;).toLowerCase(); // 실제파일명
				String fileTmpName = Utils.getPrimaryKey(); // 고유 날짜키 받기
				String fileExt = FilenameUtils.getExtension(upload.getOriginalFilename()).toLowerCase(); // 파일

				if (uploadExts.toLowerCase().indexOf(fileExt) &amp;gt;= 0) {
					fileFullName = fileTmpName + fileRealName;
					upload.transferTo(new File(fileDir, fileFullName));

				} else {
					// 파일 확장자가 틀릴 경우
					printWriter = response.getWriter();

					printWriter.println(&quot;&amp;lt;script type='text/javascript'&amp;gt;alert('파일 확장자가 지원을 하지 않습니다.');&amp;lt;/script&amp;gt;&quot;);
					printWriter.flush();
					printWriter.close();
				}

				// 성공 시
				String callback = request.getParameter(&quot;CKEditorFuncNum&quot;);

				printWriter = response.getWriter();

				printWriter.println(&quot;&amp;lt;script type='text/javascript'&amp;gt;&quot; + &quot;window.parent.CKEDITOR.tools.callFunction(&quot;
						+ callback + &quot;,'&quot; + &quot;resources/upload/&quot; + fileFullName + &quot;','이미지를 업로드 하였습니다.'&quot; + &quot;)&amp;lt;/script&amp;gt;&quot;);
				printWriter.flush();
				printWriter.close();

			} else {
				// 파일 크기가 0이거나 없는 경우
				printWriter = response.getWriter();

				printWriter.println(&quot;&amp;lt;script type='text/javascript'&amp;gt;alert('파일 업로드에 실패하였습니다.');&amp;lt;/script&amp;gt;&quot;);
				printWriter.flush();
				printWriter.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (printWriter != null) {
				printWriter.close();
			}
		}
	}
}&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CommonProperties.java, 파일 업로드 부분만 봐&lt;/p&gt;
&lt;pre id=&quot;code_1661148194487&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.common;

public class CommonProperties {
	/**
	 * 기본 셋
	 */
	// 기본 리스트 사이즈
	public static final int VIEWCOUNT = 10;
	// 기본 페이지 사이즈
	public static final int PAGECOUNT = 10;

	/**
	 * Ajax Result
	 */
	public static final String RESULT_SUCCESS = &quot;SUCCESS&quot;;

	public static final String RESULT_ERROR = &quot;ERROR&quot;;

	/**
	 * 파일 업로드
	 */
	// 파일 업로드 경로
	// 실제 물리적으로 저장될 경로
	// 가상 서버에 직접 올린다고 한거
	// 문제는 clean하면 파일 날라갈수있음
	public static final String FILE_UPLOAD_PATH = &quot;C:\\MyWork\\workspace\\.metadata\\.plugins\\org.eclipse.wst.server.core&quot;
			+ &quot;\\tmp0\\wtpwebapps\\SampleSpring\\resources\\upload&quot;;

	// 허용파일 확장자
	public static final String FILE_EXT = &quot;xls|ppt|doc|xlsx|pptx|docx|hwp|csv|jpg|jpeg|png|gif|bmp|tld|txt|pdf|zip|alz|7z&quot;;
	public static final String IMG_EXT = &quot;jpg|jpeg|png|gif|bmp&quot;;

	/**
	 * 암호화키(AES기반 16글자)
	 */
	public static final String SECURE_KEY = &quot;goodeesmart12345&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;Utils.java, getPrimaryKey()만 참고&lt;/p&gt;
&lt;pre id=&quot;code_1661148241654&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.util;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.lang.RandomStringUtils;

import com.spring.sample.common.CommonProperties;

public class Utils {
	/**
	 * Primary Key 생성
	 * 
	 * @return String
	 */
	public static String getPrimaryKey() {
		SimpleDateFormat formatter = new SimpleDateFormat(&quot;yyyyMMddHHmmss&quot;);
		return formatter.format(new java.util.Date()) + RandomStringUtils.randomNumeric(6);
	}
	
	/**
	 * 문자열을 key를 통해 암호화 하고 base64 로 인코딩
	 * 
	 * @return String
	 * @throws Throwable
	 */
	public static String encryptAES128(String value) throws Throwable {
		SecretKeySpec keySpec 
				= new SecretKeySpec(CommonProperties.SECURE_KEY.getBytes(&quot;UTF-8&quot;), &quot;AES&quot;);

		Cipher cipher = Cipher.getInstance(&quot;AES&quot;);
		cipher.init(Cipher.ENCRYPT_MODE, keySpec);
		byte[] encrypted = cipher.doFinal(value.getBytes()); // 암호화
		
		Encoder encoder = Base64.getEncoder();
		
		String encodeString = encoder.encodeToString(encrypted); // 바이트 타입의 배열을 문자열로 변환

		return encodeString;
	}

	/**
	 * key 를 통해 문자열 base64 디코딩
	 * 
	 * @return String
	 * @throws Throwable
	 */
	public static String decryptAES128(String value) throws Throwable {
		SecretKeySpec keySpec = new SecretKeySpec(CommonProperties.SECURE_KEY.getBytes(&quot;UTF-8&quot;), &quot;AES&quot;);

		Cipher cipher = Cipher.getInstance(&quot;AES&quot;);
		cipher.init(Cipher.DECRYPT_MODE, keySpec);
		
		Decoder decoder = Base64.getDecoder();
		
		byte[] decodeBytes = decoder.decode(value); //문자열 형태의 파라메터를 배열에 바이트 변환 후 삽입

		byte[] decryptBytes = cipher.doFinal(decodeBytes); // 복호화

		return new String(decryptBytes);
	}
	
	/**
	 * MAP의 Key를 소문자로 변환
	 * 
	 * @return HashMap&amp;lt;String, String&amp;gt;
	 */
	public static HashMap&amp;lt;String, String&amp;gt; toLowerMapKey(HashMap&amp;lt;String, String&amp;gt; oldMap) throws Throwable {
		Set&amp;lt;String&amp;gt; keySet = oldMap.keySet();
		
		Iterator&amp;lt;String&amp;gt; keys = keySet.iterator();
		
		HashMap&amp;lt;String, String&amp;gt; newMap = new HashMap&amp;lt;String, String&amp;gt;();
		
		while(keys.hasNext()) {
			String key = keys.next();
			newMap.put(key.toLowerCase(), String.valueOf(oldMap.get(key)));
		}
		
		return newMap;
	}
	
	/**
	 * List의 MAP Key를 소문자로 변환
	 * 
	 * @return HashMap&amp;lt;String, String&amp;gt;
	 */
	public static List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; toLowerListMapKey(List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; oldList) {
		List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; newList = new ArrayList&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt;();
		
		for(HashMap&amp;lt;String, String&amp;gt; oldMap : oldList) {
			Set&amp;lt;String&amp;gt; keySet = oldMap.keySet();
			
			Iterator&amp;lt;String&amp;gt; keys = keySet.iterator();
			
			HashMap&amp;lt;String, String&amp;gt; newMap = new HashMap&amp;lt;String, String&amp;gt;();
			
			while(keys.hasNext()) {
				String key = keys.next();
				newMap.put(key.toLowerCase(), String.valueOf(oldMap.get(key)));
			}
			
			newList.add(newMap);
		}
		
		return newList;
	}
	
	/**
	 * List의 MAP Key를 camel식으로 변환
	 * 
	 * @return HashMap&amp;lt;String, String&amp;gt;
	 */
	public static List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; toCamelListMapKey(List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; oldList) {
		List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; newList = new ArrayList&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt;();
		
		for(HashMap&amp;lt;String, String&amp;gt; oldMap : oldList) {
			Set&amp;lt;String&amp;gt; keySet = oldMap.keySet();
			
			Iterator&amp;lt;String&amp;gt; keys = keySet.iterator();
			
			HashMap&amp;lt;String, String&amp;gt; newMap = new HashMap&amp;lt;String, String&amp;gt;();
			
			while(keys.hasNext()) {
				String key = keys.next();
				
				String[] temp = key.split(&quot;_&quot;);
				
				String camelKey = &quot;&quot;;
				
				for(int i = 0 ; i &amp;lt; temp.length ; i++) {
					if(i == 0) {
						camelKey += temp[0].toLowerCase();
					} else {
						camelKey += temp[i].substring(0, 1).toUpperCase() + temp[i].substring(1).toLowerCase();
					}
				}
				
				newMap.put(camelKey, String.valueOf(oldMap.get(key)));
			}
			
			newList.add(newMap);
		}
		
		return newList;
	}
}&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.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1661148318783&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{
	width: 800px;
	margin: 0 auto;
}


&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery.form.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- CKEditor --&amp;gt;
&amp;lt;!-- 제이쿼리 뒤에 나와야함, 제이쿼리 기반으로 동작하기 때문에 --&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/ckeditor/ckeditor.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	// 에디터 연결
	// CKEDITOR.replace(아이디, 옵션)
	CKEDITOR.replace(&quot;con&quot;, {
		resize_enabled: false, // resize_enabled : 크기조절기능 활용여부
		language : &quot;ko&quot;, // 사용언어
		enterMode: &quot;2&quot;, // 엔터키처리방법. 2번이면 &amp;lt;br/&amp;gt;
		width : &quot;100%&quot;, // 숫자일경우 px, 문자열일경우 css크기
		height : 400
	});
	
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#backForm&quot;).submit();
	});
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		// CKEditor의 값 취득
		// CKEDITOR.instances[아이디] : CKEditor중 아이디가 같은 것을 찾겠다.
		//.getData() : 작성중인 내용을 취득하겠다.
		$(&quot;#con&quot;).val(CKEDITOR.instances['con'].getData());
		
		if($.trim($(&quot;#title&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;제목 입력하세요.&quot; , function () {
				$(&quot;#title&quot;).focus();
			})
		} else if($.trim($(&quot;#con&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;내용을 입력하세요.&quot; , function () {
				$(&quot;#con&quot;).focus();
			})
		} else {
			// 1. 파입업로드 -&amp;gt; 2. 업로드 파일명 취득 -&amp;gt; 3. 글 저장
			// 폼 객체 취득
			var form = $(&quot;#actionForm&quot;);
			// ajaxForm 적용
			form.ajaxForm({
				success: function (res) { // 데이터 주고 받기 성공시
					if(res.result == &quot;SUCCESS&quot;){ // 파일 전송 성공
						// 올라간 파일이 존재한다면, 첨부파일이 없을 수도 있으니 조건문 처리
						if(res.fileName.length &amp;gt; 0){
							$(&quot;#att&quot;).val(res.fileName[0]); // 올라간 파일명 보관		
						}
						// 3번 단계 글저장 시작, 기존테이터
						var params = $(&quot;#actionForm&quot;).serialize();
						
						$.ajax({
							url : &quot;ATAction/insert&quot;, //restful api라는게 여기서 시작한다고?
							type : &quot;POST&quot;, 
							dataType: &quot;json&quot;, 
							data: params, 
							success : function(res) { 
								switch(res.msg){
								case &quot;success&quot; : 
									location.href =&quot;ATList&quot;;
									break;
								case &quot;fail&quot; :
									makeAlert(&quot;알림&quot; , &quot;등록에 실패하였습니다.&quot;);
									break;
								case &quot;error&quot; :
									makeAlert(&quot;알림&quot; , &quot;등록 중 문제가 발생하였습니다.&quot;);
									break;
								}
							},
							error : function(request, status, error) { 
								console.log(request.responseText); 
							}
						});  // 글저장 끝
						
					} else { // 문제발생
						makeAlert(&quot;알림&quot;, &quot;파일 업로드에&amp;lt;br/&amp;gt;문제가 발생하였습니다.&quot;)
					}
				},
				error: function () { // 에러시
					makeAlert(&quot;알림&quot;, &quot;파일 업로드에&amp;lt;br/&amp;gt;문제가 발생하였습니다.&quot;)
				}
			}); // ajaxForm 설정 끝
			
			
			// ajaxForm 실행
			form.submit();
			
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;form action=&quot;ATList&quot; id=&quot;backForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;!-- ajax쓰기 때문에 gbn 지움 --&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
	&amp;lt;form action=&quot;fileUploadAjax&quot; id=&quot;actionForm&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
		&amp;lt;input type=&quot;hidden&quot; name=&quot;att&quot; id=&quot;att&quot; /&amp;gt; &amp;lt;!-- 실 저장된 파일명 보관용 --&amp;gt;
		&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot; /&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;${sMemNm}&amp;lt;input type=&quot;hidden&quot; name=&quot;memNo&quot; value=&quot;${sMemNo}&quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th colspan=&quot;2&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th colspan=&quot;2&quot;&amp;gt;&amp;lt;textarea rows=&quot;10&quot; cols=&quot;30&quot; name=&quot;con&quot; id=&quot;con&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;첨부파일&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;file&quot; name=&quot;attFile&quot; /&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/form&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;listBtn&quot;&amp;gt;목록&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;list.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1661148334314&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
#searchTxt{
width: 160px;
height: 30px; 
padding: 0px 2px;
text-indent: 5px;
vertical-align: middle;
border: 1px solid #d7d7d7; 
outline-color: #70adf9;
box-sizing: border-box;
}
.search_area{
	width: 800px;
	text-align: right;
	margin: 0 auto;
}
.board_area{
	width: 800px;
	margin: 0 auto;
}

.att {
	display: inline-block; 
	vertical-align: top; 
	width: 18px; 
	height: 18px; 
	background-image: url('resources/images/attFile.png'); 
	background-size: cover;
}

&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	if(&quot;${params.searchGbn}&quot; != &quot;&quot;){
		$(&quot;#searchGbn&quot;).val(&quot;${param.searchGbn}&quot;);
	} else {
		$(&quot;#oldGbn&quot;).val(&quot;0&quot;);
	}
	
	//목록 조회
	reloadList();
	
	//검색버튼
	$(&quot;#searchBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#page&quot;).val(&quot;1&quot;);
		// 이동을 안하다보니 문제가 기존검색값 셋팅을 안해줌
		// 그래서  신규 상태 적용
		$(&quot;#oldGbn&quot;).val($(&quot;#searchGbn&quot;).val());
		$(&quot;#oldTxt&quot;).val($(&quot;#searchTxt&quot;).val());
		
		
		// 데이터만 가져와서 다시 그려줌, 화면 이동 없음
		reloadList();
	});
	
	//페이징 버튼
	$(&quot;.paging_area&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		// 기존 검색상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
			
		
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));
		
		reloadList();
	})
	
	// 등록버튼
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		// 기존 검색상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;, &quot;ATInsert&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;tr&quot;, function () {
		$(&quot;#no&quot;).val($(this).attr(&quot;no&quot;));
		
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;, &quot;ATDetail&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
});

// 목록 조회 호출, ajax불러오기
function reloadList() {
	var params = $(&quot;#actionForm&quot;).serialize();
	
	$.ajax({
		url : &quot;ATListAjax&quot;, //경로
		type : &quot;POST&quot;, // 전송방식(GET: 주소형태, POST : 주소 헤더 형태)
		dataType: &quot;json&quot;, // 데이터 형태
		data: params, // 보낼데이터
		success : function(res) { //성공했을 때 결과를 res에 받고 함수 실행
			console.log(res); // 콘솔에  pd랑 list 값이 보임
			drawList(res.list);
			drawPaging(res.pd);
		},
		error : function(request, status, error) { // 실패했을 때 함수실행
			console.log(request.responseText); // 실패 상세 태역
		}
	});
	
}

function drawList(list) {
	var html = &quot;&quot;;
	
	// list에는 map이 들어있으니까 하나씩 꺼내오겠다
	for(var data of list){
		console.log(typeof(data.ATT) !=&quot;undefined&quot;);
		html += &quot;&amp;lt;tr no=\&quot;&quot; + data.NO + &quot;\&quot;&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.NO + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot;;
		html += data.TITLE;
		if(typeof(data.ATT) !=&quot;undefined&quot;){ // 첨부파일이 있다면
			html += &quot;&amp;lt;span class=\&quot;att\&quot;&amp;gt;&amp;lt;/span&amp;gt;&quot;;
		}
		html += &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.MEM_NM + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.DT + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.HIT + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;/tr&amp;gt;&quot;;
	}   
	
	$(&quot;tbody&quot;).html(html);
}

function drawPaging(pd) {
	var html = &quot;&quot;;
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_first\&quot; page=\&quot;1\&quot;&amp;gt;처음&amp;lt;/span&amp;gt;&quot;;
	// 이전
	if($(&quot;#page&quot;).val() == &quot;1&quot;){
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;1\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	} else{
		// 문자열을 숫자로 바꾸기위해 *1
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 - 1) + &quot;\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	}
	
	for(var i = pd.startP; i &amp;lt;= pd.endP; i++){
		if($(&quot;#page&quot;).val() * 1 == i){ // 현재 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn_on\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		} else { // 다른 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		}
	}
	
	if($(&quot;#page&quot;).val() *1 == pd.endP){ // 현재페이지가 마지막 페이지라면
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	} else {
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 + 1) + &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	}
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_last\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;마지막&amp;lt;/span&amp;gt;&quot;;
	
	$(&quot;.paging_area&quot;).html(html);
                                                                     
}
&amp;lt;/script&amp;gt;		
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;hr/&amp;gt;
&amp;lt;!-- 페이징 때 기존 검색 내용 유지용 --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;

&amp;lt;!-- 데이터 후 처리해서 로딩이 빨라 --&amp;gt;
&amp;lt;div class=&quot;search_area&quot;&amp;gt;
	&amp;lt;!--  method=&quot;post&quot;는 나중에 쓸 예정, no 보낼때 --&amp;gt;
	&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; id=&quot;no&quot; /&amp;gt;
		&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; id=&quot;page&quot; value=&quot;${page}&quot; /&amp;gt;
		&amp;lt;select name=&quot;searchGbn&quot; id=&quot;searchGbn&quot;&amp;gt;
			&amp;lt;option value=&quot;0&quot;&amp;gt;제목&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;1&quot;&amp;gt;작성자&amp;lt;/option&amp;gt;
		&amp;lt;/select&amp;gt;
		&amp;lt;input type=&quot;text&quot; name=&quot;searchTxt&quot; id=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot; /&amp;gt;
		&amp;lt;div class=&quot;cmn_btn_ml&quot; id=&quot;searchBtn&quot;&amp;gt;검색&amp;lt;/div&amp;gt;
		&amp;lt;c:if test=&quot;${!empty sMemNo}&quot;&amp;gt;
			&amp;lt;div class=&quot;cmn_btn_ml&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&amp;gt;
		&amp;lt;/c:if&amp;gt;
	&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;board_area&quot;&amp;gt;
&amp;lt;table class=&quot;board_table&quot;&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;400&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
	&amp;lt;/colgroup&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;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div class=&quot;paging_area&quot;&amp;gt;&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;detail.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1661148353302&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- jsl의 functions : el tag 추가옵션 --&amp;gt;
&amp;lt;%@ taglib prefix=&quot;fn&quot; uri=&quot;http://java.sun.com/jsp/jstl/functions&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{
	width: 800px;
	margin: 0 auto;
}
.con{
text-align: left; 
min-height: 400px;
}
&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function() {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;ATList&quot;); 
		$(&quot;#actionForm&quot;).submit();
	});
	
	// ajax사용 예정
	$(&quot;#deleteBtn&quot;).on(&quot;click&quot;, function () {
		  makePopup({
		         title : &quot;알림&quot;,
		         contents : &quot;삭제하시겠습니까?&quot;,
		         // draggable : true,
		         buttons : [{
		            name : &quot;삭제&quot;,
		            func:function() {
		            	var params = $(&quot;#actionForm&quot;).serialize();
		    			
		    			$.ajax({
		    				url : &quot;ATAction/delete&quot;, //restful api라는게 여기서 시작한다고?
		    				type : &quot;POST&quot;, 
		    				dataType: &quot;json&quot;, 
		    				data: params, 
		    				success : function(res) { 
		    					switch(res.msg){
		    					case &quot;success&quot; : 
		    						location.href =&quot;ATList&quot;;
		    						break;
		    					case &quot;fail&quot; :
		    						makeAlert(&quot;알림&quot; , &quot;삭제에 실패하였습니다.&quot;);
		    						break;
		    					case &quot;error&quot; :
		    						makeAlert(&quot;알림&quot; , &quot;삭제 중 문제가 발생하였습니다.&quot;);
		    						break;
		    					}
		    				},
		    				error : function(request, status, error) { 
		    					console.log(request.responseText); 
		    				}
		    			});
		            }
		         }, {
		            name : &quot;취소&quot;
		    }]
		});
	});
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;ATUpdate&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;d&quot;&amp;gt; &amp;lt;!-- selRes는 gbn을 받게 되어있어서 값을 추가해줘야함 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.NO}&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
		&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.NO}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.TITLE}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.MEM_NM}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt; ${data.HIT}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt; ${data.DT}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th colspan=&quot;2&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;td class=&quot;con&quot; colspan=&quot;2&quot;&amp;gt;${data.CON}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;c:if test=&quot;${!empty data.ATT}&quot;&amp;gt;
	&amp;lt;!-- fn:length(대상) : 대상 문자열의 길이나 배열, 리스트의 크기를 가져온다 --&amp;gt;
	&amp;lt;c:set var=&quot;fileLength&quot; value=&quot;${fn:length(data.ATT)}&quot;&amp;gt;&amp;lt;/c:set&amp;gt;
	&amp;lt;!-- fn:substring(값, 숫자1, 숫자2) : 값을 숫자1이상부터, 숫자2미만까지, 인덱스 기준으로 자른다. --&amp;gt;
	&amp;lt;c:set var=&quot;fileName&quot; value=&quot;${fn:substring(data.ATT, 20, fileLength)}&quot;&amp;gt;&amp;lt;/c:set&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;첨부파일&amp;lt;/th&amp;gt;
		&amp;lt;!-- download 없으면 이미지를 브라우저에 띄움, 파일을 안 받고 --&amp;gt;
		&amp;lt;!-- download=&quot;${fileName}&quot; 옵션을 줘야 다운받을때도 파일명으로 받아짐 --&amp;gt;
		&amp;lt;td&amp;gt;&amp;lt;a href=&quot;resouces/upload/${data.ATT}&quot; download=&quot;${fileName}&quot;&amp;gt;${fileName}&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/table&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;listBtn&quot;&amp;gt;목록&amp;lt;/div&amp;gt;
	&amp;lt;c:if test=&quot;${sMemNo eq data.MEM_NO}&quot;&amp;gt;
		&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;deleteBtn&quot;&amp;gt;삭제&amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;updateBtn&quot;&amp;gt;수정&amp;lt;/div&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/div&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;update.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1661148368359&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- jsl의 functions : el tag 추가옵션 --&amp;gt;
&amp;lt;%@ taglib prefix=&quot;fn&quot; uri=&quot;http://java.sun.com/jsp/jstl/functions&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{
	width: 800px;
	margin: 0 auto;
}

.att {
	display: none;
}


&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery.form.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- CKEditor --&amp;gt;
&amp;lt;!-- 제이쿼리 뒤에 나와야함, 제이쿼리 기반으로 동작하기 때문에 --&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/ckeditor/ckeditor.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	// 에디터 연결
	// CKEDITOR.replace(아이디, 옵션)
	CKEDITOR.replace(&quot;con&quot;, {
		resize_enabled: false, // resize_enabled : 크기조절기능 활용여부
		language : &quot;ko&quot;, // 사용언어
		enterMode: &quot;2&quot;, // 엔터키처리방법. 2번이면 &amp;lt;br/&amp;gt;
		width : &quot;100%&quot;, // 숫자일경우 px, 문자열일경우 css크기
		height : 400
	});
	
	$(&quot;#cancelBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#backForm&quot;).submit();
	});
	
	// 첨부파일 파일삭제 버튼 클릭시
	$(&quot;#fileDelBtn&quot;).on(&quot;click&quot;, function () {
		// 기존 파일 내역 영역 제거
		$(&quot;.attOld&quot;).remove();
		// 기존 값 제거
		$(&quot;#att&quot;).val(&quot;&quot;);
		// 파일 선택 영역 제공 
		$(&quot;.att&quot;).show();
	});
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		// CKEditor의 값 취득
		// CKEDITOR.instances[아이디] : CKEditor중 아이디가 같은 것을 찾겠다.
		//.getData() : 작성중인 내용을 취득하겠다.
		$(&quot;#con&quot;).val(CKEDITOR.instances['con'].getData());
		
		if($.trim($(&quot;#title&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;제목 입력하세요.&quot; , function () {
				$(&quot;#title&quot;).focus();
			})
		} else if($.trim($(&quot;#con&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;내용을 입력하세요.&quot; , function () {
				$(&quot;#con&quot;).focus();
			})
		} else {
			// 1. 파입업로드 -&amp;gt; 2. 업로드 파일명 취득 -&amp;gt; 3. 글 저장
			// 폼 객체 취득
			var form = $(&quot;#actionForm&quot;);
			// ajaxForm 적용
			form.ajaxForm({
				success: function (res) { // 데이터 주고 받기 성공시
					if(res.result == &quot;SUCCESS&quot;){ // 파일 전송 성공
						// 올라간 파일이 존재한다면, 첨부파일이 없을 수도 있으니 조건문 처리
						if(res.fileName.length &amp;gt; 0){
							$(&quot;#att&quot;).val(res.fileName[0]); // 올라간 파일명 보관		
						}
						// 3번 단계 글저장 시작, 기존테이터
						var params = $(&quot;#actionForm&quot;).serialize();
						
						$.ajax({
							url : &quot;ATAction/update&quot;, //restful api라는게 여기서 시작한다고?
							type : &quot;POST&quot;, 
							dataType: &quot;json&quot;, 
							data: params, 
							success : function(res) { 
								switch(res.msg){
								case &quot;success&quot; : 
									$('#backForm').submit();
									break;
								case &quot;fail&quot; :
									makeAlert(&quot;알림&quot; , &quot;등록에 실패하였습니다.&quot;);
									break;
								case &quot;error&quot; :
									makeAlert(&quot;알림&quot; , &quot;등록 중 문제가 발생하였습니다.&quot;);
									break;
								}
							},
							error : function(request, status, error) { 
								console.log(request.responseText); 
							}
						});  // 글저장 끝
						
					} else { // 문제발생
						makeAlert(&quot;알림&quot;, &quot;파일 업로드에&amp;lt;br/&amp;gt;문제가 발생하였습니다.&quot;)
					}
				},
				error: function () { // 에러시
					makeAlert(&quot;알림&quot;, &quot;파일 업로드에&amp;lt;br/&amp;gt;문제가 발생하였습니다.&quot;)
				}
			}); // ajaxForm 설정 끝
			
			
			// ajaxForm 실행
			form.submit();
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;form action=&quot;ATDetail&quot; id=&quot;backForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.NO}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;!-- ajax쓰기 때문에 gbn 지움 --&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
	&amp;lt;form action=&quot;fileUploadAjax&quot; id=&quot;actionForm&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.NO}&quot; /&amp;gt;
		&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;${data.NO}&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot; value=&quot;${data.TITLE}&quot;/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;${sMemNm}&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th colspan=&quot;2&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th colspan=&quot;2&quot;&amp;gt;&amp;lt;textarea rows=&quot;10&quot; cols=&quot;30&quot; name=&quot;con&quot; id=&quot;con&quot;&amp;gt;${data.CON}&amp;lt;/textarea&amp;gt;&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;첨부파일&amp;lt;/th&amp;gt;
				&amp;lt;c:choose&amp;gt;
					&amp;lt;c:when test=&quot;${empty data.ATT}&quot;&amp;gt;
						&amp;lt;!-- 파일이 없을때 --&amp;gt;
						&amp;lt;td&amp;gt;
							&amp;lt;input type=&quot;file&quot; name=&quot;attFile&quot; /&amp;gt;
							&amp;lt;input type=&quot;hidden&quot; name=&quot;att&quot; id=&quot;att&quot;/&amp;gt;
						&amp;lt;/td&amp;gt;
					&amp;lt;/c:when&amp;gt;
					&amp;lt;c:otherwise&amp;gt;
					&amp;lt;!-- 파일이 있을때 --&amp;gt;
						&amp;lt;td&amp;gt;
							&amp;lt;span class=&quot;attOld&quot;&amp;gt; &amp;lt;!-- 기존 파일 --&amp;gt;
								&amp;lt;!-- fn:length(대상) : 대상 문자열의 길이나 배열, 리스트의 크기를 가져온다 --&amp;gt;
								&amp;lt;c:set var=&quot;fileLength&quot; value=&quot;${fn:length(data.ATT)}&quot;&amp;gt;&amp;lt;/c:set&amp;gt;
								&amp;lt;!-- fn:substring(값, 숫자1, 숫자2) : 값을 숫자1이상부터, 숫자2미만까지, 인덱스 기준으로 자른다. --&amp;gt;
								&amp;lt;c:set var=&quot;fileName&quot; value=&quot;${fn:substring(data.ATT, 20, fileLength)}&quot;&amp;gt;&amp;lt;/c:set&amp;gt;
								${fileName}
								&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;fileDelBtn&quot;&amp;gt;파일삭제&amp;lt;/div&amp;gt;
							&amp;lt;/span&amp;gt;
							&amp;lt;span class=&quot;att&quot;&amp;gt; &amp;lt;!-- 기존 파일 삭제 후 새 파일 용도 --&amp;gt;
								&amp;lt;input type=&quot;file&quot; name=&quot;attFile&quot; /&amp;gt;
								&amp;lt;input type=&quot;hidden&quot; name=&quot;att&quot; id=&quot;att&quot; value=&quot;${data.ATT}&quot;/&amp;gt;
							&amp;lt;/span&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;/table&amp;gt;
	&amp;lt;/form&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;cancelBtn&quot;&amp;gt;취소&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;updateBtn&quot;&amp;gt;수정&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;T_SQL.xml&lt;/p&gt;
&lt;pre id=&quot;code_1661148385598&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;T&quot;&amp;gt;
	&amp;lt;select id=&quot;getTCnt&quot; resultType=&quot;Integer&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT COUNT(*) AS CNT
		FROM TBOARD T INNER JOIN MEM M ON T.MEM_NO = M.MEM_NO
		AND M.DEL = 1
		WHERE T.DEL = 1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt !=''&quot;&amp;gt;
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 0&quot;&amp;gt;
					AND T.TITLE LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 1&quot;&amp;gt;
					AND M.MEM_NM LIKE '%' ||  #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;getTList&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT T.NO, T.TITLE, T.MEM_NM, T.HIT, T.DT, T.ATT
		FROM(
		SELECT T.NO, T.TITLE, M.MEM_NM, T.HIT,
		CASE WHEN TO_CHAR(DT,'YY.MM.DD') = TO_CHAR(SYSDATE, 'YY.MM.DD')
		        THEN TO_CHAR(DT, 'HH24:MI')
		        ELSE TO_CHAR(DT, 'YY.MM.DD')
		        END AS DT, ATT,
		        ROW_NUMBER() OVER(ORDER BY T.NO DESC) AS RNUM
				FROM TBOARD T INNER JOIN MEM M ON T.MEM_NO = M.MEM_NO
				AND M.DEL = 1
		WHERE T.DEL = 1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt !=''&quot;&amp;gt;
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 0&quot;&amp;gt;
					AND T.TITLE LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 1&quot;&amp;gt;
					AND M.MEM_NM LIKE '%' ||  #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;) T
		WHERE T.RNUM BETWEEN #{start} AND #{end}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;insertT&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO TBOARD(NO, TITLE, MEM_NO, CON, ATT)
		VALUES (TBOARD_SEQ.NEXTVAL, #{title} , #{memNo}, #{con}, #{att})
	&amp;lt;/insert&amp;gt;
	 
	&amp;lt;select id=&quot;getT&quot; parameterType=&quot;hashmap&quot;  resultType=&quot;hashmap&quot;&amp;gt;
		SELECT T.NO, T.TITLE, M.MEM_NO, M.MEM_NM, T.CON, T.HIT,
	    TO_CHAR(T.DT, 'YYYY-MM-DD') AS DT, T.ATT
		FROM TBOARD T INNER JOIN MEM M ON T.MEM_NO = M.MEM_NO
		AND M.DEL = 1
		WHERE T.DEL = 1
		AND T.NO = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;update id=&quot;updateTHit&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE TBOARD SET HIT = HIT + 1
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;update id=&quot;deleteT&quot;  parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE TBOARD SET DEL = 0
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;update id=&quot;updateT&quot;  parameterType=&quot;hashmap&quot;&amp;gt;		
		UPDATE TBOARD SET TITLE = #{title},
		CON = #{con},
		ATT = #{att}
		WHERE NO = #{no}
	&amp;lt;/update&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;&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;내일 한줄게시판 할예정, 한줄게시판이 댓글이 됨&lt;/p&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>TIL/academy</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/128</guid>
      <comments>https://makeaplayground.tistory.com/128#entry128comment</comments>
      <pubDate>Mon, 22 Aug 2022 15:07:03 +0900</pubDate>
    </item>
    <item>
      <title>국비 TIL(Today I Learned) 20220818 스프링 ajax로 추가, 상세, 수정, 삭제, mem테이블 실습</title>
      <link>https://makeaplayground.tistory.com/126</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;어제 list.jsp 에서&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZDFMM/btrJWVAtFo2/9mFjxqAnFQLPf7rWyVzaF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZDFMM/btrJWVAtFo2/9mFjxqAnFQLPf7rWyVzaF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZDFMM/btrJWVAtFo2/9mFjxqAnFQLPf7rWyVzaF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZDFMM%2FbtrJWVAtFo2%2F9mFjxqAnFQLPf7rWyVzaF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;258&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if문 삭제 (완전히 비동기 형식일때는 if문 넣는게 맞는데, 우리는 동기 섞여있으니)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1wh3b/btrJV7hJa1S/BXTpd4O6xpOhihCfVgKdW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1wh3b/btrJV7hJa1S/BXTpd4O6xpOhihCfVgKdW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1wh3b/btrJV7hJa1S/BXTpd4O6xpOhihCfVgKdW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1wh3b%2FbtrJV7hJa1S%2FBXTpd4O6xpOhihCfVgKdW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;227&quot; data-origin-width=&quot;482&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;이 방식으로! else문 추가됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GcYll/btrJWNCOAHV/khRlv2k3XYKkwUYOIOsqTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GcYll/btrJWNCOAHV/khRlv2k3XYKkwUYOIOsqTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GcYll/btrJWNCOAHV/khRlv2k3XYKkwUYOIOsqTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGcYll%2FbtrJWNCOAHV%2FkhRlv2k3XYKkwUYOIOsqTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;502&quot; height=&quot;132&quot; data-origin-width=&quot;502&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;&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;T폴더에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 insert, update, detail, delete 기능 추가하고,&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;615&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cs6djA/btrJYzxEnPM/OpBu8tXsE9TzE8I8FlXGWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cs6djA/btrJYzxEnPM/OpBu8tXsE9TzE8I8FlXGWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cs6djA/btrJYzxEnPM/OpBu8tXsE9TzE8I8FlXGWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcs6djA%2FbtrJYzxEnPM%2FOpBu8tXsE9TzE8I8FlXGWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1118&quot; height=&quot;615&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;615&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #595959;&quot;&gt;Ajax : 목록조회, 등록, 수정, 삭제&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #595959;&quot;&gt;동기화: 단건 조회, 단순 이동&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220816_155747160.png&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnu5Fo/btrJ1CmPXxc/Pzk7ftxKqY6vOnNcseZyF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnu5Fo/btrJ1CmPXxc/Pzk7ftxKqY6vOnNcseZyF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnu5Fo/btrJ1CmPXxc/Pzk7ftxKqY6vOnNcseZyF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbnu5Fo%2FbtrJ1CmPXxc%2FPzk7ftxKqY6vOnNcseZyF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1164&quot; height=&quot;647&quot; data-filename=&quot;KakaoTalk_20220816_155747160.png&quot; data-origin-width=&quot;1164&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;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MEM 테이블 ajax로 변경(실습)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nt2Xd/btrJYzqSsB3/ubNIPndPKHk1Nf4ZE6qkDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nt2Xd/btrJYzqSsB3/ubNIPndPKHk1Nf4ZE6qkDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nt2Xd/btrJYzqSsB3/ubNIPndPKHk1Nf4ZE6qkDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNt2Xd%2FbtrJYzqSsB3%2FubNIPndPKHk1Nf4ZE6qkDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;270&quot; height=&quot;217&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;183&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caKyeI/btrJWXetUoM/KPVuOyCPgIN2hjUUnVUT7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caKyeI/btrJWXetUoM/KPVuOyCPgIN2hjUUnVUT7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caKyeI/btrJWXetUoM/KPVuOyCPgIN2hjUUnVUT7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaKyeI%2FbtrJWXetUoM%2FKPVuOyCPgIN2hjUUnVUT7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;183&quot; height=&quot;290&quot; data-origin-width=&quot;183&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;이렇게 폴더, 파일 만듬&lt;/p&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;testa/T/list.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660804253436&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
#searchTxt{
width: 160px;
height: 30px; 
padding: 0px 2px;
text-indent: 5px;
vertical-align: middle;
border: 1px solid #d7d7d7; 
outline-color: #70adf9;
box-sizing: border-box;
}
.search_area{
	width: 800px;
	text-align: right;
	margin: 0 auto;
}
.board_area{
	width: 800px;
	margin: 0 auto;
}

&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	if(&quot;${params.searchGbn}&quot; != &quot;&quot;){
		$(&quot;#searchGbn&quot;).val(&quot;${param.searchGbn}&quot;);
	} else {
		$(&quot;#oldGbn&quot;).val(&quot;0&quot;);
	}
	
	//목록 조회
	reloadList();
	
	//검색버튼
	$(&quot;#searchBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#page&quot;).val(&quot;1&quot;);
		// 이동을 안하다보니 문제가 기존검색값 셋팅을 안해줌
		// 그래서  신규 상태 적용
		$(&quot;#oldGbn&quot;).val($(&quot;#searchGbn&quot;).val());
		$(&quot;#oldTxt&quot;).val($(&quot;#searchTxt&quot;).val());
		
		
		// 데이터만 가져와서 다시 그려줌, 화면 이동 없음
		reloadList();
	});
	
	//페이징 버튼
	$(&quot;.paging_area&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		// 기존 검색상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
			
		
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));
		
		reloadList();
	})
	
	// 등록버튼
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		// 기존 검색상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;, &quot;ATInsert&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;tr&quot;, function () {
		$(&quot;#no&quot;).val($(this).attr(&quot;no&quot;));
		
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;, &quot;ATDetail&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
});

// 목록 조회 호출, ajax불러오기
function reloadList() {
	var params = $(&quot;#actionForm&quot;).serialize();
	
	$.ajax({
		url : &quot;ATListAjax&quot;, //경로
		type : &quot;POST&quot;, // 전송방식(GET: 주소형태, POST : 주소 헤더 형태)
		dataType: &quot;json&quot;, // 데이터 형태
		data: params, // 보낼데이터
		success : function(res) { //성공했을 때 결과를 res에 받고 함수 실행
			console.log(res); // 콘솔에  pd랑 list 값이 보임
			drawList(res.list);
			drawPaging(res.pd);
		},
		error : function(request, status, error) { // 실패했을 때 함수실행
			console.log(request.responseText); // 실패 상세 태역
		}
	});
	
}

function drawList(list) {
	var html = &quot;&quot;;
	
	// list에는 map이 들어있으니까 하나씩 꺼내오겠다
	for(var data of list){
		html += &quot;&amp;lt;tr no=\&quot;&quot; + data.NO + &quot;\&quot;&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.NO + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.TITLE + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.MEM_NM + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.DT + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.HIT + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;/tr&amp;gt;&quot;;
	}   
	
	$(&quot;tbody&quot;).html(html);
}

function drawPaging(pd) {
	var html = &quot;&quot;;
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_first\&quot; page=\&quot;1\&quot;&amp;gt;처음&amp;lt;/span&amp;gt;&quot;;
	// 이전
	if($(&quot;#page&quot;).val() == &quot;1&quot;){
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;1\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	} else{
		// 문자열을 숫자로 바꾸기위해 *1
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 - 1) + &quot;\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	}
	
	for(var i = pd.startP; i &amp;lt;= pd.endP; i++){
		if($(&quot;#page&quot;).val() * 1 == i){ // 현재 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn_on\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		} else { // 다른 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		}
	}
	
	if($(&quot;#page&quot;).val() *1 == pd.endP){ // 현재페이지가 마지막 페이지라면
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	} else {
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 + 1) + &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	}
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_last\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;마지막&amp;lt;/span&amp;gt;&quot;;
	
	$(&quot;.paging_area&quot;).html(html);
                                                                     
}
&amp;lt;/script&amp;gt;		
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;hr/&amp;gt;
&amp;lt;!-- 페이징 때 기존 검색 내용 유지용 --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;

&amp;lt;!-- 데이터 후 처리해서 로딩이 빨라 --&amp;gt;
&amp;lt;div class=&quot;search_area&quot;&amp;gt;
	&amp;lt;!--  method=&quot;post&quot;는 나중에 쓸 예정, no 보낼때 --&amp;gt;
	&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; id=&quot;no&quot; /&amp;gt;
		&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; id=&quot;page&quot; value=&quot;${page}&quot; /&amp;gt;
		&amp;lt;select name=&quot;searchGbn&quot; id=&quot;searchGbn&quot;&amp;gt;
			&amp;lt;option value=&quot;0&quot;&amp;gt;제목&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;1&quot;&amp;gt;작성자&amp;lt;/option&amp;gt;
		&amp;lt;/select&amp;gt;
		&amp;lt;input type=&quot;text&quot; name=&quot;searchTxt&quot; id=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot; /&amp;gt;
		&amp;lt;div class=&quot;cmn_btn_ml&quot; id=&quot;searchBtn&quot;&amp;gt;검색&amp;lt;/div&amp;gt;
		&amp;lt;c:if test=&quot;${!empty sMemNo}&quot;&amp;gt;
			&amp;lt;div class=&quot;cmn_btn_ml&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&amp;gt;
		&amp;lt;/c:if&amp;gt;
	&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;board_area&quot;&amp;gt;
&amp;lt;table class=&quot;board_table&quot;&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;400&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
	&amp;lt;/colgroup&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;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div class=&quot;paging_area&quot;&amp;gt;&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;testa/T/insert.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660804876460&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{
	width: 800px;
	margin: 0 auto;
}


&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- CKEditor --&amp;gt;
&amp;lt;!-- 제이쿼리 뒤에 나와야함, 제이쿼리 기반으로 동작하기 때문에 --&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/ckeditor/ckeditor.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	// 에디터 연결
	// CKEDITOR.replace(아이디, 옵션)
	CKEDITOR.replace(&quot;con&quot;, {
		resize_enabled: false, // resize_enabled : 크기조절기능 활용여부
		language : &quot;ko&quot;, // 사용언어
		enterMode: &quot;2&quot;, // 엔터키처리방법. 2번이면 &amp;lt;br/&amp;gt;
		width : &quot;100%&quot;, // 숫자일경우 px, 문자열일경우 css크기
		height : 400
	});
	
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#backForm&quot;).submit();
	});
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		// CKEditor의 값 취득
		// CKEDITOR.instances[아이디] : CKEditor중 아이디가 같은 것을 찾겠다.
		//.getData() : 작성중인 내용을 취득하겠다.
		$(&quot;#con&quot;).val(CKEDITOR.instances['con'].getData());
		
		if($.trim($(&quot;#title&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;제목 입력하세요.&quot; , function () {
				$(&quot;#title&quot;).focus();
			})
		} else if($.trim($(&quot;#con&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;내용을 입력하세요.&quot; , function () {
				$(&quot;#con&quot;).focus();
			})
		} else {
			var params = $(&quot;#actionForm&quot;).serialize();
			
			$.ajax({
				url : &quot;ATAction/insert&quot;, //restful api라는게 여기서 시작한다고?
				type : &quot;POST&quot;, 
				dataType: &quot;json&quot;, 
				data: params, 
				success : function(res) { 
					switch(res.msg){
					case &quot;success&quot; : 
						location.href =&quot;ATList&quot;;
						break;
					case &quot;fail&quot; :
						makeAlert(&quot;알림&quot; , &quot;등록에 실패하였습니다.&quot;);
						break;
					case &quot;error&quot; :
						makeAlert(&quot;알림&quot; , &quot;등록 중 문제가 발생하였습니다.&quot;);
						break;
					}
				},
				error : function(request, status, error) { 
					console.log(request.responseText); 
				}
			});
			
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;form action=&quot;ATList&quot; id=&quot;backForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;!-- ajax쓰기 때문에 gbn 지움 --&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
	&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;!--gbn : 구분, 혹은 flag
	구분: i - insert, u - update, d - delete  --&amp;gt;
	&amp;lt;!-- &amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;i&quot;/&amp;gt; --&amp;gt;
		&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot; /&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;${sMemNm}&amp;lt;input type=&quot;hidden&quot; name=&quot;memNo&quot; value=&quot;${sMemNo}&quot; /&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th colspan=&quot;2&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th colspan=&quot;2&quot;&amp;gt;&amp;lt;textarea rows=&quot;10&quot; cols=&quot;30&quot; name=&quot;con&quot; id=&quot;con&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/form&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;listBtn&quot;&amp;gt;목록&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;testa/T/detail.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660804928419&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{
	width: 800px;
	margin: 0 auto;
}
.con{
text-align: left; 
min-height: 400px;
}
&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function() {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;ATList&quot;); 
		$(&quot;#actionForm&quot;).submit();
	});
	
	// ajax사용 예정
	$(&quot;#deleteBtn&quot;).on(&quot;click&quot;, function () {
		  makePopup({
		         title : &quot;알림&quot;,
		         contents : &quot;삭제하시겠습니까?&quot;,
		         // draggable : true,
		         buttons : [{
		            name : &quot;삭제&quot;,
		            func:function() {
		            	var params = $(&quot;#actionForm&quot;).serialize();
		    			
		    			$.ajax({
		    				url : &quot;ATAction/delete&quot;, //restful api라는게 여기서 시작한다고?
		    				type : &quot;POST&quot;, 
		    				dataType: &quot;json&quot;, 
		    				data: params, 
		    				success : function(res) { 
		    					switch(res.msg){
		    					case &quot;success&quot; : 
		    						location.href =&quot;ATList&quot;;
		    						break;
		    					case &quot;fail&quot; :
		    						makeAlert(&quot;알림&quot; , &quot;삭제에 실패하였습니다.&quot;);
		    						break;
		    					case &quot;error&quot; :
		    						makeAlert(&quot;알림&quot; , &quot;삭제 중 문제가 발생하였습니다.&quot;);
		    						break;
		    					}
		    				},
		    				error : function(request, status, error) { 
		    					console.log(request.responseText); 
		    				}
		    			});
		            }
		         }, {
		            name : &quot;취소&quot;
		    }]
		});
	});
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;ATUpdate&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;d&quot;&amp;gt; &amp;lt;!-- selRes는 gbn을 받게 되어있어서 값을 추가해줘야함 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.NO}&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
		&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.NO}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.TITLE}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.MEM_NM}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt; ${data.HIT}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt; ${data.DT}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th colspan=&quot;2&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;td class=&quot;con&quot; colspan=&quot;2&quot;&amp;gt;${data.CON}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;listBtn&quot;&amp;gt;목록&amp;lt;/div&amp;gt;
	&amp;lt;c:if test=&quot;${sMemNo eq data.MEM_NO}&quot;&amp;gt;
		&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;deleteBtn&quot;&amp;gt;삭제&amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;updateBtn&quot;&amp;gt;수정&amp;lt;/div&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;testa/T/update.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660804960875&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{
	width: 800px;
	margin: 0 auto;
}


&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- CKEditor --&amp;gt;
&amp;lt;!-- 제이쿼리 뒤에 나와야함, 제이쿼리 기반으로 동작하기 때문에 --&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/ckeditor/ckeditor.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	// 에디터 연결
	// CKEDITOR.replace(아이디, 옵션)
	CKEDITOR.replace(&quot;con&quot;, {
		resize_enabled: false, // resize_enabled : 크기조절기능 활용여부
		language : &quot;ko&quot;, // 사용언어
		enterMode: &quot;2&quot;, // 엔터키처리방법. 2번이면 &amp;lt;br/&amp;gt;
		width : &quot;100%&quot;, // 숫자일경우 px, 문자열일경우 css크기
		height : 400
	});
	
	$(&quot;#cancelBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#backForm&quot;).submit();
	});
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		// CKEditor의 값 취득
		// CKEDITOR.instances[아이디] : CKEditor중 아이디가 같은 것을 찾겠다.
		//.getData() : 작성중인 내용을 취득하겠다.
		$(&quot;#con&quot;).val(CKEDITOR.instances['con'].getData());
		
		if($.trim($(&quot;#title&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;제목 입력하세요.&quot; , function () {
				$(&quot;#title&quot;).focus();
			})
		} else if($.trim($(&quot;#con&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;내용을 입력하세요.&quot; , function () {
				$(&quot;#con&quot;).focus();
			})
		} else {
			var params = $(&quot;#actionForm&quot;).serialize();
			
			$.ajax({
				url : &quot;ATAction/update&quot;, //restful api라는게 여기서 시작한다고?
				type : &quot;POST&quot;, 
				dataType: &quot;json&quot;, 
				data: params, 
				success : function(res) { 
					switch(res.msg){
					case &quot;success&quot; : 
						$(&quot;#backForm&quot;).submit();
						break;
					case &quot;fail&quot; :
						makeAlert(&quot;알림&quot; , &quot;수정에 실패하였습니다.&quot;);
						break;
					case &quot;error&quot; :
						makeAlert(&quot;알림&quot; , &quot;수정 중 문제가 발생하였습니다.&quot;);
						break;
					}
				},
				error : function(request, status, error) { 
					console.log(request.responseText); 
				}
			});
			
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testAHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;form action=&quot;ATDetail&quot; id=&quot;backForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.NO}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;!-- ajax쓰기 때문에 gbn 지움 --&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
	&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.NO}&quot; /&amp;gt;
		&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;${data.NO}&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot; value=&quot;${data.TITLE}&quot;/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;${sMemNm}&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th colspan=&quot;2&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th colspan=&quot;2&quot;&amp;gt;&amp;lt;textarea rows=&quot;10&quot; cols=&quot;30&quot; name=&quot;con&quot; id=&quot;con&quot;&amp;gt;${data.CON}&amp;lt;/textarea&amp;gt;&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/form&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;cancelBtn&quot;&amp;gt;취소&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;updateBtn&quot;&amp;gt;수정&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ATController.java&lt;/p&gt;
&lt;pre id=&quot;code_1660805015829&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.Controller;

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

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.spring.sample.common.service.IPagingService;
import com.spring.sample.web.testa.dao.IACDao;

@Controller
public class ATController {
	@Autowired
	public IACDao iACDao;

	@Autowired
	public IPagingService ips;

	@RequestMapping(value = &quot;/ATList&quot;)
	public ModelAndView ATList(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) {

		// 비동기가 되면 일단 아무것도 처음에 셋팅 X,
		// 페이지만 셋팅
		int page = 1;

		if (params.get(&quot;page&quot;) != null &amp;amp;&amp;amp; params.get(&quot;page&quot;) != &quot;&quot;) {
			page = Integer.parseInt(params.get(&quot;page&quot;));
		}

		mav.addObject(&quot;page&quot;, page);
		mav.setViewName(&quot;testa/T/list&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/ATListAjax&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String ATListAjax(@RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		// 페이지 받아오게 되어있음
		int cnt = iACDao.getInt(&quot;T.getTCnt&quot;, params);

		HashMap&amp;lt;String, Integer&amp;gt; pd = ips.getPagingData(Integer.parseInt(params.get(&quot;page&quot;)), cnt, 10, 5);

		params.put(&quot;start&quot;, Integer.toString(pd.get(&quot;start&quot;)));
		params.put(&quot;end&quot;, Integer.toString(pd.get(&quot;end&quot;)));

		List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; list = iACDao.getList(&quot;T.getTList&quot;, params);

		model.put(&quot;list&quot;, list);
		model.put(&quot;pd&quot;, pd);

		return mapper.writeValueAsString(model);
	}

	@RequestMapping(value = &quot;/ATInsert&quot;)
	public ModelAndView aTInsert(HttpSession session, ModelAndView mav) {
		if (session.getAttribute(&quot;sMemNm&quot;) != null &amp;amp;&amp;amp; session.getAttribute(&quot;sMemNm&quot;) != &quot;&quot;) {
			mav.setViewName(&quot;testa/T/insert&quot;);
		} else {
			mav.setViewName(&quot;redirect:testALogin&quot;);
		}
		return mav;
	}

	@RequestMapping(value = &quot;/ATAction/{gbn}&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String ATAction(@PathVariable String gbn, @RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		int cnt = 0;

		try {
			switch (gbn) {
			case &quot;insert&quot;:
				cnt = iACDao.insert(&quot;T.insertT&quot;, params);
				break;
			case &quot;update&quot;:
				cnt = iACDao.update(&quot;T.updateT&quot;, params);
				break;
			case &quot;delete&quot;:
				cnt = iACDao.update(&quot;T.deleteT&quot;, params);
				break;
			}

			if (cnt &amp;gt; 0) {
				model.put(&quot;msg&quot;, &quot;success&quot;);
			} else {
				model.put(&quot;msg&quot;, &quot;fail&quot;);
			}
		} catch (Exception e) {
			e.printStackTrace();
			model.put(&quot;msg&quot;, &quot;error&quot;);
		}

		return mapper.writeValueAsString(model);
	}

	// 가져오고 변경되는게 없기 때문에 비동기 처리로 안되도 됨
	@RequestMapping(value = &quot;/ATDetail&quot;)
	public ModelAndView aTDetail(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {
		// 글번호 안 넘어왔을때 처리
		if (params.get(&quot;no&quot;) != null &amp;amp;&amp;amp; params.get(&quot;no&quot;) != &quot;&quot;) {
			// 조회수
			iACDao.update(&quot;T.updateTHit&quot;, params);
			HashMap&amp;lt;String, String&amp;gt; data = iACDao.getMap(&quot;T.getT&quot;, params);

			mav.addObject(&quot;data&quot;, data);

			mav.setViewName(&quot;testa/T/detail&quot;);
		} else {
			mav.setViewName(&quot;redirect:ATList&quot;);
		}

		return mav;
	}

	@RequestMapping(value = &quot;/ATUpdate&quot;)
	public ModelAndView aTUpdate(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {
		// 글번호 안 넘어왔을때 처리
		if (params.get(&quot;no&quot;) != null &amp;amp;&amp;amp; params.get(&quot;no&quot;) != &quot;&quot;) {
			HashMap&amp;lt;String, String&amp;gt; data = iACDao.getMap(&quot;T.getT&quot;, params);

			mav.addObject(&quot;data&quot;, data);

			mav.setViewName(&quot;testa/T/update&quot;);
		} else {
			mav.setViewName(&quot;redirect:ATList&quot;);
		}

		return mav;
	}

}&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;testa/Mem/list.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660805092355&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
#searchTxt{
width: 160px;
height: 30px; 
padding: 0px 2px;
text-indent: 5px;
vertical-align: middle;
border: 1px solid #d7d7d7; 
outline-color: #70adf9;
box-sizing: border-box;
}
.search_area{
	width: 800px;
	text-align: right;
	margin: 0 auto;
}
.board_area{
	width: 800px;
	margin: 0 auto;
}

&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	if(&quot;${params.searchGbn}&quot; != &quot;&quot;){
		$(&quot;#searchGbn&quot;).val(&quot;${param.searchGbn}&quot;);
	} else {
		$(&quot;#oldGbn&quot;).val(&quot;0&quot;);
	}
	
	//목록 조회
	reloadList();
	
	$(&quot;#actionForm&quot;).on(&quot;keypress&quot;,&quot;input&quot;, function(event) {

		if(event.keyCode == 13){
			$(&quot;#searchBtn&quot;).click();
			return false;
		
		}
	})
	
	//검색버튼
	$(&quot;#searchBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#page&quot;).val(&quot;1&quot;);
		// 이동을 안하다보니 문제가 기존검색값 셋팅을 안해줌
		// 그래서  신규 상태 적용
		$(&quot;#oldGbn&quot;).val($(&quot;#searchGbn&quot;).val());
		$(&quot;#oldTxt&quot;).val($(&quot;#searchTxt&quot;).val());
		
		
		// 데이터만 가져와서 다시 그려줌, 화면 이동 없음
		reloadList();
	});
	
	//페이징 버튼
	$(&quot;.paging_area&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		// 기존 검색상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
			
		
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));
		
		reloadList();
	})
	
	// 등록버튼
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		// 기존 검색상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;, &quot;AMInsert&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;tr&quot;, function () {
		$(&quot;#no&quot;).val($(this).attr(&quot;no&quot;));
		
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;, &quot;AMDetail&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
});

// 목록 조회 호출, ajax불러오기
function reloadList() {
	var params = $(&quot;#actionForm&quot;).serialize();
	
	$.ajax({
		url : &quot;AMListAjax&quot;, //경로
		type : &quot;POST&quot;, // 전송방식(GET: 주소형태, POST : 주소 헤더 형태)
		dataType: &quot;json&quot;, // 데이터 형태
		data: params, // 보낼데이터
		success : function(res) { //성공했을 때 결과를 res에 받고 함수 실행
			console.log(res); // 콘솔에  pd랑 list 값이 보임
			drawList(res.list);
			drawPaging(res.pd);
		},
		error : function(request, status, error) { // 실패했을 때 함수실행
			console.log(request.responseText); // 실패 상세 태역
		}
	});
	
}

function drawList(list) {
	var html = &quot;&quot;;
	
	// list에는 map이 들어있으니까 하나씩 꺼내오겠다
	for(var data of list){
		html += &quot;&amp;lt;tr no=\&quot;&quot; + data.MEM_NO + &quot;\&quot;&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.MEM_NO + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.MEM_ID + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.MEM_NM + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;td&amp;gt;&quot; + data.REG_DT + &quot;&amp;lt;/td&amp;gt;&quot;;
		html += &quot;&amp;lt;/tr&amp;gt;&quot;;
	}   
	
	$(&quot;tbody&quot;).html(html);
}

function drawPaging(pd) {
	var html = &quot;&quot;;
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_first\&quot; page=\&quot;1\&quot;&amp;gt;처음&amp;lt;/span&amp;gt;&quot;;
	// 이전
	if($(&quot;#page&quot;).val() == &quot;1&quot;){
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;1\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	} else{
		// 문자열을 숫자로 바꾸기위해 *1
		html += &quot;&amp;lt;span class=\&quot;page_btn page_prev\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 - 1) + &quot;\&quot;&amp;gt;이전&amp;lt;/span&amp;gt;&quot;;
	}
	
	for(var i = pd.startP; i &amp;lt;= pd.endP; i++){
		if($(&quot;#page&quot;).val() * 1 == i){ // 현재 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn_on\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		} else { // 다른 페이지
			html += &quot;&amp;lt;span class=\&quot;page_btn\&quot; page=\&quot;&quot; + i + &quot;\&quot;&amp;gt;&quot; + i + &quot;&amp;lt;/span&amp;gt;&quot;;
		}
	}
	
	if($(&quot;#page&quot;).val() *1 == pd.endP){ // 현재페이지가 마지막 페이지라면
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	} else {
		html += &quot;&amp;lt;span class=\&quot;page_btn page_next\&quot; page=\&quot;&quot; + ($(&quot;#page&quot;).val() *1 + 1) + &quot;\&quot;&amp;gt;다음&amp;lt;/span&amp;gt;&quot;;
	}
	
	html += &quot;&amp;lt;span class=\&quot;page_btn page_last\&quot; page=\&quot;&quot; +pd.maxP+ &quot;\&quot;&amp;gt;마지막&amp;lt;/span&amp;gt;&quot;;
	
	$(&quot;.paging_area&quot;).html(html);
                                                                     
}





&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;div class=&quot;search_area&quot;&amp;gt;
	&amp;lt;!--  method=&quot;post&quot;는 나중에 쓸 예정, no 보낼때 --&amp;gt;
	&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; id=&quot;no&quot; /&amp;gt;
		&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; id=&quot;page&quot; value=&quot;${page}&quot; /&amp;gt;
		&amp;lt;select name=&quot;searchGbn&quot; id=&quot;searchGbn&quot;&amp;gt;
			&amp;lt;option value=&quot;0&quot;&amp;gt;아이디&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;1&quot;&amp;gt;이름&amp;lt;/option&amp;gt;
		&amp;lt;/select&amp;gt;
		&amp;lt;input type=&quot;text&quot; name=&quot;searchTxt&quot; id=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot; /&amp;gt;
		&amp;lt;div class=&quot;cmn_btn_ml&quot; id=&quot;searchBtn&quot;&amp;gt;검색&amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;cmn_btn_ml&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&amp;gt;
	&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;board_area&quot;&amp;gt;
&amp;lt;table class=&quot;board_table&quot;&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
		&amp;lt;col width=&quot;100&quot; /&amp;gt;
	&amp;lt;/colgroup&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;/tr&amp;gt;
	&amp;lt;/thead&amp;gt;
	&amp;lt;tbody&amp;gt;&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;div class=&quot;paging_area&quot;&amp;gt;&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;testa/Mem/insert.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660805170316&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{
	width: 800px;
	margin: 0 auto;
}
&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {

	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#backForm&quot;).submit();
	});
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		
		if($.trim($(&quot;#memId&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;아이디 입력하세요.&quot; , function () {
				$(&quot;#memId&quot;).focus();
			})
		} else if($.trim($(&quot;#memPw&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;비밀번호를 입력세요.&quot; , function () {
				$(&quot;#memPw&quot;).focus();
			})
		} else if($.trim($(&quot;#memPw&quot;).val()) != $.trim($(&quot;#repw&quot;).val())){
			makeAlert(&quot;알림&quot;,&quot;비밀번호가 일치하지 않습니다.&quot; , function () {
				$(&quot;#memPw&quot;).val(&quot;&quot;);
				$(&quot;#repw&quot;).val(&quot;&quot;);
				$(&quot;#memPw&quot;).focus();
			})
		} else if($.trim($(&quot;#memNm&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;이름을 입력하세요.&quot; , function () {
				$(&quot;#memNm&quot;).focus();
			})
		} else if($.trim($(&quot;#memBirth&quot;).val()) == &quot;&quot;){
			makeAlert(&quot;알림&quot;,&quot;생년월일을 입력하세요&quot; , function () {
				$(&quot;#memBirth&quot;).focus();
			})
		} else {
			var params = $(&quot;#actionForm&quot;).serialize();
			
			$.ajax({
				url : &quot;AMAction/insert&quot;, //restful api라는게 여기서 시작한다고?
				type : &quot;POST&quot;, 
				dataType: &quot;json&quot;, 
				data: params, 
				success : function(res) { 
					switch(res.msg){
					case &quot;success&quot; : 
						location.href =&quot;AMList&quot;;
						break;
					case &quot;fail&quot; :
						makeAlert(&quot;알림&quot; , &quot;등록에 실패하였습니다.&quot;);
						break;
					case &quot;error&quot; :
						makeAlert(&quot;알림&quot; , &quot;등록 중 문제가 발생하였습니다.&quot;);
						break;
					}
				},
				error : function(request, status, error) { 
					console.log(request.responseText); 
				}
			});
			
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;form action=&quot;ATList&quot; id=&quot;backForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;!-- ajax쓰기 때문에 gbn 지움 --&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
	&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;!--gbn : 구분, 혹은 flag
	구분: i - insert, u - update, d - delete  --&amp;gt;
	&amp;lt;!-- &amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;i&quot;/&amp;gt; --&amp;gt;
		&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;아이디&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;memId&quot; id=&quot;memId&quot; /&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;비밀번호&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;password&quot; name=&quot;memPw&quot; id=&quot;memPw&quot; /&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;비밀번호 확인&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;password&quot; id=&quot;repw&quot; /&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;이름&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;memNm&quot; id=&quot;memNm&quot; /&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;생년월일&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;date&quot; name=&quot;memBirth&quot; id=&quot;memBirth&quot; /&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/form&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;listBtn&quot;&amp;gt;목록&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;insertBtn&quot;&amp;gt;등록&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;testa/Mem/detail.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660805117028&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{
	width: 800px;
	margin: 0 auto;
}
&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function() {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;AMList&quot;); 
		$(&quot;#actionForm&quot;).submit();
	});
	
	// ajax사용 예정
	$(&quot;#deleteBtn&quot;).on(&quot;click&quot;, function () {
		  makePopup({
		         title : &quot;알림&quot;,
		         contents : &quot;삭제하시겠습니까?&quot;,
		         // draggable : true,
		         buttons : [{
		            name : &quot;삭제&quot;,
		            func:function() {
		            	var params = $(&quot;#actionForm&quot;).serialize();
		    			
		    			$.ajax({
		    				url : &quot;AMAction/delete&quot;, //restful api라는게 여기서 시작한다고?
		    				type : &quot;POST&quot;, 
		    				dataType: &quot;json&quot;, 
		    				data: params, 
		    				success : function(res) { 
		    					switch(res.msg){
		    					case &quot;success&quot; : 
		    						location.href =&quot;AMList&quot;;
		    						break;
		    					case &quot;fail&quot; :
		    						makeAlert(&quot;알림&quot; , &quot;삭제에 실패하였습니다.&quot;);
		    						break;
		    					case &quot;error&quot; :
		    						makeAlert(&quot;알림&quot; , &quot;삭제 중 문제가 발생하였습니다.&quot;);
		    						break;
		    					}
		    				},
		    				error : function(request, status, error) { 
		    					console.log(request.responseText); 
		    				}
		    			});
		            }
		         }, {
		            name : &quot;취소&quot;
		    }]
		});
	});
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;AMUpdate&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
});
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.MEM_NO}&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
		&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.MEM_NO}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;아이디&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.MEM_ID}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;이름&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.MEM_NM}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;생년월일&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.MEM_BIRTH}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;th&amp;gt;등록일&amp;lt;/th&amp;gt;
		&amp;lt;td&amp;gt;${data.REG_DT}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;

&amp;lt;/table&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;listBtn&quot;&amp;gt;목록&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;deleteBtn&quot;&amp;gt;삭제&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;updateBtn&quot;&amp;gt;수정&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;testa/Mem/update.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660805193092&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- Common CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/cmn.css&quot; /&amp;gt;
&amp;lt;!-- Popup CSS --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/common/popup.css&quot; /&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
.wrap{
	width: 800px;
	margin: 0 auto;
}

&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/common/popup.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	
	$(&quot;#cancelBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#backForm&quot;).submit();
	});
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		
		// $.trim(값) : 값 앞 뒤 공백제거	
		if($.trim($(&quot;#memId&quot;).val()) == &quot;&quot;){
			alert(&quot;아이디 입력하세요&quot;);
			$(&quot;#memId&quot;).focus();
		}  else if($.trim($(&quot;#memNm&quot;).val()) == &quot;&quot;){
			alert(&quot;이름을 입력하세요&quot;);
			$(&quot;#memNm&quot;).focus();
		} else if($.trim($(&quot;#memPw&quot;).val()) !=&quot;&quot; // 이 부분이 업데이트에 추가됨 
				&amp;amp;&amp;amp; $.trim($(&quot;#memPw&quot;).val()) != $.trim($(&quot;#repw&quot;).val())){
			alert(&quot;비밀번호가 일치하지 않습니다.&quot;);
			$(&quot;#memPw&quot;).val(&quot;&quot;);
			$(&quot;#repw&quot;).val(&quot;&quot;);
			$(&quot;#memPw&quot;).focus();
		} else if($.trim($(&quot;#memBirth&quot;).val()) == &quot;&quot;){
			alert(&quot;생년월일을 입력하세요&quot;);
			$(&quot;#memBirth&quot;).focus();
		} else {
			var params = $(&quot;#actionForm&quot;).serialize();
			
			$.ajax({
				url : &quot;AMAction/update&quot;, //restful api라는게 여기서 시작한다고?
				type : &quot;POST&quot;, 
				dataType: &quot;json&quot;, 
				data: params, 
				success : function(res) { 
					switch(res.msg){
					case &quot;success&quot; : 
						$(&quot;#backForm&quot;).submit();
						break;
					case &quot;fail&quot; :
						makeAlert(&quot;알림&quot; , &quot;수정에 실패하였습니다.&quot;);
						break;
					case &quot;error&quot; :
						makeAlert(&quot;알림&quot; , &quot;수정 중 문제가 발생하였습니다.&quot;);
						break;
					}
				},
				error : function(request, status, error) { 
					console.log(request.responseText); 
				}
			});
			
		}
	});
});


&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;AMDetail&quot; id=&quot;backForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.MEM_NO}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;!-- ajax쓰기 때문에 gbn 지움 --&amp;gt;
&amp;lt;div class=&quot;wrap&quot;&amp;gt;
	&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.MEM_NO}&quot; /&amp;gt;
		&amp;lt;table class=&quot;board_detail_table&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;아이디&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;memId&quot; id=&quot;memId&quot; value=&quot;${data.MEM_ID}&quot;/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;이름&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;memNm&quot; id=&quot;memNm&quot;  value=&quot;${data.MEM_NM}&quot;/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;비밀번호&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;password&quot; name=&quot;memPw&quot; id=&quot;memPw&quot;  value=&quot;${data.MEM_PW}&quot;/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;비밀번호확인&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;password&quot; id=&quot;repw&quot; /&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;생년월일&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;date&quot; name=&quot;memBirth&quot; id=&quot;memBirth&quot; value=&quot;${data.MEM_BIRTH}&quot;/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/form&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;cancelBtn&quot;&amp;gt;취소&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;cmn_btn_ml float_right_btn&quot; id=&quot;updateBtn&quot;&amp;gt;수정&amp;lt;/div&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 data-ke-size=&quot;size16&quot;&gt;AMController.java&lt;/p&gt;
&lt;pre id=&quot;code_1660805244341&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.Controller;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.spring.sample.common.service.IPagingService;
import com.spring.sample.web.testa.dao.IACDao;

@Controller
public class AMController {
	@Autowired
	public IACDao iACDao;

	@Autowired
	public IPagingService ips;

	@RequestMapping(value = &quot;/AMList&quot;)
	public ModelAndView AMList(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) {

		// 비동기가 되면 일단 아무것도 처음에 셋팅 X,
		// 페이지만 셋팅
		int page = 1;

		if (params.get(&quot;page&quot;) != null &amp;amp;&amp;amp; params.get(&quot;page&quot;) != &quot;&quot;) {
			page = Integer.parseInt(params.get(&quot;page&quot;));
		}

		mav.addObject(&quot;page&quot;, page);
		mav.setViewName(&quot;testa/Mem/list&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/AMListAjax&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String AMListAjax(@RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		// 페이지 받아오게 되어있음
		int cnt = iACDao.getInt(&quot;mem.getMemCnt&quot;, params);

		HashMap&amp;lt;String, Integer&amp;gt; pd = ips.getPagingData(Integer.parseInt(params.get(&quot;page&quot;)), cnt, 10, 5);

		params.put(&quot;start&quot;, Integer.toString(pd.get(&quot;start&quot;)));
		params.put(&quot;end&quot;, Integer.toString(pd.get(&quot;end&quot;)));

		List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; list = iACDao.getList(&quot;mem.getMemList&quot;, params);

		model.put(&quot;list&quot;, list);
		model.put(&quot;pd&quot;, pd);

		return mapper.writeValueAsString(model);
	}

	@RequestMapping(value = &quot;/AMInsert&quot;)
	public ModelAndView aTInsert(ModelAndView mav) {

		mav.setViewName(&quot;testa/Mem/insert&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/AMAction/{gbn}&quot;, method = RequestMethod.POST, produces = &quot;text/json;charset=UTF-8&quot;)
	@ResponseBody
	public String AMAction(@PathVariable String gbn, @RequestParam HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		ObjectMapper mapper = new ObjectMapper();
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		int cnt = 0;

		try {
			switch (gbn) {
			case &quot;insert&quot;:
				cnt = iACDao.insert(&quot;mem.insertMem&quot;, params);
				break;
			case &quot;update&quot;:
				cnt = iACDao.update(&quot;mem.updateMem&quot;, params);
				break;
			case &quot;delete&quot;:
				cnt = iACDao.update(&quot;mem.deleteMem&quot;, params);
				break;
			}

			if (cnt &amp;gt; 0) {
				model.put(&quot;msg&quot;, &quot;success&quot;);
			} else {
				model.put(&quot;msg&quot;, &quot;fail&quot;);
			}
		} catch (Exception e) {
			e.printStackTrace();
			model.put(&quot;msg&quot;, &quot;error&quot;);
		}

		return mapper.writeValueAsString(model);
	}

	// 가져오고 변경되는게 없기 때문에 비동기 처리로 안되도 됨
	@RequestMapping(value = &quot;/AMDetail&quot;)
	public ModelAndView AMDetail(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {
		// 글번호 안 넘어왔을때 처리
		if (params.get(&quot;no&quot;) != null &amp;amp;&amp;amp; params.get(&quot;no&quot;) != &quot;&quot;) {

			HashMap&amp;lt;String, String&amp;gt; data = iACDao.getMap(&quot;mem.getMem&quot;, params);

			mav.addObject(&quot;data&quot;, data);

			mav.setViewName(&quot;testa/Mem/detail&quot;);
		} else {
			mav.setViewName(&quot;redirect:AMList&quot;);
		}

		return mav;
	}

	@RequestMapping(value = &quot;/AMUpdate&quot;)
	public ModelAndView aTUpdate(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {
		// 글번호 안 넘어왔을때 처리
		if (params.get(&quot;no&quot;) != null &amp;amp;&amp;amp; params.get(&quot;no&quot;) != &quot;&quot;) {
			HashMap&amp;lt;String, String&amp;gt; data = iACDao.getMap(&quot;mem.getMem&quot;, params);

			mav.addObject(&quot;data&quot;, data);

			mav.setViewName(&quot;testa/Mem/update&quot;);
		} else {
			mav.setViewName(&quot;redirect:AMList&quot;);
		}

		return mav;
	}

}&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;사용했던 sql, 기존꺼 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;T_SQL.xml&lt;/p&gt;
&lt;pre id=&quot;code_1660805310644&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;T&quot;&amp;gt;
	&amp;lt;select id=&quot;getTCnt&quot; resultType=&quot;Integer&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT COUNT(*) AS CNT
		FROM TBOARD T INNER JOIN MEM M ON T.MEM_NO = M.MEM_NO
		AND M.DEL = 1
		WHERE T.DEL = 1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt !=''&quot;&amp;gt;
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 0&quot;&amp;gt;
					AND T.TITLE LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 1&quot;&amp;gt;
					AND M.MEM_NM LIKE '%' ||  #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;getTList&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT T.NO, T.TITLE, T.MEM_NM, T.HIT, T.DT
		FROM(
		SELECT T.NO, T.TITLE, M.MEM_NM, T.HIT,
		CASE WHEN TO_CHAR(DT,'YY.MM.DD') = TO_CHAR(SYSDATE, 'YY.MM.DD')
		        THEN TO_CHAR(DT, 'HH24:MI')
		        ELSE TO_CHAR(DT, 'YY.MM.DD')
		        END AS DT,
		        ROW_NUMBER() OVER(ORDER BY T.NO DESC) AS RNUM
				FROM TBOARD T INNER JOIN MEM M ON T.MEM_NO = M.MEM_NO
				AND M.DEL = 1
		WHERE T.DEL = 1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt !=''&quot;&amp;gt;
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 0&quot;&amp;gt;
					AND T.TITLE LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 1&quot;&amp;gt;
					AND M.MEM_NM LIKE '%' ||  #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;) T
		WHERE T.RNUM BETWEEN #{start} AND #{end}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;insertT&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO TBOARD(NO, TITLE, MEM_NO, CON)
		VALUES (TBOARD_SEQ.NEXTVAL, #{title} , #{memNo}, #{con})
	&amp;lt;/insert&amp;gt;
	 
	&amp;lt;select id=&quot;getT&quot; parameterType=&quot;hashmap&quot;  resultType=&quot;hashmap&quot;&amp;gt;
		SELECT T.NO, T.TITLE, M.MEM_NO, M.MEM_NM, T.CON, T.HIT,
	    TO_CHAR(T.DT, 'YYYY-MM-DD') AS DT
		FROM TBOARD T INNER JOIN MEM M ON T.MEM_NO = M.MEM_NO
		AND M.DEL = 1
		WHERE T.DEL = 1
		AND T.NO = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;update id=&quot;updateTHit&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE TBOARD SET HIT = HIT + 1
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;update id=&quot;deleteT&quot;  parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE TBOARD SET DEL = 0
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;update id=&quot;updateT&quot;  parameterType=&quot;hashmap&quot;&amp;gt;		
		UPDATE TBOARD SET TITLE = #{title},
		CON = #{con}
		WHERE NO = #{no}
	&amp;lt;/update&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;Mem_SQL.xml&lt;/p&gt;
&lt;pre id=&quot;code_1660805341212&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- namespace : 클래스와 동일, 이 파일의 대표명 --&amp;gt;
&amp;lt;mapper namespace=&quot;mem&quot;&amp;gt;
	&amp;lt;!-- select : 조회 
		id: 구분자, 메소드명과 동일
		resultType : 조회 결과 중 한줄에 대한 자료 형태를 지정
		hashmap: mybatis-config.xml에서 별칭 지정해놔서 줄여쓸수있는거임
		쿼리 삽입시 주의사항: ;이 있는경우 문제가 발생한다. 이유는 해당 쿼리 실행시 자동으로 추가되기 때문
	--&amp;gt;
	&amp;lt;select id=&quot;getMemList&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT S.MEM_NO, S.MEM_ID, S.MEM_NM, S.REG_DT
		FROM (SELECT MEM_NO, MEM_ID, MEM_NM, TO_CHAR(REG_DT,'YYYY-MM-DD') AS REG_DT,
       		  ROW_NUMBER() OVER(ORDER BY REG_DT DESC, MEM_NO DESC) AS RNK
			  FROM MEM
			  WHERE DEL = 1
			&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; &amp;lt;!-- 검색어가 있다면 --&amp;gt;
				&amp;lt;choose&amp;gt;
					&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt; &amp;lt;!-- 아이디 --&amp;gt;
						AND MEM_ID LIKE '%' || #{searchTxt} || '%'
					&amp;lt;/when&amp;gt;
					&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt; &amp;lt;!-- 이름 --&amp;gt;
						AND MEM_NM LIKE '%' || #{searchTxt} || '%'
					&amp;lt;/when&amp;gt;
				&amp;lt;/choose&amp;gt;
			&amp;lt;/if&amp;gt;
             ) S
		WHERE S.RNK BETWEEN #{start} AND #{end}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;!-- 
		parameterType : 실행시 받는 값 
		#{키} : 헤당위치에 문자열로 키에 해당하는 값을 넣어준다
		ex) no에 3이 들어있는 경우
		WHERE SELL_NO = #{no}
		=&amp;gt; WHERE SELL_NO = '3' // 문자열이기 때문에  ' '이 들어감
		parameterType dao받는값, resultType값이 db실행결과
	--&amp;gt;
	&amp;lt;select id=&quot;getMem&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT MEM_NO, MEM_ID, MEM_NM, TO_CHAR(MEM_BIRTH,'YYYY-MM-DD') AS MEM_BIRTH, TO_CHAR(REG_DT,'YYYY-MM-DD') AS REG_DT
		FROM MEM
		WHERE MEM_NO = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;!-- insert는 resultType 이 없음 --&amp;gt;
	&amp;lt;insert id=&quot;insertMem&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO MEM(MEM_NO, MEM_ID, MEM_PW, MEM_NM, MEM_BIRTH)
		VALUES(MEM_SEQ.NEXTVAL, #{memId}, #{memPw}, #{memNm}, #{memBirth})
	&amp;lt;/insert&amp;gt;
	
	
	&amp;lt;update id=&quot;deleteMem&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE MEM SET DEL = 0
		WHERE MEM_NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;update id=&quot;updateMem&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE MEM SET MEM_ID = #{memId},
                MEM_NM = #{memNm},
                &amp;lt;if test=&quot;memPw != null and memPw != ''&quot;&amp;gt;
                	 MEM_PW = #{memPw},
                &amp;lt;/if&amp;gt;
                MEM_BIRTH = #{memBirth}
       	WHERE MEM_NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;select id=&quot;getMemCnt&quot; parameterType=&quot;hashmap&quot; resultType=&quot;Integer&quot;&amp;gt;
		SELECT COUNT(*) AS CNT 
		FROM MEM
		WHERE DEL = 1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; &amp;lt;!-- 검색어가 있다면 --&amp;gt;
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt; &amp;lt;!-- 품목 --&amp;gt;
					AND MEM_ID LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt; &amp;lt;!-- 수량 --&amp;gt;
					AND MEM_NM = #{searchTxt}
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&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;&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;size18&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #f3c000;&quot;&gt;&lt;i&gt;궁금증&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. VO객체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링에서 ajax 사용 이유, 사용법 이렇게 구글링하면 VO라는 말을 많이 볼수있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://yulfsong.tistory.com/76&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://yulfsong.tistory.com/76&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1660804803064&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Ajax data를 Controller에서 받는 두 가지 방법 : Vo / Map&quot; data-og-description=&quot;Ajax의 data를 Controller에서 받아야할 때가 자주 있는데 Vo를 만들어서 받는 방법이 있고 Map을 이용하는 방법이 있다. 1. Vo로 받는 방법 var memberId = $(&amp;quot;#memberId&amp;quot;).val(); var memberPass = $(&amp;quot;#memberPa..&quot; data-og-host=&quot;yulfsong.tistory.com&quot; data-og-source-url=&quot;https://yulfsong.tistory.com/76&quot; data-og-url=&quot;https://yulfsong.tistory.com/76&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nrsvR/hyPuEFTRdJ/HgmJ3CdyA706e1RUvLRQn1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/b9hlOK/hyPuB3uRv0/fP8Y8k2KxktccgjC1vlQMk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cToNoR/hyPuADxuZf/qBXqyWk3nYymRgh1eBglCK/img.jpg?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://yulfsong.tistory.com/76&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yulfsong.tistory.com/76&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nrsvR/hyPuEFTRdJ/HgmJ3CdyA706e1RUvLRQn1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/b9hlOK/hyPuB3uRv0/fP8Y8k2KxktccgjC1vlQMk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cToNoR/hyPuADxuZf/qBXqyWk3nYymRgh1eBglCK/img.jpg?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Ajax data를 Controller에서 받는 두 가지 방법 : Vo / Map&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ajax의 data를 Controller에서 받아야할 때가 자주 있는데 Vo를 만들어서 받는 방법이 있고 Map을 이용하는 방법이 있다. 1. Vo로 받는 방법 var memberId = $(&quot;#memberId&quot;).val(); var memberPass = $(&quot;#memberPa..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yulfsong.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VO 객체가 bean이래&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 추가 삭제때마다 getter/ setter 만들어야하고, 변수전언해야해서 우리는 Map으로 하는거임&lt;/p&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;2. ajax 추가할때, Restful api에 대해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터만 가져옴, 화면을 못 그림, 대부분의 오픈 api가 이렇게 되어있음, 내일 다시 한데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;샘플스프링에 데이터 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A0ogZ/btrJXjCAG7u/B8RFKBkUR2A0KyMaxcd02K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A0ogZ/btrJXjCAG7u/B8RFKBkUR2A0KyMaxcd02K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A0ogZ/btrJXjCAG7u/B8RFKBkUR2A0KyMaxcd02K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA0ogZ%2FbtrJXjCAG7u%2FB8RFKBkUR2A0KyMaxcd02K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;721&quot; height=&quot;725&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;725&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;291&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7PhZz/btrJ2birPp5/EeKhMMIGU2RY8MfEKOfSh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7PhZz/btrJ2birPp5/EeKhMMIGU2RY8MfEKOfSh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7PhZz/btrJ2birPp5/EeKhMMIGU2RY8MfEKOfSh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7PhZz%2FbtrJ2birPp5%2FEeKhMMIGU2RY8MfEKOfSh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;291&quot; height=&quot;321&quot; data-origin-width=&quot;291&quot; data-origin-height=&quot;321&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;904&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNiK6n/btrJXkuHL2H/kCwbqwqVvQkoG3aDjN30q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNiK6n/btrJXkuHL2H/kCwbqwqVvQkoG3aDjN30q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNiK6n/btrJXkuHL2H/kCwbqwqVvQkoG3aDjN30q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNiK6n%2FbtrJXkuHL2H%2FkCwbqwqVvQkoG3aDjN30q1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;819&quot; height=&quot;904&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;904&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>TIL/academy</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/126</guid>
      <comments>https://makeaplayground.tistory.com/126#entry126comment</comments>
      <pubDate>Thu, 18 Aug 2022 15:53:45 +0900</pubDate>
    </item>
    <item>
      <title>국비 TIL(Today I Learned) 20220816 로그인 후, 글삭제 수정/ Ajax 테이블</title>
      <link>https://makeaplayground.tistory.com/123</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SSO(Single Sign On) - 같은 유형의 서비스들에 대하여 로그인 세션을 공유하는것, 같이 로그인, 같이 로그아웃&lt;/b&gt;&lt;br /&gt;대규모 프로젝트를 한다고 하면 SSO를 연계하라고 할것이다.&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller.java만들기, Service, Dao 만들고, 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;getTCnt 메소드 만들고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cnt 쿼리&lt;/p&gt;
&lt;pre id=&quot;code_1660612486951&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT COUNT(*) AS CNT
FROM TBOARD T INNER JOIN MEM M ON T.MEM_NO = M.MEM_NO
AND M.DEL = 1
WHERE T.DEL = 1
-- 제목
-- AND T.TITLE LIKE '%' || 'TEST' || '%'
-- 작성자
AND M.MEM_NM LIKE '%' || 'TEST' || '%'
;&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;931&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kwQDm/btrJGUQirug/h4RAnLVpOx9z6QcrKv3ERK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kwQDm/btrJGUQirug/h4RAnLVpOx9z6QcrKv3ERK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kwQDm/btrJGUQirug/h4RAnLVpOx9z6QcrKv3ERK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkwQDm%2FbtrJGUQirug%2Fh4RAnLVpOx9z6QcrKv3ERK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;904&quot; height=&quot;409&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;421&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;getTList 메소드 만들고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;List의 쿼리&lt;/p&gt;
&lt;pre id=&quot;code_1660612454623&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT T.NO, T.TITLE, T.MEM_NM, T.HIT, T.DT
FROM(
SELECT T.NO, T.TITLE, M.MEM_NM, T.HIT,
CASE WHEN TO_CHAR(DT,'YY.MM.DD') = TO_CHAR(SYSDATE, 'YY.MM.DD')
        THEN TO_CHAR(DT, 'HH24:MI')
        ELSE TO_CHAR(DT, 'YY.MM.DD')
        END AS DT,
        ROW_NUMBER() OVER(ORDER BY T.NO DESC) AS RNUM
FROM TBOARD T INNER JOIN MEM M ON T.MEM_NO = M.MEM_NO
AND M.DEL = 1
WHERE T.DEL = 1
-- 제목
-- AND T.TITLE LIKE '%' || 'TEST' || '%'
-- 작성자
AND M.MEM_NM LIKE '%' || 'TEST' || '%') T
WHERE T.RNUM BETWEEN 1 AND 10
;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LItDx/btrJIr8db5j/69KtZAbuAJk62Gzzl6QEjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LItDx/btrJIr8db5j/69KtZAbuAJk62Gzzl6QEjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LItDx/btrJIr8db5j/69KtZAbuAJk62Gzzl6QEjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLItDx%2FbtrJIr8db5j%2F69KtZAbuAJk62Gzzl6QEjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;672&quot; height=&quot;462&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;462&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;anboardList 복붙해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list 만들고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfZykz/btrJO0BvzxV/t65smwAHSBq3bRpEz2v3t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfZykz/btrJO0BvzxV/t65smwAHSBq3bRpEz2v3t0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfZykz/btrJO0BvzxV/t65smwAHSBq3bRpEz2v3t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfZykz%2FbtrJO0BvzxV%2Ft65smwAHSBq3bRpEz2v3t0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;518&quot; height=&quot;62&quot; data-origin-width=&quot;518&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;로그인되어 있을때만 글추가 버튼 활성화되게 if문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sMemNm은 저번주에 만든 LoginController에 있는 값임&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;816&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eW0bjj/btrJK02SIcA/RgYd6pA3UL1nXRA84bgHRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eW0bjj/btrJK02SIcA/RgYd6pA3UL1nXRA84bgHRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eW0bjj/btrJK02SIcA/RgYd6pA3UL1nXRA84bgHRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeW0bjj%2FbtrJK02SIcA%2FRgYd6pA3UL1nXRA84bgHRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;905&quot; height=&quot;816&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;816&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난주 login의 main.jsp에 있는 내요을&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;T/list.jsp로 가져옴&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9hfYU/btrJEKOeQ78/Am1vNXqtFvKyFwWz0snQ6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9hfYU/btrJEKOeQ78/Am1vNXqtFvKyFwWz0snQ6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9hfYU/btrJEKOeQ78/Am1vNXqtFvKyFwWz0snQ6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9hfYU%2FbtrJEKOeQ78%2FAm1vNXqtFvKyFwWz0snQ6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1132&quot; height=&quot;766&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;766&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;anboardInsert 복붙해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;insert 만들고 작성자 변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xequ6/btrJCmzdm4M/sPBVplR6YVRxsKh6uI6ssk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xequ6/btrJCmzdm4M/sPBVplR6YVRxsKh6uI6ssk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xequ6/btrJCmzdm4M/sPBVplR6YVRxsKh6uI6ssk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxequ6%2FbtrJCmzdm4M%2FsPBVplR6YVRxsKh6uI6ssk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;70&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ybG2t/btrJQcV5VEt/Z40ooJwWVlJ9oDKwIs8HX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ybG2t/btrJQcV5VEt/Z40ooJwWVlJ9oDKwIs8HX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ybG2t/btrJQcV5VEt/Z40ooJwWVlJ9oDKwIs8HX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FybG2t%2FbtrJQcV5VEt%2FZ40ooJwWVlJ9oDKwIs8HX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;455&quot; height=&quot;270&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;270&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;&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwp2yg/btrJGUCU9Hj/qZj0igTdzaOpCpqy4lcbCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwp2yg/btrJGUCU9Hj/qZj0igTdzaOpCpqy4lcbCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwp2yg/btrJGUCU9Hj/qZj0igTdzaOpCpqy4lcbCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwp2yg%2FbtrJGUCU9Hj%2FqZj0igTdzaOpCpqy4lcbCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;388&quot; height=&quot;391&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;391&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;insert쿼리&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXh8pC/btrJQ4pXvJO/bTYizrIZXHJ0j7wLTimSZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXh8pC/btrJQ4pXvJO/bTYizrIZXHJ0j7wLTimSZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXh8pC/btrJQ4pXvJO/bTYizrIZXHJ0j7wLTimSZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXh8pC%2FbtrJQ4pXvJO%2FbTYizrIZXHJ0j7wLTimSZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;78&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;78&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;MEM_NO 6인 사람이 DEL = 0이라서, 데이터 목록에 안 뜸(탈퇴한 사람의 데이터는 목록에 안뜸)&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kAKx1/btrJHfsw6m2/r19LxUnzeemT50JrZeOIK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kAKx1/btrJHfsw6m2/r19LxUnzeemT50JrZeOIK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kAKx1/btrJHfsw6m2/r19LxUnzeemT50JrZeOIK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkAKx1%2FbtrJHfsw6m2%2Fr19LxUnzeemT50JrZeOIK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;391&quot; height=&quot;198&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FyirE/btrJKsmfjhi/bhTfqDC88Oyj9sXrztjW8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FyirE/btrJKsmfjhi/bhTfqDC88Oyj9sXrztjW8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FyirE/btrJKsmfjhi/bhTfqDC88Oyj9sXrztjW8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFyirE%2FbtrJKsmfjhi%2FbhTfqDC88Oyj9sXrztjW8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1129&quot; height=&quot;457&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q4kB1/btrJNju0fov/zmfMOtU8hyZkA8QkbnOaA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q4kB1/btrJNju0fov/zmfMOtU8hyZkA8QkbnOaA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q4kB1/btrJNju0fov/zmfMOtU8hyZkA8QkbnOaA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq4kB1%2FbtrJNju0fov%2FzmfMOtU8hyZkA8QkbnOaA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;881&quot; height=&quot;447&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공통된 부분 header만들어서, import&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;import쉽게 하는 프레임워크&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRfugt/btrJLS55Ayx/2CWukEhGYjkGz9PNVreBE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRfugt/btrJLS55Ayx/2CWukEhGYjkGz9PNVreBE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRfugt/btrJLS55Ayx/2CWukEhGYjkGz9PNVreBE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRfugt%2FbtrJLS55Ayx%2F2CWukEhGYjkGz9PNVreBE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;718&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;718&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;TController.java&lt;/p&gt;
&lt;pre id=&quot;code_1660633300736&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.controller;

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

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.spring.sample.common.service.IPagingService;
import com.spring.sample.web.test.service.ITService;

@Controller
public class TController {
	@Autowired
	public ITService iTService;

	@Autowired
	public IPagingService ips;

	@RequestMapping(value = &quot;/TList&quot;)
	public ModelAndView tList(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {

		int page = 1;
		if (params.get(&quot;page&quot;) != null &amp;amp;&amp;amp; params.get(&quot;page&quot;) != &quot;&quot;) {
			page = Integer.parseInt(params.get(&quot;page&quot;));
		}

		int cnt = iTService.getTCnt(params);

		HashMap&amp;lt;String, Integer&amp;gt; pd = ips.getPagingData(page, cnt, 10, 10);

		params.put(&quot;start&quot;, Integer.toString(pd.get(&quot;start&quot;)));
		params.put(&quot;end&quot;, Integer.toString(pd.get(&quot;end&quot;)));

		List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; list = iTService.getTList(params);

		mav.addObject(&quot;list&quot;, list);
		mav.addObject(&quot;page&quot;, page);
		mav.addObject(&quot;pd&quot;, pd);

		mav.setViewName(&quot;test/T/list&quot;);

		return mav;
	}

	// 첫번째로 로그인됬을때 글 추가 버튼이 활성화되게 하고, 두번째로 주소창에서 입력되어 들어오는것을 막기 위해 권한 체크용으로 세션추가
	@RequestMapping(value = &quot;/TInsert&quot;)
	public ModelAndView tInsert(HttpSession session, ModelAndView mav) {

		if (session.getAttribute(&quot;sMemNm&quot;) != null &amp;amp;&amp;amp; session.getAttribute(&quot;sMemNm&quot;) != &quot;&quot;) {
			// 로그인 중이라면
			mav.setViewName(&quot;test/T/insert&quot;);
		} else {
			// 로그인 중이 아니라면 로그인으로 이동
			mav.setViewName(&quot;redirect:testLogin&quot;);
		}

		return mav;
	}

	@RequestMapping(value = &quot;/TAction&quot;)
	public ModelAndView tAction(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {

		int cnt = 0;

		try {
			switch (params.get(&quot;gbn&quot;)) {
			case &quot;i&quot;:
				cnt = iTService.insert(params);
				break;
			case &quot;d&quot;:
				cnt = iTService.delete(params);
				break;
			case &quot;u&quot;:
				cnt = iTService.update(params);
			}
			if (cnt &amp;gt; 0) {
				mav.addObject(&quot;res&quot;, &quot;success&quot;);
			} else {
				mav.addObject(&quot;res&quot;, &quot;failed&quot;);
			}

		} catch (Exception e) {
			e.printStackTrace();
			mav.addObject(&quot;res&quot;, &quot;error&quot;);
		}

		mav.setViewName(&quot;test/T/action&quot;);
		return mav;

	}

	@RequestMapping(value = &quot;TDetail&quot;)
	public ModelAndView tDatail(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {

		if (params.get(&quot;no&quot;) != null &amp;amp;&amp;amp; params.get(&quot;no&quot;) != &quot;&quot;) {
			// 번호가 들어왔다면
			// 조회수 (데이터 조회보다 먼저해야함)
			iTService.updateTHit(params);

			// 데이터 조회
			HashMap&amp;lt;String, String&amp;gt; data = iTService.getT(params);

			mav.addObject(&quot;data&quot;, data);
			mav.setViewName(&quot;test/T/detail&quot;);
		} else {
			// 번호가 들어오지 않았다면 리스트로 이동
			mav.setViewName(&quot;redirect:TList&quot;);
		}

		return mav;
	}

	@RequestMapping(value = &quot;TUpdate&quot;)
	public ModelAndView tUpdate(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {

		if (params.get(&quot;no&quot;) != null &amp;amp;&amp;amp; params.get(&quot;no&quot;) != &quot;&quot;) {

			// 데이터 조회
			HashMap&amp;lt;String, String&amp;gt; data = iTService.getT(params);

			mav.addObject(&quot;data&quot;, data);
			mav.setViewName(&quot;test/T/update&quot;);
		} else {
			// 번호가 들어오지 않았다면 리스트로 이동
			mav.setViewName(&quot;redirect:TList&quot;);
		}

		return mav;
	}
}&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;ITService.java&lt;/p&gt;
&lt;pre id=&quot;code_1660633350030&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.service;

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

public interface ITService {

	public int getTCnt(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getTList(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int insert(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public HashMap&amp;lt;String, String&amp;gt; getT(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public void updateTHit(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int delete(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int update(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

}&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;TService.java&lt;/p&gt;
&lt;pre id=&quot;code_1660633366911&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.service;

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

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

import com.spring.sample.web.test.dao.ITDao;

@Service
public class TService implements ITService {
	@Autowired
	public ITDao iTDao;

	@Override
	public int getTCnt(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTDao.getTCnt(params);
	}

	@Override
	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getTList(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTDao.getTList(params);
	}

	@Override
	public int insert(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTDao.insert(params);
	}

	@Override
	public HashMap&amp;lt;String, String&amp;gt; getT(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTDao.getT(params);
	}

	@Override
	public void updateTHit(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		iTDao.updateTHit(params);

	}

	@Override
	public int delete(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTDao.delete(params);
	}

	@Override
	public int update(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTDao.update(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;ITDao.java&lt;/p&gt;
&lt;pre id=&quot;code_1660633391311&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.dao;

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

public interface ITDao {

	public int getTCnt(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getTList(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int insert(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public HashMap&amp;lt;String, String&amp;gt; getT(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public void updateTHit(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int delete(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int update(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TDao.java&lt;/p&gt;
&lt;pre id=&quot;code_1660633408927&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.dao;

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

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class TDao implements ITDao {
	@Autowired
	public SqlSession sqlSession;

	@Override
	public int getTCnt(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectOne(&quot;T.getTCnt&quot;, params);
	}

	@Override
	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getTList(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectList(&quot;T.getTList&quot;, params);
	}

	@Override
	public int insert(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.insert(&quot;T.insertT&quot;, params);
	}

	@Override
	public HashMap&amp;lt;String, String&amp;gt; getT(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectOne(&quot;T.getT&quot;, params);
	}

	@Override
	public void updateTHit(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		sqlSession.update(&quot;T.updateTHit&quot;, params);
	}

	@Override
	public int delete(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.update(&quot;T.deleteT&quot;, params);
	}

	@Override
	public int update(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.update(&quot;T.updateT&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;T_SQL.xml&lt;/p&gt;
&lt;pre id=&quot;code_1660633476247&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;T&quot;&amp;gt;
	&amp;lt;select id=&quot;getTCnt&quot; resultType=&quot;Integer&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT COUNT(*) AS CNT
		FROM TBOARD T INNER JOIN MEM M ON T.MEM_NO = M.MEM_NO
		AND M.DEL = 1
		WHERE T.DEL = 1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt !=''&quot;&amp;gt;
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 0&quot;&amp;gt;
					AND T.TITLE LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 1&quot;&amp;gt;
					AND M.MEM_NM LIKE '%' ||  #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;getTList&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT T.NO, T.TITLE, T.MEM_NM, T.HIT, T.DT
		FROM(
		SELECT T.NO, T.TITLE, M.MEM_NM, T.HIT,
		CASE WHEN TO_CHAR(DT,'YY.MM.DD') = TO_CHAR(SYSDATE, 'YY.MM.DD')
		        THEN TO_CHAR(DT, 'HH24:MI')
		        ELSE TO_CHAR(DT, 'YY.MM.DD')
		        END AS DT,
		        ROW_NUMBER() OVER(ORDER BY T.NO DESC) AS RNUM
				FROM TBOARD T INNER JOIN MEM M ON T.MEM_NO = M.MEM_NO
				AND M.DEL = 1
		WHERE T.DEL = 1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt !=''&quot;&amp;gt;
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 0&quot;&amp;gt;
					AND T.TITLE LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn eq 1&quot;&amp;gt;
					AND M.MEM_NM LIKE '%' ||  #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;) T
		WHERE T.RNUM BETWEEN #{start} AND #{end}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;insertT&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO TBOARD(NO, TITLE, MEM_NO, CON)
		VALUES (TBOARD_SEQ.NEXTVAL, #{title} , #{memNo}, #{con})
	&amp;lt;/insert&amp;gt;
	 
	&amp;lt;select id=&quot;getT&quot; parameterType=&quot;hashmap&quot;  resultType=&quot;hashmap&quot;&amp;gt;
		SELECT T.NO, T.TITLE, M.MEM_NO, M.MEM_NM, T.CON, T.HIT,
	    TO_CHAR(T.DT, 'YYYY-MM-DD') AS DT
		FROM TBOARD T INNER JOIN MEM M ON T.MEM_NO = M.MEM_NO
		AND M.DEL = 1
		WHERE T.DEL = 1
		AND T.NO = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;update id=&quot;updateTHit&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE TBOARD SET HIT = HIT + 1
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;update id=&quot;deleteT&quot;  parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE TBOARD SET DEL = 0
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;update id=&quot;updateT&quot;  parameterType=&quot;hashmap&quot;&amp;gt;		
		UPDATE TBOARD SET TITLE = #{title},
		CON = #{con}
		WHERE NO = #{no}
	&amp;lt;/update&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;T폴더에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660633513063&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;style type=&quot;text/css&quot;&amp;gt;
table{
	border-collapse: collapse;
}

th, td {
	border: 1px solid #000;
	padding: 5px;
}

&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	
	if(&quot;${param.searchGbn}&quot; != &quot;&quot;) { // 검색구분이 넘어오면
		$(&quot;#searchGbn&quot;).val(&quot;${param.searchGbn}&quot;);	
	}
	
	$('select').on('change', function() {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;TList&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
	
	
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;tr&quot;, function () {
		console.log($(this).attr(&quot;no&quot;));
		$(&quot;#no&quot;).val($(this).attr(&quot;no&quot;));
		
		// 검색 상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
	
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;TDetail&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		location.href = &quot;TInsert&quot;;
	});
	
	$(&quot;#pagingWrap&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));
		
		// 검색 상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;TList&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
	
	$(&quot;#searchBtn&quot;).on(&quot;click&quot;, function () {
		// 검색하면 페이지는 무조건 1페이지로 감
		$(&quot;#page&quot;).val(&quot;1&quot;); // 페이지 초기화
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;TList&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	
	
})
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;!-- 기존 검색 내용 유지용 --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;form action=&quot;anboardDetail&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; id=&quot;no&quot; name=&quot;no&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; id=&quot;page&quot; name=&quot;page&quot; value=&quot;${page}&quot; /&amp;gt;  &amp;lt;!-- 상세보기 갈때 page 가져갈거임 --&amp;gt;
	&amp;lt;br/&amp;gt;
	&amp;lt;!-- 검색 --&amp;gt;
	&amp;lt;select name=&quot;searchGbn&quot; id=&quot;searchGbn&quot;&amp;gt;
		&amp;lt;option value=&quot;0&quot;&amp;gt;제목&amp;lt;/option&amp;gt;
		&amp;lt;option value=&quot;1&quot;&amp;gt;작성자&amp;lt;/option&amp;gt;
	&amp;lt;/select&amp;gt;
	&amp;lt;input type=&quot;text&quot; name=&quot;searchTxt&quot; id=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt; &amp;lt;!-- 검색어 유지되게, 그래야 페이징할떄도 유지됨 --&amp;gt;
	&amp;lt;input type=&quot;button&quot; value=&quot;검색&quot; id=&quot;searchBtn&quot; /&amp;gt;
	&amp;lt;c:if test=&quot;${!empty sMemNm}&quot;&amp;gt; &amp;lt;!-- 로그인 중이라면 --&amp;gt;
		&amp;lt;input type=&quot;button&quot; value=&quot;추가&quot; id=&quot;insertBtn&quot; /&amp;gt;
	&amp;lt;/c:if&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;table&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 var=&quot;data&quot; items=&quot;${list}&quot;&amp;gt;
			&amp;lt;tr no=&quot;${data.NO}&quot;&amp;gt;
				&amp;lt;td&amp;gt;${data.NO}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.TITLE}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.MEM_NM}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.HIT}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.DT}&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;div id=&quot;pagingWrap&quot;&amp;gt;
&amp;lt;span page=&quot;1&quot;&amp;gt;처음&amp;lt;/span&amp;gt;
&amp;lt;!-- 이전은 현재페이지에서 하나 전, 
지금 1페이지인지 아닌지 먼저 체크 따라서, 현재페이지 필요--&amp;gt;
&amp;lt;!-- 이전페이지 : 현제페이지가 1이면 1로 이동 아니면 현제페이지 -1 --&amp;gt;
&amp;lt;c:choose&amp;gt;
	&amp;lt;c:when test=&quot;${page eq 1}&quot;&amp;gt;
		&amp;lt;span page=&quot;1&quot;&amp;gt;이전&amp;lt;/span&amp;gt;
	&amp;lt;/c:when&amp;gt;
	&amp;lt;c:otherwise&amp;gt;
		&amp;lt;span page=&quot;${page - 1}&quot;&amp;gt;이전&amp;lt;/span&amp;gt;
	&amp;lt;/c:otherwise&amp;gt;
&amp;lt;/c:choose&amp;gt;
&amp;lt;!-- 페이지들 --&amp;gt;
&amp;lt;c:forEach var=&quot;i&quot; begin=&quot;${pd.startP}&quot; end=&quot;${pd.endP}&quot; step=&quot;1&quot;&amp;gt;
	&amp;lt;%-- 현재 페이지의 경우 별도 처리 --%&amp;gt;
	&amp;lt;c:choose&amp;gt;
		&amp;lt;c:when test=&quot;${i eq page}&quot;&amp;gt; &amp;lt;%-- 현재페이지 --%&amp;gt;
			&amp;lt;span page=&quot;${i}&quot;&amp;gt;&amp;lt;b&amp;gt;${i}&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;
		&amp;lt;/c:when&amp;gt;
		&amp;lt;c:otherwise&amp;gt; &amp;lt;%-- 다른페이지 --%&amp;gt;
			&amp;lt;span page=&quot;${i}&quot;&amp;gt;${i}&amp;lt;/span&amp;gt;
		&amp;lt;/c:otherwise&amp;gt;
	&amp;lt;/c:choose&amp;gt;
&amp;lt;/c:forEach&amp;gt;

&amp;lt;!-- 다음페이지 : 마지막에 도달했을때는 증가하지 않고, 다른 경우는 +1 --&amp;gt;
&amp;lt;c:choose&amp;gt;
	&amp;lt;c:when test=&quot;${page eq pd.maxP}&quot;&amp;gt;
		&amp;lt;span page=&quot;${pd.maxP}&quot;&amp;gt;다음&amp;lt;/span&amp;gt;
	&amp;lt;/c:when&amp;gt;
	&amp;lt;c:otherwise&amp;gt;
		&amp;lt;span page=&quot;${page + 1}&quot;&amp;gt;다음&amp;lt;/span&amp;gt;
	&amp;lt;/c:otherwise&amp;gt;
&amp;lt;/c:choose&amp;gt;

&amp;lt;span page=&quot;${pd.maxP}&quot;&amp;gt;마지막&amp;lt;/span&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 data-ke-size=&quot;size16&quot;&gt;insert.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660634308192&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- CKEditor --&amp;gt;
&amp;lt;!-- 제이쿼리 뒤에 나와야함, 제이쿼리 기반으로 동작하기 때문에 --&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/ckeditor/ckeditor.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	// 에디터 연결
	// CKEDITOR.replace(아이디, 옵션)
	CKEDITOR.replace(&quot;con&quot;, {
		resize_enabled: false, // resize_enabled : 크기조절기능 활용여부
		language : &quot;ko&quot;, // 사용언어
		enterMode: &quot;2&quot;, // 엔터키처리방법. 2번이면 &amp;lt;br/&amp;gt;
		width : 600, // 숫자일경우 px, 문자열일경우 css크기
		height : 400
	});
	
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#backForm&quot;).submit();
	});
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		// CKEditor의 값 취득
		// CKEDITOR.instances[아이디] : CKEditor중 아이디가 같은 것을 찾겠다.
		//.getData() : 작성중인 내용을 취득하겠다.
		$(&quot;#con&quot;).val(CKEDITOR.instances['con'].getData());
		
		
		// $.trim(값) : 값 앞 뒤 공백제거	
		if($.trim($(&quot;#title&quot;).val()) == &quot;&quot;){
			alert(&quot;제목을 입력하세요&quot;);
			$(&quot;#title&quot;).focus();
		}  else if($.trim($(&quot;#con&quot;).val()) == &quot;&quot;){
			alert(&quot;내용을 입력하세요&quot;);
			$(&quot;#con&quot;).focus();
		} else {
			$(&quot;#actionForm&quot;).submit();
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;TList&quot; id=&quot;backForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;form action=&quot;TAction&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;!--gbn : 구분, 혹은 flag
구분: i - insert, u - update, d - delete  --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;i&quot;/&amp;gt;
제목 
&amp;lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot; /&amp;gt;
&amp;lt;br /&amp;gt;
작성자${sMemNm}&amp;lt;input type=&quot;hidden&quot; name=&quot;memNo&quot; value=&quot;${sMemNo}&quot; /&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
내용 
&amp;lt;textarea name=&quot;con&quot; id=&quot;con&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;/form&amp;gt; 
&amp;lt;input type=&quot;button&quot; value=&quot;등록&quot; id=&quot;insertBtn&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;목록&quot; id=&quot;listBtn&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;p data-ke-size=&quot;size16&quot;&gt;detail.jsp&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1660634345592&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function() {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;TList&quot;); 
		$(&quot;#actionForm&quot;).submit();
	});
	
	$(&quot;#deleteBtn&quot;).on(&quot;click&quot;, function () {
		if(confirm(&quot;삭제하시곘습니까?&quot;)){
			$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;TAction&quot;); 
			$(&quot;#actionForm&quot;).submit();
		}
	})
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;TUpdate&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;d&quot;&amp;gt; &amp;lt;!-- selRes는 gbn을 받게 되어있어서 값을 추가해줘야함 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.NO}&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
		&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;	
번호: ${data.NO}&amp;lt;br/&amp;gt;
제목: ${data.TITLE}&amp;lt;br/&amp;gt;
작성자: ${data.MEM_NM}&amp;lt;br/&amp;gt;
조회수: ${data.HIT}&amp;lt;br/&amp;gt;
작성일: ${data.DT}&amp;lt;br/&amp;gt;
내용: ${data.CON}&amp;lt;br/&amp;gt;
&amp;lt;c:if test=&quot;${sMemNo eq data.MEM_NO}&quot;&amp;gt;
	&amp;lt;input type=&quot;button&quot; value=&quot;수정&quot; id=&quot;updateBtn&quot; /&amp;gt;
	&amp;lt;input type=&quot;button&quot; value=&quot;삭제&quot; id=&quot;deleteBtn&quot; /&amp;gt;
&amp;lt;/c:if&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;목록&quot; id=&quot;listBtn&quot; /&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;action.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660634461671&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	
	switch(&quot;${res}&quot;){
	case &quot;success&quot; : 
		if(&quot;${param.gbn}&quot; == &quot;u&quot;){ // 수정이 성공했을 떄
			$(&quot;#goForm&quot;).submit();
		} else { // 등록, 삭제가 성공했을 떄
			location.href = &quot;TList&quot; 
		}
		break;
	case &quot;failed&quot; : 
		alert(&quot;작업에 실패하였습니다.&quot;);
		history.back();
		break;
	case &quot;error&quot; : 
		alert(&quot;작업중 문제가 발생 하였습니다.&quot;);
		history.back();
		break;
	}
});
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;TDetail&quot; id=&quot;goForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${param.no}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
		&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;sortGbn&quot; value=&quot;${param.sortGbn}&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 data-ke-size=&quot;size16&quot;&gt;update.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660634477976&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/ckeditor/ckeditor.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	// 에디터 연결
	// CKEDITOR.replace(아이디, 옵션)
	CKEDITOR.replace(&quot;con&quot;, {
		resize_enabled: false, // resize_enabled : 크기조절기능 활용여부
		language : &quot;ko&quot;, // 사용언어
		enterMode: &quot;2&quot;, // 엔터키처리방법. 2번이면 &amp;lt;br/&amp;gt;
		width : 600, // 숫자일경우 px, 문자열일경우 css크기
		height : 400
	});
	
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		history.back();
	});
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		// CKEditor의 값 취득
		// CKEDITOR.instances[아이디] : CKEditor중 아이디가 같은 것을 찾겠다.
		//.getData() : 작성중인 내용을 취득하겠다.
		$(&quot;#con&quot;).val(CKEDITOR.instances['con'].getData());
		
		
		if($(&quot;#title&quot;).val() == &quot;&quot;){
			alert(&quot;제목을 입력하세요&quot;);
			$(&quot;#title&quot;).focus();
		}  else if($(&quot;#con&quot;).val() == &quot;&quot;){
			alert(&quot;내용을 입력하세요&quot;);
			$(&quot;#con&quot;).focus();
		} else {
			$(&quot;#actionForm&quot;).submit();
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;TAction&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;u&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.NO}&quot;/&amp;gt; 
&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; 
&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
번호: ${data.NO}&amp;lt;br/&amp;gt;
제목: &amp;lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot; value=&quot;${data.TITLE}&quot;/&amp;gt;&amp;lt;br /&amp;gt;
작성자: ${data.MEM_NM}&amp;lt;br/&amp;gt;
내용 
&amp;lt;textarea name=&quot;con&quot; id=&quot;con&quot;&amp;gt;${data.CON}&amp;lt;/textarea&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;수정&quot; id=&quot;updateBtn&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;뒤로가기&quot; id=&quot;listBtn&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;login쪽에 바뀐거&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;134&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8zBTc/btrJREFdiQV/flcjHYrArzUNvsTQp98HKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8zBTc/btrJREFdiQV/flcjHYrArzUNvsTQp98HKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8zBTc/btrJREFdiQV/flcjHYrArzUNvsTQp98HKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8zBTc%2FbtrJREFdiQV%2FflcjHYrArzUNvsTQp98HKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;134&quot; height=&quot;112&quot; data-origin-width=&quot;134&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;header.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660634582455&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$(&quot;#logoutBtn&quot;).on(&quot;click&quot;, function () {
		location.href = &quot;testLogout&quot;;
	})
	
	$(&quot;#loginBtn&quot;).on(&quot;click&quot;, function () {
		location.href = &quot;testLogin&quot;;
	})
})

&amp;lt;/script&amp;gt;
&amp;lt;c:choose&amp;gt;
	&amp;lt;c:when test=&quot;${empty sMemNm}&quot;&amp;gt; &amp;lt;!-- el태그의 empty : 해당 값이 비어있는지 확인 --&amp;gt;
		&amp;lt;input type=&quot;button&quot; value=&quot;로그인&quot; id=&quot;loginBtn&quot; /&amp;gt;
	&amp;lt;/c:when&amp;gt;
	&amp;lt;c:otherwise&amp;gt;
		${sMemNm}님 어서어세요. &amp;lt;input type=&quot;button&quot; value=&quot;로그아웃&quot; id=&quot;logoutBtn&quot; /&amp;gt;
	&amp;lt;/c:otherwise&amp;gt;
&amp;lt;/c:choose&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660634603727&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	
})
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:import url=&quot;/testHeader&quot;&amp;gt;&amp;lt;/c:import&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;a href=&quot;TList&quot;&amp;gt;TBoard LISt&amp;lt;/a&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;LoginController.java&lt;/p&gt;
&lt;pre id=&quot;code_1660634629999&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.controller;

import java.util.HashMap;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.spring.sample.web.test.service.ILoginService;

@Controller
public class LoginController {
	@Autowired
	public ILoginService iLoginService;

	@RequestMapping(value = &quot;/testLogin&quot;)
	public ModelAndView testLogin(HttpSession session, // 로그인 된 상태에서 로그인 화면 못가게 하기 위해
			ModelAndView mav) {
		// session의 getAttribute(키) : 세션값 취득
		// 세션에 값이 존재한다면 main으로 이동
		if (session.getAttribute(&quot;sMemNm&quot;) != null &amp;amp;&amp;amp; session.getAttribute(&quot;sMemNm&quot;) != &quot;&quot;) {
			mav.setViewName(&quot;redirect:testMain&quot;);
		} else {
			mav.setViewName(&quot;test/login/login&quot;);
		}

		return mav;
	}

	// DB에 붙을예정
	@RequestMapping(value = &quot;/testLoginAction&quot;)
	public ModelAndView testLoginAction(
			// HttpServletRequest req, // 1. 요청 객체 취득
			HttpSession session, // 2. Spring에 Session 객체 요청
			@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {
		// 1. Request를 통한 세션 취득
		// HttpSession session = req.getSession();

		// 아이디와 비밀번호가 일치하는 사용자 정보 취득
		HashMap&amp;lt;String, String&amp;gt; data = iLoginService.checkMem(params);

		if (data != null) { // 조회 데이터가 있다면
			// 세션에 값 추가
			session.setAttribute(&quot;sMemNo&quot;, data.get(&quot;MEM_NO&quot;));
			session.setAttribute(&quot;sMemNm&quot;, data.get(&quot;MEM_NM&quot;));

			mav.setViewName(&quot;redirect:testMain&quot;);
		} else {
			mav.setViewName(&quot;test/login/action&quot;);
		}
		return mav;
	}

	@RequestMapping(value = &quot;/testMain&quot;)
	public ModelAndView testMain(ModelAndView mav) {
		mav.setViewName(&quot;test/login/main&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/testLogout&quot;)
	public ModelAndView testLogout(HttpSession session, ModelAndView mav) {
		// 요청 사용자 세션 초기화
		session.invalidate();

		mav.setViewName(&quot;redirect:testMain&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/testHeader&quot;)
	public ModelAndView testHeader(ModelAndView mav) {
		mav.setViewName(&quot;test/login/header&quot;);

		return mav;
	}
}&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M10Jw/btrJHe8UvzY/mmgxx9CQOcqUwKeWIjSu00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M10Jw/btrJHe8UvzY/mmgxx9CQOcqUwKeWIjSu00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M10Jw/btrJHe8UvzY/mmgxx9CQOcqUwKeWIjSu00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM10Jw%2FbtrJHe8UvzY%2Fmmgxx9CQOcqUwKeWIjSu00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;254&quot; height=&quot;298&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Ajax로 게시판 하는거 새로 폴더, 파일 만듬&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;231&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGU1tZ/btrJREZoNC9/piZ30Is9M2DixKRWX3RQU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGU1tZ/btrJREZoNC9/piZ30Is9M2DixKRWX3RQU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGU1tZ/btrJREZoNC9/piZ30Is9M2DixKRWX3RQU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGU1tZ%2FbtrJREZoNC9%2FpiZ30Is9M2DixKRWX3RQU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;255&quot; height=&quot;252&quot; data-origin-width=&quot;231&quot; data-origin-height=&quot;228&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;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUzXfM/btrJMzSRjtC/Grdztgd8arCeFYnyWKBGd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUzXfM/btrJMzSRjtC/Grdztgd8arCeFYnyWKBGd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUzXfM/btrJMzSRjtC/Grdztgd8arCeFYnyWKBGd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUzXfM%2FbtrJMzSRjtC%2FGrdztgd8arCeFYnyWKBGd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;995&quot; height=&quot;772&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;772&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;875&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lIwdB/btrJRtjynWk/3kXVFreCduWgFI74akC9mK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lIwdB/btrJRtjynWk/3kXVFreCduWgFI74akC9mK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lIwdB/btrJRtjynWk/3kXVFreCduWgFI74akC9mK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlIwdB%2FbtrJRtjynWk%2F3kXVFreCduWgFI74akC9mK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;875&quot; height=&quot;368&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;368&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;1284&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vUFnn/btrJRYQTSW0/SuGHtKFkoIjBkErLvNi7U1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vUFnn/btrJRYQTSW0/SuGHtKFkoIjBkErLvNi7U1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vUFnn/btrJRYQTSW0/SuGHtKFkoIjBkErLvNi7U1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvUFnn%2FbtrJRYQTSW0%2FSuGHtKFkoIjBkErLvNi7U1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1284&quot; height=&quot;220&quot; data-origin-width=&quot;1284&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BomXW/btrJRYpOKUA/uB3A3z6p10XKtopkYuNUxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BomXW/btrJRYpOKUA/uB3A3z6p10XKtopkYuNUxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BomXW/btrJRYpOKUA/uB3A3z6p10XKtopkYuNUxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBomXW%2FbtrJRYpOKUA%2FuB3A3z6p10XKtopkYuNUxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;256&quot; height=&quot;334&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://interconnection.tistory.com/137&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://interconnection.tistory.com/137&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1660632232781&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Jackson ObjectMapper 정리&quot; data-og-description=&quot;개요 Java 개발자라면 Jackson에서 제공하는 ObjectMapper와 자주 마주치게 됩니다. Java 클래스 내용을 확인하거나 내용물의 Parsing 과정에 필요한 커스터마이징이 존재하기 때문입니다. 물론 중요한 기&quot; data-og-host=&quot;interconnection.tistory.com&quot; data-og-source-url=&quot;https://interconnection.tistory.com/137&quot; data-og-url=&quot;https://interconnection.tistory.com/137&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yYkZ8/hyPsTwdC50/IMH7gL6nda2PYCPJQdgwb1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bVOPsN/hyPsLrqfss/l3Ijj268M8oGfsVXBdyWKk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://interconnection.tistory.com/137&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://interconnection.tistory.com/137&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yYkZ8/hyPsTwdC50/IMH7gL6nda2PYCPJQdgwb1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bVOPsN/hyPsLrqfss/l3Ijj268M8oGfsVXBdyWKk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Jackson ObjectMapper 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개요 Java 개발자라면 Jackson에서 제공하는 ObjectMapper와 자주 마주치게 됩니다. Java 클래스 내용을 확인하거나 내용물의 Parsing 과정에 필요한 커스터마이징이 존재하기 때문입니다. 물론 중요한 기&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;interconnection.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Jackson 잭슨관련해서&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;pom.xml에 설정내용이 있음 (메이븐의 경우)&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;160&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l6wGk/btrJQ3ek18D/K71zU7iJnu1T3VFN5BoPRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l6wGk/btrJQ3ek18D/K71zU7iJnu1T3VFN5BoPRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l6wGk/btrJQ3ek18D/K71zU7iJnu1T3VFN5BoPRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl6wGk%2FbtrJQ3ek18D%2FK71zU7iJnu1T3VFN5BoPRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;160&quot; height=&quot;60&quot; data-origin-width=&quot;160&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTnjWG/btrJQegatgG/KIuPbbaO8suLWQDPb8Icbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTnjWG/btrJQegatgG/KIuPbbaO8suLWQDPb8Icbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTnjWG/btrJQegatgG/KIuPbbaO8suLWQDPb8Icbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTnjWG%2FbtrJQegatgG%2FKIuPbbaO8suLWQDPb8Icbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;125&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;125&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;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;i&gt;get으로 들어오면&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JyuUn/btrJLTcXMFR/KZSOuPFizziEcsKT6ykpf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JyuUn/btrJLTcXMFR/KZSOuPFizziEcsKT6ykpf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JyuUn/btrJLTcXMFR/KZSOuPFizziEcsKT6ykpf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJyuUn%2FbtrJLTcXMFR%2FKZSOuPFizziEcsKT6ykpf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1418&quot; height=&quot;178&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;178&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;i&gt;값 가져오기&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvXwMK/btrJMz6prHu/MoAG6fT3fe1LLjFhWKRBR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvXwMK/btrJMz6prHu/MoAG6fT3fe1LLjFhWKRBR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvXwMK/btrJMz6prHu/MoAG6fT3fe1LLjFhWKRBR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvXwMK%2FbtrJMz6prHu%2FMoAG6fT3fe1LLjFhWKRBR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;628&quot; height=&quot;280&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1SZzU/btrJKsGGSTW/pPV0cQgSg8dkP81rKPYVCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1SZzU/btrJKsGGSTW/pPV0cQgSg8dkP81rKPYVCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1SZzU/btrJKsGGSTW/pPV0cQgSg8dkP81rKPYVCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1SZzU%2FbtrJKsGGSTW%2FpPV0cQgSg8dkP81rKPYVCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;779&quot; height=&quot;56&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;56&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;ajax로 받아오면, action파일이 사라질 예정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TestAController.java&lt;/p&gt;
&lt;pre id=&quot;code_1660634675832&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.Controller;

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

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.fasterxml.jackson.databind.ObjectMapper;

@Controller
public class TestAController {

	@RequestMapping(value = &quot;/testA&quot;)
	public ModelAndView testA(ModelAndView mav) {

		mav.setViewName(&quot;testa/testA&quot;);
		return mav;
	}

	// RequestMapping의 method : 해당 주소의 접근 형태를 제한
	// produces : 문서의 형태와 언어셋
	@RequestMapping(value = &quot;/testAAjax&quot;, method = RequestMethod.POST, // get방식으로 들어오면 동작안할거여, POST만 가능
			produces = &quot;text/json;charset=UTF-8&quot;)

	// @ResponseBody : 결과가 View로 인식하게 함. 따라서 ViewResolver가 동작 안함,
	// Spring에 결과가 View인척 하는 역할을 제공
	@ResponseBody
	public String testAAjax() throws Throwable {

		// JSON핸들링
		ObjectMapper mapper = new ObjectMapper(); // 외부라이브러리임, 스프링에서 제공하는건 아님, jackson에서 제공
		// 보낼 값들을 담을 객체
		Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;String, Object&amp;gt;();

		model.put(&quot;msg&quot;, &quot;Hi&quot;);
		int[] arr = { 3, 6, 9 };
		model.put(&quot;arr&quot;, arr);
		// JSON = &amp;gt; {&quot;msg&quot;:&quot;hi&quot;,&quot;arr&quot;:[3,6,9]}
		// 원래 이렇게 해야하는데, 이거를 손 쉽게 할려고 ObjectMapper 사용
		// writeValueAsString(객체) : 객체의 내용을 JSON 문자열로 변환
		// 단, 사용불가능한 형식이 들어올 수 있기 때문에 예외처리 필요 그래서 throws Throwable 붙여줌
		System.out.println(mapper.writeValueAsString(model));

		return mapper.writeValueAsString(model);
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ITestAService.java&lt;/p&gt;
&lt;pre id=&quot;code_1660634755816&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.service;

public interface ITestAService {

}&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;TestAService.java&lt;/p&gt;
&lt;pre id=&quot;code_1660634778216&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.service;

public class TestAService {

}&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;ITestADao.java&lt;/p&gt;
&lt;pre id=&quot;code_1660634797479&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.dao;

public interface ITestADao {

}&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;TestADao.java&lt;/p&gt;
&lt;pre id=&quot;code_1660634814488&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.testa.dao;

public class TestADao {

}&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;testA.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660634835232&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;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$.ajax({
		url : &quot;testAAjax&quot;, //경로
		type : &quot;POST&quot;, // 전송방식(GET: 주소형태, POST : 주소 헤더 형태)
		dataType: &quot;json&quot;, // 데이터 형태
		success : function(res) { //성공했을 때 결과를 res에 받고 함수 실행
			console.log(res);
			console.log(res.msg);
		},
		error : function(request, status, error) { // 실패했을 때 함수실행
			console.log(request.responseTxt); // 실패 상세 태역
		}
	});
});
&amp;lt;/script&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL/academy</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/123</guid>
      <comments>https://makeaplayground.tistory.com/123#entry123comment</comments>
      <pubDate>Tue, 16 Aug 2022 16:27:59 +0900</pubDate>
    </item>
    <item>
      <title>국비 TIL(Today I Learned) 20220812 MEM테이블 리뷰, 로그인, 로그아웃 화면</title>
      <link>https://makeaplayground.tistory.com/122</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;MEM테이블에서 비밀번호관련&lt;/b&gt;&lt;/i&gt;&lt;i&gt;&lt;b&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;memUpdate.jsp&lt;i&gt;&lt;b&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDWsaL/btrJvGEPXyn/Prm1ZW0J4hG7Z7Qa13YiGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDWsaL/btrJvGEPXyn/Prm1ZW0J4hG7Z7Qa13YiGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDWsaL/btrJvGEPXyn/Prm1ZW0J4hG7Z7Qa13YiGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDWsaL%2FbtrJvGEPXyn%2FPrm1ZW0J4hG7Z7Qa13YiGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;696&quot; height=&quot;666&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jcl8g/btrJA3rozO3/tmHOKTDkqCIKygc0UA0xn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jcl8g/btrJA3rozO3/tmHOKTDkqCIKygc0UA0xn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jcl8g/btrJA3rozO3/tmHOKTDkqCIKygc0UA0xn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJcl8g%2FbtrJA3rozO3%2FtmHOKTDkqCIKygc0UA0xn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;690&quot; height=&quot;95&quot; data-origin-width=&quot;690&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;memInsert.jsp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NSeYV/btrJwYZKhG4/6yK8E1e7nG9gUG6ZQPKUaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NSeYV/btrJwYZKhG4/6yK8E1e7nG9gUG6ZQPKUaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NSeYV/btrJwYZKhG4/6yK8E1e7nG9gUG6ZQPKUaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNSeYV%2FbtrJwYZKhG4%2F6yK8E1e7nG9gUG6ZQPKUaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;693&quot; height=&quot;612&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7asy1/btrJw0cbjov/SLjm9GJoK716uihnfVLWDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7asy1/btrJw0cbjov/SLjm9GJoK716uihnfVLWDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7asy1/btrJw0cbjov/SLjm9GJoK716uihnfVLWDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7asy1%2FbtrJw0cbjov%2FSLjm9GJoK716uihnfVLWDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;517&quot; height=&quot;98&quot; data-origin-width=&quot;517&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;p data-ke-size=&quot;size16&quot;&gt;Mem_SQL.xml&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VNnVw/btrJypQgMzW/E6DKiYstJTGFm5unkPcflk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VNnVw/btrJypQgMzW/E6DKiYstJTGFm5unkPcflk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VNnVw/btrJypQgMzW/E6DKiYstJTGFm5unkPcflk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVNnVw%2FbtrJypQgMzW%2FE6DKiYstJTGFm5unkPcflk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;177&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;177&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;memInsert.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660287898478&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- CKEditor --&amp;gt;
&amp;lt;!-- 제이쿼리 뒤에 나와야함, 제이쿼리 기반으로 동작하기 때문에 --&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/ckeditor/ckeditor.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#backForm&quot;).submit();
	});
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
	
		// $.trim(값) : 값 앞 뒤 공백제거	
		if($.trim($(&quot;#memId&quot;).val()) == &quot;&quot;){
			alert(&quot;아이디 입력하세요&quot;);
			$(&quot;#memId&quot;).focus();
		}else if($.trim($(&quot;#memPw&quot;).val()) == &quot;&quot;){
			alert(&quot;비밀번호를 입력세요&quot;);
			$(&quot;#memPw&quot;).focus();
		} else if($.trim($(&quot;#memPw&quot;).val()) != $.trim($(&quot;#repw&quot;).val())){
			alert(&quot;비밀번호가 일치하지 않습니다.&quot;);
			$(&quot;#memPw&quot;).val(&quot;&quot;);
			$(&quot;#repw&quot;).val(&quot;&quot;);
			$(&quot;#memPw&quot;).focus();
		} else if($.trim($(&quot;#memNm&quot;).val()) == &quot;&quot;){
			alert(&quot;이름을 입력하세요&quot;);
			$(&quot;#memNm&quot;).focus();
		} else if($.trim($(&quot;#memBirth&quot;).val()) == &quot;&quot;){
			alert(&quot;생년월일을 입력하세요&quot;);
			$(&quot;#memBirth&quot;).focus();
		} else {
			$(&quot;#actionForm&quot;).submit();
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;memList&quot; id=&quot;backForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;form action=&quot;memRes&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;!-- gbn : 구분, 혹은 flag
구분: i - insert, u - update, d - delete --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;i&quot;/&amp;gt;
아이디 
&amp;lt;input type=&quot;text&quot; name=&quot;memId&quot; id=&quot;memId&quot; /&amp;gt;
&amp;lt;br /&amp;gt;
비밀번호 
&amp;lt;input type=&quot;password&quot; name=&quot;memPw&quot; id=&quot;memPw&quot; /&amp;gt;
&amp;lt;br /&amp;gt;
비밀번호확인
&amp;lt;input type=&quot;password&quot; id=&quot;repw&quot; /&amp;gt;
&amp;lt;br /&amp;gt;
이름
&amp;lt;input type=&quot;text&quot; name=&quot;memNm&quot; id=&quot;memNm&quot; /&amp;gt;
&amp;lt;br/&amp;gt;
생년월일
&amp;lt;input type=&quot;date&quot; name=&quot;memBirth&quot; id=&quot;memBirth&quot; /&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;/form&amp;gt;  
&amp;lt;input type=&quot;button&quot; value=&quot;등록&quot; id=&quot;insertBtn&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;목록&quot; id=&quot;listBtn&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;memUpdate.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660287938631&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		history.back();
	});
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {

		// $.trim(값) : 값 앞 뒤 공백제거	
		if($.trim($(&quot;#memId&quot;).val()) == &quot;&quot;){
			alert(&quot;아이디 입력하세요&quot;);
			$(&quot;#memId&quot;).focus();
		}  else if($.trim($(&quot;#memNm&quot;).val()) == &quot;&quot;){
			alert(&quot;이름을 입력하세요&quot;);
			$(&quot;#memNm&quot;).focus();
		} else if($.trim($(&quot;#memPw&quot;).val()) !=&quot;&quot; // 이 부분이 업데이트에 추가됨 
				&amp;amp;&amp;amp; $.trim($(&quot;#memPw&quot;).val()) != $.trim($(&quot;#repw&quot;).val())){
			alert(&quot;비밀번호가 일치하지 않습니다.&quot;);
			$(&quot;#memPw&quot;).val(&quot;&quot;);
			$(&quot;#repw&quot;).val(&quot;&quot;);
			$(&quot;#memPw&quot;).focus();
		} else if($.trim($(&quot;#memBirth&quot;).val()) == &quot;&quot;){
			alert(&quot;생년월일을 입력하세요&quot;);
			$(&quot;#memBirth&quot;).focus();
		} else {
			$(&quot;#actionForm&quot;).submit();
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;memRes&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;u&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.MEM_NO}&quot;/&amp;gt; 
아이디 
&amp;lt;input type=&quot;text&quot; name=&quot;memId&quot; id=&quot;memId&quot; value=&quot;${data.MEM_ID}&quot;/&amp;gt;
&amp;lt;br /&amp;gt;
이름
&amp;lt;input type=&quot;text&quot; name=&quot;memNm&quot; id=&quot;memNm&quot;  value=&quot;${data.MEM_NM}&quot;/&amp;gt;
&amp;lt;br/&amp;gt;
비밀번호
&amp;lt;input type=&quot;password&quot; name=&quot;memPw&quot; id=&quot;memPw&quot;  value=&quot;${data.MEM_PW}&quot;/&amp;gt;
&amp;lt;br/&amp;gt;
비밀번호확인
&amp;lt;input type=&quot;password&quot; id=&quot;repw&quot; /&amp;gt;
&amp;lt;br/&amp;gt;
생년월일
&amp;lt;input type=&quot;date&quot; name=&quot;memBirth&quot; id=&quot;memBirth&quot; value=&quot;${data.MEM_BIRTH}&quot;/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;수정&quot; id=&quot;updateBtn&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;뒤로가기&quot; id=&quot;listBtn&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;Mem_SQL.xml&lt;/p&gt;
&lt;pre id=&quot;code_1660287853679&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- namespace : 클래스와 동일, 이 파일의 대표명 --&amp;gt;
&amp;lt;mapper namespace=&quot;mem&quot;&amp;gt;
	&amp;lt;!-- select : 조회 
		id: 구분자, 메소드명과 동일
		resultType : 조회 결과 중 한줄에 대한 자료 형태를 지정
		hashmap: mybatis-config.xml에서 별칭 지정해놔서 줄여쓸수있는거임
		쿼리 삽입시 주의사항: ;이 있는경우 문제가 발생한다. 이유는 해당 쿼리 실행시 자동으로 추가되기 때문
	--&amp;gt;
	&amp;lt;select id=&quot;getMemList&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT S.MEM_NO, S.MEM_ID, S.MEM_NM, S.REG_DT
		FROM (SELECT MEM_NO, MEM_ID, MEM_NM, TO_CHAR(REG_DT,'YYYY-MM-DD') AS REG_DT,
       		  ROW_NUMBER() OVER(ORDER BY REG_DT DESC, MEM_NO DESC) AS RNK
			  FROM MEM
			  WHERE DEL = 1
			&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; &amp;lt;!-- 검색어가 있다면 --&amp;gt;
				&amp;lt;choose&amp;gt;
					&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt; &amp;lt;!-- 품목 --&amp;gt;
						AND MEM_ID LIKE '%' || #{searchTxt} || '%'
					&amp;lt;/when&amp;gt;
					&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt; &amp;lt;!-- 수량 --&amp;gt;
						AND MEM_NM = #{searchTxt}
					&amp;lt;/when&amp;gt;
				&amp;lt;/choose&amp;gt;
			&amp;lt;/if&amp;gt;
             ) S
		WHERE S.RNK BETWEEN #{start} AND #{end}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;!-- 
		parameterType : 실행시 받는 값 
		#{키} : 헤당위치에 문자열로 키에 해당하는 값을 넣어준다
		ex) no에 3이 들어있는 경우
		WHERE SELL_NO = #{no}
		=&amp;gt; WHERE SELL_NO = '3' // 문자열이기 때문에  ' '이 들어감
		parameterType dao받는값, resultType값이 db실행결과
	--&amp;gt;
	&amp;lt;select id=&quot;getMem&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT MEM_NO, MEM_ID, MEM_NM, TO_CHAR(MEM_BIRTH,'YYYY-MM-DD') AS MEM_BIRTH, TO_CHAR(REG_DT,'YYYY-MM-DD') AS REG_DT
		FROM MEM
		WHERE MEM_NO = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;!-- insert는 resultType 이 없음 --&amp;gt;
	&amp;lt;insert id=&quot;insertMem&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO MEM(MEM_NO, MEM_ID, MEM_PW, MEM_NM, MEM_BIRTH)
		VALUES(MEM_SEQ.NEXTVAL, #{memId}, #{memPw}, #{memNm}, #{memBirth})
	&amp;lt;/insert&amp;gt;
	
	
	&amp;lt;update id=&quot;deleteMem&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE MEM SET DEL = 0
		WHERE MEM_NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;update id=&quot;updateMem&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE MEM SET MEM_ID = #{memId},
                MEM_NM = #{memNm},
                &amp;lt;if test=&quot;memPw != null and memPw != ''&quot;&amp;gt;
                	 MEM_PW = #{memPw},
                &amp;lt;/if&amp;gt;
                MEM_BIRTH = #{memBirth}
       	WHERE MEM_NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;select id=&quot;getMemCnt&quot; parameterType=&quot;hashmap&quot; resultType=&quot;Integer&quot;&amp;gt;
		SELECT COUNT(*) AS CNT 
		FROM MEM
		WHERE DEL = 1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; &amp;lt;!-- 검색어가 있다면 --&amp;gt;
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt; &amp;lt;!-- 품목 --&amp;gt;
					AND MEM_ID LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt; &amp;lt;!-- 수량 --&amp;gt;
					AND MEM_NM = #{searchTxt}
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;&lt;b&gt;로그인&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Login : 입력 정보와 일치하는 사용자 정보를 &lt;i&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;보관중&lt;/span&gt;&lt;/i&gt;인 상태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Logout : 보관중인 사용자 정보가 &lt;i&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;제거&lt;/span&gt;&lt;/i&gt;된 상태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Session : 서버에 사용자의 브라우저, 아이피 등에 따라 제공되는 &lt;i&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;임시&lt;/span&gt;&lt;/i&gt; 개별공간, 지정 시간 마다 미 사용시 초기화&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(브라우저! 그래서 크롬에서 로그인 되어있어도, 엣지로 들어가면 로그인 안되어있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Session에 넣을 것들(권장): 기본 사용자 정보, 사용빈도가 높은 데이터 키값들&lt;/p&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;size18&quot;&gt;&lt;i&gt;&lt;b&gt;Request 를 통한 세션 취득&amp;nbsp;&lt;/b&gt;&lt;/i&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXBagO/btrJAJfA1zC/uymRhuu3jmnGbM77vHy2r1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXBagO/btrJAJfA1zC/uymRhuu3jmnGbM77vHy2r1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXBagO/btrJAJfA1zC/uymRhuu3jmnGbM77vHy2r1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXBagO%2FbtrJAJfA1zC%2FuymRhuu3jmnGbM77vHy2r1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;828&quot; height=&quot;448&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;448&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&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번 방법은 한줄만 쓰면 되니 2번 방법을 많이 씀&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PaINd/btrJzuwLa9L/paSjexAzSKjuo9BlTU29k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PaINd/btrJzuwLa9L/paSjexAzSKjuo9BlTU29k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PaINd/btrJzuwLa9L/paSjexAzSKjuo9BlTU29k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPaINd%2FbtrJzuwLa9L%2FpaSjexAzSKjuo9BlTU29k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;675&quot; height=&quot;358&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;&lt;b&gt;로그아웃&lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션에 정보 제거&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xqHEs/btrJwuLetpF/ZFXxmwofKBsM98yUvm32Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xqHEs/btrJwuLetpF/ZFXxmwofKBsM98yUvm32Dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xqHEs/btrJwuLetpF/ZFXxmwofKBsM98yUvm32Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxqHEs%2FbtrJwuLetpF%2FZFXxmwofKBsM98yUvm32Dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;693&quot; height=&quot;190&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;190&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;LoginController.java&lt;/p&gt;
&lt;pre id=&quot;code_1660287132296&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.controller;

import java.util.HashMap;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.spring.sample.web.test.service.ILoginService;

@Controller
public class LoginController {
	@Autowired
	public ILoginService iLoginService;

	@RequestMapping(value = &quot;/testLogin&quot;)
	public ModelAndView testLogin(HttpSession session, // 로그인 된 상태에서 로그인 화면 못가게 하기 위해
			ModelAndView mav) {
		// session의 getAttribute(키) : 세션값 취득
		// 세션에 값이 존재한다면 main으로 이동
		if (session.getAttribute(&quot;sMemNm&quot;) != null &amp;amp;&amp;amp; session.getAttribute(&quot;sMemNm&quot;) != &quot;&quot;) {
			mav.setViewName(&quot;redirect:testMain&quot;);
		} else {
			mav.setViewName(&quot;test/login/login&quot;);
		}

		return mav;
	}

	// DB에 붙을예정
	@RequestMapping(value = &quot;/testLoginAction&quot;)
	public ModelAndView testLoginAction(
			// HttpServletRequest req, // 1. 요청 객체 취득
			HttpSession session, // 2. Spring에 Session 객체 요청
			@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {
		// 1. Request를 통한 세션 취득
		// HttpSession session = req.getSession();

		// 아이디와 비밀번호가 일치하는 사용자 정보 취득
		HashMap&amp;lt;String, String&amp;gt; data = iLoginService.checkMem(params);

		if (data != null) { // 조회 데이터가 있다면
			// 세션에 값 추가
			session.setAttribute(&quot;sMemNo&quot;, data.get(&quot;MEM_NO&quot;));
			session.setAttribute(&quot;sMemNm&quot;, data.get(&quot;MEM_NM&quot;));

			mav.setViewName(&quot;redirect:testMain&quot;);
		} else {
			mav.setViewName(&quot;test/login/action&quot;);
		}
		return mav;
	}

	@RequestMapping(value = &quot;/testMain&quot;)
	public ModelAndView testMain(ModelAndView mav) {
		mav.setViewName(&quot;test/login/main&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/testLogout&quot;)
	public ModelAndView testLogout(HttpSession session, ModelAndView mav) {
		// 요청 사용자 세션 초기화
		session.invalidate();

		mav.setViewName(&quot;redirect:testMain&quot;);

		return mav;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ILoginService.java&lt;/p&gt;
&lt;pre id=&quot;code_1660287157934&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.service;

import java.util.HashMap;

public interface ILoginService {

	public HashMap&amp;lt;String, String&amp;gt; checkMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LoginService.java&lt;/p&gt;
&lt;pre id=&quot;code_1660287187902&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.service;

import java.util.HashMap;

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

import com.spring.sample.web.test.dao.ILoginDao;

@Service
public class LoginService implements ILoginService {
	@Autowired
	public ILoginDao iLoginDao;

	@Override
	public HashMap&amp;lt;String, String&amp;gt; checkMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iLoginDao.checkMem(params);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ILoginDao.java&lt;/p&gt;
&lt;pre id=&quot;code_1660287207445&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.dao;

import java.util.HashMap;

public interface ILoginDao {

	public HashMap&amp;lt;String, String&amp;gt; checkMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LoginDao.java&lt;/p&gt;
&lt;pre id=&quot;code_1660287224821&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.dao;

import java.util.HashMap;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class LoginDao implements ILoginDao {
	@Autowired
	public SqlSession sqlSession;

	@Override
	public HashMap&amp;lt;String, String&amp;gt; checkMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectOne(&quot;Login.checkMem&quot;, params);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Login_SQL.xml&lt;/p&gt;
&lt;pre id=&quot;code_1660287261838&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;Login&quot;&amp;gt;
	&amp;lt;select id=&quot;checkMem&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT MEM_NO, MEM_NM
		FROM MEM
		WHERE DEL = 1
		AND MEM_ID = #{id} &amp;lt;!-- login/login jsp에서 name맞춰줘야함 --&amp;gt;
		AND MEM_PW = #{pw}
	&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;192&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8pg5r/btrJyp3YnzH/p8Acoz8ISAmaK0GwKX2fL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8pg5r/btrJyp3YnzH/p8Acoz8ISAmaK0GwKX2fL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8pg5r/btrJyp3YnzH/p8Acoz8ISAmaK0GwKX2fL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8pg5r%2FbtrJyp3YnzH%2Fp8Acoz8ISAmaK0GwKX2fL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;192&quot; height=&quot;98&quot; data-origin-width=&quot;192&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;p data-ke-size=&quot;size16&quot;&gt;login.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660287305749&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$(&quot;#actionForm&quot;).on(&quot;keypress&quot;,&quot;input&quot;, function(event) {
		// 1.엔터쳤을때
		if(event.keyCode == 13){
			// 1.직접 함수 호출
			// login();
			
			// 2.버튼 이벤트 발생
			$(&quot;#loginBtn&quot;).click();
			return false;
		
		}
	})
	
	// 2.버튼 눌렀을때
	$(&quot;#loginBtn&quot;).on(&quot;click&quot;, login);
});

// 왜 function으로 하는지
// 로그인 동작하는 상황 2종류, 1.엔터쳤을때  2.버튼 눌렀을때
function login() {
	if($.trim($(&quot;#id&quot;).val()) == &quot;&quot;){
		alert(&quot;아이디를 입력하세요.&quot;);
		$(&quot;#id&quot;).focus();
	} else if($.trim($(&quot;#pw&quot;).val()) == &quot;&quot;){
		alert(&quot;비밀번호를 입력하세요.&quot;);
		$(&quot;#pw&quot;).focus();
	} else {
		$(&quot;#actionForm&quot;).submit();
	}
}

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;testLoginAction&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	아이디 &amp;lt;input type=&quot;text&quot; name=&quot;id&quot; id=&quot;id&quot; /&amp;gt;&amp;lt;br/&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;/form&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;로그인&quot; id=&quot;loginBtn&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;action.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660287323902&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;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;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660287344598&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$(&quot;#logoutBtn&quot;).on(&quot;click&quot;, function () {
		location.href = &quot;testLogout&quot;;
	})
	
	$(&quot;#loginBtn&quot;).on(&quot;click&quot;, function () {
		location.href = &quot;testLogin&quot;;
	})
})
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:choose&amp;gt;
	&amp;lt;c:when test=&quot;${empty sMemNm}&quot;&amp;gt; &amp;lt;!-- el태그의 empty : 해당 값이 비어있는지 확인 --&amp;gt;
		&amp;lt;input type=&quot;button&quot; value=&quot;로그인&quot; id=&quot;loginBtn&quot; /&amp;gt;
	&amp;lt;/c:when&amp;gt;
	&amp;lt;c:otherwise&amp;gt;
		${sMemNm}님 어서어세요. &amp;lt;input type=&quot;button&quot; value=&quot;로그아웃&quot; id=&quot;logoutBtn&quot; /&amp;gt;
	&amp;lt;/c:otherwise&amp;gt;
&amp;lt;/c:choose&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;TBOARD만들기&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;589&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beHuvH/btrJAMwHGH4/Xo5HjFHfYL05sg4EXt2YKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beHuvH/btrJAMwHGH4/Xo5HjFHfYL05sg4EXt2YKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beHuvH/btrJAMwHGH4/Xo5HjFHfYL05sg4EXt2YKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeHuvH%2FbtrJAMwHGH4%2FXo5HjFHfYL05sg4EXt2YKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;789&quot; height=&quot;589&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;589&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MEM테이블이랑 TBOARD랑 외래키 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/32xvk/btrJA3EZcqq/7ktRFYY0tSUOK5XM2vAKK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/32xvk/btrJA3EZcqq/7ktRFYY0tSUOK5XM2vAKK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/32xvk/btrJA3EZcqq/7ktRFYY0tSUOK5XM2vAKK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F32xvk%2FbtrJA3EZcqq%2F7ktRFYY0tSUOK5XM2vAKK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;788&quot; height=&quot;590&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;590&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;그리고 정렬하는거를 해봤는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나혼자 한거라,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;anboardList&lt;/p&gt;
&lt;pre id=&quot;code_1660289889392&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;style type=&quot;text/css&quot;&amp;gt;
table{
	border-collapse: collapse;
}

th, td {
	border: 1px solid #000;
	padding: 5px;
}

&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	
	if(&quot;${param.searchGbn}&quot; != &quot;&quot;) { // 검색구분이 넘어오면
		$(&quot;#searchGbn&quot;).val(&quot;${param.searchGbn}&quot;);	
	}
	
	if(&quot;${param.sortGbn}&quot; == &quot;&quot;){
		$(&quot;#sortGbn&quot;).val(&quot;0&quot;);	
	}
	if(&quot;${param.sortGbn}&quot; != &quot;&quot;) { 
		$(&quot;#sortGbn&quot;).val(&quot;${param.sortGbn}&quot;);	
	}
	
	$('select').on('change', function() {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;anboardList&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
	
	
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;tr&quot;, function () {
		console.log($(this).attr(&quot;no&quot;));
		$(&quot;#no&quot;).val($(this).attr(&quot;no&quot;));
		
		// 검색 상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		$(&quot;#sortGbn&quot;).val($(&quot;#oldSort&quot;).val());
		
	
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;anboardDetail&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		location.href = &quot;anboardInsert&quot;;
	});
	
	$(&quot;#pagingWrap&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));
		
		// 검색 상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		$(&quot;#sortGbn&quot;).val($(&quot;#oldSort&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;anboardList&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
	
	$(&quot;#searchBtn&quot;).on(&quot;click&quot;, function () {
		// 검색하면 페이지는 무조건 1페이지로 감
		$(&quot;#page&quot;).val(&quot;1&quot;); // 페이지 초기화
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;anboardList&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
})
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;!-- 기존 검색 내용 유지용 --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldSort&quot; value=&quot;${param.sortGbn}&quot;/&amp;gt;
&amp;lt;form action=&quot;anboardDetail&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; id=&quot;no&quot; name=&quot;no&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; id=&quot;page&quot; name=&quot;page&quot; value=&quot;${page}&quot; /&amp;gt;  &amp;lt;!-- 상세보기 갈때 page 가져갈거임 --&amp;gt;
	&amp;lt;select name=&quot;sortGbn&quot; id=&quot;sortGbn&quot;&amp;gt;
		&amp;lt;option value=&quot;0&quot;&amp;gt;번호순&amp;lt;/option&amp;gt;
		&amp;lt;option value=&quot;1&quot;&amp;gt;제목순&amp;lt;/option&amp;gt;
	&amp;lt;/select&amp;gt;
	&amp;lt;br/&amp;gt;
	&amp;lt;!-- 검색 --&amp;gt;
	&amp;lt;select name=&quot;searchGbn&quot; id=&quot;searchGbn&quot;&amp;gt;
		&amp;lt;option value=&quot;0&quot;&amp;gt;제목&amp;lt;/option&amp;gt;
		&amp;lt;option value=&quot;1&quot;&amp;gt;작성자&amp;lt;/option&amp;gt;
	&amp;lt;/select&amp;gt;
	&amp;lt;input type=&quot;text&quot; name=&quot;searchTxt&quot; id=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt; &amp;lt;!-- 검색어 유지되게, 그래야 페이징할떄도 유지됨 --&amp;gt;
	&amp;lt;input type=&quot;button&quot; value=&quot;검색&quot; id=&quot;searchBtn&quot; /&amp;gt;
	&amp;lt;input type=&quot;button&quot; value=&quot;추가&quot; id=&quot;insertBtn&quot; /&amp;gt;
&amp;lt;/form&amp;gt;

&amp;lt;table&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 var=&quot;data&quot; items=&quot;${list}&quot;&amp;gt;
			&amp;lt;tr no=&quot;${data.NO}&quot;&amp;gt;
				&amp;lt;td&amp;gt;${data.NO}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.TITLE}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.WRITER}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.HIT}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.DT}&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;div id=&quot;pagingWrap&quot;&amp;gt;
&amp;lt;span page=&quot;1&quot;&amp;gt;처음&amp;lt;/span&amp;gt;
&amp;lt;!-- 이전은 현재페이지에서 하나 전, 
지금 1페이지인지 아닌지 먼저 체크 따라서, 현재페이지 필요--&amp;gt;
&amp;lt;!-- 이전페이지 : 현제페이지가 1이면 1로 이동 아니면 현제페이지 -1 --&amp;gt;
&amp;lt;c:choose&amp;gt;
	&amp;lt;c:when test=&quot;${page eq 1}&quot;&amp;gt;
		&amp;lt;span page=&quot;1&quot;&amp;gt;이전&amp;lt;/span&amp;gt;
	&amp;lt;/c:when&amp;gt;
	&amp;lt;c:otherwise&amp;gt;
		&amp;lt;span page=&quot;${page - 1}&quot;&amp;gt;이전&amp;lt;/span&amp;gt;
	&amp;lt;/c:otherwise&amp;gt;
&amp;lt;/c:choose&amp;gt;
&amp;lt;!-- 페이지들 --&amp;gt;
&amp;lt;c:forEach var=&quot;i&quot; begin=&quot;${pd.startP}&quot; end=&quot;${pd.endP}&quot; step=&quot;1&quot;&amp;gt;
	&amp;lt;%-- 현재 페이지의 경우 별도 처리 --%&amp;gt;
	&amp;lt;c:choose&amp;gt;
		&amp;lt;c:when test=&quot;${i eq page}&quot;&amp;gt; &amp;lt;%-- 현재페이지 --%&amp;gt;
			&amp;lt;span page=&quot;${i}&quot;&amp;gt;&amp;lt;b&amp;gt;${i}&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;
		&amp;lt;/c:when&amp;gt;
		&amp;lt;c:otherwise&amp;gt; &amp;lt;%-- 다른페이지 --%&amp;gt;
			&amp;lt;span page=&quot;${i}&quot;&amp;gt;${i}&amp;lt;/span&amp;gt;
		&amp;lt;/c:otherwise&amp;gt;
	&amp;lt;/c:choose&amp;gt;
&amp;lt;/c:forEach&amp;gt;

&amp;lt;!-- 다음페이지 : 마지막에 도달했을때는 증가하지 않고, 다른 경우는 +1 --&amp;gt;
&amp;lt;c:choose&amp;gt;
	&amp;lt;c:when test=&quot;${page eq pd.maxP}&quot;&amp;gt;
		&amp;lt;span page=&quot;${pd.maxP}&quot;&amp;gt;다음&amp;lt;/span&amp;gt;
	&amp;lt;/c:when&amp;gt;
	&amp;lt;c:otherwise&amp;gt;
		&amp;lt;span page=&quot;${page + 1}&quot;&amp;gt;다음&amp;lt;/span&amp;gt;
	&amp;lt;/c:otherwise&amp;gt;
&amp;lt;/c:choose&amp;gt;

&amp;lt;span page=&quot;${pd.maxP}&quot;&amp;gt;마지막&amp;lt;/span&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mrpME/btrJACuzZYS/ojK8uzqmKxDRpqN8HmksB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mrpME/btrJACuzZYS/ojK8uzqmKxDRpqN8HmksB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mrpME/btrJACuzZYS/ojK8uzqmKxDRpqN8HmksB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmrpME%2FbtrJACuzZYS%2FojK8uzqmKxDRpqN8HmksB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;366&quot; height=&quot;202&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;202&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;detail, update, res 부분에 넣고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chXjtA/btrJzuRCE6K/Mo77wb2D3mWH55frCbfx9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chXjtA/btrJzuRCE6K/Mo77wb2D3mWH55frCbfx9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chXjtA/btrJzuRCE6K/Mo77wb2D3mWH55frCbfx9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchXjtA%2FbtrJzuRCE6K%2FMo77wb2D3mWH55frCbfx9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;843&quot; height=&quot;175&quot; data-origin-width=&quot;843&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;Test_SQL.xml&lt;/p&gt;
&lt;pre id=&quot;code_1660290064191&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- namespace : 클래스와 동일, 이 파일의 대표명 --&amp;gt;
&amp;lt;mapper namespace=&quot;test&quot;&amp;gt;

	&amp;lt;!-- anboard테이블 --&amp;gt;
	
	&amp;lt;select id=&quot;getAnboardList&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;		
		SELECT S.NO, S.TITLE, S.WRITER, S.HIT, S.DT
		FROM (SELECT NO, TITLE, WRITER, HIT, CASE WHEN TO_CHAR(DT,'YY.MM.DD') = TO_CHAR(SYSDATE, 'YY.MM.DD')
        THEN TO_CHAR(DT, 'HH24:MI')
        ELSE TO_CHAR(DT, 'YY.MM.DD')
        END AS DT,
        ROW_NUMBER() OVER(ORDER BY DT DESC, NO DESC) AS RNK
		FROM ANBOARD
		WHERE DEL = 1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; 
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt;
					AND TITLE LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt;
					AND WRITER LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;
		&amp;lt;if test=&quot;1 == 1&quot;&amp;gt;
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;sortGbn == 0&quot;&amp;gt;
					ORDER BY NO ASC
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;sortGbn == 1&quot;&amp;gt;
					ORDER BY TITLE ASC
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;
		) S
		WHERE S.RNK BETWEEN #{start} AND #{end} 
	&amp;lt;/select&amp;gt;

	&amp;lt;select id=&quot;getAnboard&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT NO, TITLE, WRITER, CON, HIT, DT 
		FROM ANBOARD
		WHERE NO = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;insertAnboard&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO ANBOARD(NO, TITLE, WRITER, CON)
		VALUES(ANBOARD_SEQ.NEXTVAL, #{title}, #{writer}, #{con})
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;update id=&quot;deleteAnboard&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE ANBOARD SET DEL = 0
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;update id=&quot;updateAnboard&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE ANBOARD SET TITLE = #{title},
                WRITER = #{writer},
                CON = #{con}
                WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;select id=&quot;getAnboardCnt&quot; parameterType=&quot;hashmap&quot; resultType=&quot;Integer&quot;&amp;gt;
		SELECT COUNT(*) AS CNT 
		FROM ANBOARD
		WHERE DEL = 1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; 
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt; &amp;lt;!-- searchGbn eq 0 --&amp;gt;
					AND TITLE LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt;
					AND WRITER LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;
	&amp;lt;/select&amp;gt;


	&amp;lt;update id=&quot;updateHit&quot; parameterType=&quot;hashmap&quot; &amp;gt;
		UPDATE ANBOARD SET HIT = HIT + 1
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>TIL/academy</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/122</guid>
      <comments>https://makeaplayground.tistory.com/122#entry122comment</comments>
      <pubDate>Fri, 12 Aug 2022 16:43:31 +0900</pubDate>
    </item>
    <item>
      <title>국비 TIL(Today I Learned) 20220811 anboard테이블 리뷰, mem테이블 실습</title>
      <link>https://makeaplayground.tistory.com/121</link>
      <description>&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;* CRUD만드는데 얼마나 걸려요?&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;
&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;1번 경우, 디자인 제외하고 하루정도면 충분할것 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번 경우 5~6일&lt;br /&gt;&lt;br /&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;anboard테이블 강사님 리뷰중, 나랑 다른거만 작성함&lt;/p&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. controller&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brnOOt/btrJmr2joKK/breEwEY3rGYkuKw3r2g0D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brnOOt/btrJmr2joKK/breEwEY3rGYkuKw3r2g0D1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brnOOt/btrJmr2joKK/breEwEY3rGYkuKw3r2g0D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrnOOt%2FbtrJmr2joKK%2FbreEwEY3rGYkuKw3r2g0D1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;153&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. sql&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MG0cR/btrJrRyeWiV/5nC2yv1SboRO9qxvJc2xiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MG0cR/btrJrRyeWiV/5nC2yv1SboRO9qxvJc2xiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MG0cR/btrJrRyeWiV/5nC2yv1SboRO9qxvJc2xiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMG0cR%2FbtrJrRyeWiV%2F5nC2yv1SboRO9qxvJc2xiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;699&quot; height=&quot;292&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;292&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., getAnboardList 쿼리문 작성할때&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mtTHh/btrJp1ojNv9/Pp8Km3naQtNxTDTX6kjxmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mtTHh/btrJp1ojNv9/Pp8Km3naQtNxTDTX6kjxmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mtTHh/btrJp1ojNv9/Pp8Km3naQtNxTDTX6kjxmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmtTHh%2FbtrJp1ojNv9%2FPp8Km3naQtNxTDTX6kjxmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;754&quot; height=&quot;420&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘작성된 글이면 시간이 뜨게하고, 오늘이 아닌 DATE면은 년월일이 뜨도록 추가함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yoJpd/btrJmsNFRt2/Ej63abQmObQCX1KoP1Ay21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yoJpd/btrJmsNFRt2/Ej63abQmObQCX1KoP1Ay21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yoJpd/btrJmsNFRt2/Ej63abQmObQCX1KoP1Ay21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyoJpd%2FbtrJmsNFRt2%2FEj63abQmObQCX1KoP1Ay21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;367&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;367&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tJGg0/btrJpOpdbv4/M1UwsIeBpVJJjMPfLKHMN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tJGg0/btrJpOpdbv4/M1UwsIeBpVJJjMPfLKHMN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tJGg0/btrJpOpdbv4/M1UwsIeBpVJJjMPfLKHMN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtJGg0%2FbtrJpOpdbv4%2FM1UwsIeBpVJJjMPfLKHMN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;356&quot; height=&quot;183&quot; data-origin-width=&quot;356&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;&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;i&gt;&lt;b&gt;내 궁금증 질문내용&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Test_SQL.xml에 삭제 쿼리문&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beAeBa/btrJsOWaEvc/QkfypEnZOEF6aibvjDCk60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beAeBa/btrJsOWaEvc/QkfypEnZOEF6aibvjDCk60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beAeBa/btrJsOWaEvc/QkfypEnZOEF6aibvjDCk60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeAeBa%2FbtrJsOWaEvc%2FQkfypEnZOEF6aibvjDCk60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;136&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;93&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리에는 &amp;lt;update&amp;gt;&amp;lt;/update&amp;gt; 쓰고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TestDao1.java에는 delete로 썼어(sqlSession 뒷부분) =&amp;gt; 강사님이 상관없데, sqlSession.delete나 update, insert는 어차피&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'1행이 업데이트되었습니다.' 이런 1행 숫자 받는게 똑같아서 상관없데&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;205&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mqiPP/btrJqLsk6zn/gu5jSRK6ZmI3aOq6SEoBJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mqiPP/btrJqLsk6zn/gu5jSRK6ZmI3aOq6SEoBJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mqiPP/btrJqLsk6zn/gu5jSRK6ZmI3aOq6SEoBJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmqiPP%2FbtrJqLsk6zn%2Fgu5jSRK6ZmI3aOq6SEoBJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;205&quot; height=&quot;35&quot; data-origin-width=&quot;205&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzhwzG/btrJo1vONJr/6RLUo6kjogW4UZ6TGk0ed1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzhwzG/btrJo1vONJr/6RLUo6kjogW4UZ6TGk0ed1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzhwzG/btrJo1vONJr/6RLUo6kjogW4UZ6TGk0ed1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzhwzG%2FbtrJo1vONJr%2F6RLUo6kjogW4UZ6TGk0ed1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;705&quot; height=&quot;96&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;96&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;update이는 시퀀스 증가하지 않으니까 rollback해도 상관없음, 디벨로퍼에서 쿼리문 맞는지 확인하고&lt;/p&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;&lt;b&gt;Res대신에 쓰는법&lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;790&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpbNKu/btrJu5JCilw/EVe4zRzAsTfx5Pm4EkNg20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpbNKu/btrJu5JCilw/EVe4zRzAsTfx5Pm4EkNg20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpbNKu/btrJu5JCilw/EVe4zRzAsTfx5Pm4EkNg20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpbNKu%2FbtrJu5JCilw%2FEVe4zRzAsTfx5Pm4EkNg20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;790&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;790&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;anboardInsert.jsp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kzopk/btrJryTqtdK/7wnNPNDwyc9FHrQ1aOulN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kzopk/btrJryTqtdK/7wnNPNDwyc9FHrQ1aOulN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kzopk/btrJryTqtdK/7wnNPNDwyc9FHrQ1aOulN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkzopk%2FbtrJryTqtdK%2F7wnNPNDwyc9FHrQ1aOulN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;127&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;127&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;anboardAction.jsp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;838&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3DGKV/btrJrzSkn1R/FRzDaL9qQpHzcI0nAuGYn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3DGKV/btrJrzSkn1R/FRzDaL9qQpHzcI0nAuGYn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3DGKV/btrJrzSkn1R/FRzDaL9qQpHzcI0nAuGYn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3DGKV%2FbtrJrzSkn1R%2FFRzDaL9qQpHzcI0nAuGYn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1150&quot; height=&quot;838&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;838&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;i&gt;&lt;b&gt;Res 대신 @PathVariable 로 쓰는법&lt;/b&gt;&lt;/i&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;/SampleSpring/res&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; resources/~~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/SampleSpring/resources/~~&lt;/p&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;/SampleSpring/Action/insert&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; resources/~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/SampleSpring/Action/resourdes/~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;따라서 이렇게 해줘야 =&amp;gt; ../resources/~~~&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;기존경로 처림 됨 /SampleSpring/resources/~~&lt;/b&gt;&lt;/i&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-filename=&quot;KakaoTalk_20220811_112442876.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lIW90/btrJqKmbEZE/1Hnt5Q0cD9gvdb4eVX8yZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lIW90/btrJqKmbEZE/1Hnt5Q0cD9gvdb4eVX8yZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lIW90/btrJqKmbEZE/1Hnt5Q0cD9gvdb4eVX8yZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlIW90%2FbtrJqKmbEZE%2F1Hnt5Q0cD9gvdb4eVX8yZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;KakaoTalk_20220811_112442876.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220811_113444924.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/liuDe/btrJq3MoN3w/srP9vt7rB2FgkYyL3Ioti1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/liuDe/btrJq3MoN3w/srP9vt7rB2FgkYyL3Ioti1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/liuDe/btrJq3MoN3w/srP9vt7rB2FgkYyL3Ioti1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FliuDe%2FbtrJq3MoN3w%2FsrP9vt7rB2FgkYyL3Ioti1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;KakaoTalk_20220811_113444924.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;&lt;b&gt;조회수 하는법&lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;controller에서 detail쪽에 매서드 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjru8j/btrJqm0G9Wx/zxVPQAhfjl0onqCZsT3jB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjru8j/btrJqm0G9Wx/zxVPQAhfjl0onqCZsT3jB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjru8j/btrJqm0G9Wx/zxVPQAhfjl0onqCZsT3jB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbjru8j%2FbtrJqm0G9Wx%2FzxVPQAhfjl0onqCZsT3jB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1096&quot; height=&quot;435&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ITestService1.jsp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ky4X5/btrJu5CUTZp/y32xRvRnHCA6xm3WoxUbdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ky4X5/btrJu5CUTZp/y32xRvRnHCA6xm3WoxUbdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ky4X5/btrJu5CUTZp/y32xRvRnHCA6xm3WoxUbdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fky4X5%2FbtrJu5CUTZp%2Fy32xRvRnHCA6xm3WoxUbdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;672&quot; height=&quot;38&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TestService1.jsp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfTB01/btrJqnFiEiP/eqUZ7JUvOC1XyfJEOUr1K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfTB01/btrJqnFiEiP/eqUZ7JUvOC1XyfJEOUr1K0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfTB01/btrJqnFiEiP/eqUZ7JUvOC1XyfJEOUr1K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfTB01%2FbtrJqnFiEiP%2FeqUZ7JUvOC1XyfJEOUr1K0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;711&quot; height=&quot;106&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ITestDao1.jsp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;37&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgYIU8/btrJqm7q6rU/3UncENwI5nxRZmxCytbAbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgYIU8/btrJqm7q6rU/3UncENwI5nxRZmxCytbAbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgYIU8/btrJqm7q6rU/3UncENwI5nxRZmxCytbAbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgYIU8%2FbtrJqm7q6rU%2F3UncENwI5nxRZmxCytbAbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;667&quot; height=&quot;37&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;37&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TestDao1.jsp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfUpBN/btrJsP1URHR/w3S1v2foBzaQEi05ZSfAt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfUpBN/btrJsP1URHR/w3S1v2foBzaQEi05ZSfAt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfUpBN/btrJsP1URHR/w3S1v2foBzaQEi05ZSfAt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfUpBN%2FbtrJsP1URHR%2Fw3S1v2foBzaQEi05ZSfAt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;84&quot; data-origin-width=&quot;680&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;Test_SQL.xml&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3XSpj/btrJrP2dogQ/iKohnSNzH0EiiewVO1PxN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3XSpj/btrJrP2dogQ/iKohnSNzH0EiiewVO1PxN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3XSpj/btrJrP2dogQ/iKohnSNzH0EiiewVO1PxN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3XSpj%2FbtrJrP2dogQ%2FiKohnSNzH0EiiewVO1PxN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;451&quot; height=&quot;86&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;86&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Insert하는 부분은 anboardAction으로 하고 (파라미터로 넘기고)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;update는 anboardRes로 되고있는듯 (gnb받고)&lt;/p&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;ck에디터 넣을예정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5버전은 es6문법이라 4버전으로 할예정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강사님이 샘플을 script에 넣어두심&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1498&quot; data-origin-height=&quot;733&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3hZSY/btrJsuXEH0e/ykb2m4zBPli6QCT5K4Aqhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3hZSY/btrJsuXEH0e/ykb2m4zBPli6QCT5K4Aqhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3hZSY/btrJsuXEH0e/ykb2m4zBPli6QCT5K4Aqhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3hZSY%2FbtrJsuXEH0e%2Fykb2m4zBPli6QCT5K4Aqhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1498&quot; height=&quot;733&quot; data-origin-width=&quot;1498&quot; data-origin-height=&quot;733&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/elZSjl/btrJuSqxauz/j4EFNKQX2fhtp6BKSf5IKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/elZSjl/btrJuSqxauz/j4EFNKQX2fhtp6BKSf5IKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/elZSjl/btrJuSqxauz/j4EFNKQX2fhtp6BKSf5IKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FelZSjl%2FbtrJuSqxauz%2Fj4EFNKQX2fhtp6BKSf5IKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;766&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;766&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;anboard테이블 res대신에 파라미터로 준 후 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PshExamController.java&lt;/p&gt;
&lt;pre id=&quot;code_1660209283834&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.controller;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.spring.sample.common.service.IPagingService;
import com.spring.sample.web.test.service.ITestService1;

@Controller
public class PshExamController {
	@Autowired
	public ITestService1 iTestService1;

	@Autowired
	public IPagingService ips; // 페이징 서비스 객체 주입

	// anboard테이블!!!!!!!!
	@RequestMapping(value = &quot;/anboardList&quot;)
	public ModelAndView anboardList(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {

		// 현재페이지
		int page = 1;

		// 넘어오는 페이지 셋팅
		if (params.get(&quot;page&quot;) != null &amp;amp;&amp;amp; params.get(&quot;page&quot;) != &quot;&quot;) {
			page = Integer.parseInt(params.get(&quot;page&quot;)); // 받아온 페이지 할당
		}

		// 총 데이터 개수 취득
		int cnt = iTestService1.getAnboardCnt(params);

		// 페이징 데이터 계산
		// ips.getPagingData(page, maxCount, viewCnt, pageCnt)
		HashMap&amp;lt;String, Integer&amp;gt; pd = ips.getPagingData(page, cnt, 3, 2);

		// 파라미터에 시작, 종료값 추가
		// 한쪽으로 필요 데이터를 몰았다?
		params.put(&quot;start&quot;, Integer.toString(pd.get(&quot;start&quot;)));
		params.put(&quot;end&quot;, Integer.toString(pd.get(&quot;end&quot;)));

		// 데이터 취득
		List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; list = iTestService1.getAnboardList(params);

		// 목록 데이터
		mav.addObject(&quot;list&quot;, list);
		// 페이징 정보
		mav.addObject(&quot;pd&quot;, pd);
		// 현재 페이지
		mav.addObject(&quot;page&quot;, page);
		mav.setViewName(&quot;test/anboardList&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/anboardDetail&quot;)
	public ModelAndView anboardDetail(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {

		// 조회수 증가
		iTestService1.updateHit(params);

		if (params.get(&quot;no&quot;) == null || params.get(&quot;no&quot;) == &quot;&quot;) {
			mav.setViewName(&quot;redirect:anboardList&quot;);

		} else {
			HashMap&amp;lt;String, String&amp;gt; data = iTestService1.getAnboard(params);

			mav.addObject(&quot;data&quot;, data);
			mav.setViewName(&quot;test/anboardDetail&quot;);
		}

		return mav;
	}

	@RequestMapping(value = &quot;/anboardInsert&quot;)
	public ModelAndView managerInsert(ModelAndView mav) {
		mav.setViewName(&quot;test/anboardInsert&quot;);
		return mav;

	}

	@RequestMapping(value = &quot;/anboardRes&quot;)
	public ModelAndView anboardInsertRes(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav)
			throws Throwable {

		System.out.println(params.toString());
		try {
			int cnt = 0; // insert, update, delete 다 쓸거기 때문에 처음에 0줌

			switch (params.get(&quot;gbn&quot;)) {
			case &quot;i&quot;:
				cnt = iTestService1.insertAnboard(params);
				break;
			case &quot;u&quot;:
				cnt = iTestService1.updateAnboard(params);
				break;
			case &quot;d&quot;:
				cnt = iTestService1.deleteAnboard(params);
				break;
			}

			if (cnt &amp;gt; 0) { // 1건 이상 등록된 경우
				mav.addObject(&quot;res&quot;, &quot;success&quot;);
			} else { // 등록 안된 경우
				mav.addObject(&quot;res&quot;, &quot;failded&quot;);
			}
		} catch (Exception e) { // 예외 발생시
			e.printStackTrace();
			mav.addObject(&quot;res&quot;, &quot;error&quot;);
		}
		mav.setViewName(&quot;test/anboardRes&quot;);
		return mav;
	}

	// 글 수정페이지
	@RequestMapping(value = &quot;/anboardUpdate&quot;)
	public ModelAndView anboardUpdate(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {
		// 기존데이터 조회해와야함
		HashMap&amp;lt;String, String&amp;gt; data = iTestService1.getAnboard(params);
		mav.addObject(&quot;data&quot;, data);

		mav.setViewName(&quot;test/anboardUpdate&quot;);

		return mav;

	}

	// gbn없이 하는법
	// RequestMapping에서 주소 중 특정 내용들을 값으로 활용 가능
	// 주소 값에 {키}를 지정하면 해당 내용을 변수로 받을 수 있음
	@RequestMapping(value = &quot;anboardAction/{action}&quot;)
	public ModelAndView anboardAction(
			// @pathVariable : 경로를 변수로 활용하여 받아옴
			@PathVariable String action, // action이 위의 {action} 이랑 이름 같아야 함, 여기서는 insert를 받아올 예정
			@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {

		int cnt = 0;

		try {
			switch (action) {
			case &quot;insert&quot;:
				cnt = iTestService1.insertAnboard(params);
				break;
			case &quot;update&quot;:
				cnt = iTestService1.updateAnboard(params);
				mav.addObject(&quot;flag&quot;, &quot;u&quot;); // 업데이트 할때 값을 하나 더 주기, 이 역활이 gbn 대신
				break;
			case &quot;delete&quot;:
				cnt = iTestService1.deleteAnboard(params);
				break;
			}

			if (cnt &amp;gt; 0) { // 1건 이상 등록된 경우
				mav.addObject(&quot;res&quot;, &quot;success&quot;);
			} else { // 등록 안된 경우
				mav.addObject(&quot;res&quot;, &quot;failded&quot;);
			}

		} catch (Exception e) {
			e.printStackTrace();
			mav.addObject(&quot;res&quot;, &quot;error&quot;);
		}
		mav.setViewName(&quot;test/anboardAction&quot;);
		return mav;

	}

}&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;ITestService1.java&lt;/p&gt;
&lt;pre id=&quot;code_1660209336035&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.service;

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

public interface ITestService1 {

	// anboard 테이블

	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getAnboardList(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int getAnboardCnt(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public HashMap&amp;lt;String, String&amp;gt; getAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int insertAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int updateAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int deleteAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public void updateHit(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

}&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;TestService1.java&lt;/p&gt;
&lt;pre id=&quot;code_1660209378978&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.service;

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

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

import com.spring.sample.web.test.dao.ITestDao1;

@Service
public class TestService1 implements ITestService1 {
	@Autowired
	public ITestDao1 iTestDao1;

	@Override
	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getAnboardList(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao1.getAnboardList(params);
	}

	@Override
	public int getAnboardCnt(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao1.getAnboardCnt(params);
	}

	@Override
	public HashMap&amp;lt;String, String&amp;gt; getAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao1.getAnboard(params);
	}

	@Override
	public int insertAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao1.insertAnboard(params);
	}

	@Override
	public int updateAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao1.updateAnboard(params);
	}

	@Override
	public int deleteAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao1.deleteAnboard(params);
	}

	@Override
	public void updateHit(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		iTestDao1.updateHit(params);

	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ITestDao1.java&lt;/p&gt;
&lt;pre id=&quot;code_1660209412492&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.dao;

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

public interface ITestDao1 {

	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getAnboardList(HashMap&amp;lt;String, String&amp;gt; params);

	public int getAnboardCnt(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public HashMap&amp;lt;String, String&amp;gt; getAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int insertAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int updateAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int deleteAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public void updateHit(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TestDao1.java&lt;/p&gt;
&lt;pre id=&quot;code_1660209447603&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.dao;

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

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class TestDao1 implements ITestDao1 {
	@Autowired
	public SqlSession sqlSession;

	
	@Override
	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getAnboardList(HashMap&amp;lt;String, String&amp;gt; params) {
		return sqlSession.selectList(&quot;test.getAnboardList&quot;, params);
	}

	@Override
	public int getAnboardCnt(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectOne(&quot;test.getAnboardCnt&quot;, params);
	}

	@Override
	public HashMap&amp;lt;String, String&amp;gt; getAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectOne(&quot;test.getAnboard&quot;, params);
	}

	@Override
	public int insertAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.insert(&quot;test.insertAnboard&quot;, params);
	}

	@Override
	public int updateAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.update(&quot;test.updateAnboard&quot;, params);
	}

	@Override
	public int deleteAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.delete(&quot;test.deleteAnboard&quot;, params);
	}

	@Override
	public void updateHit(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		sqlSession.update(&quot;test.updateHit&quot;, params);
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Test_SQL.xml&lt;/p&gt;
&lt;pre id=&quot;code_1660209506033&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- namespace : 클래스와 동일, 이 파일의 대표명 --&amp;gt;
&amp;lt;mapper namespace=&quot;test&quot;&amp;gt;
	
	&amp;lt;!-- anboard테이블 --&amp;gt;
	
	&amp;lt;select id=&quot;getAnboardList&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;		
		SELECT S.NO, S.TITLE, S.WRITER, S.HIT, S.DT
		FROM (SELECT NO, TITLE, WRITER, HIT, CASE WHEN TO_CHAR(DT,'YY.MM.DD') = TO_CHAR(SYSDATE, 'YY.MM.DD')
        THEN TO_CHAR(DT, 'HH24:MI')
        ELSE TO_CHAR(DT, 'YY.MM.DD')
        END AS DT,
        ROW_NUMBER() OVER(ORDER BY DT DESC, NO DESC) AS RNK
		FROM ANBOARD
		WHERE DEL = 1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; 
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt;
					AND TITLE LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt;
					AND WRITER LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;
		&amp;lt;if test=&quot;1 == 1&quot;&amp;gt;
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;sortGbn == 0&quot;&amp;gt;
					ORDER BY NO ASC
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;sortGbn == 1&quot;&amp;gt;
					ORDER BY TITLE ASC
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;
		) S
		WHERE S.RNK BETWEEN #{start} AND #{end} 
	&amp;lt;/select&amp;gt;

	&amp;lt;select id=&quot;getAnboard&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT NO, TITLE, WRITER, CON, HIT, DT 
		FROM ANBOARD
		WHERE NO = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;insertAnboard&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO ANBOARD(NO, TITLE, WRITER, CON)
		VALUES(ANBOARD_SEQ.NEXTVAL, #{title}, #{writer}, #{con})
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;update id=&quot;deleteAnboard&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE ANBOARD SET DEL = 0
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;update id=&quot;updateAnboard&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE ANBOARD SET TITLE = #{title},
                WRITER = #{writer},
                CON = #{con}
                WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;select id=&quot;getAnboardCnt&quot; parameterType=&quot;hashmap&quot; resultType=&quot;Integer&quot;&amp;gt;
		SELECT COUNT(*) AS CNT 
		FROM ANBOARD
		WHERE DEL = 1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; 
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt; &amp;lt;!-- searchGbn eq 0 --&amp;gt;
					AND TITLE LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt;
					AND WRITER LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;
	&amp;lt;/select&amp;gt;


	&amp;lt;update id=&quot;updateHit&quot; parameterType=&quot;hashmap&quot; &amp;gt;
		UPDATE ANBOARD SET HIT = HIT + 1
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;anboardAction.jsp(새로 생김)&lt;/p&gt;
&lt;pre id=&quot;code_1660209550366&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;../resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	// 주소창의 데이터 받을수 있긴 한데 정말 귀찮으니 어떻게 처리할건인가 하면
	
	// src에  &quot;../resources/script/jquery/jquery-1.12.4.min.js&quot;로 변경하기
	// 또는 src에  &quot;${pageContext.request.contextPath}/resources/script/jquery/jquery-1.12.4.min.js&quot;
	
	// 경로문제가 스크립트뿐만 아니라 list도 문제임
		
	switch(&quot;${res}&quot;){
	case &quot;success&quot; : 
		if(&quot;${flag}&quot; == &quot;u&quot;){ // 수정이 성공했을 떄
			$(&quot;#goForm&quot;).submit();
		} else { // 등록, 삭제가 성공했을 떄
			location.href = &quot;../anboardList&quot; 
		}
		break;
	case &quot;failed&quot; : 
		alert(&quot;작업에 실패하였습니다.&quot;);
		history.back();
		break;
	case &quot;error&quot; : 
		alert(&quot;작업중 문제가 발생 하였습니다.&quot;);
		history.back();
		break;
	}
});
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;../anboardDetail&quot; id=&quot;goForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${param.no}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
		&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;sortTxt&quot; value=&quot;${param.sortTxt}&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;anboardInsert.jsp (form 주소바뀜 /insert, CKEDITOR 사용)&lt;/p&gt;
&lt;pre id=&quot;code_1660209570429&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- CKEditor --&amp;gt;
&amp;lt;!-- 제이쿼리 뒤에 나와야함, 제이쿼리 기반으로 동작하기 때문에 --&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/ckeditor/ckeditor.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	// 에디터 연결
	// CKEDITOR.replace(아이디, 옵션)
	CKEDITOR.replace(&quot;con&quot;, {
		resize_enabled: false, // resize_enabled : 크기조절기능 활용여부
		language : &quot;ko&quot;, // 사용언어
		enterMode: &quot;2&quot;, // 엔터키처리방법. 2번이면 &amp;lt;br/&amp;gt;
		width : 600, // 숫자일경우 px, 문자열일경우 css크기
		height : 400
	});
	
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#backForm&quot;).submit();
	});
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		// CKEditor의 값 취득
		// CKEDITOR.instances[아이디] : CKEditor중 아이디가 같은 것을 찾겠다.
		//.getData() : 작성중인 내용을 취득하겠다.
		$(&quot;#con&quot;).val(CKEDITOR.instances['con'].getData());
		
		
		// $.trim(값) : 값 앞 뒤 공백제거	
		if($.trim($(&quot;#title&quot;).val()) == &quot;&quot;){
			alert(&quot;제목을 입력하세요&quot;);
			$(&quot;#title&quot;).focus();
		} else if($.trim($(&quot;#writer&quot;).val()) == &quot;&quot;){
			alert(&quot;작성자를 입력하세요&quot;);
			$(&quot;#writer&quot;).focus();
		}  else if($.trim($(&quot;#con&quot;).val()) == &quot;&quot;){
			alert(&quot;내용을 입력하세요&quot;);
			$(&quot;#con&quot;).focus();
		} else {
			$(&quot;#actionForm&quot;).submit();
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;anboardList&quot; id=&quot;backForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;!-- gbn대신에 action에 /뒤에 이름으로 달라지게 --&amp;gt;
&amp;lt;form action=&quot;anboardAction/insert&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	제목&amp;lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot; /&amp;gt;&amp;lt;br/&amp;gt;
	작성자&amp;lt;input type=&quot;text&quot; name=&quot;writer&quot; id=&quot;writer&quot; /&amp;gt;&amp;lt;br/&amp;gt;
	내용&amp;lt;textarea rows=&quot;10&quot; cols=&quot;30&quot; name=&quot;con&quot; id=&quot;con&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
&amp;lt;/form&amp;gt; 

&amp;lt;!-- &amp;lt;form action=&quot;anboardRes&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
gbn : 구분, 혹은 flag
구분: i - insert, u - update, d - delete
&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;i&quot;/&amp;gt;
제목 
&amp;lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot; /&amp;gt;
&amp;lt;br /&amp;gt;
작성자 
&amp;lt;input type=&quot;text&quot; name=&quot;writer&quot; id=&quot;writer&quot; /&amp;gt;
&amp;lt;br/&amp;gt;
내용 
&amp;lt;textarea name=&quot;con&quot; id=&quot;con&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;/form&amp;gt;  --&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;등록&quot; id=&quot;insertBtn&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;목록&quot; id=&quot;listBtn&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;anboardDetail.jsp (삭제버튼 클릭시 주소 바뀜)&lt;/p&gt;
&lt;pre id=&quot;code_1660209585087&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function() {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;anboardList&quot;); 
		$(&quot;#actionForm&quot;).submit();
	});
	
	$(&quot;#deleteBtn&quot;).on(&quot;click&quot;, function () {
		if(confirm(&quot;삭제하시곘습니까?&quot;)){
			$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;anboardAction/delete&quot;); 
			$(&quot;#actionForm&quot;).submit();
		}
	})
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;anboardUpdate&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;d&quot;&amp;gt; &amp;lt;!-- selRes는 gbn을 받게 되어있어서 값을 추가해줘야함 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.NO}&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
		&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;sortTxt&quot; value=&quot;${param.sortTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;	
번호: ${data.NO}&amp;lt;br/&amp;gt;
제목: ${data.TITLE}&amp;lt;br/&amp;gt;
내용: ${data.CON}&amp;lt;br/&amp;gt;
작성자: ${data.WRITER}&amp;lt;br/&amp;gt;
조회수: ${data.HIT}&amp;lt;br/&amp;gt;
작성일: ${data.DT}&amp;lt;br/&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;수정&quot; id=&quot;updateBtn&quot; /&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;삭제&quot; id=&quot;deleteBtn&quot; /&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;목록&quot; id=&quot;listBtn&quot; /&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;anboardList.jsp (바뀐거없음)&lt;/p&gt;
&lt;pre id=&quot;code_1660209680591&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;style type=&quot;text/css&quot;&amp;gt;
table{
	border-collapse: collapse;
}

th, td {
	border: 1px solid #000;
	padding: 5px;
}

&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	
	if(&quot;${param.searchGbn}&quot; != &quot;&quot;) { // 검색구분이 넘어오면
		$(&quot;#searchGbn&quot;).val(&quot;${param.searchGbn}&quot;);	
	}
	
	if(&quot;${param.sortGbn}&quot; == &quot;&quot;){
		$(&quot;#sortGbn&quot;).val(&quot;0&quot;);	
	}
	if(&quot;${param.sortGbn}&quot; != &quot;&quot;) { 
		$(&quot;#sortGbn&quot;).val(&quot;${param.sortGbn}&quot;);	
	}
	
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;tr&quot;, function () {
		console.log($(this).attr(&quot;no&quot;));
		$(&quot;#no&quot;).val($(this).attr(&quot;no&quot;));
		
		// 검색 상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;anboardDetail&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		location.href = &quot;anboardInsert&quot;;
	});
	
	$(&quot;#pagingWrap&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));
		
		// 검색 상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;anboardList&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
	
	$(&quot;#searchBtn&quot;).on(&quot;click&quot;, function () {
		// 검색하면 페이지는 무조건 1페이지로 감
		$(&quot;#page&quot;).val(&quot;1&quot;); // 페이지 초기화
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;anboardList&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
})

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;!-- 기존 검색 내용 유지용 --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;form action=&quot;anboardDetail&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; id=&quot;no&quot; name=&quot;no&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; id=&quot;page&quot; name=&quot;page&quot; value=&quot;${page}&quot; /&amp;gt;  &amp;lt;!-- 상세보기 갈때 page 가져갈거임 --&amp;gt;
	&amp;lt;select name=&quot;sortGbn&quot; id=&quot;sortGbn&quot;&amp;gt;
		&amp;lt;option value=&quot;0&quot;&amp;gt;번호순&amp;lt;/option&amp;gt;
		&amp;lt;option value=&quot;1&quot;&amp;gt;제목순&amp;lt;/option&amp;gt;
	&amp;lt;/select&amp;gt;
	&amp;lt;br/&amp;gt;
	&amp;lt;!-- 검색 --&amp;gt;
	&amp;lt;select name=&quot;searchGbn&quot; id=&quot;searchGbn&quot;&amp;gt;
		&amp;lt;option value=&quot;0&quot;&amp;gt;제목&amp;lt;/option&amp;gt;
		&amp;lt;option value=&quot;1&quot;&amp;gt;작성자&amp;lt;/option&amp;gt;
	&amp;lt;/select&amp;gt;
	&amp;lt;input type=&quot;text&quot; name=&quot;searchTxt&quot; id=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt; &amp;lt;!-- 검색어 유지되게, 그래야 페이징할떄도 유지됨 --&amp;gt;
	&amp;lt;input type=&quot;button&quot; value=&quot;검색&quot; id=&quot;searchBtn&quot; /&amp;gt;
	&amp;lt;input type=&quot;button&quot; value=&quot;추가&quot; id=&quot;insertBtn&quot; /&amp;gt;
&amp;lt;/form&amp;gt;

&amp;lt;table&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 var=&quot;data&quot; items=&quot;${list}&quot;&amp;gt;
			&amp;lt;tr no=&quot;${data.NO}&quot;&amp;gt;
				&amp;lt;td&amp;gt;${data.NO}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.TITLE}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.WRITER}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.HIT}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.DT}&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;div id=&quot;pagingWrap&quot;&amp;gt;
&amp;lt;span page=&quot;1&quot;&amp;gt;처음&amp;lt;/span&amp;gt;
&amp;lt;!-- 이전은 현재페이지에서 하나 전, 
지금 1페이지인지 아닌지 먼저 체크 따라서, 현재페이지 필요--&amp;gt;
&amp;lt;!-- 이전페이지 : 현제페이지가 1이면 1로 이동 아니면 현제페이지 -1 --&amp;gt;
&amp;lt;c:choose&amp;gt;
	&amp;lt;c:when test=&quot;${page eq 1}&quot;&amp;gt;
		&amp;lt;span page=&quot;1&quot;&amp;gt;이전&amp;lt;/span&amp;gt;
	&amp;lt;/c:when&amp;gt;
	&amp;lt;c:otherwise&amp;gt;
		&amp;lt;span page=&quot;${page - 1}&quot;&amp;gt;이전&amp;lt;/span&amp;gt;
	&amp;lt;/c:otherwise&amp;gt;
&amp;lt;/c:choose&amp;gt;
&amp;lt;!-- 페이지들 --&amp;gt;
&amp;lt;c:forEach var=&quot;i&quot; begin=&quot;${pd.startP}&quot; end=&quot;${pd.endP}&quot; step=&quot;1&quot;&amp;gt;
	&amp;lt;%-- 현재 페이지의 경우 별도 처리 --%&amp;gt;
	&amp;lt;c:choose&amp;gt;
		&amp;lt;c:when test=&quot;${i eq page}&quot;&amp;gt; &amp;lt;%-- 현재페이지 --%&amp;gt;
			&amp;lt;span page=&quot;${i}&quot;&amp;gt;&amp;lt;b&amp;gt;${i}&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;
		&amp;lt;/c:when&amp;gt;
		&amp;lt;c:otherwise&amp;gt; &amp;lt;%-- 다른페이지 --%&amp;gt;
			&amp;lt;span page=&quot;${i}&quot;&amp;gt;${i}&amp;lt;/span&amp;gt;
		&amp;lt;/c:otherwise&amp;gt;
	&amp;lt;/c:choose&amp;gt;
&amp;lt;/c:forEach&amp;gt;

&amp;lt;!-- 다음페이지 : 마지막에 도달했을때는 증가하지 않고, 다른 경우는 +1 --&amp;gt;
&amp;lt;c:choose&amp;gt;
	&amp;lt;c:when test=&quot;${page eq pd.maxP}&quot;&amp;gt;
		&amp;lt;span page=&quot;${pd.maxP}&quot;&amp;gt;다음&amp;lt;/span&amp;gt;
	&amp;lt;/c:when&amp;gt;
	&amp;lt;c:otherwise&amp;gt;
		&amp;lt;span page=&quot;${page + 1}&quot;&amp;gt;다음&amp;lt;/span&amp;gt;
	&amp;lt;/c:otherwise&amp;gt;
&amp;lt;/c:choose&amp;gt;

&amp;lt;span page=&quot;${pd.maxP}&quot;&amp;gt;마지막&amp;lt;/span&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 data-ke-size=&quot;size16&quot;&gt;anboardRes.jsp (param.gbn 부분 변경됨)&lt;/p&gt;
&lt;pre id=&quot;code_1660209726921&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	
	switch(&quot;${res}&quot;){
	case &quot;success&quot; : 
		if(&quot;${param.gbn}&quot; == &quot;u&quot;){ // 수정이 성공했을 떄
			$(&quot;#goForm&quot;).submit();
		} else { // 등록, 삭제가 성공했을 떄
			location.href = &quot;anboardList&quot; 
		}
		break;
	case &quot;failed&quot; : 
		alert(&quot;작업에 실패하였습니다.&quot;);
		history.back();
		break;
	case &quot;error&quot; : 
		alert(&quot;작업중 문제가 발생 하였습니다.&quot;);
		history.back();
		break;
	}
});
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;anboardDetail&quot; id=&quot;goForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${param.no}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
		&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;sortTxt&quot; value=&quot;${param.sortTxt}&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 data-ke-size=&quot;size16&quot;&gt;anboardUpdate.jsp (CKEDITOR 사용부분만 변경)&lt;/p&gt;
&lt;pre id=&quot;code_1660209826450&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/ckeditor/ckeditor.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	// 에디터 연결
	// CKEDITOR.replace(아이디, 옵션)
	CKEDITOR.replace(&quot;con&quot;, {
		resize_enabled: false, // resize_enabled : 크기조절기능 활용여부
		language : &quot;ko&quot;, // 사용언어
		enterMode: &quot;2&quot;, // 엔터키처리방법. 2번이면 &amp;lt;br/&amp;gt;
		width : 600, // 숫자일경우 px, 문자열일경우 css크기
		height : 400
	});
	
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		history.back();
	});
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		// CKEditor의 값 취득
		// CKEDITOR.instances[아이디] : CKEditor중 아이디가 같은 것을 찾겠다.
		//.getData() : 작성중인 내용을 취득하겠다.
		$(&quot;#con&quot;).val(CKEDITOR.instances['con'].getData());
		
		
		if($(&quot;#title&quot;).val() == &quot;&quot;){
			alert(&quot;제목을 입력하세요&quot;);
			$(&quot;#title&quot;).focus();
		} else if($(&quot;#writer&quot;).val() == &quot;&quot;){
			alert(&quot;작성자를 입력하세요&quot;);
			$(&quot;#writer&quot;).focus();
		} else if($(&quot;#con&quot;).val() == &quot;&quot;){
			alert(&quot;내용을 입력하세요&quot;);
			$(&quot;#con&quot;).focus();
		} else {
			$(&quot;#actionForm&quot;).submit();
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;!-- 번호는 시퀀스 쓸거기 때문에 받을 필요없음, 보여줄 필요 없음, 저장되야 글번호 보여지지 --&amp;gt;
&amp;lt;!-- select 전달하기 위해  name줘야함 --&amp;gt;
&amp;lt;!-- option value 지정해줘야함! --&amp;gt;
&amp;lt;form action=&quot;anboardRes&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;!-- gbn : 구분, 혹은 flag --&amp;gt;
&amp;lt;!-- 구분: i - insert, u - update, d - delete --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;u&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.NO}&quot;/&amp;gt; &amp;lt;!-- 이 번호만 수정해라라는 조건 달기위해 필요 --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;sortTxt&quot; value=&quot;${param.sortTxt}&quot;/&amp;gt;
제목 
&amp;lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot; value=&quot;${data.TITLE}&quot;/&amp;gt;
&amp;lt;br /&amp;gt;
작성자 
&amp;lt;input type=&quot;text&quot; name=&quot;writer&quot; id=&quot;writer&quot; value=&quot;${data.WRITER}&quot;/&amp;gt;
&amp;lt;br/&amp;gt;
내용 
&amp;lt;textarea name=&quot;con&quot; id=&quot;con&quot;&amp;gt;${data.CON}&amp;lt;/textarea&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;수정&quot; id=&quot;updateBtn&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;뒤로가기&quot; id=&quot;listBtn&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;mem테이블 실습&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;MemController.java&lt;/p&gt;
&lt;pre id=&quot;code_1660209876187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.controller;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.spring.sample.common.service.IPagingService;
import com.spring.sample.web.test.service.ITestService2;

@Controller
public class MemController {
	@Autowired
	public ITestService2 iTestService2;

	@Autowired
	public IPagingService ips; // 페이징 서비스 객체 주입

	// MEM테이블 글 목록
	@RequestMapping(value = &quot;/memList&quot;)
	public ModelAndView memList(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {

		// 현재페이지
		int page = 1;

		// 넘어오는 페이지 셋팅
		if (params.get(&quot;page&quot;) != null &amp;amp;&amp;amp; params.get(&quot;page&quot;) != &quot;&quot;) {
			page = Integer.parseInt(params.get(&quot;page&quot;)); // 받아온 페이지 할당
		}

		// 총 데이터 개수 취득
		int cnt = iTestService2.getMemCnt(params);

		// 페이징 데이터 계산
		// ips.getPagingData(page, maxCount, viewCnt, pageCnt)
		HashMap&amp;lt;String, Integer&amp;gt; pd = ips.getPagingData(page, cnt, 3, 2);

		// 파라미터에 시작, 종료값 추가
		// 한쪽으로 필요 데이터를 몰았다?
		params.put(&quot;start&quot;, Integer.toString(pd.get(&quot;start&quot;)));
		params.put(&quot;end&quot;, Integer.toString(pd.get(&quot;end&quot;)));

		// 데이터 취득
		List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; list = iTestService2.getMemList(params);

		// 목록 데이터
		mav.addObject(&quot;list&quot;, list);
		// 페이징 정보
		mav.addObject(&quot;pd&quot;, pd);
		// 현재 페이지
		mav.addObject(&quot;page&quot;, page);
		mav.setViewName(&quot;test/memList&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/memDetail&quot;)
	public ModelAndView anboardDetail(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {

		if (params.get(&quot;no&quot;) == null || params.get(&quot;no&quot;) == &quot;&quot;) {
			mav.setViewName(&quot;redirect:anboardList&quot;);

		} else {
			HashMap&amp;lt;String, String&amp;gt; data = iTestService2.getMem(params);

			mav.addObject(&quot;data&quot;, data);
			mav.setViewName(&quot;test/memDetail&quot;);
		}

		return mav;
	}

	@RequestMapping(value = &quot;/memInsert&quot;)
	public ModelAndView memInsert(ModelAndView mav) {
		mav.setViewName(&quot;test/memInsert&quot;);
		return mav;
	}

	@RequestMapping(value = &quot;/memRes&quot;)
	public ModelAndView memInsertRes(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {

		try {
			int cnt = 0;

			switch (params.get(&quot;gbn&quot;)) {
			case &quot;i&quot;:
				cnt = iTestService2.insertMem(params);
				break;
			case &quot;u&quot;:
				cnt = iTestService2.updateMem(params);
				break;
			case &quot;d&quot;:
				cnt = iTestService2.deleteMem(params);
				break;
			}

			if (cnt &amp;gt; 0) {
				mav.addObject(&quot;res&quot;, &quot;success&quot;);
			} else {
				mav.addObject(&quot;res&quot;, &quot;failded&quot;);
			}
		} catch (Exception e) {
			e.printStackTrace();
			mav.addObject(&quot;res&quot;, &quot;error&quot;);
		}
		mav.setViewName(&quot;test/memRes&quot;);
		return mav;
	}

	@RequestMapping(value = &quot;/memUpdate&quot;)
	public ModelAndView bookUpdate(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {
		// 기존데이터 조회해와야함

		System.out.println(params.toString());

		HashMap&amp;lt;String, String&amp;gt; data = iTestService2.getMem(params);
		mav.addObject(&quot;data&quot;, data);

		mav.setViewName(&quot;test/memUpdate&quot;);

		return mav;

	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ITestService2.java&lt;/p&gt;
&lt;pre id=&quot;code_1660209907155&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.service;

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

public interface ITestService2 {

	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getMemList(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int getMemCnt(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public HashMap&amp;lt;String, String&amp;gt; getMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int insertMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int updateMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int deleteMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TestService2.java&lt;/p&gt;
&lt;pre id=&quot;code_1660209924018&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.service;

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

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

import com.spring.sample.web.test.dao.ITestDao2;

@Service
public class TestService2 implements ITestService2 {
	@Autowired
	public ITestDao2 iTestDao2;

	@Override
	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getMemList(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao2.getMemList(params);
	}

	@Override
	public int getMemCnt(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao2.getMemCnt(params);
	}

	@Override
	public HashMap&amp;lt;String, String&amp;gt; getMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao2.getMem(params);
	}

	@Override
	public int insertMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao2.insertMem(params);
	}

	@Override
	public int updateMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao2.updateMem(params);
	}

	@Override
	public int deleteMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao2.deleteMem(params);
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ITestDao2.java&lt;/p&gt;
&lt;pre id=&quot;code_1660209945484&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.dao;

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

public interface ITestDao2 {

	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getMemList(HashMap&amp;lt;String, String&amp;gt; params);

	public int getMemCnt(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public HashMap&amp;lt;String, String&amp;gt; getMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int insertMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int updateMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int deleteMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TestDao2.java&lt;/p&gt;
&lt;pre id=&quot;code_1660209963364&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.dao;

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

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class TestDao2 implements ITestDao2 {
	@Autowired
	public SqlSession sqlSession;

	@Override
	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getMemList(HashMap&amp;lt;String, String&amp;gt; params) {
		return sqlSession.selectList(&quot;mem.getMemList&quot;, params);
	}

	@Override
	public int getMemCnt(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectOne(&quot;mem.getMemCnt&quot;, params);
	}

	@Override
	public HashMap&amp;lt;String, String&amp;gt; getMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectOne(&quot;mem.getMem&quot;, params);
	}

	@Override
	public int insertMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.insert(&quot;mem.insertMem&quot;, params);
	}

	@Override
	public int updateMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.update(&quot;mem.updateMem&quot;, params);
	}

	@Override
	public int deleteMem(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.delete(&quot;mem.deleteMem&quot;, params);
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mem_SQLxml&lt;/p&gt;
&lt;pre id=&quot;code_1660209989876&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;!-- namespace : 클래스와 동일, 이 파일의 대표명 --&amp;gt;
&amp;lt;mapper namespace=&quot;mem&quot;&amp;gt;
	&amp;lt;!-- select : 조회 
		id: 구분자, 메소드명과 동일
		resultType : 조회 결과 중 한줄에 대한 자료 형태를 지정
		hashmap: mybatis-config.xml에서 별칭 지정해놔서 줄여쓸수있는거임
		쿼리 삽입시 주의사항: ;이 있는경우 문제가 발생한다. 이유는 해당 쿼리 실행시 자동으로 추가되기 때문
	--&amp;gt;
	&amp;lt;select id=&quot;getMemList&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT S.MEM_NO, S.MEM_ID, S.MEM_NM, S.REG_DT
		FROM (SELECT MEM_NO, MEM_ID, MEM_NM, TO_CHAR(REG_DT,'YYYY-MM-DD') AS REG_DT,
       		  ROW_NUMBER() OVER(ORDER BY REG_DT DESC, MEM_NO DESC) AS RNK
			  FROM MEM
			  WHERE DEL = 1
			&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; &amp;lt;!-- 검색어가 있다면 --&amp;gt;
				&amp;lt;choose&amp;gt;
					&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt; &amp;lt;!-- 품목 --&amp;gt;
						AND MEM_ID LIKE '%' || #{searchTxt} || '%'
					&amp;lt;/when&amp;gt;
					&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt; &amp;lt;!-- 수량 --&amp;gt;
						AND MEM_NM = #{searchTxt}
					&amp;lt;/when&amp;gt;
				&amp;lt;/choose&amp;gt;
			&amp;lt;/if&amp;gt;
             ) S
		WHERE S.RNK BETWEEN #{start} AND #{end}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;!-- 
		parameterType : 실행시 받는 값 
		#{키} : 헤당위치에 문자열로 키에 해당하는 값을 넣어준다
		ex) no에 3이 들어있는 경우
		WHERE SELL_NO = #{no}
		=&amp;gt; WHERE SELL_NO = '3' // 문자열이기 때문에  ' '이 들어감
		parameterType dao받는값, resultType값이 db실행결과
	--&amp;gt;
	&amp;lt;select id=&quot;getMem&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT MEM_NO, MEM_ID, MEM_NM, TO_CHAR(MEM_BIRTH,'YYYY-MM-DD') AS MEM_BIRTH, TO_CHAR(REG_DT,'YYYY-MM-DD') AS REG_DT
		FROM MEM
		WHERE MEM_NO = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;!-- insert는 resultType 이 없음 --&amp;gt;
	&amp;lt;insert id=&quot;insertMem&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO MEM(MEM_NO, MEM_ID, MEM_PW, MEM_NM, MEM_BIRTH)
		VALUES(MEM_SEQ.NEXTVAL, #{memId}, #{memPw}, #{memNm}, #{memBirth})
	&amp;lt;/insert&amp;gt;
	
	
	&amp;lt;update id=&quot;deleteMem&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE MEM SET DEL = 0
		WHERE MEM_NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;update id=&quot;updateMem&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE MEM SET MEM_ID = #{memId},
                MEM_NM = #{memNm},
                MEM_BIRTH = #{memBirth}
       	WHERE MEM_NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;select id=&quot;getMemCnt&quot; parameterType=&quot;hashmap&quot; resultType=&quot;Integer&quot;&amp;gt;
		SELECT COUNT(*) AS CNT 
		FROM MEM
		WHERE DEL = 1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; &amp;lt;!-- 검색어가 있다면 --&amp;gt;
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt; &amp;lt;!-- 품목 --&amp;gt;
					AND MEM_ID LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt; &amp;lt;!-- 수량 --&amp;gt;
					AND MEM_NM = #{searchTxt}
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&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;memList.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660210019365&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;style type=&quot;text/css&quot;&amp;gt;
table{
	border-collapse: collapse;
}

th, td {
	border: 1px solid #000;
	padding: 5px;
}

&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	
	if(&quot;${param.searchGbn}&quot; != &quot;&quot;) { // 검색구분이 넘어오면
		$(&quot;#searchGbn&quot;).val(&quot;${param.searchGbn}&quot;);	
	}
	
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;tr&quot;, function () {
		console.log($(this).attr(&quot;no&quot;));
		$(&quot;#no&quot;).val($(this).attr(&quot;no&quot;));
		
		// 검색 상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;memDetail&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		location.href = &quot;memInsert&quot;;
	});
	
	$(&quot;#pagingWrap&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));
		
		// 검색 상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;memList&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
	
	$(&quot;#searchBtn&quot;).on(&quot;click&quot;, function () {
		// 검색하면 페이지는 무조건 1페이지로 감
		$(&quot;#page&quot;).val(&quot;1&quot;); // 페이지 초기화
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;memList&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
})

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;!-- 기존 검색 내용 유지용 --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;form action=&quot;memDetail&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; id=&quot;no&quot; name=&quot;no&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; id=&quot;page&quot; name=&quot;page&quot; value=&quot;${page}&quot; /&amp;gt;  &amp;lt;!-- 상세보기 갈때 page 가져갈거임 --&amp;gt;
	&amp;lt;br/&amp;gt;
	&amp;lt;!-- 검색 --&amp;gt;
	&amp;lt;select name=&quot;searchGbn&quot; id=&quot;searchGbn&quot;&amp;gt;
		&amp;lt;option value=&quot;0&quot;&amp;gt;아이디&amp;lt;/option&amp;gt;
		&amp;lt;option value=&quot;1&quot;&amp;gt;이름&amp;lt;/option&amp;gt;
	&amp;lt;/select&amp;gt;
	&amp;lt;input type=&quot;text&quot; name=&quot;searchTxt&quot; id=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt; &amp;lt;!-- 검색어 유지되게, 그래야 페이징할떄도 유지됨 --&amp;gt;
	&amp;lt;input type=&quot;button&quot; value=&quot;검색&quot; id=&quot;searchBtn&quot; /&amp;gt;
	&amp;lt;input type=&quot;button&quot; value=&quot;추가&quot; id=&quot;insertBtn&quot; /&amp;gt;
&amp;lt;/form&amp;gt;

&amp;lt;table&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;/tr&amp;gt;
	&amp;lt;/thead&amp;gt;
	&amp;lt;tbody&amp;gt;
		&amp;lt;c:forEach var=&quot;data&quot; items=&quot;${list}&quot;&amp;gt;
			&amp;lt;tr no=&quot;${data.MEM_NO}&quot;&amp;gt;
				&amp;lt;td&amp;gt;${data.MEM_NO}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.MEM_ID}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.MEM_NM}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.REG_DT}&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;div id=&quot;pagingWrap&quot;&amp;gt;
&amp;lt;span page=&quot;1&quot;&amp;gt;처음&amp;lt;/span&amp;gt;
&amp;lt;!-- 이전은 현재페이지에서 하나 전, 
지금 1페이지인지 아닌지 먼저 체크 따라서, 현재페이지 필요--&amp;gt;
&amp;lt;!-- 이전페이지 : 현제페이지가 1이면 1로 이동 아니면 현제페이지 -1 --&amp;gt;
&amp;lt;c:choose&amp;gt;
	&amp;lt;c:when test=&quot;${page eq 1}&quot;&amp;gt;
		&amp;lt;span page=&quot;1&quot;&amp;gt;이전&amp;lt;/span&amp;gt;
	&amp;lt;/c:when&amp;gt;
	&amp;lt;c:otherwise&amp;gt;
		&amp;lt;span page=&quot;${page - 1}&quot;&amp;gt;이전&amp;lt;/span&amp;gt;
	&amp;lt;/c:otherwise&amp;gt;
&amp;lt;/c:choose&amp;gt;
&amp;lt;!-- 페이지들 --&amp;gt;
&amp;lt;c:forEach var=&quot;i&quot; begin=&quot;${pd.startP}&quot; end=&quot;${pd.endP}&quot; step=&quot;1&quot;&amp;gt;
	&amp;lt;%-- 현재 페이지의 경우 별도 처리 --%&amp;gt;
	&amp;lt;c:choose&amp;gt;
		&amp;lt;c:when test=&quot;${i eq page}&quot;&amp;gt; &amp;lt;%-- 현재페이지 --%&amp;gt;
			&amp;lt;span page=&quot;${i}&quot;&amp;gt;&amp;lt;b&amp;gt;${i}&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;
		&amp;lt;/c:when&amp;gt;
		&amp;lt;c:otherwise&amp;gt; &amp;lt;%-- 다른페이지 --%&amp;gt;
			&amp;lt;span page=&quot;${i}&quot;&amp;gt;${i}&amp;lt;/span&amp;gt;
		&amp;lt;/c:otherwise&amp;gt;
	&amp;lt;/c:choose&amp;gt;
&amp;lt;/c:forEach&amp;gt;

&amp;lt;!-- 다음페이지 : 마지막에 도달했을때는 증가하지 않고, 다른 경우는 +1 --&amp;gt;
&amp;lt;c:choose&amp;gt;
	&amp;lt;c:when test=&quot;${page eq pd.maxP}&quot;&amp;gt;
		&amp;lt;span page=&quot;${pd.maxP}&quot;&amp;gt;다음&amp;lt;/span&amp;gt;
	&amp;lt;/c:when&amp;gt;
	&amp;lt;c:otherwise&amp;gt;
		&amp;lt;span page=&quot;${page + 1}&quot;&amp;gt;다음&amp;lt;/span&amp;gt;
	&amp;lt;/c:otherwise&amp;gt;
&amp;lt;/c:choose&amp;gt;

&amp;lt;span page=&quot;${pd.maxP}&quot;&amp;gt;마지막&amp;lt;/span&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 data-ke-size=&quot;size16&quot;&gt;memDetail.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660210036685&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function() {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;memList&quot;); 
		$(&quot;#actionForm&quot;).submit();
	});
	
	$(&quot;#deleteBtn&quot;).on(&quot;click&quot;, function () {
		if(confirm(&quot;삭제하시곘습니까?&quot;)){
			$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;memRes&quot;); 
			$(&quot;#actionForm&quot;).submit();
		}
	})
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;memUpdate&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;d&quot;&amp;gt; &amp;lt;!-- selRes는 gbn을 받게 되어있어서 값을 추가해줘야함 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.MEM_NO}&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
		&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;	
번호: ${data.MEM_NO}&amp;lt;br/&amp;gt;
아이디: ${data.MEM_ID}&amp;lt;br/&amp;gt;
이름: ${data.MEM_NM}&amp;lt;br/&amp;gt;
생년월일: ${data.MEM_BIRTH}&amp;lt;br/&amp;gt;
등록일: ${data.REG_DT}&amp;lt;br/&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;수정&quot; id=&quot;updateBtn&quot; /&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;삭제&quot; id=&quot;deleteBtn&quot; /&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;목록&quot; id=&quot;listBtn&quot; /&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;memInsert.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660210061502&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- CKEditor --&amp;gt;
&amp;lt;!-- 제이쿼리 뒤에 나와야함, 제이쿼리 기반으로 동작하기 때문에 --&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/ckeditor/ckeditor.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#backForm&quot;).submit();
	});
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
	
		// $.trim(값) : 값 앞 뒤 공백제거	
		if($.trim($(&quot;#memId&quot;).val()) == &quot;&quot;){
			alert(&quot;아이디 입력하세요&quot;);
			$(&quot;#memId&quot;).focus();
		} else if($.trim($(&quot;#memPw&quot;).val()) == &quot;&quot;){
			alert(&quot;비밀번호를 입력하세요&quot;);
			$(&quot;#memPw&quot;).focus();
		}  else if($.trim($(&quot;#memNm&quot;).val()) == &quot;&quot;){
			alert(&quot;이름을 입력하세요&quot;);
			$(&quot;#memNm&quot;).focus();
		} else if($.trim($(&quot;#memBirth&quot;).val()) == &quot;&quot;){
			alert(&quot;생년월일을 입력하세요&quot;);
			$(&quot;#memBirth&quot;).focus();
		} else {
			$(&quot;#actionForm&quot;).submit();
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;memList&quot; id=&quot;backForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;form action=&quot;memRes&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;!-- gbn : 구분, 혹은 flag
구분: i - insert, u - update, d - delete --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;i&quot;/&amp;gt;
아이디 
&amp;lt;input type=&quot;text&quot; name=&quot;memId&quot; id=&quot;memId&quot; /&amp;gt;
&amp;lt;br /&amp;gt;
비밀번호 
&amp;lt;input type=&quot;password&quot; name=&quot;memPw&quot; id=&quot;memPw&quot; /&amp;gt;
&amp;lt;br /&amp;gt;
이름
&amp;lt;input type=&quot;text&quot; name=&quot;memNm&quot; id=&quot;memNm&quot; /&amp;gt;
&amp;lt;br/&amp;gt;
생년월일
&amp;lt;input type=&quot;date&quot; name=&quot;memBirth&quot; id=&quot;memBirth&quot; /&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;/form&amp;gt;  
&amp;lt;input type=&quot;button&quot; value=&quot;등록&quot; id=&quot;insertBtn&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;목록&quot; id=&quot;listBtn&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;memRes.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660210076870&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	
	switch(&quot;${res}&quot;){
	case &quot;success&quot; : 
		if(&quot;${param.gbn}&quot; == &quot;u&quot;){ 
			$(&quot;#goForm&quot;).submit();
		} else {
			location.href = &quot;memList&quot; 
		}
		break;
	case &quot;failed&quot; : 
		alert(&quot;작업에 실패하였습니다.&quot;);
		history.back();
		break;
	case &quot;error&quot; : 
		alert(&quot;작업중 문제가 발생 하였습니다.&quot;);
		history.back();
		break;
	}
});
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;memDetail&quot; id=&quot;goForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${param.no}&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 data-ke-size=&quot;size16&quot;&gt;memUpdate.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660210102333&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		history.back();
	});
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {

		// $.trim(값) : 값 앞 뒤 공백제거	
		if($.trim($(&quot;#memId&quot;).val()) == &quot;&quot;){
			alert(&quot;아이디 입력하세요&quot;);
			$(&quot;#memId&quot;).focus();
		}  else if($.trim($(&quot;#memNm&quot;).val()) == &quot;&quot;){
			alert(&quot;이름을 입력하세요&quot;);
			$(&quot;#memNm&quot;).focus();
		} else if($.trim($(&quot;#memBirth&quot;).val()) == &quot;&quot;){
			alert(&quot;생년월일을 입력하세요&quot;);
			$(&quot;#memBirth&quot;).focus();
		} else {
			$(&quot;#actionForm&quot;).submit();
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;memRes&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;u&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.MEM_NO}&quot;/&amp;gt; 
아이디 
&amp;lt;input type=&quot;text&quot; name=&quot;memId&quot; id=&quot;memId&quot; value=&quot;${data.MEM_ID}&quot;/&amp;gt;
&amp;lt;br /&amp;gt;
이름
&amp;lt;input type=&quot;text&quot; name=&quot;memNm&quot; id=&quot;memNm&quot;  value=&quot;${data.MEM_NM}&quot;/&amp;gt;
&amp;lt;br/&amp;gt;
생년월일
&amp;lt;input type=&quot;date&quot; name=&quot;memBirth&quot; id=&quot;memBirth&quot; value=&quot;${data.MEM_BIRTH}&quot;/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;수정&quot; id=&quot;updateBtn&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;뒤로가기&quot; id=&quot;listBtn&quot;&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>TIL/academy</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/121</guid>
      <comments>https://makeaplayground.tistory.com/121#entry121comment</comments>
      <pubDate>Thu, 11 Aug 2022 18:30:50 +0900</pubDate>
    </item>
    <item>
      <title>국비 TIL(Today I Learned) 20220810 검색하기, sell, manager, anboard테이블</title>
      <link>https://makeaplayground.tistory.com/118</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;어제 한거 복습&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deL88O/btrJil8SA1l/MNw6p0r9ezJLkINYS9bx4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deL88O/btrJil8SA1l/MNw6p0r9ezJLkINYS9bx4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deL88O/btrJil8SA1l/MNw6p0r9ezJLkINYS9bx4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeL88O%2FbtrJil8SA1l%2FMNw6p0r9ezJLkINYS9bx4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;653&quot; height=&quot;603&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;666&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;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEcF35/btrJlVA9vJn/mbiTOmnT2u6lN0n2LGtIR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEcF35/btrJlVA9vJn/mbiTOmnT2u6lN0n2LGtIR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEcF35/btrJlVA9vJn/mbiTOmnT2u6lN0n2LGtIR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEcF35%2FbtrJlVA9vJn%2FmbiTOmnT2u6lN0n2LGtIR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;162&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;162&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;마리아DB&lt;span&gt;&amp;nbsp;&lt;/span&gt;limit쓰면 행 갯수 제한할수도 있음&lt;/p&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYa7pR/btrJlocK9AS/l0ZxlBgwtrtcgCXjogWWmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYa7pR/btrJlocK9AS/l0ZxlBgwtrtcgCXjogWWmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYa7pR/btrJlocK9AS/l0ZxlBgwtrtcgCXjogWWmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYa7pR%2FbtrJlocK9AS%2Fl0ZxlBgwtrtcgCXjogWWmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1086&quot; height=&quot;610&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;610&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;검색 구현&lt;/b&gt;&lt;i&gt;&lt;b&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sellList.jsp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1Unlg/btrJlocLU3c/dCsntJJquimXjcmr7qklC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1Unlg/btrJlocLU3c/dCsntJJquimXjcmr7qklC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1Unlg/btrJlocLU3c/dCsntJJquimXjcmr7qklC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1Unlg%2FbtrJlocLU3c%2FdCsntJJquimXjcmr7qklC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;964&quot; height=&quot;490&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;params에는 4개가 들어있음 no, page, searchGbn, searchTxt&lt;/p&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;Dynamic Query(동적 쿼리) : 조건에 따라 쿼리의 형태가 변경되는 쿼리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 태그로 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iBatis와 MyBatis의 경우 기능은 유사하나 이름과 형태가 다소 틀림(우리는 지금 MyBatis 쓰고 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iBatis가 좀더 직관적이래, &lt;span style=&quot;background-color: #f3c000; color: #ffffff;&quot;&gt;&lt;i&gt;MyBatis의 경우 코어태그와 형태가 동일&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;el태그가 없어 c가 없음&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cj8BWN/btrJk2HQAH9/IykNp4fGNbmO7fGH9wKTb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cj8BWN/btrJk2HQAH9/IykNp4fGNbmO7fGH9wKTb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cj8BWN/btrJk2HQAH9/IykNp4fGNbmO7fGH9wKTb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcj8BWN%2FbtrJk2HQAH9%2FIykNp4fGNbmO7fGH9wKTb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;331&quot; height=&quot;181&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;181&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;getSellCnt, getSellList 두군데에 쿼리 변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vPwCi/btrJilHWUbu/pXrP9GDfKukOLlreIUTka1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vPwCi/btrJilHWUbu/pXrP9GDfKukOLlreIUTka1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vPwCi/btrJilHWUbu/pXrP9GDfKukOLlreIUTka1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvPwCi%2FbtrJilHWUbu%2FpXrP9GDfKukOLlreIUTka1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;754&quot; height=&quot;349&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dm0mZF/btrJpfFsrW9/2LWMJxTY28IpCFxk8Cxs40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dm0mZF/btrJpfFsrW9/2LWMJxTY28IpCFxk8Cxs40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dm0mZF/btrJpfFsrW9/2LWMJxTY28IpCFxk8Cxs40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdm0mZF%2FbtrJpfFsrW9%2F2LWMJxTY28IpCFxk8Cxs40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;756&quot; height=&quot;378&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;378&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;WHERE 1=1 대신 상시 조건을 WHERE구문에 넣어주면 돼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 이제 삭제를 실제 삭제 안하고, 업데이트로 한다음 삭제 안된 데이터들만 보여주걸래 화면에는(DB에는 삭제한 데이터도 있고) 그럴때 삭제 안된 데이터들만 보여주는 조건을 &lt;span&gt;WHERE 1=1&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;sellList.jsp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A1jBH/btrJn6vOPrH/c8MpkYFZCXLaSyO7k7JWo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A1jBH/btrJn6vOPrH/c8MpkYFZCXLaSyO7k7JWo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A1jBH/btrJn6vOPrH/c8MpkYFZCXLaSyO7k7JWo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA1jBH%2FbtrJn6vOPrH%2Fc8MpkYFZCXLaSyO7k7JWo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;638&quot; height=&quot;834&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;834&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZiK9Q/btrJlpi5sey/cJHXdeXnQIkfW4KPkmNuvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZiK9Q/btrJlpi5sey/cJHXdeXnQIkfW4KPkmNuvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZiK9Q/btrJlpi5sey/cJHXdeXnQIkfW4KPkmNuvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZiK9Q%2FbtrJlpi5sey%2FcJHXdeXnQIkfW4KPkmNuvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1129&quot; height=&quot;325&quot; data-origin-width=&quot;1129&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sellDetail.jsp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q28BY/btrJlWOhpbq/dPfDQBKUta0eenJsaDeC5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q28BY/btrJlWOhpbq/dPfDQBKUta0eenJsaDeC5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q28BY/btrJlWOhpbq/dPfDQBKUta0eenJsaDeC5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq28BY%2FbtrJlWOhpbq%2FdPfDQBKUta0eenJsaDeC5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;828&quot; height=&quot;394&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;394&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;sellUpdate.jsp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wMwHW/btrJpfswCdC/tMFrijCtkXUT0ZvJMP8B20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wMwHW/btrJpfswCdC/tMFrijCtkXUT0ZvJMP8B20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wMwHW/btrJpfswCdC/tMFrijCtkXUT0ZvJMP8B20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwMwHW%2FbtrJpfswCdC%2FtMFrijCtkXUT0ZvJMP8B20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;421&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;421&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;sellRes.jsp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/07JjK/btrJp0PbeUs/s2MQUkKK1SXoSraklIh1JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/07JjK/btrJp0PbeUs/s2MQUkKK1SXoSraklIh1JK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/07JjK/btrJp0PbeUs/s2MQUkKK1SXoSraklIh1JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F07JjK%2FbtrJp0PbeUs%2Fs2MQUkKK1SXoSraklIh1JK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;834&quot; height=&quot;176&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Res부분&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ebnU6R/btrJn6o80VH/RzvzhUCQBleotnTDtSqNiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ebnU6R/btrJn6o80VH/RzvzhUCQBleotnTDtSqNiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ebnU6R/btrJn6o80VH/RzvzhUCQBleotnTDtSqNiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FebnU6R%2FbtrJn6o80VH%2FRzvzhUCQBleotnTDtSqNiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;703&quot; height=&quot;86&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;86&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;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTos1F/btrJmvXcXbT/PXzcWnec2h5cU9ke1MooS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTos1F/btrJmvXcXbT/PXzcWnec2h5cU9ke1MooS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTos1F/btrJmvXcXbT/PXzcWnec2h5cU9ke1MooS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdTos1F%2FbtrJmvXcXbT%2FPXzcWnec2h5cU9ke1MooS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;365&quot; height=&quot;209&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;209&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1055&quot; data-origin-height=&quot;605&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLymKX/btrJlWAcNr3/bFskDVnILXCOE6sSOUNBG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLymKX/btrJlWAcNr3/bFskDVnILXCOE6sSOUNBG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLymKX/btrJlWAcNr3/bFskDVnILXCOE6sSOUNBG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLymKX%2FbtrJlWAcNr3%2FbFskDVnILXCOE6sSOUNBG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1055&quot; height=&quot;605&quot; data-origin-width=&quot;1055&quot; data-origin-height=&quot;605&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;오늘은 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;manager테이블 실습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;managerList.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660198849085&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;style type=&quot;text/css&quot;&amp;gt;
table{
	border-collapse: collapse;
}

th, td {
	border: 1px solid #000;
	padding: 5px;
}

#pagingWrap span{
	cursor: pointer;
}

&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	if(&quot;${param.searchGbn}&quot; != &quot;&quot;) { // 검색구분이 넘어오면
		$(&quot;#searchGbn&quot;).val(&quot;${param.searchGbn}&quot;);	
	}
	
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;tr&quot;, function () {
		console.log($(this).attr(&quot;no&quot;));
		$(&quot;#no&quot;).val($(this).attr(&quot;no&quot;));
		
		// 검색 상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;managerDetail&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		location.href = &quot;managerInsert&quot;;
	});
	
	$(&quot;#pagingWrap&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));
		
		// 검색 상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;managerList&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
	

	$(&quot;#searchBtn&quot;).on(&quot;click&quot;, function () {
		// 검색하면 페이지는 무조건 1페이지로 감
		$(&quot;#page&quot;).val(&quot;1&quot;); // 페이지 초기화
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;managerList&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	
})

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;!-- 기존 검색 내용 유지용 --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; id=&quot;no&quot; name=&quot;no&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; id=&quot;page&quot; name=&quot;page&quot; value=&quot;${page}&quot; /&amp;gt;
	&amp;lt;select name=&quot;searchGbn&quot; id=&quot;searchGbn&quot;&amp;gt;
		&amp;lt;option value=&quot;0&quot;&amp;gt;이름&amp;lt;/option&amp;gt;
		&amp;lt;option value=&quot;1&quot;&amp;gt;부서&amp;lt;/option&amp;gt;
	&amp;lt;/select&amp;gt;
	&amp;lt;input type=&quot;text&quot; name=&quot;searchTxt&quot; id=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt; &amp;lt;!-- 검색어 유지되게, 그래야 페이징할떄도 유지됨 --&amp;gt;
	&amp;lt;input type=&quot;button&quot; value=&quot;검색&quot; id=&quot;searchBtn&quot; /&amp;gt;
	&amp;lt;input type=&quot;button&quot; value=&quot;추가&quot; id=&quot;insertBtn&quot; /&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;table&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;/tr&amp;gt;
	&amp;lt;/thead&amp;gt;
	&amp;lt;tbody&amp;gt;
		&amp;lt;c:forEach var=&quot;data&quot; items=&quot;${list}&quot;&amp;gt;
			&amp;lt;tr no=&quot;${data.EMP_NO}&quot;&amp;gt;
				&amp;lt;td&amp;gt;${data.EMP_NO}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.NAME}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.DEPT}&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;div id=&quot;pagingWrap&quot;&amp;gt;
&amp;lt;span page=&quot;1&quot;&amp;gt;처음&amp;lt;/span&amp;gt;
&amp;lt;!-- 이전은 현재페이지에서 하나 전, 
지금 1페이지인지 아닌지 먼저 체크 따라서, 현재페이지 필요--&amp;gt;
&amp;lt;!-- 이전페이지 : 현제페이지가 1이면 1로 이동 아니면 현제페이지 -1 --&amp;gt;
&amp;lt;c:choose&amp;gt;
	&amp;lt;c:when test=&quot;${page eq 1}&quot;&amp;gt;
		&amp;lt;span page=&quot;1&quot;&amp;gt;이전&amp;lt;/span&amp;gt;
	&amp;lt;/c:when&amp;gt;
	&amp;lt;c:otherwise&amp;gt;
		&amp;lt;span page=&quot;${page - 1}&quot;&amp;gt;이전&amp;lt;/span&amp;gt;
	&amp;lt;/c:otherwise&amp;gt;
&amp;lt;/c:choose&amp;gt;
&amp;lt;!-- 페이지들 --&amp;gt;
&amp;lt;c:forEach var=&quot;i&quot; begin=&quot;${pd.startP}&quot; end=&quot;${pd.endP}&quot; step=&quot;1&quot;&amp;gt;
	&amp;lt;%-- 현재 페이지의 경우 별도 처리 --%&amp;gt;
	&amp;lt;c:choose&amp;gt;
		&amp;lt;c:when test=&quot;${i eq page}&quot;&amp;gt; &amp;lt;%-- 현재페이지 --%&amp;gt;
			&amp;lt;span page=&quot;${i}&quot;&amp;gt;&amp;lt;b&amp;gt;${i}&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;
		&amp;lt;/c:when&amp;gt;
		&amp;lt;c:otherwise&amp;gt; &amp;lt;%-- 다른페이지 --%&amp;gt;
			&amp;lt;span page=&quot;${i}&quot;&amp;gt;${i}&amp;lt;/span&amp;gt;
		&amp;lt;/c:otherwise&amp;gt;
	&amp;lt;/c:choose&amp;gt;
&amp;lt;/c:forEach&amp;gt;

&amp;lt;!-- 다음페이지 : 마지막에 도달했을때는 증가하지 않고, 다른 경우는 +1 --&amp;gt;
&amp;lt;c:choose&amp;gt;
	&amp;lt;c:when test=&quot;${page eq pd.maxP}&quot;&amp;gt;
		&amp;lt;span page=&quot;${pd.maxP}&quot;&amp;gt;다음&amp;lt;/span&amp;gt;
	&amp;lt;/c:when&amp;gt;
	&amp;lt;c:otherwise&amp;gt;
		&amp;lt;span page=&quot;${page + 1}&quot;&amp;gt;다음&amp;lt;/span&amp;gt;
	&amp;lt;/c:otherwise&amp;gt;
&amp;lt;/c:choose&amp;gt;

&amp;lt;span page=&quot;${pd.maxP}&quot;&amp;gt;마지막&amp;lt;/span&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Test_SQL.xml&lt;/p&gt;
&lt;pre id=&quot;code_1660198939277&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;!-- namespace : 클래스와 동일, 이 파일의 대표명 --&amp;gt;
&amp;lt;mapper namespace=&quot;test&quot;&amp;gt;
	
	&amp;lt;select id=&quot;getManagerList&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT S.EMP_NO, S.NAME, S.DEPT
		FROM(SELECT EMP_NO, NAME, DEPT,
		ROW_NUMBER() OVER(ORDER BY EMP_NO DESC) AS RNK
		FROM MANAGER
		WHERE 1 =1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; 
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt;
					AND NAME LIKE '%' || #{searchTxt}|| '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt;
					AND DEPT LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;
		) S
		WHERE S.RNK BETWEEN #{start} AND #{end}
	&amp;lt;/select&amp;gt;

	&amp;lt;select id=&quot;getManager&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT EMP_NO, NAME, DEPT
		FROM MANAGER
		WHERE EMP_NO = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;insertManager&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO MANAGER(EMP_NO, NAME, DEPT)
		VALUES(MANAGER_SEQ.NEXTVAL, #{name}, #{deptName})
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;delete id=&quot;deleteManager&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		DELETE FROM MANAGER
		WHERE EMP_NO = #{no}
	&amp;lt;/delete&amp;gt;
	
	&amp;lt;update id=&quot;updateManager&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE MANAGER SET NAME = #{name},
                DEPT = #{deptName}
                WHERE EMP_NO = #{no}
	&amp;lt;/update&amp;gt;
	
	
	&amp;lt;select id=&quot;getManagerCnt&quot; parameterType=&quot;hashmap&quot; resultType=&quot;Integer&quot;&amp;gt;
		SELECT COUNT(*) AS CNT 
		FROM MANAGER
		WHERE 1 =1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; 
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt;
					AND NAME LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt;
					AND DEPT LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&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;managerDetail, managerUpdate, managerRes&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;!--&amp;nbsp;전&amp;nbsp;화면에서&amp;nbsp;넘어온&amp;nbsp;검색&amp;nbsp;정보&amp;nbsp;--&amp;gt; &lt;br /&gt;&amp;lt;input&amp;nbsp;type=&quot;hidden&quot;&amp;nbsp;name=&quot;searchGbn&quot;&amp;nbsp;value=&quot;${param.searchGbn}&quot;/&amp;gt; &lt;br /&gt;&amp;lt;input&amp;nbsp;type=&quot;hidden&quot;&amp;nbsp;name=&quot;searchTxt&quot;&amp;nbsp;value=&quot;${param.searchTxt}&quot;/&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czDhlm/btrJrfNN03N/kSvm87kmx5W7nn11nbnfa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czDhlm/btrJrfNN03N/kSvm87kmx5W7nn11nbnfa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czDhlm/btrJrfNN03N/kSvm87kmx5W7nn11nbnfa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczDhlm%2FbtrJrfNN03N%2FkSvm87kmx5W7nn11nbnfa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;654&quot; height=&quot;153&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;153&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;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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QeCBp/btrJo1uoT64/YK99KrCiW2vMk3yX6vqOh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QeCBp/btrJo1uoT64/YK99KrCiW2vMk3yX6vqOh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QeCBp/btrJo1uoT64/YK99KrCiW2vMk3yX6vqOh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQeCBp%2FbtrJo1uoT64%2FYK99KrCiW2vMk3yX6vqOh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;784&quot; height=&quot;591&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;591&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;시퀀스 이름: ANBOARD_SEQ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAOiHj/btrJmrAoXGF/gHOQe4VuAVjwQwr9vIxiVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAOiHj/btrJmrAoXGF/gHOQe4VuAVjwQwr9vIxiVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAOiHj/btrJmrAoXGF/gHOQe4VuAVjwQwr9vIxiVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAOiHj%2FbtrJmrAoXGF%2FgHOQe4VuAVjwQwr9vIxiVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;388&quot; height=&quot;394&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;394&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;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;sellList.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660121105245&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;style type=&quot;text/css&quot;&amp;gt;
table{
	border-collapse: collapse;
}

th, td {
	border: 1px solid #000;
	padding: 5px;
}

#pagingWrap span{
	cursor: pointer;
}

&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	
	if(&quot;${param.searchGbn}&quot; != &quot;&quot;) { // 검색구분이 넘어오면
		$(&quot;#searchGbn&quot;).val(&quot;${param.searchGbn}&quot;);	
	}
	
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;tr&quot;, function () {
		console.log($(this).attr(&quot;no&quot;));
		$(&quot;#no&quot;).val($(this).attr(&quot;no&quot;));
		
		// 검색 상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;sellDetail&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		location.href = &quot;sellInsert&quot;;
	});
	
	
	$(&quot;#pagingWrap&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));
		
		// 검색 상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;sellList&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
	
	$(&quot;#searchBtn&quot;).on(&quot;click&quot;, function () {
		// 검색하면 페이지는 무조건 1페이지로 감
		$(&quot;#page&quot;).val(&quot;1&quot;); // 페이지 초기화
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;sellList&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;!-- 기존 검색 내용 유지용 --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; id=&quot;no&quot; name=&quot;no&quot; /&amp;gt; 
	&amp;lt;input type=&quot;hidden&quot; id=&quot;page&quot; name=&quot;page&quot; value=&quot;${page}&quot; /&amp;gt;  &amp;lt;!-- 상세보기 갈때 page 가져갈거임 --&amp;gt;
	&amp;lt;select name=&quot;searchGbn&quot; id=&quot;searchGbn&quot;&amp;gt;
		&amp;lt;option value=&quot;0&quot;&amp;gt;품목&amp;lt;/option&amp;gt;
		&amp;lt;option value=&quot;1&quot;&amp;gt;수량&amp;lt;/option&amp;gt;
	&amp;lt;/select&amp;gt;
	&amp;lt;input type=&quot;text&quot; name=&quot;searchTxt&quot; id=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt; &amp;lt;!-- 검색어 유지되게, 그래야 페이징할떄도 유지됨 --&amp;gt;
	&amp;lt;input type=&quot;button&quot; value=&quot;검색&quot; id=&quot;searchBtn&quot; /&amp;gt;
	&amp;lt;input type=&quot;button&quot; value=&quot;추가&quot; id=&quot;insertBtn&quot; /&amp;gt;
&amp;lt;/form&amp;gt;

&amp;lt;br /&amp;gt;
&amp;lt;table&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;/tr&amp;gt;
	&amp;lt;/thead&amp;gt;
	&amp;lt;tbody&amp;gt;
		&amp;lt;c:forEach var=&quot;data&quot; items=&quot;${list}&quot;&amp;gt;
			&amp;lt;tr no=&quot;${data.SELL_NO}&quot;&amp;gt;
				&amp;lt;td&amp;gt;${data.SELL_NO}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.ITEM_NAME}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.COUNT}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.SELL_DT}&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;div id=&quot;pagingWrap&quot;&amp;gt;
&amp;lt;span page=&quot;1&quot;&amp;gt;처음&amp;lt;/span&amp;gt;
&amp;lt;!-- 이전은 현재페이지에서 하나 전, 
지금 1페이지인지 아닌지 먼저 체크 따라서, 현재페이지 필요--&amp;gt;
&amp;lt;!-- 이전페이지 : 현제페이지가 1이면 1로 이동 아니면 현제페이지 -1 --&amp;gt;
&amp;lt;c:choose&amp;gt;
	&amp;lt;c:when test=&quot;${page eq 1}&quot;&amp;gt;
		&amp;lt;span page=&quot;1&quot;&amp;gt;이전&amp;lt;/span&amp;gt;
	&amp;lt;/c:when&amp;gt;
	&amp;lt;c:otherwise&amp;gt;
		&amp;lt;span page=&quot;${page - 1}&quot;&amp;gt;이전&amp;lt;/span&amp;gt;
	&amp;lt;/c:otherwise&amp;gt;
&amp;lt;/c:choose&amp;gt;
&amp;lt;!-- 페이지들 --&amp;gt;
&amp;lt;c:forEach var=&quot;i&quot; begin=&quot;${pd.startP}&quot; end=&quot;${pd.endP}&quot; step=&quot;1&quot;&amp;gt;
	&amp;lt;%-- 현재 페이지의 경우 별도 처리 --%&amp;gt;
	&amp;lt;c:choose&amp;gt;
		&amp;lt;c:when test=&quot;${i eq page}&quot;&amp;gt; &amp;lt;%-- 현재페이지 --%&amp;gt;
			&amp;lt;span page=&quot;${i}&quot;&amp;gt;&amp;lt;b&amp;gt;${i}&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;
		&amp;lt;/c:when&amp;gt;
		&amp;lt;c:otherwise&amp;gt; &amp;lt;%-- 다른페이지 --%&amp;gt;
			&amp;lt;span page=&quot;${i}&quot;&amp;gt;${i}&amp;lt;/span&amp;gt;
		&amp;lt;/c:otherwise&amp;gt;
	&amp;lt;/c:choose&amp;gt;
&amp;lt;/c:forEach&amp;gt;

&amp;lt;!-- 다음페이지 : 마지막에 도달했을때는 증가하지 않고, 다른 경우는 +1 --&amp;gt;
&amp;lt;c:choose&amp;gt;
	&amp;lt;c:when test=&quot;${page eq pd.maxP}&quot;&amp;gt;
		&amp;lt;span page=&quot;${pd.maxP}&quot;&amp;gt;다음&amp;lt;/span&amp;gt;
	&amp;lt;/c:when&amp;gt;
	&amp;lt;c:otherwise&amp;gt;
		&amp;lt;span page=&quot;${page + 1}&quot;&amp;gt;다음&amp;lt;/span&amp;gt;
	&amp;lt;/c:otherwise&amp;gt;
&amp;lt;/c:choose&amp;gt;

&amp;lt;span page=&quot;${pd.maxP}&quot;&amp;gt;마지막&amp;lt;/span&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sellDetail.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660121142045&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;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function() {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;sellList&quot;); 
		$(&quot;#actionForm&quot;).submit();
	});
	
	$(&quot;#deleteBtn&quot;).on(&quot;click&quot;, function () {
		if(confirm(&quot;삭제하시곘습니까?&quot;)){
			$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;sellRes&quot;); 
			$(&quot;#actionForm&quot;).submit();
		}
	})
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;sellUpdate&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;!-- form action에서 #은 아무런 이동을 하지 않는다. --&amp;gt;
&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;!-- 상세보기에서는 삭제만 쓸거니 d를 박아줘도 됨, 수정이면 수정페이지로 이동할거니 --&amp;gt;
&amp;lt;!-- 이 페이지에서 수정도 같이하면 value에 값 비어두기 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;d&quot; /&amp;gt; &amp;lt;!-- selRes는 gbn을 받게 되어있어서 값을 추가해줘야함 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.SELL_NO}&quot; /&amp;gt; &amp;lt;!-- 삭제하기위해  번호 보내주기 --&amp;gt;
	 &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt;
	&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;	
	판매번호: ${data.SELL_NO}&amp;lt;br/&amp;gt;
	품목: ${data.ITEM_NAME}&amp;lt;br/&amp;gt;
	수량: ${data.COUNT}&amp;lt;br/&amp;gt;
	일자: ${data.SELL_DT}&amp;lt;br/&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;수정&quot; id=&quot;updateBtn&quot; /&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;삭제&quot; id=&quot;deleteBtn&quot; /&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;목록&quot; id=&quot;listBtn&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;p data-ke-size=&quot;size16&quot;&gt;sellInsert.jsp(Insert는 변동사항 없음)&lt;/p&gt;
&lt;pre id=&quot;code_1660121253185&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		history.back();
	});
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		if($(&quot;#count&quot;).val() == &quot;&quot;){
			alert(&quot;수량을 입력하세요&quot;);
			$(&quot;#count&quot;).focus();
		} else if($(&quot;#count&quot;).val()*1 &amp;lt; 1){ // 문자열이기 때문에 *1 해줘야 숫자로 바뀜
			alert(&quot;수량은 1개 이상이어야 합니다&quot;);
			$(&quot;#count&quot;).focus();
		}
		else if($(&quot;#sellDt&quot;).val() == &quot;&quot;){
			alert(&quot;일자를 입력하세요&quot;);
			$(&quot;#sellDt&quot;).focus();
		} else {
			$(&quot;#actionForm&quot;).submit();
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;!-- 번호는 시퀀스 쓸거기 때문에 받을 필요없음, 보여줄 필요 없음, 저장되야 글번호 보여지지 --&amp;gt;
&amp;lt;!-- select 전달하기 위해  name줘야함 --&amp;gt;
&amp;lt;!-- option value 지정해줘야함! --&amp;gt;
&amp;lt;form action=&quot;sellRes&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;!-- gbn : 구분, 혹은 flag --&amp;gt;
&amp;lt;!-- 구분: i - insert, u - update, d - delete --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;i&quot;/&amp;gt;
품목명
&amp;lt;select name=&quot;itemName&quot;&amp;gt;
	&amp;lt;option value=&quot;감자&quot;&amp;gt;감자&amp;lt;/option&amp;gt;
	&amp;lt;option value=&quot;고구마&quot;&amp;gt;고구마&amp;lt;/option&amp;gt;
	&amp;lt;option value=&quot;애호박&quot;&amp;gt;애호박&amp;lt;/option&amp;gt;
	&amp;lt;option value=&quot;호박&quot;&amp;gt;호박&amp;lt;/option&amp;gt;
	&amp;lt;option value=&quot;호박고구마&quot;&amp;gt;호박고구마&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;
&amp;lt;br /&amp;gt;
수량 &amp;lt;input type=&quot;number&quot; name=&quot;count&quot; id=&quot;count&quot; value=&quot;0&quot; /&amp;gt;
&amp;lt;br /&amp;gt;
일자 &amp;lt;input type=&quot;date&quot; name=&quot;sellDt&quot; id=&quot;sellDt&quot; /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;등록&quot; id=&quot;insertBtn&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;목록&quot; id=&quot;listBtn&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;p data-ke-size=&quot;size16&quot;&gt;sellRes.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660121276875&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	
	// el tag를 script에서 사용시
	// 해당 위치에 값이 그대로 들어가기 때문에 보편적으로 ''를 달아서 문자열로 인식시킨 뒤 사용
	// ${res}해서  success가 들어올경우, success 이렇게되면 변수로 인식되서 &quot;success&quot; 이렇게 인식되게
	// &quot;${res}&quot;로 써줌
	switch(&quot;${res}&quot;){
	case &quot;success&quot; : 
		if(&quot;${param.gbn}&quot; == &quot;u&quot;){ // 수정이 성공했을 떄
			$(&quot;#goForm&quot;).submit();
		} else { // 등록, 삭제가 성공했을 떄
			location.href = &quot;sellList&quot; 
		}
		break;
	case &quot;failed&quot; : 
		alert(&quot;작업에 실패하였습니다.&quot;);
		history.back();
		break;
	case &quot;error&quot; : 
		alert(&quot;작업중 문제가 발생 하였습니다.&quot;);
		history.back();
		break;
	}
});
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;sellDetail&quot; id=&quot;goForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${param.no}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어오니까 param.no --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
	&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&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 data-ke-size=&quot;size16&quot;&gt;sellUpdate.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660121307569&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	// 기존값으로 셀렉트박스 선택 내용 변경
	$(&quot;#itemName&quot;).val(&quot;${data.ITEM_NAME}&quot;);
	
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		history.back();
	});
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		if($(&quot;#count&quot;).val() == &quot;&quot;){
			alert(&quot;수량을 입력하세요&quot;);
			$(&quot;#count&quot;).focus();
		} else if($(&quot;#count&quot;).val()*1 &amp;lt; 1){ // 문자열이기 때문에 *1 해줘야 숫자로 바뀜
			alert(&quot;수량은 1개 이상이어야 합니다&quot;);
			$(&quot;#count&quot;).focus();
		}
		else if($(&quot;#sellDt&quot;).val() == &quot;&quot;){
			alert(&quot;일자를 입력하세요&quot;);
			$(&quot;#sellDt&quot;).focus();
		} else {
			$(&quot;#actionForm&quot;).submit();
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;!-- 번호는 시퀀스 쓸거기 때문에 받을 필요없음, 보여줄 필요 없음, 저장되야 글번호 보여지지 --&amp;gt;
&amp;lt;!-- select 전달하기 위해  name줘야함 --&amp;gt;
&amp;lt;!-- option value 지정해줘야함! --&amp;gt;
&amp;lt;form action=&quot;sellRes&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;!-- gbn : 구분, 혹은 flag --&amp;gt;
&amp;lt;!-- 구분: i - insert, u - update, d - delete --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;u&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.SELL_NO}&quot;/&amp;gt; &amp;lt;!-- 이 번호만 수정해라라는 조건 달기위해 필요 --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
판매번호 : ${data.SELL_NO}&amp;lt;br/&amp;gt;
품목명
&amp;lt;select name=&quot;itemName&quot; id=&quot;itemName&quot;&amp;gt;
	&amp;lt;option value=&quot;감자&quot;&amp;gt;감자&amp;lt;/option&amp;gt;
	&amp;lt;option value=&quot;고구마&quot;&amp;gt;고구마&amp;lt;/option&amp;gt;
	&amp;lt;option value=&quot;애호박&quot;&amp;gt;애호박&amp;lt;/option&amp;gt;
	&amp;lt;option value=&quot;호박&quot;&amp;gt;호박&amp;lt;/option&amp;gt;
	&amp;lt;option value=&quot;호박고구마&quot;&amp;gt;호박고구마&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;
&amp;lt;br /&amp;gt;
수량 &amp;lt;input type=&quot;number&quot; name=&quot;count&quot; id=&quot;count&quot; value=&quot;${data.COUNT}&quot; /&amp;gt;
&amp;lt;br /&amp;gt;
일자 &amp;lt;input type=&quot;date&quot; name=&quot;sellDt&quot; id=&quot;sellDt&quot; value=&quot;${data.SELL_DT}&quot; /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;수정&quot; id=&quot;updateBtn&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;뒤로가기&quot; id=&quot;listBtn&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;Text_SQL.xml&lt;/p&gt;
&lt;pre id=&quot;code_1660121351155&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;!-- namespace : 클래스와 동일, 이 파일의 대표명 --&amp;gt;
&amp;lt;mapper namespace=&quot;test&quot;&amp;gt;
	&amp;lt;!-- select : 조회 
		id: 구분자, 메소드명과 동일
		resultType : 조회 결과 중 한줄에 대한 자료 형태를 지정
		hashmap: mybatis-config.xml에서 별칭 지정해놔서 줄여쓸수있는거임
		쿼리 삽입시 주의사항: ;이 있는경우 문제가 발생한다. 이유는 해당 쿼리 실행시 자동으로 추가되기 때문
	--&amp;gt;
	&amp;lt;select id=&quot;getSellList&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT S.SELL_NO, S.ITEM_NAME, S.COUNT, S.SELL_DT
		FROM (SELECT SELL_NO, ITEM_NAME, COUNT, SELL_DT,
       		  ROW_NUMBER() OVER(ORDER BY SELL_DT DESC, SELL_NO DESC) AS RNK
			  FROM SELL
			  WHERE 1 = 1
			&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; &amp;lt;!-- 검색어가 있다면 --&amp;gt;
				&amp;lt;choose&amp;gt;
					&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt; &amp;lt;!-- 품목 --&amp;gt;
						AND ITEM_NAME LIKE '%' || #{searchTxt} || '%'
					&amp;lt;/when&amp;gt;
					&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt; &amp;lt;!-- 수량 --&amp;gt;
						AND COUNT = #{searchTxt}
					&amp;lt;/when&amp;gt;
				&amp;lt;/choose&amp;gt;
			&amp;lt;/if&amp;gt;
             ) S
		WHERE S.RNK BETWEEN #{start} AND #{end}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;!-- 
		parameterType : 실행시 받는 값 
		#{키} : 헤당위치에 문자열로 키에 해당하는 값을 넣어준다
		ex) no에 3이 들어있는 경우
		WHERE SELL_NO = #{no}
		=&amp;gt; WHERE SELL_NO = '3' // 문자열이기 때문에  ' '이 들어감
		parameterType dao받는값, resultType값이 db실행결과
	--&amp;gt;
	&amp;lt;select id=&quot;getSell&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT SELL_NO, ITEM_NAME, COUNT, SELL_DT
		FROM SELL
		WHERE SELL_NO = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;!-- insert는 resultType 이 없음 --&amp;gt;
	&amp;lt;insert id=&quot;insertSell&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO SELL(SELL_NO, ITEM_NAME, COUNT, SELL_DT)
		VALUES(SELL_SEQ.NEXTVAL, #{itemName},#{count},#{sellDt})
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;delete id=&quot;deleteSell&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		DELETE FROM SELL
		WHERE SELL_NO = #{no}
	&amp;lt;/delete&amp;gt;
	
	&amp;lt;update id=&quot;updateSell&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE SELL SET ITEM_NAME = #{itemName},
                COUNT = #{count},
                SELL_DT = #{sellDt}
       	WHERE SELL_NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;select id=&quot;getManagerList&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT S.EMP_NO, S.NAME, S.DEPT
		FROM(SELECT EMP_NO, NAME, DEPT,
		ROW_NUMBER() OVER(ORDER BY EMP_NO DESC) AS RNK
		FROM MANAGER
		WHERE 1 =1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; 
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt;
					AND NAME LIKE '%' || #{searchTxt}|| '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt;
					AND DEPT LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;
		) S
		WHERE S.RNK BETWEEN #{start} AND #{end}
	&amp;lt;/select&amp;gt;

	&amp;lt;select id=&quot;getManager&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT EMP_NO, NAME, DEPT
		FROM MANAGER
		WHERE EMP_NO = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;insertManager&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO MANAGER(EMP_NO, NAME, DEPT)
		VALUES(MANAGER_SEQ.NEXTVAL, #{name}, #{deptName})
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;delete id=&quot;deleteManager&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		DELETE FROM MANAGER
		WHERE EMP_NO = #{no}
	&amp;lt;/delete&amp;gt;
	
	&amp;lt;update id=&quot;updateManager&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE MANAGER SET NAME = #{name},
                DEPT = #{deptName}
                WHERE EMP_NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;select id=&quot;getDivsList&quot; resultType=&quot;hashmap&quot;&amp;gt;
		SELECT DIV_CODE, DIV_NAME FROM DIVS ORDER BY DIV_CODE
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;getDivs&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT DIV_CODE, DIV_NAME FROM DIVS
		WHERE DIV_CODE = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;insertDivs&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO DIVS(DIV_CODE, DIV_NAME)
		VALUES((SELECT #{divCode} || LPAD(NVL(MAX(REPLACE(DIV_CODE, #{divCode}, '')),0) + 1,2,0 )
		FROM DIVS
		WHERE DIV_CODE LIKE #{divCode} || '%'), #{divName})
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;delete id=&quot;deleteDivs&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		DELETE FROM DIVS
		WHERE DIV_CODE = #{no}
	&amp;lt;/delete&amp;gt;
	
	&amp;lt;update id=&quot;updateDivs&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE DIVS SET DIV_CODE = #{divCode},
                DIV_NAME = #{divName}
                WHERE DIV_CODE = #{no}
	&amp;lt;/update&amp;gt;
	
	
	&amp;lt;select id=&quot;getBookList&quot; resultType=&quot;hashmap&quot;&amp;gt;
		SELECT BOOK_NO, BOOK_TITLE, BOOK_AUTHOR
		FROM BOOK
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;getBook&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT BOOK_NO, BOOK_TITLE, BOOK_AUTHOR, BOOK_CO,
		TO_CHAR(BOOK_DT,'YYYY-MM-DD') AS BOOK_DT, TO_CHAR(REG_DT,'YYYY-MM-DD') AS REG_DT
		FROM BOOK
		WHERE BOOK_NO = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;insertBook&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO BOOK(BOOK_NO, BOOK_TITLE, BOOK_AUTHOR, BOOK_CO, BOOK_DT)
		VALUES(BOOK_SEQ.NEXTVAL, #{bookTitle}, #{bookAuthor}, #{bookCo}, #{bookDt})
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;delete id=&quot;deleteBook&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		DELETE FROM BOOK
		WHERE BOOK_NO = #{no}
	&amp;lt;/delete&amp;gt;
	       
	&amp;lt;update id=&quot;updateBook&quot; parameterType=&quot;hashmap&quot;&amp;gt;
			UPDATE BOOK SET BOOK_TITLE = #{bookTitle},
                BOOK_AUTHOR = #{bookAuthor},
                BOOK_CO = #{bookCo},
                BOOK_DT = #{bookDt}
                WHERE BOOK_NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;select id=&quot;getSellCnt&quot; parameterType=&quot;hashmap&quot; resultType=&quot;Integer&quot;&amp;gt;
		SELECT COUNT(*) AS CNT 
		FROM SELL
		WHERE 1 = 1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; &amp;lt;!-- 검색어가 있다면 --&amp;gt;
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt; &amp;lt;!-- 품목 --&amp;gt;
					AND ITEM_NAME LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt; &amp;lt;!-- 수량 --&amp;gt;
					AND COUNT = #{searchTxt}
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&amp;gt;
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;getManagerCnt&quot; parameterType=&quot;hashmap&quot; resultType=&quot;Integer&quot;&amp;gt;
		SELECT COUNT(*) AS CNT 
		FROM MANAGER
		WHERE 1 =1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; 
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt;
					AND NAME LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt;
					AND DEPT LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
		&amp;lt;/if&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;manager 실습 코드&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;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;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;anboard 실습 코드&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pshExamController.java&lt;/p&gt;
&lt;pre id=&quot;code_1660141641891&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.controller;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.spring.sample.common.service.IPagingService;
import com.spring.sample.web.test.service.ITestService1;

@Controller
public class PshExamController {
	// 3.
	@Autowired
	public ITestService1 iTestService1;
	
	@Autowired
	public IPagingService ips; // 페이징 서비스 객체 주입
	
	/*
	 * Database나 파일 같이 외부에 접근하는 경우 외적 요인으로 문제가 발샐할 수 있음으로 예외처리가 반드시 필요하다.
	 */
	
	// 실습
	@RequestMapping(value = &quot;/anboardList&quot;)
	public ModelAndView anboardList(
			@RequestParam HashMap&amp;lt;String, String&amp;gt; params,
			ModelAndView mav) throws Throwable {
		
		// 현재페이지
		int page = 1;

		if (params.get(&quot;page&quot;) != null) { // 페이지가 넘어왔을때
			page = Integer.parseInt(params.get(&quot;page&quot;)); // 받아온 페이지 할당
		}

		// 총 데이터 개수 취득
		int cnt = iTestService1.getAnboardCnt(params);

		// 페이징 데이터 계산
		// ips.getPagingData(page, maxCount, viewCnt, pageCnt)
		HashMap&amp;lt;String, Integer&amp;gt; pd = ips.getPagingData(page, cnt, 3, 2);

		// 파라미터에 시작, 종료값 추가
		// 한쪽으로 필요 데이터를 몰았다?
		params.put(&quot;start&quot;, Integer.toString(pd.get(&quot;start&quot;)));
		params.put(&quot;end&quot;, Integer.toString(pd.get(&quot;end&quot;)));

				
		// 데이터 취득
		List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; list = iTestService1.getAnboardList(params);

		// 목록 데이터
		mav.addObject(&quot;list&quot;, list);
		// 페이징 정보
		mav.addObject(&quot;pd&quot;, pd);
		// 현재 페이지
		mav.addObject(&quot;page&quot;, page);
		mav.setViewName(&quot;test/anboardList&quot;);

		return mav;
	}

	@RequestMapping(value = &quot;/anboardDetail&quot;)
	public ModelAndView anboardDetail(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {

		if (params.get(&quot;no&quot;) == null || params.get(&quot;no&quot;) == &quot;&quot;) {
			mav.setViewName(&quot;redirect:anboardList&quot;);

		} else {
			HashMap&amp;lt;String, String&amp;gt; data = iTestService1.getAnboard(params);

			mav.addObject(&quot;data&quot;, data);
			mav.setViewName(&quot;test/anboardDetail&quot;);
		}

		return mav;
	}

	@RequestMapping(value = &quot;/anboardInsert&quot;)
	public ModelAndView managerInsert(ModelAndView mav) {
		mav.setViewName(&quot;test/anboardInsert&quot;);
		return mav;

	}

	@RequestMapping(value = &quot;/anboardRes&quot;)
	public ModelAndView anboardInsertRes(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav)
			throws Throwable {

		System.out.println(params.toString());
		try {
			int cnt = 0; // insert, update, delete 다 쓸거기 때문에 처음에 0줌

			switch (params.get(&quot;gbn&quot;)) {
			case &quot;i&quot;:
				cnt = iTestService1.insertAnboard(params);
				break;
			case &quot;u&quot;:
				cnt = iTestService1.updateAnboard(params);
				break;
			case &quot;d&quot;:
				cnt = iTestService1.deleteAnboard(params);
				break;
			}

			if (cnt &amp;gt; 0) { // 1건 이상 등록된 경우
				mav.addObject(&quot;res&quot;, &quot;success&quot;);
			} else { // 등록 안된 경우
				mav.addObject(&quot;res&quot;, &quot;failded&quot;);
			}
		} catch (Exception e) { // 예외 발생시
			e.printStackTrace();
			mav.addObject(&quot;res&quot;, &quot;error&quot;);
		}
		mav.setViewName(&quot;test/anboardRes&quot;);
		return mav;
	}

	// 글 수정페이지
	@RequestMapping(value = &quot;/anboardUpdate&quot;)
	public ModelAndView anboardUpdate(@RequestParam HashMap&amp;lt;String, String&amp;gt; params, ModelAndView mav) throws Throwable {
		// 기존데이터 조회해와야함
		HashMap&amp;lt;String, String&amp;gt; data = iTestService1.getAnboard(params);
		mav.addObject(&quot;data&quot;, data);

		mav.setViewName(&quot;test/anboardUpdate&quot;);

		return mav;

	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ITestService1.java&lt;/p&gt;
&lt;pre id=&quot;code_1660141686976&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.service;

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

public interface ITestService1 {

	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getAnboardList(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public HashMap&amp;lt;String, String&amp;gt; getAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int insertAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int updateAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int deleteAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int getAnboardCnt(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TestService1.java&lt;/p&gt;
&lt;pre id=&quot;code_1660141811948&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.service;

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

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

import com.spring.sample.web.test.dao.ITestDao1;

@Service
public class TestService1 implements ITestService1 {
	@Autowired
	public ITestDao1 iTestDao1;
	

	@Override
	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getAnboardList(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao1.getAnboardList(params);
	}

	@Override
	public HashMap&amp;lt;String, String&amp;gt; getAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao1.getAnboard(params);
	}

	@Override
	public int insertAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao1.insertAnboard(params);
	}

	@Override
	public int updateAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao1.updateAnboard(params);
	}

	@Override
	public int deleteAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao1.deleteAnboard(params);
	}

	@Override
	public int getAnboardCnt(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return iTestDao1.getAnboardCnt(params);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ITestDao1.java&lt;/p&gt;
&lt;pre id=&quot;code_1660141838696&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.dao;

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

public interface ITestDao1 {

	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getAnboardList(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public HashMap&amp;lt;String, String&amp;gt; getAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int insertAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int deleteAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int updateAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

	public int getAnboardCnt(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TestDao1.java&lt;/p&gt;
&lt;pre id=&quot;code_1660141882692&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.sample.web.test.dao;

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

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class TestDao1 implements ITestDao1 {
	
	@Autowired
	public SqlSession sqlSession;

	@Override
	public List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; getAnboardList(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectList(&quot;test.getAnboardList&quot;, params);
	}

	@Override
	public HashMap&amp;lt;String, String&amp;gt; getAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectOne(&quot;test.getAnboard&quot;, params);
	}

	@Override
	public int insertAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.insert(&quot;test.insertAnboard&quot;, params);
	}

	@Override
	public int deleteAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.delete(&quot;test.deleteAnboard&quot;, params);
	}

	@Override
	public int updateAnboard(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.update(&quot;test.updateAnboard&quot;, params);
	}

	@Override
	public int getAnboardCnt(HashMap&amp;lt;String, String&amp;gt; params) throws Throwable {
		return sqlSession.selectOne(&quot;test.getAnboardCnt&quot;, params);
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Test_SQL.xml&lt;/p&gt;
&lt;pre id=&quot;code_1660141980003&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;!-- namespace : 클래스와 동일, 이 파일의 대표명 --&amp;gt;
&amp;lt;mapper namespace=&quot;test&quot;&amp;gt;

	&amp;lt;!-- Anboard 테이블 --&amp;gt;
	
	&amp;lt;select id=&quot;getAnboardList&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;		
		SELECT S.NO, S.TITLE, S.WRITER, S.HIT, S.DT
		FROM (SELECT NO, TITLE, WRITER, HIT, TO_CHAR(DT,'YYYY-MM-DD') AS DT,
		ROW_NUMBER() OVER(ORDER BY DT DESC, NO DESC) AS RNK
		FROM ANBOARD
		WHERE DEL = 1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; 
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt;
					AND TITLE LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt;
					AND WRITER LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
			&amp;lt;/if&amp;gt;
		) S
		WHERE S.RNK BETWEEN #{start} AND #{end}
	&amp;lt;/select&amp;gt;

	&amp;lt;select id=&quot;getAnboard&quot; resultType=&quot;hashmap&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		SELECT NO, TITLE, WRITER, CON, HIT, DT 
		FROM ANBOARD
		WHERE NO = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;insertAnboard&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		INSERT INTO ANBOARD(NO, TITLE, WRITER, CON)
		VALUES(ANBOARD_SEQ.NEXTVAL, #{title}, #{writer}, #{con})
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;update id=&quot;deleteAnboard&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE ANBOARD SET DEL = 0
		WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;update id=&quot;updateAnboard&quot; parameterType=&quot;hashmap&quot;&amp;gt;
		UPDATE ANBOARD SET TITLE = #{title},
                WRITER = #{writer},
                CON = #{con}
                WHERE NO = #{no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;select id=&quot;getAnboardCnt&quot; parameterType=&quot;hashmap&quot; resultType=&quot;Integer&quot;&amp;gt;
		SELECT COUNT(*) AS CNT 
		FROM ANBOARD
		WHERE DEL = 1
		&amp;lt;if test=&quot;searchTxt != null and searchTxt != ''&quot;&amp;gt; 
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 0&quot;&amp;gt;
					AND TITLE LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;searchGbn == 1&quot;&amp;gt;
					AND WRITER LIKE '%' || #{searchTxt} || '%'
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
			&amp;lt;/if&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;anboardList.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660142122214&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;style type=&quot;text/css&quot;&amp;gt;
table{
	border-collapse: collapse;
}

th, td {
	border: 1px solid #000;
	padding: 5px;
}

&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	
	if(&quot;${param.searchGbn}&quot; != &quot;&quot;) { // 검색구분이 넘어오면
		$(&quot;#searchGbn&quot;).val(&quot;${param.searchGbn}&quot;);	
	}
	
	
	$(&quot;tbody&quot;).on(&quot;click&quot;, &quot;tr&quot;, function () {
		console.log($(this).attr(&quot;no&quot;));
		$(&quot;#no&quot;).val($(this).attr(&quot;no&quot;));
		
		// 검색 상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;anboardDetail&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		location.href = &quot;anboardInsert&quot;;
	});
	
	$(&quot;#pagingWrap&quot;).on(&quot;click&quot;, &quot;span&quot;, function () {
		$(&quot;#page&quot;).val($(this).attr(&quot;page&quot;));
		
		// 검색 상태 유지
		$(&quot;#searchGbn&quot;).val($(&quot;#oldGbn&quot;).val());
		$(&quot;#searchTxt&quot;).val($(&quot;#oldTxt&quot;).val());
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;anboardList&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
	
	$(&quot;#searchBtn&quot;).on(&quot;click&quot;, function () {
		// 검색하면 페이지는 무조건 1페이지로 감
		$(&quot;#page&quot;).val(&quot;1&quot;); // 페이지 초기화
		
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;anboardList&quot;);
		$(&quot;#actionForm&quot;).submit();
	})
})

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;!-- 기존 검색 내용 유지용 --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;oldTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;form action=&quot;anboardDetail&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; id=&quot;no&quot; name=&quot;no&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; id=&quot;page&quot; name=&quot;page&quot; value=&quot;${page}&quot; /&amp;gt;  &amp;lt;!-- 상세보기 갈때 page 가져갈거임 --&amp;gt;
	&amp;lt;!-- 검색 --&amp;gt;
	&amp;lt;select name=&quot;searchGbn&quot; id=&quot;searchGbn&quot;&amp;gt;
		&amp;lt;option value=&quot;0&quot;&amp;gt;제목&amp;lt;/option&amp;gt;
		&amp;lt;option value=&quot;1&quot;&amp;gt;작성자&amp;lt;/option&amp;gt;
	&amp;lt;/select&amp;gt;
	&amp;lt;input type=&quot;text&quot; name=&quot;searchTxt&quot; id=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt; &amp;lt;!-- 검색어 유지되게, 그래야 페이징할떄도 유지됨 --&amp;gt;
	&amp;lt;input type=&quot;button&quot; value=&quot;검색&quot; id=&quot;searchBtn&quot; /&amp;gt;
	&amp;lt;input type=&quot;button&quot; value=&quot;추가&quot; id=&quot;insertBtn&quot; /&amp;gt;
&amp;lt;/form&amp;gt;

&amp;lt;table&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 var=&quot;data&quot; items=&quot;${list}&quot;&amp;gt;
			&amp;lt;tr no=&quot;${data.NO}&quot;&amp;gt;
				&amp;lt;td&amp;gt;${data.NO}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.TITLE}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.WRITER}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.HIT}&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;${data.DT}&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;div id=&quot;pagingWrap&quot;&amp;gt;
&amp;lt;span page=&quot;1&quot;&amp;gt;처음&amp;lt;/span&amp;gt;
&amp;lt;!-- 이전은 현재페이지에서 하나 전, 
지금 1페이지인지 아닌지 먼저 체크 따라서, 현재페이지 필요--&amp;gt;
&amp;lt;!-- 이전페이지 : 현제페이지가 1이면 1로 이동 아니면 현제페이지 -1 --&amp;gt;
&amp;lt;c:choose&amp;gt;
	&amp;lt;c:when test=&quot;${page eq 1}&quot;&amp;gt;
		&amp;lt;span page=&quot;1&quot;&amp;gt;이전&amp;lt;/span&amp;gt;
	&amp;lt;/c:when&amp;gt;
	&amp;lt;c:otherwise&amp;gt;
		&amp;lt;span page=&quot;${page - 1}&quot;&amp;gt;이전&amp;lt;/span&amp;gt;
	&amp;lt;/c:otherwise&amp;gt;
&amp;lt;/c:choose&amp;gt;
&amp;lt;!-- 페이지들 --&amp;gt;
&amp;lt;c:forEach var=&quot;i&quot; begin=&quot;${pd.startP}&quot; end=&quot;${pd.endP}&quot; step=&quot;1&quot;&amp;gt;
	&amp;lt;%-- 현재 페이지의 경우 별도 처리 --%&amp;gt;
	&amp;lt;c:choose&amp;gt;
		&amp;lt;c:when test=&quot;${i eq page}&quot;&amp;gt; &amp;lt;%-- 현재페이지 --%&amp;gt;
			&amp;lt;span page=&quot;${i}&quot;&amp;gt;&amp;lt;b&amp;gt;${i}&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;
		&amp;lt;/c:when&amp;gt;
		&amp;lt;c:otherwise&amp;gt; &amp;lt;%-- 다른페이지 --%&amp;gt;
			&amp;lt;span page=&quot;${i}&quot;&amp;gt;${i}&amp;lt;/span&amp;gt;
		&amp;lt;/c:otherwise&amp;gt;
	&amp;lt;/c:choose&amp;gt;
&amp;lt;/c:forEach&amp;gt;

&amp;lt;!-- 다음페이지 : 마지막에 도달했을때는 증가하지 않고, 다른 경우는 +1 --&amp;gt;
&amp;lt;c:choose&amp;gt;
	&amp;lt;c:when test=&quot;${page eq pd.maxP}&quot;&amp;gt;
		&amp;lt;span page=&quot;${pd.maxP}&quot;&amp;gt;다음&amp;lt;/span&amp;gt;
	&amp;lt;/c:when&amp;gt;
	&amp;lt;c:otherwise&amp;gt;
		&amp;lt;span page=&quot;${page + 1}&quot;&amp;gt;다음&amp;lt;/span&amp;gt;
	&amp;lt;/c:otherwise&amp;gt;
&amp;lt;/c:choose&amp;gt;

&amp;lt;span page=&quot;${pd.maxP}&quot;&amp;gt;마지막&amp;lt;/span&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 data-ke-size=&quot;size16&quot;&gt;anboardDetail.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660142139505&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; 
		src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function() {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;anboardList&quot;); 
		$(&quot;#actionForm&quot;).submit();
	});
	
	$(&quot;#deleteBtn&quot;).on(&quot;click&quot;, function () {
		if(confirm(&quot;삭제하시곘습니까?&quot;)){
			$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;anboardRes&quot;); 
			$(&quot;#actionForm&quot;).submit();
		}
	})
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		$(&quot;#actionForm&quot;).attr(&quot;action&quot;,&quot;anboardUpdate&quot;);
		$(&quot;#actionForm&quot;).submit();
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;#&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;d&quot;&amp;gt; &amp;lt;!-- selRes는 gbn을 받게 되어있어서 값을 추가해줘야함 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.NO}&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
		&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
&amp;lt;/form&amp;gt;	
번호: ${data.NO}&amp;lt;br/&amp;gt;
제목: ${data.TITLE}&amp;lt;br/&amp;gt;
내용: ${data.CON}&amp;lt;br/&amp;gt;
작성자: ${data.WRITER}&amp;lt;br/&amp;gt;
조회수: ${data.HIT}&amp;lt;br/&amp;gt;
작성일: ${data.DT}&amp;lt;br/&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;수정&quot; id=&quot;updateBtn&quot; /&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;삭제&quot; id=&quot;deleteBtn&quot; /&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;목록&quot; id=&quot;listBtn&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;anboardInsert.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660142156230&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		history.back();
	});
	
	$(&quot;#insertBtn&quot;).on(&quot;click&quot;, function () {
		if($(&quot;#title&quot;).val() == &quot;&quot;){
			alert(&quot;제목을 입력하세요&quot;);
			$(&quot;#title&quot;).focus();
		} else if($(&quot;#writer&quot;).val() == &quot;&quot;){
			alert(&quot;작성자를 입력하세요&quot;);
			$(&quot;#writer&quot;).focus();
		} else if($(&quot;#con&quot;).val() == &quot;&quot;){
			alert(&quot;내용을 입력하세요&quot;);
			$(&quot;#con&quot;).focus();
		} else {
			$(&quot;#actionForm&quot;).submit();
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;anboardRes&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;!-- gbn : 구분, 혹은 flag --&amp;gt;
&amp;lt;!-- 구분: i - insert, u - update, d - delete --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;i&quot;/&amp;gt;
제목 
&amp;lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot; /&amp;gt;
&amp;lt;br /&amp;gt;
작성자 
&amp;lt;input type=&quot;text&quot; name=&quot;writer&quot; id=&quot;writer&quot; /&amp;gt;
&amp;lt;br/&amp;gt;
내용 
&amp;lt;textarea name=&quot;con&quot; id=&quot;con&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;등록&quot; id=&quot;insertBtn&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;목록&quot; id=&quot;listBtn&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;anboardRes.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660142172266&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	
	switch(&quot;${res}&quot;){
	case &quot;success&quot; : 
		if(&quot;${param.gbn}&quot; == &quot;u&quot;){ // 수정이 성공했을 떄
			$(&quot;#goForm&quot;).submit();
		} else { // 등록, 삭제가 성공했을 떄
			location.href = &quot;anboardList&quot; 
		}
		break;
	case &quot;failed&quot; : 
		alert(&quot;작업에 실패하였습니다.&quot;);
		history.back();
		break;
	case &quot;error&quot; : 
		alert(&quot;작업중 문제가 발생 하였습니다.&quot;);
		history.back();
		break;
	}
});
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;anboardDetail&quot; id=&quot;goForm&quot; method=&quot;post&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${param.no}&quot; /&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
		&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&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 data-ke-size=&quot;size16&quot;&gt;anboardUpdate.jsp&lt;/p&gt;
&lt;pre id=&quot;code_1660142185033&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&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;script type=&quot;text/javascript&quot; src=&quot;resources/script/jquery/jquery-1.12.4.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(document).ready(function () {
	// 기존값으로 셀렉트박스 선택 내용 변경
	$(&quot;#title&quot;).val(&quot;${data.TITLE}&quot;);
	$(&quot;#writer&quot;).val(&quot;${data.WRITER}&quot;);
	$(&quot;#con&quot;).val(&quot;${data.CON}&quot;);
	
	$(&quot;#listBtn&quot;).on(&quot;click&quot;, function () {
		history.back();
	});
	
	$(&quot;#updateBtn&quot;).on(&quot;click&quot;, function () {
		if($(&quot;#title&quot;).val() == &quot;&quot;){
			alert(&quot;제목을 입력하세요&quot;);
			$(&quot;#title&quot;).focus();
		} else if($(&quot;#writer&quot;).val() == &quot;&quot;){
			alert(&quot;작성자를 입력하세요&quot;);
			$(&quot;#writer&quot;).focus();
		} else if($(&quot;#con&quot;).val() == &quot;&quot;){
			alert(&quot;내용을 입력하세요&quot;);
			$(&quot;#con&quot;).focus();
		} else {
			$(&quot;#actionForm&quot;).submit();
		}
	});
});

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;!-- 번호는 시퀀스 쓸거기 때문에 받을 필요없음, 보여줄 필요 없음, 저장되야 글번호 보여지지 --&amp;gt;
&amp;lt;!-- select 전달하기 위해  name줘야함 --&amp;gt;
&amp;lt;!-- option value 지정해줘야함! --&amp;gt;
&amp;lt;form action=&quot;anboardRes&quot; id=&quot;actionForm&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;!-- gbn : 구분, 혹은 flag --&amp;gt;
&amp;lt;!-- 구분: i - insert, u - update, d - delete --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;gbn&quot; value=&quot;u&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;no&quot; value=&quot;${data.NO}&quot;/&amp;gt; &amp;lt;!-- 이 번호만 수정해라라는 조건 달기위해 필요 --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;page&quot; value=&quot;${param.page}&quot; /&amp;gt; &amp;lt;!-- 전 화면에서 넘어온 페이지 정보 --&amp;gt;
&amp;lt;!-- 전 화면에서 넘어온 검색 정보 --&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;searchGbn&quot; value=&quot;${param.searchGbn}&quot;/&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;searchTxt&quot; value=&quot;${param.searchTxt}&quot;/&amp;gt;
제목 
&amp;lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot; /&amp;gt;
&amp;lt;br /&amp;gt;
작성자 
&amp;lt;input type=&quot;text&quot; name=&quot;writer&quot; id=&quot;writer&quot; /&amp;gt;
&amp;lt;br/&amp;gt;
내용 
&amp;lt;textarea name=&quot;con&quot; id=&quot;con&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;수정&quot; id=&quot;updateBtn&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;뒤로가기&quot; id=&quot;listBtn&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;p data-ke-size=&quot;size16&quot;&gt;anboardList 화면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-10 오후 11.47.05.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7qA3O/btrJp9e87Y6/wjBItg2I7CYjg5WMhteckK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7qA3O/btrJp9e87Y6/wjBItg2I7CYjg5WMhteckK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7qA3O/btrJp9e87Y6/wjBItg2I7CYjg5WMhteckK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7qA3O%2FbtrJp9e87Y6%2FwjBItg2I7CYjg5WMhteckK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;231&quot; data-filename=&quot;스크린샷 2022-08-10 오후 11.47.05.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;350&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;이렇게 함, 아직 맞는지는 몰라 내일 같이 할 예정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DEL 컬럼을 주고, 1이면 삭제 안된데이터, 0이면 삭제된 데이터, 쿼리에서 1만 보이게 처리&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-10 오후 11.49.58.png&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;1306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SaOSP/btrJo2HBRp5/kgDxP0zx3XTbIkMpuBp0p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SaOSP/btrJo2HBRp5/kgDxP0zx3XTbIkMpuBp0p1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SaOSP/btrJo2HBRp5/kgDxP0zx3XTbIkMpuBp0p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSaOSP%2FbtrJo2HBRp5%2FkgDxP0zx3XTbIkMpuBp0p1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;603&quot; height=&quot;629&quot; data-filename=&quot;스크린샷 2022-08-10 오후 11.49.58.png&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;1306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건걸때 WHERE 1=1 대신 DEL =1로 바꿔주고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-10 오후 11.51.26.png&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5xJur/btrJsQlmiNZ/BkC6AvOJYTgZQQpRCr1Y1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5xJur/btrJsQlmiNZ/BkC6AvOJYTgZQQpRCr1Y1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5xJur/btrJsQlmiNZ/BkC6AvOJYTgZQQpRCr1Y1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5xJur%2FbtrJsQlmiNZ%2FBkC6AvOJYTgZQQpRCr1Y1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1118&quot; height=&quot;682&quot; data-filename=&quot;스크린샷 2022-08-10 오후 11.51.26.png&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;682&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-10 오후 11.52.02.png&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T7GNT/btrJrRkvWo7/IKAu0yViSPQNQmQPWJBkIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T7GNT/btrJrRkvWo7/IKAu0yViSPQNQmQPWJBkIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T7GNT/btrJrRkvWo7/IKAu0yViSPQNQmQPWJBkIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT7GNT%2FbtrJrRkvWo7%2FIKAu0yViSPQNQmQPWJBkIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;104&quot; data-filename=&quot;스크린샷 2022-08-10 오후 11.52.02.png&quot; data-origin-width=&quot;772&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;기존 삭제부분은 delete 사용했는데, 이제 update로 변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-10 오후 11.54.15.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KryiB/btrJqJUNWNt/hfgPvz08q8pO8kZoQ97KP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KryiB/btrJqJUNWNt/hfgPvz08q8pO8kZoQ97KP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KryiB/btrJqJUNWNt/hfgPvz08q8pO8kZoQ97KP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKryiB%2FbtrJqJUNWNt%2FhfgPvz08q8pO8kZoQ97KP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;102&quot; data-filename=&quot;스크린샷 2022-08-10 오후 11.54.15.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>TIL/academy</category>
      <author>토희</author>
      <guid isPermaLink="true">https://makeaplayground.tistory.com/118</guid>
      <comments>https://makeaplayground.tistory.com/118#entry118comment</comments>
      <pubDate>Wed, 10 Aug 2022 17:51:27 +0900</pubDate>
    </item>
  </channel>
</rss>