🚀 생성형 AI로 웹서비스를 직접 만드는 실전 강의 오픈!

요즘 개발 방식이 정말 빠르게 바뀌고 있습니다.
코드를 처음부터 끝까지 직접 작성하는 시대에서,
이제는 AI와 협업하며 기획–디자인–구현–배포까지 완성하는 시대로 넘어가고 있습니다.

그래서 준비했습니다.

이번 강의에서는 단순한 기능 구현이 아니라,
👉 AI를 활용해 실제 웹서비스 하나를 끝까지 완성하는 경험을 제공합니다.

 

012345
AI 레시피 앱 - 기획,디자인,구현,배포까지


💡 이런 분들께 추천합니다

  • AI를 활용해 웹서비스를 만들어보고 싶은 분
  • React 기반 프로젝트를 한 번 끝까지 완성해보고 싶은 분
  • 기획 → 디자인 → 개발 → 배포 전체 흐름을 경험하고 싶은 분
  • 요즘 개발 트렌드(AI 협업 개발)가 궁금한 분
  • “나만의 서비스”를 만들어보고 싶은 분

🛠 강의에서 배우는 것

이번 강의는 단순 문법 강의가 아닙니다.
실제 서비스 하나를 완성합니다.

✅ 1. 기획 – ChatGPT 활용

AI를 활용해 서비스 아이디어를 구체화합니다.
기능 정의부터 데이터 구조 설계까지 진행합니다.

✅ 2. 디자인 생성 – Stitch & AI Studio

프롬프트 기반으로 UI 디자인을 생성하고,
이를 바탕으로 기본 코드를 빠르게 구성합니다.

✅ 3. 백엔드 & AI 기능 구현 – Supabase & OpenAI

  • Supabase 프로젝트 생성
  • 테이블 설계 및 권한 설정
  • Edge Function으로 AI 레시피 생성 기능 구현
  • OpenAI API 연동
  • 이미지 저장 및 관리

✅ 4. 프론트엔드 개발 – React

  • 회원가입 / 로그인 구현
  • 레시피 생성 기능
  • 마이페이지 (CRUD)
  • 실제 서비스처럼 동작하는 완성도 있는 구조

✅ 5. 배포까지 완성

Vercel을 활용해 실제 서비스로 배포합니다.
링크를 공유할 수 있는 진짜 결과물을 만듭니다.


🎯 이 강의의 가장 큰 차별점

  • 단순 예제가 아니라 실제 서비스 완성
  • AI 도구를 “보조”가 아니라 “협업 파트너”로 활용
  • 최신 개발 트렌드 반영
  • 기획부터 배포까지 한 번에 경험

이 강의를 듣고 나면
“AI로 개발한다”는 말이 추상이 아니라,
직접 해본 경험이 됩니다.


🔗 강의 보러가기

👉 https://inf.run/etRdk

이번 기회에
AI와 함께 만드는 웹개발을 직접 경험해보시기 바랍니다.

이제는
코드를 혼자 작성하는 시대가 아니라,
AI와 함께 더 빠르게 완성하는 시대입니다.
🔥

반응형

『AI 웹개발 실전 프로젝트 (Stitch · Figma Make · React)』 강의 소개

 

요즘은 코드를 직접 한 줄 한 줄 작성하는 시대를 넘어,
AI와 함께 개발하는 시대가 되었습니다.

그런데 막상 시작하려고 하면 이런 생각이 들죠.

  • “AI로 개발한다는 게 정확히 뭐지?”
  • “진짜로 웹사이트를 만들 수 있는 걸까?”
  • “초보자도 따라갈 수 있을까?”

이 강의는 그런 분들을 위해 만들어진 AI 웹개발 실전 입문 강의입니다.

바로 확인해보세요

https://inf.run/hrnsA


🧑‍💻 이 강의는 무엇이 다른가요?

이 강의는 단순히 문법을 배우는 강의가 아닙니다.

👉 아이디어를 실제 서비스로 완성하는 과정을 경험하는 강의입니다.

기획 → 디자인 → 코드 생성 → 배포까지
웹사이트가 만들어지는 전체 흐름을 직접 따라가면서 배울 수 있습니다.

 


✨ 무엇을 배우게 되나요?

1️⃣ AI로 디자인부터 시작하기

보통은 디자인을 따로 배우고, 개발을 따로 배웁니다.
하지만 이 강의에서는 AI 도구를 활용해 디자인을 먼저 만들어봅니다.

  • Stitch로 화면 디자인 생성
  • 원하는 방향으로 수정 요청하기
  • AI에게 잘 말하는 프롬프트 작성 방법 배우기

“어떻게 요청해야 원하는 결과가 나오는지”를 직접 경험합니다.

 

 


2️⃣ 디자인을 코드로 바꾸기

디자인이 완성되면 끝일까요?
아니요 😊 이제 진짜 개발이 시작됩니다.

  • AI Studio를 활용해 코드 생성
  • React 기반 프로젝트 구조 이해
  • 실행 가능한 웹사이트 만들기

눈에 보이는 디자인이 실제 동작하는 서비스로 바뀌는 과정을 경험하게 됩니다.

프롬프트를 통해 디자인 생성하기

 


3️⃣ GitHub와 배포까지

웹사이트를 만들었다면,
이제 친구에게 링크를 보내야겠죠?

  • GitHub에 코드 업로드
  • Vercel을 통한 실제 배포
  • 수정하면 자동으로 업데이트되는 구조 이해

“내가 만든 사이트야!” 하고 보여줄 수 있는 순간을 경험할 수 있습니다.


4️⃣ 두 가지 방식 비교하기

이 강의는 한 가지 방식만 다루지 않습니다.

  • Stitch 중심 개발
  • Figma Make 기반 개발

두 가지를 모두 경험해보고
나에게 맞는 AI 개발 스타일을 찾는 과정까지 포함되어 있습니다.


👀 이런 분들에게 추천해요

✔ 웹개발이 처음이지만 시작해보고 싶은 분
✔ AI를 활용해 빠르게 결과물을 만들고 싶은 분
✔ 포트폴리오용 프로젝트가 필요한 취준생
✔ 기획부터 배포까지 한 번에 경험해보고 싶은 분

특히 “이론 말고, 실제로 만들어보고 싶다”는 분들께 잘 맞는 강의입니다.


💬 초보자도 괜찮을까요?

네, 기본적인 HTML/JavaScript 개념만 알고 있다면 충분히 따라갈 수 있습니다.

어려운 이론보다는
“직접 만들어보는 경험”에 집중되어 있기 때문에
처음 시작하는 분들도 부담 없이 접근할 수 있습니다.


🎯 한 줄 정리

AI를 활용해 웹사이트를 직접 기획하고, 디자인하고, 구현하고, 배포까지 완성해보는 실전 프로젝트 강의입니다.


요즘은 “코드를 얼마나 잘 짜느냐”보다
AI와 얼마나 잘 협업하느냐가 더 중요해지고 있습니다.

이 강의는 그 시작점이 되어줄 수 있는 강의입니다 😊

인프런 영상으로 바로 확인해보세요. https://inf.run/hrnsA

반응형

사용자가 원하는 기준으로 상품을 정렬해서 볼 수 있는 기능은 쇼핑몰의 사용자 경험을 크게 향상시킵니다.

오늘은 정렬(Sort) 기능(상품 가격을 기준으로 내림차순, 오름차순) 구현에 필요한 JavaScript 핵심 문법을 알아보겠습니다.

1. 배열의 sort() 메서드 기본

sort() 메서드는 배열의 요소를 정렬합니다. 기본적으로 문자열 순서로 정렬됩니다.

기본 문법

array.sort((a, b) => {
  // a가 b보다 앞에 오려면 음수 반환
  // a가 b 뒤에 오려면 양수 반환
  // 순서를 바꾸지 않으려면 0 반환
});

주의사항

const numbers = [1, 30, 4, 21, 100000];

// 잘못된 사용 - 문자열로 정렬됨
numbers.sort();
console.log(numbers); // [1, 100000, 21, 30, 4]

// 올바른 사용 - 숫자로 정렬
numbers.sort((a, b) => a - b);
console.log(numbers); // [1, 4, 21, 30, 100000]

2. 숫자 정렬

오름차순 정렬

const prices = [100, 50, 200, 25, 150];

// 가격 낮은 순
const ascending = [...prices].sort((a, b) => a - b);
console.log(ascending); // [25, 50, 100, 150, 200]

내림차순 정렬

// 가격 높은 순
const descending = [...prices].sort((a, b) => b - a);
console.log(descending); // [200, 150, 100, 50, 25]

왜 스프레드 연산자를?

원본 배열을 유지하고, 순서를 변경한 값을 새로운 배열에 할당하기 위해서 사용합니다.

// sort()는 원본 배열을 변경합니다!
const original = [3, 1, 2];
original.sort(); // [1, 2, 3]
console.log(original); // [1, 2, 3] - 원본이 변경됨!

// 원본을 보존하려면 복사본에 정렬
const copy = [...original].sort();

3. 객체 배열 정렬

쇼핑몰 상품 데이터는 대부분 객체 배열입니다.

가격으로 정렬

const products = [
  { id: 1, name: '노트북', price: 1000 },
  { id: 2, name: '마우스', price: 30 },
  { id: 3, name: '키보드', price: 70 },
  { id: 4, name: '모니터', price: 300 }
];

// 가격 낮은 순
const byPriceAsc = [...products].sort((a, b) => a.price - b.price);

// 가격 높은 순
const byPriceDesc = [...products].sort((a, b) => b.price - a.price);

이름으로 정렬

// 이름 가나다순
const byNameAsc = [...products].sort((a, b) => 
  a.name.localeCompare(b.name)
);

// 이름 역순
const byNameDesc = [...products].sort((a, b) => 
  b.name.localeCompare(a.name)
);

4. React에서 정렬 구현하기

import { useState, useEffect } from 'react';

function ProductSort() {
  const [products, setProducts] = useState([]);
  const [sortOption, setSortOption] = useState('default');

  // 상품 데이터 가져오기
  useEffect(() => {
    fetch('https://fakestoreapi.com/products')
      .then(res => res.json())
      .then(data => setProducts(data));
  }, []);

  // 정렬된 상품 계산
  const getSortedProducts = () => {
    const sorted = [...products]; // 원본 보존

    switch (sortOption) {
      case 'price-asc':
        return sorted.sort((a, b) => a.price - b.price);
      
      case 'price-desc':
        return sorted.sort((a, b) => b.price - a.price);
      
      case 'name-asc':
        return sorted.sort((a, b) => a.title.localeCompare(b.title));
      
      case 'name-desc':
        return sorted.sort((a, b) => b.title.localeCompare(a.title));
      
      case 'rating':
        return sorted.sort((a, b) => b.rating.rate - a.rating.rate);
      
      default:
        return sorted; // 기본 순서
    }
  };

  const sortedProducts = getSortedProducts();

  return (
  {sortedProducts.map(product => ( ))}
  );
}

 

5. localeCompare()로 문자열 비교

localeCompare()는 언어 규칙에 맞게 문자열을 비교합니다.

// 한글 정렬
const names = ['홍길동', '김철수', '이영희'];
const sorted = names.sort((a, b) => a.localeCompare(b, 'ko'));
console.log(sorted); // ['김철수', '이영희', '홍길동']

// 영문 정렬 (대소문자 무시)
const products = ['Apple', 'banana', 'Cherry'];
const sorted2 = products.sort((a, b) => 
  a.localeCompare(b, 'en', { sensitivity: 'base' })
);
console.log(sorted2); // ['Apple', 'banana', 'Cherry']

6. 복잡한 정렬 조건

여러 조건으로 정렬

const products = [
  { name: '노트북', category: 'electronics', price: 1000 },
  { name: '마우스', category: 'electronics', price: 30 },
  { name: '셔츠', category: 'clothing', price: 50 },
  { name: '청바지', category: 'clothing', price: 80 }
];

// 카테고리별로 먼저 정렬, 같은 카테고리 내에서는 가격순
const sorted = [...products].sort((a, b) => {
  // 1순위: 카테고리
  const categoryCompare = a.category.localeCompare(b.category);
  if (categoryCompare !== 0) {
    return categoryCompare;
  }
  
  // 2순위: 가격
  return a.price - b.price;
});

console.log(sorted);
// clothing 카테고리가 먼저 나오고, 그 안에서 가격순

날짜로 정렬

const reviews = [
  { text: '좋아요', date: new Date('2024-01-15') },
  { text: '별로에요', date: new Date('2024-01-10') },
  { text: '최고!', date: new Date('2024-01-20') }
];

// 최신순
const newest = [...reviews].sort((a, b) => b.date - a.date);

// 오래된 순
const oldest = [...reviews].sort((a, b) => a.date - b.date);

7. 성능 최적화: useMemo 활용

정렬은 비용이 큰 작업입니다. useMemo로 최적화하세요.

import { useMemo } from 'react';

function OptimizedSort() {
  const [products, setProducts] = useState([]);
  const [sortOption, setSortOption] = useState('default');

  // sortOption이나 products가 변경될 때만 재계산
  const sortedProducts = useMemo(() => {
    console.log('정렬 계산 실행');
    const sorted = [...products];

    switch (sortOption) {
      case 'price-asc':
        return sorted.sort((a, b) => a.price - b.price);
      case 'price-desc':
        return sorted.sort((a, b) => b.price - a.price);
      default:
        return sorted;
    }
  }, [products, sortOption]);

  return <ProductList products={sortedProducts} />;
}

8. 버튼으로 정렬 토글

같은 버튼을 누르면 오름차순/내림차순이 토글되는 UX입니다.

function SortToggle() {
  const [products, setProducts] = useState([]);
  const [sortConfig, setSortConfig] = useState({
    key: null,
    direction: 'asc'
  });

  const handleSort = (key) => {
    let direction = 'asc';
    
    // 같은 키를 다시 클릭하면 방향 전환
    if (sortConfig.key === key && sortConfig.direction === 'asc') {
      direction = 'desc';
    }
    
    setSortConfig({ key, direction });
  };

  const sortedProducts = useMemo(() => {
    const sorted = [...products];
    
    if (sortConfig.key) {
      sorted.sort((a, b) => {
        const aValue = a[sortConfig.key];
        const bValue = b[sortConfig.key];
        
        if (typeof aValue === 'string') {
          return sortConfig.direction === 'asc'
            ? aValue.localeCompare(bValue)
            : bValue.localeCompare(aValue);
        }
        
        return sortConfig.direction === 'asc'
          ? aValue - bValue
          : bValue - aValue;
      });
    }
    
    return sorted;
  }, [products, sortConfig]);

  return (
    <div>
      <button onClick={() => handleSort('price')}>
        가격순 {sortConfig.key === 'price' && (
          sortConfig.direction === 'asc' ? '▲' : '▼'
        )}
      </button>
      
      <button onClick={() => handleSort('title')}>
        이름순 {sortConfig.key === 'title' && (
          sortConfig.direction === 'asc' ? '▲' : '▼'
        )}
      </button>

      <ProductList products={sortedProducts} />
    </div>
  );
}

9. 실전 정렬 함수 모음

재사용 가능한 정렬 함수들입니다.

// 정렬 유틸리티 함수
const sortUtils = {
  // 숫자 오름차순
  numberAsc: (a, b, key) => a[key] - b[key],
  
  // 숫자 내림차순
  numberDesc: (a, b, key) => b[key] - a[key],
  
  // 문자열 오름차순
  stringAsc: (a, b, key) => a[key].localeCompare(b[key]),
  
  // 문자열 내림차순
  stringDesc: (a, b, key) => b[key].localeCompare(a[key]),
  
  // 날짜 최신순
  dateDesc: (a, b, key) => new Date(b[key]) - new Date(a[key]),
  
  // 날짜 오래된순
  dateAsc: (a, b, key) => new Date(a[key]) - new Date(b[key])
};

// 사용 예시
const sortedByPrice = [...products].sort((a, b) => 
  sortUtils.numberAsc(a, b, 'price')
);

const sortedByName = [...products].sort((a, b) => 
  sortUtils.stringAsc(a, b, 'name')
);

10. 필터링과 정렬 함께 사용하기

function FilterAndSort() {
  const [products, setProducts] = useState([]);
  const [category, setCategory] = useState('all');
  const [sortOption, setSortOption] = useState('default');

  const processedProducts = useMemo(() => {
    // 1. 필터링
    let filtered = products;
    if (category !== 'all') {
      filtered = products.filter(p => p.category === category);
    }

    // 2. 정렬
    const sorted = [...filtered];
    switch (sortOption) {
      case 'price-asc':
        return sorted.sort((a, b) => a.price - b.price);
      case 'price-desc':
        return sorted.sort((a, b) => b.price - a.price);
      default:
        return sorted;
    }
  }, [products, category, sortOption]);

  return (
    <div>
      {/* 카테고리 필터 */}
      <select onChange={(e) => setCategory(e.target.value)}>
        <option value="all">전체</option>
        <option value="electronics">전자제품</option>
        <option value="clothing">의류</option>
      </select>

      {/* 정렬 옵션 */}
      <select onChange={(e) => setSortOption(e.target.value)}>
        <option value="default">기본순</option>
        <option value="price-asc">가격 낮은순</option>
        <option value="price-desc">가격 높은순</option>
      </select>

      {/* 결과 */}
      <div>총 {processedProducts.length}개의 상품</div>
      <ProductList products={processedProducts} />
    </div>
  );
}

11. 실전 팁

1. 빈 배열 체크

if (!products || products.length === 0) {
  return <div>상품이 없습니다</div>;
}

2. null/undefined 처리

const sorted = [...products].sort((a, b) => {
  // price가 없는 상품은 맨 뒤로
  if (!a.price) return 1;
  if (!b.price) return -1;
  return a.price - b.price;
});

3. 대소문자 구분 없이 정렬

const sorted = [...products].sort((a, b) => 
  a.name.toLowerCase().localeCompare(b.name.toLowerCase())
);

4. 안정적인 정렬 (원본 순서 유지)

// 같은 값일 때 원본 순서 유지
const sorted = [...products].sort((a, b) => {
  const priceCompare = a.price - b.price;
  if (priceCompare !== 0) return priceCompare;
  
  // 가격이 같으면 원본 인덱스 순서 유지
  return products.indexOf(a) - products.indexOf(b);
});

마무리

정렬 기능 구현에 필요한 핵심 JavaScript 문법을 정리하면:

  • sort(): 배열 정렬의 기본 메서드
  • 비교 함수: (a, b) => a - b 패턴 이해하기
  • localeCompare(): 문자열 자연스러운 정렬
  • 스프레드 연산자: 원본 배열 보존
  • useMemo: 성능 최적화
  • 다중 조건 정렬: 우선순위 정렬 구현

이러한 개념들을 활용하면 사용자 친화적인 정렬 기능을 자유롭게 구현할 수 있습니다!


더 자세한 내용이 궁금하시다면?
정렬부터 고급 필터링, 검색 기능까지! 실무에서 바로 사용할 수 있는 쇼핑몰 구축 노하우가 궁금하시다면 인프런 강의를 확인해주세요!

반응형

+ Recent posts