회고

3일차 회고

Break-Limits 2023. 9. 27. 23:22

 

 

인턴 기간중 3일차 회고.

 

일자 : 2023.09.27 (수)

 

 

 

 -  오늘은 Nuxt.js 코드 실습을 계속해서 진행함.

 -  백엔드 학습사항을 전달받음.

 -  Nest.js  / typeORM / Bun  + TypeScript

 -  사내 CP 구축
 -  요구사항 던져주고 조언만....

 

 

배운 것 ( Today I learned )

 - 작성한 Markdown을 첨부함. [추후에]

https://github.com/kimYHgit/nuxt-practice

 

GitHub - kimYHgit/nuxt-practice

Contribute to kimYHgit/nuxt-practice development by creating an account on GitHub.

github.com

 

useFetch API를 이용한 데이터 가져오기


 

https://nuxt.com/docs/getting-started/data-fetching#usefetch
https://nuxt.com/docs/api/composables/use-fetch#usefetch

 


Nuxt에는 브라우저 또는 서버 환경에서 데이터 불러오기를 수행할 수 있는 두 가지 컴포저블과 내장 라이브러리인 useFetch, useAsyncData 및 $fetch가 포함되어 있다.

 


상품 목록을 구성할 데이터를 받아오는 API 서버는 다음을 활용한다.

https://fakestoreapi.com/

 

Fake Store API

Fake store rest api for your ecommerce or shopping website prototype

fakestoreapi.com

 

전체 상품의 정보를 나타내기

 

 

pages/products/index.vue

 

<template>
  <div>
    <div class="grid grid-cols-4 gap-5">
      <div v-for="p in products">
        <NuxtLink :to="`/products/${p.id}`">{{ p.title }}</NuxtLink>
      </div>
    </div>
  </div>
</template>

<script setup>
definePageMeta({
  layout: "products",
});

//fetch products data.
const { data: products } = await useFetch("https://fakestoreapi.com/products");
</script>

<style scoped></style>

 

 

 

특정 상품의 세부정보 페이지 만들기

 

- useFetch 함수를 활용해 특정 상품id에 대한 세부 정보 페이지를 구현
- useFetch 함수 옵션 객체에 key 속성을 부여해서 id값이 변할때마다 data Fetching 할수 있도록 함.

 

 

[id].vue

 

<template>
  <div>
    <p>{{ product.title }}</p>
    <p>{{ product.price }}</p>
    <p>{{ product.id }}</p>
  </div>
</template>

<script setup>
const { id } = useRoute().params;
const url = "https://fakestoreapi.com/products/" + id;

//fetch the product
const { data: product } = await useFetch(url, { key: id });
definePageMeta({
  layout: "products",
});
</script>

<style scoped></style>

 

사용자 정의 컴포넌트


 

- 루트 폴더에 components 폴더를 이용해서 사용자 정의 컴포넌트를 관리하고 컴포넌트를 재사용할수있다.
- import 구문없이 컴포넌트를 자동으로 인식함.

 

 

전체 상품 페이지 수정

 


- 디렉티브(v-for, :product)와 클래스(class)를 활용하여 제품 목록을 그리드 형식으로 표시함.
- Vue 컴포넌트 템플릿 코드를 다음과 같이 작성한다.

 

 

index.vue
<template>
  <div>
    <div class="grid grid-cols-4 gap-5">
      <div v-for="p in products">
        <ProductCard :product="p" />
      </div>
    </div>
  </div>
</template>

 

1. `<div class="grid grid-cols-4 gap-5">`

- `grid` 클래스는 그리드 레이아웃을 정의
- `grid-cols-4` 클래스는 열의 수를 4로 지정.
- `gap-5` 클래스는 그리드 요소 사이의 간격

2. `<div v-for="p in products">`:

- `v-for` 디렉티브를 사용하여 반복 작업을 수행
- `products` 데이터 속성을 기반으로 반복 작업을 수행하며, 각 반복마다 변수 `p`에 할당.

3. `<ProductCard :product="p" />`

- 커스텀 컴포넌트인 `ProductCard`를 렌더링.
- `:product="p"` 부분은 `ProductCard` 컴포넌트에 `product`라는 속성을 전달

 

 

 

components/ProductCard.vue
 
컴포넌트 내에서 동적으로 바인딩된 제품 이미지와 제목을 표시하고, 
"View Detail" 버튼을 클릭하면 해당 제품의 상세 정보 페이지로 이동

 

<template>
  <div class="card text-center">
    <img :src="product.image" alt="product thumb" class="thumb" />
    <p class="font-bold text-garay-500 m-4 truncate">{{ product.title }}</p>
    <NuxtLink :to="`/products/${product.id}`">
      <p class="btn my-4">View Detail</p>
    </NuxtLink>
  </div>
</template>

<script setup>
const { product } = defineProps(["product"]);
</script>

<style scoped>
.thumb {
  max-height: 120px;
  max-width: 70%;
  margin: 0 auto;
}
</style>

 

 

- Composition API를 사용
- 컴포넌트의 템플릿 부분과 `<script setup>` 영역

 

템플릿 부분 코드설명


1. `<div class="card text-center">`

- 제품 카드의 루트 엘리먼트로 사용되는 `<div>` 요소

- `card`와 `text-center` 클래스가 적용. 제품 카드 가운데 정렬.

2. `<img :src="product.image" alt="product thumb" class="thumb" />`

- 제품의 이미지
- `:src` 디렉티브를 사용하여 이미지의 `src` 속성을 `product.image` 값으로 동적으로 바인딩.
- 이미지의 대체 텍스트는 "product thumb"로 설정되며, `thumb` 클래스가 적용

3. `<p class="font-bold text-garay-500 m-4 truncate">{{ product.title }}</p>`

- 제품의 제목을 나타내는 `<p>` 요소.
- `font-bold`, `text-garay-500`, `m-4`, 그리고 `truncate` 클래스가 사용
- `{{ product.title }}` 템플릿 보간

4. `<NuxtLink :to="`/products/${product.id}`">`

- `NuxtLink` 컴포넌트를 사용하여 링크를 생성
- `:to` 디렉티브를 사용하여 동적으로 `product.id`를 기반으로 URL을 생성.

5. `<p class="btn my-4">View Detail</p>`

 

- `btn` 클래스가 버튼 스타일을 정의
- `my-4` 클래스가 위아래 여백을 설정.

 

 

 

script setup 부분 코드설명

 

- Composition API
- 컴포넌트의 데이터와 프로퍼티를 설정.

1. `const { product } = defineProps(["product"]);`

- 부모 컴포넌트로부터 `product` 프로퍼티를 전달받아 컴포넌트 내부에서 사용할 수 있도록 설정

 

 

 

css/tailwind.css
@layer components {
  .btn {
    @apply bg-[#12b488] text-white px-3 py-2 rounded-md text-sm text-white inline-block;
  }
  .card {
    @apply p-3 rounded-md bg-white shadow-md h-full;
  }
}

 

 

상세 페이지 수정

 

- 상세페이지의 화면구성을 사용자 정의 컴포넌트로 대체하여 변경한다.

 

 

components/ProductDetails.vue
<template>
  <div class="card">
    <div class="grid grid-cols-2 gap-10">
      <div class="p-7">
        <img :src="product.image" alt="product img" class="mx-auto my-7" />
      </div>
      <div class="p-7">
        <h2 class="text-4xl my-7">{{ product.title }}</h2>
        <p class="text-xl my-7">Price - ${{ product.price }}</p>
        <h3 class="font-bold border-b-2 mb-4 pb-2">Product Description:</h3>
        <p class="mb-7">{{ product.description }}</p>
      </div>
    </div>
  </div>
</template>

<script setup>
const { product } = defineProps(["product"]);
</>

<style scoped>
img {
  max-width: 400px;
}
</style>

 

template 부분을 수정한다.

 

pages\products\[id].vue
<template>
  <div>
    <ProductDetails :product="product" />
  </div>
</template>

 

참고 - vue 디렉티브

- Nuxt.js에서 Vue.js의 디렉티브들을 사용할 수 있음.
- Vue.js 디렉티브는 HTML 요소에 속성(attribute) 형태로 추가되어 

  해당 요소의 동작을 제어하거나 데이터와 뷰를 바인딩할 때 사용됨.
- 화면에 데이터를 렌더링하고 사용자 상호작용을 처리

1. v-if / v-else-if / v-else
- 조건부 렌더링을 처리할 때 사용
- `v-if`는 주어진 조건이 `true`일 때 해당 요소를 렌더링
- `v-else-if` 및 `v-else`는 이전 조건이 `false`일 때 렌더링될 요소를 정의.

2. v-for
- 배열을 순회하며 여러 번 요소를 렌더링하는 데 사용
- 예를 들어, 반복문을 사용하여 목록을 생성하거나 데이터를 표시.

3. v-bind (단축표현 :)
- `v-bind` 또는 단축 표현 `:`은 요소의 속성과 Vue 인스턴스의 데이터를 연결.
- 예를 들어, `:src` 디렉티브를 사용하여 이미지의 `src` 속성을 동적으로 설정할 수 있음.

4. v-on (단축표현 @)
- `v-on` 또는 단축 표현 `@`은 이벤트 핸들러를 등록하고 HTML 요소의 이벤트를 Vue.js 메서드와 연결
- 클릭, 입력, 마우스 오버 및 기타 이벤트에 대한 핸들러를 정의할 수 있음.

5. v-model
- 양방향 데이터 바인딩을 제공
- 입력 요소의 값과 Vue 데이터 속성을 자동으로 동기화하므로 사용자의 입력을 Vue 데이터에 반영하고 반대로 Vue 데이터를 입력 요소에 반영할 수 있음.

6. v-show
- 요소를 숨기거나 보이게 하는 데 사용.
- `v-if`와 달리 요소는 항상 렌더링되며 CSS `display` 속성을 통해 숨김 또는 표시됨.

7. v-pre
- 해당 요소와 하위 요소에 대한 컴파일을 건너뛰도록 지시.
- 요소와 하위 요소를 Vue 인스턴스 초기화에서 제외하는 데 사용.
- 이는 성능 향상을 위해 사용되며, 요소의 내용은 Vue.js 템플릿 컴파일러에 의해 처리되지 않음.

8. v-cloak
- Vue 인스턴스가 초기화될 때까지 요소를 감추기 위해 사용
- 주로 CSS 스타일링과 함께 사용하여 초기화 시 화면에서 플래시되는 문제를 해결함.

 

 

회고 (restropective)

 

 

 -  Nuxt 3는 웹페이지 클론코딩으로 끝났고 기본적인 기능을 접해볼수 있었다.

 -  백엔드 학습 분량이 갑자기 많아졌다...  공부 열심히 해야겠다.


 

etc...

 

 

너무 피곤해서 시간나면 나머지 부분 채워야겠다...

정처기 실기 언제 준비하지....

 

강의

 https://nomadcoders.co/dashboard

 

typeORM

 - https://typeorm.io/

 - https://fomaios.tistory.com/entry/Nodejs-TypeORM%EC%9D%B4%EB%9E%80-feat-Typescript-ORM-Library

 - https://orkhan.gitbook.io/typeorm/README_ko

 - https://docs.nestjs.com/recipes/sql-typeorm

 - https://www.npmjs.com/package/typeorm

 

타입스크립트

https://product.kyobobook.co.kr/detail/S000208416779

https://www.typescriptlang.org/ko/docs/handbook/intro.html

https://joshua1988.github.io/ts/why-ts.html#%EC%B1%85%EC%9C%BC%EB%A1%9C-%EB%8D%94-%EC%9E%90%EC%84%B8%ED%9E%88-%EB%B0%B0%EC%9A%B8-%EC%88%98-%EC%9E%88%EC%96%B4%EC%9A%94-%F0%9F%8E%81

 

 

 

Nest.js

https://product.kyobobook.co.kr/detail/S000200383301

https://nestjs.com/

https://wikidocs.net/147787

 

 

Bun.js

https://bun.sh/

https://techblog.gccompany.co.kr/%ED%95%9Cbun-%EC%8D%A8%EB%B3%B4%EB%8A%94-%EA%B1%B0-%EC%96%B4%EB%95%8C-fa3cb32ac76f

 

 

 

 

Insight - 소프트웨어 아키텍처 및 패턴

코드를 컨트롤러, 서비스 및 비즈니스 로직으로 나누는 이유는????

 

 - [신입 개발자들이 갖춰야할 능력( 책과 강의 추천 )]  https://youngban.tistory.com/5

 - https://ebook-product.kyobobook.co.kr/dig/epd/ebook/E000005406019

 - https://ebook-product.kyobobook.co.kr/dig/epd/ebook/E000005295801

더보기

코드를 컨트롤러, 서비스 및 비즈니스 로직으로 나누는 이유는 

 - 코드의 구조와 유지 관리성을 향상시키기 위해입니다. 

 - 소프트웨어 품질을 향상시키는 데 도움이 됩니다.   

 - 표준화된 접근 방식을 사용하여 팀 간의 협업을 용이하게 합니다. 개발의 효율성을 높입니다.  

이러한 아키텍처 패턴은 다음과 같은 이점을 제공합니다:

1. 모듈화

 - 각 부분은 특정 역할을 수행하며, 모듈 간의 역할 및 책임이 명확하게 구분됩니다.

 - 이로 인해 코드를 쉽게 이해하고 유지 보수할 수 있습니다.

2. 재사용성

 - 서비스 및 비즈니스 로직 레이어에서 로직을 분리하면 동일한 로직을 여러 컨트롤러에서 재사용할 수 있습니다.

3. 확장성

 - 새로운 기능이나 변경 사항을 추가할 때, 비즈니스 로직 레이어에서 변경을 가하면 다른 부분에 영향을 덜 미칩니다. 이것은 애플리케이션의 확장성을 향상시킵니다.

4. 테스트 용이성

 - 각 계층은 단위 테스트하기에 용이하며, 모의 객체를 사용하여 테스트하기가 편리해집니다.

5. 보안

 - 중요한 비즈니스 로직은 서버 측에 보관되므로 클라이언트에서 직접 액세스하지 못하도록 보안성이 높아집니다.

6. 협업

- 팀원 간 협업이 간소화되며, 각자 독립적으로 작업할 수 있으므로 개발 프로세스가 원활해집니다.

 

소프트웨어 아키텍처와 코드 구조를 설계하는 개념에 익숙하지 않다면, 다음 주제들을 학습하는 것이 도움이 될 것입니다

 

기본 개념을 습득하고 실습을 통해 경험을 쌓는 것이 중요합니다. 

학습 과정을 단계적으로 진행하고 기본을 탄탄히 다지면서 더 복잡한 주제로 나아가면 됩니다.


1. 기본 프로그래밍

 - 먼저 언어(예: Java, Python, C#)에 대한 기본 프로그래밍 지식을 습득하세요.

 - 변수, 조건문, 반복문 등을 이해하고 실습해보세요.

2. 객체 지향 프로그래밍 (OOP)

 - 객체 지향 개념을 이해하고, 클래스, 객체, 상속, 다형성 등의 개념을 학습하세요.

 - 코드를 모듈화하고 재사용성을 높이는 데 도움이 됩니다.

3. 웹 개발 기초

 - 웹 애플리케이션 개발에 대한 기본 이해를 얻으세요.

 - HTML, CSS, JavaScript를 학습하고 웹 서버와 클라이언트의 상호 작용을 이해하세요.

4. MVC 패턴

 - 모델-뷰-컨트롤러 (MVC) 아키텍처 패턴에 대한 이해가 중요합니다.

 - 이 패턴은 코드를 컨트롤러, 모델, 뷰로 구분하는 데 도움이 됩니다.

5. 서버 프로그래밍

 - 서버 측 프로그래밍에 대한 기초를 학습하고, RESTful API 디자인과 HTTP 프로토콜을 이해하세요.

6. 데이터베이스

 - 데이터베이스 기초를 학습하고,

 - SQL 쿼리 언어와 관계형 데이터베이스 관리 시스템(RDBMS)에 대한 이해를 높이세요.

7. 소프트웨어 아키텍처 및 패턴

 - 소프트웨어 아키텍처의 기본 개념과 패턴에 대한 학습을 시작하세요.

 - MVC, MVVM, REST 등의 패턴을 이해하고 어떤 상황에서 사용해야 하는지 파악하세요.

8. 프로젝트 경험

 - 실제 프로젝트에 참여하거나 작은 프로젝트를 개발하여 이론을 실무에 적용해보세요.


9. 온라인 강의 및 자습서

 - 인터넷에 소프트웨어 개발에 관한 다양한 무료 및 유료 학습 리소스가 많이 있으니 이용하세요.
 

 

각 주제에 대한 상세 설명



객체 지향 프로그래밍 (OOP)

 

객체

 - 객체는 현실 세계의 실체를 모델링한 소프트웨어 개체입니다.

 - 예를 들어, 자동차, 고객, 주문과 같은 것들이 객체가 될 수 있습니다.

 

클래스

 - 객체를 생성하기 위한 템플릿 또는 설계도입니다.

 - 객체의 공통된 특성과 동작을 정의합니다.

 - 예를 들어, 자동차 클래스에는 속성(색상, 모델)과 메서드(주행, 정지)가 정의됩니다.


상속

 - 클래스 간의 관계를 나타냅니다.

 - 하위 클래스(파생 클래스)가 상위 클래스(기본 클래스)의 특성을 상속받아 재사용할 수 있게 해줍니다.

 - 코드 재사용성을 높입니다.

 

다형성

 - 같은 이름의 메서드나 연산자를 서로 다른 방식으로 동작하게 하는 개념입니다.

 - 객체가 다양한 상황에서 다르게 작동할 수 있음을 의미합니다.

 

캡슐화

 - 데이터와 해당 데이터를 처리하는 메서드를 하나로 묶는 것을 의미합니다.

 - 데이터에 직접 액세스하는 것을 방지하고 데이터 무결성을 보호할 수 있습니다.

 

MVC 패턴 (모델-뷰-컨트롤러)

 

MVC 패턴은 소프트웨어를 구조화하고 관리하기 위한 패턴으로, 

애플리케이션의 유지보수성을 향상시키고 코드의 재사용성을 높입니다.

 

모델

 - 응용 프로그램의 데이터와 비즈니스 로직을 나타냅니다.

 - 데이터베이스와의 상호 작용을 처리하고, 데이터를 관리하며 비즈니스 로직을 수행합니다.

 

 - 사용자 인터페이스를 나타냅니다.

 - 사용자가 보는 화면을 생성하고 데이터를 표시하는 역할을 합니다.

 - 모델의 변경 사항을 반영하고 사용자 입력을 모델로 전달합니다.

 

컨트롤러

 - 모델과 뷰 간의 중개자 역할을 합니다.

 - 사용자 입력을 받아 모델을 업데이트하거나 모델로부터 데이터를 가져와 뷰에 표시합니다.

 - 응용 프로그램의 흐름을 제어합니다.

 

소프트웨어 아키텍처 및 패턴

아키텍처  

- 시스템의 구조와 구성요소 간의 상호 작용을 설계하는 것을 의미합니다.

 - 시스템의 성능, 확장성 및 유지보수성에 큰 영향을 미칩니다.

 

소프트웨어 패턴

 - 소프트웨어 개발에서 자주 발생하는 문제에 대한 일반적인 해결책입니다.

 - 예를 들어, MVC, MVVM, 싱글톤, 팩토리 메서드 패턴 등이 있으며,

 - 이러한 패턴을 사용하면 일반적인 문제에 대한 검증된 해결책을 활용할 수 있습니다.