<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ppin_ppin_i.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Tue, 22 Oct 2024 13:38:29 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>ppin_ppin_i.log</title>
            <url>https://velog.velcdn.com/images/ppin_ppin_i/profile/52d31304-ec8f-4651-802a-dc75557b6654/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. ppin_ppin_i.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ppin_ppin_i" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[supabase 스토리지 만들기]]></title>
            <link>https://velog.io/@ppin_ppin_i/supabase-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@ppin_ppin_i/supabase-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Tue, 22 Oct 2024 13:38:29 GMT</pubDate>
            <description><![CDATA[<p>스토리지는 이미지를 저장하고 불러올 때 사용 되는 기능임</p>
<p>공식 문서 보면서 해보자 ㄱㄱ</p>
<h2 id="스토리지">스토리지</h2>
<ol>
<li>new bucket 클릭
<img src="https://velog.velcdn.com/images/ppin_ppin_i/post/9f13df9a-5a0a-4bb5-afee-b4b12e85f8cf/image.png" alt=""></li>
</ol>
<ol start="2">
<li>버킷이름 , public (누구나 업로드 할 수 있는지 말지 정하는것 ) , 사이즈 제한,업로드 파일 유형 정해주면 됨
<img src="https://velog.velcdn.com/images/ppin_ppin_i/post/90225e63-db33-41b6-8dfd-f49a7ffdad09/image.png" alt=""></li>
</ol>
<ol start="3">
<li><p>스토리지 생성 되면 Policies 만들어야됌 좌측 하단 메뉴바  보면 있음 . 클릭 ㄱㄱ
<img src="https://velog.velcdn.com/images/ppin_ppin_i/post/378d9b8e-8611-419d-9d3d-f6365a76ad69/image.png" alt=""></p>
</li>
<li><p>가장 상단에 있는 <strong>New policy</strong> 클릭
<img src="https://velog.velcdn.com/images/ppin_ppin_i/post/447f8517-7e21-47e5-90a7-f29026a22495/image.png" alt=""></p>
</li>
<li><p>For full customization -&gt; 이걸 눌러야 좀 더 간편하게 policy 를 생성 할 수 있다함.
(Get started quickly)문구가 더 간편한거 아닌가? 안해봐서 모름 일단 For Full custimaztionㄱㄱ 
<img src="https://velog.velcdn.com/images/ppin_ppin_i/post/cade24eb-2bf5-4d47-8944-0d2440ceefed/image.png" alt=""></p>
</li>
<li><p>그럼 또 policy 이름 만들고  (SELECT, INSERT, UPDATE, DELETE)기능 설정  , 누가 또 접근 할 수 있는지, 아래처럼 해주고 review 클릭 하셈 그러고 save policy 까지<br><img src="https://velog.velcdn.com/images/ppin_ppin_i/post/d2177712-97ff-452e-adc4-fe531f3c0953/image.png" alt=""></p>
</li>
<li><p>이 화면 나오면 일단 스토리지 기본 설정 끝</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/ppin_ppin_i/post/21bdd387-b2a2-4406-b4c5-fdf2b8b39e8f/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Supabase 프로젝트 생성시 
필수 설정 요소 ]]></title>
            <link>https://velog.io/@ppin_ppin_i/Supabase-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@ppin_ppin_i/Supabase-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1</guid>
            <pubDate>Tue, 22 Oct 2024 07:36:13 GMT</pubDate>
            <description><![CDATA[<h2 id="환경-변수-설정">환경 변수 설정</h2>
<ol>
<li>.env 파일 생성 후</li>
<li>프로젝트 환경 설정에 나와있음 </li>
<li>DB_PASSWORD 는 프로젝트 생성 할 때 만든 그 패스워드임 절대 공개 하면 안됌 ,SERVICE_ROL도 마찬가지<pre><code>NEXT_PUBLIC_SUPABASE_URL=프로젝트 url
NEXT_PUBLIC_SUPABASE_ANON_KEY=
NEXT_SUPABASE_SERVICE_ROLE=
NEXT_SUPABASE_DB_PASSWORD=</code></pre>알맞은 값 입력 </li>
</ol>
<h2 id="types_dbts-생성">types_db.ts 생성</h2>
<pre><code>&quot;scripts&quot;: {
  &quot;generate-types&quot;: &quot;npx supabase gen types typescript --project-id [project_id] --schema public &gt; types_db.ts&quot;
}</code></pre><p>package.json 파일에 명령어 설치</p>
<p> Supabase 프로젝트의 데이터베이스 스키마를 기반으로 TypeScript 타입 파일을 자동으로 생성하고, 그 결과를 types_db.ts 파일에 저장하는 역할을 함
 그리고</p>
<pre><code> npm run generate-types </code></pre><p>실행 시켜주면 types.db 를 생성 됌 </p>
<h2 id="연동">연동</h2>
<pre><code>npx supabase login</code></pre><p>이거 입력해주면 supabse 프로젝트랑  로컬이랑 연동 끝임 
types.db 파일 보면 내용이 채워져있음</p>
<h2 id="ssr-프로젝트로-하고싶으면">SSR 프로젝트로 하고싶으면?</h2>
<pre><code>npm install @supabase/ssr @supabase/supabase-js</code></pre><h2 id="클라이언트서버-미들웨어-설정">클라이언트,서버, 미들웨어 설정</h2>
<p><strong>client.ts</strong></p>
<ul>
<li><strong>목적</strong>: 브라우저 환경에서 Supabase 클라이언트를 생성하기 위한 함수</li>
<li><strong>주요 기능</strong>:
createBrowserSupabaseClient(): 브라우저에서 사용할 Supabase 클라이언트를 생성함. Supabase의 URL과 익명 키를 환경 변수에서 읽어옴.<pre><code>&quot;use client&quot;;
</code></pre></li>
</ul>
<p>import { createBrowserClient } from &quot;@supabase/ssr&quot;;</p>
<p>export const createBrowserSupabaseClient = () =&gt;
  createBrowserClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
  );</p>
<pre><code>**server.ts**
- **목적**: 서버 환경에서 Supabase 클라이언트를 생성하기 위한 함수들
- **주요 기능**:
    - createServerSupabaseClient(): 서버에서 사용할 Supabase 클라이언트를 생성합니다. 환경 변수에서 Supabase의 URL과, 주어진 권한에 따라 비공식 또는 관리 권한 키를 사용함. 쿠키 관리 기능도 포함되어 있음.
    - createServerSupabaseAdminClient(): 관리 권한을 가진 Supabase 클라이언트를 생성함. 서버 측에서만 호출되며, admin 플래그를 true로 설정하여 관리 키를 사용함

```&quot;use server&quot;;

import { createServerClient, type CookieOptions } from &quot;@supabase/ssr&quot;;
import { cookies } from &quot;next/headers&quot;;
import { Database } from &quot;types_db&quot;;

export const createServerSupabaseClient = async (cookieStore: ReturnType&lt;typeof cookies&gt; = cookies(), admin: boolean = false) =&gt; {
    return createServerClient&lt;Database&gt;(process.env.NEXT_PUBLIC_SUPABASE_URL!, admin ? process.env.NEXT_SUPABASE_SERVICE_ROLE! : process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, {
        cookies: {
            get(name: string) {
                return cookieStore.get(name)?.value;
            },
            set(name: string, value: string, options: CookieOptions) {
                try {
                    cookieStore.set({ name, value, ...options });
                } catch (error) {
                    // The `set` method was called from a Server Component.
                    // This can be ignored if you have middleware refreshing
                    // user sessions.
                }
            },
            remove(name: string, options: CookieOptions) {
                try {
                    cookieStore.set({ name, value: &quot;&quot;, ...options });
                } catch (error) {
                    // The `delete` method was called from a Server Component.
                    // This can be ignored if you have middleware refreshing
                    // user sessions.
                }
            },
        },
    });
};

export const createServerSupabaseAdminClient = async (cookieStore: ReturnType&lt;typeof cookies&gt; = cookies()) =&gt; {
    return createServerSupabaseClient(cookieStore, true);
};
</code></pre><p><strong>middleware.ts</strong></p>
<ul>
<li><strong>목적</strong>: Next.js 애플리케이션에서 요청 및 응답을 처리하고 Supabase 클라이언트를 적용하기 위한 미들웨어</li>
<li><strong>주요 기능</strong>:<ul>
<li>applyMiddlewareSupabaseClient(): 요청을 처리하며 Supabase 클라이언트를 생성하고, 쿠키를 관리합니다. 요청과 응답에 Supabase 클라이언트를 통합하고 인증 토큰을 갱신함.</li>
<li>middleware(): applyMiddlewareSupabaseClient()를 호출하여 미들웨어를 구현함. 특정 요청 경로에 대해 미들웨어가 동작하도록 설정함.</li>
</ul>
</li>
</ul>
<pre><code class="language-import">import { type NextRequest, NextResponse } from &quot;next/server&quot;;

export const applyMiddlewareSupabaseClient = async (request: NextRequest) =&gt; {
  // Create an unmodified response
  let response = NextResponse.next({
    request: {
      headers: request.headers,
    },
  });

  const supabase = createServerClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
    {
      cookies: {
        get(name: string) {
          return request.cookies.get(name)?.value;
        },
        set(name: string, value: string, options: CookieOptions) {
          // If the cookie is updated, update the cookies for the request and response
          request.cookies.set({
            name,
            value,
            ...options,
          });
          response = NextResponse.next({
            request: {
              headers: request.headers,
            },
          });
          response.cookies.set({
            name,
            value,
            ...options,
          });
        },
        remove(name: string, options: CookieOptions) {
          // If the cookie is removed, update the cookies for the request and response
          request.cookies.set({
            name,
            value: &quot;&quot;,
            ...options,
          });
          response = NextResponse.next({
            request: {
              headers: request.headers,
            },
          });
          response.cookies.set({
            name,
            value: &quot;&quot;,
            ...options,
          });
        },
      },
    }
  );

  // refreshing the auth token
  await supabase.auth.getUser();

  return response;
};

export async function middleware(request) {
  return await applyMiddlewareSupabaseClient(request);
}

export const config = {
  matcher: [
    /*
     * Match all request paths except for the ones starting with:
     * - _next/static (static files)
     * - _next/image (image optimization files)
     * - favicon.ico (favicon file)
     * Feel free to modify this pattern to include more paths.
     */
    &quot;/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)&quot;,
  ],
};</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[material-tailwind 설치]]></title>
            <link>https://velog.io/@ppin_ppin_i/material-tailwind-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@ppin_ppin_i/material-tailwind-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Tue, 22 Oct 2024 05:53:22 GMT</pubDate>
            <description><![CDATA[<h2 id="필수-라이브-러리-설치">필수 라이브 러리 설치</h2>
<pre><code>npm install @emotion/react @emotion/styled @material-tailwind/react @mui/icons-material --save
npm install @tailwindcss/typography autoprefixer --save-dev</code></pre><h2 id="provider-컴포넌트-생성">provider 컴포넌트 생성</h2>
<p>config 폴더 생성 후 provider 컴포넌트 생성</p>
<pre><code>&#39;use client&#39;
export { ThemeProvider } from &quot;@material-tailwind/react&quot;;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[tailwind/typography]]></title>
            <link>https://velog.io/@ppin_ppin_i/tailwindtypography</link>
            <guid>https://velog.io/@ppin_ppin_i/tailwindtypography</guid>
            <pubDate>Tue, 22 Oct 2024 05:52:09 GMT</pubDate>
            <description><![CDATA[<p>기존 tailwind 을 사용할 때 h1,span 등 html 에서 제공하는 태그의 기본 스타일링이 적용되지 않는다 .</p>
<p>그러한 점을 막기 위해</p>
<pre><code>npm i tailwind/typography</code></pre><p>사용하면 됌</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[서버 컴포넌트 vs 클라이언트 컴포넌트]]></title>
            <link>https://velog.io/@ppin_ppin_i/%EC%84%9C%EB%B2%84-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-vs-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8</link>
            <guid>https://velog.io/@ppin_ppin_i/%EC%84%9C%EB%B2%84-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-vs-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8</guid>
            <pubDate>Wed, 09 Oct 2024 06:40:34 GMT</pubDate>
            <description><![CDATA[<h2 id="서버-컴포넌트-특징">서버 컴포넌트 특징</h2>
<ul>
<li>오직 <strong>서버</strong>에서만 렌더링 되는 컴포넌트이다</li>
<li>기본적으로, 모든 React 컴포넌트(Next.js 앱에서)는 ReactServerComponents 이다.</li>
<li>클라이언트 코드가 거의 없어 성능 최적화의 적합하다.</li>
</ul>
<h2 id="클라이언트-컴포넌트-특징">클라이언트 컴포넌트 특징</h2>
<ul>
<li>서버에서 사전 렌더링되지만, &#39;use client&#39; 지시어를 통해 선택적으로 클라이언트에서도 렌더링될 수 있는 컴포넌트</li>
<li>클라이언트 측 상호작용 가능성은 React 컴포넌트가 서버에서 렌더링된 후에도 클라이언트에서 사용자와의 상호작용(이벤트 처리, 상태 변경 등)을 할 수 있게 해주는 기능을 의미한다.</li>
</ul>
<p><em>Next에서 useState,useEffetct, 이벤트 핸들링 처리를 하고 싶으면 사용하는 파일 위에 &#39;use client&#39;를 선언해주면 해당 컴포넌트는 클라이언트 컴포넌트가 됌</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[NextJS - App Router]]></title>
            <link>https://velog.io/@ppin_ppin_i/NextJS-App-Router</link>
            <guid>https://velog.io/@ppin_ppin_i/NextJS-App-Router</guid>
            <pubDate>Tue, 08 Oct 2024 08:14:49 GMT</pubDate>
            <description><![CDATA[<h2 id="파일기반-라우팅과-서버-컴포넌트의-이해">파일기반 라우팅과 서버 컴포넌트의 이해</h2>
<ul>
<li>app 폴더 안에있는 page.js 파일은 서버 컴포넌트임  </li>
<li>node 실행 환경에서는 콘솔을 찍으면 보이는데 개발자도구를 키면 콘솔이 안찍힘</li>
<li>겉보기엔 일반적인 컴포넌트지만 Next에서 특별 대우 받는 것..</li>
</ul>
<h2 id="파일-시스템을-통한-추가-경로-설정">파일 시스템을 통한 추가 경로 설정</h2>
<p>리액트에선 리액트 라우터가 필요했지만 next는 폴더만 추가해주면 됌 </p>
<ol>
<li>app 폴더안의 만들고싶은 페이지의 폴더를 만들어준다 ( 이때 폴더명이 경로임 )</li>
<li>생성한 폴더 안의 page.js 파일을 생성해준다 </li>
</ol>
<h2 id="보호된-파일명">보호된 파일명</h2>
<p>이 파일명들은  app/폴더(부 폴더 포함) 내부에서 생성될 때만 보호된다.  app/폴더 외부에서 생성될 경우 이 파일명들을 특별한 방식으로 처리하지 않음.음. </p>
<ul>
<li>page.js =&gt; 신규 페이지 생성 (예: app/about/page.js은 <your-domain>/about page을 생성) </li>
</ul>
<ul>
<li><p>layout.js =&gt; 형제 및 중첩 페이지를 감싸는 신규 레이아웃 생성</p>
</li>
<li><p>not-found.js =&gt; ‘Not Found’ 오류에 대한 폴백 페이지(형제 또는 중첩 페이지 또는 레이아웃에서 전달된)</p>
</li>
<li><p>error.js =&gt; 기타 오류에 대한 폴백 페이지(형제 또는 중첩 페이지 또는 레이아웃에서 전달된)</p>
</li>
<li><p>loading.js =&gt; 형제 또는 중첩 페이지(또는 레이아웃)가 데이터를 가져오는 동안 표시되는 폴백 페이지</p>
</li>
<li><p>route.js =&gt; API 경로 생성(즉, JSX 코드가 아닌 데이터를 반환하는 페이지, 예: JSON 형식)</p>
</li>
</ul>
<h2 id="동적-경로-설정">동적 경로 설정</h2>
<h2 id="이미지-파일-불러오기">이미지 파일 불러오기</h2>
<ol>
<li>.src</li>
<li>Image 컴포넌트 사용하기</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[NEXT.JS 시작]]></title>
            <link>https://velog.io/@ppin_ppin_i/NEXT.JS-%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@ppin_ppin_i/NEXT.JS-%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Mon, 07 Oct 2024 16:10:55 GMT</pubDate>
            <description><![CDATA[<h2 id="nextjs란-무엇이며왜-사용하는-걸까">NEXTJS란 무엇이며,왜 사용하는 걸까?</h2>
<p>리액트 프레임워크 이다</p>
<p>왜 필요함?
리액트 있는데?
next는 react를 풀스택으로 빌드하는데 쉽게 해줌 </p>
<p>서버에어서 컴포넌트를 렌더링 할 수 있게 함</p>
<p>리액트로 풀스택ㅇ르로 만든다음 간소화 시킴 </p>
<h2 id="next-주요-기능-및-장점">NEXT 주요 기능 및 장점</h2>
<p>장점 </p>
<ol>
<li>풀스택 앱을 구축할 수 있다</li>
<li>파일 시스템을 사용하여 경로를 설정 할 수 있음 (라우터 필요 없음)</li>
<li>페이지에 보이는 모든 내용을 렌더링함 </li>
</ol>
<h2 id="next-앱-만들어보기">NEXT 앱 만들어보기</h2>
<p>1.<code>npx create-next-app@latest</code></p>
<h2 id="app-라우터-vs-page-라우터">App 라우터 vs Page 라우터</h2>
<p>page 라우터</p>
<ul>
<li>구방식</li>
<li>아주 안정적임 </li>
</ul>
<p>app router</p>
<ul>
<li>비교적 새로운 방식 </li>
<li>부분적으로 버그 남음</li>
<li>서버컴포넌트, 서버액션을  기능을 사용 할 수 있음 </li>
<li>공식문서에서 추천 함 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[소프트웨어 공학  이론과 실제 1장]]></title>
            <link>https://velog.io/@ppin_ppin_i/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-%EC%9D%B4%EB%A1%A0%EA%B3%BC-%EC%8B%A4%EC%A0%9C-1%EC%9E%A5</link>
            <guid>https://velog.io/@ppin_ppin_i/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-%EC%9D%B4%EB%A1%A0%EA%B3%BC-%EC%8B%A4%EC%A0%9C-1%EC%9E%A5</guid>
            <pubDate>Sun, 15 Oct 2023 10:55:12 GMT</pubDate>
            <description><![CDATA[<h2 id="2소프트웨어-위기">2.소프트웨어 위기</h2>
<h3 id="소프트웨어-위기의-원인과-증상">소프트웨어 위기의 원인과 증상</h3>
<pre><code>  • 소프트웨어 규모의 대형화 및 복잡화에 따른 개발 비용 증대
 • 하드웨어 기술의 급진전으로 인한 소프트웨어 개발 기술의 상대적 부진
 • 하드웨어 비용 대비 소프트웨어 가격 상승 폭 증가
 • 소프트웨어 유지보수의 어려움과 개발 정체 현상 발생
 • 소프트웨어 개발 프로젝트 기간 및 소요 예산에 대한 정확한 예측의 어려움
 • 신기술에 대한 교육 및 훈련의 부족
 • 사용자의 소프트웨어에 대한 기대치 증가
 • 소프트웨어에 대한 사죵자 요구사항의 빈번한 변경 및 반영 </code></pre><h4 id="➡️-이러한-원인들로-인한-결과">➡️ 이러한 원인들로 인한 결과</h4>
<pre><code> 1) 예산초과
 2) 일정 지연
 3) 낮은 품질의 소프트웨어 개발
 4) 비효율적인 소프트웨어 개발
 5) 사용자 요구사항 불만족, 산출물 관리의 어려움</code></pre><h3 id="소프트웨어-개발이-어려운-이유">소프트웨어 개발이 어려운 이유</h3>
<p><strong>• 의사소통의 문제</strong></p>
<p><strong>•시스템의 순차 특성</strong>
 2차원 평면에 프로그램 실행 명렁어 -&gt; 동작은 3차원 공간
--&gt; 프로그래머들은 3차원적 오류를 2차원 평면에서 정리해야됌</p>
<p>•<strong>개발에 의한 결과물</strong></p>
<p><strong>•프로젝트의 복잡한 특성</strong></p>
<p>1) 프로젝트마다 개발기간이 다르다
2) 동일한 기능의 SW도 어떤 기술을 적용하느냐의 따라 개발 과정이 달라짐
3) 프로젝트 인원 수에 따라 운영방식이 달라져야 함
4) 목적에 따라 프로젝트 관리 방식이 달라져야 함
<strong>•개발자의 특성</strong></p>
<p><strong>•다양한 관리 이슈</strong>
 대부분 팀 활동 , 품질 좋은 SW 를 개발해야하는 공통의 &#39;목표&#39; 와 &#39;정렬&#39; 되어야 함</p>
<h3 id="소프트웨어-특성-정보">소프트웨어 특성 정보</h3>
<h4 id="소프트웨어-개발-비용">소프트웨어 개발 비용</h4>
<p>분석 및 설계 : 30% , 코드 개발 : 20% , 테스트 : 40 %
➡️ 분석 및 설계 과정이 코드 개발보다 더 중요하고 비중 있게 수행되어야 함을 의미</p>
<h4 id="소프트웨어-개발-및-유지보수">소프트웨어 개발 및 유지보수</h4>
<p>개발 비용: 33% , 운영 유지 비율 : 67%
➡️ SW 수정 및 개선   &gt; 개발 </p>
<h4 id="소프트웨어-개발-시-오류의-근원">소프트웨어 개발 시 오류의 근원</h4>
<p>기능의 잘못된 이해:15%, 문서화 및 기타 오류 : 35%, 코드 작성의 오류: 30% , 로직 설계의 오류: 20%</p>
<h4 id="소프트웨어-고장-그래프">소프트웨어 고장 그래프</h4>
<h4 id="인공지능-시대의-소프트웨어-위기">인공지능 시대의 소프트웨어 위기</h4>
<p>•4차 산업혁명의 특징</p>
<pre><code>초연결 : 사람, 사물 등 객체 간의 상호 연결성이 확장됨 
       ➡️ 실시간 데이터 공유가 양•질 적으로 크게 확대

초융합 : 초연결 환경의 조성으로 이종 기술•산업 간의 결합이 촉진되어 새로운 융합 산업 출현을 의미함

초지능 : 서비스 활동의 질적인 향상,즉 최적 의사결정을 통해 문제 해결등의 영역에서 더 나은 서비스를 제공하는 
        지적 영량을 의미한다</code></pre><h2 id="3소프트웨어-공학-기술의-적용">3.소프트웨어 공학 기술의 적용</h2>
<h3 id="소프트웨어-공학적-기법의-종류">소프트웨어 공학적 기법의 종류</h3>
<p>•구조적 프로그래밍
➡️C,포트란,코볼 과같은 언어, 프로그램을 좀 더 이해하기 쉽고 논리를 체계적으로 표현 할 수 있는 공학적 접근 방법</p>
<p>•객제치향 프로그래밍
➡️클래스 개념을 기반으로 캡슐화 및 정보 은닉,상속,다형성 등의 개념 제공, SW를 직관적으로 이해하고 유지보수 및 재사용을 쉽게 할 수 있도록 지원</p>
<p>•소프트웨어 컴포넌트 및 재사용
➡️기존 코드 묶음을 컴포넌트로 명세, 컴포넌트를 재사용하면 개발 시간 단축, 컴포넌트를 조립하여 대규모 SW 개발 가능</p>
<p>•통합 개발 환경
➡️ 소스 코드 작성, 컴파일 및 디버깅, 크로스 컴파일, 배포 등 개발 작업을 하나의 프로그램 안에서 처리하도록 지원</p>
<p>•소프트웨어 프로토 타이핑
➡️최종 SW를 완료 되기전까지 눈에 보이지 않은 SW를 사전에 보여줌으로써, 사용자의 요구사항을 반영하고 확정하기 위함</p>
<p>•소프트웨어 개발 프로세스
➡️     전통적 개발 절차 ( 폭포수 모델 ) : 요구사항 -&gt; 분석 -&gt; 설계 -&gt; 코딩 -&gt; 테스트 -&gt;배포
현재는  점진적 , 프로토타입, 나선형 , V모델, 애자일 , DevOps 등 새로운 방식이 나타남</p>
<p>•소프트웨어 검사 및 검증
요구사항에 잘못 된 이해,설계 과정의 부적절성, 코딩 오류등으로 인해 검사 및 검증 활동의 강조
➡️대표적인 기법인 &#39;SW 테스트&#39; --&gt; 소프트웨어가 정확하게 동작하는지, 잠재된 결함을 최대한 찾아내어 고장 발생 가능성을 줄여줌</p>
<p>•소프트웨어 형상 관리
변경 발생은 불가피 , &#39;어떻게 처리하고 관리 할 것인가?&#39; 가 관건 --&gt; 변경이 발생한 것을 기록 및 관리(형상관리)
➡️체계적으로 추적하고 통제하는 활동, 개발 결과물에 대한 버전 관리 뿐만아니라, 형상 항목이라는 형태로 작업 산출물을 정의 및 항목 간의 변경 사항 추적과 통제 정핵을 수립하여 관리하는 활동</p>
<p>•소프트웨어 아키텍처
복잡한하고 대형화 된 SW 는 개발기간이 김, 수명도 길어짐, 점점 로직이 복잡해짐 
➡️설계 구조에서 변화를 체계적으로 쉽게 반영할 수 있도록 하게 함</p>
<h3 id="소프트웨어-공학의-정의와-원리">소프트웨어 공학의 정의와 원리</h3>
<h4 id="소프트웨어-공학의-원리">소프트웨어 공학의 원리</h4>
<p>•엄격성과 정형성
➡️지나친 자유스러움을 제안하기 위한 보완적 수단
•관심사의 분할
➡️개발 시 처리 로직과 데이터 관리를 별도로 고려하는 것
•모듈화
➡️독립적인 기능을 수행하는, 작은 단위의 구별되는 프로그램 조각 , 모듈화를 적용함으로써, SW를 쉽게 분리 ,조립 가능 --&gt; SW 에대한 이해도가 높아짐
•추상화
➡️세부적인 사항들을 감추고 대상물의 특징으로 사물을 대표하는 것
•변경의 예측
➡️개발 과정에서의 변경을 잘 예측해 잘 대응하는 것 (ex: 모듈화 구조를 통한 분리)
•일반화
➡️다양한 플랫폼에서 SW가 동작 할 수 있도록 하는 것 
•점진성
➡️단계적, 순차적으로 개발
•명세화
➡️개발과정에서 생성되는 정보를 쳬계적으로 기술하는 것(ex:유지보수 활동)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[코코아톡 CSS 정리(1)]]></title>
            <link>https://velog.io/@ppin_ppin_i/%EC%BD%94%EC%BD%94%EC%95%84%ED%86%A1-CSS-%EC%A0%95%EB%A6%AC1</link>
            <guid>https://velog.io/@ppin_ppin_i/%EC%BD%94%EC%BD%94%EC%95%84%ED%86%A1-CSS-%EC%A0%95%EB%A6%AC1</guid>
            <pubDate>Mon, 26 Jun 2023 07:32:22 GMT</pubDate>
            <description><![CDATA[<p>block 은 옆에 아무것도 올 수 없다.
Inline 같은 줄에 위치 할 수 있다 (In the same line) ex) span,a,link</p>
<p>block 이 아닌 것들을 외워주는 것이 좋음</p>
<p>inline 은 높이와 넓이를 가질 수 없음</p>
<p>margin 은 box의 border(경계)의 &#39;바깥&#39;에 있는 공간
방향 설정 없이 margin 하나를 주면 사방에 전부 다 적용된다.
두 개를 줄 경우 상하, 좌우 이다.
네 개를 줄 경우 시계방향 순으로 적용된다. (상 우 하 좌)</p>
<p> padding은 box의 border(경계)로부터 &#39;안쪽&#39;에 있는 공간 </p>
<ul>
<li>span은 inline이기 때문에 높이와 너비를 가질 수 없으며, 그래서 위, 아래에 margin을 가질 수 없다.<ul>
<li>하지만 padding은 사방에 가질 수 있다.</li>
<li>이와 같은 상황에 margin을 위, 아래에 적용하고 싶다면, inline 요소를 block으로 바꿔줘야 한다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[코코아톡 HTML 정리]]></title>
            <link>https://velog.io/@ppin_ppin_i/%EC%BD%94%EC%BD%94%EC%95%84%ED%86%A1-HTML-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@ppin_ppin_i/%EC%BD%94%EC%BD%94%EC%95%84%ED%86%A1-HTML-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Mon, 26 Jun 2023 05:54:40 GMT</pubDate>
            <description><![CDATA[<h1 id="form-형식-작성하기">form 형식 작성하기</h1>
<pre><code>&lt;form action=&quot;&quot;&gt;
    &lt;label for=&quot;profile&quot;&gt;Profile Photo&lt;/label&gt;
    &lt;input id=&quot;profile&quot;type=&quot;file&quot; accept=&quot;.pdf,png&quot;&gt;
    &lt;label for=&quot;first-name&quot;&gt;Frist Name&lt;/label&gt;
    &lt;input id=&quot;first-name&quot;required placeholder=&quot;Name&quot; type=&quot;text&quot;&gt;
    &lt;input required placeholder=&quot;Last Name&quot; type=&quot;text&quot;&gt;
    &lt;input required placeholder=&quot;Username&quot; minlength=&quot;10&quot; type=&quot;text&quot;&gt;
    &lt;input required placeholder=&quot;name&quot; type=&quot;password&quot;&gt;
    &lt;input type=&quot;submit&quot; value=&quot;Create Account&quot;&gt;
&lt;/form&gt;</code></pre><p>   lable 과 input 태그의 id 값이 일치하면 label 을 클릭시 input태그 기능을 사용 할 수 있다. </p>
<p>   id 는 어떤 태그에든 넣을 수 있는 attrtbute 이다. --&gt; unique indentify(고유식볇자) 이기 때문, element 하나의 한개의 id 만 가질수 있다.</p>
<h1 id="semantic-tag">Semantic Tag</h1>
<p>-semantic : 문서를 보기만해도 그 의미를 짐작할 수 있는 것이다.</p>
<p>head 태그와 header태그를 구분 할 것, head는 보이지 않는 것이고, header는 body태그안에 들어가는 것이다.</p>
<p>header 대신 div를 사용해도 무관하지만, 어떤 코드인지 보다 더 쉽게 이해하기 위함. </p>
<pre><code>예시
 &lt;body&gt;
&lt;header&gt;
    &lt;h1&gt;header!&lt;/h1&gt;
&lt;/header&gt;
&lt;main&gt;
    &lt;p&gt;main!&lt;/p&gt;--&gt; 문단 텍스트 쓸 때 적합
    &lt;span&gt;hello!&lt;/span&gt; --&gt; 짧은 텍스트의 적합
&lt;/main&gt;
&lt;footer&gt;footer!&lt;/footer&gt;
&lt;/body&gt;</code></pre><ul>
<li>코드 자체에 의미가 부여된 semantic 태그를 잊지 말자.ex) header, navigation, footer...</li>
<li>semantic 태그로 코드를 작성 하는 것은 매우 중요하다. 작성된 코드들이 훨씬 더 보기 좋고, 좋은
프로그래머가 되기 위해서는 필수 사항이다.</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>