<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Hunt for Data</title>
    <link>https://catloaf.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 7 Jul 2026 11:16:26 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>catloaf</managingEditor>
    <image>
      <title>Hunt for Data</title>
      <url>https://tistory1.daumcdn.net/tistory/4557363/attach/9a8087498b204fad827b0a719282988c</url>
      <link>https://catloaf.tistory.com</link>
    </image>
    <item>
      <title>Springboot JPA 폼으로 데이터 입력받아 db에 insert하기</title>
      <link>https://catloaf.tistory.com/69</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;프리랜서로 활동하면서 개발 의뢰를 받을 수 있을까 싶어 웹사이트를 만들고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;front-end쪽은 bootstrap과 snippet을 사용해 html, css 화면을 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 back-end인데 contact 메뉴에서 폼으로 데이터를 입력받아 db에 저장하고 싶어 springboot JPA를 이용해 기능을 구현해보기로 했다.&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;1871&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HUmRo/btsldPYrMxU/AkDXSaAHY5PqWK3A9uJas1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HUmRo/btsldPYrMxU/AkDXSaAHY5PqWK3A9uJas1/img.png&quot; data-alt=&quot;contact 메뉴 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HUmRo/btsldPYrMxU/AkDXSaAHY5PqWK3A9uJas1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHUmRo%2FbtsldPYrMxU%2FAkDXSaAHY5PqWK3A9uJas1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1871&quot; height=&quot;694&quot; data-origin-width=&quot;1871&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;contact 메뉴 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Springboot JPA 폼으로 데이터 입력받아 db에 insert하기 위해 해야할 것들은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #f7f7f8; color: #374151; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;엔티티 클래스 생성: 먼저, 데이터베이스의 테이블과 매핑될 엔티티 클래스를 생성한다.&amp;nbsp; 이 클래스는 데이터베이스의 테이블과 필드에 해당하는 멤버 변수를 가지고 있어야 한다.&lt;/li&gt;
&lt;li&gt;폼 작성: Thymeleaf를 사용하여 데이터를 입력받을 폼을 작성합니다. 폼 요소들은 엔티티 클래스의 멤버 변수와 매핑한다. &amp;lt;input&amp;gt; 요소의 name 속성 값은 엔티티 클래스의 멤버 변수 이름과 일치해야 한다.&lt;/li&gt;
&lt;li&gt;컨트롤러 작성: Spring의 컨트롤러에서는 폼 데이터를 처리하는 메서드를 작성한다. 이 메서드는 HTTP POST 요청을 처리하며, 엔티티 객체를 생성하고 폼 데이터를 해당 객체에 바인딩한다.&lt;/li&gt;
&lt;li&gt;서비스 및 리포지토리 작성: 데이터베이스와 상호작용하는 서비스 및 리포지토리 클래스를 작성한다. 서비스 클래스는 컨트롤러에서 호출되어 엔티티를 저장하는 역할을 수행한다. 리포지토리 클래스는 실제로 데이터베이스와 상호작용하여 데이터를 저장하고 조회하는 역할을 수행한다.&lt;/li&gt;
&lt;li&gt;폼 데이터 처리: 컨트롤러에서 서비스 클래스를 호출하여 엔티티를 저장하는 로직을 추가한다. 서비스 클래스에서는 리포지토리를 사용하여 엔티티를 데이터베이스에 저장한다.&lt;/li&gt;
&lt;li&gt;DB url 설정하기&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;폴더 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;296&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2ps1M/btslafRCXEt/Bf5HFkjNvRD5pNKNPIiUt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2ps1M/btslafRCXEt/Bf5HFkjNvRD5pNKNPIiUt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2ps1M/btslafRCXEt/Bf5HFkjNvRD5pNKNPIiUt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2ps1M%2FbtslafRCXEt%2FBf5HFkjNvRD5pNKNPIiUt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;296&quot; height=&quot;647&quot; data-origin-width=&quot;296&quot; data-origin-height=&quot;647&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 엔티티 클래스 생성&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;&lt;b&gt;먼저 entity 폴더를 만들어서 FormData 클래스를 생성해보자.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;폼에서 입력받을 데이터는 각각 name(이름), category(기업 or 개인), mail(이메일), phone(연락처), message(의뢰 내용)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로 멤버변수를 설정했다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1687705874595&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package web.webmaestro.Entity;

import javax.persistence.*;

@Entity
public class FormData {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)//auto-increment, primary key 설정
    private Long id;

    //문자열 길이 설정
    @Column(length = 255)
    private String name;

    @Column(length = 255)
    private String category;

    @Column(length = 255)
    private String mail;

    @Column(length = 255)
    private String phone;

    @Column(columnDefinition = &quot;TEXT&quot;)//text 설정
    private String message;

    public FormData(String name, String category, String mail, String phone, String message) {
        this.name = name;
        this.category = category;
        this.mail = mail;
        this.phone = phone;
        this.message = message;
    }
    
   public FormData() {
        
    }

    public String getName() {
        return name;
    }

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

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public String getMail() {
        return mail;
    }

    public void setMail(String mail) {
        this.mail = mail;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;db에서 table을 별도로 만들지 않고 JPA와 FormData 엔티티 클래스로 자동으로 테이블을 생성하므로&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;칼럼 별 제약 설정을 해주었다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터를 입력받을 생성자와 getter, setter 설정을 같이 해주었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;@Entity&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt; 어노테이션은 해당 클래스가 JPA(Java Persistence API)의 엔티티임을 나타낸다. &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;@Id&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt; 어노테이션은 엔티티의 기본 키를 나타내는 멤버 변수를 표시한다. &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;@GeneratedValue&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt; 어노테이션은 &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;데이터를 입력받을 때마다 자동으로 id 값이 올라가는 auto-increment와 기본 키의 값을 생성하도록 설정한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 폼 작성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;contact.html에서 form action=&quot;/form/save&quot; method=&quot;post&quot; 로 수정해주었다.&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1687706722897&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 lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;title&amp;gt;WebMaestro homepage&amp;lt;/title&amp;gt;
    &amp;lt;!--css--&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;css/home.css&quot;&amp;gt;
    &amp;lt;!--bootstrap--&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/5.3.0/css/bootstrap.min.css&quot;&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;header&amp;gt;
    &amp;lt;!--네비게이션 bar--&amp;gt;
    &amp;lt;nav class=&quot;navbar navbar-expand-lg bg-primary&quot; data-bs-theme=&quot;dark&quot;&amp;gt;
        &amp;lt;div class=&quot;container-fluid&quot;&amp;gt;
            &amp;lt;a class=&quot;navbar-brand&quot; href=&quot;/&quot;&amp;gt;WebMaestro&amp;lt;/a&amp;gt;
            &amp;lt;button class=&quot;navbar-toggler&quot; type=&quot;button&quot; data-bs-toggle=&quot;collapse&quot; data-bs-target=&quot;#navbarColor01&quot; aria-controls=&quot;navbarColor01&quot; aria-expanded=&quot;false&quot; aria-label=&quot;Toggle navigation&quot;&amp;gt;
                &amp;lt;span class=&quot;navbar-toggler-icon&quot;&amp;gt;&amp;lt;/span&amp;gt;
            &amp;lt;/button&amp;gt;
            &amp;lt;div class=&quot;collapse navbar-collapse&quot; id=&quot;navbarColor01&quot;&amp;gt;
                &amp;lt;ul class=&quot;navbar-nav me-auto&quot;&amp;gt;
                    &amp;lt;li class=&quot;nav-item&quot;&amp;gt;
                        &amp;lt;a class=&quot;nav-link&quot; href=&quot;/&quot;&amp;gt;Portfolio&amp;lt;/a&amp;gt;
                    &amp;lt;/li&amp;gt;
                    &amp;lt;li class=&quot;nav-item&quot;&amp;gt;
                        &amp;lt;a class=&quot;nav-link&quot; href=&quot;/service&quot;&amp;gt;Services&amp;lt;/a&amp;gt;
                    &amp;lt;/li&amp;gt;
                    &amp;lt;li class=&quot;nav-item&quot;&amp;gt;
                        &amp;lt;a class=&quot;nav-link active&quot; href=&quot;/contact&quot;&amp;gt;Contact
                            &amp;lt;span class=&quot;visually-hidden&quot;&amp;gt;(current)&amp;lt;/span&amp;gt;
                        &amp;lt;/a&amp;gt;
                    &amp;lt;/li&amp;gt;
                &amp;lt;/ul&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/nav&amp;gt;
&amp;lt;/header&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;!--contact form 시작 --&amp;gt;
    &amp;lt;link href=&quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.min.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
    &amp;lt;div class=&quot;container&quot;&amp;gt;
        &amp;lt;div class=&quot;contact__wrapper shadow-lg mt-n9&quot;&amp;gt;
            &amp;lt;div class=&quot;row no-gutters&quot;&amp;gt;
                &amp;lt;div class=&quot;col-lg-5 contact-info__wrapper gradient-brand-color p-5 order-lg-2&quot;&amp;gt;
                    &amp;lt;h3 class=&quot;color--white mb-5&quot;&amp;gt;Get in Touch&amp;lt;/h3&amp;gt;

                    &amp;lt;ul class=&quot;contact-info__list list-style--none position-relative z-index-101&quot;&amp;gt;
                        &amp;lt;li class=&quot;mb-4 pl-4&quot;&amp;gt;
                            &amp;lt;span class=&quot;position-absolute&quot;&amp;gt;&amp;lt;i class=&quot;fas fa-envelope&quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;webmaestro.info@gmail.com
                        &amp;lt;/li&amp;gt;
                        &amp;lt;li class=&quot;mb-4 pl-4&quot;&amp;gt;
                            &amp;lt;span class=&quot;position-absolute&quot;&amp;gt;&amp;lt;i class=&quot;fas fa-phone&quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;010-3247-3877
                        &amp;lt;/li&amp;gt;
                        &amp;lt;li class=&quot;mb-4 pl-4&quot;&amp;gt;
                            &amp;lt;span class=&quot;position-absolute&quot;&amp;gt;&amp;lt;i class=&quot;fas fa-map-marker-alt&quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;경기 광주시
                            &amp;lt;br&amp;gt;양벌로 173

                            &amp;lt;div class=&quot;mt-3&quot;&amp;gt;
                                &amp;lt;a href=&quot;https://www.google.com/maps&quot; target=&quot;_blank&quot; class=&quot;text-link link--right-icon text-white&quot;&amp;gt;Get directions &amp;lt;i class=&quot;link__icon fa fa-directions&quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/li&amp;gt;
                    &amp;lt;/ul&amp;gt;

                    &amp;lt;figure class=&quot;figure position-absolute m-0 opacity-06 z-index-100&quot; style=&quot;bottom:0; right: 10px&quot;&amp;gt;
                    &amp;lt;/figure&amp;gt;
                &amp;lt;/div&amp;gt;

                &amp;lt;div class=&quot;col-lg-7 contact-form__wrapper p-5 order-lg-1&quot;&amp;gt;
                    &amp;lt;form action=&quot;/form/save&quot; method=&quot;post&quot; class=&quot;contact-form form-validate&quot; novalidate=&quot;novalidate&quot;&amp;gt;
                        &amp;lt;div class=&quot;row&quot;&amp;gt;
                            &amp;lt;div class=&quot;col-sm-6 mb-3&quot;&amp;gt;
                                &amp;lt;div class=&quot;form-group&quot;&amp;gt;
                                    &amp;lt;label class=&quot;required-field&quot; for=&quot;name&quot;&amp;gt;성함&amp;lt;/label&amp;gt;
                                    &amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;name&quot; name=&quot;name&quot; placeholder=&quot;홍길동&quot;&amp;gt;
                                &amp;lt;/div&amp;gt;
                            &amp;lt;/div&amp;gt;

                            &amp;lt;div class=&quot;col-sm-6 mb-3&quot;&amp;gt;
                                &amp;lt;div class=&quot;form-group&quot;&amp;gt;
                                    &amp;lt;label for=&quot;category&quot;&amp;gt;기업 OR 개인 고객&amp;lt;/label&amp;gt;
                                    &amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;category&quot; name=&quot;category&quot; placeholder=&quot;회사명을 입력해주세요.&quot;&amp;gt;
                                &amp;lt;/div&amp;gt;
                            &amp;lt;/div&amp;gt;

                            &amp;lt;div class=&quot;col-sm-6 mb-3&quot;&amp;gt;
                                &amp;lt;div class=&quot;form-group&quot;&amp;gt;
                                    &amp;lt;label class=&quot;required-field&quot; for=&quot;mail&quot;&amp;gt;Email&amp;lt;/label&amp;gt;
                                    &amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;mail&quot; name=&quot;mail&quot; placeholder=&quot;honggildong@naver.com&quot;&amp;gt;
                                &amp;lt;/div&amp;gt;
                            &amp;lt;/div&amp;gt;

                            &amp;lt;div class=&quot;col-sm-6 mb-3&quot;&amp;gt;
                                &amp;lt;div class=&quot;form-group&quot;&amp;gt;
                                    &amp;lt;label for=&quot;phone&quot;&amp;gt;Phone Number&amp;lt;/label&amp;gt;
                                    &amp;lt;input type=&quot;tel&quot; class=&quot;form-control&quot; id=&quot;phone&quot; name=&quot;phone&quot; placeholder=&quot;010-111-1234&quot;&amp;gt;
                                &amp;lt;/div&amp;gt;
                            &amp;lt;/div&amp;gt;

                            &amp;lt;div class=&quot;col-sm-12 mb-3&quot;&amp;gt;
                                &amp;lt;div class=&quot;form-group&quot;&amp;gt;
                                    &amp;lt;label class=&quot;required-field&quot; for=&quot;message&quot;&amp;gt;원하시는 의뢰 내용을 입력해주세요. .&amp;lt;/label&amp;gt;
                                    &amp;lt;textarea class=&quot;form-control&quot; id=&quot;message&quot; name=&quot;message&quot; rows=&quot;4&quot; placeholder=&quot;예) 크롤링, 웹개발, 파싱 등 자세한 내용은 상담을 통해 견적을 산출합니다.&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
                                &amp;lt;/div&amp;gt;
                            &amp;lt;/div&amp;gt;

                            &amp;lt;div class=&quot;col-sm-12 mb-3&quot;&amp;gt;
                                &amp;lt;button type=&quot;submit&quot; name=&quot;submit&quot; class=&quot;btn btn-primary&quot;&amp;gt;문의 하기&amp;lt;/button&amp;gt;
                            &amp;lt;/div&amp;gt;

                        &amp;lt;/div&amp;gt;
                    &amp;lt;/form&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;!-- End Contact Form Wrapper --&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;


&amp;lt;!-- ======= Footer ======= --&amp;gt;
&amp;lt;footer id=&quot;footer&quot; class=&quot;footer&quot;&amp;gt;
    &amp;lt;div class=&quot;container&quot;&amp;gt;
        &amp;lt;div class=&quot;copyright&quot;&amp;gt;
            &amp;amp;copy; Copyright &amp;lt;strong&amp;gt;&amp;lt;span&amp;gt;WebMaestro&amp;lt;/span&amp;gt;&amp;lt;/strong&amp;gt;. All Rights Reserved
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;credits&quot;&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/footer&amp;gt;
&amp;lt;!-- End Footer --&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;form action은 나중에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;controller에서 처리하는&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;엔드포인트다. method는 post 요청으로 처리하겠다는 뜻이다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;각 폼의 하위 태그에서 name은 엔티티 클래스에서 설정한 멤버변수와 매핑된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 컨트롤러 작성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1687707588515&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package web.webmaestro.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import web.webmaestro.Entity.FormData;
import web.webmaestro.service.FormDataService;

//서버 측에서 /form 엔드포인트에 대한 요청을 처리하는 컨트롤러

@Controller
@RequestMapping(&quot;/form&quot;)
public class FormController {

    private final FormDataService formDataService;

    @Autowired
    public FormController(FormDataService formDataService) {
        this.formDataService = formDataService;
    }

    @GetMapping(&quot;/create&quot;)
    public String showCreateForm(Model model) {
        model.addAttribute(&quot;formData&quot;, new FormData());
        return &quot;create-form&quot;;
    }

    @PostMapping(&quot;/save&quot;)
    public String saveFormData(@RequestParam(&quot;name&quot;) String name,
                               @RequestParam(&quot;category&quot;)String category,
                               @RequestParam(&quot;mail&quot;) String mail,
                               @RequestParam(&quot;phone&quot;) String phone,
                               @RequestParam(&quot;message&quot;) String message) {
     
        return &quot;redirect:/form/success&quot;;
    }

    //성공 시 contactcomplete.html 페이지 보여주기
    @GetMapping(&quot;/success&quot;)
    public String showSuccessPage() {
        return &quot;contactcomplete&quot;;
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;FormController의 showCreateForm메서드는 FormData 객체를 생성한다.&amp;nbsp; /form/create 경로에 대한 GET 요청을 처리하여 create-form 뷰를 반환한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;saveFormData 메서드는 /form/save 경로에 대한&amp;nbsp; POST 요청을 처리하여 FormDataService를 통해 데이터를 저장한다. 저장 후에는 /form/success 경로로 리다이렉션된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;또한 @RequestParam 어노테이션을 사용하여 요청 파라미터에서 값을 받아온다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 서비스 및 라포지토리 작성&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;&lt;b&gt;먼저 FormDataRepository 클래스를 작성한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;repository는 데이터베이스 조작을 처리하는 인터페이스이며, Spring Data JPA는 이 인터페이스를 구현한 구현체를 자동으로 생성해준다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;JpaRepository 인터페이스를 사용해주는 것으로 Spring Data JPA를 사용할 수 있다. &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;Spring Data JPA의 장점은 &lt;/span&gt;데이터베이스와의 상호작용을 단순화하고 개발 생산성을 높이기 위한 기능을 제공한다는 점이다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1687708264459&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package web.webmaestro.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import web.webmaestro.Entity.FormData;

//데이터베이스 조작 처리

@Repository
public interface FormDataRepository extends JpaRepository&amp;lt;FormData, Long&amp;gt; {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;여기서 FormData&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;는 엔티티 클래스이며, &lt;/span&gt;Long&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;은 엔티티의 식별자(ID) 타입이다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;JpaRepository 인터페이스는 Spring Data JPA에서 제공하는 기본적인 CRUD 작업을 지원하는 인터페이스이며 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이미 구현되어 있으므로 해당 인터페이스의 구현체를 따로 작성할 필요가 없다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다음은 FormDataService 클래스에서 비즈니스 로직을 구현한다. 서비스 클래스는 컨트롤러와 라포지토리 사이의 중간 계층으로 작동 된다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;FormDataService는 FormDataRepository를 주입받아 사용, 생성자 주입을 통해 의존성을 해결한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;도중에 mariadb utf-8 인코딩 변환 문제로 로직을 추가하는 등의 이슈가 있었으나,&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;my.ini 파일의 인코딩을 수정하는 것으로 문제를 해결하여 해당 로직은 필요가 없어졌다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결방법 :&lt;a href=&quot;https://catloaf.tistory.com/68&quot;&gt;Springboot JPA mariadb에서 CRUD할 때 인코딩 오류 발생 :: Hunt for Data (tistory.com)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1687708532187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package web.webmaestro.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import web.webmaestro.Entity.FormData;
import web.webmaestro.repository.FormDataRepository;

import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;//문자열 인코딩 값 변환


@Service
public class FormDataService {

    private final FormDataRepository formDataRepository;

    @Autowired
    public FormDataService(FormDataRepository formDataRepository) {
        this.formDataRepository = formDataRepository;
    }

    //formDataRepository를 통해 폼 데이터를 저장하는 역할, 이 메서드를 통해 폼 데이터를 데이터베이스에 저장
    public void saveFormData(String name, String category, String mail, String phone, String message) {
        //String utf8Category = convertToUTF8(category);

        FormData formData = new FormData(name, category, mail, phone, message);
        formDataRepository.save(formData);//인코딩 변환한 카테고리 저장
    }

    //문자열 값 받을 때 인코딩 변환하는 메서드
    /*
    private String convertToUTF8(String value) {
        try {
            byte[] utf8Bytes = value.getBytes(&quot;UTF-8&quot;);
            return new String(utf8Bytes, &quot;UTF-8&quot;);
        } catch (UnsupportedEncodingException e) {
            // 처리할 예외 처리 코드 추가
            return value; // 예외 발생 시 변환하지 않은 값 반환
        }
    }
    */
}&lt;/code&gt;&lt;/pre&gt;
&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;saveFormData메서드는 formDataRepository를 통해 폼 데이터를 데이터베이스에 저장한다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 폼 데이터 처리&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;&lt;b&gt;마지막으로 FormController 클래스에서 FormDataService의 saveFormData 메서드를 호출하여 데이터를 저장한다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1687708205697&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package web.webmaestro.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import web.webmaestro.Entity.FormData;
import web.webmaestro.service.FormDataService;

//서버 측에서 /form 엔드포인트에 대한 요청을 처리하는 컨트롤러

@Controller
@RequestMapping(&quot;/form&quot;)
public class FormController {

    private final FormDataService formDataService;

    @Autowired
    public FormController(FormDataService formDataService) {
        this.formDataService = formDataService;
    }

   //FormData 클래스로 table 생성
    @GetMapping(&quot;/create&quot;)
    public String showCreateForm(Model model) {
        model.addAttribute(&quot;formData&quot;, new FormData());
        return &quot;create-form&quot;;
    }

    //폼에서 입력받은 데이터 저장
    @PostMapping(&quot;/save&quot;)
    public String saveFormData(@RequestParam(&quot;name&quot;) String name,
                               @RequestParam(&quot;category&quot;)String category,
                               @RequestParam(&quot;mail&quot;) String mail,
                               @RequestParam(&quot;phone&quot;) String phone,
                               @RequestParam(&quot;message&quot;) String message) {
                               
        formDataService.saveFormData(name, category, mail, phone, message);//폼 데이터 처리하기
        
        return &quot;redirect:/form/success&quot;;
    }

    //성공 시 contactcomplete.html 페이지 보여주기
    @GetMapping(&quot;/success&quot;)
    public String showSuccessPage() {
        return &quot;contactcomplete&quot;;
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. db url 설정하기&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;&lt;b&gt;application.yml 파일에서 db url, username, password 등을 입력한다. 엔티티 클래스를 생성할 때 table이 자동으로 만들어지는 ddl-auto: update 설정을 한다. (create는 기존 걸 삭제하고 새로 만들어지는 것이므로 update로 설정해야 한다.)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1687711571040&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db_name
    username: user
    password: 1234
    driver-class-name: com.mysql.cj.jdbc.Driver
    initialization-fail-fast: true

  jpa:
      database-platform: org.hibernate.dialect.MySQL8Dialect
      hibernate:
        ddl-auto: update
        naming:
          physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
        properties:
          hibernate:
            dialect: org.hibernate.dialect.MySQL8Dialect
            hbm2ddl:
              charset_name: UTF-8&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;build.gradle 파일에 의존성도 제대로 설정되어 있는지 확인한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1687711651246&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
	id 'java'
	id 'org.springframework.boot' version '2.7.12'
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'web'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'com.mysql:mysql-connector-j:8.0.32'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	// email 인증
	implementation 'org.springframework.boot:spring-boot-starter-mail'


}

tasks.named('test') {
	useJUnitPlatform()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;db를 만들땐 intellij의 Database 메뉴란에서 사용하고자 하는 db를 선택해서 생성한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;757&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sLkwR/btslpWvr4f9/dikIyb7Vfj83WajgeyVbTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sLkwR/btslpWvr4f9/dikIyb7Vfj83WajgeyVbTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sLkwR/btslpWvr4f9/dikIyb7Vfj83WajgeyVbTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsLkwR%2FbtslpWvr4f9%2FdikIyb7Vfj83WajgeyVbTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;757&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;757&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;나 같은 경우는 Wnmp의 mariadb를 사용했기 때문에 mariadb 설치시 입력한 User와 password를 입력했다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;948&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/utQn6/btsljTzjkIO/aoJZpJwBkS9kPMR85pi5a1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/utQn6/btsljTzjkIO/aoJZpJwBkS9kPMR85pi5a1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/utQn6/btsljTzjkIO/aoJZpJwBkS9kPMR85pi5a1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FutQn6%2FbtsljTzjkIO%2FaoJZpJwBkS9kPMR85pi5a1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;948&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;948&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;User, password, db 이름만 입력하면 된다. Test Connection을 누른 후 성공하면 db는 생성된 것이다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;db는 datagrip을 통해 관리하는 것이 편하기 때문에 datagrip과 주로 같이 사용한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이렇게 설정을 다해준 후 front-end 화면에서 데이터 입력했더니, db에 data가 insert가 되는 것을 확인했다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1861&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJFeVF/btslpXA7Liv/kXirqoPNGtR7zA4kgBmQ3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJFeVF/btslpXA7Liv/kXirqoPNGtR7zA4kgBmQ3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJFeVF/btslpXA7Liv/kXirqoPNGtR7zA4kgBmQ3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJFeVF%2FbtslpXA7Liv%2FkXirqoPNGtR7zA4kgBmQ3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1861&quot; height=&quot;702&quot; data-origin-width=&quot;1861&quot; data-origin-height=&quot;702&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;1191&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vegMs/btslcCSDycx/NTV3f2oRX0aIMNo89ADl9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vegMs/btslcCSDycx/NTV3f2oRX0aIMNo89ADl9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vegMs/btslcCSDycx/NTV3f2oRX0aIMNo89ADl9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvegMs%2FbtslcCSDycx%2FNTV3f2oRX0aIMNo89ADl9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1191&quot; height=&quot;119&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;이후 보완해야 할 점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;확장성을 고려하지 않고 엔티티 클래스만 생성하여 기능을 구현하였다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;여기에 DTO클래스를 추가로 생성하여 확장성을 고려해야 한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;</description>
      <category>Spring</category>
      <category>db insert</category>
      <category>jpa</category>
      <category>mariadb</category>
      <category>springboot</category>
      <category>폼데이터 db insert</category>
      <author>catloaf</author>
      <guid isPermaLink="true">https://catloaf.tistory.com/69</guid>
      <comments>https://catloaf.tistory.com/69#entry69comment</comments>
      <pubDate>Mon, 26 Jun 2023 01:13:04 +0900</pubDate>
    </item>
    <item>
      <title>Springboot JPA mariadb에서 CRUD할 때 인코딩 오류 발생</title>
      <link>https://catloaf.tistory.com/68</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Springboot 에서 폼으로 데이터를 입력 받아 JPA로 mariadb에 CRUD하는 기능을 만들던 중&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한국어로 입력 시 자꾸만 utf8 인코딩 오류가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1687700428718&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;data truncation: incorrect string value: '\xea\xb0\x9c\xec\x9d\xb8' for column&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 비즈니스 로직에서 utf8 변환을 하거나 application.yml 파일에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;database url 설정을 아래로 해주었으나 그럼에도 계속 오류는 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1687700497880&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;jdbc:mysql://URL?useSSL=false&amp;amp;useUnicode=true&amp;amp;characterEncoding=utf8&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글링 해보니 mariadb 자체의 인코딩 설정을 바꿔줘야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;windows에서는 my.ini 파일을 찾아 수정해주면 되었다.&lt;/p&gt;
&lt;pre id=&quot;code_1687700826609&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[client]
default-character-set = utf8

[mysql]
default-character-set = utf8

[mysqld]
init_connect=&quot;SET collation_connection=utf8_general_ci&quot;
init_connect=&quot;SET NAMES utf8&quot;
character-set-server = utf8
collation-server = utfg_general_ci
skip-character-set-client-handshake&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;db의 인코딩을 확인해보니 utf8로 설정이 바뀐 걸 확인했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데도 해결이 안돼서 2시간을 삽질했는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;table의 인코딩을 확인 안했던 것이었다.&lt;/p&gt;
&lt;pre id=&quot;code_1687700878618&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;show full columns from db.table;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바뀐 설정의 table이 아닌 이전에 만들어진 설정의 table이 계속 살아있어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류가 계속 발생했던 거였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 만든 table을 삭제하고 변경한 설정으로 다시 table을 만들고&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;1861&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QvNUa/btslmTsa4KC/6mKVE0na9KrNf4KCwxKB7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QvNUa/btslmTsa4KC/6mKVE0na9KrNf4KCwxKB7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QvNUa/btslmTsa4KC/6mKVE0na9KrNf4KCwxKB7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQvNUa%2FbtslmTsa4KC%2F6mKVE0na9KrNf4KCwxKB7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1861&quot; height=&quot;702&quot; data-origin-width=&quot;1861&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;db에 데이터가 들어간 것을 확인할 수 있었다.&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;1191&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V5r1G/btsljTsuilo/cwSfqe6HYyBYv4xdtu1Lu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V5r1G/btsljTsuilo/cwSfqe6HYyBYv4xdtu1Lu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V5r1G/btsljTsuilo/cwSfqe6HYyBYv4xdtu1Lu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV5r1G%2FbtsljTsuilo%2FcwSfqe6HYyBYv4xdtu1Lu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1191&quot; height=&quot;119&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Spring</category>
      <author>catloaf</author>
      <guid isPermaLink="true">https://catloaf.tistory.com/68</guid>
      <comments>https://catloaf.tistory.com/68#entry68comment</comments>
      <pubDate>Sun, 25 Jun 2023 23:46:00 +0900</pubDate>
    </item>
    <item>
      <title>pyinstall 실행 파일 생성시 오류 ModuleNotFoundError: No module named 'PyQt5'</title>
      <link>https://catloaf.tistory.com/66</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zm96S/btrtWuMz5wt/l8n4dvtp7W0Zfm7rY7bUoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zm96S/btrtWuMz5wt/l8n4dvtp7W0Zfm7rY7bUoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zm96S/btrtWuMz5wt/l8n4dvtp7W0Zfm7rY7bUoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzm96S%2FbtrtWuMz5wt%2Fl8n4dvtp7W0Zfm7rY7bUoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;325&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀쩡히 실행파일 잘 생성하다가 갑자기 이런 오류가 떴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cmd창을 관리자모드로 실행 뒤 --hidden-import PyQt5를 추가하여 아래 명령어로 실행했더니 해결됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 밖의 권한 오류나 엑셀 창을 켜놓고 실행하여 생기는 오류도 있었는데 오류창과 엑셀 프로그램을 닫고 실행했더니 오류가 사라졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1645491265581&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pyinstaller -w -F --hidden-import PyQt5 run.py&lt;/code&gt;&lt;/pre&gt;</description>
      <category>데이터 분석/Python</category>
      <author>catloaf</author>
      <guid isPermaLink="true">https://catloaf.tistory.com/66</guid>
      <comments>https://catloaf.tistory.com/66#entry66comment</comments>
      <pubDate>Tue, 22 Feb 2022 10:04:19 +0900</pubDate>
    </item>
    <item>
      <title>쇼핑몰 주문 업체별 주문파일 생성하기, 대량 이메일 발송 업무 자동화 프로그램 파이썬 개발, Gui, PyQT5, QT designer, pyinstaller exe 실행 파일 만들기 디버깅 error 해결, pyinstaller exe파일 용량 줄이는..</title>
      <link>https://catloaf.tistory.com/65</link>
      <description>&lt;h1&gt;RPA: 업무 프로세스 자동화 프로그램 개발&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사에서 다른 마케팅팀 직원들이 쓸 수 있는 사내용 업무 자동화 프로그램 개발 업무를 맡게 되었다. 주로 하는 업무는 데이터 분석 프로젝트 제안과, 데이터 분석, 엔지니어링이지만 처음 만드는 개발 프로그램인만큼 신경이 쓰여 틈틈히 정리해두었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;현재 업무 프로세스&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;*** 쇼핑몰 admin 에서 주문파일 다운 &amp;rarr; 2. 업체별로 주문파일 엑셀파일로 저장 &amp;rarr; 3. 각 업체별 주문파일 메일로 배송 및 송장번호 회신 요청 &amp;rarr; 4. 송장번호 회신받기(메일로) &amp;rarr; 5.B*** 쇼핑몰 admin에 송장번호 등록&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;개발 가능 범위&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.** 쇼핑몰 admin 에서 주문파일 다운 (구현)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; xls 파일 &amp;rarr; xlsx 형식으로 자동변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 업체별로 주문파일 엑셀파일로 저장 (구현)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; xlsx 엑셀파일 pandas로 전처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 브랜드명/업체명 리스트 사전만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; dataframe으로 브랜드명 data 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 업체명으로 각 dataframe 엑셀파일 저장&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;저장한 엑셀파일 기반으로 대량발송 가능한 email 리스트 만들기 (구현)&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 메일주소/제목/본문/첨부파일 내용 엑셀 자동 생성할 수 있도록 프로그래밍&lt;/p&gt;
&lt;ol 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;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; SMTP 서버로 MIME(Multipurpose Internet Mail Extensions)템플릿: 메일 작성을 위한 표준적인 형식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr;제목, 본문, 첨부파일 다르게 대량으로 이메일 보내기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;개발 시간&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 가능 범위 확인 및 검토, 파일요청 : 5일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 진행 : 약 10 일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;개발 소스코드&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/Areum120/bmwjoymall/tree/main/product_classification&quot;&gt;https://github.com/Areum120/bmwjoymall/tree/main/product_classification&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.convert_to_xlsx -&amp;gt;주문파일.xls -&amp;gt;xlsx 형식으로 변환 2.excel_classification-&amp;gt;주문파일 불러와서 업체명 조회하여 각 업체별 주문내역 엑셀 파일 생성 3.create_email_list-&amp;gt;생성한 엑셀파일 기준으로 수신자,제목,본문,첨부파일 내용 이메일리스트 작성 4.mailing_auto-&amp;gt;이메일리스트로 대량 메일 자동 발송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&lt;a href=&quot;https://github.com/Areum120/bmwjoymall/blob/main/product_classification/convert_to_xlsx.py&quot;&gt;https://github.com/Areum120/bmwjoymall/blob/main/product_classification/convert_to_xlsx.py&lt;/a&gt; 2.&lt;a href=&quot;https://github.com/Areum120/bmwjoymall/blob/main/product_classification/excel_classification.py&quot;&gt;https://github.com/Areum120/bmwjoymall/blob/main/product_classification/excel_classification.py&lt;/a&gt; 3.&lt;a href=&quot;https://github.com/Areum120/bmwjoymall/blob/main/product_classification/create_email_list.py&quot;&gt;https://github.com/Areum120/bmwjoymall/blob/main/product_classification/create_email_list.py&lt;/a&gt; 4.&lt;a href=&quot;https://github.com/Areum120/bmwjoymall/blob/main/product_classification/mailing_auto.py&quot;&gt;https://github.com/Areum120/bmwjoymall/blob/main/product_classification/mailing_auto.py&lt;/a&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;사용법(GUI 완료 &amp;rarr; exe 실행파일 개발 진행)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추후 자동화 프로그램을 웹으로 고도화하려면 서버가 필요하므로 서버 없이 어플리케이션 배포방법 필요, GUI 프로그래밍으로 사용자가 프로그램 사용할 수 있도록 인터페이스 개발 중&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 진행 : 1/17(월)~1/21(금), 2/3~4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GUI app 개발 완료(2/3) &amp;rarr; 실행파일 개발 완료 (2/10)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/Areum120/bmwjoymall/tree/main/GUI&quot;&gt;https://github.com/Areum120/bmwjoymall/tree/main/GUI&lt;/a&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;느낀점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 틈틈이 풀었던 코딩테스트가 도움이 많이 된 것 같음&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;lsquo;편하게 사용할 수 있도록&amp;rsquo; 기능 구현하는 것이 어려움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- GUI 프로그래밍 멀티 스레드 개념이 어려움, GUI 작동 시 이유없이 프로그램 자동 종료되는 문제로 며칠 골머리 앓았는데 예외시 종료 방지 코드로 디버깅할 수 있었음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실행파일 생성에 3~4일 넘게 소요됨, 실행 오류로 디버깅이 어려웠고 경로설정으로 인한 오류 외 다양한 오류가 많았음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;pyinstaller&amp;nbsp;exe&amp;nbsp;실행&amp;nbsp;파일&amp;nbsp;만들기&amp;nbsp;디버깅&amp;nbsp;에러&amp;nbsp;해결&amp;nbsp;과정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디버깅하는 과정은 콘솔로 exe 파일을 만든다음 cmd에서 run.exe 로 실행하였음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 사람들이 .spec 파일 명시를 중요하게 다루었으나 정작 .spec 파일은 따로 건드리지 않고 exe 파일 생성하였으니 잘 작동되었음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;pyinstaller exe 실행안됨 에러(errors) 들&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. FileNotFoundError: [Errno 2] No such file or directory:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 경로 재설정 해결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경로 문제가 제일 빈번했는데 path문제는 루트가 어디로 설정 되어있는지 기본값은 무엇인지부터 시작해야함&lt;/p&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. ImportError: DLL load failed while importing QtCore: 지정된 프로시저를 찾을 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; conda update pyqt 로 해결 spec파일의 pathex 경로를 파이썬 bin 경로를 붙여야 하는 줄알았으나 다르게 해결됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. this application failed to start because no qt platform plugin could be initialized&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 시스템 환경변수 경로 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수이름 : QT_QPA_PLATFORM_PLUGIN_PATH&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수값 : C:\Users\workscombine\Desktop\work\bmwjoymall_rpa\project_env\Lib\site-packages\PyQt5\Qt5\plugins\platforms&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. PermissionError: [WinError 5] 액세스가 거부되었습니다: 'C:\\Users\\웍스컴바인\\Desktop\\work\\bmwjoymall_rpa\\dist\\run.exe&amp;rsquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr;cmd 명령창 관리자 계정으로 실행하여 명령 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5. [Exception: Cannot find existing PyQt5 plugin directories.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Paths checked: C:/Users/&amp;middot;&amp;sup1;&amp;ordm;&amp;sect;&amp;iquest;&amp;iexcl; &amp;cedil;&amp;Acirc;/AppData/Roaming/Python/Python39/Site-packages/PyQt5/Qt/plugins]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자계정 한글이름 영문으로 변경 후 해결 (참고 블로그 :&lt;a href=&quot;https://superhky.tistory.com/297&quot;&gt;https://superhky.tistory.com/297&lt;/a&gt; )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 분들이 노하우와 정수가 담긴 글을 써주셔서 다행히 많은 문제를 해결할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;용량 줄이는 법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cmd 창에서 python 이라고 치면 anaconda에 설치된 python이 기본 설정으로 나온다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python 3.9를 다운받아서 시스템 환경변수 편집에서 path 설정을 편집 -&amp;gt; 새로만들기로 추가한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dk8ftj/btrs1St7mGl/My2OVruFtJy5yphBC9aXlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dk8ftj/btrs1St7mGl/My2OVruFtJy5yphBC9aXlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dk8ftj/btrs1St7mGl/My2OVruFtJy5yphBC9aXlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdk8ftj%2Fbtrs1St7mGl%2FMy2OVruFtJy5yphBC9aXlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;612&quot; height=&quot;583&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C:\Users\workscombine\AppData\Local\Programs\Python\Python39\Scripts&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C:\Users\workscombine\AppData\Local\Programs\Python\Python39&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음 cmd창에서 python을 쳤을 때 conda가 아닌 새로 설치한 python이 기본설정으로 되어 있는 걸 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음 run.py를 만든 폴더로 들어가 가상환경을 생성해준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1644542935044&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd project_env/Scripts
activate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성한 가상환경을 활성화 한 후 cd..로 다시 run.py가 있는 곳으로 가서 exe 실행파일을 생성해준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1644542978839&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pyinstaller -w -F run.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아나콘다의 python이 활성화 되면 아래에서 Python(conda) 라고 되어 있다.&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;640&quot; data-origin-height=&quot;101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3MpP2/btrsYd6PJ1Z/lT7r3yODr58KnhAIrpWH9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3MpP2/btrsYd6PJ1Z/lT7r3yODr58KnhAIrpWH9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3MpP2/btrsYd6PJ1Z/lT7r3yODr58KnhAIrpWH9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3MpP2%2FbtrsYd6PJ1Z%2FlT7r3yODr58KnhAIrpWH9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;101&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;101&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;521&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nzuII/btrs1RaRwQC/LJ88cU3KW6b0kDz4OCYAD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nzuII/btrs1RaRwQC/LJ88cU3KW6b0kDz4OCYAD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nzuII/btrs1RaRwQC/LJ88cU3KW6b0kDz4OCYAD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnzuII%2Fbtrs1RaRwQC%2FLJ88cU3KW6b0kDz4OCYAD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;521&quot; height=&quot;56&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 완료 되니 아나콘다로 exe 파일 생성했을 때는 340MB 였던 파일이 60MB로 줄어들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(참고 블로그:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=blueqnpfr1&amp;amp;logNo=221582183962&quot;&gt;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=blueqnpfr1&amp;amp;logNo=221582183962&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그외 참고하였던 블로그&lt;/p&gt;
&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://iamaman.tistory.com/3289&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://iamaman.tistory.com/3289&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.winterjung.dev/2017/02/23/pyinstaller&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.winterjung.dev/2017/02/23/pyinstaller&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tina0430.tistory.com/34&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://tina0430.tistory.com/34&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://netpilgrim.net/1011&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://netpilgrim.net/1011&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://4uwingnet.tistory.com/4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://4uwingnet.tistory.com/4&lt;/a&gt; &lt;br /&gt;&lt;a href=&quot;https://fidelislee.tistory.com/entry/Python-PyQt%EB%A1%9C-GUI-%EC%96%B4%ED%94%8C-%EB%A7%8C%EB%93%A4%EC%96%B4-%EB%B3%B4%EA%B8%B0-22&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://fidelislee.tistory.com/entry/Python-PyQt%EB%A1%9C-GUI-%EC%96%B4%ED%94%8C-%EB%A7%8C%EB%93%A4%EC%96%B4-%EB%B3%B4%EA%B8%B0-22&lt;/a&gt; &lt;br /&gt;&lt;a href=&quot;https://developer-mistive.tistory.com/59&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer-mistive.tistory.com/59&lt;/a&gt; &lt;br /&gt;&lt;a href=&quot;https://blog.daum.net/goodgodgd/30&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.daum.net/goodgodgd/30&lt;/a&gt;&lt;/p&gt;</description>
      <category>데이터 분석/Python</category>
      <category>exe실행파일만들기</category>
      <category>GUI</category>
      <category>pyinstaller</category>
      <category>PyQt5</category>
      <category>Python</category>
      <category>개발</category>
      <category>자동화프로그램</category>
      <category>파이썬</category>
      <author>catloaf</author>
      <guid isPermaLink="true">https://catloaf.tistory.com/65</guid>
      <comments>https://catloaf.tistory.com/65#entry65comment</comments>
      <pubDate>Thu, 10 Feb 2022 15:08:17 +0900</pubDate>
    </item>
    <item>
      <title>AWS EC2 PuTTY로 접속 시 System restart required, remote side unexpectedly closed network connection 오류 해결 방법</title>
      <link>https://catloaf.tistory.com/64</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVqmb0/btrpjvCyFz6/cyfiOH02qMsh8QAKogRSA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVqmb0/btrpjvCyFz6/cyfiOH02qMsh8QAKogRSA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVqmb0/btrpjvCyFz6/cyfiOH02qMsh8QAKogRSA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVqmb0%2FbtrpjvCyFz6%2FcyfiOH02qMsh8QAKogRSA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;557&quot; height=&quot;154&quot; data-origin-width=&quot;557&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버를 다른 계정에서 이관 후 SSH키를 새로 생성하여 PuTTygen으로 ppk파일로 변환한뒤&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인했을 떄 System restart required 메세지가 나타난다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1640912940544&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo reboot&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어를 치면 해결된다고 하는데, 위 명령어를 치니까&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;remote side unexpectedly closed network connection 라는 경고창이 나타나면서 오류가 났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;찾아보니 사용자/.ssh 폴더의 Known_hosts라고 기존의 이관전 계정에서 설정했던 파일이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Known_hosts의 코드와 일부 충돌한거라고 보는데 충돌코드를 삭제하거나, 서버가 하나로만 관리하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Known_hosts파일을 삭제해도 무방, 삭제 후 재접속하니 오류없이 잘 접속된다.&lt;/p&gt;</description>
      <category>데이터 분석</category>
      <author>catloaf</author>
      <guid isPermaLink="true">https://catloaf.tistory.com/64</guid>
      <comments>https://catloaf.tistory.com/64#entry64comment</comments>
      <pubDate>Fri, 31 Dec 2021 10:11:32 +0900</pubDate>
    </item>
    <item>
      <title>Argo CD 배포하는 법</title>
      <link>https://catloaf.tistory.com/63</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. aws ArgoCD 주소로 들어간다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. ID/Pw 로그인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 프로젝트를 클릭한다 (아래 버튼x)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cciry1/btrnR5dLge4/Au3GpWDk06V1a08WGeiLc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cciry1/btrnR5dLge4/Au3GpWDk06V1a08WGeiLc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cciry1/btrnR5dLge4/Au3GpWDk06V1a08WGeiLc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcciry1%2FbtrnR5dLge4%2FAu3GpWDk06V1a08WGeiLc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;646&quot; data-origin-width=&quot;626&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;4. 맨오른쪽 Pod 를 눌러서 delete를 누른다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Xnjv/btrnVw2KVBb/6r3dlipHf6iBCSzLF5g3R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Xnjv/btrnVw2KVBb/6r3dlipHf6iBCSzLF5g3R0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Xnjv/btrnVw2KVBb/6r3dlipHf6iBCSzLF5g3R0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Xnjv%2FbtrnVw2KVBb%2F6r3dlipHf6iBCSzLF5g3R0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;316&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 새창이 뜨면 ok를 누른다&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;1047&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bePpcW/btrnQj4TI0q/U2awn0y6KsnkasXOn8Om1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bePpcW/btrnQj4TI0q/U2awn0y6KsnkasXOn8Om1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bePpcW/btrnQj4TI0q/U2awn0y6KsnkasXOn8Om1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbePpcW%2FbtrnQj4TI0q%2FU2awn0y6KsnkasXOn8Om1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1047&quot; height=&quot;313&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>데이터 분석/Project</category>
      <author>catloaf</author>
      <guid isPermaLink="true">https://catloaf.tistory.com/63</guid>
      <comments>https://catloaf.tistory.com/63#entry63comment</comments>
      <pubDate>Tue, 14 Dec 2021 17:04:02 +0900</pubDate>
    </item>
    <item>
      <title>소스트리 깃 commit 이전으로 되돌리기 - 용량 큰 파일 push 오류 날 때 커밋 삭제하는 법</title>
      <link>https://catloaf.tistory.com/62</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브는 100mb 이상의 파일을 올리려면 bitbucket에서 LFS 저장소를 생성하여 업로드하는 방법이 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 기존의 깃허브 저장소는 100mb 이상의 큰 용량 파일을 올리게 되면 오류가 난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 실수로 커밋 후 git add로 &lt;span style=&quot;color: #555555;&quot;&gt;스토리지 영역에 올려두었을 때 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;푸시(Push) 오류가 나면서 다른 변경된 사항도 푸시(push)하지 못하는 난감한 경우가 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법은 &lt;b&gt;용량이 큰 파일을 commit하기 이전의 commit 커밋 상태&lt;/b&gt;로 되돌리면 된다.&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;즉 git add를 취소하는 것이다.&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;이전 커밋으로 변경하기 위해서는 git bash 터미널 창을 열어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스트리 창에서 터미널을 열어도 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1ctiM/btrndHy1fAA/DeI8sMTStNoLMErxYfXCKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1ctiM/btrndHy1fAA/DeI8sMTStNoLMErxYfXCKk/img.png&quot; data-alt=&quot;소스트리 오른쪽 맨 위 &amp;quot;터미널&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1ctiM/btrndHy1fAA/DeI8sMTStNoLMErxYfXCKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1ctiM%2FbtrndHy1fAA%2FDeI8sMTStNoLMErxYfXCKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;294&quot; height=&quot;171&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;171&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;소스트리 오른쪽 맨 위 &quot;터미널&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git bash 창이 열리면 이전의 커밋 기록을 살핀다. n개의 커밋을 돌리는 식으로 명령어를 넣어도 되지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 커밋기록이 많아서 갯수가 헷갈리는 경우 특정 Git code를 지정하여 되돌릴 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;깃에서 커밋 삭제하는 법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. git log 입력한다.&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1638924806195&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git log&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;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;721&quot; data-origin-height=&quot;790&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btrJMg/btrnjjjmmy5/Hz0frb1gkaZhAr7AZiX0Y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btrJMg/btrnjjjmmy5/Hz0frb1gkaZhAr7AZiX0Y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btrJMg/btrnjjjmmy5/Hz0frb1gkaZhAr7AZiX0Y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtrJMg%2Fbtrnjjjmmy5%2FHz0frb1gkaZhAr7AZiX0Y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;721&quot; height=&quot;790&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;790&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 이전에 깃에 커밋했던 기록들이 죽 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약에 12월 7일 화요일 오후 5시 10분경 &quot;date update&quot; 라고 커밋한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 용량이 100mb 이상의 큰 파일이라고 치자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 되돌리고 싶은 git 커밋 코드를 지정한다. &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한건 해당 커밋 이전의 상태로 되돌려야 하므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 아래 커밋 기록의 코드를 입력해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;790&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uJLfl/btrnmNKw6J9/7kRmpIrm5mvvflo7zeed9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uJLfl/btrnmNKw6J9/7kRmpIrm5mvvflo7zeed9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uJLfl/btrnmNKw6J9/7kRmpIrm5mvvflo7zeed9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuJLfl%2FbtrnmNKw6J9%2F7kRmpIrm5mvvflo7zeed9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;721&quot; height=&quot;790&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;790&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. git reset --hard 35d3f2388158724bb8f37bb9acf6a6ec3077590a 입력한다.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1638924852501&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git reset --hard 35d3f2388158724bb8f37bb9acf6a6ec3077590a&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--hard&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션은 현재 HEAD에서 추가된 변경사항들을 모두 되돌려준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 오류가 나서 푸시되지 않은&amp;nbsp; &quot;Push1&quot; 이 사라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 스테이지에 올려두고 싶다면 --hard가 아닌 --soft옵션을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1638925558273&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$  git reset --soft&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 입력이 더 번거롭다 하는 경우 위에서 취소하고 싶은 커밋 갯수를 입력하면 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1638925716908&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git reset HEAD~4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 취소하고 싶은 커밋 이전의 커밋 코드를 지정한것과 달리 갯수를 지정할 땐 지우고 싶은 갯수만 지정하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지우고 싶은 커밋 포함하여 4개인 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cr1nBJ/btrnjIQJYrN/F4kQLSGIboB74lVgn28K9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cr1nBJ/btrnjIQJYrN/F4kQLSGIboB74lVgn28K9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cr1nBJ/btrnjIQJYrN/F4kQLSGIboB74lVgn28K9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcr1nBJ%2FbtrnjIQJYrN%2FF4kQLSGIboB74lVgn28K9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;978&quot; height=&quot;792&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 최근의 커밋을 취소하려고 하는 경우 아래 코드를 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1638925367117&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git reset HEAD^&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4.&amp;nbsp; git log 와 git status로 현재 상태 점검한다.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 기록으로 되돌아간 걸 확인한다면&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1638924946777&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$  git log --oneline&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1638924954071&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git status&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;여기서 궁금한 점!&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Q. 그러면 그 이후의 커밋 기록은 다 없어지는 건가요?&lt;br /&gt;&lt;br /&gt;A. 네 커밋 기록은 없어지지만 변경된 파일 내용은 어디로 도망가지 않습니다. 다른 파일들의 변경사항은 다시 commit 메세지를 생성하면 됩니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 문제는 용량이 큰 파일이었으므로 이전 커밋 환경으로 돌아가면 스테이지에 올라가지 않은 파일이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스트리에 뜹니다.&amp;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;859&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YxuUb/btrnfATLwCY/dnEh45gct1xquScvH1VvSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YxuUb/btrnfATLwCY/dnEh45gct1xquScvH1VvSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YxuUb/btrnfATLwCY/dnEh45gct1xquScvH1VvSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYxuUb%2FbtrnfATLwCY%2FdnEh45gct1xquScvH1VvSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;859&quot; height=&quot;98&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;용량이 큰 파일은 따로 보관하거나 필요없는 경우 삭제&lt;/b&gt;해주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나 같은 경우는 회사컴퓨터가 아닌 개인 컴퓨터에서 깃허브에 미리 푸시(push)해둔 변경사항이 있기에 용량이 큰파일을 삭제 후 깃허브에 Push해놓은 변경사항을 회사컴퓨터에서 다시 Pull을 받으니 내가 원하는 상태가 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;만약 커밋을 이미 푸시(push)해 버렸다면?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git reset&lt;span style=&quot;color: #000000;&quot;&gt;은 HEAD 위치를 바꿔버려서 로컬 저장소의 상태를 커밋 이전으로 강제 변경해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 커밋을 협업중인 원격 저장소에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;push&lt;span style=&quot;color: #000000;&quot;&gt;해버린 경우 로컬 저장소에서 커밋을 취소해버리면 원격 저장소와 상태가 달라져 버린다. 이럴 땐 git revert를 사용해주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;git reset : 커밋 취소&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;git revert : 커밋 내용 되돌리기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;</description>
      <category>데이터 분석/Python</category>
      <author>catloaf</author>
      <guid isPermaLink="true">https://catloaf.tistory.com/62</guid>
      <comments>https://catloaf.tistory.com/62#entry62comment</comments>
      <pubDate>Wed, 8 Dec 2021 10:26:21 +0900</pubDate>
    </item>
    <item>
      <title>Mysql 데이터베이스, 테이블 용량 조회하는 법</title>
      <link>https://catloaf.tistory.com/61</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 데이터 베이스 용량 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;bmwgs&quot; =&amp;gt; DB name임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT table_schema &quot;bmwgs&quot;,
SUM(data_length + index_length) / 1024 / 1024 &quot;Size(MB)&quot;
FROM information_schema.TABLES
GROUP BY table_schema;

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 테이블 용량 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'car_model_keyword&quot; =&amp;gt; table name임&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;SELECT table_name AS 'car_model_keyword',
                 ROUND(SUM(data_length+index_length)/(1024*1024), 2) AS 'All(MB)',
                 ROUND(data_length/(1024*1024), 2) AS 'Data(MB)',
                 ROUND(index_length/(1024*1024), 2) AS 'Index(MB)'
FROM information_schema.tables
GROUP BY car_model_keyword
ORDER BY data_length DESC;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>데이터 분석/SQL</category>
      <author>catloaf</author>
      <guid isPermaLink="true">https://catloaf.tistory.com/61</guid>
      <comments>https://catloaf.tistory.com/61#entry61comment</comments>
      <pubDate>Wed, 8 Dec 2021 09:27:56 +0900</pubDate>
    </item>
    <item>
      <title>putty 리눅스 서버 접속, ppk파일로 로그인 하는법</title>
      <link>https://catloaf.tistory.com/60</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;a href=&quot;https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;putty&lt;/a&gt;를 설치한다&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;1425&quot; data-origin-height=&quot;613&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FOGwd/btrm5yubg0t/OzkYaRTDny45RuHOf5idgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FOGwd/btrm5yubg0t/OzkYaRTDny45RuHOf5idgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FOGwd/btrm5yubg0t/OzkYaRTDny45RuHOf5idgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFOGwd%2Fbtrm5yubg0t%2FOzkYaRTDny45RuHOf5idgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1425&quot; height=&quot;613&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1425&quot; data-origin-height=&quot;613&quot;/&gt;&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. putty를 실행한다&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;450&quot; data-origin-height=&quot;433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sgXku/btrm3QPlYGD/eOmMh7tvnek7R6TWXlfh9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sgXku/btrm3QPlYGD/eOmMh7tvnek7R6TWXlfh9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sgXku/btrm3QPlYGD/eOmMh7tvnek7R6TWXlfh9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsgXku%2Fbtrm3QPlYGD%2FeOmMh7tvnek7R6TWXlfh9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;433&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;433&quot;/&gt;&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;Host Name에 접속 URL을 입력한다 Port는 22 그대로 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. putty key generator를 열어서 Load를 클릭 Type of key to generate는 RSA로 설정&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;599&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3TCPz/btrm813CDCD/kiE4KKL2wAG8JP5dGoIzi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3TCPz/btrm813CDCD/kiE4KKL2wAG8JP5dGoIzi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3TCPz/btrm813CDCD/kiE4KKL2wAG8JP5dGoIzi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3TCPz%2Fbtrm813CDCD%2FkiE4KKL2wAG8JP5dGoIzi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;462&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. dashboard.pem 파일을 연다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BzpA9/btrmYTF6uRR/MiIVGpkbQz6gOizVI6p9I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BzpA9/btrmYTF6uRR/MiIVGpkbQz6gOizVI6p9I0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BzpA9/btrmYTF6uRR/MiIVGpkbQz6gOizVI6p9I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBzpA9%2FbtrmYTF6uRR%2FMiIVGpkbQz6gOizVI6p9I0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;464&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 아래 창이 나오면 성공&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EfVtr/btrmZILoUX5/nIzbXe3meGRn6GeKUdYijk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EfVtr/btrmZILoUX5/nIzbXe3meGRn6GeKUdYijk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EfVtr/btrmZILoUX5/nIzbXe3meGRn6GeKUdYijk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEfVtr%2FbtrmZILoUX5%2FnIzbXe3meGRn6GeKUdYijk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;336&quot; height=&quot;179&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Save Private key를 클릭한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NVZwO/btrnbIW8cqq/KSSCGN38TiOdmAfdfrsYqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NVZwO/btrnbIW8cqq/KSSCGN38TiOdmAfdfrsYqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NVZwO/btrnbIW8cqq/KSSCGN38TiOdmAfdfrsYqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNVZwO%2FbtrnbIW8cqq%2FKSSCGN38TiOdmAfdfrsYqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;196&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 저장하고 싶은 폴더에 파일이름 입력 후 저장 누르면 ppk(putty private key) 파일 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qfTvM/btrm9DaHMsG/ZPoTlnz46ncbbZfHB7PaTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qfTvM/btrm9DaHMsG/ZPoTlnz46ncbbZfHB7PaTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qfTvM/btrm9DaHMsG/ZPoTlnz46ncbbZfHB7PaTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqfTvM%2Fbtrm9DaHMsG%2FZPoTlnz46ncbbZfHB7PaTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;939&quot; height=&quot;453&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;453&quot;/&gt;&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;7. SSH &amp;gt; Auth &amp;gt; Browse에서 .pem 으로 생성한 ppk파일을 연다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAcxWu/btrmY5zZQLY/pIbsWwOz0kaSsHN1M1Oyl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAcxWu/btrmY5zZQLY/pIbsWwOz0kaSsHN1M1Oyl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAcxWu/btrmY5zZQLY/pIbsWwOz0kaSsHN1M1Oyl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAcxWu%2FbtrmY5zZQLY%2FpIbsWwOz0kaSsHN1M1Oyl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;939&quot; height=&quot;453&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;453&quot;/&gt;&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;454&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqq5dV/btrmY48ZHAf/BKFK5wY0OXnpW9PK5GKU0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqq5dV/btrmY48ZHAf/BKFK5wY0OXnpW9PK5GKU0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqq5dV/btrmY48ZHAf/BKFK5wY0OXnpW9PK5GKU0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcqq5dV%2FbtrmY48ZHAf%2FBKFK5wY0OXnpW9PK5GKU0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;454&quot; height=&quot;434&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;434&quot;/&gt;&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;8. open을 누르면 새창이 뜬다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9PQI9/btrnbJn7oYN/YckkutgEDHb9SSasn6S6FK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9PQI9/btrnbJn7oYN/YckkutgEDHb9SSasn6S6FK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9PQI9/btrnbJn7oYN/YckkutgEDHb9SSasn6S6FK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9PQI9%2FbtrnbJn7oYN%2FYckkutgEDHb9SSasn6S6FK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;416&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. id값 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(여기서 id는 ubuntu)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. &lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;&amp;nbsp;Glances 입력하면 기본적인 CPU, RAM, NIC, DISK 뿐만 아니라 GPU, Docker Containers 상태까지 모니터링한다.&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;1186&quot; data-origin-height=&quot;81&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cG9FcB/btrm9Du0aCm/h4FL5WzzDmJAf8yrkrD2RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cG9FcB/btrm9Du0aCm/h4FL5WzzDmJAf8yrkrD2RK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cG9FcB/btrm9Du0aCm/h4FL5WzzDmJAf8yrkrD2RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcG9FcB%2Fbtrm9Du0aCm%2Fh4FL5WzzDmJAf8yrkrD2RK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1186&quot; height=&quot;81&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;81&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>데이터 분석/Project</category>
      <author>catloaf</author>
      <guid isPermaLink="true">https://catloaf.tistory.com/60</guid>
      <comments>https://catloaf.tistory.com/60#entry60comment</comments>
      <pubDate>Mon, 6 Dec 2021 13:04:12 +0900</pubDate>
    </item>
    <item>
      <title>11/ 23 일기</title>
      <link>https://catloaf.tistory.com/59</link>
      <description>&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;To do&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운동하기-&amp;gt; 집에서 요가 매트를 깔고 운동했다 백신 미접종자는 Pcr 검사 또는 백신 접종 후 운동시설을 이용할 수 있다고 한다. 내년에 안전한 백신 나오면 맞을까 했는데 고민이다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;learn&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이진수를 십진수로 바꾸는 법, 십진수를 이진수로 바꾸는 법, 그리고 비트에 대해서 공부했다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;feel&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이제 프로젝트 막바지에 도달했다. 데모데이 발표일에 발표자가 잘 발표하고 일주일 기다리면 경과가 나오므로 당분간은 여유가 있을 것 같다. 좀 여유를 가지고 앞으로의 계획을 천천히 생각해볼 필요가 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;plan&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;탈잉에서 직장에서의 성과를 잘 표출하는 법, 커뮤니케이션 강좌를 들을 생각이다. 내년 연봉협상에서 유리한 고지를 차지하면서도 만약 협상이 잘 안될 시 이직 계획도 생각해놔야 할 것 같다&lt;/li&gt;
&lt;li&gt;포트폴리오는 깃헙 블로그를 만들어서 업데이트를 해야할 지 고민이다&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>think</category>
      <author>catloaf</author>
      <guid isPermaLink="true">https://catloaf.tistory.com/59</guid>
      <comments>https://catloaf.tistory.com/59#entry59comment</comments>
      <pubDate>Wed, 24 Nov 2021 09:56:26 +0900</pubDate>
    </item>
  </channel>
</rss>