<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>코딩하는 솔라솔</title>
    <link>https://dev-sol-chive.tistory.com/</link>
    <description>IT계의 봄날의 햇살이 될테야~☀️ </description>
    <language>ko</language>
    <pubDate>Wed, 17 Jun 2026 18:18:15 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>솔라솔</managingEditor>
    <image>
      <title>코딩하는 솔라솔</title>
      <url>https://tistory1.daumcdn.net/tistory/6283722/attach/50db252e0d984c0ca6104624ed4c1e5e</url>
      <link>https://dev-sol-chive.tistory.com</link>
    </image>
    <item>
      <title>디자인패턴 정리 - 어댑터 패턴, 퍼사드 패턴</title>
      <link>https://dev-sol-chive.tistory.com/entry/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-%EC%A0%95%EB%A6%AC-%EC%96%B4%EB%8C%91%ED%84%B0-%ED%8C%A8%ED%84%B4-%ED%8D%BC%EC%82%AC%EB%93%9C-%ED%8C%A8%ED%84%B4</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;안녕하세요. 솔라솔입니다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;오늘은 어댑터 패턴과 퍼사드 패턴에 대한 공부한것을 정리하고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☀️ 어댑터 패턴 (변환)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;✅ 목적: 클래스의 인터페이스를 클라이언트가 원하는 형태의 또다른 인터페이스로 변환.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 어댑터는 호환되지 않는 인터페이스 때문에 동작하지 않는 클래스들을 함께 동작할 수 있도록 만들어줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;어댑터는 우리 주변에서도 쉽게 볼 수 있습니다. 흔히 말하는 변압기죠. 한국에서 사용하던 충전기를 해외에서 사용하려면 플러그 모양을 바꿀 어댑터가 필요합니다. 이와 같이 어댑터는 내가 가지고 있는 인터페이스를 다른 곳에 적용할 인터페이스로 바꾸어 주는 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;✅ 객체를 감싸는 역할을 합니다. 따라서 Wrapper Pattern 이라고도 불립니다. 서로 다른 인터페이스를 동일하게 변환 시키는 거죠.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qT2oR/btsBcSLqXGZ/IYhbByCeVRUdwjAk3UUNj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qT2oR/btsBcSLqXGZ/IYhbByCeVRUdwjAk3UUNj0/img.png&quot; data-alt=&quot;어댑터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qT2oR/btsBcSLqXGZ/IYhbByCeVRUdwjAk3UUNj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqT2oR%2FbtsBcSLqXGZ%2FIYhbByCeVRUdwjAk3UUNj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;599&quot; height=&quot;312&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;549&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;어댑터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;✅&lt;span&gt; 문제: 사용 객체의 API 가 서로 다름&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;✅&lt;span&gt; 해결 방법: 함수를 변환하는 객체를 중간에 넣음&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;✅&lt;span&gt; 결과: 변경 최소화&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;✅&lt;span&gt;&amp;nbsp;객체지향어댑터&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;   기존 소프트웨어 시스템에서 새로운 업체에서 제공한 클래스 라이브러리를 사용해야한다고 가정.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;  &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;새로 채택한 업체에서 사용하는 인터페이스가 기존업체에서 사용하던 인터페이스와 다르다면?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1469&quot; data-origin-height=&quot;619&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LWWHb/btsA7zGD27T/lKiHTtOKOEUrinAiMMozsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LWWHb/btsA7zGD27T/lKiHTtOKOEUrinAiMMozsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LWWHb/btsA7zGD27T/lKiHTtOKOEUrinAiMMozsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLWWHb%2FbtsA7zGD27T%2FlKiHTtOKOEUrinAiMMozsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;232&quot; data-origin-width=&quot;1469&quot; data-origin-height=&quot;619&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 기존 코드를 바꿀 수 없다면, 새로 사용하기로 한 업체에서 사용하는 인터페이스를 기존에 사용하던 인터페이스에 적응시켜주는 클래스를 만들어서 사용&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1653&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp4dYy/btsA8Lfwhy0/UzURMZuJ3IJrIRsZYcWwS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp4dYy/btsA8Lfwhy0/UzURMZuJ3IJrIRsZYcWwS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp4dYy/btsA8Lfwhy0/UzURMZuJ3IJrIRsZYcWwS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp4dYy%2FbtsA8Lfwhy0%2FUzURMZuJ3IJrIRsZYcWwS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;548&quot; height=&quot;189&quot; data-origin-width=&quot;1653&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 어댑터는 클라이언트로부터 요청을 받아서 새로운 업체에서 제공하는 클래스에서 받아들일 수 있는 형태의 요청으로 변환시켜주는 중개인 역할을 함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1656&quot; data-origin-height=&quot;699&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgcsNw/btsA9gGzqSO/GOyNO9g2q0K1fvKjLB0mCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgcsNw/btsA9gGzqSO/GOyNO9g2q0K1fvKjLB0mCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgcsNw/btsA9gGzqSO/GOyNO9g2q0K1fvKjLB0mCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgcsNw%2FbtsA9gGzqSO%2FGOyNO9g2q0K1fvKjLB0mCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;535&quot; height=&quot;226&quot; data-origin-width=&quot;1656&quot; data-origin-height=&quot;699&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1701309951885&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface Duck {
	public void quack();
    public void fly();
}

public class MallardDuck implements Duck {
	public void quack()  {
    	System.out.println(&quot;Quack&quot;);
    }
    public void fly ()   {
    	System.out.println(&quot;I'm flying&quot;);
    }
}

public interface Turkey  {
	public void gobble ();
    public void fly ();
}

public class WildTurkey implements Turkey {
	public void gobble() {
    	System.out.println(&quot;Gobble gobble&quot;);
    }
    public void fly() {
        System.out.println(&quot;I'm flying a short distance&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;➡️ Duck 객체가 모자라서 Turkey 객체를 대신 사용해야하는 상황이라고 가정&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;인터페이스가 다르기에 바로 Turkey 객체를 사용할 수는 없다. 이때 필요한것이 바로 어댑터이다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;어댑터 구현&lt;/p&gt;
&lt;pre class=&quot;java&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;// 우선 적응시킬 형식의 인터페이스를 구현해야 한다. 즉 클라이언트에서 원하는 인터페이스를 구현해야 한다.
public class TurkeyAdapter implements Duck { 
   

    private final Turkey turkey;

    public TurkeyAdapter(Turkey turkey) { // 그리고 기존 형식 객체의 레퍼런스가 필요한다.
        this.turkey = turkey;
    }

    @Override
    public void quack() {
        turkey.gobble();
    }

    /*
     두 인터페이스에 모두 fly가 있지만 turkey의 fly() 메소드를 Duck의 fly() 메소드에 대응시키도록 작성 
     */
    @Override
    public void fly() {
        for (int i = 0; i &amp;lt; 5; i++) {
            turkey.fly();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;777&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FPcu9/btsA4W3rDzt/IYaAZeodGdo6q8a0ly5dyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FPcu9/btsA4W3rDzt/IYaAZeodGdo6q8a0ly5dyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FPcu9/btsA4W3rDzt/IYaAZeodGdo6q8a0ly5dyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFPcu9%2FbtsA4W3rDzt%2FIYaAZeodGdo6q8a0ly5dyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;636&quot; height=&quot;295&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;777&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;public class DuckTestDrive {

    public static void main(String[] args) {
        Duck duck = new MallardDuck();
        Turkey turkey  = new WildTurkey();
        Duck turkeyAdapter = new TurkeyAdapter(turkey);

        System.out.println(&quot; turkey said that&quot;);
        turkey.gobble();
        turkey.fly();

        System.out.println(&quot;\n duck said that&quot;);
        testDuck(duck);

        System.out.println(&quot;\n turkeyAdapter said that&quot;);
        testDuck(turkeyAdapter);
    }

    private static void testDuck(Duck duck) {
        duck.quack();
        duck.fly();
    }

}

=======================================================
turkey said that
gobble
short fly

duck said that
quack
fly

turkeyAdapter said that
gobble
short fly
short fly
short fly
short fly
short fly&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;클라이언트의 testDuck() 메소드는 오리와 칠면조를 전혀 구분하지 못한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;742&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CN4Na/btsA7CQT6ZP/ZG30tRrYzjUrLpR79XyuIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CN4Na/btsA7CQT6ZP/ZG30tRrYzjUrLpR79XyuIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CN4Na/btsA7CQT6ZP/ZG30tRrYzjUrLpR79XyuIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCN4Na%2FbtsA7CQT6ZP%2FZG30tRrYzjUrLpR79XyuIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;675&quot; height=&quot;332&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;742&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #121212; color: #ececec; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;이제 어댑터가 어떤 식으로 작동하는지 살펴보자&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #121212; color: #ececec; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트는 타깃 인터페이스에 맞게 구현되어 있으며, 타깃 인터페이스로 메소드를 호출해서 어댑터에 요청을 보낸다.&lt;/li&gt;
&lt;li&gt;어댑터는 타깃 인터페이스를 구현하며, 어댑티 인스턴스를 가지고 있다. 어댑터는 어댑티 인터페이스로 그 요청을 어댑티에 관한(하나 이상의) 메소드 호출로 변환한다.&lt;/li&gt;
&lt;li&gt;클라이언트는 호출 결과를 받긴 하지만 중간에 어댑터가 있다는 사실을 모르므로, 클라이언트와 어댑티는 서로 분리되어 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p id=&quot;q-어댑터가-얼마나-적응시켜-줘야-할까-대형-타깃-인터페이스를-구현해야-한다면-할-일이-정말-많아지지-않을까&quot; style=&quot;background-color: #121212; color: #ececec; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;Q. 어댑터가 얼마나 적응시켜 줘야 할까? 대형 타깃 인터페이스를 구현해야 한다면 할 일이 정말 많아지지 않을까?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #121212; color: #ececec; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;어댑터 구현은 타깃 인터페이스로 지원해야 하는 인터페이스의 크기에 비례해서 복잡해진다. 하지만 다른 대안이 없다. 클라이언트에서 호출하는 부분을 새로운 인터페이스에 맞춰서 고치려면 정말 많은 부분을 고려해야 하고, 코드도 많이 고쳐야 한다. 이런 방법보다는 모든 변경 사항을 캡슐화할 어댑터 클래스 하나만 제공하는 방법이 더 나을 것이다.&lt;/p&gt;
&lt;p id=&quot;q-하나의-어댑터는-하나의-클래스만-감싸야-할까&quot; style=&quot;background-color: #121212; color: #ececec; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;Q. 하나의 어댑터는 하나의 클래스만 감싸야 할까?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #121212; color: #ececec; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;어댑터 패턴은 하나의 인터페이스를 다른 인터페이스로 변환하는 용도로 쓰인다. 하나의 어댑터에서 타깃 인터페이스를 구현하려고 2개 이상의 어댑티를 감싸야 하는 상황도 생길 수 있다. 사실 이런 내용은 퍼사드 패턴과 관련이 있으므로 퍼사드 패턴 때 다시 보자.&lt;/p&gt;
&lt;p id=&quot;q-시스템에-오래된-부분과-새로-만든-부분이-섞여-있으면-어떻게-해야할까-어떤-곳에는-어댑터를-사용하고-다른-곳에서-어댑터로-감싸지-않은-인터페이스를-사용하면-헷갈리지-않을까&quot; style=&quot;background-color: #121212; color: #ececec; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;Q. 시스템에 오래된 부분과 새로 만든 부분이 섞여 있으면 어떻게 해야할까?? 어떤 곳에는 어댑터를 사용하고 다른 곳에서 어댑터로 감싸지 않은 인터페이스를 사용하면 헷갈리지 않을까?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #121212; color: #ececec; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;이런 상황에서는 두 인터페이스를 모두 지원하는 다중 어댑터(Two Way Adapter)를 만들면 된다. 다중 어댑터로 필요한 인터페이스를 둘 다 구현해서 어댑터가 기존 인터페이스와 새로운 인터페이스 역할을 할 수 있게 하면 된다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://velog.io/@ljo_0920/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%96%B4%EB%8C%91%ED%84%B0-%ED%8D%BC%EC%82%AC%EB%93%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@ljo_0920/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%96%B4%EB%8C%91%ED%84%B0-%ED%8D%BC%EC%82%AC%EB%93%9C&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1701310556736&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;디자인 패턴 - 어댑터, 퍼사드&quot; data-og-description=&quot;헤드 퍼스트 디자인 패턴을 읽고 정리한 글입니다.어댑터 패턴 : 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환한다. 인터페이스가 호환되지 않아 같이 쓸 수 없&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@ljo_0920/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%96%B4%EB%8C%91%ED%84%B0-%ED%8D%BC%EC%82%AC%EB%93%9C&quot; data-og-url=&quot;https://velog.io/@ljo_0920/디자인-패턴-어댑터-퍼사드&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qXHxB/hyUE3Avcwa/tdZ5VuhQjFrdhkz59PNSl1/img.png?width=450&amp;amp;height=251&amp;amp;face=0_0_450_251,https://scrap.kakaocdn.net/dn/b48pTa/hyUFbL2ryK/YrnYz58xLKBCKrz8Pyx6MK/img.png?width=450&amp;amp;height=251&amp;amp;face=0_0_450_251,https://scrap.kakaocdn.net/dn/bR5cyq/hyUE9AIkAA/9MaJUMLe3ibUSEHHQQdIVK/img.png?width=759&amp;amp;height=272&amp;amp;face=0_0_759_272&quot;&gt;&lt;a href=&quot;https://velog.io/@ljo_0920/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%96%B4%EB%8C%91%ED%84%B0-%ED%8D%BC%EC%82%AC%EB%93%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@ljo_0920/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%96%B4%EB%8C%91%ED%84%B0-%ED%8D%BC%EC%82%AC%EB%93%9C&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qXHxB/hyUE3Avcwa/tdZ5VuhQjFrdhkz59PNSl1/img.png?width=450&amp;amp;height=251&amp;amp;face=0_0_450_251,https://scrap.kakaocdn.net/dn/b48pTa/hyUFbL2ryK/YrnYz58xLKBCKrz8Pyx6MK/img.png?width=450&amp;amp;height=251&amp;amp;face=0_0_450_251,https://scrap.kakaocdn.net/dn/bR5cyq/hyUE9AIkAA/9MaJUMLe3ibUSEHHQQdIVK/img.png?width=759&amp;amp;height=272&amp;amp;face=0_0_759_272');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;디자인 패턴 - 어댑터, 퍼사드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;헤드 퍼스트 디자인 패턴을 읽고 정리한 글입니다.어댑터 패턴 : 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환한다. 인터페이스가 호환되지 않아 같이 쓸 수 없&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1586&quot; data-origin-height=&quot;1216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/42ISz/btsA7QO8l5t/ksA300nUhc4fDocDI9JLk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/42ISz/btsA7QO8l5t/ksA300nUhc4fDocDI9JLk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/42ISz/btsA7QO8l5t/ksA300nUhc4fDocDI9JLk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F42ISz%2FbtsA7QO8l5t%2FksA300nUhc4fDocDI9JLk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;608&quot; height=&quot;466&quot; data-origin-width=&quot;1586&quot; data-origin-height=&quot;1216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사례2. Enumeration 을 Iterator 에 적응시키기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1891&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dztz3D/btsA8LNlTHz/62UJ0LcLHkOMe0UhXMtcHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dztz3D/btsA8LNlTHz/62UJ0LcLHkOMe0UhXMtcHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dztz3D/btsA8LNlTHz/62UJ0LcLHkOMe0UhXMtcHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdztz3D%2FbtsA8LNlTHz%2F62UJ0LcLHkOMe0UhXMtcHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;635&quot; height=&quot;336&quot; data-origin-width=&quot;1891&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2489&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WRypM/btsA72IztGK/cA9RnwqZrjiekrKXYc3YrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WRypM/btsA72IztGK/cA9RnwqZrjiekrKXYc3YrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WRypM/btsA72IztGK/cA9RnwqZrjiekrKXYc3YrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWRypM%2FbtsA72IztGK%2FcA9RnwqZrjiekrKXYc3YrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;631&quot; height=&quot;254&quot; data-origin-width=&quot;2489&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Enumeration&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Enumeration을 리턴하는 elements() 메소드가 구현되어있었던, 초기 컬렉션 형식 (Vector, Stack, Hashtable 등)은 Enumeration인터페이스를 사용하면 컬렉션내에서 각 항목이 관리되는 방식에는 신경 쓸 필요 없이 컬렉션의 모든 항목에 접근이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Iterator&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;최근에는 Enumeration과 마찬가지로 컬렉션에 있는 일련의 항목들에 접근할 수 있게 해주면서 항목을 제거할 수도 있게 해주는 Iterator 라는 인터페이스를 사용하기 시작했다..&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Enumeration vs Iterator&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Enumeration 인터페이스를 사용하는 구형코드를 다뤄야할 때도 가끔 있지만, 새로운 코드를 만들 때는 Iterator 만 사용하는 것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이때 어댑터 패턴을 적용해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Iterator - 타겟 인터페이스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Enumeration - 어댑티 인터페이스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 Iterator의 remove() 메소드는 Enumeration에는 이런 기능을 제공하는 메소드가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 그렇다면, remove() 메소드는 어떻게?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvRdXA/btsA7xoArsS/rjw0xVvINWzaZxvkPH8s91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvRdXA/btsA7xoArsS/rjw0xVvINWzaZxvkPH8s91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvRdXA/btsA7xoArsS/rjw0xVvINWzaZxvkPH8s91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvRdXA%2FbtsA7xoArsS%2Frjw0xVvINWzaZxvkPH8s91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;661&quot; height=&quot;415&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;먼저 타깃 인터페이스를 구현하고, 어댑티 객체로 구성된 어댑터를 구현해야한다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;hasNext() 와 next() 메소드는 타깃에서 어댑티로 바로 연결된다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;remove() 는 어떻게 처리할까?&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;✅ 어댑터 차원에서 완벽하게 작동하는 remove() 메소드의 구현방법은 없다. 따라서 그나마 좋은 방법은 런타임 예외를 던지는 것&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;✅&lt;span&gt; Iterator 인터페이스는 remove() 는 default method로 UnsupportedOperationExcpetion을 던지고 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #121212; color: #ececec; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;이처럼 메소드가 일대일로 대응되지 않는 상황에서는 어댑터를 완벽하게 적용할 수 없다. 클라이언트는 예외 발생 가능성을 염두에 두고 있어야 하기 때문이다. 하지만 클라이언트에서 주의를 기울이고, 어댑터 문서를 잘 만들어 두면 괜찮을 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1701311752076&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class EnumerationIterator implements Iterator {
    
    Enumeration enumeration;

    public EnumerationIterator(Enumeration enmt) {
        this.enumeration = enmt;
    }

    @Override
    public boolean hasNext() {
        return enumeration.hasMoreElements();
    }

    @Override
    public Object next() {
        return enumeration.nextElement();
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException();
    }
}

public class Iterator2 {
	public static void printIterator(Iterator it) {
    	while (it.hasNext()) {
        	System.out.println(&quot; &quot; + it.next());
        }
    }
    
    public static void main(String[] args) {
    	Vector v = new Vector();
        for (int i = 0; i &amp;lt; 10; i ++) {
        	v.add(i);
        }
        Enumeration e = v.elements();
        EnumerationIterator it = new EnumerationIterator(e);
        Iterator2.printIterator(it);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☀️ 퍼사드 패턴 (통합)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;목적: 서브시스템에 있는 여러개의 인터페이스를 통합하는 한 개의 인터페이스를 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 퍼사드는 서브 시스템을 쉽게 사용할 수 있도록 해주는 고급 수준의 인터페이스를 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;지금까지 어댑터패턴을 써서 어떤 클래스의 인터페이슬르 클라이언트가 원하는 인터페이스로 변환하는 방법을 이용하여 구현했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이제 조금 다른 이유로 인터페이스를 변경하는 방법인 퍼사드패턴을 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;퍼사드패턴은 인터페이스를 단순하게 바꾸고자 인터페이스를 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;데코레이터 vs 어댑터 vs 퍼사드&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;세개의 패턴 모두 객체를 감싸고 있는 공통점이 있다. 하지만 사용하는 용도가 각각 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;➡️ 데코레이터는 &lt;b&gt;인터페이스는 바꾸지 않고&lt;/b&gt; 감싸고 있는 객체의 행동과 책임을 &lt;b&gt;확장하는&lt;/b&gt; 용도로 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;➡️&lt;span&gt; 어댑터는 &lt;b&gt;하나의 인터페이스를 다른 인터페이스로 변환&lt;/b&gt;하는 용도로 사용&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;➡️&lt;span&gt; 퍼사드는 &lt;b&gt;인터페이스를 간단하게 변경&lt;/b&gt;하는 용도로 사용&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&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;1694&quot; data-origin-height=&quot;1253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sPYMD/btsA5eJykTT/USyXOlNwzWR5q9U24hU9v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sPYMD/btsA5eJykTT/USyXOlNwzWR5q9U24hU9v1/img.png&quot; data-alt=&quot;홈시어터를 구축하는것을 가정해보자.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sPYMD/btsA5eJykTT/USyXOlNwzWR5q9U24hU9v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsPYMD%2FbtsA5eJykTT%2FUSyXOlNwzWR5q9U24hU9v1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;479&quot; data-origin-width=&quot;1694&quot; data-origin-height=&quot;1253&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;홈시어터를 구축하는것을 가정해보자.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1711&quot; data-origin-height=&quot;1282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDHDqk/btsBeUPLvno/Lltws4Tj6EDE41VMbYM0zK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDHDqk/btsBeUPLvno/Lltws4Tj6EDE41VMbYM0zK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDHDqk/btsBeUPLvno/Lltws4Tj6EDE41VMbYM0zK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDHDqk%2FbtsBeUPLvno%2FLltws4Tj6EDE41VMbYM0zK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;636&quot; height=&quot;477&quot; data-origin-width=&quot;1711&quot; data-origin-height=&quot;1282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;java&quot; style=&quot;color: #000000; text-align: left;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;popper.on();
popper.pop();

lights.dim(10);
screen.down();
projector.on();
projector.setInput(dvd);
projector.wideScreenMode();

amp.on();
amp.setDvd(dvd);
amp.setSurroundSound();
amp.setVolume(5);

dvd.on();
dvd.play(movie);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;위와 같은 클래스와 메소드가 필요할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;클래스가 6개나 필요하고, 만약 영화가 끝나면 어떻게 해야할까?, 방금 했던 일을 전부 역순으로 처리해야 하지 않을까? 다른 라디오나 시스템이 업그레이드하면 이런 복잡한 작동 방법을 또 배워야 하지 않을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;➡️ 이렇게 복잡한 일을 퍼사드 패턴으로 간단하게 처리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;1211&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5dDOs/btsA70xdkRj/9jQAal8rueXdrQyT4LOLXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5dDOs/btsA70xdkRj/9jQAal8rueXdrQyT4LOLXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5dDOs/btsA70xdkRj/9jQAal8rueXdrQyT4LOLXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5dDOs%2FbtsA70xdkRj%2F9jQAal8rueXdrQyT4LOLXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;658&quot; height=&quot;309&quot; data-origin-width=&quot;1211&quot; data-origin-height=&quot;569&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1717&quot; data-origin-height=&quot;1231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lxq4O/btsBbIJiO0z/K6sPQW0SVmdPDAXscIpMGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lxq4O/btsBbIJiO0z/K6sPQW0SVmdPDAXscIpMGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lxq4O/btsBbIJiO0z/K6sPQW0SVmdPDAXscIpMGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLxq4O%2FbtsBbIJiO0z%2FK6sPQW0SVmdPDAXscIpMGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;626&quot; height=&quot;1231&quot; data-origin-width=&quot;1717&quot; data-origin-height=&quot;1231&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;✅ 홈시어터 시스템용 퍼사드를 만들어보자.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;watchMovie()와 같이 몇 가지 간단한 메소드만 들어있는 HomeTheaterFacade 클래스를 새로 만들어야 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;✅&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;퍼사드 클래스는 홈시어터 구성 요소를&lt;span&gt;&amp;nbsp;&lt;/span&gt;하나의 서브시스템으로 간주한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;➡️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;watchMovie() 메서드는 서브시스템의 메소드를 호출해서 필요한 작업을 처리한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;✅&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이제 클라이언트 코드는 서비스시템이 아닌 홈시어터 퍼사드에 있는 메서드를 호출한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;➡️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;watchMovie() 메서드만 호출하면 조명, 스트리밍 플레이어, 앰프 등 알아서 준비된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;✅&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;퍼사드를 쓰더라도 서브시스템에 여전히 직접 접근할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;➡️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;서브시스템 클래스의 고급 기능이 필요하면 언제든지 사용 가능하다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; style=&quot;color: #000000; text-align: left;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class HomeTheaterFacade {

    // composition 부분, 사용하고자 하는 서브시스템의 모든 구성 요소가 인스턴스 변수 형태로 저장된다.
    private Amplifier amp;
    private Tuner tuner;
    private DvdPlayer dvd;
    private CdPlayer cd;
    private Projector projector;
    private TheaterLights lights;
    private Screen screen;
    private PopcornPopper popper;

    public HomeTheaterFacade(Amplifier a, Tuner t, DvdPlayer d, CdPlayer c,
        Projector p,
        TheaterLights l, Screen s, PopcornPopper pp) {
        this.amp = a;
        this.tuner = t;
        this.dvd = d;
        this.cd = c;
        this.projector = p;
        this.lights = l;
        this.screen = s;
        this.popper = pp;
    }

    public void watchMovie(String movie) {
        System.out.println(&quot;영화 볼 준비 중&quot;);
        popper.on();
        popper.pop();

        lights.dim(10);
        screen.down();
        projector.on();
        projector.wideScreenMode();

        amp.on();
        amp.setDvd(player);
        amp.setSurroundSound();
        amp.setVolume(5);

        dvd.on();
        dvd.play(movie);
    }
    
    public void endMovie() {
        System.out.println(&quot;홈시어터 끄는 중&quot;);
        popper.off();
        lights.on();
        screen.up();
        projector.off();
        amp.off();
        dvd.stop();
        dvd.eject();
        dvd.off();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 서브시스템에 들어있는 구성요소에게 위임하여 단순화된 인터페이스를 제공한다.&lt;/p&gt;
&lt;pre class=&quot;haxe&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;public class HomeTheaterTestDrive {

    public static void main(String[] args) {
        // 구성 요소 초기화
        // 지금은 구성 요소를 직접 생성하지만 보통은 클라이언트에 퍼사드가 주어지므로 직접 구성 요소를 생성하지 않아도 된다.

        Amplifier amp = new Amplifier();
        Tuner tuner = new Tuner();
        StreamingPlayer player = new StreamingPlayer();
        Projector projector = new Projector();
        TheaterLights lights = new TheaterLights();
        Screen screen = new Screen();
        PopcornPopper popper = new PopcornPopper();
        HomeTheaterFacade homeTheater = new HomeTheaterFacade(
            amp,
            tuner,
            player,
            projector,
            lights,
            screen,
            popper
        );
        // 단순화된 인터페이스를 사용
        homeTheater.watchMovie(&quot;king kong&quot;);
        homeTheater.endMovie();
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심정리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;✅ 기존 클래스를 사용하려고 하는데 인터페이스가 맞지 않으면 어댑터를 쓰면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;✅&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;큰 인터페이스와 여러 인터페이스를 단순하게 바꾸거나 통합해야 하면 퍼사드를 쓰면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;✅&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;어댑터는 인터페이스를 클라이언트에서 원하는 인터페이스로 바꾸는 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;✅&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;퍼사드는 클라이언트를 복잡한 서브시스템과 분리하는 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;✅&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;어댑터를 구현할 때는 타깃 인터페이스의 크기와 구조에 따라 코딩해야 할 분량이 결정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;✅&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;퍼사드 패턴에서드는 서브시스템으로 퍼사드를 만들고 진짜 작업은 서브클래스에 맡긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;✅&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;어댑터 패턴에는 객체 어댑터 패턴과 클래스 어댑터 패턴이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;➡️ 클래스 어댑터를 사용하려면 다중 상속이 가능해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;✅&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;한 서브시스템에 퍼사드를 여러 개 만들어도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;✅&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;어댑터는 객체를 감싸서 인터페이스를 바꾸는 용도로, 데코레이터는 객체를 감싸서 새로운 행동을 추가하는 용도로, 퍼사드는 일련의 객체를 감싸서 단순하게 만드는 용도로 쓰인다.&lt;/p&gt;</description>
      <category>CS/고급객체지향프로그래밍</category>
      <author>솔라솔</author>
      <guid isPermaLink="true">https://dev-sol-chive.tistory.com/20</guid>
      <comments>https://dev-sol-chive.tistory.com/entry/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-%EC%A0%95%EB%A6%AC-%EC%96%B4%EB%8C%91%ED%84%B0-%ED%8C%A8%ED%84%B4-%ED%8D%BC%EC%82%AC%EB%93%9C-%ED%8C%A8%ED%84%B4#entry20comment</comments>
      <pubDate>Fri, 1 Dec 2023 13:06:18 +0900</pubDate>
    </item>
    <item>
      <title>[뉴스뭉 ] 1. 슬랙봇으로 학교 공지 알림서비스를 만든다고?</title>
      <link>https://dev-sol-chive.tistory.com/entry/%EB%89%B4%EC%8A%A4%EB%AD%89%F0%9F%A6%8C-1-%EC%8A%AC%EB%9E%99%EB%B4%87%EC%9C%BC%EB%A1%9C-%ED%95%99%EA%B5%90-%EA%B3%B5%EC%A7%80-%EC%95%8C%EB%A6%BC%EC%84%9C%EB%B9%84%EC%8A%A4%EB%A5%BC-%EB%A7%8C%EB%93%A0%EB%8B%A4%EA%B3%A0</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;☀️&lt;span&gt;&amp;nbsp;&lt;/span&gt;인트로&lt;/h2&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;안녕하세요.솔라솔입니다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;오늘은 제가 스스로 불편해서 만들고자 한 &quot;학교, 학과 공지 알림 슬랙봇 만들기- 뉴스뭉&quot; 을 개발하게 된 이유를 설명하고자 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;1410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckeXo1/btsBaZKFySz/ymBbibPwjhlD0p4No604d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckeXo1/btsBaZKFySz/ymBbibPwjhlD0p4No604d1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckeXo1/btsBaZKFySz/ymBbibPwjhlD0p4No604d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckeXo1%2FbtsBaZKFySz%2FymBbibPwjhlD0p4No604d1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;723&quot; height=&quot;503&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;1410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☀️&lt;span&gt;&amp;nbsp;&lt;/span&gt;서론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이상하게 프로그래밍 언어론 수업시간마다 이상한 아이디어들이 떠올라서..(교수님 죄송합니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;지난번엔 갑자기 github.io를 만들었고, 오늘은 갑자기 슬랙봇개발에 꽂혀버렸네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그치만 이게 바로 개발의 재미인 것 같기도 합니다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&quot; 내가 ~~이러한 점이 불편하다! -&amp;gt; 만들어보자!&quot;&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;가 되는 재미가 개발 말고 또 있을까요?&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;뉴스뭉&amp;nbsp;&lt;/b&gt;은 &lt;b&gt;상명대학교 웹페이지의 공지사항 변화를 포착해 슬랙 채널로 메시지를 보내주는 서비스&lt;/b&gt;이다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;새로운 공지사항이 올라오면 1분 안에 알려주고, 무료이다  &lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;지인 대상으로 시작해서 일반공지/학사공지/장학공지/컴퓨터과학과 주요공지/ 컴퓨터과학과 취업,인턴십공지 등의 채널을 운영할 생각이며, 차차 타과 공지 게시판,취업플랫폼, 공모전 관련 플랫폼 등의 공지를 긁어올 예정이다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☀️&lt;span&gt;&amp;nbsp;기획 의도&lt;/span&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;  왜 만들었다고?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;내가 너무 불편해서, 그리고 친구들도 다같이 써보면 좋을 것 같아서 만들기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;개인적으로 생각했을때 우리학교의 경우 커뮤니티적인 성격이 약하다. 서로 이끌어주고, 이끌리고의 느낌이 없달까? (개인적인 의견이다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;개인플레이적인 성격이 강한 것이 아쉬웠다. 지인 중에 서강대 친구가 있는데, 그 친구가 그때 보여준게 바로 서강대 슬랙봇이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그때 봤던건 아마도 &lt;a title=&quot;백준&quot; href=&quot;https://www.acmicpc.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/&lt;/a&gt; 백준님이 제공해주는 서강대 정보제공 슬랙봇(이었던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;슬랙 내에서 서로 이끌고 이끌어주는 시스템이 부러웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;우리학교에도 적어도 좋은것을 함께 공유하는 시스템이 생기면 좋겠다고 생각했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lpNDt/btsA7v4LBnZ/USjwPsCmtGJRvFqhl6k8Vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lpNDt/btsA7v4LBnZ/USjwPsCmtGJRvFqhl6k8Vk/img.png&quot; data-alt=&quot;'학교' 즐겨찾기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lpNDt/btsA7v4LBnZ/USjwPsCmtGJRvFqhl6k8Vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlpNDt%2FbtsA7v4LBnZ%2FUSjwPsCmtGJRvFqhl6k8Vk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;404&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'학교' 즐겨찾기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;처음에는 학교 관련 홈페이지들을 다 즐겨찾기에 넣어서 &quot;학교&quot; 로 처리해두고 가급적 매일 봤다. 그치만,학년이 올라가면서, 취업정보도 다른 곳에서 봐야하고, 확인해야할 사이트들이 많아졌다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;788&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mQori/btsBaYkLu9G/BgGPtZKA6Z8Uf9zIWkjPw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mQori/btsBaYkLu9G/BgGPtZKA6Z8Uf9zIWkjPw1/img.png&quot; data-alt=&quot;'매일확인' 즐겨찾기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mQori/btsBaYkLu9G/BgGPtZKA6Z8Uf9zIWkjPw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmQori%2FbtsBaYkLu9G%2FBgGPtZKA6Z8Uf9zIWkjPw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;285&quot; height=&quot;273&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;788&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'매일확인' 즐겨찾기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그래서 매일확인 즐겨찾기를 새로 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;통합공지 -&amp;gt; 학과 상관없이 통합공지가 올라오는 곳&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;컴과 -&amp;gt; 컴퓨터과학과 공지가 올라오는 곳&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;SW중심사업단 -&amp;gt; 이 홈페이지를 모르는 친구들이 많은 것 같은데, 인턴이나 취업 등 학교에서 제공해주는 공모전 같은게 많이 올라오는 사이트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 개인적으로 학년이 올라갈수록 학교에서 제공해주는 공모전이나 활동들을 다 뽑아먹자! 라는 생각을 가지고 학교를 다녔기 때문에, 이 사이트가 매우 중요하다고 생각되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;인턴 사이트 -&amp;gt; 링커리어에 들어가게 되면 직무 'IT/인터넷 ', 나의 경우 '서울/경기'로 모집요강을 자주 확인하곤 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;나머지 사이트들은 개인적으로 필요한 것들을 즐겨찾기 하며 지속적으로 확인하고자 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그러다 보니까, 내가 너무 불편한거다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot; 왜 내가 스스로 이걸 하나하나 누르면서 확인해야하지? 이걸 통합적으로 자동화 시킬 수는 없나? &quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;라는 생각이 문득 떠올랐다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2026&quot; data-origin-height=&quot;1414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nkhAq/btsA9U3PSeI/l9w8D6EaMfQ2KDeI2q826K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nkhAq/btsA9U3PSeI/l9w8D6EaMfQ2KDeI2q826K/img.png&quot; data-alt=&quot;생각이 떠오르면 냅다 만들고 보는 편이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nkhAq/btsA9U3PSeI/l9w8D6EaMfQ2KDeI2q826K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnkhAq%2FbtsA9U3PSeI%2Fl9w8D6EaMfQ2KDeI2q826K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;626&quot; height=&quot;437&quot; data-origin-width=&quot;2026&quot; data-origin-height=&quot;1414&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;생각이 떠오르면 냅다 만들고 보는 편이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  슬랙을 고른 이유?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;슬랙의 경우, 예전에 CJ UNIT에서 활동할때 써본 경험이 있었다. AWS 경진대회때도 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;내가 크롤링해서 가져올 생각은 못했는데, 이번기회에 가져와보자 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;s&gt;참고로 지금은 시험 3주전이다.&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;UMC 활동할때는 디스코드에서 노래하는 하리보봇이나 이런것들로 유튜브 뮤직을 끌어오곤 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;디스코드랑 슬랙 둘다 사용해봐서, 처음엔 조금 고민이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;둘 중에 뭐쓰지?&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://greypencil.tistory.com/145&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://greypencil.tistory.com/145&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1701235506931&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;개발자들은 왜 Slack 을 쓸까?&quot; data-og-description=&quot;&amp;quot;카카오톡 쓰면 안되나요?&amp;quot; &amp;quot;디스코드 쓰면 안되나요?&amp;quot; 정답은 이렇다. &amp;quot;안돼요 !!!&amp;quot; 좀 이상하다. 개발자들은 왜 꼭 Slack 을 써야 할까? 채팅이라면 카카오톡이 더 편하다. 초대하기가 더 쉽기 때문&quot; data-og-host=&quot;greypencil.tistory.com&quot; data-og-source-url=&quot;https://greypencil.tistory.com/145&quot; data-og-url=&quot;https://greypencil.tistory.com/145&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lrdx9/hyUE5rgTip/QtBszJgeIWf5vAuwkjtEF0/img.jpg?width=800&amp;amp;height=533&amp;amp;face=210_126_441_378,https://scrap.kakaocdn.net/dn/exr5sq/hyUCcyN61k/qbImrGpnqqQhR9Pe0hpTB0/img.jpg?width=800&amp;amp;height=533&amp;amp;face=210_126_441_378,https://scrap.kakaocdn.net/dn/d77nt6/hyUE8uL5kc/q5ZjlOflAwoo4Pli2VWcj1/img.jpg?width=1600&amp;amp;height=1067&amp;amp;face=420_240_860_720&quot;&gt;&lt;a href=&quot;https://greypencil.tistory.com/145&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://greypencil.tistory.com/145&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lrdx9/hyUE5rgTip/QtBszJgeIWf5vAuwkjtEF0/img.jpg?width=800&amp;amp;height=533&amp;amp;face=210_126_441_378,https://scrap.kakaocdn.net/dn/exr5sq/hyUCcyN61k/qbImrGpnqqQhR9Pe0hpTB0/img.jpg?width=800&amp;amp;height=533&amp;amp;face=210_126_441_378,https://scrap.kakaocdn.net/dn/d77nt6/hyUE8uL5kc/q5ZjlOflAwoo4Pli2VWcj1/img.jpg?width=1600&amp;amp;height=1067&amp;amp;face=420_240_860_720');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;개발자들은 왜 Slack 을 쓸까?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&quot;카카오톡 쓰면 안되나요?&quot; &quot;디스코드 쓰면 안되나요?&quot; 정답은 이렇다. &quot;안돼요 !!!&quot; 좀 이상하다. 개발자들은 왜 꼭 Slack 을 써야 할까? 채팅이라면 카카오톡이 더 편하다. 초대하기가 더 쉽기 때문&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;greypencil.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 글을 보기도 했고, 나에게 디스코드는 조금더 게임의 느낌이라면, 슬랙은 그저 &quot;업무용&quot;의 느낌이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;span&gt;&amp;nbsp;뉴스뭉 개발기 이제 시작~&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2982&quot; data-origin-height=&quot;1722&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwyyry/btsBbOoARBK/cvulTALLkWejjwJH6YYKXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwyyry/btsBbOoARBK/cvulTALLkWejjwJH6YYKXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwyyry/btsBbOoARBK/cvulTALLkWejjwJH6YYKXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdwyyry%2FbtsBbOoARBK%2FcvulTALLkWejjwJH6YYKXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;579&quot; height=&quot;335&quot; data-origin-width=&quot;2982&quot; data-origin-height=&quot;1722&quot;/&gt;&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;size14&quot;&gt;뉴스(클리핑) + 스뭉(수뭉)을 합쳤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;언제 개발이 완료될지는 모르겠지만 상당히 새로운 걸 기획하고 개발해나가는건 설레는 일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;빨리 개발해서 얼른 새로운 &quot;아키텍쳐와 알고리즘&quot;을 담은 새로운 글을 작성해오겠다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;* 비밀댓글을 통한 문의는 받지 않고 있습니다. 공개댓글로 남겨주세요!&lt;br /&gt;조금이라도 도움이 되었다면, 공감/댓글을 남겨주시면 솔라솔에게 매우 큰 힘이 될 것 같습니다!&lt;br /&gt;댓글은 언제나 환영입니다!&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트/개인프로젝트</category>
      <category>뉴스뭉</category>
      <author>솔라솔</author>
      <guid isPermaLink="true">https://dev-sol-chive.tistory.com/19</guid>
      <comments>https://dev-sol-chive.tistory.com/entry/%EB%89%B4%EC%8A%A4%EB%AD%89%F0%9F%A6%8C-1-%EC%8A%AC%EB%9E%99%EB%B4%87%EC%9C%BC%EB%A1%9C-%ED%95%99%EA%B5%90-%EA%B3%B5%EC%A7%80-%EC%95%8C%EB%A6%BC%EC%84%9C%EB%B9%84%EC%8A%A4%EB%A5%BC-%EB%A7%8C%EB%93%A0%EB%8B%A4%EA%B3%A0#entry19comment</comments>
      <pubDate>Thu, 30 Nov 2023 12:34:12 +0900</pubDate>
    </item>
    <item>
      <title>[업보청산 캡스톤] - 교수님 첫 면담 회고</title>
      <link>https://dev-sol-chive.tistory.com/entry/%EC%97%85%EB%B3%B4%EC%B2%AD%EC%82%B0-%EC%BA%A1%EC%8A%A4%ED%86%A4-%EA%B5%90%EC%88%98%EB%8B%98-%EC%B2%AB-%EB%A9%B4%EB%8B%B4-%ED%9A%8C%EA%B3%A0</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;안녕하세요.솔라솔입니다.  &lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;제 졸프팀인, 업보청산캡스톤(아직 가명) 팀의 졸업프로젝트가 시작되었는데요.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;오늘은 이 프로젝트의 기획의도 및 면담 회고에 대해 작성해보려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;아마, [업보청산 캡스톤] 의 글은 차차 프로젝트가 진행되는대로 글이 더 추가될 것 같습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&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;660&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V0fSx/btsA4QaauLj/isw32obQkkMvQoms6feIr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V0fSx/btsA4QaauLj/isw32obQkkMvQoms6feIr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V0fSx/btsA4QaauLj/isw32obQkkMvQoms6feIr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV0fSx%2FbtsA4QaauLj%2Fisw32obQkkMvQoms6feIr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;502&quot; height=&quot;342&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☀️ 기획&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;단순한 프로젝트가 아니라, &quot;졸업 프로젝트&quot;를 진행함에 있어 우리 팀원이 얻어갈 수 있는 가장 큰 장점이 무엇일까 생각해보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;제가 생각했을때는 &quot;&lt;b&gt;사용자 유치 경험&lt;/b&gt;&quot; 이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;학교 관련 서비스를 만들면 프로젝트에 있어 가장 큰 어려움 중 하나인 &quot;사용자 유치&quot; 및 &quot;사용자 증가로 인한 이슈 해결&quot; 들을 경험해볼 수 있지 않을까 ? 하는 생각으로 시작되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;제가 그동안 진행해온 다양한 동아리에서의 프로젝트들은 물론 아이디어가 좋은 것들이 많았으나, 실제로 개발하여 배포까지 완성하여도, 사용자가 많이 없어서 그로인한 이슈발생하는 것들을 경험해보지 못하는건 아쉬웠기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;저희 학교의 경우 (특히 컴퓨터과학과) 졸업요건이 까다롭습니다.&lt;br /&gt;현 2023.12월 기준, 컴퓨터과학과 전공생의 졸업요건 중 &quot;공학인증 필수&quot;는 제외되었으나, 기존에는 공학인증은 필수였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;공학인증제도를 따르려면 전공심화 과목 00개, 수학과목 00개, 설계 과목 00개 등 매우 복잡한 커리큘럼을 학생 스스로 따라야하는게 문제점이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;현 2023.12월 기준으로는 이 제도를 필수적으로 따라야하는게 폐지되었으나, 기존에 따르던 학생들은 이학사가 아닌 공학사를 딸 수 있는 기회를 놓칠 이유가 없기에 아직까지는 많은 학우들이 공학인증제도를 따르는것으로 알고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;따라서, 공학인증제도나, 개인의 졸업요건에 맞춰 자동으로 시간표를 만들어주는 프로그램을 짜보면 어떨까? 하는 생각을 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;1654&quot; data-origin-height=&quot;1072&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/34jNf/btsA4TxYkfL/0Qjv4dPPdmjs3fg3anWmJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/34jNf/btsA4TxYkfL/0Qjv4dPPdmjs3fg3anWmJk/img.png&quot; data-alt=&quot;첫 기획안&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/34jNf/btsA4TxYkfL/0Qjv4dPPdmjs3fg3anWmJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F34jNf%2FbtsA4TxYkfL%2F0Qjv4dPPdmjs3fg3anWmJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;727&quot; height=&quot;471&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;1072&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;첫 기획안&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;처음 교수님께 이메일로 컨택했을때는 &quot;백엔드의 기능이 부족한 것 같아요. 이정도 규모면 백엔드가 굳이 필요할까요?&quot; , &quot;기능 추가가 필요할 것 같습니다&quot; 라는 피드백을 받았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&quot;기능 추가&quot;가 도대체 무슨말씀이실까 하는 생각에 도무지 생각이 안나던 저희팀이었는데요(심지어 주제를 바꿔야하나 하는 생각도 했습니다), 면담결과 방향성을 깨닫게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;팀원들이 그래도 개발 프로젝트 경험이 있는 친구들이라 &quot;죽어도 커뮤니티 기능은 안 넣고 싶다&quot; 라는 생각이 많았는데요, 커뮤니티 기능이 아니더라도 사용자간의 상호작용이 가능한 백엔드의 기능들을 추가적으로 생각이 가능하겠더라구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;*** reference&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgiJ2x/btsA6VhZ3Ct/QFhRBy2OVZVI3DZAKvisT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgiJ2x/btsA6VhZ3Ct/QFhRBy2OVZVI3DZAKvisT1/img.png&quot; data-alt=&quot;가천대 시간표 조합봇&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgiJ2x/btsA6VhZ3Ct/QFhRBy2OVZVI3DZAKvisT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgiJ2x%2FbtsA6VhZ3Ct%2FQFhRBy2OVZVI3DZAKvisT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;134&quot; height=&quot;237&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가천대 시간표 조합봇&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;처음에는 가천대 시간표 조합봇 처럼 챗봇 형태로 개발하고자 하였으나, 저희 팀 프론트엔드 팀원들은 iOS 개발 친구들이기에 앱개발로 틀었습니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; 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;b&gt;당분간은 주제를 바꿀 생각을 하지 않는 방향으로. 지금 주제를 어떻게 하면 더 키울 수 있을지 고민하세요&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;사용자간의 상호작용&lt;/span&gt;을 할 수 있는 방향으로 백엔드의 기능을 추가하세요&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;백엔드에서 추가되어야하는 기능 : &lt;span style=&quot;color: #ee2323;&quot;&gt;새로운 정보들이 추가되고 삭제되는게 자주 일어나는 것&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;사용자 간의 영향이 끼치는 &amp;lsquo;시간표 공유 비교 &amp;rsquo; 같은 기능, &amp;lsquo;담은 사람&amp;rsquo; 기능 등 &amp;rarr; 이런건 필수. 이걸 더 고민해보자
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;하루에 몇명이 추가했는지 기록을 남겨서 몇 명 담았는지 등등&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;게시판 류 (마켓,거래,채팅 등등) &amp;rarr; 이건 아직 보류긴함 (최후의 수단)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;목적을 &amp;lsquo;장바구니 기간 1~2주 간&amp;rsquo;의 서비스 느낌으로&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수강신청이 2/10에 시작한다면 2.1부터 서비스 오픈
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아마 저희 프로젝트는 겨울방학~7,8월 개발 후 , 8월 장바구니 기간에 서버 테스트를 할 수 있을 것 같다고 예상합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;학교에서 제공하는 실제 수강신청은 배제하고 생각하세요(실제 수강신청은 사용자의 몫)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;교수님의 요청사항:&lt;/b&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;일주일에 한번 우리끼리 만나는건 이렇게 유지하고,
&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;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☀️ 앞으로의 계획은?&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;앞으로 다양한 &quot;사용자 간의 상호작용&quot;이 가능한 백엔드의 기능을 추가할 것 같습니다. (추가되고, 정리되는대로 티스토리에도 글을 올려 공유하겠습니다)&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;사용자 유치 에 초점을 맞춘다면, 더할 나위 없이 좋은 프로젝트 기획안이라고 생각됩니다. 되도록이면 주제를 바꾸지 않고 쭉 진행하고자 합니다.&lt;br /&gt;차차 기획안을 다시 정리하고, 기말고사가 끝난 뒤부터 개발을 진행하도록 하겠습니다~!! 지켜봐주세요  &lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;* 비밀댓글을 통한 문의는 받지 않고 있습니다. 공개댓글로 남겨주세요!&lt;br /&gt;조금이라도 도움이 되었다면, 공감/댓글을 남겨주시면 솔라솔에게 매우 큰 힘이 될 것 같습니다!&lt;br /&gt;댓글은 언제나 환영입니다!&lt;/blockquote&gt;</description>
      <category>프로젝트</category>
      <category>캡스톤</category>
      <author>솔라솔</author>
      <guid isPermaLink="true">https://dev-sol-chive.tistory.com/18</guid>
      <comments>https://dev-sol-chive.tistory.com/entry/%EC%97%85%EB%B3%B4%EC%B2%AD%EC%82%B0-%EC%BA%A1%EC%8A%A4%ED%86%A4-%EA%B5%90%EC%88%98%EB%8B%98-%EC%B2%AB-%EB%A9%B4%EB%8B%B4-%ED%9A%8C%EA%B3%A0#entry18comment</comments>
      <pubDate>Wed, 29 Nov 2023 15:16:39 +0900</pubDate>
    </item>
    <item>
      <title>[시스템소프트웨어] 2. Loop</title>
      <link>https://dev-sol-chive.tistory.com/entry/%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-2-Loop</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;안녕하세요. 솔라솔입니다. &lt;span style=&quot;color: #e6e6e9; text-align: left;&quot;&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GM9PI/btsA7qPcs2i/p6WvOm4Ss7oc8EEpGJHBY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GM9PI/btsA7qPcs2i/p6WvOm4Ss7oc8EEpGJHBY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GM9PI/btsA7qPcs2i/p6WvOm4Ss7oc8EEpGJHBY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGM9PI%2FbtsA7qPcs2i%2Fp6WvOm4Ss7oc8EEpGJHBY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;417&quot; height=&quot;417&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;1.&lt;span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;ASM IO &lt;/span&gt;&lt;span&gt;라이브러리에는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;문자열을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;입력&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;받는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;루틴은&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;포함되어&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;있지&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;않다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;문자열을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;입력&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;받는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;프로그램&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;read_string.asm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;작성하시오&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;프로그램은&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(1) &lt;/span&gt;&lt;span&gt;엔터&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;키가&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;눌릴&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;때까지&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;read_char&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;루틴을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;반복&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;호출하여&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;문자열을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;입력&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;받고&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; (2)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;이를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;개행&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;문자를 제외한 &lt;/span&gt;&lt;span&gt;null-terminated &lt;/span&gt;&lt;span&gt;문자열로 저장한 후&lt;/span&gt;&lt;span&gt;, (3) &lt;/span&gt;&lt;span&gt;문자열이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;제대로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;입력&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;저장되었는지&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;확인하기&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;위해&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;print_string&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;루틴을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용하여&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;입력&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;받은&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;문자열을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;출력해야&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;프로그램을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;어셈블&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;링크하여&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;실행&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;파일&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;read_string&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;생성하고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;이를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;임의의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;문자열&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;입력을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;주어&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;실행시킨&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;결과를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;화면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;캡쳐&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;하여&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;첨부하시오&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;또한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;작성한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;소스&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;코드도&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;화면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;캡쳐하여&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;첨부하시오&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;단&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;아래의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;코드를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;활용해도&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;좋으나&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;u&gt;&lt;span&gt;입력&lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span&gt; &lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span&gt;문자열의&lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span&gt; &lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span&gt;길이가&lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span&gt; &lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span&gt;저장&lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span&gt; &lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;공간의&lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt; &lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;크기를&lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt; &lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;넘어가지&lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt; &lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;않도록&lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt; &lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span&gt;수정하여&lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span&gt; &lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span&gt;사용&lt;/span&gt;&lt;/u&gt;&lt;span&gt;하시오&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1701152193080&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;hellip;

	segment .bss
string	resb	32	; 마지막 null 문자를 포함한
			; 입력 문자열의 최대 길이


	segment .text

	&amp;hellip;
	mov	edx, 0
repeat:	call	read_char
	mov	[string+edx], al
	inc	edx
	cmp	al, 0x0a		; 엔터가 눌릴 때까지
	jne	repeat		; 반복 입력
	mov	byte [string+edx-1], 0	; 마지막 개행문자는
					; null 문자로 대체
	
	&amp;hellip;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSzcNN/btsA240HraN/HmrRk2PAtoVkjviKOnqbKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSzcNN/btsA240HraN/HmrRk2PAtoVkjviKOnqbKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSzcNN/btsA240HraN/HmrRk2PAtoVkjviKOnqbKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSzcNN%2FbtsA240HraN%2FHmrRk2PAtoVkjviKOnqbKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;885&quot; height=&quot;237&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;237&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;885&quot; data-origin-height=&quot;643&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB2RkK/btsA3ZrbJM0/3TI7IEF91IrSM6dkpEDLK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB2RkK/btsA3ZrbJM0/3TI7IEF91IrSM6dkpEDLK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB2RkK/btsA3ZrbJM0/3TI7IEF91IrSM6dkpEDLK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB2RkK%2FbtsA3ZrbJM0%2F3TI7IEF91IrSM6dkpEDLK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;885&quot; height=&quot;643&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;643&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;2.&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(mult.asm) &lt;/span&gt;&lt;span&gt;두&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;입력&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;받아&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;덧셈을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;반복하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;방식으로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;두&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;곱을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;계산하여&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;결과를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;출력하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;프로그램&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mult.asm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;작성하시오&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;즉&lt;/span&gt;&lt;span&gt; 2 x 4 = 2 + 2 + 2 + 2 &lt;/span&gt;&lt;span&gt;형태로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;계산&lt;/span&gt;&lt;span&gt;). &lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;프로그램을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;어셈블&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;링크하여&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;실행&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;파일&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mult&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;생성하고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;이를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;실행시킨&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;결과를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;화면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;캡쳐&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;하여&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;첨부하시오&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;또한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;작성한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;소스&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;코드도&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;화면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;캡쳐하여&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;첨부하시오&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;곱하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;두&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;입력은&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;read_int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;루틴을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;결과값의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;출력은&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;print_int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;루틴을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;루프는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;반드시&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;loop&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;명령을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용하여&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;구현&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sG4uT/btsA7uxjaTZ/3F4SR72q7sBIiSU6BWjzc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sG4uT/btsA7uxjaTZ/3F4SR72q7sBIiSU6BWjzc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sG4uT/btsA7uxjaTZ/3F4SR72q7sBIiSU6BWjzc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsG4uT%2FbtsA7uxjaTZ%2F3F4SR72q7sBIiSU6BWjzc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;885&quot; height=&quot;299&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;299&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;885&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCh9Ux/btsAYHEYQHH/sbkWtLs1RkZneNL7MEK3X1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCh9Ux/btsAYHEYQHH/sbkWtLs1RkZneNL7MEK3X1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCh9Ux/btsAYHEYQHH/sbkWtLs1RkZneNL7MEK3X1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCh9Ux%2FbtsAYHEYQHH%2FsbkWtLs1RkZneNL7MEK3X1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;885&quot; height=&quot;667&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;667&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;3.&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(atoi.asm) &lt;/span&gt;&lt;span&gt;사용자로부터&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;십진수&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;문자만으로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;이루어진&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;문자열&lt;/span&gt;&lt;span&gt;(&amp;lsquo;0&amp;rsquo; ~ &amp;lsquo;9&amp;rsquo;&lt;/span&gt;&lt;span&gt;로만&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;이루어진&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;문자열&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;입력&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;받고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;이를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;해당&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;정수로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;변환하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;프로그램&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;atoi.asm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;작성하시오&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;프로그램을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;어셈블&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;링크하여&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;실행&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;파일&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;atoi&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;생성하고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;이를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;실행시킨&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;결과를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;화면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;캡쳐&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;하여&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;첨부하시오&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;또한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;작성한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;소스&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;코드도&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;화면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;캡쳐하여&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;첨부하시오&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;ASM IO &lt;/span&gt;&lt;span&gt;라이브러리의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;read_int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;루틴은&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용할&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;없다&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;문제&lt;/span&gt;&lt;span&gt; &lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span&gt;번과&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;같이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;반드시&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;read_char&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;반복&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;호출하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;형태이어야&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;함&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;십진수&lt;/span&gt;&lt;span&gt; 1234 &lt;/span&gt;&lt;span&gt;의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;경우&lt;/span&gt;&lt;span&gt;, 1234 = 1x103 + 2x102 + 3x101 + 4x100 = (((((0+1) x 10) + 2) x 10) + 3) x 10 +4 &lt;/span&gt;&lt;span&gt;임을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;활용한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;문자&lt;/span&gt;&lt;span&gt; &amp;lsquo;0&amp;rsquo;&lt;/span&gt;&lt;span&gt;의&lt;/span&gt;&lt;span&gt; ASCII &lt;/span&gt;&lt;span&gt;코드&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;값은&lt;/span&gt;&lt;span&gt; 0x30, &lt;/span&gt;&lt;span&gt;문자&lt;/span&gt;&lt;span&gt; &amp;lsquo;1&amp;rsquo;&lt;/span&gt;&lt;span&gt;의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;값은&lt;/span&gt;&lt;span&gt; 0x31, &amp;hellip;, &lt;/span&gt;&lt;span&gt;문자&lt;/span&gt;&lt;span&gt; &amp;lsquo;9&amp;rsquo;&lt;/span&gt;&lt;span&gt;의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;값은&lt;/span&gt;&lt;span&gt; 0x39 &lt;/span&gt;&lt;span&gt;이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;숫자&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;변환이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;제대로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;되었는지&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;확인하기&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;위해&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;print_int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;루틴을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용하여&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;계산된&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;숫자값을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;출력해&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;보도록&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baar7W/btsA0atvacm/Hc5e5x5LWs2OdNMc8SL6t1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baar7W/btsA0atvacm/Hc5e5x5LWs2OdNMc8SL6t1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baar7W/btsA0atvacm/Hc5e5x5LWs2OdNMc8SL6t1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbaar7W%2FbtsA0atvacm%2FHc5e5x5LWs2OdNMc8SL6t1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;823&quot; height=&quot;67&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;67&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;885&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mWcxT/btsA8qnJYEK/d3mQuuVKOLKnn4nfit6smK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mWcxT/btsA8qnJYEK/d3mQuuVKOLKnn4nfit6smK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mWcxT/btsA8qnJYEK/d3mQuuVKOLKnn4nfit6smK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmWcxT%2FbtsA8qnJYEK%2Fd3mQuuVKOLKnn4nfit6smK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;885&quot; height=&quot;145&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;145&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;885&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vkyc9/btsA1fatRDT/erFkpTbTJwAb7cF4wFo1BK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vkyc9/btsA1fatRDT/erFkpTbTJwAb7cF4wFo1BK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vkyc9/btsA1fatRDT/erFkpTbTJwAb7cF4wFo1BK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvkyc9%2FbtsA1fatRDT%2FerFkpTbTJwAb7cF4wFo1BK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;885&quot; height=&quot;738&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;738&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>CS/시스템소프트웨어</category>
      <author>솔라솔</author>
      <guid isPermaLink="true">https://dev-sol-chive.tistory.com/17</guid>
      <comments>https://dev-sol-chive.tistory.com/entry/%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-2-Loop#entry17comment</comments>
      <pubDate>Wed, 29 Nov 2023 08:18:26 +0900</pubDate>
    </item>
    <item>
      <title>디자인패턴 정리 - DAO 과제 실습</title>
      <link>https://dev-sol-chive.tistory.com/entry/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%A0%95%EB%A6%AC-DAO-%EA%B3%BC%EC%A0%9C-%EC%8B%A4%EC%8A%B5</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;☀️ 인트로&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요 솔라솔입니다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 과제였던 DAO 패턴 과제를 정리해보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIz2iC/btsA4W1iBw8/CiksrCplpirKzOKpY7S9E1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIz2iC/btsA4W1iBw8/CiksrCplpirKzOKpY7S9E1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIz2iC/btsA4W1iBw8/CiksrCplpirKzOKpY7S9E1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIz2iC%2FbtsA4W1iBw8%2FCiksrCplpirKzOKpY7S9E1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;534&quot; height=&quot;321&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☀️ 과제-1.DAO 패턴&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;웹사이트의 아이디와 비밀번호를 관리하는 프로그램 을 DAO 패턴을 이용해서 작성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  웹사이트 URL, 아이디, 비밀번호를 DB에 저장, 수정, 삭제 및 검색 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;Sqlite를 이용해서 다음에 해당되는 테이블 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;Db파일 이름과 테이블 이름은 본인이 결정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c85zx7/btsAUHRG8Gl/sifoNikoCBBiUdsLq1WSDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c85zx7/btsAUHRG8Gl/sifoNikoCBBiUdsLq1WSDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c85zx7/btsAUHRG8Gl/sifoNikoCBBiUdsLq1WSDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc85zx7%2FbtsAUHRG8Gl%2FsifoNikoCBBiUdsLq1WSDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;552&quot; height=&quot;136&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;main()에서 할 일&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;다음 데이터를 DB에 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.smu.ac.kr,&quot;&gt;https://www.smu.ac.kr,&lt;/a&gt; &quot;smu&quot;, &quot;abcde&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.smu2.ac.kr,&quot;&gt;https://www.smu2.ac.kr,&lt;/a&gt; &quot;smu2&quot;, &quot;abcde&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  데이터가 제대로 추가되었는지 모든 데이터를 출력해서 확인(SELECT로 확인)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;두 번째 데이터의 id인 &quot;smu2&quot;를 &quot;smu1&quot;으로 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  해당 데이터가 제대로 수정되었는지 데이터를 출력해서 확인(SELECT로 확인)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;&quot;&lt;a href=&quot;https://www.smu2.ac.kr&quot;&gt;https://www.smu2.ac.kr&lt;/a&gt;&quot; 데이터 삭제(key로 삭제)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;전체 데이터 출력해서 데이터가 제대로 삭제되었는지 확인&lt;/p&gt;
&lt;pre id=&quot;code_1701056215394&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class PasswordInfo {
private String url;
private String id;
private String password;
PasswordInfo(String url, String id, String pw){
this.url = url;
this.id = id;
this.password = pw;
}
public String toString() {
return &quot;&quot; + url + &quot;, &quot; + id + &quot;, &quot; + password;
}
public String getUrl() { return url; }
public void setName(String url) { this.url = url; }
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getPassword() { return password; }
public void setPassword(String pw) {
this.password = pw;
}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DAO 인터페이스&lt;/p&gt;
&lt;pre id=&quot;code_1701056240500&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.List;
public interface PasswordDAO {
public void insert(PasswordInfo p);
public List&amp;lt;PasswordInfo&amp;gt; findAll();
public PasswordInfo findByKey(String url);
public void update(PasswordInfo p);
public void delete(String url);
public void delete(PasswordInfo p);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☀️ 실습진행&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PassWordInfo 먼저 만들고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 있던 address 내용과 passwordinfo 를 바탕으로 일반화 시킨 class 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;generics 이용해서 일반화된 DAO 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 이용해서 Passwordinfo 다시 수정하는 과정을 거칠것임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AddressBook 의코드와 흡사하기때문에 이를 쓸 예정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mM9vf/btsAUo5OfUd/eTzwYLwWZEOT1TEuKfEsHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mM9vf/btsAUo5OfUd/eTzwYLwWZEOT1TEuKfEsHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mM9vf/btsAUo5OfUd/eTzwYLwWZEOT1TEuKfEsHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmM9vf%2FbtsAUo5OfUd%2FeTzwYLwWZEOT1TEuKfEsHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;335&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;692&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;1272&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lOm5b/btsA1dWA1Nh/sJ1ubjtpBkkj5qCxGKnvSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lOm5b/btsA1dWA1Nh/sJ1ubjtpBkkj5qCxGKnvSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lOm5b/btsA1dWA1Nh/sJ1ubjtpBkkj5qCxGKnvSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlOm5b%2FbtsA1dWA1Nh%2FsJ1ubjtpBkkj5qCxGKnvSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;582&quot; height=&quot;296&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;646&quot;/&gt;&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;1284&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIKUBr/btsA2YZbo6p/dVWbjA23d966EhHpFyFSxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIKUBr/btsA2YZbo6p/dVWbjA23d966EhHpFyFSxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIKUBr/btsA2YZbo6p/dVWbjA23d966EhHpFyFSxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIKUBr%2FbtsA2YZbo6p%2FdVWbjA23d966EhHpFyFSxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;582&quot; height=&quot;276&quot; data-origin-width=&quot;1284&quot; data-origin-height=&quot;610&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;1448&quot; data-origin-height=&quot;828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8Qtbd/btsA2tEYcsc/mAyqpmvRFokx9FNvZLDto0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8Qtbd/btsA2tEYcsc/mAyqpmvRFokx9FNvZLDto0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8Qtbd/btsA2tEYcsc/mAyqpmvRFokx9FNvZLDto0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8Qtbd%2FbtsA2tEYcsc%2FmAyqpmvRFokx9FNvZLDto0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;503&quot; height=&quot;288&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1332&quot; data-origin-height=&quot;808&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yIDoa/btsA27hvPce/K8sSiZ3gCvPfFU6zFom9uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yIDoa/btsA27hvPce/K8sSiZ3gCvPfFU6zFom9uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yIDoa/btsA27hvPce/K8sSiZ3gCvPfFU6zFom9uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyIDoa%2FbtsA27hvPce%2FK8sSiZ3gCvPfFU6zFom9uk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;591&quot; height=&quot;359&quot; data-origin-width=&quot;1332&quot; data-origin-height=&quot;808&quot;/&gt;&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;Person이었던 애들을 PassWordInfo 로 바꾼다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;994&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxYB28/btsAZ8HQNTm/OKqMqtIr2XcK7KENdDTet1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxYB28/btsAZ8HQNTm/OKqMqtIr2XcK7KENdDTet1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxYB28/btsAZ8HQNTm/OKqMqtIr2XcK7KENdDTet1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxYB28%2FbtsAZ8HQNTm%2FOKqMqtIr2XcK7KENdDTet1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;357&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;994&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FindById 를 FindByKey 로 수정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sL8vF/btsAWjC66Mj/L622W6fkfut7oFydUy9zm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sL8vF/btsAWjC66Mj/L622W6fkfut7oFydUy9zm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sL8vF/btsAWjC66Mj/L622W6fkfut7oFydUy9zm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsL8vF%2FbtsAWjC66Mj%2FL622W6fkfut7oFydUy9zm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;613&quot; height=&quot;286&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;364&quot;/&gt;&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;수정한 PasswordDAO.java&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;import java.util.List;

public interface PasswordDAO {
    public void insert(PasswordInfo p);
    public List&amp;lt;PasswordInfo&amp;gt; findAll();
    public PasswordInfo findByKey(String Key);
    public void update(PasswordInfo p);
    public void delete(String key);
    public void delete(PasswordInfo p);
}
&lt;/code&gt;&lt;/pre&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;수정한 PassWordDaoImpl.java&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class PassWordDaoImpl implements PaswwordDAO {
    final static String DB_FILE_NAME = &quot;passwords.db&quot;;
    final static String DB_TABLE_NAME = &quot;paswords&quot;;

    Connection connection = null;
    ResultSet rs = null;
    Statement statement = null;

    public PassWordDaoImpl() {
        try {
            connection = DriverManager.getConnection(&quot;jdbc:sqlite:&quot; + DB_FILE_NAME);
            statement = connection.createStatement();
            statement.setQueryTimeout(30);  // set timeout to 30 sec.
            final String table = &quot; (URL text PRIMARY KEY AUTOINCREMENT, id text, password text)&quot;;

            // create table
            statement.executeUpdate(&quot;DROP TABLE IF EXISTS &quot; + DB_TABLE_NAME);
            statement.executeUpdate(&quot;CREATE TABLE &quot; + DB_TABLE_NAME + table);
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void insert(PassWordInfo p) {
        try {
            String fmt = &quot;INSERT INTO %s VALUES('%s', '%s', '%s')&quot;;
            String q = String.format(fmt, DB_TABLE_NAME, p.getURL(), p.getId(), p.getPassword());
            
            statement.execute(q);
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public List&amp;lt;PassWordInfo&amp;gt; findAll() {
        ArrayList&amp;lt;PassWordInfo&amp;gt; PassWordInfos = new ArrayList&amp;lt;PassWordInfo&amp;gt;();
        try {
            rs = statement.executeQuery(&quot;SELECT * FROM &quot; + DB_TABLE_NAME);
            while (rs.next()) {
                PassWordInfos.add(new PassWordInfo(rs.getString(&quot;url&quot;), rs.getString(&quot;id&quot;),
                                       rs.getString(&quot;password&quot;)));
            }
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
        return PassWordInfos;
    }

    public PassWordInfo findByKey(String key) {
        PassWordInfo passWordInfo = null;
        try {
            String fmt = &quot;SELECT * FROM %s WHERE url = '%s'&quot;;
            String q = String.format(fmt, DB_TABLE_NAME, key);
            rs = statement.executeQuery(q);
            if (rs.next()) {
                PassWordInfo = new PassWordInfo(rs.getString(&quot;url&quot;), rs.getString(&quot;id&quot;),
                                   rs.getString(&quot;password&quot;));
            }
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
        return PassWordInfo;
    }

    public void update(PassWordInfo p) {
        //PassWordInfo PassWordInfo = findByKey(p.getUrl());
        if (p != null) {
            try {
                String fmt = &quot;UPDATE %s SET id = '%s', password = '%s' WHERE url = %s&quot;;
                String q = String.format(fmt, DB_TABLE_NAME, p.getId(), p.getPassword(), p.getUrl());
                
                statement.execute(q);
            }
            catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public void delete(String Key) {
        try {
            String fmt = &quot;DELETE FROM %s WHERE url = '%s'&quot;;
            String q = String.format(fmt, DB_TABLE_NAME, key);
            
            statement.execute(q);
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void delete(PassWordInfo p) {
        delete(p.getUrl());
    }
}
&lt;/code&gt;&lt;/pre&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;Main.java&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) {
        PasswordInfo p;
        PasswordDao PasswordInfoDao = new PasswordDaoImpl();

        System.out.println(&quot;--- inserting...&quot;);
        p = new PasswordInfo(&quot;https://www.smu.ac.kr&quot;, &quot;smu&quot;, &quot;abcde&quot;);
        PasswordInfoDao.insert(p);
        p = new PasswordInfo(&quot;https://www.smu2.ac.kr&quot;, &quot;smu2&quot;, &quot;abcde&quot;);
        PasswordInfoDao.insert(p);

        System.out.println(&quot;--- finding all...&quot;);
        for (PasswordInfo pi : PasswordInfoDao.findAll()) {
            System.out.println(&quot;reading... &quot; + pi);
        }

        System.out.println(&quot;--- updating...&quot;);
        p = PasswordInfoDao.findAll().get(1);
        p.setId(&quot;smu1&quot;);
        PasswordInfoDao.update(p);

        System.out.println(&quot;--- see if updated...&quot;);
        p = PasswordInfoDao.findByKey(&quot;https://www.smu2.ac.kr&quot;);
        if (p != null) {
            System.out.println(p);
        }

        System.out.println(&quot;--- deleting...&quot;);
        PasswordInfoDao.delete(&quot;https://www.smu2.ac.kr&quot;);  // or PasswordInfoDao.delete(p);

        System.out.println(&quot;--- finding all after deleting...&quot;);
        for (PasswordInfo pi : PasswordInfoDao.findAll()) {
            System.out.println(&quot;reading... &quot; + pi);
        }
    }
}
&lt;/code&gt;&lt;/pre&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;Main.java Run한 결과&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1842&quot; data-origin-height=&quot;902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3GX0N/btsA2ZYzVo1/HOFpntw2fmo8zY6AupZvn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3GX0N/btsA2ZYzVo1/HOFpntw2fmo8zY6AupZvn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3GX0N/btsA2ZYzVo1/HOFpntw2fmo8zY6AupZvn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3GX0N%2FbtsA2ZYzVo1%2FHOFpntw2fmo8zY6AupZvn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1842&quot; height=&quot;902&quot; data-origin-width=&quot;1842&quot; data-origin-height=&quot;902&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☀️ 과제-2. 뜯어 고쳐서 Generics 화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dao.java 인터페이스&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;import java.util.List;

public interface Dao&amp;lt;D extends Data&amp;lt;K&amp;gt;, K&amp;gt; {
    public void insert(D p);
    public List&amp;lt;D&amp;gt; findAll();
    public D findByKey(K key);
    public void update(D p);
    public void deleteByKey(K key);
    public void deleteByData(D p);
}
&lt;/code&gt;&lt;/pre&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;DaoImpl.java&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public abstract class DaoImpl&amp;lt;D extends Data&amp;lt;K&amp;gt;, K&amp;gt; implements Dao&amp;lt;D, K&amp;gt; {
    public abstract String getDBFileName();
    public abstract String getTableName();
    public abstract String getTableCreationString();
    public abstract String getInsertString(D p);
    public abstract D getNewInstance(ResultSet rs);
    public abstract String getKeyColumnName();
    public abstract String getUpdateString(D p);

    Connection connection = null;
    ResultSet rs = null;
    Statement statement = null;

    public DaoImpl() {
        try {
            connection = DriverManager.getConnection(&quot;jdbc:sqlite:&quot; + getDBFileName());
            statement = connection.createStatement();
            statement.setQueryTimeout(30);  // set timeout to 30 sec.
            // create table
            statement.executeUpdate(&quot;DROP TABLE IF EXISTS &quot; + getTableName());
            statement.executeUpdate(&quot;CREATE TABLE &quot; + getTableName() + getTableCreationString());
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void insert(D p) {
        try {
            String fmt = &quot;INSERT INTO %s VALUES(%s)&quot;;
            String q = String.format(fmt, getTableName(), getInsertString(p));

            statement.execute(q);
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public List&amp;lt;D&amp;gt; findAll() {
        ArrayList&amp;lt;D&amp;gt; lst = new ArrayList&amp;lt;D&amp;gt;();
        try {
            rs = statement.executeQuery(&quot;SELECT * FROM &quot; + getTableName());
            while (rs.next()) {
                lst.add(getNewInstance(rs));
            }
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
        return lst;
    }

    public D findByKey(K key) {
        D d = null;
        try {
            String fmt = &quot;SELECT * FROM %s WHERE %s = '%s'&quot;;
            String q = String.format(fmt, getTableName(), getKeyColumnName(), key);
            rs = statement.executeQuery(q);
            if (rs.next()) {
                d = getNewInstance(rs);
            }
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
        return d;
    }

    public void update(D p) {
        if (p != null) {
            try {
                String fmt = &quot;UPDATE %s SET %s WHERE %s = '%s'&quot;;
                String q = String.format(fmt, getTableName(), getUpdateString(p), getKeyColumnName(), p.getKey());

                statement.execute(q);
            }
            catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public void deleteByKey(K key) {
        try {
            String fmt = &quot;DELETE FROM %s WHERE %s = '%s'&quot;;
            String q = String.format(fmt, getTableName(), getKeyColumnName(), key);

            statement.execute(q);
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void deleteByData(D p) {
        deleteByKey(p.getKey());
    }
}
&lt;/code&gt;&lt;/pre&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;Data.java 인터페이스&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;public interface Data&amp;lt;K&amp;gt; {
    K getKey();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 추가한다.&lt;/p&gt;</description>
      <category>CS/고급객체지향프로그래밍</category>
      <category>고객프</category>
      <author>솔라솔</author>
      <guid isPermaLink="true">https://dev-sol-chive.tistory.com/16</guid>
      <comments>https://dev-sol-chive.tistory.com/entry/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%A0%95%EB%A6%AC-DAO-%EA%B3%BC%EC%A0%9C-%EC%8B%A4%EC%8A%B5#entry16comment</comments>
      <pubDate>Tue, 28 Nov 2023 09:25:41 +0900</pubDate>
    </item>
    <item>
      <title>디자인패턴 정리 - DAO 패턴</title>
      <link>https://dev-sol-chive.tistory.com/entry/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-%EC%A0%95%EB%A6%AC-DAO-%ED%8C%A8%ED%84%B4</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;안녕하세요. 솔라솔입니다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;고급객체지향프로그래밍 전공 수업도중 배운 DAO 패턴에 대해 정리해보려 합니다. DAO 패턴의 경우 데이터베이스 전공 수업 도중 배운 내용들과 연관이 깊은 것 같아 비교적 쉽게 이해할 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;아마 여러분들 중에도 데이터베이스 수업을 수강하셨던 분들은 DAO 패턴에는 큰 어려움이 없으실 것이라 예상합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☀️ DAO 패턴이란&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(Data Access Object) 패턴&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;목적&lt;/b&gt;: 비즈니스로직(업무) 와 DBMS 를 분리하기 위해 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업무와 데이터 2계층을 분리하고, 서로 그 상태를 동일하게 유지 (persisetence)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;문제&lt;/b&gt;: DB 를 사용하는 방법이 변경되면 클라이언트의 수정이 많아진다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 저장하는 방식이 다양하다.(데이터베이스, 파일,XML, csv파일 등)&lt;/li&gt;
&lt;li&gt;사용하는 방법이 다르면 변경 부분이 많아진다.(ex. DBMS 에 따라 SQL 문이 다를 수 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해결방안&lt;/b&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;&lt;b&gt;결과&lt;/b&gt;: loose coupling, 확장성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1667&quot; data-origin-height=&quot;1007&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NVgqG/btsAUnZZVrK/DATmaDIPqGALmMAyPRB5o0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NVgqG/btsAUnZZVrK/DATmaDIPqGALmMAyPRB5o0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NVgqG/btsAUnZZVrK/DATmaDIPqGALmMAyPRB5o0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNVgqG%2FbtsAUnZZVrK%2FDATmaDIPqGALmMAyPRB5o0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;628&quot; height=&quot;379&quot; data-origin-width=&quot;1667&quot; data-origin-height=&quot;1007&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☀️ 사례1. 주소록&lt;/h2&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;CRUD(Create, Read, Update, Delete)를 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;주소록 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 사용자가 데이터베이스를 생성하고 데이터를 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 수정 요청(데이터가 존재하는지 확인)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 삭제 요청(데이터가 존재하는지 확인)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;세가지 버전으로 개발&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;1. AddressBookWithoutDao -&amp;gt; 막 코딩한 버전&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; DAO 패턴 사용하지 않고 직접 DB를 조작.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 데이터베이스는 Sqlite 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 데이터베이스 파일이름 (AddressBoo.db)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 테이블 구조 (Table name: persons)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;2. AddressBookWithList -&amp;gt; 메모리에 저장&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; DAO 패턴을 사용하지만, DB를 사용하는 것이 아니고, ArrayList를 이용해서 개발&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;3. AddressBookWithDao -&amp;gt; DB 이용 버전&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; DAO 패턴과 DB를 이용해서 개발&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☀️ 1) AddressBookWithoutDao&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DAO 패턴 사용하지 않고 직접 DB를 조작.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;데이터베이스는 Sqlite 사용&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp; &amp;nbsp; 데이터베이스 파일이름 (AddressBoo.db)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp; &amp;nbsp; 테이블 구조 (Table name: persons)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;** 참고) JDBC&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;데이터베이스&amp;nbsp;비종속적인&amp;nbsp;표준&amp;nbsp;자바&amp;nbsp;API&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 다양한 데이터베이스를 동일한 인터페이스로 사용할 수&amp;nbsp;있도록&amp;nbsp;함&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 각종 데이터베이스는 JDBC Driver를 통해서 연결하고 사 용&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;주 사용 방법&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 데이터베이스에 연결&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- SQL 쿼리 작성 후 데이터베이스에서 실행&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 결과로 반환되는 데이터를 수정하거나 화면에 출력&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1663&quot; data-origin-height=&quot;1201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/siMwN/btsASvY3LiT/rNYY1skQiBRauN02UMxc80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/siMwN/btsASvY3LiT/rNYY1skQiBRauN02UMxc80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/siMwN/btsASvY3LiT/rNYY1skQiBRauN02UMxc80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsiMwN%2FbtsASvY3LiT%2FrNYY1skQiBRauN02UMxc80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;545&quot; height=&quot;394&quot; data-origin-width=&quot;1663&quot; data-origin-height=&quot;1201&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 만져보자!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3012&quot; data-origin-height=&quot;1068&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lmgVT/btsAUJaRuKp/hxrQelqyndXgT8xFGuudPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lmgVT/btsAUJaRuKp/hxrQelqyndXgT8xFGuudPk/img.png&quot; data-alt=&quot;src 코드 옮긴 뒤에&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lmgVT/btsAUJaRuKp/hxrQelqyndXgT8xFGuudPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlmgVT%2FbtsAUJaRuKp%2FhxrQelqyndXgT8xFGuudPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3012&quot; height=&quot;1068&quot; data-origin-width=&quot;3012&quot; data-origin-height=&quot;1068&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;src 코드 옮긴 뒤에&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Project Structure 선택 후&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2854&quot; data-origin-height=&quot;996&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RrZlN/btsASqwTUQ6/BJOHAhtKqoi3gpYBZBQ4K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RrZlN/btsASqwTUQ6/BJOHAhtKqoi3gpYBZBQ4K1/img.png&quot; data-alt=&quot;sqlite 를 libraries 에 추가한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RrZlN/btsASqwTUQ6/BJOHAhtKqoi3gpYBZBQ4K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRrZlN%2FbtsASqwTUQ6%2FBJOHAhtKqoi3gpYBZBQ4K1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2854&quot; height=&quot;996&quot; data-origin-width=&quot;2854&quot; data-origin-height=&quot;996&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;sqlite 를 libraries 에 추가한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1701054233141&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.sql.*;
import java.util.Properties;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class AddressBookWithoutDAO {
    final static String DB_FILE_NAME = &quot;addressbook.db&quot;;
    final static String DB_TABLE_NAME = &quot;persons&quot;;

    public static void main (String[] args){
        Connection connection = null;
        ResultSet rs = null;
        Statement statement = null;
        try {
            connection = DriverManager.getConnection(
                    &quot;jdbc:sqlite:&quot; + DB_FILE_NAME);
            statement = connection.createStatement();
            statement.setQueryTimeout(30);

            final String table = &quot; (ID INTEGER PRIMARY KEY AUTOINCREMENT, name text, address text)&quot;;

            // create table
            statement.executeUpdate(
                    &quot;DROP TABLE IF EXISTS &quot; + DB_TABLE_NAME);
            statement.executeUpdate(
                    &quot;CREATE TABLE &quot; + DB_TABLE_NAME + table);

            System.out.println(&quot;--- inserting...&quot;);
            statement.execute(&quot;INSERT INTO persons(name, address) VALUES('Seonyoung Kim','1 Hongji Dong')&quot;);
            statement.execute(&quot;INSERT INTO persons(name, address) VALUES('Jangkwon Lee','2 Hongji Dong')&quot;);
            System.out.println(&quot;--- finding all...&quot;);
            rs = statement.executeQuery(
                    &quot;SELECT * FROM persons&quot;);// WHERE id &amp;lt; 4 ORDER BY id&quot;);
            while (rs.next()) {
                System.out.println(
                        &quot;&quot; + rs.getInt(&quot;ID&quot;) + &quot;, &quot;
                                + rs.getString(&quot;name&quot;) + &quot;, &quot;
                                + rs.getString(&quot;address&quot;));
            }

            System.out.println(&quot;--- updating...&quot;);
            statement.execute(
                    &quot;UPDATE persons SET name = 'Sooyoung Lim' WHERE id = 1&quot;);

            System.out.println(&quot;--- see if updated...&quot;);
            rs = statement.executeQuery(
                    &quot;SELECT * FROM persons WHERE id = 1&quot;);
            while (rs.next()) {
                System.out.println(rs.getInt(&quot;id&quot;) + &quot;, &quot;
                        + rs.getString(&quot;name&quot;) + &quot;, &quot;
                        + rs.getString(&quot;address&quot;));
            }
            System.out.println(&quot;--- deleting...&quot;);
            statement.execute(
                    &quot;DELETE FROM persons WHERE id = 1&quot;);

            System.out.println(&quot;--- finding all after deleting...&quot;);
            rs = statement.executeQuery(
                    &quot;SELECT * FROM persons WHERE id &amp;lt; 4 ORDER BY id&quot;);
            while (rs.next()) {
                System.out.println(rs.getInt(&quot;id&quot;) + &quot;, &quot;
                        + rs.getString(&quot;name&quot;) + &quot;, &quot;
                        + rs.getString(&quot;address&quot;));
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
        finally {
            try {
                if (rs != null) { rs.close(); }
                if (statement != null) { statement.close(); }
                if (connection != null) { connection.close(); }
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    } // main
} // class&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;위 코드 run 시 다음과 같은 결과가 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1758&quot; data-origin-height=&quot;856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/taPlk/btsATeo7XJk/aN0l8kdhPsDy0AnYpzB4R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/taPlk/btsATeo7XJk/aN0l8kdhPsDy0AnYpzB4R1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/taPlk/btsATeo7XJk/aN0l8kdhPsDy0AnYpzB4R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtaPlk%2FbtsATeo7XJk%2FaN0l8kdhPsDy0AnYpzB4R1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1758&quot; height=&quot;856&quot; data-origin-width=&quot;1758&quot; data-origin-height=&quot;856&quot;/&gt;&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;AddressBookWithMySQLDB.java&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;/* 실행 전에 MySQL 또는 MariaDB가 설치되어 있어야 함
   MySql client를 실행시켜서 다음 명령어 실행
   0. c:\&amp;gt;mysql -u root -p
   Enter password: *******  &amp;lt;-- root 비밀번호 입력   
   1. MySQL(또는 MariaDB)에 addruser와 addrpw를 추가
   mysql&amp;gt; create user 'addruser'@'localhost' identified by 'addrpw';
   2. Database 생성
   mysql&amp;gt; create database AddressBook;
   3. addruser가 생성된 데이터베이스에 접근할 수 있도록 지정
   mysql&amp;gt; grant all privileges on *.* to 'addruser'@'localhost';
   mysql&amp;gt; grant all privileges on AddressBook.* to 'addruser'@'localhost';
   mysql&amp;gt; flush privileges;
   mysql&amp;gt; exit
*/

import java.sql.*;

public class AddressBookWithMySQLDB {
//    static final String MARIA_DB_JDBC_DRIVER = &quot;org.mariadb.jdbc.Driver&quot;; // MariaDB driver
    static final String MYSQL_JDBC_DRIVER = &quot;com.mysql.cj.jdbc.Driver&quot;; // MySQL driver
    static final String DB_NAME = &quot;AddressBook&quot;;
    static final String DB_FILE_NAME = &quot;addressbook.db&quot;;
    static final String DB_TABLE_NAME = &quot;persons&quot;;

    static final String USERNAME = &quot;addruser&quot;;
    static final String PASSWORD = &quot;addrpw&quot;;

    public static void main (String[] args){
        Connection connection = null;
        ResultSet rs = null;
        Statement statement = null;
        try {
//            Class.forName(MARIA_DB_JDBC_DRIVER); // loading a JDBC driver
            Class.forName(MYSQL_JDBC_DRIVER); // loading a JDBC driver
            //        connection = DriverManager.getConnection(&quot;jdbc:mariadb://localhost:3306/&quot; + DB_NAME, USERNAME,  PASSWORD);
            connection = DriverManager.getConnection(&quot;jdbc:mysql://localhost:3306/&quot; + DB_NAME, USERNAME,  PASSWORD);  // MySQL
            statement = connection.createStatement();
            statement.setQueryTimeout(30);  // set timeout to 30 sec.

            final String table = &quot; (id int(64) NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL, address varchar(255) NOT NULL, UNIQUE(id))&quot;;
            // create table
            statement.executeUpdate(&quot;DROP TABLE IF EXISTS &quot; + DB_TABLE_NAME);
            statement.executeUpdate(&quot;CREATE TABLE &quot; + DB_TABLE_NAME + table);

            System.out.println(&quot;--- inserting...&quot;);
            statement.execute(&quot;INSERT INTO persons(name, address) VALUES('Seonyoung Kim','1 Hongji Dong')&quot;);
            statement.execute(&quot;INSERT INTO persons(name, address) VALUES('Jangkwon Lee','2 Hongji Dong')&quot;);

            System.out.println(&quot;--- finding all...&quot;);
            rs = statement.executeQuery(&quot;SELECT * FROM persons WHERE id &amp;lt; 4 ORDER BY id&quot;);
            while (rs.next()) {
                System.out.println(&quot;&quot; + rs.getInt(&quot;ID&quot;) + &quot;, &quot; + rs.getString(&quot;name&quot;) + &quot;, &quot; + rs.getString(&quot;address&quot;));
            }

            System.out.println(&quot;--- updating...&quot;);
            statement.execute(&quot;UPDATE persons SET name = 'Sooyoung Lim' WHERE id = 1&quot;);

            System.out.println(&quot;--- see if updated...&quot;);
            rs = statement.executeQuery(&quot;SELECT * FROM persons WHERE id = 1&quot;);
            while (rs.next()) {
                System.out.println(rs.getInt(&quot;id&quot;) + &quot;, &quot; + rs.getString(&quot;name&quot;) + &quot;, &quot; + rs.getString(&quot;address&quot;));
            }

            System.out.println(&quot;--- deleting...&quot;);
            statement.execute(&quot;DELETE FROM persons WHERE id = 1&quot;);

            System.out.println(&quot;--- finding all after deleting...&quot;);
            rs = statement.executeQuery(&quot;SELECT * FROM persons WHERE id &amp;lt; 4 ORDER BY id&quot;);
            while (rs.next()) {
                System.out.println(rs.getInt(&quot;id&quot;) + &quot;, &quot; + rs.getString(&quot;name&quot;) + &quot;, &quot; + rs.getString(&quot;address&quot;));
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
        finally {
            try {
                if(rs != null) {
                    rs.close();
                }
                if(statement != null) {
                    statement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☀️ 2) AddressBookWithList&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DAO 패턴을 사용하지만, DB를 사용하는 것이 아니고, ArrayList를 이용해서 개발&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DAO 인터페이스&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;import java.util.List;

public interface PersonDao {
    public void insert(Person p);
    public List&amp;lt;Person&amp;gt; findAll();
    public Person findById(int id);
    public void update(int id, Person p);
    public void delete(int id);
    public void delete(Person p);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Person.java&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;public class Person {
    private static int counter = 1;
    private int id;
    private String name;
    private String address;
    
    Person(String name, String address) {
        this.name = name;
        this.address = address;
        id = counter;
        counter++;
    }

    Person(int id, String name, String address) {
        this.name = name;
        this.address = address;
        this.id = id;
    }

    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String toString() {
        return &quot;&quot; + id + &quot;, &quot; + name + &quot;, &quot; + address;
    }
}
&lt;/code&gt;&lt;/pre&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;PersonDaoImpl.java&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;import java.util.ArrayList;
import java.util.List;

public class PersonDaoImpl implements PersonDao {
    List&amp;lt;Person&amp;gt; persons;

    public PersonDaoImpl() {
        persons = new ArrayList&amp;lt;Person&amp;gt;();
    }

    public void insert(Person p) {
        persons.add(p);
    }

    public List&amp;lt;Person&amp;gt; findAll() {
        return persons;
    }

    public Person findById(int id) {
        for (Person pi : persons) {
            if (pi.getId() == id) {
                return pi;
            }
        }
        return null;
    }

    public void update(int id, Person p) {
        Person person = findById(id);
        if (person != null) {
            person.setName(p.getName());
            person.setAddress(p.getAddress());
        }
    }

    public void delete(int id) {
        Person person = findById(id);
        if (person != null) {
            persons.remove(person);
        }
    }

    public void delete(Person p) {
        persons.remove(p);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Address.java&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;public class AddressBook {
    public static void main(String[] args) {
        Person p;
        PersonDao personDao = new PersonDaoImpl();

        System.out.println(&quot;--- inserting...&quot;);
        p = new Person(&quot;Seonyoung Kim&quot;, &quot;1 Hongji Dong&quot;);
        personDao.insert(p);
        p = new Person(&quot;Jangkwon Lee&quot;, &quot;2 Hongji Dong&quot;);
        personDao.insert(p);

        System.out.println(&quot;--- finding all...&quot;);
        for (Person pi : personDao.findAll()) {
            System.out.println(&quot;reading... &quot; + pi);
        }

        System.out.println(&quot;--- updating...&quot;);
        p = personDao.findAll().get(0);
        p.setName(&quot;Sooyoung Lim&quot;);
        personDao.update(p.getId(), p);

        System.out.println(&quot;--- see if updated...&quot;);
        p = personDao.findById(1);
        if (p != null) {
            System.out.println(p);
        }

        System.out.println(&quot;--- deleting...&quot;);
        personDao.delete(1);  // or personDao.delete(p);

        System.out.println(&quot;--- finding all after deleting...&quot;);
        for (Person pi : personDao.findAll()) {
            System.out.println(&quot;reading... &quot; + pi);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☀️ 3) AddressBookWithDao&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DAO 패턴과 DB를 이용해서 개발&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DAO 인터페이스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Person 클래스의 CRUD 를 마찬가지로 지정&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;import java.util.List;

public interface PersonDao {
    public void insert(Person p);
    public List&amp;lt;Person&amp;gt; findAll();
    public Person findById(int id);
    public void update(int id, Person p);
    public void delete(int id);
    public void delete(Person p);
}
&lt;/code&gt;&lt;/pre&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;b&gt;PersonDaoImpl.java&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class PersonDaoImpl implements PersonDao {
    final static String DB_FILE_NAME = &quot;addrbook.db&quot;;
    final static String DB_TABLE_NAME = &quot;persons&quot;;

    Connection connection = null;
    ResultSet rs = null;
    Statement statement = null;

    public PersonDaoImpl() {
        try {
            connection = DriverManager.getConnection(&quot;jdbc:sqlite:&quot; + DB_FILE_NAME);
            statement = connection.createStatement();
            statement.setQueryTimeout(30);  // set timeout to 30 sec.
            final String table = &quot; (ID INTEGER PRIMARY KEY AUTOINCREMENT, name text, address text)&quot;;

            // create table
            statement.executeUpdate(&quot;DROP TABLE IF EXISTS &quot; + DB_TABLE_NAME);
            statement.executeUpdate(&quot;CREATE TABLE &quot; + DB_TABLE_NAME + table);
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void insert(Person p) {
        try {
            String fmt = &quot;INSERT INTO %s VALUES(%d, '%s', '%s')&quot;;
            String q = String.format(fmt, DB_TABLE_NAME, p.getId(), p.getName(), p.getAddress());
            
            statement.execute(q);
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public List&amp;lt;Person&amp;gt; findAll() {
        ArrayList&amp;lt;Person&amp;gt; persons = new ArrayList&amp;lt;Person&amp;gt;();
        try {
            rs = statement.executeQuery(&quot;SELECT * FROM &quot; + DB_TABLE_NAME);
            while (rs.next()) {
                persons.add(new Person(rs.getInt(&quot;id&quot;), rs.getString(&quot;name&quot;),
                                       rs.getString(&quot;address&quot;)));
            }
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
        return persons;
    }

    public Person findById(int id) {
        Person person = null;
        try {
            String fmt = &quot;SELECT * FROM %s WHERE id = %d&quot;;
            String q = String.format(fmt, DB_TABLE_NAME, id);
            rs = statement.executeQuery(q);
            if (rs.next()) {
                person = new Person(rs.getInt(&quot;id&quot;), rs.getString(&quot;name&quot;),
                                   rs.getString(&quot;address&quot;));
            }
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
        return person;
    }

    public void update(int id, Person p) {
        Person person = findById(id);
        if (person != null) {
            try {
                String fmt = &quot;UPDATE %s SET name = '%s', address = '%s' WHERE id = %d&quot;;
                String q = String.format(fmt, DB_TABLE_NAME, p.getName(), p.getAddress(), p.getId());
                
                statement.execute(q);
            }
            catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public void delete(int id) {
        try {
            String fmt = &quot;DELETE FROM %s WHERE id = %d&quot;;
            String q = String.format(fmt, DB_TABLE_NAME, id);
            
            statement.execute(q);
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void delete(Person p) {
        delete(p.getId());
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Person.java&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;public class Person {
    private static int counter = 1;
    private int id;
    private String name;
    private String address;

    Person(String name, String address) {
        this.name = name;
        this.address = address;
        id = counter;
        counter++;
    }

    Person(int id, String name, String address){
        this.name = name;
        this.address = address;
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String toString() {
        return &quot;&quot; + id + &quot;, &quot; + name + &quot;, &quot; + address;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AddressBookWithDAO.java&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class AddressBookWithDAO {
    public static void main(String[] args) {
        Person p;
        PersonDao personDao = new PersonDaoImpl();

        System.out.println(&quot;--- inserting...&quot;);
        p = new Person(&quot;Seonyoung Kim&quot;, &quot;1 Hongji Dong&quot;);
        personDao.insert(p);
        p = new Person(&quot;Jangkwon Lee&quot;, &quot;2 Hongji Dong&quot;);
        personDao.insert(p);

        System.out.println(&quot;--- finding all...&quot;);
        for (Person pi : personDao.findAll()) {
            System.out.println(&quot;reading... &quot; + pi);
        }

        System.out.println(&quot;--- updating...&quot;);
        p = personDao.findAll().get(0);
        p.setName(&quot;Sooyoung Lim&quot;);
        personDao.update(p.getId(), p);

        System.out.println(&quot;--- see if updated...&quot;);
        p = personDao.findById(1);
        if (p != null) {
            System.out.println(p);
        }

        System.out.println(&quot;--- deleting...&quot;);
        personDao.delete(1);  // or personDao.delete(p);

        System.out.println(&quot;--- finding all after deleting...&quot;);
        for (Person pi : personDao.findAll()) {
            System.out.println(&quot;reading... &quot; + pi);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS/고급객체지향프로그래밍</category>
      <author>솔라솔</author>
      <guid isPermaLink="true">https://dev-sol-chive.tistory.com/15</guid>
      <comments>https://dev-sol-chive.tistory.com/entry/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-%EC%A0%95%EB%A6%AC-DAO-%ED%8C%A8%ED%84%B4#entry15comment</comments>
      <pubDate>Mon, 27 Nov 2023 12:30:18 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 스프링 웹 개발 기초</title>
      <link>https://dev-sol-chive.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%EA%B0%9C%EB%B0%9C-%EA%B8%B0%EC%B4%88</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;☀️ 인트로&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;안녕하세요.솔라솔입니다 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;김영한 강사님의 첫번째 무료강의,&amp;nbsp;&lt;span style=&quot;text-align: start;&quot;&gt;스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 듣고 배운 내용들을 정리해보고자 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;글에 오류가 있거나, 저작권 문제가 있다면 언제든지 말씀해주세요!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1700794500031&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;[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의&quot; data-og-description=&quot;스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다.   확인해주세&quot; data-og-host=&quot;www.inflearn.com&quot; data-og-source-url=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8&quot; data-og-url=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HRvvk/hyUB29DyWg/XIFIq4K16WTzkfHDovqgHK/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500,https://scrap.kakaocdn.net/dn/Z0uja/hyUCc5sWN2/wk0RGjFWCAk5wKvkEO6kN1/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500,https://scrap.kakaocdn.net/dn/rqR4r/hyUB8WijWT/qjWlmfKKV1kNyEhnaWf0Nk/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HRvvk/hyUB29DyWg/XIFIq4K16WTzkfHDovqgHK/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500,https://scrap.kakaocdn.net/dn/Z0uja/hyUCc5sWN2/wk0RGjFWCAk5wKvkEO6kN1/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500,https://scrap.kakaocdn.net/dn/rqR4r/hyUB8WijWT/qjWlmfKKV1kNyEhnaWf0Nk/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628');&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;[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다.   확인해주세&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.inflearn.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;☀️ 정적 컨텐츠&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;기본적으로 스프링 부트는 정적컨텐츠 기능을 자동으로 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-static-content&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-static-content&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1700794762779&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;Spring Boot Features&quot; data-og-description=&quot;Graceful shutdown is supported with all four embedded web servers (Jetty, Reactor Netty, Tomcat, and Undertow) and with both reactive and Servlet-based web applications. It occurs as part of closing the application context and is performed in the earliest &quot; data-og-host=&quot;docs.spring.io&quot; data-og-source-url=&quot;https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-static-content&quot; data-og-url=&quot;https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-static-content&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-static-content&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-static-content&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot Features&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Graceful shutdown is supported with all four embedded web servers (Jetty, Reactor Netty, Tomcat, and Undertow) and with both reactive and Servlet-based web applications. It occurs as part of closing the application context and is performed in the earliest&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.spring.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJ87SH/btsAQzlesYX/3AlBWPI5jiMlgdIgMKASJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJ87SH/btsAQzlesYX/3AlBWPI5jiMlgdIgMKASJ1/img.png&quot; data-alt=&quot;docs.spring.io 에 나와있듯이 /static 에서 제공합니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJ87SH/btsAQzlesYX/3AlBWPI5jiMlgdIgMKASJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJ87SH%2FbtsAQzlesYX%2F3AlBWPI5jiMlgdIgMKASJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;143&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docs.spring.io 에 나와있듯이 /static 에서 제공합니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1700795072215&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; &amp;lt;!DOCTYPE HTML&amp;gt;
  &amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
      &amp;lt;title&amp;gt;static content&amp;lt;/title&amp;gt;
      &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&amp;gt;
  &amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
정적 컨텐츠 입니다.
  &amp;lt;/body&amp;gt;
  &amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1584&quot; data-origin-height=&quot;1182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwAQuY/btsAONksdPw/vK0xgSVwerlvQOmwbo2VDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwAQuY/btsAONksdPw/vK0xgSVwerlvQOmwbo2VDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwAQuY/btsAONksdPw/vK0xgSVwerlvQOmwbo2VDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwAQuY%2FbtsAONksdPw%2FvK0xgSVwerlvQOmwbo2VDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;530&quot; height=&quot;395&quot; data-origin-width=&quot;1584&quot; data-origin-height=&quot;1182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 html 코드의 &amp;lt;body&amp;gt; &amp;lt;/body&amp;gt; 부분을 내용을 추가하면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;1174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzMSnh/btsAPjJ43X4/ujwyjTJF8wr7kuRvfZ8hkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzMSnh/btsAPjJ43X4/ujwyjTJF8wr7kuRvfZ8hkk/img.png&quot; data-alt=&quot;이런식으로 뜨겠죠?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzMSnh/btsAPjJ43X4/ujwyjTJF8wr7kuRvfZ8hkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzMSnh%2FbtsAPjJ43X4%2FujwyjTJF8wr7kuRvfZ8hkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;538&quot; height=&quot;401&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;1174&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이런식으로 뜨겠죠?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 정적 컨텐츠의 단점은 그냥 보이는 그대로 화면에 출력만 된다는 점입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1644&quot; data-origin-height=&quot;836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cA6COB/btsAQzr0cYq/wRltkAEgnMgeP6W9iUQlq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cA6COB/btsAQzr0cYq/wRltkAEgnMgeP6W9iUQlq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cA6COB/btsAQzr0cYq/wRltkAEgnMgeP6W9iUQlq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcA6COB%2FbtsAQzr0cYq%2FwRltkAEgnMgeP6W9iUQlq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;545&quot; height=&quot;277&quot; data-origin-width=&quot;1644&quot; data-origin-height=&quot;836&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원리는 위와 같습니다. 매우 간단하죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☀️ MVC 와 템플릿 엔진&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MVC 란? Model, View, Controller&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller 랑 View 를 쪼개는게 기본이에요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8uUZV/btsAULMnDOr/rPgYjoCEjPi0BTKIJaFtVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8uUZV/btsAULMnDOr/rPgYjoCEjPi0BTKIJaFtVK/img.png&quot; data-alt=&quot;Controller/HelloController&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8uUZV/btsAULMnDOr/rPgYjoCEjPi0BTKIJaFtVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8uUZV%2FbtsAULMnDOr%2FrPgYjoCEjPi0BTKIJaFtVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;742&quot; height=&quot;164&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Controller/HelloController&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2266&quot; data-origin-height=&quot;1332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIfE0x/btsATf8ykxI/gPew7fdmPmTyyrBDIqSDY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIfE0x/btsATf8ykxI/gPew7fdmPmTyyrBDIqSDY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIfE0x/btsATf8ykxI/gPew7fdmPmTyyrBDIqSDY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIfE0x%2FbtsATf8ykxI%2FgPew7fdmPmTyyrBDIqSDY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;420&quot; data-origin-width=&quot;2266&quot; data-origin-height=&quot;1332&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;thymeleaf란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;localhost:8080/hello-mvc를 접속해보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2710&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbTbEV/btsAUKUfiwy/iiMgPysbW6OrRuFkeoJmUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbTbEV/btsAUKUfiwy/iiMgPysbW6OrRuFkeoJmUk/img.png&quot; data-alt=&quot;에러가난다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbTbEV/btsAUKUfiwy/iiMgPysbW6OrRuFkeoJmUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbTbEV%2FbtsAUKUfiwy%2FiiMgPysbW6OrRuFkeoJmUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;135&quot; data-origin-width=&quot;2710&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;에러가난다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러메시지를 확인해보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2806&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXQb6U/btsATXM4Q91/NxZ5tQ1km0pml6WpxYOhS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXQb6U/btsATXM4Q91/NxZ5tQ1km0pml6WpxYOhS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXQb6U/btsATXM4Q91/NxZ5tQ1km0pml6WpxYOhS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXQb6U%2FbtsATXM4Q91%2FNxZ5tQ1km0pml6WpxYOhS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2806&quot; height=&quot;154&quot; data-origin-width=&quot;2806&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Required&amp;nbsp;request&amp;nbsp;parameter&amp;nbsp;'name'&amp;nbsp;for&amp;nbsp;method&amp;nbsp;parameter&amp;nbsp;type&amp;nbsp;String&amp;nbsp;is&amp;nbsp;not&amp;nbsp;present]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라는 에러코드가 떴기때문에&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pgiLP/btsAULexTZR/Gn0gdyPMFFl32kxn4qpNj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pgiLP/btsAULexTZR/Gn0gdyPMFFl32kxn4qpNj1/img.png&quot; data-alt=&quot;이런식으로 value 와 required를 추가해주어야합니다. 꿀팁 : command+p 누르면 파라미터 정보를 볼 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pgiLP/btsAULexTZR/Gn0gdyPMFFl32kxn4qpNj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpgiLP%2FbtsAULexTZR%2FGn0gdyPMFFl32kxn4qpNj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;733&quot; height=&quot;98&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이런식으로 value 와 required를 추가해주어야합니다. 꿀팁 : command+p 누르면 파라미터 정보를 볼 수 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2146&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dq8Ohy/btsASSMoEOx/3z41JRm4A6fFBHyMIAnyq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dq8Ohy/btsASSMoEOx/3z41JRm4A6fFBHyMIAnyq1/img.png&quot; data-alt=&quot;?name=spring!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dq8Ohy/btsASSMoEOx/3z41JRm4A6fFBHyMIAnyq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdq8Ohy%2FbtsASSMoEOx%2F3z41JRm4A6fFBHyMIAnyq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2146&quot; height=&quot;290&quot; data-origin-width=&quot;2146&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;?name=spring!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2576&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eU3Xzj/btsASUXL8ut/iHGMXkkl4g5z3bpbq7Aks1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eU3Xzj/btsASUXL8ut/iHGMXkkl4g5z3bpbq7Aks1/img.png&quot; data-alt=&quot;?name=solasol!!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eU3Xzj/btsASUXL8ut/iHGMXkkl4g5z3bpbq7Aks1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeU3Xzj%2FbtsASUXL8ut%2FiHGMXkkl4g5z3bpbq7Aks1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2576&quot; height=&quot;322&quot; data-origin-width=&quot;2576&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;?name=solasol!!!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;?name=[ ] -&amp;gt; http에서 Get 방식 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1618&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ri92y/btsASa06YXA/mpsC06EHakMFXqTla5JTIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ri92y/btsASa06YXA/mpsC06EHakMFXqTla5JTIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ri92y/btsASa06YXA/mpsC06EHakMFXqTla5JTIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRi92y%2FbtsASa06YXA%2FmpsC06EHakMFXqTla5JTIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;624&quot; height=&quot;320&quot; data-origin-width=&quot;1618&quot; data-origin-height=&quot;830&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☀️ API&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실상, 정적컨텐츠를 제외하면 이것을 HTML방식으로 내리느냐, API 방식으로 데이터를 받느냐의 차이임&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2062&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o20Kt/btsATDVBTzN/GjbMTmsoYnY9BRRKVIF020/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o20Kt/btsATDVBTzN/GjbMTmsoYnY9BRRKVIF020/img.png&quot; data-alt=&quot;중요한건 @ResponseBody 를 꼭 넣어줘야함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o20Kt/btsATDVBTzN/GjbMTmsoYnY9BRRKVIF020/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo20Kt%2FbtsATDVBTzN%2FGjbMTmsoYnY9BRRKVIF020%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;631&quot; height=&quot;177&quot; data-origin-width=&quot;2062&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;중요한건 @ResponseBody 를 꼭 넣어줘야함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 데이터를 내놓으라 한다면? &amp;lt;- 이래서 API 방식을 많이 쓰는 거&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1494&quot; data-origin-height=&quot;1098&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ADZpM/btsATWm58PK/Kq4AKscrZkKFqihdkqsSzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ADZpM/btsATWm58PK/Kq4AKscrZkKFqihdkqsSzK/img.png&quot; data-alt=&quot;run 해보자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ADZpM/btsATWm58PK/Kq4AKscrZkKFqihdkqsSzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FADZpM%2FbtsATWm58PK%2FKq4AKscrZkKFqihdkqsSzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;503&quot; height=&quot;370&quot; data-origin-width=&quot;1494&quot; data-origin-height=&quot;1098&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;run 해보자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfNMVP/btsARhMWwMC/z8hGBXpBeYlKNr4NxUFxW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfNMVP/btsARhMWwMC/z8hGBXpBeYlKNr4NxUFxW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfNMVP/btsARhMWwMC/z8hGBXpBeYlKNr4NxUFxW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfNMVP%2FbtsARhMWwMC%2Fz8hGBXpBeYlKNr4NxUFxW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2652&quot; height=&quot;478&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;478&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  Java bean 방식- getter setter&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단축키: command+N&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://cookinghoil.tistory.com/13&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cookinghoil.tistory.com/13&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1700831071356&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Spring - 빈 객체 값 주입 (Setter 메소드)&quot; data-og-description=&quot;Bean을 정의할 때 Bean 객체가 가지고 있을 기본 값을 생성자가 아닌 Setter 메서드를 통해 주입할 수 있다. 먼저 다음과 같이 클래스를 생성하여 객체를 만들고 setter,getter을 만들어 준다. public class T&quot; data-og-host=&quot;cookinghoil.tistory.com&quot; data-og-source-url=&quot;https://cookinghoil.tistory.com/13&quot; data-og-url=&quot;https://cookinghoil.tistory.com/13&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/j77BJ/hyUB2Wi1vC/uFJ9vSVw4x3Q7LazKeE7ck/img.png?width=424&amp;amp;height=136&amp;amp;face=0_0_424_136,https://scrap.kakaocdn.net/dn/bKgcLe/hyUB29OREk/jDulwC6vhFWomqsobAfik1/img.png?width=424&amp;amp;height=136&amp;amp;face=0_0_424_136&quot;&gt;&lt;a href=&quot;https://cookinghoil.tistory.com/13&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cookinghoil.tistory.com/13&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/j77BJ/hyUB2Wi1vC/uFJ9vSVw4x3Q7LazKeE7ck/img.png?width=424&amp;amp;height=136&amp;amp;face=0_0_424_136,https://scrap.kakaocdn.net/dn/bKgcLe/hyUB29OREk/jDulwC6vhFWomqsobAfik1/img.png?width=424&amp;amp;height=136&amp;amp;face=0_0_424_136');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spring - 빈 객체 값 주입 (Setter 메소드)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Bean을 정의할 때 Bean 객체가 가지고 있을 기본 값을 생성자가 아닌 Setter 메서드를 통해 주입할 수 있다. 먼저 다음과 같이 클래스를 생성하여 객체를 만들고 setter,getter을 만들어 준다. public class T&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cookinghoil.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; @ResponseBody란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;스프링에서 비동기 처리를 하는 경우 @RequestBody 와 @ResponseBody 를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클라이언트와 서버의 비동기 통신 처리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;여기서 비동기 통신이란 화면전환(새로고침-Refresh, F5) 없이 이루어지는 동작들을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;굳이 비동기 통신을 이용해야하는 이유는?&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;예를 들어보자. 우리가 회원가입할때 이름, 아이디, 비밀번호, 전화번호, 주소 등을 모두 입력하고 아이디 중복 버튼을 누를때 서버에서 응답후 Refresh 되어 입력한 값들이 모두 사라진다면 곤란 할 것이다. -&amp;gt; 이럴때 비동기통신처리를 하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;웹에서 이루어진는 데이터 통신은 클라이언트와 서버간에서 이루어지는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중요한건 요청(Request) 와 응답(Response)&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;클라이언트에서 서버로 통신하는 메시지를 요청메시지&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;서버에서 클라이언트로 통신하는 메시지를 응답메시지&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RequestBody 와 ResponseBody&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;비동기 통신을 하기 위해서는 요청메시지와 응답메시지를 본문(Body) 에 담아보낼때 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JSON (Javascript Object Notation)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;본문에 담아야하는 데이터 형식의 가장 대표적인 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;ResponseBody 사용 원리&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1692&quot; data-origin-height=&quot;1240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nCdiv/btsAPXH4vhJ/sKKmqWcWNOKKvQNJ4QfTqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nCdiv/btsAPXH4vhJ/sKKmqWcWNOKKvQNJ4QfTqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nCdiv/btsAPXH4vhJ/sKKmqWcWNOKKvQNJ4QfTqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnCdiv%2FbtsAPXH4vhJ%2FsKKmqWcWNOKKvQNJ4QfTqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;624&quot; height=&quot;457&quot; data-origin-width=&quot;1692&quot; data-origin-height=&quot;1240&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;1510&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xjXJO/btsAUoKzNYt/WK8bT7xEHkdQbN0qE4wo7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xjXJO/btsAUoKzNYt/WK8bT7xEHkdQbN0qE4wo7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xjXJO/btsAUoKzNYt/WK8bT7xEHkdQbN0qE4wo7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxjXJO%2FbtsAUoKzNYt%2FWK8bT7xEHkdQbN0qE4wo7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;544&quot; height=&quot;157&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;☀️ 참고자료&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;김영한 개발자님 강의 자료&lt;/p&gt;</description>
      <category>개발 공부/Spring</category>
      <author>솔라솔</author>
      <guid isPermaLink="true">https://dev-sol-chive.tistory.com/14</guid>
      <comments>https://dev-sol-chive.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%EA%B0%9C%EB%B0%9C-%EA%B8%B0%EC%B4%88#entry14comment</comments>
      <pubDate>Fri, 24 Nov 2023 22:08:59 +0900</pubDate>
    </item>
    <item>
      <title>[CJ UNIT 6th] 유튜브 데뷔 후기 + 상장 모음집</title>
      <link>https://dev-sol-chive.tistory.com/entry/CJ-UNIT-6th-%EC%9C%A0%ED%8A%9C%EB%B8%8C-%EB%8D%B0%EB%B7%94-%ED%9B%84%EA%B8%B0-%EC%83%81%EC%9E%A5-%EB%AA%A8%EC%9D%8C%EC%A7%91</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;안녕하세요. 솔라솔입니다 &lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;오늘은 예전에 찍었던 CJ UNIT 6th 로서 촬영했던 7기 모집영상 후기 와 상장모음집을 가져왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.naver.com/dodosolsol_/222829382707&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.naver.com/dodosolsol_/222829382707&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1700740153415&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[CJ UNIT 6기] 7기 모집 유튜브 데뷔&quot; data-og-description=&quot;모두모두집중!! 7기 모집이 시작되었습니다!!! 정말 다양한 경험을 할 수 있어요!!! 강사일만 하지 않아요!...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://blog.naver.com/dodosolsol_/222829382707&quot; data-og-url=&quot;https://blog.naver.com/dodosolsol_/222829382707&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c23fO4/hyUCfOrQRA/9cHRV3PnbQ4EtLAqSyNKw0/img.jpg?width=743&amp;amp;height=390&amp;amp;face=126_51_628_175&quot;&gt;&lt;a href=&quot;https://blog.naver.com/dodosolsol_/222829382707&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.naver.com/dodosolsol_/222829382707&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c23fO4/hyUCfOrQRA/9cHRV3PnbQ4EtLAqSyNKw0/img.jpg?width=743&amp;amp;height=390&amp;amp;face=126_51_628_175');&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;[CJ UNIT 6기] 7기 모집 유튜브 데뷔&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;모두모두집중!! 7기 모집이 시작되었습니다!!! 정말 다양한 경험을 할 수 있어요!!! 강사일만 하지 않아요!...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bePVYJ/btsAMWPz7ND/6k6Jigyp5AHeiHN7CT8Jc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bePVYJ/btsAMWPz7ND/6k6Jigyp5AHeiHN7CT8Jc0/img.png&quot; data-alt=&quot;뿌듯한 4관왕&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bePVYJ/btsAMWPz7ND/6k6Jigyp5AHeiHN7CT8Jc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbePVYJ%2FbtsAMWPz7ND%2F6k6Jigyp5AHeiHN7CT8Jc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;462&quot; height=&quot;564&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;뿌듯한 4관왕&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1484&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGDLYi/btsAO8Il7oG/32szg7BQT3A9okScayB2mK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGDLYi/btsAO8Il7oG/32szg7BQT3A9okScayB2mK/img.png&quot; data-alt=&quot;과거 노션에 작성했던 포트폴리오 중 일부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGDLYi/btsAO8Il7oG/32szg7BQT3A9okScayB2mK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGDLYi%2FbtsAO8Il7oG%2F32szg7BQT3A9okScayB2mK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;742&quot; height=&quot;276&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1484&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;과거 노션에 작성했던 포트폴리오 중 일부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oxSEj/btsALI5vQ9X/yM7j3XQWduf2rmNoyoLuq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oxSEj/btsALI5vQ9X/yM7j3XQWduf2rmNoyoLuq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oxSEj/btsALI5vQ9X/yM7j3XQWduf2rmNoyoLuq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoxSEj%2FbtsALI5vQ9X%2FyM7j3XQWduf2rmNoyoLuq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;444&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;언젠가 기회가 된다면 최종 활동 후기를 한번 더 적어내려보고 싶을 정도로&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;자랑스럽기만 했던 CJ UNIT 활동이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;교육봉사에 관심이 있고, 아이들을 좋아하며, 컴퓨터과학관련 전공자라면 더할 나위 없는 최고의 대외활동이 되리라 자부합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;신기하게도, CJ UNIT 에서 만난 인연들이 훗날 저에게 좋은 영향을 많이 미치게 되더라구요 (IT 판이 좁아서 그런거려나요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이렇게 열심히 살던 친구들이, 여전히 열심히 사회에서 이곳저곳에서 살고 있구나 를 깨달으며 오늘도 본받는 유닛 친구들이 있어서 감사할 따름입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;참고로 CJ UNIT 이 된다면, CJ 올리브네트웍스 소속이기 때문에 공식홈페이지에도 얼굴이 올라가게된답니다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;1654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C6dut/btsANLNYWVQ/54dKKkNujPfzkIY34Kfl4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C6dut/btsANLNYWVQ/54dKKkNujPfzkIY34Kfl4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C6dut/btsANLNYWVQ/54dKKkNujPfzkIY34Kfl4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC6dut%2FbtsANLNYWVQ%2F54dKKkNujPfzkIY34Kfl4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;1654&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;1654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1723&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpi5mw/btsAPWAVyZi/zFrtJx9Sx65PxwiZvAnLo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpi5mw/btsAPWAVyZi/zFrtJx9Sx65PxwiZvAnLo0/img.png&quot; data-alt=&quot;이렇게 말이죠!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpi5mw/btsAPWAVyZi/zFrtJx9Sx65PxwiZvAnLo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpi5mw%2FbtsAPWAVyZi%2FzFrtJx9Sx65PxwiZvAnLo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3000&quot; height=&quot;1723&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1723&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이렇게 말이죠!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://www.cjolivenetworks.co.kr/sustainability/contribution/education_volunteers/member&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.cjolivenetworks.co.kr/sustainability/contribution/education_volunteers/member&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1700791889405&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;멤버 | CJ SW창의캠프 대학생 봉사단 | 공평한 교육 | 사회공헌 | ESG | CJ올리브네트웍스&quot; data-og-description=&quot;CJ올리브네트웍스의 CJ SW창의캠프 대학생 봉사단을 소개합니다.&quot; data-og-host=&quot;www.cjolivenetworks.co.kr&quot; data-og-source-url=&quot;https://www.cjolivenetworks.co.kr/sustainability/contribution/education_volunteers/member&quot; data-og-url=&quot;https://www.cjolivenetworks.co.kr/sustainability/contribution/education_volunteers/member&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gakte/hyUB5kWBoC/Q8AoB3nyYMk9tho0BThEG0/img.png?width=700&amp;amp;height=400&amp;amp;face=0_0_700_400&quot;&gt;&lt;a href=&quot;https://www.cjolivenetworks.co.kr/sustainability/contribution/education_volunteers/member&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.cjolivenetworks.co.kr/sustainability/contribution/education_volunteers/member&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gakte/hyUB5kWBoC/Q8AoB3nyYMk9tho0BThEG0/img.png?width=700&amp;amp;height=400&amp;amp;face=0_0_700_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;멤버 | CJ SW창의캠프 대학생 봉사단 | 공평한 교육 | 사회공헌 | ESG | CJ올리브네트웍스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;CJ올리브네트웍스의 CJ SW창의캠프 대학생 봉사단을 소개합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.cjolivenetworks.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;유닛 활동 관련 질문은 언제나 환영입니다!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;자유롭게 댓글 남겨 주세요!&lt;/b&gt;&lt;/p&gt;</description>
      <category>회고/CJ UNIT 6th</category>
      <author>솔라솔</author>
      <guid isPermaLink="true">https://dev-sol-chive.tistory.com/11</guid>
      <comments>https://dev-sol-chive.tistory.com/entry/CJ-UNIT-6th-%EC%9C%A0%ED%8A%9C%EB%B8%8C-%EB%8D%B0%EB%B7%94-%ED%9B%84%EA%B8%B0-%EC%83%81%EC%9E%A5-%EB%AA%A8%EC%9D%8C%EC%A7%91#entry11comment</comments>
      <pubDate>Fri, 24 Nov 2023 05:56:42 +0900</pubDate>
    </item>
    <item>
      <title>[CJ UNIT 6th] 제주여중 현장지원 후기</title>
      <link>https://dev-sol-chive.tistory.com/entry/CJ-UNIT-6th-%EC%A0%9C%EC%A3%BC%EC%97%AC%EC%A4%91-%ED%98%84%EC%9E%A5%EC%A7%80%EC%9B%90-%ED%9B%84%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;안녕하세요. 솔라솔입니다. &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;859&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjh736/btsAOSlj9vk/Yc1Y55dOnMe4OSuzCbpKzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjh736/btsAOSlj9vk/Yc1Y55dOnMe4OSuzCbpKzk/img.png&quot; data-alt=&quot;이 그림의 출처는 제 짝궁이었던 조장님입니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjh736/btsAOSlj9vk/Yc1Y55dOnMe4OSuzCbpKzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbjh736%2FbtsAOSlj9vk%2FYc1Y55dOnMe4OSuzCbpKzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;417&quot; height=&quot;478&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;859&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이 그림의 출처는 제 짝궁이었던 조장님입니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;오늘은 지난 포스팅에 이어서 CJ UNIT 6th 활동 당시 제주여자중학교에 현장지원 다녀왔던 이야기를 들고 왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;해당 포스팅 참고해주세요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://blog.naver.com/dodosolsol_/222816909748&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.naver.com/dodosolsol_/222816909748&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1700739966005&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[CJ UNIT 6기] 제주여중 현장지원 후기. 더위먹은 썰을 곁들인..&quot; data-og-description=&quot;근데 이때가 시작이었음 얼레벌레의 시작 탑승시각 7:10아침 우리 조 모여서 들어가기로 한 시각 6:40 여의...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://blog.naver.com/dodosolsol_/222816909748&quot; data-og-url=&quot;https://blog.naver.com/dodosolsol_/222816909748&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/XTu3b/hyUB3tJyHz/ddKxkgQ3hzNpGZAOai3zn0/img.jpg?width=743&amp;amp;height=842&amp;amp;face=0_0_743_842&quot;&gt;&lt;a href=&quot;https://blog.naver.com/dodosolsol_/222816909748&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.naver.com/dodosolsol_/222816909748&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/XTu3b/hyUB3tJyHz/ddKxkgQ3hzNpGZAOai3zn0/img.jpg?width=743&amp;amp;height=842&amp;amp;face=0_0_743_842');&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;[CJ UNIT 6기] 제주여중 현장지원 후기. 더위먹은 썰을 곁들인..&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;근데 이때가 시작이었음 얼레벌레의 시작 탑승시각 7:10아침 우리 조 모여서 들어가기로 한 시각 6:40 여의...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>회고/CJ UNIT 6th</category>
      <author>솔라솔</author>
      <guid isPermaLink="true">https://dev-sol-chive.tistory.com/10</guid>
      <comments>https://dev-sol-chive.tistory.com/entry/CJ-UNIT-6th-%EC%A0%9C%EC%A3%BC%EC%97%AC%EC%A4%91-%ED%98%84%EC%9E%A5%EC%A7%80%EC%9B%90-%ED%9B%84%EA%B8%B0#entry10comment</comments>
      <pubDate>Fri, 24 Nov 2023 03:47:21 +0900</pubDate>
    </item>
    <item>
      <title>[CJ UNIT 6th] 활동후기</title>
      <link>https://dev-sol-chive.tistory.com/entry/CJ-UNIT-6th-%ED%99%9C%EB%8F%99%ED%9B%84%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;안녕하세요. 솔라솔입니다. &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;859&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L9KbM/btsAMXgEr4d/mosUYk98kdFdKrQk5YqStK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L9KbM/btsAMXgEr4d/mosUYk98kdFdKrQk5YqStK/img.png&quot; data-alt=&quot;이 그림의 출처는 제 짝궁이었던 조장님입니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L9KbM/btsAMXgEr4d/mosUYk98kdFdKrQk5YqStK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL9KbM%2FbtsAMXgEr4d%2FmosUYk98kdFdKrQk5YqStK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;417&quot; height=&quot;478&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;859&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이 그림의 출처는 제 짝궁이었던 조장님입니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;오늘은 예전에 썼던 활동 후기들을 들고 왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 포스팅들은 다 사진 위주라서 링크로 들고왔습니다. 참고해주세요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.naver.com/dodosolsol_/222816834144&quot;&gt;https://blog.naver.com/dodosolsol_/222816834144&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1700739481843&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[CJ UNIT 6기] 활동 요약1..아니고 노는게 제일좋아! 뽀로로일기&quot; data-og-description=&quot;정말..정말정말 내가 대학생활동안 버킷리스트 1위었을 정도로 하고싶었던 CJ UNIT 6기 활동요약. 1(...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://blog.naver.com/dodosolsol_/222816834144&quot; data-og-url=&quot;https://blog.naver.com/dodosolsol_/222816834144&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bNjWlf/hyUB6jFDQx/rgka1cVgGBDndEreG8gyLk/img.jpg?width=720&amp;amp;height=1280&amp;amp;face=0_0_720_1280&quot;&gt;&lt;a href=&quot;https://blog.naver.com/dodosolsol_/222816834144&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.naver.com/dodosolsol_/222816834144&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bNjWlf/hyUB6jFDQx/rgka1cVgGBDndEreG8gyLk/img.jpg?width=720&amp;amp;height=1280&amp;amp;face=0_0_720_1280');&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;[CJ UNIT 6기] 활동 요약1..아니고 노는게 제일좋아! 뽀로로일기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;정말..정말정말 내가 대학생활동안 버킷리스트 1위었을 정도로 하고싶었던 CJ UNIT 6기 활동요약. 1(...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.naver.com/dodosolsol_/222816866548&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.naver.com/dodosolsol_/222816866548&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1700739474014&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[CJ UNIT 6기] 활동 요약2 아니고 뽀로로 일기&quot; data-og-description=&quot;노는게 제일좋아~ 활동요약 후기2 는 오디티 모드에서 찍은 사진 모음zip으로 시작 여기 올리는 사진들은 ...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://blog.naver.com/dodosolsol_/222816866548&quot; data-og-url=&quot;https://blog.naver.com/dodosolsol_/222816866548&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wF8u9/hyUB98xfx0/tN9S1ZiPKj45kHVQQrIKG0/img.jpg?width=743&amp;amp;height=1115&amp;amp;face=256_571_544_680&quot;&gt;&lt;a href=&quot;https://blog.naver.com/dodosolsol_/222816866548&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.naver.com/dodosolsol_/222816866548&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wF8u9/hyUB98xfx0/tN9S1ZiPKj45kHVQQrIKG0/img.jpg?width=743&amp;amp;height=1115&amp;amp;face=256_571_544_680');&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;[CJ UNIT 6기] 활동 요약2 아니고 뽀로로 일기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;노는게 제일좋아~ 활동요약 후기2 는 오디티 모드에서 찍은 사진 모음zip으로 시작 여기 올리는 사진들은 ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>회고/CJ UNIT 6th</category>
      <author>솔라솔</author>
      <guid isPermaLink="true">https://dev-sol-chive.tistory.com/9</guid>
      <comments>https://dev-sol-chive.tistory.com/entry/CJ-UNIT-6th-%ED%99%9C%EB%8F%99%ED%9B%84%EA%B8%B0#entry9comment</comments>
      <pubDate>Fri, 24 Nov 2023 02:44:33 +0900</pubDate>
    </item>
  </channel>
</rss>