<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>학습기록남기기</title>
    <link>https://backend-na.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 11 Jun 2026 13:48:21 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>backend_na</managingEditor>
    <item>
      <title>JPA(1)</title>
      <link>https://backend-na.tistory.com/129</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SQL 중심적인 개발&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CRUD 쿼리 작성과 수정의 같은 동작의 무한 반복&lt;/li&gt;
&lt;li&gt;자바 객체를 직접 DB에 넣을 수 없고 , &amp;lsquo; 자바 객체의 변수&amp;rsquo;와 &amp;lsquo;테이블 컬럼&amp;rsquo; 과 매핑(=매칭)이 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; JPA를 통해 위의 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;객체와 RDB의 차이&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상속
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체는 명확하게 &amp;ldquo;상속 관계&amp;rdquo; 존재, RDB는 유사한 개념인 &amp;ldquo;슈퍼타입-서브타입&amp;rdquo; 존재
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RDB의 서브 타입 테이블에 데이터 저장 시 슈퍼 타입과 , 서브 타입 테이블에 각각 저장( 2 번의 INSERT 필요)&lt;/li&gt;
&lt;li&gt;조회 시에는 슈퍼 타입 ,서브 타입 테이블의 JOIN SQL 작성해야 함&lt;/li&gt;
&lt;li&gt;JPA는 이런 번거로운 과정을 알아서 해줌&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;연관관계
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체는 &amp;ldquo;참조&amp;rdquo;를 사용해 다른 객체와의 관계를 맺고 / 테이블은 &amp;ldquo;외래키&amp;rdquo; 사용해 다른 테이블과 관계를 맺음
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체 지향 모델링은 객체 참조가 있어 다른 객체 탐색이 가능 , 테이블 지향 모델링은 두 테이블 간 참조를 하려면 &amp;ldquo;외래키&amp;rdquo;를 사용해야 함&lt;/li&gt;
&lt;li&gt;JPA는 관계 맺고 있는 객체 참조를 외래키로 변환해서 알아서 해주고 , 조회 할 때 외래키를 참조로 변환 과정을 알아서 해줌&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;객체 그래프 탐색
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL을 직접 작성할 때 어느 테이블 까지 탐색할 수 있는지 정해진다(작성 순간 정해짐)
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;왜냐면 JOIN 할 테이블을 직접 선택하기 때문 &amp;mdash;&amp;gt; 다른 객체 탐색하려면 SQL 수정필요&lt;/li&gt;
&lt;li&gt;JPA는 실제 객체를 사용하는 시점까지 데이터 베이스 조회를 미루는(=지연 로딩)이 있다&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;비교
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB는 기본 키 의 값으로 컬럼의 값을 구분&lt;/li&gt;
&lt;li&gt;객체는 동일성 비교(객체의 주소 값을 비교 == 연산자) 와 동등성 비교 (객체의 내부 값을 비교 equals() 메서드)
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JPA는 같은 트랜잭션일 때 같은 객체가 조회 되는 것을 보장한다&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/129</guid>
      <comments>https://backend-na.tistory.com/129#entry129comment</comments>
      <pubDate>Tue, 27 Dec 2022 14:30:50 +0900</pubDate>
    </item>
    <item>
      <title>Spring Boot Repository Test 오류</title>
      <link>https://backend-na.tistory.com/128</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;org.springframework.beans.factory.BeanCreationException:&amp;nbsp;Error&amp;nbsp;creating&amp;nbsp;bean&amp;nbsp;with&amp;nbsp;name&amp;nbsp;'dataSource':&amp;nbsp;Invocation&amp;nbsp;of&amp;nbsp;init&amp;nbsp;method&amp;nbsp;failed;&amp;nbsp;nested&amp;nbsp;exception&amp;nbsp;is&amp;nbsp;java.lang.IllegalStateException:&amp;nbsp;Failed&amp;nbsp;to&amp;nbsp;replace&amp;nbsp;DataSource&amp;nbsp;with&amp;nbsp;an&amp;nbsp;embedded&amp;nbsp;database&amp;nbsp;for&amp;nbsp;tests.&amp;nbsp;If&amp;nbsp;you&amp;nbsp;want&amp;nbsp;an&amp;nbsp;embedded&amp;nbsp;database&amp;nbsp;please&amp;nbsp;put&amp;nbsp;a&amp;nbsp;supported&amp;nbsp;one&amp;nbsp;on&amp;nbsp;the&amp;nbsp;classpath&amp;nbsp;or&amp;nbsp;tune&amp;nbsp;the&amp;nbsp;replace&amp;nbsp;attribute&amp;nbsp;of&amp;nbsp;@AutoConfigureTestDatabase. &lt;br /&gt;at&amp;nbsp;org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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; 실제 DB를 사용할 생각으로 yml파일들을 세팅해 놨는데 , 이를 위해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 테스트할 클래스에서 붙여야 한다 !!&amp;nbsp;&lt;/p&gt;</description>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/128</guid>
      <comments>https://backend-na.tistory.com/128#entry128comment</comments>
      <pubDate>Thu, 22 Dec 2022 15:15:48 +0900</pubDate>
    </item>
    <item>
      <title>Optional 과 null  + Junit Test optional.empty</title>
      <link>https://backend-na.tistory.com/127</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Optional&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Null 이 될 가능성을 가진 값&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #303a3e;&quot;&gt;을 객체로 감싸는 래퍼 클래스다. Optional 에 포장된 객체는 하나의 원소 혹은 Null 원소가 되는 것을 뜻한다. Null 을 직접 다루면 위험한 상황이 발생하거나 굉장히 까다롭다.&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #303a3e;&quot;&gt;Optional 객체에 포장함으로써 유연한 처리가 가능해 진다. Null 을 Optional 에 포장하게 되면 Null 을 값으로 보고 로직을 구현할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1165&quot; data-origin-height=&quot;993&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MwkTt/btrTjFhzq4P/mA7DwhDAmR25cqryI4fV5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MwkTt/btrTjFhzq4P/mA7DwhDAmR25cqryI4fV5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MwkTt/btrTjFhzq4P/mA7DwhDAmR25cqryI4fV5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMwkTt%2FbtrTjFhzq4P%2FmA7DwhDAmR25cqryI4fV5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1165&quot; height=&quot;993&quot; data-origin-width=&quot;1165&quot; data-origin-height=&quot;993&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;h2 data-ke-size=&quot;size26&quot;&gt;Junit Test 시 Optional.empty 발생&amp;nbsp;&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;&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;988&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t5unu/btrTjGnd5yp/AWQ3NlYaRE3eCEPZMhxR41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t5unu/btrTjGnd5yp/AWQ3NlYaRE3eCEPZMhxR41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t5unu/btrTjGnd5yp/AWQ3NlYaRE3eCEPZMhxR41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft5unu%2FbtrTjGnd5yp%2FAWQ3NlYaRE3eCEPZMhxR41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;988&quot; height=&quot;219&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;219&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3EpUO/btrTk2jirmu/Qku5FLw5e9ghKoubi5cgBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3EpUO/btrTk2jirmu/Qku5FLw5e9ghKoubi5cgBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3EpUO/btrTk2jirmu/Qku5FLw5e9ghKoubi5cgBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3EpUO%2FbtrTk2jirmu%2FQku5FLw5e9ghKoubi5cgBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;383&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/127</guid>
      <comments>https://backend-na.tistory.com/127#entry127comment</comments>
      <pubDate>Sun, 11 Dec 2022 14:21:20 +0900</pubDate>
    </item>
    <item>
      <title>Spring Boot Swagger + Srping Security</title>
      <link>https://backend-na.tistory.com/126</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.maven 추가&amp;nbsp;&lt;/h2&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
   &amp;lt;groupId&amp;gt;io.springfox&amp;lt;/groupId&amp;gt;
   &amp;lt;artifactId&amp;gt;springfox-swagger2&amp;lt;/artifactId&amp;gt;
   &amp;lt;version&amp;gt;2.9.2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;




&amp;lt;dependency&amp;gt;
   &amp;lt;groupId&amp;gt;io.springfox&amp;lt;/groupId&amp;gt;
   &amp;lt;artifactId&amp;gt;springfox-swagger-ui&amp;lt;/artifactId&amp;gt;
   &amp;lt;version&amp;gt;2.9.2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.Swaager configiuration file 추가&amp;nbsp;&lt;/h2&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

    //작성한 get ,post ,delete 등 내가 작성한 여러 메서드 설명 -- 테스트 하기 유용함

    //localhost:8282/swaager-ui.html 로 접속
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage(&quot;com.blog.project.controller.api&quot;)) //베이스가 될 패키지명 작성
                .paths(PathSelectors.any())
                .build();
    }

    public ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title(&quot;API Test with Swaager&quot;)
                .version(&quot;설명&quot;)
                .description(&quot;0.0.0&quot;) //maven 1.0.0 라고 수정해놨기 때문
                .build();
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.Spring Security에&amp;nbsp; configure 메서드에 허용되는 url 입력&lt;/h2&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;/v2/api-docs&quot;, &quot;/configuration/**&quot;, &quot;/swagger*/**&quot;, &quot;/webjars/**&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;uarr;Swaager2.9.2&amp;nbsp; 사용하기 위한 허용 URL&amp;nbsp; 필수*&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig  extends WebSecurityConfigurerAdapter {

				.....
                .....
                
               
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .csrf().disable()
            .authorizeHttpRequests()
            .antMatchers(&quot;/&quot;, &quot;/auth/**&quot;, &quot;/js/**&quot;, &quot;/css/**&quot;, &quot;/image/**&quot;,&quot;/dummy/**&quot;,&quot;/check/**&quot;,&quot;/board/all/**&quot;,&quot;/v2/api-docs&quot;, &quot;/configuration/**&quot;, &quot;/swagger*/**&quot;, &quot;/webjars/**&quot;)
            .permitAll()
            .anyRequest()
            .authenticated()
            .and()
            .formLogin()
            .loginPage(&quot;/auth/loginForm&quot;)
            .loginProcessingUrl(&quot;/auth/loginProc&quot;)
            .defaultSuccessUrl(&quot;/&quot;)
            .and()
            .oauth2Login()
            .loginPage(&quot;/loginForm&quot;)
            .userInfoEndpoint()
            .userService(principalOauth2UserService);
}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. localhost:본인이 설정한 port번호 /swagger-ui.html&amp;nbsp; 주소 입력&amp;nbsp;&lt;/h2&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;1263&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vQcU3/btrS0K5yhYy/vOY4pJoW72wEAP45V5QcJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vQcU3/btrS0K5yhYy/vOY4pJoW72wEAP45V5QcJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vQcU3/btrS0K5yhYy/vOY4pJoW72wEAP45V5QcJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvQcU3%2FbtrS0K5yhYy%2FvOY4pJoW72wEAP45V5QcJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;546&quot; data-origin-width=&quot;1263&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/126</guid>
      <comments>https://backend-na.tistory.com/126#entry126comment</comments>
      <pubDate>Wed, 7 Dec 2022 14:40:06 +0900</pubDate>
    </item>
    <item>
      <title>컴퓨터 구조(Computer Arichitecutre)</title>
      <link>https://backend-na.tistory.com/125</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;컴퓨터 기본 구조&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중앙처리장치(CPU =프로세서) - 프로그램 실행과 데이터 처리&lt;/li&gt;
&lt;li&gt;기억장치 - CPU가 처리할 프로그램 코드와 데이터 저장 장소
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주기억장치 &amp;mdash;액세스 속도 높고 ,영구 저장 능력 없음 &amp;mdash;RAM&lt;/li&gt;
&lt;li&gt;보조기억장치 &amp;mdash; HDD,SSD 같은 영구 저장 장치 / CPU 직접 액세스 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;입출력장치 &amp;mdash; CPU는 별도의 제어기를 통하여 액세스 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터 프로그램은 C,C++ 같은 고급 언어를 이용해 작성 ( 사람 이해 쉬움 , 컴퓨터 이해 불가)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일러라는 소프트웨어를 통해 하드웨어가 이해할 수 있는 언어로 변경 &amp;mdash;기계어 =기계코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기계어는 CPU 내부 구조에 따라 하드웨어가 이해할 수 있는 언어가 달라 , 고급언어와 기계어 사이의 어셈블리 프로그램(어셈블리 언어로 작성됨)&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;mdash;&amp;gt; 어셈블리 프로그램 &amp;mdash;&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;기계어 프로그램 -- 2진수인 1,0 들의 조합&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;mdash; 명령어 비트 수와 용도 및 필드 구성 방법을 지정해 주는 형식 --&amp;gt;즉 , 기계어 생성&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU에 의해 한 번에 처리될 수 있는 비트들의 그룹=단어&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시스템의 구성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU와 기억장치 접속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 버스 &amp;mdash; CPU와 다른 요소들간의 정보 교환 통로&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주소 버스 &amp;mdash;CPU가 외부로 발생하는 주소 정보를 전송하는 신호 선들의 집합&lt;/li&gt;
&lt;li&gt;데이터 버스 &amp;mdash; CPU가 기억장치 혹은 I/O장치와의 사이에 데이터를 전송하기 위한 신호 선들의 집합&lt;/li&gt;
&lt;li&gt;제어 버스 &amp;mdash; CPU가 시스템 내의 각종 요소들의 동작을 제어하는데 필요한 선들의 집합&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소 &amp;mdash; CPU에 의해 발생되어 기억장치와 I/O 장치로 보내지는 정보이기 때문에 , 주소버스는 단방향성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 버스 &amp;mdash; 읽기 와 쓰기 동작을 모두 지원해야되서 양방향 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;액세스 &amp;mdash; CPU가 데이터를 기억장치의 특정 장소에 저장하거나 이미 저장되어 있는 내용을 읽는 동작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기억장치 쓰기 시간 &amp;mdash; CPU가 기억장치로 주소와 데이터를 보낸 순간부터 저장이 완료될 때까지의 시간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기억장치 읽기 시간 &amp;mdash; CPU가 기억장치로 주소를 보낸 순간부터 읽기 동작이 완료될 때까지의 시간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 레지스터 &amp;mdash; CPU와 I/O장치간의 임시 데이터 기억장치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태 레지스터 &amp;mdash; I/O 장치의 상태를 나타내는 비트들을 저장하는 레지스터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 버퍼 &amp;mdash; CPU와 I/O장치간의 데이터 임시 기억장치인 데이터 레지스터의 다른 명칭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU는 키보드,프린터와 같은 I/O장치의 제어기 내부 레지스터들의 주소를 이용하여 해당 I/O장치를 제어할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터 시스템이 수행할 수 있는 기능&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램 실행 &amp;mdash; CPU가 주기억장치로부터 프로그램 코드를 읽어서 실행&lt;/li&gt;
&lt;li&gt;데이터 저장 &amp;mdash; 프로그램 실행 결과로서 얻어진 데이터를 주기억장치에 저장&lt;/li&gt;
&lt;li&gt;데이터 이동 &amp;mdash;디스크나 SSD에 저장되어 있는 프로그램과 데이터 블록을 주기억장치로 이동&lt;/li&gt;
&lt;li&gt;데이터 입력 및 출력 &amp;mdash; 사용자가 키보드를 통하여 보내는 명령이나 데이터를 읽어들인다.또한 CPU가 처리한 결과 값이나 기억장치의 내용을 프린터 혹은 모니터에 출력&lt;/li&gt;
&lt;li&gt;제어 &amp;mdash;프로그램이 순서대로 실행되도록 혹은 필요에 따라 실행 순서를 변경하도록 조장하여 , 각종 제어 신호들을 발생&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/125</guid>
      <comments>https://backend-na.tistory.com/125#entry125comment</comments>
      <pubDate>Sat, 3 Dec 2022 16:55:08 +0900</pubDate>
    </item>
    <item>
      <title>스프링부트 -  Redis 설치 ( Window )</title>
      <link>https://backend-na.tistory.com/124</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/microsoftarchive/redis/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/microsoftarchive/redis/releases&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1669602438771&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Releases &amp;middot; microsoftarchive/redis&quot; data-og-description=&quot;Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes - microsoftarchive/redis&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/microsoftarchive/redis/releases&quot; data-og-url=&quot;https://github.com/microsoftarchive/redis/releases&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bOJTPo/hyQHWlZk1w/htXRQPPXYOSHYF0BOZ8tLk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/microsoftarchive/redis/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/microsoftarchive/redis/releases&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bOJTPo/hyQHWlZk1w/htXRQPPXYOSHYF0BOZ8tLk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;Releases &amp;middot; microsoftarchive/redis&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes - microsoftarchive/redis&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;uarr;사이트에 접속하여 다운&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&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;&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;726&quot; data-origin-height=&quot;471&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/668S8/btrScP0jjfG/qmKdBQ4KTUij7lZBuMB1TK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/668S8/btrScP0jjfG/qmKdBQ4KTUij7lZBuMB1TK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/668S8/btrScP0jjfG/qmKdBQ4KTUij7lZBuMB1TK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F668S8%2FbtrScP0jjfG%2FqmKdBQ4KTUij7lZBuMB1TK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;726&quot; height=&quot;471&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;471&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;601&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A9tjY/btrSf3qdV6a/lL7PiBzrNczLNfKcFngPzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A9tjY/btrSf3qdV6a/lL7PiBzrNczLNfKcFngPzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A9tjY/btrSf3qdV6a/lL7PiBzrNczLNfKcFngPzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA9tjY%2FbtrSf3qdV6a%2FlL7PiBzrNczLNfKcFngPzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;418&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;418&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;다운로드 후 설정 바꾸지 않고 설치&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;695&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MqGoP/btrSf2SpfGb/TdVxP3KjNBaKm5Q4haa461/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MqGoP/btrSf2SpfGb/TdVxP3KjNBaKm5Q4haa461/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MqGoP/btrSf2SpfGb/TdVxP3KjNBaKm5Q4haa461/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMqGoP%2FbtrSf2SpfGb%2FTdVxP3KjNBaKm5Q4haa461%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;695&quot; height=&quot;114&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Pom.xml에 Maven 추가 한다&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;&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;304&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rDCmM/btrScajlFWo/bpCX5F0QRuhmtfggjsQQk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rDCmM/btrScajlFWo/bpCX5F0QRuhmtfggjsQQk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rDCmM/btrScajlFWo/bpCX5F0QRuhmtfggjsQQk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrDCmM%2FbtrScajlFWo%2FbpCX5F0QRuhmtfggjsQQk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;304&quot; height=&quot;197&quot; data-origin-width=&quot;304&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;application.yml 파일에&amp;nbsp; 설정 추가한다 -- properties 파일에서 yml파일로 확장자만 변경하였음&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;704&quot; data-origin-height=&quot;651&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpAQbv/btrShAuAg71/8GWupWf3ye0hcCXyTvwTl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpAQbv/btrShAuAg71/8GWupWf3ye0hcCXyTvwTl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpAQbv/btrShAuAg71/8GWupWf3ye0hcCXyTvwTl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpAQbv%2FbtrShAuAg71%2F8GWupWf3ye0hcCXyTvwTl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;704&quot; height=&quot;651&quot; data-origin-width=&quot;704&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;IoC에 등록하기 위해 설정&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;587&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ogcg9/btrSbSC3Sa8/YLqPYKZzEqGwhHGmJ8mQy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ogcg9/btrSbSC3Sa8/YLqPYKZzEqGwhHGmJ8mQy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ogcg9/btrSbSC3Sa8/YLqPYKZzEqGwhHGmJ8mQy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fogcg9%2FbtrSbSC3Sa8%2FYLqPYKZzEqGwhHGmJ8mQy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;587&quot; height=&quot;45&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;45&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>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/124</guid>
      <comments>https://backend-na.tistory.com/124#entry124comment</comments>
      <pubDate>Mon, 28 Nov 2022 11:35:12 +0900</pubDate>
    </item>
    <item>
      <title>JWT(Json Web Token)</title>
      <link>https://backend-na.tistory.com/123</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jwt.io/introduction/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jwt.io/introduction/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1669450127658&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;JWT.IO&quot; data-og-description=&quot;JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.&quot; data-og-host=&quot;jwt.io&quot; data-og-source-url=&quot;https://jwt.io/introduction/&quot; data-og-url=&quot;http://jwt.io/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jwBDz/hyQGo4dAVZ/14XboLCic9w5L9Vvn8m131/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/e3I4N/hyQGknddLZ/KuDTMHfa9zWsz5yfrRZ0F1/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512&quot;&gt;&lt;a href=&quot;https://jwt.io/introduction/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jwt.io/introduction/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jwBDz/hyQGo4dAVZ/14XboLCic9w5L9Vvn8m131/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/e3I4N/hyQGknddLZ/KuDTMHfa9zWsz5yfrRZ0F1/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512');&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;JWT.IO&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jwt.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;JWT = Json Web Token&lt;/p&gt;
&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;JSON 웹 토큰(JWT)은 당사자 간의 정보를 JSON 객체로 안전하게 전송하기 위한 작고 독립적인 방법을 정의하는 개방형 표준(RFC 7519)입니다.&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;JWT는 비밀(HMAC 알고리즘 - Security Key 소지 ) 또는 RSA 또는 ECDSA를 사용하여 공개/개인 키 쌍을 사용하여 서명할 수 있습니다.&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;JWT Strucuture&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Header&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Payload&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Signature&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;gt;&amp;nbsp; header.payload.signature&amp;nbsp; &amp;nbsp;ex) xxxxx.yyyyy.zzzzz&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;Header -&lt;span style=&quot;background-color: #ffffff;&quot;&gt;토큰의 유형인 JWT와 HMAC SHA256 또는 RSA와 같은 서명 알고리즘의 두 부분으로 구성&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1669450092852&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
&quot;alg&quot; :&quot;HS256&quot;,
&quot;typ&quot;: &quot;JWT&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;--&amp;gt;&amp;nbsp; Base64Url encoded&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;Payload - 클&lt;span style=&quot;background-color: #ffffff;&quot;&gt;레임은 엔티티(일반적으로 사용자) 및 추가 데이터에 대한 진술입니다. 청구에는 등록 청구, 공개 청구, 비공개 청구의 세 가지 유형&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;- Registered claims&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;- Public claims&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;- Private claims&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1669450502413&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
&quot;sub&quot;:&quot;1234567&quot;,
&quot;name&quot;:&quot;John&quot;,
&quot;admin&quot;:true
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Signature - &lt;span style=&quot;background-color: #ffffff;&quot;&gt;인코딩된 헤더, 인코딩된 페이로드, 암호, 헤더에 지정된 알고리즘을 가져와서 서명&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1669450556995&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HMACSHA256(
  base64UrlEncode(header) + &quot;.&quot; +
  base64UrlEncode(payload),
  secret)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/123</guid>
      <comments>https://backend-na.tistory.com/123#entry123comment</comments>
      <pubDate>Sat, 26 Nov 2022 17:16:15 +0900</pubDate>
    </item>
    <item>
      <title>[2] AWS RDS 프리티어 생성 및 MySQL 연결 ( MySQL 협업 혹은 팀 프로젝트 데이터베이스 공용 사용)</title>
      <link>https://backend-na.tistory.com/122</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.정상적으로 생성이 되었다면 사용가능 상태로 나온다&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2558&quot; data-origin-height=&quot;1268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGj7zx/btrMN8iT85P/axLRLVJbmfjIpOBnwBrPr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGj7zx/btrMN8iT85P/axLRLVJbmfjIpOBnwBrPr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGj7zx/btrMN8iT85P/axLRLVJbmfjIpOBnwBrPr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGj7zx%2FbtrMN8iT85P%2FaxLRLVJbmfjIpOBnwBrPr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2558&quot; height=&quot;1268&quot; data-origin-width=&quot;2558&quot; data-origin-height=&quot;1268&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;h3 data-ke-size=&quot;size23&quot;&gt;2.식별자 이름을 클릭하면&amp;nbsp; , 방금 생성된 나의 데이터베이스 정보를 볼 수 있다. 여기서 엔드포인트가 mysql 연결에 필요하다.&amp;nbsp; &amp;nbsp;여기서 보안에 있는 보안그룹을 선택 한다.&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tquii/btrMN7xxCZw/dc7yH2qi9NSsl0Qt1JvEuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tquii/btrMN7xxCZw/dc7yH2qi9NSsl0Qt1JvEuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tquii/btrMN7xxCZw/dc7yH2qi9NSsl0Qt1JvEuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftquii%2FbtrMN7xxCZw%2Fdc7yH2qi9NSsl0Qt1JvEuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1250&quot; data-origin-width=&quot;2560&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.새로운 보안 그룹을 생선한다&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gt7Uy/btrMNRIuIal/toXBHoeIWyeEKQUMQhfGyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gt7Uy/btrMNRIuIal/toXBHoeIWyeEKQUMQhfGyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gt7Uy/btrMNRIuIal/toXBHoeIWyeEKQUMQhfGyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGt7Uy%2FbtrMNRIuIal%2FtoXBHoeIWyeEKQUMQhfGyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;169&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.보안 규칙을 설정 한다&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1803&quot; data-origin-height=&quot;1255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1FShl/btrMNLaJSIq/fwRIKhw7ntSpHKGFlLU5O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1FShl/btrMNLaJSIq/fwRIKhw7ntSpHKGFlLU5O0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1FShl/btrMNLaJSIq/fwRIKhw7ntSpHKGFlLU5O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1FShl%2FbtrMNLaJSIq%2FfwRIKhw7ntSpHKGFlLU5O0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1803&quot; height=&quot;1255&quot; data-origin-width=&quot;1803&quot; data-origin-height=&quot;1255&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;5. 4번과정 이후 나의 데이터베이스로 돌아온다 -&amp;gt; 이후 데이터 베이스 수정 버튼을 클릭한다&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2523&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lmCnC/btrMNdkZ8EI/VlQiDBLkQGP7BcJczoY8Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lmCnC/btrMNdkZ8EI/VlQiDBLkQGP7BcJczoY8Ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lmCnC/btrMNdkZ8EI/VlQiDBLkQGP7BcJczoY8Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlmCnC%2FbtrMNdkZ8EI%2FVlQiDBLkQGP7BcJczoY8Ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2523&quot; height=&quot;443&quot; data-origin-width=&quot;2523&quot; data-origin-height=&quot;443&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;6. 스크롤을 내려서&amp;nbsp; 보안 그룹에서 내가 새롭게 만든 보안 규칙을 선택한다.&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMI2ph/btrMMjTlokn/j4DpsmfH0kY3wfoS7sV921/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMI2ph/btrMMjTlokn/j4DpsmfH0kY3wfoS7sV921/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMI2ph/btrMMjTlokn/j4DpsmfH0kY3wfoS7sV921/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMI2ph%2FbtrMMjTlokn%2Fj4DpsmfH0kY3wfoS7sV921%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;992&quot; height=&quot;505&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;505&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;7.밑으로 내려가 저장을 누르면&amp;nbsp; -&amp;gt;&amp;nbsp; 화면이 뜨는데&amp;nbsp; 수정예약에서 즉시 적용을 누르고 DB인스턴수 수정을 누른다 .&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cG47eA/btrMJZ87E62/VCt6SoZC9ZxpMf7gr41etk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cG47eA/btrMJZ87E62/VCt6SoZC9ZxpMf7gr41etk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cG47eA/btrMJZ87E62/VCt6SoZC9ZxpMf7gr41etk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcG47eA%2FbtrMJZ87E62%2FVCt6SoZC9ZxpMf7gr41etk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1064&quot; height=&quot;680&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;8.기본적인 설정은 완료되었으며 이제&amp;nbsp; -&amp;gt; mysql workbench에서 추가적인 설정을 해야 한다 .&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;1091&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwtiDp/btrMMljmjpF/np6opkAnXD3RVED3L1iuE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwtiDp/btrMMljmjpF/np6opkAnXD3RVED3L1iuE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwtiDp/btrMMljmjpF/np6opkAnXD3RVED3L1iuE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwtiDp%2FbtrMMljmjpF%2Fnp6opkAnXD3RVED3L1iuE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1283&quot; height=&quot;1091&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;1091&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;--&amp;gt; HostName은 아까&amp;nbsp; 2번 과정에서&amp;nbsp; 말한 엔드포인트 를 입력하면 되고 ,&amp;nbsp; userName은 마스터 계정 ,&amp;nbsp; password는 마스터 암호를 누르고 - &amp;gt;TestConnection을 누르면 완료된다.&lt;/h3&gt;</description>
      <category>AWS</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/122</guid>
      <comments>https://backend-na.tistory.com/122#entry122comment</comments>
      <pubDate>Sat, 24 Sep 2022 20:59:14 +0900</pubDate>
    </item>
    <item>
      <title>[1] AWS RDS 프리티어 생성 및 MySQL 연결 ( MySQL 협업 혹은 팀 프로젝트 데이터베이스 공용 사용)</title>
      <link>https://backend-na.tistory.com/121</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;2022.09.22일 기준으로 작성된 게시글 입니다.&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프리티어 버전을 위한 사항으로 과금이 되지 않게 주의 해야 합니다.&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&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;1. AWS 계정 가입이 선행 되어야 합니다.&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.AWS 로그인을 한뒤&amp;nbsp; -&amp;gt;서비스 -&amp;gt; 데이터베이스 -&amp;gt;RDS 클릭&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;1264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQcsal/btrMNVqqJb2/2hE1AgUAE5i0E0SRHa5Ggk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQcsal/btrMNVqqJb2/2hE1AgUAE5i0E0SRHa5Ggk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQcsal/btrMNVqqJb2/2hE1AgUAE5i0E0SRHa5Ggk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQcsal%2FbtrMNVqqJb2%2F2hE1AgUAE5i0E0SRHa5Ggk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1264&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;1264&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;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.왼쪽의 메뉴에서 데이터베이스를 누르고 - &amp;gt; 가운데의 데이터 베이스 생성을 누른다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1281&quot; data-origin-height=&quot;1299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oakkE/btrMKtIOpUZ/2IARVUzS3qKDXKxu45kOfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oakkE/btrMKtIOpUZ/2IARVUzS3qKDXKxu45kOfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oakkE/btrMKtIOpUZ/2IARVUzS3qKDXKxu45kOfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoakkE%2FbtrMKtIOpUZ%2F2IARVUzS3qKDXKxu45kOfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1281&quot; height=&quot;1299&quot; data-origin-width=&quot;1281&quot; data-origin-height=&quot;1299&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;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.데이터베이스 생성 방식 선택에서 기본값인 표준 생성으로 선택 -&amp;gt; 엔진 옵션에서 MySQL을 선택 -&amp;gt;MySQL 버전을 본인의 환경에 맞게 설정한다 .&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1047&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cemC75/btrMOat7qja/NEFkqg3cKl9ub4CuEVax00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cemC75/btrMOat7qja/NEFkqg3cKl9ub4CuEVax00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cemC75/btrMOat7qja/NEFkqg3cKl9ub4CuEVax00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcemC75%2FbtrMOat7qja%2FNEFkqg3cKl9ub4CuEVax00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;1047&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1047&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;5.무료로 사용하기 위해 템플릿에서 프리티어를 선택한다 -&amp;gt; 설정에서 DB인스턴스 식별자는 필요에따라 새롭게 작성하고 , 자격 증명 설정에서 마스터 사용자 이름과 마스터 암호를 설정해야한다 .&amp;nbsp; 마스터 사용자 이름과 , 마스터 암호는 잊어버리지 않게 해야 한다 .&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ucDtx/btrMJPk0vvl/kHBcemzZ39jLXk8GsHVdR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ucDtx/btrMJPk0vvl/kHBcemzZ39jLXk8GsHVdR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ucDtx/btrMJPk0vvl/kHBcemzZ39jLXk8GsHVdR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FucDtx%2FbtrMJPk0vvl%2FkHBcemzZ39jLXk8GsHVdR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1275&quot; height=&quot;914&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;914&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;6.인스턴스 구성은, 앞선 과정에서 프리티어를 선택한다면 바꿀 필요가 없다 .&amp;nbsp; &amp;nbsp;-&amp;gt; 그리고 스토리지에서&amp;nbsp; 스토리지 자동조정활성화를&amp;nbsp; 비활성화 상태로 두는 이유는 혹시라도 나중에 과금되지 않게 하기 위함이다!&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1300&quot; data-origin-height=&quot;924&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cluse/btrMNdSIM2G/KiuEikKIe8WTjxqKtWug5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cluse/btrMNdSIM2G/KiuEikKIe8WTjxqKtWug5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cluse/btrMNdSIM2G/KiuEikKIe8WTjxqKtWug5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCluse%2FbtrMNdSIM2G%2FKiuEikKIe8WTjxqKtWug5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1300&quot; height=&quot;924&quot; data-origin-width=&quot;1300&quot; data-origin-height=&quot;924&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;7. 연결에서 퍼블릭 액세스를&amp;nbsp; '&amp;nbsp; 예&amp;nbsp; ' 로 설정해야 외부에서 접속이 가능하다.&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;1089&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TdYiK/btrMN7KZosi/pSsOjFsq9ULkKn1E3GLT8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TdYiK/btrMN7KZosi/pSsOjFsq9ULkKn1E3GLT8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TdYiK/btrMN7KZosi/pSsOjFsq9ULkKn1E3GLT8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTdYiK%2FbtrMN7KZosi%2FpSsOjFsq9ULkKn1E3GLT8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1089&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;1089&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;h3 data-ke-size=&quot;size23&quot;&gt;8.설정 바꿀 필요 없이 데이터 베이스 생성 버튼을 클릭하면 됩니다. 약간의 대기시간이 필요합니다 5~10분정도 걸립니다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;1068&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uzFTv/btrMK07qhP6/P9KEeLjsgiQHmk1wYTVns1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uzFTv/btrMK07qhP6/P9KEeLjsgiQHmk1wYTVns1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uzFTv/btrMK07qhP6/P9KEeLjsgiQHmk1wYTVns1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuzFTv%2FbtrMK07qhP6%2FP9KEeLjsgiQHmk1wYTVns1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1068&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;1068&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;9.생성중 입니다&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYI0cZ/btrMNT7jvnz/jTQKkiihBgUDokNqYKOOh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYI0cZ/btrMNT7jvnz/jTQKkiihBgUDokNqYKOOh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYI0cZ/btrMNT7jvnz/jTQKkiihBgUDokNqYKOOh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYI0cZ%2FbtrMNT7jvnz%2FjTQKkiihBgUDokNqYKOOh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1261&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1261&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>AWS</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/121</guid>
      <comments>https://backend-na.tistory.com/121#entry121comment</comments>
      <pubDate>Thu, 22 Sep 2022 14:41:50 +0900</pubDate>
    </item>
    <item>
      <title>2022_07_12_Algorithm</title>
      <link>https://backend-na.tistory.com/120</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;개선된 정렬 알고리즘&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;퀵 정렬 : 분할 알고리즘을 기본으로 하며 nlogn의 시간 복잡도를 갖음&lt;/li&gt;
&lt;li&gt;병합 정렬 : 분할 정복 방식을 사용해 데이터를 분할하고 집합을 정렬하며 합치는 알고리즘&lt;/li&gt;
&lt;li&gt;기수 정렬 : 값을 놓고 비교할 자릿수를 정한 다음 해당 자릿수만 비교 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;병합 정렬 과정&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;집합을 2개씩의 그룹으로 지속적으로 분할합니다. 예를 들면 8개 요소가 있는 배열이면 2개씩 4그룹으로 나누어 오름차순정렬합니다.&lt;/li&gt;
&lt;li&gt;투 포인터 알고리즘을 이용하여 왼쪽, 오른쪽 그룹을 병합합니다. 왼쪽 포인터와 오른쪽 포인터의 값을 비교하여 작은 값을 결과 배열에 추가하며 추가한 쪽의 포인터를 이동합니다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/120</guid>
      <comments>https://backend-na.tistory.com/120#entry120comment</comments>
      <pubDate>Tue, 12 Jul 2022 17:16:30 +0900</pubDate>
    </item>
    <item>
      <title>2022_07_11_자료구조</title>
      <link>https://backend-na.tistory.com/119</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;알고리즘 선택의 기준이 되는 시간 복잡도 유형&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빅 오메가 : 최선일 때 연산 횟수를 나타내는 표기법&lt;/li&gt;
&lt;li&gt;빅 세타 : 보통일 때 연산 횟수를 나타낸 표기법&lt;/li&gt;
&lt;li&gt;빅 오 : 최악일 때 연산 횟수를 나타낸 표기법&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;빅 오 표기법&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;버블 정렬&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;선택 정렬 : 버블 정렬의 자리 바꿈 횟수를 줄임으로써 성능을 개선한 알고리즘&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;남은 정렬 부분에서 최소값을 찾느다&lt;/li&gt;
&lt;li&gt;남은 정렬 부분에서 가장 아펭 있는 데이터와 최소값을 swap 한다&lt;/li&gt;
&lt;li&gt;가장 앞에 있는 데이터를 다음 위치로 이동하여 범위를 축소한다&lt;/li&gt;
&lt;li&gt;남은 정렬 부분이 없을 때까지 반복한다&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;삽입 정렬 :기본 정렬 중 가장 큰 효율성을 갖음( 버블,선택 보다 더 빠름) , 정렬이 조금 되어있는 배열에서 고 효율&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 index에 있는 데이터를 선택한다&lt;/li&gt;
&lt;li&gt;현재 선택한 데이터가 정렬 범위 내에 삽입될 위치를 탐색한다&lt;/li&gt;
&lt;li&gt;삽입 위치부터 index위치까지 shift연산을 수행한다&lt;/li&gt;
&lt;li&gt;삽입 위치 현재 데이터를 삽입하고 index를 증가시킨다&lt;/li&gt;
&lt;li&gt;선택할 데이터가 없을 때까지 반복한다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/119</guid>
      <comments>https://backend-na.tistory.com/119#entry119comment</comments>
      <pubDate>Mon, 11 Jul 2022 16:57:49 +0900</pubDate>
    </item>
    <item>
      <title>2022_07_08_Git</title>
      <link>https://backend-na.tistory.com/118</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1265&quot; data-origin-height=&quot;1235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ei26i8/btrGPnNQ4BA/mIpcGaWU8B6sKFcmqLNtCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ei26i8/btrGPnNQ4BA/mIpcGaWU8B6sKFcmqLNtCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ei26i8/btrGPnNQ4BA/mIpcGaWU8B6sKFcmqLNtCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fei26i8%2FbtrGPnNQ4BA%2FmIpcGaWU8B6sKFcmqLNtCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1265&quot; height=&quot;1235&quot; data-origin-width=&quot;1265&quot; data-origin-height=&quot;1235&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;997&quot; data-origin-height=&quot;783&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kAWo8/btrGPIDXLNi/M9LELbE99A5TCTAfMlFJKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kAWo8/btrGPIDXLNi/M9LELbE99A5TCTAfMlFJKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kAWo8/btrGPIDXLNi/M9LELbE99A5TCTAfMlFJKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkAWo8%2FbtrGPIDXLNi%2FM9LELbE99A5TCTAfMlFJKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;997&quot; height=&quot;783&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;783&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/118</guid>
      <comments>https://backend-na.tistory.com/118#entry118comment</comments>
      <pubDate>Fri, 8 Jul 2022 16:52:18 +0900</pubDate>
    </item>
    <item>
      <title>2022_07_07_Python_7일</title>
      <link>https://backend-na.tistory.com/117</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;파이썬 라이브러리 설치&lt;/h2&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;985&quot; data-origin-height=&quot;840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p28tJ/btrGKqpLyXt/Jw5ifHp7xK5S0JlcWpX6U0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p28tJ/btrGKqpLyXt/Jw5ifHp7xK5S0JlcWpX6U0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p28tJ/btrGKqpLyXt/Jw5ifHp7xK5S0JlcWpX6U0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp28tJ%2FbtrGKqpLyXt%2FJw5ifHp7xK5S0JlcWpX6U0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;985&quot; height=&quot;840&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;exe 실행파일 만들기 위한 라이브러리 설치&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;1270&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yiDk6/btrGKSsMXRH/R04KIwaJYF1RIcQ1Pofz00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yiDk6/btrGKSsMXRH/R04KIwaJYF1RIcQ1Pofz00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yiDk6/btrGKSsMXRH/R04KIwaJYF1RIcQ1Pofz00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyiDk6%2FbtrGKSsMXRH%2FR04KIwaJYF1RIcQ1Pofz00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;422&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/117</guid>
      <comments>https://backend-na.tistory.com/117#entry117comment</comments>
      <pubDate>Thu, 7 Jul 2022 16:53:45 +0900</pubDate>
    </item>
    <item>
      <title>2022_07_06_Python_7일</title>
      <link>https://backend-na.tistory.com/116</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AXx1K/btrGEyoggJN/Jv2n4qJ9Hj4RYxHbgtVk7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AXx1K/btrGEyoggJN/Jv2n4qJ9Hj4RYxHbgtVk7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AXx1K/btrGEyoggJN/Jv2n4qJ9Hj4RYxHbgtVk7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAXx1K%2FbtrGEyoggJN%2FJv2n4qJ9Hj4RYxHbgtVk7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;956&quot; height=&quot;508&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #545454;&quot;&gt;with문을 사용하면 with블록을 벗언나는 순간 &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #545454;&quot;&gt;객체가 자동으로 해제됩니다.(자바의 try with resource과 비슷한 문법)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #545454;&quot;&gt;-with 작성 시 사용할 갹체의 이름을 as뒤에 작성해 줍니다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;----&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #545454;&quot;&gt;표준 모듈 codecs &lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #545454;&quot;&gt;-웹이나 다른 프로그램의 텍스트 데이터와 &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #545454;&quot;&gt;파이썬 내부의 텍스트 데이터의 인코딩 방식이 서로 다를 경우&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #545454;&quot;&gt;내장함수 open()이 제대로 인코딩을 적용할 수 없어서 에러가 발생 (UnicodeEncodeError 발생)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #545454;&quot;&gt;-파일 입/출력시 인코딩 코덱을 변경하고 싶다면&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #545454;&quot;&gt;codecs 모듈을 사용합니다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/116</guid>
      <comments>https://backend-na.tistory.com/116#entry116comment</comments>
      <pubDate>Wed, 6 Jul 2022 16:54:02 +0900</pubDate>
    </item>
    <item>
      <title>2022_07_05_Python_5</title>
      <link>https://backend-na.tistory.com/115</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;513&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UHR4r/btrGzOdrI63/eIgqW6YdLstIkgkyPmyJTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UHR4r/btrGzOdrI63/eIgqW6YdLstIkgkyPmyJTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UHR4r/btrGzOdrI63/eIgqW6YdLstIkgkyPmyJTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUHR4r%2FbtrGzOdrI63%2FeIgqW6YdLstIkgkyPmyJTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;981&quot; height=&quot;513&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;513&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0oBFn/btrGzvSJ5mb/S6EiKj3q3ZDdcSmHjkscgK/img.png&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/115</guid>
      <comments>https://backend-na.tistory.com/115#entry115comment</comments>
      <pubDate>Tue, 5 Jul 2022 18:09:15 +0900</pubDate>
    </item>
    <item>
      <title>2022_07_04_Python_4일</title>
      <link>https://backend-na.tistory.com/114</link>
      <description>&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;set

빈 set자료형 선언  : set()

a={'a','b','c'}
b={'z','x'}
a.add('d')
a.remove('b')
a.upadte(b)

연산
합집합 : |
교집합 : &amp;amp;
차집합 : -
배타적 차집합 : ^
부분 집합 : &amp;lt;=

&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;함수

def ex_aa(a,b,c):
	print(a,b,c)

ex_aa('a','b','c')

n1,n2,n3=map(int,input('3개 입력 :').split())

re=list(map(int,input('입력 : ').split()))

def aa(begin,end,step=1):
print(aa(1,2))  ## OK
print(aa(1,2,3) ## OK

def calc_sum(end,begin=0,step=1): 
    sum=0
    for n in range(begin,end+1,step):
        sum+=n
    return sum

print(calc_sum(100))  ##OK
print(calc_sum(begin=10,step=5,end=1)  ##OK
print(calc_sum(20,step=3,begin=10))  ## OK 

def calc_total(*nums):
    #print(type(nums))  type-&amp;gt;tuple
    total=0
    for n in nums:
        total+=n
    return total

print(calc_total(5,7,32,2,1,35,4,68,4354,65,1231,56,789615,340564036,2156164))
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/114</guid>
      <comments>https://backend-na.tistory.com/114#entry114comment</comments>
      <pubDate>Mon, 4 Jul 2022 17:12:41 +0900</pubDate>
    </item>
    <item>
      <title>2022_07_01_Python_3일</title>
      <link>https://backend-na.tistory.com/113</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수- 모듈 내부에서 공용적으로 사용할 수 있는 기능의 집합(단독 호출 가능)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파이썬은 각각의 데이터 타입으로 된 내장 함수를 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메서드- 클래스에 소속된 함수로 ,특정 자료형에서만 사용 가능한 함수&lt;/h3&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;# 함수 
len() 
del()

&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;# 문자열 메서드
a='abca d | ef'

a.find('a')
a.rfind('a')
a.count('a')

in 키워드 :True or False

'a' in a
'b' not in a

a.isdecimal()
a.isalpha()
a.islower()
a.isupper()

a.replace('기존문자열','대체할 문자열')
a.replace('기존문자열','대체할 문자열',개수)

a.split() # 공백을 기준으로 분할  [ ' ' , ' ' ,...]
a.split(' | ')

a.strip()
a.rstrip()
a.lstrip()

a.lower()
a.upper()
a.swapcase()
a.capitalize()
a.title()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;#list
a=[]
a=list()

a=[1,2,3,'a','b','c']

a.append(value)
a.insert(index,value)

a.remove(value)

del(a[index])

a.clear()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;#dict

d={}
d=dict()

d={'key':'value'}
students={'멍멍이':'김철수','야옹이':'박영희','쨱짹이':'홍길동'}

print(students['멍멍이'])

students['김']='검'

stduents['멍멍이']='김수철'

students.keys()
students.values()

del(students['멍멍이'])

&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;#tuple

p=(1,2,3,4,5,6)
p=1,2,3,4,5,6

&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;numbers - int , float ,complex ,boolean&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;sequence - str,list,tuple&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;map - dict&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;set&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;none&lt;/h3&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/113</guid>
      <comments>https://backend-na.tistory.com/113#entry113comment</comments>
      <pubDate>Fri, 1 Jul 2022 17:12:32 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_30_Python_2일</title>
      <link>https://backend-na.tistory.com/112</link>
      <description>&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;number 

#정수형 
a=123 , b2=0b101 ,c8=0o101 ,d16=0xAC00 

#실수형
a=12.53 ,b=9.8e2 ,c=9.2e-2

#복소수
a=1+2j

입력 
input() : 입력의 리턴은 str 

&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문자열&lt;/h3&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;#'' , &quot;&quot;로 감싸지만 , 관례 ' ' 

file1='C:\\\\temp\\\\new.jpg'  # \\\\두개 써서 탈출문자적용 안됨

#문장 주석 개념 없지만 ,
''' '''로 문장주석 대체하여 사용하고 , &quot;&quot;&quot; &quot;&quot;&quot; 여러줄 문장 선언시 사용

문자열 연산
파이썬은 문자열의 덧셈 , 곱셈 연산을 지원
-덧셈 연산은 문자열을 서로 연결하여 결합
'''
s3='오늘 저녁은 '
s4='치킨입니다.'
print(s3+s4+'와 맛있겠다~!')

'''
파이썬은 문자열의 곱셉 연산 지원
-곱셉 연사자(*)로 문자열을 정해진 수 만큼 반복해서 연결
'''
print('배고파'*4)
print('-'*30)

#print(s3*1.7) XXX 횟수를 정해주는것이기 때문에 실수는 안되고 정수만 가능 
#print(s3*s4)  XXX 문자열 끼리 곱할수 없다.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;반복문&lt;/h3&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;for 제어변수 in 시퀀스자료형:

range(begin,end,step)

#while문에 필요한 3요소  : 제어변수(begin) , 조건식 (end) , 증감식( step)
i=1 #begin
total=0

while i&amp;lt;=10: #end
    total+=i
    i+=1  #파이썬은 증감연산자 없습니다.

&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제어문&lt;/h3&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;if 괄호없이조건식 :
	수행문
elif 괄호없이조건식:
	수행문
else:
	수행문
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;탈출문&lt;/h3&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;탈출문(흐름 제어문) -break. continue ,return

break - 현재 반복문을 즉시 종료 시키고 ,반복문을 탈출
-일반적으로는 특정 조건 하에서 반복문을 종료시키기 때문에 
if문과 함께 사용 합니다.

파이썬의 무한루프는 while문으로만 작성하며
for문으로는 구현이 불가능 합니다.

-break가 반복문을 강제로 종료시켰다면, continue는 
이번 반복 1회차만 건너뛰고 ,다음 반복부터는 정상적으로
실해을 계속하게 하는 탈출문 입니다.
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/112</guid>
      <comments>https://backend-na.tistory.com/112#entry112comment</comments>
      <pubDate>Thu, 30 Jun 2022 17:06:46 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_29_Spring_19일</title>
      <link>https://backend-na.tistory.com/111</link>
      <description>&lt;h1&gt;AOP&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Filter : 디스패쳐 서블릿을 거치기 전에 먼저 요청을 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Interceptor : 컨트롤러 전 후로 요청을 처리 ( 메서드 - prehandle -컨트롤러 전 , posthandle -컨트롤러 이후 , &amp;hellip;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AOP : 비지니스 로직에서(메서드)에서 세밀하게 처리(주로 ,컨트롤러나 서비스에서 사용)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AOP(Aspect Oriented Programming) 관점 지향 프로그래밍&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(관점지향프로그래밍) 더욱 객체지향답게 의미를 갖느다&lt;/li&gt;
&lt;li&gt;공통 코드,개별 코드(비지니스 로직)를 분리해서 작성&lt;/li&gt;
&lt;li&gt;java의 공통 기능을 부모클래스로 정의하고 상속 관계로 사용&lt;/li&gt;
&lt;li&gt;기존 코드를 수정하지 않고 , 외부에서 원하는 기능에 접근하여 결합&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AOP 용어&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Target - 개발자가 작성한 Service 클래스&lt;/li&gt;
&lt;li&gt;Joint Point - Target의 메서드&lt;/li&gt;
&lt;li&gt;Advice - 공통 코드(로깅 ,에러처리 등)&lt;/li&gt;
&lt;li&gt;Point Cut - Advice를 어떤 Joint Point에 결합할 것인지 설정( 공통 코드를 어떤 메서드에 적용할지)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Advice 동작 위치&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@Before - 메서드를 호출 전 실행&lt;/li&gt;
&lt;li&gt;@After - 메서드를 호출 후 실행&lt;/li&gt;
&lt;li&gt;@AfterThrowing - 메서드 예외 발생시 동작&lt;/li&gt;
&lt;li&gt;@ Around - 메서드에 결합해서 처리 (before ,after ,afterThrowing 기능 다 합쳐둔것)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/111</guid>
      <comments>https://backend-na.tistory.com/111#entry111comment</comments>
      <pubDate>Wed, 29 Jun 2022 17:17:06 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_28_Spring_18일</title>
      <link>https://backend-na.tistory.com/110</link>
      <description>&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;getListLike(true).done(getList); //getListLike 함수가 끝나면 , getList 함수를 호출하라는 의미  :Deferred객체가 도와줌 
			
			
			//지금 게시판에 들어온 회원의 좋아요 게시물 목록을 받아오는 함수 
function getListLike(isReset){
				let deferred=$.Deferred(); //비동기 방식으로 데이터를 불러올때 , 함수의 순서를 정해주는 함수 - 먼저 실행할곳에 생성 해주면됨
				
				
				console.log('먼저 실행되어야 합니다.'); //getList보다 먼저 실행되어야 함 
				
				const userId='${login.userId}';
				console.log(userId);
				
				if(userId !==''){
					$.ajax({
						type:'post',
						url:'&amp;lt;c:url value=&quot;/snsBoard/listLike&quot; /&amp;gt;',
						data:userId,
						contentType:'application/json',
						success:function(result){
							console.log('result : '+result); //게시글 번호들 (배열의 형태)
							
							if(isReset){
							deferred.resolve(result,page,true); //괄호 안에 전달하고 싶은 값 작성
								
							}else{
								deferred.resolve(result,page,false); //괄호 안에 전달하고 싶은 값 작성
									
							}
						},
						error:function(){
							
						}
						
						
					}); //end ajax
				}else{
					if(isReset){
						deferred.resolve(null,page,true); //괄호 안에 전달하고 싶은 값 작성
							
						}else{
							deferred.resolve(null,page,false); //괄호 안에 전달하고 싶은 값 작성
								
						}
					
				}
				
				return deferred.promise();
			}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;public ResponseEntity&amp;lt;byte[]&amp;gt; download(String fileLoca,String fileName){

File file=new File(&quot;C:\\\\Users\\\\kyungmin\\\\Desktop\\\\upload\\\\&quot;+fileLoca+&quot;\\\\&quot;+fileName);
		
ResponseEntity&amp;lt;byte[]&amp;gt; result=null;

HttpHeaders header=new HttpHeaders();

header.add(&quot;Content-Disposition&quot;, &quot;attachment; filename=&quot;+fileName); //다운로드의 핵심 문장
		try {
			result=new ResponseEntity&amp;lt;&amp;gt;(FileCopyUtils.copyToByteArray(file),header,HttpStatus.OK);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return result;
}
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/110</guid>
      <comments>https://backend-na.tistory.com/110#entry110comment</comments>
      <pubDate>Tue, 28 Jun 2022 17:41:51 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_27_Spring_17일</title>
      <link>https://backend-na.tistory.com/109</link>
      <description>&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;//ajax 폼 전송의 핵심 : form으로 감싸져 있지 않지만, form으로 감싸서 보내기
const formData=new FormData();
formData.append('파라미터명 ', 데이터);

::ajax는 jsp -&amp;gt; controller로 데이터 전달 , String을 리턴받고 
$.ajax({
	url:'',
	type:'',
	data:formData,
	contentType: false, :false로 써야 &amp;lt;input type=&quot;file&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
	processData :false, :false로 써야 변수=값&amp;amp;변수=값 형식으로 변경을 막음 

});

//이벤트 전달
$('~~~').on ('이벤트 종류','전달 대상',function (e) { });

//무한 스크롤
			$(window).scroll(function(){
				//윈도우 (device)의 높이와 현재 스크롤 위치 값을 더한 뒤 , 문서(컨텐츠)의 높이와 비교해서 
				//같다면 로직을 수행
				//문서 높이- 브라우저 창 높이 = 스크롤 창의 끝 높이와 같다면 -&amp;gt; 새로운 내용을 불러오자.
				
				if(Math.round($(window).scrollTop())===$(document).height()-$(window).height()){
					//사용자의 스크롤이 바닥에 닿았을 때 , 페이지 변수의 값을 하나 올리고
					//reset 여부는 false를 주는데, 누적해서 계속 불러오기 때문
					//게시글 몇개씩 불러올지는 페이징 알고리즘에서 정해주면 된다.
					getList(++page,false);
				}
				
				
			});
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/109</guid>
      <comments>https://backend-na.tistory.com/109#entry109comment</comments>
      <pubDate>Mon, 27 Jun 2022 19:23:51 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_24_Srping_16일</title>
      <link>https://backend-na.tistory.com/108</link>
      <description>&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;response.setContentType(&quot;text/html; charset=UTF-8&quot;);
PrintWriter pw=response.getWriter();
pw.print(&quot;&amp;lt;scipt&amp;gt;&quot;);
.....
pw.print(&quot;&amp;lt;/scipt&amp;gt;&quot;);
pw.flush();

&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;lt;fmt :&lt;/h2&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;&amp;lt;%@ taglib uri=&quot;&amp;lt;http://java.sun.com/jsp/jstl/fmt&amp;gt;&quot; prefix=&quot;fmt&quot; %&amp;gt;

&lt;/code&gt;&lt;/pre&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/108</guid>
      <comments>https://backend-na.tistory.com/108#entry108comment</comments>
      <pubDate>Fri, 24 Jun 2022 18:50:16 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_23_Spring_15일</title>
      <link>https://backend-na.tistory.com/107</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;FIlter - 디스패처 서블릿을 거치기 전에 처리&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Interceptor - 컨트롤러 전 후로 요청을 처리&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AOP- 비즈니스 로직에서(메서드)에서 세밀하게 처리&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;&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;1179&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VVYGK/btrFBiMNYL4/36KIWunXkByPuu2zmvE1RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VVYGK/btrFBiMNYL4/36KIWunXkByPuu2zmvE1RK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VVYGK/btrFBiMNYL4/36KIWunXkByPuu2zmvE1RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVVYGK%2FbtrFBiMNYL4%2F36KIWunXkByPuu2zmvE1RK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1179&quot; height=&quot;626&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;public class sampleinterceptor  implements HandlerInterceptor{

//preHandle은 컨트롤러로 들어가기 전 처리해야할 로직을 작성 
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

}

//postHandle 은 컨트롤럴 나갈 때 공통 처리해야할 내용을 작성
@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;bean id=&quot; &quot;   class=&quot;핸들러인터셉터를 구현하는 클래스의 패키지명&quot;&amp;gt;

&amp;lt;mvc:interceptors&amp;gt;
		&amp;lt;mvc:interceptor&amp;gt;
			&amp;lt;mvc:mapping path=&quot;url명&quot; /&amp;gt;
					&amp;lt;ref bean=&quot;bean으로 선언한 id&quot; / &amp;gt;
		&amp;lt;/mvc:interceptor&amp;gt;

	
			&amp;lt;mvc:interceptor&amp;gt;
					&amp;lt;mapping path=&quot;/&quot;/&amp;gt;
					&amp;lt;beans:bean class=&quot;com.spring.mvc.user.commons.interceptor.AutoLoginInterceptor&quot;/&amp;gt;
				&amp;lt;/mvc:interceptor&amp;gt;
	
&amp;lt;/mvc:interceptors&amp;gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/107</guid>
      <comments>https://backend-na.tistory.com/107#entry107comment</comments>
      <pubDate>Thu, 23 Jun 2022 17:53:26 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_22_Spring_14일</title>
      <link>https://backend-na.tistory.com/106</link>
      <description>&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;요청 파라미터 (request)

@RequestMapping(&quot;/param&quot;)
public String param(HttpServletRequest request)

@RequestMapping(&quot;/param&quot;)
public String param(@RequestParam(&quot;id&quot;) String id)
--폼 태그의 name값과 String 변수의 이름이 동일할 때 @RequestParam 생략이 가능하다.

@RequestMapping(&quot;/param&quot;)
public String param(MemberVO vo)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-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>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/106</guid>
      <comments>https://backend-na.tistory.com/106#entry106comment</comments>
      <pubDate>Wed, 22 Jun 2022 22:36:59 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_21_Spring_13일</title>
      <link>https://backend-na.tistory.com/105</link>
      <description>&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;*
	 -MyBatis로 DB연동을 진행할 때 파라미터 값이 2개 이상이라면 
	 그냥 보내면 에러가 발생하기 때문에 조치가 필요함.
	 
	 1.@Param을 이용해서 이름을 붙여주는 방법  (괄호 안에 xml파일에서 해당 값을 지목할 수 있는 이름을 붙인다.)
	 
	 2.Map으로 포장해서 보내는 방법 
	 
	 3.클래스를 디자인해서 객체 하나만 매가값으로 보내는 방법
	 
	 3개 중 하나를 상황에 맞게 적절하게 선택하시면 됩니다.
	 

	 //1번 방법
	//검색 기능이 추가된 게시글 목록 조회 기능            |괄호 안에는 xml에서 사용할 이름 
	List&amp;lt;BoardVO&amp;gt; getArticleList(@Param(&quot;paging&quot;) PageVO paging,
								 @Param(&quot;condition&quot;) String condition,
								 @Param(&quot;keyword&quot;) String keyword);
		//2번 방법
	//검색 기능이 추가된 게시글 목록 조회 기능 
	List&amp;lt;BoardVO&amp;gt; getArticleList(Map&amp;lt;String,Object&amp;gt; data);
	 */
		//3번 방법 
	//검색 기능이 추가된 게시글 목록 조회 기능 
	List&amp;lt;BoardVO&amp;gt; getArticleList(SearchVO search);
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/105</guid>
      <comments>https://backend-na.tistory.com/105#entry105comment</comments>
      <pubDate>Tue, 21 Jun 2022 19:35:38 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_20_Spring_12일</title>
      <link>https://backend-na.tistory.com/104</link>
      <description>&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;long now=System.currentTimeMillis();
			
long regDate=article.getRegDate().getTime();

if(now-regDate &amp;lt;60*60*24*1000) article.setNewMark(true);

--
public String makeURI(int page) {
		UriComponents ucp=UriComponentsBuilder.newInstance().queryParam(&quot;pageNum&quot;, page)
															.queryParam(&quot;cpp&quot;, paging.getCpp())
															.queryParam(&quot;keyword&quot;, paging.getKeyword())
															.queryParam(&quot;condition&quot;, paging.getCondition())
															.build();
		return ucp.toUriString();
		
	}

${pageContext.request.contextPath} == &amp;lt;c:url value='' /&amp;gt;

&amp;lt;form action=&quot;&amp;lt;c:url value='/freeboard/freeList' /&amp;gt;&quot; name=&quot;pageForm&quot;&amp;gt;

&amp;lt;/form&amp;gt;

const form=document.pageForm;

&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;${pageContext.request.contextPath} == &amp;lt;c:url value='' /&amp;gt;

&amp;lt;form action=&quot;&amp;lt;c:url value='/freeboard/freeList' /&amp;gt;&quot; name=&quot;pageForm&quot;&amp;gt;

&amp;lt;/form&amp;gt;

const form=document.pageForm;  ::바닐라자바스크립트
form.태그name.value 

-jquery
$(function(){
	$('form[name=pageForm]'). attr( 'action','&amp;lt;c:url value=&quot;/freeboard &quot; / &amp;gt;' ) 
	$('form[name=pageForm]'). submit(  ) 

	
});




 //const value=e.tragert.dataset.pageNum;  -&amp;gt;바닐라 JS 같은 기능, 다른코드
const value=$(this).data('pagenum');  //-&amp;gt;jQuery&lt;/code&gt;&lt;/pre&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/104</guid>
      <comments>https://backend-na.tistory.com/104#entry104comment</comments>
      <pubDate>Mon, 20 Jun 2022 19:29:05 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_17_Spring_11일</title>
      <link>https://backend-na.tistory.com/103</link>
      <description>&lt;h1&gt;Intercepter&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트롤러 앞(직전)에 위치하고 있어 ,컨트롤러마다 작성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;preHandle() : 컨트롤러 요청을 넘길지 말지 판단 가능 :사용 많다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;postHandle() : 컨트롤러에서 메서드 호출이되고 일처리 다 한 후 응답이 나갈 때 (컨트롤러 처리 잘 진행되었는지 점검 할 때 많이 사용 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;afterCompletion () : 응답 바로 직전에 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;servlet-xml 태그에 &amp;lt;intercepters&amp;gt;태그 추가하거나 , 별도의 xml파일로 만들어 설정도 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:: 결국엔 bean으로 등록시키기 위함이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;extends HandlerInterceptorAdapter :잘 사용 안하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;mdash;&amp;gt;implements HandlerInterceptor : 를 사용 한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lgCi1/btrE21fIEQF/1UmCQRFwbZTdFAtB9I4Tb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lgCi1/btrE21fIEQF/1UmCQRFwbZTdFAtB9I4Tb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lgCi1/btrE21fIEQF/1UmCQRFwbZTdFAtB9I4Tb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlgCi1%2FbtrE21fIEQF%2F1UmCQRFwbZTdFAtB9I4Tb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1186&quot; height=&quot;631&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;631&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sM6Qp/btrE4CyIk3D/p4DdIGYOhlryclt9QNh331/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sM6Qp/btrE4CyIk3D/p4DdIGYOhlryclt9QNh331/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sM6Qp/btrE4CyIk3D/p4DdIGYOhlryclt9QNh331/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsM6Qp%2FbtrE4CyIk3D%2Fp4DdIGYOhlryclt9QNh331%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1194&quot; height=&quot;648&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/103</guid>
      <comments>https://backend-na.tistory.com/103#entry103comment</comments>
      <pubDate>Fri, 17 Jun 2022 18:03:59 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_16_Spring_10일</title>
      <link>https://backend-na.tistory.com/102</link>
      <description>&lt;h1&gt;Spring&lt;/h1&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;&amp;lt;context:component-scan base-package=&quot;com.spring.~~~&quot;/&amp;gt;

--&amp;gt;@Component, @Controller , @Service ,@Repository 이 붙은 클래스를 빈으로 등록 

@RequestMapping(&quot;/spring&quot;) : get, post 둘다 허용 
@RequestMapping(value=&quot;/spring/get&quot;,method=RequestMethod.GET)
@RequestMapping(value=&quot;/spring/post&quot;,method=RequestMethod.POST)

Controller 화면 처리 
public void method() {}   : 요청 URL의 경로를 파일의 이름으로 사용
public String method () { return &quot;re&quot;;} : view폴더 아래 re.jsp 파일로 이동
public String method() { return &quot;redirect:/spring&quot;} : /Spring URL로 요청
@ResposeBody  : 리턴값을 호출한(클라이언트)로 결과 리턴  :비동기 통신

요청 파라미터 처리
public param(HttpServletRequest request)  : int a=request.getParamaeter(&quot;태그 name이름&quot;)
public param(@RequestParam(&quot;태그 name이름&quot;) int a  : 이게 FM이나  태그name과 a가 일치하면 생략
public param (VO v)

Model : 화면에 데이터 전달하기 위한 객체
Model객체   : public param(Model model){  model.addattribute(&quot;key&quot;,&quot;value&quot;) } 

ModelAndVIew객체   :public ModelAndView param() { ModelAndView mv=new ModelAndView();
mv.addObject(&quot;key&quot;,&quot;value&quot;);   mv.setViewName(&quot;이동할 jsp&quot;); reutrn mv;}

@ModelAttribute :public param(@ModelAttribute(num) int test, int year) {}
:화면에 바로 전달

RedirectArrtibutes :public param(RedirectAttribute ra) {   
ra.addFlashAttribute(&quot;key&quot;,&quot;value&quot;)}

root-context.xml 
&amp;lt;mybatis-spring:scan base-package=&quot;com.spring.db.repository&quot;/&amp;gt;
mapper.xml 
DB컬럼명과 객체의 변수명이일치하지 않으면
&amp;lt;resultMap type= &quot;객체 패키지명 &quot; id=&quot;이름&quot;&amp;gt;
	&amp;lt;id property=&quot;변수명&quot; column=&quot;DB컬럼명&quot; /&amp;gt;  :PRIMARY KEY
	&amp;lt;result property=&quot;변수명&quot; column=&quot;DB컬럼명&quot;/&amp;gt;	 :나머지
&amp;lt;/resultMap&amp;gt;

메서드의 리턴타입이 존재할떄 컬럼명과 DB명 일치하지 않아도 상관없으면 ,
&amp;lt; select id=&quot;메서드명&quot;   resultType=&quot;int&quot; &amp;gt; 이런식으로 적는다 

&amp;lt;select id=&quot; &quot;   resultMap=&quot; &quot; &amp;gt;  :상관있으면 resultMa기입

@PathVariable(num) int boardNo :FM  , num과 boardNo의 이름이 동일하면 ()괄호 생략가능
@GetMapping(&quot;/content/{boardNo}&quot;)   // /content/{boardNo} 의 URL로 요청이 들어온다는 의미(이름은 아무렇게나 지어도 된다)
public String content(@PathVariable int boardNo, Model model, 
			@ModelAttribute(&quot;p&quot;) SearchVO search) {

param(@RequestBody VO v) : JSON데이터를 자바VO클래스 로 변환&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Session&lt;/h2&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;//서버에서 세션 객체를 얻는 방법
1.HttpServlerRequest 객체 사용    메서드의 매개변수로
public pram(HttpServletRequest request)
HttpSession session=request.getSession();  //JSP에서 사용하던 방법
session.setAttribute
///기존의 스프링메서드를 오버라이딩하는 경우가 생길 수 있어 , 이 방법을 알아둬야 한다 !!!!!!!!!!!!!!
		
//2.매가 값으로 HttpSession session 객체 받아서 사용 
public param(HttpSession session)
session.setAttribute&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;암호화&lt;/h2&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;BCryptPasswordEncoder encoder=new BCryptPasswordEncoder();
String securePw=encoder.encode(user.getPassword());
System.out.println(&quot;암호화 후 비밀번호 : &quot;+securePw);
		
user.setPassword(securePw);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/102</guid>
      <comments>https://backend-na.tistory.com/102#entry102comment</comments>
      <pubDate>Thu, 16 Jun 2022 22:46:46 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_15_Srping_9일</title>
      <link>https://backend-na.tistory.com/101</link>
      <description>&lt;h1&gt;Rest API&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;@RestController&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기존의 @Coontroller는 return 에 Model 담아서 JSP에 전달하는 방식 @RestController은 return에 처리하는 데이터를 조금 다른 타입으로 처리 , 객체 (데이터)를 반환할 수 있고, 객체(데이터)를 받을 수 있다.&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비동기 요청 전용 컨트롤러 라고 생각하면 됩니다&lt;/li&gt;
&lt;li&gt;RequestMapping으로 들어오는 요청을 받아들이는 것은 동일하지만 return의 결과는 뷰리졸버가 아니라 요청한 화면으로 리턴됩니다&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/101</guid>
      <comments>https://backend-na.tistory.com/101#entry101comment</comments>
      <pubDate>Wed, 15 Jun 2022 18:57:49 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_14_Spring_8일</title>
      <link>https://backend-na.tistory.com/100</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;***&amp;nbsp;페이징&amp;nbsp;알고리즘&amp;nbsp;만들기&amp;nbsp;*** &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;1.&amp;nbsp;총&amp;nbsp;게시물의&amp;nbsp;수를&amp;nbsp;조회해야&amp;nbsp;합니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;총&amp;nbsp;게시물&amp;nbsp;수는&amp;nbsp;DB로부터&amp;nbsp;수를&amp;nbsp;조회하는&amp;nbsp;SQL문&amp;nbsp;작성. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;2.&amp;nbsp;사용자가&amp;nbsp;현재&amp;nbsp;위치한&amp;nbsp;페이지를&amp;nbsp;기준으로 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;끝&amp;nbsp;페이지&amp;nbsp;번호를&amp;nbsp;계산하는&amp;nbsp;로직&amp;nbsp;작성. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;만약&amp;nbsp;현재&amp;nbsp;사용자가&amp;nbsp;보고&amp;nbsp;있는&amp;nbsp;페이지가&amp;nbsp;3페이지고, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;한&amp;nbsp;화면에&amp;nbsp;보여줄&amp;nbsp;페이지&amp;nbsp;버튼이&amp;nbsp;10개씩이면?&amp;nbsp;-&amp;gt;&amp;nbsp;10페이지. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;공식:&amp;nbsp;Math.ceil(현재&amp;nbsp;위치한&amp;nbsp;페이지&amp;nbsp;번호&amp;nbsp;/&amp;nbsp;페이지&amp;nbsp;버튼&amp;nbsp;개수)&amp;nbsp;*&amp;nbsp;페이지&amp;nbsp;버튼&amp;nbsp;개수 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;3.&amp;nbsp;시작페이지&amp;nbsp;번호&amp;nbsp;구하기 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;공식:&amp;nbsp;(끝&amp;nbsp;페이지&amp;nbsp;번호&amp;nbsp;-&amp;nbsp;페이지&amp;nbsp;버튼&amp;nbsp;개수)&amp;nbsp;+&amp;nbsp;1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;4.&amp;nbsp;이전&amp;nbsp;버튼&amp;nbsp;활성&amp;nbsp;여부 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;공식:&amp;nbsp;시작페이지가&amp;nbsp;1이면&amp;nbsp;비활성,&amp;nbsp;나머지는&amp;nbsp;모두&amp;nbsp;활성. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;5.&amp;nbsp;다음&amp;nbsp;버튼&amp;nbsp;활성&amp;nbsp;여부 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;공식:&amp;nbsp;보정&amp;nbsp;전&amp;nbsp;끝&amp;nbsp;페이지&amp;nbsp;번호&amp;nbsp;*&amp;nbsp;한&amp;nbsp;페이지에&amp;nbsp;들어갈&amp;nbsp;게시물의&amp;nbsp;수&amp;nbsp;&amp;gt;=&amp;nbsp;총&amp;nbsp;게시물&amp;nbsp;수 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt;&amp;nbsp;비활성. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;6.&amp;nbsp;끝&amp;nbsp;페이지&amp;nbsp;값&amp;nbsp;보정 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;다음&amp;nbsp;버튼이&amp;nbsp;비활성화&amp;nbsp;되었을&amp;nbsp;때&amp;nbsp;사용.&amp;nbsp;(필요없는&amp;nbsp;버튼을&amp;nbsp;제거하는&amp;nbsp;용도로) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;공식:&amp;nbsp;Math.ceil(총&amp;nbsp;게시물&amp;nbsp;수&amp;nbsp;/&amp;nbsp;한&amp;nbsp;페이지에&amp;nbsp;보여줄&amp;nbsp;게시물&amp;nbsp;수) &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/100</guid>
      <comments>https://backend-na.tistory.com/100#entry100comment</comments>
      <pubDate>Tue, 14 Jun 2022 21:03:25 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_13_Srping_7일</title>
      <link>https://backend-na.tistory.com/99</link>
      <description>&lt;h1&gt;JavaScript vs JQuery&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;JavaScript&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-자바스크립트는 웹 페이지를 동적으로 표현해 주는 언어이다. -ex) 경고창 &amp;amp; 확인창 &amp;amp; drop다운 기능 &amp;amp; 탭 기능 등&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;JQuery&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 자바스크립트를 더 간편하게 사용하게 해주는 자바스크립트 라이브러리 입니다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-Jquery를 사용하면 순수 자바스크립트로 코딩하는 것보다 높은 생산성을 기대할 수 있습니다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Jquery의 장점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-태그를 선택자로 한번에 선택하는 강력한 방법을 제공 -선택자로 선택한 태그를 제어하는 강력한 기능을 제공&lt;/p&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/99</guid>
      <comments>https://backend-na.tistory.com/99#entry99comment</comments>
      <pubDate>Mon, 13 Jun 2022 19:11:03 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_10_Spring_6일</title>
      <link>https://backend-na.tistory.com/98</link>
      <description>&lt;h1&gt;Spring_0610_6일&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MyBatis&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Mapper interface 생성하지만, 이를 구현한 클래스 파일이 대신 xml파일 만듬&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;...Mapper.xml
http://mybatis.org/dtd/mybatis-3-mapper.dtd&amp;gt;&quot;&amp;gt;




-----
I~~Mapper.java  : 
public interface I~~Mapper{
	//일반적인 I~~DAO.java 파일처럼 추상메서드만 선언한다.
	 이를 구현하는것은 클래스가 아닌, xml파일이다.
}

&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;package com.spring.db.repository;

import java.util.List;

import com.spring.db.model.BoardVO;

public interface IBoardMapper {
	
	//게시글 등록
	void insertArticle(BoardVO vo);

	//전체 게시글 목록
	List getArticles();

	//게시글 상세 보기
	BoardVO getArticle(int bId);

	//게시글 삭제
	void deleteArticle(int bId);

	//게시글 수정
	void updateArticle(BoardVO vo);
	
	//게시글 검색
	List searchList(String keyword);

}

-------------------------------------------------------


http://mybatis.org/dtd/mybatis-3-mapper.dtd&amp;gt;&quot;&amp;gt;



	
		
	

	
		INSERT INTO jdbc_board
		VALUES(bid_seq.NEXTVAL,#{writer},#{title},#{content})
		SELECT * FROM jdbc_board
		ORDER BY board_no DESC
	
		SELECT * FROM jdbc_board
		WHERE board_no=#{bId}
	
	
	
		DELETE FROM jdbc_board
		WHERE board_no=#{bId}
	
	
	
		UPDATE jdbc_board SET
		writer=#{writer}, title=#{title}, content=#{content}
		WHERE board_no=#{boardNo}
		SELECT * FROM jdbc_board
		WHERE writer LIKE #{keyword}
	


&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB 테이블 생성 &amp;rarr; VO클래스파일 생성 &amp;rarr; IBoardMpaerr 인터페이스 생성 &amp;rarr;&lt;/p&gt;
&lt;h1&gt;SpringWebMVCProject&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Getter/Setter를 쉽게 만들어 주는 라이브러리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LomBok 라이브러리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 권한으로 cmd 켜야 됌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root-context.xml &amp;mdash;&amp;gt; mvc-config.xml로 이름 바꾸고 namespace 바꿈&lt;/p&gt;
&lt;h1&gt;Spring_0610_6일&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MyBatis&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Mapper interface 생성하지만, 이를 구현한 클래스 파일이 대신 xml파일 만듬&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;...Mapper.xml
http://mybatis.org/dtd/mybatis-3-mapper.dtd&amp;gt;&quot;&amp;gt;




-----
I~~Mapper.java  : 
public interface I~~Mapper{
	//일반적인 I~~DAO.java 파일처럼 추상메서드만 선언한다.
	 이를 구현하는것은 클래스가 아닌, xml파일이다.
}

&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;package com.spring.db.repository;

import java.util.List;

import com.spring.db.model.BoardVO;

public interface IBoardMapper {
	
	//게시글 등록
	void insertArticle(BoardVO vo);

	//전체 게시글 목록
	List getArticles();

	//게시글 상세 보기
	BoardVO getArticle(int bId);

	//게시글 삭제
	void deleteArticle(int bId);

	//게시글 수정
	void updateArticle(BoardVO vo);
	
	//게시글 검색
	List searchList(String keyword);

}

-------------------------------------------------------


http://mybatis.org/dtd/mybatis-3-mapper.dtd&amp;gt;&quot;&amp;gt;



	
		
	

	
		INSERT INTO jdbc_board
		VALUES(bid_seq.NEXTVAL,#{writer},#{title},#{content})
		SELECT * FROM jdbc_board
		ORDER BY board_no DESC
	
		SELECT * FROM jdbc_board
		WHERE board_no=#{bId}
	
	
	
		DELETE FROM jdbc_board
		WHERE board_no=#{bId}
	
	
	
		UPDATE jdbc_board SET
		writer=#{writer}, title=#{title}, content=#{content}
		WHERE board_no=#{boardNo}
		SELECT * FROM jdbc_board
		WHERE writer LIKE #{keyword}
	


&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB 테이블 생성 &amp;rarr; VO클래스파일 생성 &amp;rarr; IBoardMpaerr 인터페이스 생성 &amp;rarr;&lt;/p&gt;
&lt;h1&gt;SpringWebMVCProject&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Getter/Setter를 쉽게 만들어 주는 라이브러리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LomBok 라이브러리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 권한으로 cmd 켜야 됌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root-context.xml &amp;mdash;&amp;gt; mvc-config.xml로 이름 바꾸고 namespace 바꿈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/98</guid>
      <comments>https://backend-na.tistory.com/98#entry98comment</comments>
      <pubDate>Fri, 10 Jun 2022 20:42:16 +0900</pubDate>
    </item>
    <item>
      <title>2022_0609_Spring_5일</title>
      <link>https://backend-na.tistory.com/97</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spring JDBC란? (JdbcTemplate)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JDBC의 장점을 유지하면서, 전통적방식의 JDBC단점을 극복하여, 간결한 형태의 API 사용법을 제공하며 기존 방식에서 지원하지 않는 편리한 기능을 제공&lt;/li&gt;
&lt;li&gt;Spring JDBC는 반복적으로 하는 작업을 대신함 (connection, prepareSatement, resultSet, resultSet의 반복처리, Exception처리)&lt;/li&gt;
&lt;li&gt;Spring JDBC는 SQL에 바인딩할 값을 지정만 해주면 된다.&lt;/li&gt;
&lt;li&gt;Spring JDBC 사용 전 DB커넥션을 가져오는 DataSource가 강제화 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Mybatis&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발자 지정한 SQL, 고급 매핑을 지원하는 프레임 워크&lt;/li&gt;
&lt;li&gt;JDBC 코드와 수동으로 셋팅하는 파라미터와 결과 매핑을 제거&lt;/li&gt;
&lt;li&gt;복잡한 JDBC 코드를 걷어내며 깔끔한 소스코드를 유지&lt;/li&gt;
&lt;li&gt;DAO계층을 대신&lt;/li&gt;
&lt;li&gt;기존의 DAO interface의 구현 클래스를 xml파일이 대신합니다&lt;/li&gt;
&lt;li&gt;스프링에서 사용하려면 MyBatis-Spring module을 다운로드 받아야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;mdash;자바 이외의 파이썬 플라스크 이런곳에서도 사용 가능(xml 파일에 태그형식으로 작성하기 때문)&lt;/p&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/97</guid>
      <comments>https://backend-na.tistory.com/97#entry97comment</comments>
      <pubDate>Thu, 9 Jun 2022 18:42:51 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_08_Spring_4일</title>
      <link>https://backend-na.tistory.com/96</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 MVC 웹 서비스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@Component : 일반적인 컴포넌트로 등록되기 위한 클래스에 사용&lt;/li&gt;
&lt;li&gt;@Contoroller : 컨트롤러 클래스에 사용합니다&lt;/li&gt;
&lt;li&gt;@Service : 서비스 클래스에 사용합니다&lt;/li&gt;
&lt;li&gt;@Repository : DAO 클래스 또는 리포지토리 클래스에 사용 합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;mdash; &amp;lt;context:component-scan base-package=&amp;rdquo; &amp;ldquo; &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;pre id=&quot;code_1654681369394&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;

&amp;lt;a href=&quot;&amp;lt;c:url value='/score/register' /&amp;gt;&quot;   ::기존  &amp;lt;a href=&quot;/basic/score/register&quot;&amp;gt;   
&amp;lt;c:url&amp;gt; 태그가 현재 contextroot를 읽어와서 자동으로 붙여줌&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Srping -JDBC : JDBC의 장점을 유지하면서 전통적방식의 JDBC의 단점을 극복하여 ,간결한 형태의 API 사용법을 제공하며 기존 방식에서 지원하지 않는 편리한 기능을 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/96</guid>
      <comments>https://backend-na.tistory.com/96#entry96comment</comments>
      <pubDate>Wed, 8 Jun 2022 18:45:34 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_07_Spring_3일</title>
      <link>https://backend-na.tistory.com/95</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pom.xml 파일 위치는 C:\Users\user\.m2 : .m2 파일 삭제 후 reload&lt;/li&gt;
&lt;li&gt;servlet-context.xml &amp;lt;context:component-scan base-package=&quot;com.spring.basic&quot; /&amp;gt; 다중 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@Controller
@RequestMapping(&quot;/request&quot;) //컨트롤러 자체에 공통된 URI를 맵핑
public class RequestController{

		//컨트롤러 내의 메서드 타입을 void로 선언하시면 
		//요청이 들어온 URI값을 뷰 리졸버에게 전달합니다
		@GETMapping(&quot;/join&quot;)	 
		public void register(){
		}
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;파라미터 읽기&lt;/h2&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;//1.전통적  jsp/servlet 방식
@PostMapping(&quot;/join&quot;)
	public void register(HttpServletRequest request) {
		request.getParameter(&quot;userId&quot;)
}

//2.@RquestParam( (&quot;userId&quot;) String id )
@PostMapping(&quot;join&quot;)
	public void register(@RequestParam(&quot;userId&quot;) String id,
@RequestParam(value=&quot;hobby&quot;,required = false,defaultValue = &quot;no hobby person&quot;) List&amp;lt;String&amp;gt; hobbies){
//required :해당 파라미터가 필수가 아닌경우 지정  
//defaultValue : required 지정시 기본값을 지정 
}

//3.커맨드 객체를 활용한 파라미터 처리
@PostMapping(&quot;/join&quot;)    
	//UserVO클래스 내부의  변수명과
  //form태그의  내부의  태그들의 name을 일치시켜야 값을 가져옴
	public void regiseter(UserVO user) {
		System.out.println(&quot;ID :&quot;+user.getUserId());
		System.out.println(&quot;PW :&quot;+user.getUserPw());
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Model 객체&lt;/h2&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;//1.Model 객체를 사용하여 화면에 데이터 전송하기
@GetMapping(&quot;/test&quot;) 
	  public void test(@RequestParam(&quot;age&quot;) int age,Model  model) {
	 
	  //모델은 뷰페이지로 자동으로 전달함
	  model.addAttribute(&quot;age&quot;,age);
	  model.addAttribute(&quot;nick&quot;,&quot;멍멍이&quot;); 
}

//2.@ModelAttribute를 사용한 화면에 데이터 전송 처리 
@GetMapping(&quot;/test2&quot;)
	public void test2(@ModelAttribute(&quot;info&quot;) UserVO vo ) {
		//info라는 이름으로 모델에 담는다는 의미 
		System.out.println(&quot;메서드 내의 콘솔 출력 :&quot;+vo);
		
	}

//3.ModelAndVIew 객체를 활용한 처리 
@GetMapping(&quot;/test3&quot;)
	public ModelAndView test3() {
		ModelAndView mv=new ModelAndView();
		mv.addObject(&quot;userName&quot;,&quot;김철수&quot;);   //addAttribute 한것과 같다
		mv.addObject(&quot;userAge&quot;, 30);
		mv.setViewName(&quot;/response/test3&quot;);
		
		return mv;
	}
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/95</guid>
      <comments>https://backend-na.tistory.com/95#entry95comment</comments>
      <pubDate>Tue, 7 Jun 2022 17:37:56 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_03_Spring_2일</title>
      <link>https://backend-na.tistory.com/94</link>
      <description>&lt;h1&gt;빈(Bean)의 범위&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;싱글톤(Singleton)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스프링 컨테이너에서 생성된 빈 객체의 경우 동일한 타입에 대해서는 기본적으로 한 개만 생성이 되며 , getBean() 메소드로 호출될 때 동일한 객체가 반환된다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 하나의 객체를 여러번 사용 : 빈이 등록되면 빈의 범위는 default로 싱글톤&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;&amp;lt;bean id=&quot;&quot; calss=&quot;&quot;/&amp;gt;   == &amp;lt;bean id=&quot;&quot; calss=&quot;&quot; scope=&quot;singleton&quot;/&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로토타입(Prototype)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;싱글톤 범위와 반대의 개념도 있는데 이를 프로토타입(Prototype) 범위라고 한다.프로토타입의 경우 개발자는 별도로 설정을 해줘야 하는데, 스프링 설정 파일에서 빈 (Bean)객체을 정의할 때 scope속성을 명시해 주면 된다. : 호출 할 때마다 새로운 객체 생성 (재활용 XX)&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;&amp;lt;bean id=&quot;&quot; calss=&quot;&quot;  scope=&quot;prototype&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;의존 객체 자동 주입&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 설정 파일에서 의존 객체를 주입할 때 &amp;lt;constructor-org&amp;gt; 또는 &amp;lt;property&amp;gt; 태그로 의존 대상 객체를 명시하지 않아도 스프링 컨테이너 가 자동으로 필요한 의존 대상 객체를 찾아서 의존 대상 객체가 필요한 객체에 주입해 주는 기능이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현 방법은 @Autowired와 @Resource 어노테이션을 이용해서 쉽게 구현할 수 있다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MnBTT/btrDViO6QvN/9CoVBNVKzScFk4AxnLujXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MnBTT/btrDViO6QvN/9CoVBNVKzScFk4AxnLujXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MnBTT/btrDViO6QvN/9CoVBNVKzScFk4AxnLujXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMnBTT%2FbtrDViO6QvN%2F9CoVBNVKzScFk4AxnLujXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;529&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;529&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Spring MVC웹 서비스&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1139&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bR6Ee8/btrDUpItz8u/XRkBMypKHuaeYEorNyYS50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bR6Ee8/btrDUpItz8u/XRkBMypKHuaeYEorNyYS50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bR6Ee8/btrDUpItz8u/XRkBMypKHuaeYEorNyYS50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbR6Ee8%2FbtrDUpItz8u%2FXRkBMypKHuaeYEorNyYS50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1139&quot; height=&quot;620&quot; data-origin-width=&quot;1139&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자의모든요청을DispatcherServlet이 받은후HandlerMapping 객체에Controller 객체검색을요청한다.&lt;/li&gt;
&lt;li&gt;그러면HandlerMapping 객체는프로젝트에존재하는모든Controller 객체를검색한다.&lt;/li&gt;
&lt;li&gt;HandlerMapping 객체가Controller 객체를검색해서DispatcherServlet 객체에알려주면DispatcherServlet 객체는다시HandlerAdapter 객체에사용자의요청에부합하는메소드검색을요청한다.&lt;/li&gt;
&lt;li&gt;그러면HandlerAdapter 객체는사용자의요청 에부합하는메소드를찾아서해당Controller 객체의메소드를실행한다.&lt;/li&gt;
&lt;li&gt;Controller 객체의메소드가실행된후Controller 객체는HandlerAdapter 객체에 ModelAndView 객체를반환하는데ModelAndView 객체에는사용자응답에필요한데이터정보와뷰정보(JSP파일)가담겨있다.&lt;/li&gt;
&lt;li&gt;다음으로HandlerAdapter 객체는ModelAndView 객체를다시DispatcherServlet 객체에반환한다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/94</guid>
      <comments>https://backend-na.tistory.com/94#entry94comment</comments>
      <pubDate>Fri, 3 Jun 2022 17:45:45 +0900</pubDate>
    </item>
    <item>
      <title>2022_06_02_Spring_1일</title>
      <link>https://backend-na.tistory.com/93</link>
      <description>&lt;h1&gt;스프링 프레임 워크&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스프링 프레임워크의 주요 기능 DI , AOP , MVC , JDBC 등을 제공&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;여러 모듈(라이브러리)들이 합쳐져서 하나의 프레임워크를 이룸&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 프레임 워크 특징&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;POJO(Plain Old Java Object &amp;mdash; 순수 자바 객체) 기반의 프레임 워크
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체의 라이프 사이클을 스프링 컨테이너가 직접 관리하며, 스프링 컨테이너로부터 필요한 객체를 가져올 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DI (Dependency Injection) 지원
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 계층이나 서비스 들 사이 또는 객체들 사이에 의존성이 존재할 경우 스프링 프레임 워크가 서로를 연결시켜줍니다. 이는 클래스들 사이에 약한 결합을 가능케 합니다.&lt;/li&gt;
&lt;li&gt;기존에는 객체를 필요에 따라 만들었지만 , 스프링에서는 미리 객체를 만들어 두고 필요에 따라 호출해서 사용( 기존보다 더 자유로워서 약한 결합이다)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AOP (Aspect Oriented Programming) 지원
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;트랜잭션 , 로깅 , 보안 등 여러 모듈에서 공통적으로 지원하는 기능을 분리하여 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;특정 조건에 내가 원하는 코드를 삽입 할 수 있는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;확장성이 높다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스프링 프레임워크의 소스는 모두 라이브러리로 분리 시켜 놓음으로써 필요한 라이브러리만 가져다 쓸 수 있습니다.그리고 많은 외부 라이브러리들도 이미 스프링 프레임 워크와 연동되고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Model2 방식의 MVC Framework 지원&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;h1&gt;Spring DI/IoC&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;JAVA의 Class 상속 /interface를 이용한 추상화를 기반으로 하는 개발 방법 스프링은 di ,ioc를 강력하게 지원하는 프레임워크&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IoC : inversion of Control&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램 제어하는 패턴 중 하나&lt;/li&gt;
&lt;li&gt;DI는 IoC패턴의 구현방법 중 하나&lt;/li&gt;
&lt;li&gt;DI에 따라 프로그램 흐름이 완전히 변경됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DI :Dependency Injection&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스프링 Container에 만들어둔 각종 클래스(bean)들은 서로 의존적이다&lt;/li&gt;
&lt;li&gt;A객체가 B객체 없이 동작이 불가능한 상황&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링은 DI를 기준으로 많은 프레임워크 모듈들이 만들어짐&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxf954/btrDQEj0P5F/DJicmnNDu1to13w9j1yLH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxf954/btrDQEj0P5F/DJicmnNDu1to13w9j1yLH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxf954/btrDQEj0P5F/DJicmnNDu1to13w9j1yLH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbxf954%2FbtrDQEj0P5F%2FDJicmnNDu1to13w9j1yLH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1172&quot; height=&quot;634&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;634&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엄밀히 말하면 property의 name에는 setter메서드에서 set을 뺀 이름을 기입&lt;/p&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/93</guid>
      <comments>https://backend-na.tistory.com/93#entry93comment</comments>
      <pubDate>Thu, 2 Jun 2022 19:03:50 +0900</pubDate>
    </item>
    <item>
      <title>2022_05_31_JS_7일</title>
      <link>https://backend-na.tistory.com/92</link>
      <description>&lt;pre class=&quot;qml&quot;&gt;&lt;code&gt;const $form=document.regForm;// 폼 객체 얻는 방법
$form.id.value // 폼 객체에 접근 

/////////////////////////////////////
날짜 
let date=new Date();// 오늘 날짜를 가진 객체

console.log(date);
console.log(date.getTime());//날짜를 밀리초로 구함
console.log('-----------------------');
const millis=1573735023000;
const today=new Date(millis); 
console.log(today.getTime()); //생성자에 넘겨준 값 그대로나옴
console.log(today);//생성자에 넘겨준 값을 날짜 형태로 변환해서 나옴 

console.log(today.getFullYear()); //년
console.log(today.getMonth()+1); //월
console.log(today.getDate()); //일
console.log(today.getHours());//시
console.log(today.getMinutes());//분
console.log(today.getSeconds());//초

///////
인터벌 
const stop=setInterval(function(){
            console.log(1);
        },500);

        //clearIntervale(정지할 인터벌함수) 는 인터벌을 중지합니다.
        document.querySelector('.stopInterval').onclick=function(){
            clearInterval(stop); //인터벌함수 멈추기
        }

/////
쿠키
//쿠키 생성하기 
    function createCookie(){
        const name=document.getElementById('cookieName').value;
        const value=document.getElementById('cookieValue').value;

        //쿠키의 유효시간 설정 :날짜 객체 필요
        const date=new Date();

        date.setDate(date.getDate()+7);//현재 시간으로부터 7일 뒤 세팅  
        // setSeconds(date.getSeconds()+10) : 10초뒤까지 쿠키 유지
        // setMonth(date.getMonth()+1) //한달까지 쿠키 유지 

        
        //쿠키에 저장할 문자열 생성 : 주의사항 [형식을 반드시 지켜야 한다.] : 이름 +'='+값+';'   고정!! 키=값 ;  
        let cookie='';
        cookie+=name+'='+value+';';  //키=값; 설정 ::세미콜론도 작성해야함  
        cookie+='expires='+date.toUTCString(); // 쿠키의 유효시간 설정 
        
        //쿠키에 저장
        document.cookie=cookie;
    }

    //쿠키 확인하기 
    const $get=document.getElementById('get');
    $get.addEventListener('click',getCookie);

    function getCookie(){
        const find=document.getElementById('cookieFind').value;//찾을 쿠키 이름 
        console.log(document.cookie); //생성된 쿠키 확인 
        const cookies=document.cookie.split(';');
        console.log(cookies);

        let flag=false;
        for(let c of cookies){
            if(c.search(find) !==-1){  //search 메서드는 값을 찾으면 ,찾은 위치를 반환  없으면 -1을 반환 
                console.log(c.replace(find+'=','')); //쿠키의 이름을 지우기 위해 빈 문자열로 대체 
                flag=true;
                break;
            }
        }
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/92</guid>
      <comments>https://backend-na.tistory.com/92#entry92comment</comments>
      <pubDate>Tue, 31 May 2022 22:56:32 +0900</pubDate>
    </item>
    <item>
      <title>2022_05_30_JS_6일</title>
      <link>https://backend-na.tistory.com/91</link>
      <description>&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;

    &amp;lt;style&amp;gt;
        .toggle li {
            display: inline-block;
            padding: 15px 20px 14px;
            width: 25%;
            text-align: center;
            border: 1px solid #333;
            cursor: pointer;
        }
        .toggle-menu {
            display: none;
        }
        .active {
            display: block;
            animation: fadeIn 0.5s ease-in-out;
        }

        @keyframes fadeIn {
            from {
                opacity: 0;
            } to {
                  opacity: 1;
              }
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;ul class=&quot;toggle&quot;&amp;gt;
    &amp;lt;li data-id=&quot;#toggle1&quot;&amp;gt;메뉴1&amp;lt;/li&amp;gt;
    &amp;lt;li data-id=&quot;#toggle2&quot;&amp;gt;메뉴2&amp;lt;/li&amp;gt;
    &amp;lt;li data-id=&quot;#toggle3&quot;&amp;gt;메뉴3&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;div&amp;gt;
    &amp;lt;div class=&quot;toggle-menu active&quot; id=&quot;toggle1&quot;&amp;gt;
        토글메뉴 1
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;toggle-menu&quot; id=&quot;toggle2&quot;&amp;gt;
        토글메뉴 2
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;toggle-menu&quot; id=&quot;toggle3&quot;&amp;gt;
        토글메뉴 3
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
    /*
    1. ul에 이벤트 전파 이용해서 클릭이벤트를 걸고
     클릭되는 타겟의 data-id를 얻습니다.
    2. toggle-menu의 active속성을 삭제
    3. data-id 값에 알맞는 태그에 active속성 추가.
    */

    const $toggle = document.querySelector('.toggle');
    $toggle.onclick = function(e) {
        if(!e.target.matches('.toggle &amp;gt; li')) {
            return;
        }

        const $toggleList = document.querySelectorAll('.toggle-menu');
        for(let $ele of $toggleList) {
            // $ele.classList.toggle('active', '#' + $ele.id === e.target.dataset.id);
            $ele.classList.toggle('active', document.querySelector(e.target.dataset.id) === $ele);
        }

        /*
        for(let i=0; i&amp;lt;$toggleList.length; i++) {
            if($toggleList[i].classList.contains('active')) {
                $toggleList[i].classList.remove('active');
            }
        }

        const target = e.target.dataset.id;
        document.querySelector(target).classList.add('active');
        */
    }

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

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/91</guid>
      <comments>https://backend-na.tistory.com/91#entry91comment</comments>
      <pubDate>Tue, 31 May 2022 09:41:19 +0900</pubDate>
    </item>
    <item>
      <title>2022_05_27_JS_5일</title>
      <link>https://backend-na.tistory.com/90</link>
      <description>&lt;h1&gt;이벤트 기초&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.어트리뷰트 방식&lt;/h2&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;&amp;lt;button id=&quot;btn&quot; onclick=&quot;greeting()&quot; &amp;gt;클릭하세요&amp;lt;/button&amp;gt;

function greeting(){
            alert('안녕하세요!');
        }
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.프로퍼티 방식 : 하나의 요소에 하나의 이벤트 핸들러만 바인당 할 수 있다 .&lt;/h2&gt;
&lt;pre class=&quot;php&quot;&gt;&lt;code&gt;&amp;lt;button id=&quot;btn&quot; &amp;gt;클릭하세요&amp;lt;/button&amp;gt;

function hello(){
            alert('hello!');
        }
$btn.onclick=hello;

$btn.onclick=function(){  // 즉석에서 선언하고 사용
            alert('안녕하세요');
        }

$btn.onclick=()=&amp;gt;alert('안녕~');

&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.addEventListner&lt;/h2&gt;
&lt;pre class=&quot;php&quot;&gt;&lt;code&gt;&amp;lt;button id=&quot;btn&quot;&amp;gt;클릭!&amp;lt;/button&amp;gt;

function hello(){
 alert('hello');
 }

const $btn=document.getElementById('btn');

$btn.addEventListener('click',hello);

$btn.addEventListener('click',function(){
	alert('world!');
});

$btn.addEventListener('click',()=&amp;gt;{
      alert('bye~');
});

//이벤트 핸들러 제거 
$btn.removeEventListener('click',hello);
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;이벤트 객체와 전파&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.이벤트 객체&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;&amp;lt;p&amp;gt;아무곳이나 클릭하세요!&amp;lt;/p&amp;gt;
    &amp;lt;em class=&quot;message&quot;&amp;gt;&amp;lt;/em&amp;gt;

 const $em=document.querySelector('.message');

      
//문서 전체에 이벤트 핸들러 등록  ::파라미터 선언 해 두면 , 이벤트객체가  인자로 들어감
       

//파라미터  e의 이름은 자유롭게 작성 
  //이벤트가 발생하면 이벤트에 대한 다양한 정보가 들어 있는
//이벤트 객체가 동적으로 생성됩니다.
//생성된 이벤트 객체는 이벤트 핸들러의 첫번째 인자로 자동 전달 됩니다.
//어떤 이벤트가 발생했느냐에 따라 그에 맞는 객체가 알아서 전달.
document.addEventListener('click',(e)=&amp;gt;{
 console.log(e);
 $em.textContent=`x :${e.clientX},y:${e.clientY}`;
 });
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.이벤트객체와 프로퍼티&lt;/h2&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;label&amp;gt;
        &amp;lt;input type=&quot;checkbox&quot; &amp;gt;
        &amp;lt;em class=&quot;message&quot;&amp;gt;&amp;lt;/em&amp;gt;
    &amp;lt;/label&amp;gt;
    
    &amp;lt;script&amp;gt;

        const $checkbox=document.querySelector('input[type=checkbox]');
        const $em=document.querySelector('.message');

                                //checkbox의 여부가 바뀌었다면 change를 쓴다
        $checkbox.addEventListener('change',e=&amp;gt;{  //괄호안에 파라미터 한개면 생략 가능
            //실제로 이벤트가 일어난 요소
            //console.log(e.target); // 이건 알아둬야 함!!!!!강사 강조

            $em.textContent=e.target.checked?'체크됨!':'체크안됨!';

        });
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.마우스 이벤트&lt;/h2&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;style&amp;gt;

        .box{
            width: 100px;
            height: 100px;
            background: #fff700;
            border: 5px solid orange;
            position : absolute;
            left: 0;
            top: 0;
        }

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

&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;box&quot;&amp;gt;&amp;lt;/div&amp;gt;
    
    &amp;lt;script&amp;gt;
        
        //드래그 대상 요소 취득
        const $box=document.querySelector('.box');

        //드래그 시작 지점의 마우스 포인터 위치 
        const initialMousePos={
            x:0,
            y:0

        };

        //오프셋 : 이동한 거리 
        const offset={
            x:0,
            y:0
        };

        //이벤트 핸들러 정의
        const move=function(e){
            //오프셋 =
            //현재(드래그 하는 시점)마우스 포인터 좌표에서 드래그 시작 시점의 좌표를 뺀다.
            offset.x=e.clientX-initialMousePos.x;
            offset.y=e.clientY-initialMousePos.y;

            console.log(`x:${offset.x} ,y:${offset.y}`);
            $box.style.left=offset.x+'px';
            $box.style.top=offset.y+'px';

        }

        //mousedown(마우스 버튼을 눌렀을 때) 이벤트가 발생하면
        //드래그 시작지점의 마우스 포인터 좌표를 저장.
        $box.addEventListener('mousedown',function(e){
           
            /*
                이동거리를 계산하기 위해서 mousedown이벤트가 발생(드래그 시작)
                드래그 시작 지점의 마우스 포인터 좌표(cllientX,Y)를 저장해 둔다
                한 번 이상 드래그로 이동한 경우 move에서 left,top만큼 이동한 상태 이므로
                이전의 이동한 거리 offset.x,y만큼 빼 줘야 처음위치(0,0)로 돌아가지 않는다.
            
            */

           
            initialMousePos.x=e.clientX-offset.x;
            initialMousePos.y=e.clientY-offset.y;
            console.log('드래그 시작지점 x:'+initialMousePos.x);
            console.log('드래그 시작지점 y:'+initialMousePos.y);

            //마우스 이동이 시작된다면 , 따로 선언한 move()함수를 호출
            document.addEventListener('mousemove',move);
        }) ;

        //mouseup 이벤트가 발생하면 ,mousemove 이벤트를 제거해서
        //이동을 멈추게 하자 
        document.addEventListener('mouseup',function(){
            document.removeEventListener('mousemove',move);
        });

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

&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4 키보드이벤트&lt;/h2&gt;
&lt;pre class=&quot;xquery&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot;&amp;gt;
    &amp;lt;p class=&quot;msg&quot;&amp;gt;&amp;lt;/p&amp;gt;
    
    &amp;lt;script&amp;gt;

        const $input=document.querySelector('input');
        const $msg=document.querySelector('.msg');

                                //keyup은 누르고 올라올 때를 지정 , 누를 때는 keypress
        $input.addEventListener('keyup',e=&amp;gt;{
            console.log(e.key); //e.target 으로 작성하면 input태그를 지목함 

            if(e.key==='Enter'){
                $msg.textContent=e.target.value;  //e.key라고 하면 Enter가 나와서 ,value로 해야 한다.
                e.target.value='';
            }else if(e.key==='Escape'){
                $msg.textContent='';
            }
        });

    &amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5 이벤트전파1&lt;/h2&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;style&amp;gt;

        #fruits{
            padding: 50px;
            border: 2px solid red;

        }
        #fruits &amp;gt;li{
            background: yellow;
            margin-bottom: 10px;
        }

    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

    &amp;lt;ul id=&quot;fruits&quot;&amp;gt;
        &amp;lt;li&amp;gt;Apple&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Banana&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Grape&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;

    &amp;lt;script&amp;gt;
        const $fruits=document.getElementById('fruits');

        //부모에 이벤트를 걸었이 때문에, li클릭을해도 ul에 이벤트 걸린것으로 인정됨
        $fruits.addEventListener('click',e=&amp;gt;{
            console.log('ul에 클릭 이벤트가 발생!');
            console.log('이벤트 핸들러가 붙은 타겟 :'+e.currentTarget);
            console.log('실제 이벤트가 발생한 요소 :'+e.target);
        });

        $fruits.firstElementChild.addEventListener('click',e=&amp;gt;{
            console.log('apple에 클릭 이벤트가 발생!');

            //이벤트 전파를 중단(버블링 방지) :: 자식요소 이벤트만 발생하고 , 부모의 이벤트 실행을 방지
            //부모와 자식의 이벤트가 같을 때만 버블링이 실행됨
            e.stopPropagation();
        });
    &amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6 이벤트전파2&lt;/h2&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;style&amp;gt;
        #fruits{
            list-style: none;
            padding: 0;

        }

        #fruits li{
            width: 100px;
            cursor: pointer;
            
        }

        #fruits .active{
            color:red;
            text-decoration: underline;
        }

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

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

    &amp;lt;ul id=&quot;fruits&quot;&amp;gt;
        &amp;lt;li id=&quot;apple&quot; class=&quot;active&quot;&amp;gt;Apple&amp;lt;/li&amp;gt;
        &amp;lt;li id=&quot;banana&quot;&amp;gt;Banana&amp;lt;/li&amp;gt;
        &amp;lt;li id=&quot;grape&quot; class=&quot;aa&quot;&amp;gt;Grape&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;

    &amp;lt;div&amp;gt;선택된 과일 : &amp;lt;em class=&quot;msg&quot;&amp;gt;apple&amp;lt;/em&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;br&amp;gt;

    #새로운 과일 추가 :
    &amp;lt;input type=&quot;text&quot; class=&quot;text-box&quot;&amp;gt;
    &amp;lt;button id=&quot;add&quot;&amp;gt;추가&amp;lt;/button&amp;gt;

    &amp;lt;script&amp;gt;

        const $fruits=document.getElementById('fruits');
        const $msg=document.querySelector('.msg');
        
        const $liList=[...$fruits.children];
        
        //이벤트 핸들러 함수 
        function activate(e){
            
            //이벤트 발생 타겟이 특정 요소인지를 검증 ::matches() :선택자  작성 
            if(!e.target.matches('#fruits&amp;gt;li')){
                //console.log('여기는 이벤트가 발생하면 안돼요!');    
                 return;
            }
            //console.log('여기는 이벤트가 발생해도 됨~!');

            for(let $target of $liList){
                //       클래스추가 메서드        ,       조건이 true일 때 추가 ,false면 삭제 
                
                /*  
                    toggle메서드의 두번째 매개값으로 논리값을 전달할 수 있는데 ,
                    해당 논리값이 true면 지정한 클래스를 추가하고 , 
                    false면 지정한 클래스를 삭제 
                    flase인데 지정한 클래스가 존재하지 않으면 아무일도 일어나지 않는다.
                */
                $target.classList.toggle('active',$target===e.target)
            }
            $msg.textContent=e.target.id;
        }

        //ul에 이벤트 등록 
        $fruits.addEventListener('click',activate);

        //동적으로 과일 추가 기능 작성하기 
        const $btn=document.getElementById('add');
        const $textBox=document.querySelector('.text-box');

        //버튼에 입엔트 등록
        $btn.addEventListener('click',e=&amp;gt;{
            const $newLi=document.createElement('li'); // 가상 돔으로 &amp;lt;li&amp;gt;&amp;lt;/li&amp;gt; 가 생성
            $newLi.textContent=$textBox.value;   // &amp;lt;li&amp;gt;Orange&amp;lt;/li&amp;gt;
            $newLi.setAttribute('id',$textBox.value.toLowerCase());//소문자로 넣기 
            $fruits.appendChild($newLi);
            $textBox.value='';

            //새롭게 추가된 li에 이벤트를 부여하기 위해 배열에 추가
            $liList.push($newLi);
        });

    &amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7 이벤트 전파3&lt;/h2&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;네이버로 이동 
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;root&quot;&gt;
&lt;div class=&quot;parent&quot;&gt;
&lt;div class=&quot;child&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;
            //부모의 이벤트를 자식에게 전달하기 위해서는 이벤트리스너 두번째 매개변수에 값을 true로 준다
        document.querySelector('.root').addEventListener('click', e =&amp;gt; {
            alert('root');
        }, true);

        document.querySelector('.parent').addEventListener('click', e =&amp;gt; {
            alert('parent');
            //e.stopPropagation();
        }, true);

        document.querySelector('.child').addEventListener('click', e =&amp;gt; {
            alert('child');
            //e.stopPropagation();
        });

        const $link = document.querySelector('a');
        $link.addEventListener('click', e =&amp;gt; {
            if(!confirm('정말 이동하시겠어요?')) {
                e.preventDefault(); //태그의 고유 기능을 막음.
            }
        });

    &lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Quiz&lt;/h1&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;이벤트 기초&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.어트리뷰트 방식&lt;/h2&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;&amp;lt;button id=&quot;btn&quot; onclick=&quot;greeting()&quot; &amp;gt;클릭하세요&amp;lt;/button&amp;gt;

function greeting(){
            alert('안녕하세요!');
        }
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.프로퍼티 방식 : 하나의 요소에 하나의 이벤트 핸들러만 바인당 할 수 있다 .&lt;/h2&gt;
&lt;pre class=&quot;php&quot;&gt;&lt;code&gt;&amp;lt;button id=&quot;btn&quot; &amp;gt;클릭하세요&amp;lt;/button&amp;gt;

function hello(){
            alert('hello!');
        }
$btn.onclick=hello;

$btn.onclick=function(){  // 즉석에서 선언하고 사용
            alert('안녕하세요');
        }

$btn.onclick=()=&amp;gt;alert('안녕~');

&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.addEventListner&lt;/h2&gt;
&lt;pre class=&quot;php&quot;&gt;&lt;code&gt;&amp;lt;button id=&quot;btn&quot;&amp;gt;클릭!&amp;lt;/button&amp;gt;

function hello(){
 alert('hello');
 }

const $btn=document.getElementById('btn');

$btn.addEventListener('click',hello);

$btn.addEventListener('click',function(){
	alert('world!');
});

$btn.addEventListener('click',()=&amp;gt;{
      alert('bye~');
});

//이벤트 핸들러 제거 
$btn.removeEventListener('click',hello);
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;이벤트 객체와 전파&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.이벤트 객체&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;&amp;lt;p&amp;gt;아무곳이나 클릭하세요!&amp;lt;/p&amp;gt;
    &amp;lt;em class=&quot;message&quot;&amp;gt;&amp;lt;/em&amp;gt;

 const $em=document.querySelector('.message');

      
//문서 전체에 이벤트 핸들러 등록  ::파라미터 선언 해 두면 , 이벤트객체가  인자로 들어감
       

//파라미터  e의 이름은 자유롭게 작성 
  //이벤트가 발생하면 이벤트에 대한 다양한 정보가 들어 있는
//이벤트 객체가 동적으로 생성됩니다.
//생성된 이벤트 객체는 이벤트 핸들러의 첫번째 인자로 자동 전달 됩니다.
//어떤 이벤트가 발생했느냐에 따라 그에 맞는 객체가 알아서 전달.
document.addEventListener('click',(e)=&amp;gt;{
 console.log(e);
 $em.textContent=`x :${e.clientX},y:${e.clientY}`;
 });
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.이벤트객체와 프로퍼티&lt;/h2&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;label&amp;gt;
        &amp;lt;input type=&quot;checkbox&quot; &amp;gt;
        &amp;lt;em class=&quot;message&quot;&amp;gt;&amp;lt;/em&amp;gt;
    &amp;lt;/label&amp;gt;
    
    &amp;lt;script&amp;gt;

        const $checkbox=document.querySelector('input[type=checkbox]');
        const $em=document.querySelector('.message');

                                //checkbox의 여부가 바뀌었다면 change를 쓴다
        $checkbox.addEventListener('change',e=&amp;gt;{  //괄호안에 파라미터 한개면 생략 가능
            //실제로 이벤트가 일어난 요소
            //console.log(e.target); // 이건 알아둬야 함!!!!!강사 강조

            $em.textContent=e.target.checked?'체크됨!':'체크안됨!';

        });
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.마우스 이벤트&lt;/h2&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;style&amp;gt;

        .box{
            width: 100px;
            height: 100px;
            background: #fff700;
            border: 5px solid orange;
            position : absolute;
            left: 0;
            top: 0;
        }

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

&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;box&quot;&amp;gt;&amp;lt;/div&amp;gt;
    
    &amp;lt;script&amp;gt;
        
        //드래그 대상 요소 취득
        const $box=document.querySelector('.box');

        //드래그 시작 지점의 마우스 포인터 위치 
        const initialMousePos={
            x:0,
            y:0

        };

        //오프셋 : 이동한 거리 
        const offset={
            x:0,
            y:0
        };

        //이벤트 핸들러 정의
        const move=function(e){
            //오프셋 =
            //현재(드래그 하는 시점)마우스 포인터 좌표에서 드래그 시작 시점의 좌표를 뺀다.
            offset.x=e.clientX-initialMousePos.x;
            offset.y=e.clientY-initialMousePos.y;

            console.log(`x:${offset.x} ,y:${offset.y}`);
            $box.style.left=offset.x+'px';
            $box.style.top=offset.y+'px';

        }

        //mousedown(마우스 버튼을 눌렀을 때) 이벤트가 발생하면
        //드래그 시작지점의 마우스 포인터 좌표를 저장.
        $box.addEventListener('mousedown',function(e){
           
            /*
                이동거리를 계산하기 위해서 mousedown이벤트가 발생(드래그 시작)
                드래그 시작 지점의 마우스 포인터 좌표(cllientX,Y)를 저장해 둔다
                한 번 이상 드래그로 이동한 경우 move에서 left,top만큼 이동한 상태 이므로
                이전의 이동한 거리 offset.x,y만큼 빼 줘야 처음위치(0,0)로 돌아가지 않는다.
            
            */

           
            initialMousePos.x=e.clientX-offset.x;
            initialMousePos.y=e.clientY-offset.y;
            console.log('드래그 시작지점 x:'+initialMousePos.x);
            console.log('드래그 시작지점 y:'+initialMousePos.y);

            //마우스 이동이 시작된다면 , 따로 선언한 move()함수를 호출
            document.addEventListener('mousemove',move);
        }) ;

        //mouseup 이벤트가 발생하면 ,mousemove 이벤트를 제거해서
        //이동을 멈추게 하자 
        document.addEventListener('mouseup',function(){
            document.removeEventListener('mousemove',move);
        });

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

&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4 키보드이벤트&lt;/h2&gt;
&lt;pre class=&quot;xquery&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot;&amp;gt;
    &amp;lt;p class=&quot;msg&quot;&amp;gt;&amp;lt;/p&amp;gt;
    
    &amp;lt;script&amp;gt;

        const $input=document.querySelector('input');
        const $msg=document.querySelector('.msg');

                                //keyup은 누르고 올라올 때를 지정 , 누를 때는 keypress
        $input.addEventListener('keyup',e=&amp;gt;{
            console.log(e.key); //e.target 으로 작성하면 input태그를 지목함 

            if(e.key==='Enter'){
                $msg.textContent=e.target.value;  //e.key라고 하면 Enter가 나와서 ,value로 해야 한다.
                e.target.value='';
            }else if(e.key==='Escape'){
                $msg.textContent='';
            }
        });

    &amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5 이벤트전파1&lt;/h2&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;style&amp;gt;

        #fruits{
            padding: 50px;
            border: 2px solid red;

        }
        #fruits &amp;gt;li{
            background: yellow;
            margin-bottom: 10px;
        }

    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

    &amp;lt;ul id=&quot;fruits&quot;&amp;gt;
        &amp;lt;li&amp;gt;Apple&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Banana&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Grape&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;

    &amp;lt;script&amp;gt;
        const $fruits=document.getElementById('fruits');

        //부모에 이벤트를 걸었이 때문에, li클릭을해도 ul에 이벤트 걸린것으로 인정됨
        $fruits.addEventListener('click',e=&amp;gt;{
            console.log('ul에 클릭 이벤트가 발생!');
            console.log('이벤트 핸들러가 붙은 타겟 :'+e.currentTarget);
            console.log('실제 이벤트가 발생한 요소 :'+e.target);
        });

        $fruits.firstElementChild.addEventListener('click',e=&amp;gt;{
            console.log('apple에 클릭 이벤트가 발생!');

            //이벤트 전파를 중단(버블링 방지) :: 자식요소 이벤트만 발생하고 , 부모의 이벤트 실행을 방지
            //부모와 자식의 이벤트가 같을 때만 버블링이 실행됨
            e.stopPropagation();
        });
    &amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6 이벤트전파2&lt;/h2&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;style&amp;gt;
        #fruits{
            list-style: none;
            padding: 0;

        }

        #fruits li{
            width: 100px;
            cursor: pointer;
            
        }

        #fruits .active{
            color:red;
            text-decoration: underline;
        }

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

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

    &amp;lt;ul id=&quot;fruits&quot;&amp;gt;
        &amp;lt;li id=&quot;apple&quot; class=&quot;active&quot;&amp;gt;Apple&amp;lt;/li&amp;gt;
        &amp;lt;li id=&quot;banana&quot;&amp;gt;Banana&amp;lt;/li&amp;gt;
        &amp;lt;li id=&quot;grape&quot; class=&quot;aa&quot;&amp;gt;Grape&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;

    &amp;lt;div&amp;gt;선택된 과일 : &amp;lt;em class=&quot;msg&quot;&amp;gt;apple&amp;lt;/em&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;br&amp;gt;

    #새로운 과일 추가 :
    &amp;lt;input type=&quot;text&quot; class=&quot;text-box&quot;&amp;gt;
    &amp;lt;button id=&quot;add&quot;&amp;gt;추가&amp;lt;/button&amp;gt;

    &amp;lt;script&amp;gt;

        const $fruits=document.getElementById('fruits');
        const $msg=document.querySelector('.msg');
        
        const $liList=[...$fruits.children];
        
        //이벤트 핸들러 함수 
        function activate(e){
            
            //이벤트 발생 타겟이 특정 요소인지를 검증 ::matches() :선택자  작성 
            if(!e.target.matches('#fruits&amp;gt;li')){
                //console.log('여기는 이벤트가 발생하면 안돼요!');    
                 return;
            }
            //console.log('여기는 이벤트가 발생해도 됨~!');

            for(let $target of $liList){
                //       클래스추가 메서드        ,       조건이 true일 때 추가 ,false면 삭제 
                
                /*  
                    toggle메서드의 두번째 매개값으로 논리값을 전달할 수 있는데 ,
                    해당 논리값이 true면 지정한 클래스를 추가하고 , 
                    false면 지정한 클래스를 삭제 
                    flase인데 지정한 클래스가 존재하지 않으면 아무일도 일어나지 않는다.
                */
                $target.classList.toggle('active',$target===e.target)
            }
            $msg.textContent=e.target.id;
        }

        //ul에 이벤트 등록 
        $fruits.addEventListener('click',activate);

        //동적으로 과일 추가 기능 작성하기 
        const $btn=document.getElementById('add');
        const $textBox=document.querySelector('.text-box');

        //버튼에 입엔트 등록
        $btn.addEventListener('click',e=&amp;gt;{
            const $newLi=document.createElement('li'); // 가상 돔으로 &amp;lt;li&amp;gt;&amp;lt;/li&amp;gt; 가 생성
            $newLi.textContent=$textBox.value;   // &amp;lt;li&amp;gt;Orange&amp;lt;/li&amp;gt;
            $newLi.setAttribute('id',$textBox.value.toLowerCase());//소문자로 넣기 
            $fruits.appendChild($newLi);
            $textBox.value='';

            //새롭게 추가된 li에 이벤트를 부여하기 위해 배열에 추가
            $liList.push($newLi);
        });

    &amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7 이벤트 전파3&lt;/h2&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;네이버로 이동 
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;root&quot;&gt;
&lt;div class=&quot;parent&quot;&gt;
&lt;div class=&quot;child&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;
            //부모의 이벤트를 자식에게 전달하기 위해서는 이벤트리스너 두번째 매개변수에 값을 true로 준다
        document.querySelector('.root').addEventListener('click', e =&amp;gt; {
            alert('root');
        }, true);

        document.querySelector('.parent').addEventListener('click', e =&amp;gt; {
            alert('parent');
            //e.stopPropagation();
        }, true);

        document.querySelector('.child').addEventListener('click', e =&amp;gt; {
            alert('child');
            //e.stopPropagation();
        });

        const $link = document.querySelector('a');
        $link.addEventListener('click', e =&amp;gt; {
            if(!confirm('정말 이동하시겠어요?')) {
                e.preventDefault(); //태그의 고유 기능을 막음.
            }
        });

    &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/90</guid>
      <comments>https://backend-na.tistory.com/90#entry90comment</comments>
      <pubDate>Fri, 27 May 2022 18:09:14 +0900</pubDate>
    </item>
    <item>
      <title>2022_05_26_JS_4일</title>
      <link>https://backend-na.tistory.com/89</link>
      <description>&lt;pre id=&quot;code_1653568714825&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;
const $id=document.getElementById('id');

$id.childNodes; //NodeList 
$id.children; // HTMLCollection
$id.firstChild;
$id.firstElementChild;
$id.lastElementChild;
$id.hasChildNodes();

------------------------------------------
$id.parentNode;
$id.previousElementSibling;
$id.nextElementSibling;

---------------------------------------------

$id.innerHtml+='&amp;lt;li class='ba'&amp;gt;baba&amp;lt;/li&amp;gt;';

-------------------------------------------

const $fruits=document.getElementById('fruits');
//1.요소 노드 생성(추가는 따로입니다.)
const $newLi=document.createElement('li');
//2.텍스트 삽입
$newLi.textContent='Banana';
//3.ul에 새로운 li 노드 추가
$fruits.appendChild($newLi);

$fruits.insertBefore($newLi,$fruits.firstElementChild);

const $frag=document.createDocumentFragment();
        
        for(let f of fruitName){
            const $li=document.createElement('li');
            $li.textContent=f;
            $frag.appendChild($li);
        }

        $fruits.appendChild($frag);
-------------------------------------------------------------------


//apple의 사본 생성(얕은 복사 : 자기 자신 노드만 복사 )
    const $shallowClone=$apple.cloneNode();
    console.log($shallowClone);

    $shallowClone.textContent=$apple.textContent;
    $fruits.appendChild($shallowClone);


    //apple의 사본 생성(깊은 복사 : 자기 자신을 포함한 모든 자손 노드를 복제 )
    const $deeppClone=$apple.cloneNode(true);
    $fruits.appendChild($deeppClone);



-----------------------------------------------
$fruits.replaceChild($mango,$fruits.firstElementChild);

$fruits.removeChild($fruits.lastElementChild);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/89</guid>
      <comments>https://backend-na.tistory.com/89#entry89comment</comments>
      <pubDate>Thu, 26 May 2022 21:38:37 +0900</pubDate>
    </item>
    <item>
      <title>2022_05_25_JS_3일</title>
      <link>https://backend-na.tistory.com/88</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mtFoz/btrC7JUBBMD/frEbX2s80Rta8YQVSOkNK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mtFoz/btrC7JUBBMD/frEbX2s80Rta8YQVSOkNK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mtFoz/btrC7JUBBMD/frEbX2s80Rta8YQVSOkNK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmtFoz%2FbtrC7JUBBMD%2FfrEbX2s80Rta8YQVSOkNK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1054&quot; height=&quot;725&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;725&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;832&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cujR4B/btrC4OW7RB7/owik3Zk5l4x37akNARSaak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cujR4B/btrC4OW7RB7/owik3Zk5l4x37akNARSaak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cujR4B/btrC4OW7RB7/owik3Zk5l4x37akNARSaak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcujR4B%2FbtrC4OW7RB7%2Fowik3Zk5l4x37akNARSaak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;832&quot; height=&quot;604&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C1vLJ/btrC3EGOqTp/Cft2cqqzBwGko5ZaV6YMLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C1vLJ/btrC3EGOqTp/Cft2cqqzBwGko5ZaV6YMLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C1vLJ/btrC3EGOqTp/Cft2cqqzBwGko5ZaV6YMLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC1vLJ%2FbtrC3EGOqTp%2FCft2cqqzBwGko5ZaV6YMLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;830&quot; height=&quot;565&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/88</guid>
      <comments>https://backend-na.tistory.com/88#entry88comment</comments>
      <pubDate>Wed, 25 May 2022 18:10:45 +0900</pubDate>
    </item>
    <item>
      <title>2022_05_24_JS_2일</title>
      <link>https://backend-na.tistory.com/87</link>
      <description>&lt;pre id=&quot;code_1653393253684&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//prompt는 String 이고 , +prompt로 작성해야 숫자로 인식
var number1 =+prompt('첫번째 숫자를 입력하세요!');
var number2 =+prompt('두번쨰 숫자를 입력하세요!');

//alert 함수는 브라우저에 알림창을 띄웁니다.
alert(`입력한 숫자의 합은 : ${number1+number2}`);

--------------------------
//배열의 생성    인덱스 :  0  1      2        3
         var fruits=['딸기','포도','복숭아','사과'];

         //배열의 길이 확인
         console.log('배열의 길이 : '+fruits.length);

         //배열 데이터 수정
         fruits[1]='수박';
        console.log(fruits);

        //배열 데이터 추가 :자바스크립트는 배열의 크키가 고정되어 있지 않아 ,없는 인덱스 지정해서 늘리면 된다./
       fruits[4]='파인애플';
       console.log(fruits); 
       console.log('배열의 길이 : '+fruits.length);

       //배열의 길이를 모들때 , 데이터 추가 하기위해서 밑에 처럼 작성하는것이 편하다.
        fruits[fruits.length]='망고';

        console.log(fruits);

        //배열 요소 참조
        var apple=fruits[3];


        //배열의 반복문 처리
        for(var i=0;i&amp;lt;fruits.length;i++){
            console.log(`${i+1}번째 과일은 : ${fruits[i]}`);
        }
----------------------------------------------------


var week=['월','화','수','목','금','토','일'];

        //for -of는 배열의 값을 얻어낼 때 사용 .(객체에서는 사용 x)
        //자바의 foreach문(향상 for문)과 유사 
        for (var day of week) {
            console.log(day+'요일');
            
        }

        console.log('=====================');

        //인덱스가 나옴 
        //for-in 은 배열이나 객체의 index 혹은 key 값을 변수에 저장 
        for(var d in week){
            console.log(d+'요일');
        }


--------------------------------------
var foods=['볶음밥','닭강정','피자'];
        console.log(foods);

        //pop : 배열의 마지막 요소를 제거하고 , 제거한 요소를 반환합니다.
        var lastElement=foods.pop();
        console.log(lastElement);
        console.log(foods);


        //push : 배열의 끝에 요소를 추가 합니다.

        foods.push('파스타');
        foods.push('족발');
        console.log(foods);
        

        //shift : 배열의 맨 첫번째 요소를 제거하고 ,제거한 요소를 반환.
        var firstElement=foods.shift();
        console.log(firstElement);
        console.log(foods);

        //unshift : 배열의 맨 첫번째 위치에 요소를  추가 합니다
        foods.unshift('떡볶이');
        console.log(foods);


-----------------------
var foods=['떡볶이','오뎅','김말이','닭꼬치'];

        //indexof() : 배열 요소의 인덱스를 알려줌.
        // 찾는 요소가 없을시 -1이 리턴 된다. 
        var idx=foods.indexOf('김말이');
        console.log('찾은 인덱스 :'+idx); 

        // includes() : 배열 요소의 존재 확인 :true ,false 
        var result=foods.includes('김말이');
        console.log('탐색결과 :'+result);

        //slice () : 배열을 잘라냄
        console.log('-----------------------------------------');

        var arr=[0,1,2,3,4,5,6,7,8,9];

        var slicedArr=arr.slice(3,7);
        console.log(slicedArr);

        //reverse() : 배열을 역순으로 배치 
        var copyArr=arr.slice(0);  // 전체 범위 (원본 복사);
        copyArr.reverse();
        console.log(copyArr);


        //join() : 배열의 요소들을 연결한 문자열로 변환
        var foodsStr=foods.join();
        console.log(foodsStr);  //   , , , , 으로만 나옴

        //concat() : 배열을 결합
        console.log('-------------------------------');
        var arr1=[10,20,30];
        var arr2=[100,300,500];


        var concatedArr=arr1.concat(arr2);
        console.log(concatedArr);

------------------------------------
//splice() 배열의 특정 요소를 제거 
        var foods=['떡볶이','오뎅','김말이','닭꼬치'];
        console.log(foods);

        var delFood=foods.splice(1,2);  // splice(시작인덱스, 개수 ) 
        console.log(delFood);
        console.log(foods);

        foods.splice(0,1,'치킨','파스타'); //  0번 인덱스를 제거,그자리에 데이터 추가 
        console.log(foods);

        //삭제 요소 개수를 0으로 하면 , 삭제 없이 데이터 추가할 수 있다.
        foods.splice(2,0,'피자'); // 해당 위치 지목하고 데이터 추가만 
        console.log(foods);

        //개수를 지정하지 않으면  시작 인덱스부터 끝까지 삭제 
        foods.splice(2);
        console.log(foods);


        foods.push('보쌈','닭발');
        
        var input='보쌈';
        var idx=foods.indexOf(input);

        if(idx&amp;gt;=0) {
            foods.splice(idx,1);
            console.log('삭제 완료!');
        }else {
            console.log('데이터가 없습니다.');
        }


-------------------
//객체 생성   :  EL 6 이전 방법 
        var dog={
            name : '뽀삐',
            kind :'시츄',
            age:3,
            favorite:['산책','간식']
        };

        var cat={
            name:'야옹이',
            kind:'페르시안',
            age:2,
            favorite:['낮잠','츄르','실뭉치']


        };

        console.log(typeof cat);


        //객체 프로퍼티 참조
        console.log(dog.name);
        console.log(cat.name);

        console.log(dog.age);
        console.log(cat.favorite[1]);

        dog.favorite.push('꼬리흔들기');
        console.log(dog);

        console.log('==============================');

        //프로퍼티 참조 다른 방식
        console.log(dog.kind);
        console.log(dog['kind']);

        //프로퍼티 값 수정
        dog.age=5;

        cat.favorite[1]='고등어';
        console.log(cat);

        console.log('==============================');

        //프로퍼티를 동적으로 추가
        dog.owner='김철수';
        console.log(dog);

        //프로퍼티 삭제 
        delete dog.owner;
        console.log(dog);

        
        //for~ in (ES6)
        console.log('----------------------------------------------------');

        for(var key in cat ){
            console.log(cat[key]);  // cat.key 는  사용 불가능 !
        }

        console.log('----------------------------------------------------');

        //객체의 프로퍼티 키의 존재 유무 확인 (in 키워드)
        var flag='kind' in cat;
        console.log(flag);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/87</guid>
      <comments>https://backend-na.tistory.com/87#entry87comment</comments>
      <pubDate>Tue, 24 May 2022 20:54:17 +0900</pubDate>
    </item>
    <item>
      <title>2022_05_23_ JS_1일</title>
      <link>https://backend-na.tistory.com/86</link>
      <description>&lt;h1&gt;JavaScript&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 페이지에 생동감을 불어 넣기 위해 만들어진 프로그래밍 언어&lt;/li&gt;
&lt;li&gt;HTML ,CSS와 함께 웹을 구성하는 언어 중 하나로 웹 브라우저에서 동작하는 유일한 프로그래밍 언어&lt;/li&gt;
&lt;li&gt;개발자가 별도의 컴파일을 수행하지 않는 인터프리터 언어&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 타입 : 값의 종류&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 타입&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;숫자 타입(number) : 숫자 ,정수 ,실수 구분 안함&lt;/li&gt;
&lt;li&gt;문자열 타입(String) : 텍스트 문자열&lt;/li&gt;
&lt;li&gt;논리 타입(boolean) : true,false&lt;/li&gt;
&lt;li&gt;undefined 타입 : 값을 할당하지 않은 변수에 암묵적으로 할당되는 값&lt;/li&gt;
&lt;li&gt;null 타입 : 값이 의도적으로 없다는 것을 명시할 때 사용하느 ㄴ값&lt;/li&gt;
&lt;li&gt;심벌 타입( symbol) : ES6에서 추가된 타입&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;객체 타입&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체 ,함수,배열 등&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/86</guid>
      <comments>https://backend-na.tistory.com/86#entry86comment</comments>
      <pubDate>Mon, 23 May 2022 17:49:22 +0900</pubDate>
    </item>
    <item>
      <title>2022_05_20_JSP_11일</title>
      <link>https://backend-na.tistory.com/85</link>
      <description>&lt;h1&gt;JSP11_05120&lt;/h1&gt;
&lt;h1&gt;페이징 알고리즘&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#1. 사용자가 보게 될 페이지 화면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 화면에 페이지 버튼을 10개씩 끊어서 보여준다면? ex)1 2 3 4 .... 9 10 [다음] // [이전] 31 32 33 34 ...... 39 40 [다음]&lt;/li&gt;
&lt;li&gt;만약에 총 게시물의 수가 67개라면? 1 2 3 4 5 6 7&lt;/li&gt;
&lt;li&gt;총 게시물 수가 142개이고 , 현재 사용자는 12페이지를 클릭 했다면? [이전] 11 12 13 14 15&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#2. 우선 총 게시물의 개수를 조회해야 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;총 게시물 수는 DB로부터 수를 조회하는 SQL문을 작성합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#3. 사용자가 현재 위치한 페이지를 기준으로 끝 페이지 번호를 계산하는 로직을 작성.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;만약 현재 사용자가 보고 있는 페이지가 3페이지고 , 한 화면에 보여줄 페이지 버튼이 10개라면? -&amp;gt;끝 페이지 번호:10번 -만약 현재 페이지가 36페이지고, 한 화면에 보여줄 페이지 버튼 수가 20개라면 -&amp;gt;끝 페이지 번호 : 40번&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 : Math.ceil(현재 위치한(보고있는) 페이지 번호 /한 화면당 보여질 페이지 버튼 수) * 한 화면당 보여질 페이지 버튼 수 Math.ceil(36/20) :: 2 * 20&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#4.시작 페이지 번호 계산&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 위치한 페이지가 15페이지고, 한 화면에 보여줄 페이지 버튼이 10개면 -&amp;gt;시작 페이지 번호 : 11번&lt;/li&gt;
&lt;li&gt;현재 위치한 페이지가 73번이고 , 한 화면에 페이지 버튼 20개씩 보여준다면 ? -&amp;gt; 시작 페이지: 61번&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 : ( 끝페이지 번호 - 한 화면에 보여줄 페이지 버튼 수) +1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#5.끝 페이지 보정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;총 게시물 수가 324개이고 , 한 페이지당 10개의 게시물을 보여준다. -그리고 이 사람은 현재 31페이지를 보고 있다. -그리고 한 화면에 페이지 버튼은 10개가 배치된다. -그렇다면 , 위 공식에 의한 끝 페이지는 몇 번으로 계산 되는가 ?-&amp;gt; 공식에 의해서는 40번인데 . -하지만, 실제 끝 페이지는 몇 번에서 끝나면 되는가? -&amp;gt;33번&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#5-1.. 이전 버튼 활성화 여부 설정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시작 페이지 번호가 1로 구해진 시점에서는 비활성화 , 나머지는 활성 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#5-2.. 다음 버튼 활성화 여부 설정&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;#5-3 끝 페이지 값 보정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-다음 버튼이 비활성화 되었다면 총 게시물 수에 맞춰 끝 페이지 번호를 재 보정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 : Math.ceil(총 게시물의 개수 / 한 페이지에 보여줄 게시물 수 )&lt;/p&gt;
&lt;h1&gt;Filter&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;FrontController( 서블릿 클래스)으로 들어가기전 요청을 가로채 검사하는 역할&lt;/h2&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/85</guid>
      <comments>https://backend-na.tistory.com/85#entry85comment</comments>
      <pubDate>Fri, 20 May 2022 17:48:09 +0900</pubDate>
    </item>
    <item>
      <title>2022_05_19_JSP_10일</title>
      <link>https://backend-na.tistory.com/84</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;WHERE 절&amp;nbsp; 컬럼명 삽입 방법&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9VFwP/btrCDDzHpJp/LZPKqmCU1RCkBuzpygUCBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9VFwP/btrCDDzHpJp/LZPKqmCU1RCkBuzpygUCBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9VFwP/btrCDDzHpJp/LZPKqmCU1RCkBuzpygUCBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9VFwP%2FbtrCDDzHpJp%2FLZPKqmCU1RCkBuzpygUCBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;833&quot; height=&quot;516&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;516&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;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;게시글 등록 시간과 현재 시간차이 구하기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/83xLN/btrCApv91qP/ZI7X76jjUrMynQbEOQqzo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/83xLN/btrCApv91qP/ZI7X76jjUrMynQbEOQqzo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/83xLN/btrCApv91qP/ZI7X76jjUrMynQbEOQqzo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F83xLN%2FbtrCApv91qP%2FZI7X76jjUrMynQbEOQqzo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;736&quot; height=&quot;295&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자바 클래스에서 HTML , JS 사용하기&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbSlPd/btrCDdH2K2Z/KPBLeXOyxXWHr52V6IKzj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbSlPd/btrCDdH2K2Z/KPBLeXOyxXWHr52V6IKzj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbSlPd/btrCDdH2K2Z/KPBLeXOyxXWHr52V6IKzj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbSlPd%2FbtrCDdH2K2Z%2FKPBLeXOyxXWHr52V6IKzj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;826&quot; height=&quot;481&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/84</guid>
      <comments>https://backend-na.tistory.com/84#entry84comment</comments>
      <pubDate>Thu, 19 May 2022 20:05:59 +0900</pubDate>
    </item>
    <item>
      <title>2022_05_18_JSP_9일</title>
      <link>https://backend-na.tistory.com/83</link>
      <description>&lt;h1&gt;MVC Model 2 Architecture&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델2 구조는 웹 브라우저의 요청을 하나의 서블릿이 받으며 서블릿은 그 요청을 알맞게 처리한 후, 그 결과를 보여줄 JSP 페 이지로 포워딩합니다.&lt;/li&gt;
&lt;li&gt;이 구조의 특징은 웹 브라우저의 모든 요청을 단일 진입점, 즉 하나의 서블릿에서 처리한다는 점입니다. 하나의 서블릿이 모든요청을 받기 때문에 서블릿은 웹 브라우저의 요청을 구분하는 방법이 필요합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MVC 모델2 구조의 핵심은&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델(Model)은 비즈니스와 관련된 로직만 처리하면 되며 사용자에게 보일 화면이나 요청의 흐름 제어에 대해서는 전혀 처리하지 않으며, 뷰(View)는 사용자에게 알맞은 화면을 보여주는 역할만 수행할 뿐, 비즈니스 로직이나 요청 흐름 제어 등을 처리하지 않습니다.&lt;/li&gt;
&lt;li&gt;컨트롤러(Controller)는 사용자의 요청에 대해서 알맞은 모델을 사용하고 사용자에게 보여줄 뷰를 선택합니다.&lt;/li&gt;
&lt;li&gt;MVC 모델2 구조를 사용함으로써 코드의 유지보수가 쉬워지며 어플리케이션을 쉽게 확장할 수 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;MVC의 컨트롤러: 서블릿&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델 2 구조에서 서블릿은 MVC 패턴의 컨트롤러 역할을 합니다. 서블릿은 웹 브라우저의 요청과 웹 어플리케이션 의 전체적인 흐름을 제어합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;컨트롤러의 흐름 제어 처리 로직&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 브라우저가 전송한 HTTP 요청을 받아 요청방식에 맞게 doGet(), doPost()를 호출함.&lt;/li&gt;
&lt;li&gt;웹 브라우저가 어떤 기능을 요청했는지 분석함.&lt;/li&gt;
&lt;li&gt;모델을 사용하여 요청한 기능을 수행.&lt;/li&gt;
&lt;li&gt;모델로부터 전달받은 결과물을 알맞게 가공한 후, request나 session의 setAttribute() 메서드를 이용하여 결과값 을 속성에 저장. 이렇게 저장한 결과값은 뷰인 JSP에서 사용함.&lt;/li&gt;
&lt;li&gt;웹 브라우저에 결과를 전송할 JSP 페이지를 선택한 후, 해당 JSP로 포워딩(혹은 리다이렉트)함.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;MVC의 뷰: JSP&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델 2 구조에서 JSP는 뷰 역할을 담당합니다. 뷰 역할을 하는 JSP는 컨트롤러에서 request 객체나 session객체에 저장 된 데이터를 사용하여 웹 브라우저에 알맞을 화면을 출력합니다.&lt;/li&gt;
&lt;li&gt;뷰 역할을 하는 JSP는 웹 브라우저가 요청한 결과를 보여주는 프레젠테이션의 역할을 할 뿐만 아니라 웹 브라우저의 요 청을 컨트롤러에 전달해주는 매개체가 되기도 합니다.&lt;/li&gt;
&lt;li&gt;즉, 뷰 역할을 하는 JSP는 웹 브라우저가 지속적으로 컨트롤러에 요청을 보낼 수 있는 링크나 폼을 제공해서 웹 브라우 저가 업무 흐름에 따라 컨트롤러에게 알맞은 요청을 보낼 수 있도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;MVC의 모델&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨트롤러는 서블릿을 통해 구현하고 뷰는 JSP를 통해서 구현하는데 모델은 명확하게 어떤 것을 통해서 구현한다는 규 칙은 없습니다. 단지 비즈니스 로직을 처리해주면 모델이 될 수 있습니다.&lt;/li&gt;
&lt;li&gt;컨트롤러의 서블릿이 웹 브라우저의 요청을 분석하여 알맞은 모델을 호출하면서부터 모델의 기능이 시작됩니다. 모델 은 컨트롤러가 요청한 작업을 처리한 후 알맞은 결과를 컨트롤러에게 전달하는데, 이때 처리한 결과값을 저장하는 객체 로 보통 자바빈을 사용합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/83</guid>
      <comments>https://backend-na.tistory.com/83#entry83comment</comments>
      <pubDate>Thu, 19 May 2022 11:57:41 +0900</pubDate>
    </item>
    <item>
      <title>2022_05_17_JSP_8일</title>
      <link>https://backend-na.tistory.com/82</link>
      <description>&lt;h1&gt;EL (Expression Language)&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EL이란 JSP에서 저장객체를 출력할때 스크립팅을 전혀 쓰지 않을 수 있는 기술입니다.&lt;/li&gt;
&lt;li&gt;EL은 일종의 스크립트 언어로 자료 타입, 수치 연산자, 논리 연산자, 비교 연산자 등을 제공하며 표현식을 대체할 수 있습니다.&lt;/li&gt;
&lt;li&gt;EL의 사용법 ex) 표현식 &amp;lt;%= value %&amp;gt; EL ${value}&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;JSTL (JSP Standara Tag Libray)&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JSP의 경우 HTML태그와 같이 사용되어 전체적인 코드의 가독성이 떨어집니다.&lt;/li&gt;
&lt;li&gt;그래서 이런 단점을 보완하고 만들어진 것이 JSTL입니다.&lt;/li&gt;
&lt;li&gt;JSTL을 사용하면 자바의 제어문을 HTML 태그화 시킬 수 있습니다.&lt;/li&gt;
&lt;li&gt;JSTL의 경우 우리가 사용하는 Tomcat 기본 컨테이너에 포함되어 있지 않으므로, 별도의 라이브러리를 설치하고 사용합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/82</guid>
      <comments>https://backend-na.tistory.com/82#entry82comment</comments>
      <pubDate>Tue, 17 May 2022 17:48:05 +0900</pubDate>
    </item>
    <item>
      <title>2022_05_16_JSP_7일</title>
      <link>https://backend-na.tistory.com/81</link>
      <description>&lt;h1&gt;Connection Pool&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터베이스 연결 풀은 데이터에 대한 요청이 발생하면 재사용되는 것으로 , 데이터 베이스의 수행 능력을 향상 시키기 위해 사용&lt;/li&gt;
&lt;li&gt;연결 풀에서 하나의 연결이 생성되어 풀에 배치되면 새로운 연결이 만들어지지 않도록 재사용 하지만, 만약 모든 연결이 사용 중에 있으면 새로운 연결이 만들어져 풀에 추가됩니다&lt;/li&gt;
&lt;li&gt;연결 풀을 통해 사용자는 데이터베이스 연결을 위해 기다리는 시간을 축소 시켜줍니다&lt;/li&gt;
&lt;li&gt;JSP 연결 풀 설정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커넥션 풀 설정은 Eclipse-Servers폴더에 &amp;rarr;context.xml을 수정합니다 :커넥션 풀 설정을 넣어 주는 것임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커넥션 풀 : 커넥션 풀링은 미리 정해진 개수만큼 DB커넥션을 풀에 준비해두고, 어플리케이션이 요청할 때 마다 Pool에서 꺼내서 할당하며 다시 돌려 받앙서 Pool에 넣는 기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DataSource : DB에 이용되는 URL , id ,pw ,driverClass를 미리 정의해 놓고 사용 하는 객체 : 커넥션풀의 정보를 Datasource 객체에 저장해두는 것임&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;999&quot; data-origin-height=&quot;897&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lo3wf/btrCj2NJCet/LRzkXvhN5K8tJrDaedpO2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lo3wf/btrCj2NJCet/LRzkXvhN5K8tJrDaedpO2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lo3wf/btrCj2NJCet/LRzkXvhN5K8tJrDaedpO2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flo3wf%2FbtrCj2NJCet%2FLRzkXvhN5K8tJrDaedpO2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;999&quot; height=&quot;897&quot; data-origin-width=&quot;999&quot; data-origin-height=&quot;897&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/81</guid>
      <comments>https://backend-na.tistory.com/81#entry81comment</comments>
      <pubDate>Mon, 16 May 2022 17:37:17 +0900</pubDate>
    </item>
    <item>
      <title>2022_05_13_JSP_6일</title>
      <link>https://backend-na.tistory.com/80</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;DAO 인터페이스의 추상 메서드를 작성 할 때에는 , SQL을 무엇을 쓸지 생각해보고 메서드를 작성하면 된다!!&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;&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;869&quot; data-origin-height=&quot;859&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l5niN/btrB5LkTNjb/VSfojMYTkItycfHxYG8RTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l5niN/btrB5LkTNjb/VSfojMYTkItycfHxYG8RTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l5niN/btrB5LkTNjb/VSfojMYTkItycfHxYG8RTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl5niN%2FbtrB5LkTNjb%2FVSfojMYTkItycfHxYG8RTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;859&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;859&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>수업_정리</category>
      <author>backend_na</author>
      <guid isPermaLink="true">https://backend-na.tistory.com/80</guid>
      <comments>https://backend-na.tistory.com/80#entry80comment</comments>
      <pubDate>Fri, 13 May 2022 17:39:13 +0900</pubDate>
    </item>
  </channel>
</rss>