We may earn an affiliate commission when you visit our partners.
Course image
Michael Kwon

이 강의는 최신 웹 개발 트렌드에 부합하는 Svelte의 기본기를 실전적으로 습득하기 위한 목표로 구성되었습니다. Svelte는 직관적이며 가볍고 뛰어난 성능, 효율적인 컴파일 타임 최적화를 통한 코드 크기 감소와 뛰어난 성능을 자랑합니다.

HTML, CSS와 JavaScript 기초를 배우고 이제 프레임워크(라이브러리)를 배워보고자 하는 입문자에게는 개발에 흥미를 붙일 수 있으며 이미 타 프레임워크를 사용했던  개발자들은 기존 UI 프레임워크에 비해 스벨트의 간결하고 유연함을 경험할 수 있는 최고의 세컨드 쵸이스입니다.

현재 점점 더 많은 개발자와 기업들이 Svelte를 사용하여 웹 애플리케이션을 개발하고 있으며, Svelte로 구축된 프로젝트들이 성공적으로 운영되고 있습니다. 문법만 배우다 지루해서 포기하지 마시고 프로젝트를 만들면서 배워보세요.

- 2024년 6월 SvelteKit 활용 콘텐츠 업데이트

- 2024년 5월 캐주얼 게임 만들기(빌트인 store 활용) 업데이트

주요 내용:

Read more

이 강의는 최신 웹 개발 트렌드에 부합하는 Svelte의 기본기를 실전적으로 습득하기 위한 목표로 구성되었습니다. Svelte는 직관적이며 가볍고 뛰어난 성능, 효율적인 컴파일 타임 최적화를 통한 코드 크기 감소와 뛰어난 성능을 자랑합니다.

HTML, CSS와 JavaScript 기초를 배우고 이제 프레임워크(라이브러리)를 배워보고자 하는 입문자에게는 개발에 흥미를 붙일 수 있으며 이미 타 프레임워크를 사용했던  개발자들은 기존 UI 프레임워크에 비해 스벨트의 간결하고 유연함을 경험할 수 있는 최고의 세컨드 쵸이스입니다.

현재 점점 더 많은 개발자와 기업들이 Svelte를 사용하여 웹 애플리케이션을 개발하고 있으며, Svelte로 구축된 프로젝트들이 성공적으로 운영되고 있습니다. 문법만 배우다 지루해서 포기하지 마시고 프로젝트를 만들면서 배워보세요.

- 2024년 6월 SvelteKit 활용 콘텐츠 업데이트

- 2024년 5월 캐주얼 게임 만들기(빌트인 store 활용) 업데이트

주요 내용:

  1. 영화정보:

    • 실습을 통해 Svelte의 필수 핵심 기능들을 빠르게 학습

    • 데이터 바인딩, 컴포넌트, 상태 관리, props

    • 이벤트 핸들링, 라이프사이클, 리액티브 선언문 활용하기

    • 스벨트 효과(transition & animation) 기능 활용

  2. 브랜딩 홈페이지:

    • 페이지 라우팅

    • 양방향 데이터 바인딩

    • SASS로 스타일링 하기

    • 멀티미디어 다루기

    • 빌드 및 배포하기

  3. 캐주얼 게임 만들기

    • 게임 디자인 구성안을 토대로 한 체계적인 실습

    • 라우터 없이 동적 페이지 연결하기

    • 게임 로직 구현을 통한 게임 이벤트 처리 및 화면 제어를 다루는 법

    • 빌트인 store로 게임 정보들을 쉽게 전역 상태로 관리하기

    • Audio API를 활용하여 BGM과 효과음 구현하기

  4. 일기장 앱(SvelteKit + Supabase)

    Svelte에서 기능을 확장한 SvelteKit 프로젝트를 통해 파일 기반 라우팅, 서버 사이드 로직을 처리하고 실제 database와 연동되는 풀스택 애플리케이션을 손쉽게 개발하는 과정을 학습합니다.

Enroll now

Here's a deal for you

We found an offer that may be relevant to this course.
Save money when you learn. All coupon codes, vouchers, and discounts are applied automatically unless otherwise noted.

What's inside

Learning objectives

  • 홈페이지에서 캐주얼 게임, 풀스택 애플리케이션 까지 다양한 주제의 프로젝트를 통해 프론트엔드의 핵심 기능들을 습득하고 문제해결 능력을 키웁니다.
  • Svelte의 간결하고 직관적인 문법을 사용하여 컴포넌트 기반 아키텍처를 구축하고 상태 관리, 이벤트 처리, 라우팅 등의 주요 주제를 다룹니다.
  • Vite를 통해 프로젝트 생성 및 빌드를 하고 깃허브와 vercel을 통해 쉽게 웹에 배포합니다.
  • 빌트인 스토어를 통해 전역 상태관리를 쉽게 다루는 방법을 습득할 수 있습니다.
  • Sveltekit과 supabase로 풀스택 애플리케이션을 쉽게 개발합니다.
  • 최소한의 시간 대비 많은 것들을 습득 가능합니다.

Syllabus

  • 영화 데이터를 가져와서 검색어에 입력된 값과 영화제목을 비교하여 찾는 로직을 구현하고 검색 실패 시 경고 메시지를 출력하게 합니다.

  • 검색 버튼을 키보드 입력에 반응하도록 합니다.

영화정보 홈페이지 프로젝트를 통해 component, 데이터 바인딩, 상태변수 다루는 법, 동적 콘텐츠, 라이프사이클 등 프론트엔드 애플리리케이션 개발의 기본기를 습득하게 됩니다.
Read more

Svelte 소개 및 기본 개념과 타 프레임워크들과의 차이점을 설명합니다. 이를 통해 현대적인 웹 애플리케이션의 개발 흐름과 방향을 이해할 수 있습니다.

개발환경과 추가적인 패키지 설치에 필요한 Node.jsnpm(node package manager)을 설치합니다.

프론트엔드 개발 도구인 Vite를 통해 Svelte 프로젝트를 생성합니다.

  • 데이터 변수들을 화면에 출력하는 방법

  • 스타일 및 이미지 속성등을 데이터로 다루는 방법

반복문 #each를 이용하여 영화정보 데이터를 문서에 표시합니다.

on: 지시어(directive)로 사용자의 입력에 반응하는 이벤트 기능을 연결할 수 있습니다. 이를 이용하여 좋아요 버튼을 구현합니다.

좋아요 버튼의 카운트를 각각의 영화정보에 개별적으로 반영합니다.

이미지 콘텐츠를 추가하고 전역 스타일과 지역 스타일로 컴포넌트들을 디자인 하는 방법에 대해 학습합니다.

영화 상세정보를 보여주는 모달창을 열고 닫는 기능을 학습합니다.

  • 외부에 작성한 영화데이터를 export로 내보내고 import로 가져옵니다.

  • 데이터 및 라이브러리 관리를 위한 export & import 활용 방법에 대해 다룹니다.

모달 창에 클릭한 영화정보를 동적으로 표시합니다.

영화정보 홈페이지의 주요 UI 요소들을 component로 분리하여 작성합니다.

  • 네비게이션 UI를 component로 추가합니다.

  • 모달창을 component로 분리합니다.

  • 컴포넌트로 분리된 상세정보(모달)창에 데이터를 전달합니다.

  • props 문법으로 부모 컴포넌트에서 하위 컴포넌트에게 데이터를 전달합니다.

bind 지시어를 사용하여 props를 전달하면 부모 컴포넌트에게 데이터 변경을 요청할 수 있습니다. 해당 기능을 이용하여 모달 컴포넌트에서 창을 닫는 기능까지 완성합니다.

component간 데이터 통신의 종합적인 응용입니다.

  • 영화목록을 component로 만들어 props를 통해 영화 데이터를 전달합니다.

  • 좋아요 버튼과 상세보기(모달창) 관련 props를 전달하고 해당 기능이 동작할 수 있도록 합니다.

  • 상태변수로 class를 동적으로 추가하는 방법을 다룹니다.

  • class를 동적으로 추가하는 방법에 대해 알아보고 이를 이벤트 창에 적용하여 닫기 기능을 구현합니다.

  • 스벨트의 효과 기능을 통해 다이네믹한 이벤트 창을 구현합니다.

  • 검색창에 사용자의 입력을 받는 기능을 구현합니다.

  • bind 지시어로 사용자의 입력을 간편하게 처리할 수 있습니다.

리액티브 선언문($)으로 검색창에 텍스트가 입력될 때 어떤 텍스트가 입력되었는지 검사하는 기능을 추가합니다.

  • 입력한 문자가 포함되어 있는 영화자료를 찾을 수 있도록 검색 로직을 수정합니다.

  • 배열 데이터 복사를 다루는 방법에 대해 학습합니다.

  • 사용자가 검색창에 입력한 결과를 화면에 업데이트 합니다.

  • 검색 결과 표시 이후, 원본 데이터를 다시 가져와 전체 데이터를 보여주도록 합니다.

  • 전체보기 기능을 추가합니다.

  • 검색결과가 없는 상태에서 전체보기를 클릭 했을 때 경고창이 사라지지 않는 문제를 수정합니다.

영화 데이터를 검색하여 좋아요 버튼이나 상세보기 창으로 연결시 정보가 올바르게 업데이트가 되지 않는 이유와 그 해결책으로 영화 데이터에 고유 id 속성을 부여하여 조회하는 방법에 대해 학습합니다

컴포넌트가 실행되고 업데이트 되고 종료되는 상태에 따라 작업을 처리하는 개념이 있습니다.

이를 라이프사이클(Lifecycle), 즉 생명주기라고 하는데 간단한 개념과 실습으로 다루어 봅니다.

라이프사이클 훅(Lifecycle hook)을 이용하여 이벤트 창의 광고 텍스트가 일정 시간이 지나면 다른 내용으로 업데이트 되도록 합니다.

setInterval을 이용하여 이벤트 창의 광고 텍스트가 계속 순환되도록 하고 onDestroy 훅으로 컴포넌트 종료시 정리하는 작업에 대한 사례를 학습합니다.

$(리액티브선언문)으로 setInterval 함수를 쉽게 다루는 방법도 소개합니다.

페이지를 연결하는 라우팅 기능과 URL Parameter로 페이지에 데이터를 전달하여 동적인 페이지를 구현할 수 있습니다. 최종적으로 결과물을 웹에 배포합니다.

디자인 프로토타입을 통해 구현할 홈페이지의 세부 내용과 기능들을 검토합니다.

  • Vite로 프로젝트를 생성합니다.

  • CSS를 확장한 Sass(SCSS)문법을 사용하기 위해 관련 모듈을 설치합니다.

자주 사용하는 변수, 중첩 선택자, 믹스인 등 Sass의 핵심문법을 학습합니다.

프로젝트에 필요한 이미지들과 동영상을 추가합니다.

  • Home 컴포넌트를 추가하고 공통 레이아웃에 들어갈 Header, Footer 영역을 컴포넌트화 합니다.

  • Sass(scss) 문법으로 컴포넌트 별 디자인을 추가합니다.

  • Home 컴포넌트를 추가하고 공통 레이아웃에 들어갈 Header, Footer 컴포넌트를 활용합니다.

router 라이브러리를 설치하여 페이지를 연결하는 라우팅 기능을 구현합니다.

  • News 페이지 영역의 컴포넌트를 제작하고 라우팅에 반영합니다.

  • 뉴스 데이터를 추가하여 정보를 표시합니다.

반복문으로 뉴스기사 목록을 표시합니다.

상세페이지 component를 추가하고 라우팅으로 연결합니다

  • news 데이터 파일에 id값을 받아 해당하는 자료만 전달하는 유틸리티 함수를 작성합니다.

  • url parameter로 상세페이지에 데이터를 전달할 수 있게 합니다.

  • news 데이터를 가져오는 함수(getNews) 호출시 결과값이 undefined가 뜨는 문제를 수정합니다.

  • news 데이터를 상세페이지에 표시합니다.

about 페이지에 지도와 연락처를 추가합니다

터미널에서 build 커맨드로 프로젝트를 빌드하고 테스트 합니다.

별도의 빌드 과정 없이 깃허브와 클라우드 배포 서비스를 이용해 빠르게 배포하고 업데이트 합니다.

컴포넌트 단위의 기능적 개발, 상태관리, 이벤트, 라이프사이클 등 지금까지 배운 핵심적인 개발능력을 총제적으로 다루고 게임 점수관리를 위해 전역상태관리를 본격적으로 활용합니다.

본 섹션에서 제작할 게임의 미리보기 영상입니다.

게임 만들기의 교본인 짝찾기 게임(Pair Game)을 만듭니다. 게임에 대한 소개 및 미리 디자인 된 구성안을 검토합니다.

vite로 프로젝트를 생성하고 문서와 스타일을 초기화합니다.

주요 게임화면을 컴포넌트로 작성하고 추가합니다.

라우터를 사용하지 않고 상태변수로 주요 화면을 연결하고 돌아가는 기능을 구현합니다.

구글 웹폰트를 설치하고 게임 화면에 필요한 디자인과 이미지를 추가합니다.

게임 플레이 영역에서 점수 표시와 스테이지, 제한시간 등을 표시하는 GameInfo영역을 컴포넌트로 모듈화 합니다.

카드가 배치되는 게임 그리드 영역을 컴포넌트화 하고 카드 데이터를 생성해 화면에 배치합니다.

  • 카드의 앞면과 뒷면의 상태를 정의하고 해당하는 디자인을 추가합니다.

  • 카드를 랜덤하게 섞는 함수를 추가합니다.

## Game Rule

- 모든 카드는 초기 뒷면 상태

- 클릭하면 앞면을 보여주고 2번째 카드를 클릭시 판정 들어감

    - 1초 후에 카드는 다시 뒤집힘

    - 클릭한 두 카드가 일치하지 않으면 1초 후 닫힘

    - 클릭한 두 카드가 일치하면 해당 카드들을 열림 상태로 변경

- 모든 카드를 맞추면 점수를 획득하고 다음 라운드로 이동

- 시간이 초과되면 게임오버

  • 게임 시작시 전체 카드를 뒷면으로 초기화 합니다

  • 사용자가 카드를 클릭하면 앞면을 보여주고 1초 후 다시 닫히게 합니다.

카드 클릭 요소에 이벤트를 추가했는데 접근성 경고가 발생합니다. 해당 문제가 발생하는 이유와 수정하는 방법에 대해 다룹니다.

선택한 2개의 카드 짝이 맞는지 여부를 판정하기 위한 배열과 함수를 추가합니다.

  • 같은 위치의 카드는 채크 예외처리 하는 로직을 추가합니다.

  • 카드 매칭을 채크하는 함수에 짝이 맞은 카드들을 채크하는 로직을 추가합니다.

  • 일치된 카드의 결과를 화면에 반영합니다.

  • 사용자가 카드를 선택했을 이전 카드가 보일때만 매칭 여부를 판정하도록 합니다.

  • 게임 재시작시 카드를 초기화 시킵니다.

카드의 짝이 모두 맞았을 때 게임 클리어 조건을 판정하는 로직을 추가합니다.

모든 카드의 짝이 매칭이 되면 게임 클리어 결과창을 표시합니다.

게임 오버 시에도 동일한 모달 컴포넌트를 활용하여 정보를 표시합니다.

표시되는 내용이 다르기 때문에 모달창에 표시될 변수를 규칙에 맞게 추가하고 props로 바인딩하여 전달 합니다.

스벨트의 store 기능을 사용하기에 앞서 props전역상태관리에 대한 이해를 돕고 게임정보를 어떻게 다룰지 살펴봅니다.

store를 통해 게임점수 관련 데이터들을 전역 상태변수로 만들어 컴퍼넌트들에 업데이트 할 수 있도록 합니다.

  • 게임 결과창(Game Clear, Game Over)에 store에 저장된 게임 점수(score)를 가져와 표시합니다.

  • '게임 클리어' 시와 '게임 오버' 시 버튼의 역할을 다르게 적용합니다.

  • store에서 가져온 score, round, time 상태변수 들을 각각의 상황에 맞게 업데이트 하거나 초기화 합니다. 

모달 창에서 Home으로 이동하는 기능을 추가합니다. 이를 위해 page를 변경하는 상태변수를 store에 작성하여 핸들링 합니다.

제한시간 타이머 기능을 추가해서 시간을 1초씩 감소시키고, 0이되면 게임 오버 처리를 합니다.

  1. Replay 버튼 클릭 시 게임 초기화하기

  2. Game Over시 타이머 초기화 하기

게임 최고기록마지막 게임 기록을 컴퓨터의 저장소(localStorage)에 저장하고 Game Score 화면에서 조회가 가능하도록 합니다.

게임결과창 Replay 버튼의 기능을 올바르게 수정합니다.

store에 게임 초기화 함수를 추가하여 코드 중복을 줄이고 데이터 관리를 일원화합니다.

게임에 꼭 필요한 사운드 효과를 추가합니다. 오디오 API를 이용하여 사운드와 배경음악을 재생할 수 있습니다.

Svelte에서 기능을 확장한 SvelteKit 프로젝트를 통해 파일 기반 라우팅, 서버 사이드 로직을 처리하고 실제 database와 연동되는 풀스택 애플리케이션까지 학습합니다.

SvelteKit에 대한 소개와 주요 특징에 대해 설명합니다.

우리가 만들게 될 Diary(일기장) 앱의 화면구성과 기능에 대해 설명합니다.

SvelteKit 프로젝트를 생성하고 폴더 구조에 대해 살펴봅니다.

파일 시스템 기반 라우팅을 사용하여 페이지를 연결하는 방법에 대해 학습합니다.

  • 페이지에 공통으로 들어가는 UI 영역(Header)을 레이아웃 문서로 구성합니다.

  • 컴포넌트에 자식 콘텐츠를 전달할 수 있는 slot 요소를 활용합니다.

Header 영역을 컴포넌트로 만들고 /lib경로를 별칭으로 간략화 합니다.

  • Sass 모듈을 추가합니다.

  • 전역 스타일(Global Style) 문서를 추가하고 변수, 서체, 공통 스타일을 전체 문서에 반영할 수 있도록 합니다.

  • 주요 색상 값들을 CSS 전역변수로 선언하고 별도의 문서로 분리합니다.

  • Header 영역을 디자인 합니다.

  • Header 컴포넌트에서 이동한 페이지의 위치를 알기 위해 페이지 경로명을 구분하는 방법($app/stores 모듈)을 다룹니다.

  • Home을 제외한 나머지 페이지들은 완료 버튼이 표시되고 기능을 구분할 수 있도록 합니다.

$app/navigation 모듈을 이용하여 프로그래밍 방식으로 페이지를 이동(Programmatically navigate)하는 방법을 학습합니다.

일기 데이터를 store에 추가하고 가져옵니다.

store에서 일기 데이터를 가져와 목록으로 표시합니다.

범용 아이콘 라이브러리를 추가하고 수정, 삭제 기능에 해당하는 버튼 모양을 아이콘으로 꾸며줍니다.

url parameter를 이용하여 home 일기 목록에서 읽고자 하는 글 상자를 클릭하면 해당 일기를 보여주는 상세 페이지(read)로 이동합니다.

Home 글목록에서는 표시되는 최대 글자수를 제한하고 중략하여 표시하도록 합니다.

홈 하단에 이미지 형태의 글쓰기 버튼을 추가하고 일기 쓰기(write) 페이지로 연결시킵니다.

글을 입력 받는 글상자를 추가하고 날짜를 표시 지역에 맞게 포매팅 하는 기능을 추가합니다.

기본 textarea로 불가능한 줄내림시 자동 높이조절이 가능한 textarea 컴포넌트를 도입합니다.

글쓰기(write) 페이지의 입력 내용을 store에 저장하여 Header에서 완료 버튼 클릭시 store를 참조할 수 있도록 합니다.

store에 글쓰기 함수를 추가하고 쓰기 페이지에서 완료 버튼 클릭시 새글이 추가되도록 합니다.

home 글목록에서 수정 버튼 클릭시 글수정 페이지에 수정할 글번호를 params로 전달하고 연결하는 기능을 추가합니다.

store에 글수정 함수를 추가하고 수정한 글을 저장할 수 있도록 합니다

수정, 삭제 버튼을 담고 있는 버튼 UI 공통 영역을 컴포너트화 합니다.

수정하기 페이지에서는 수정 버튼을 보이지 않게 조건부 처리합니다.

기존 커스텀 제작한 textarea는 글자 깨짐 현상이 존재합니다. 개선된 방식의 svelte 전용 모듈로 교체합니다.

store글 삭제 함수를 추가하고 버튼 컴포넌트에서 삭제 버튼 클릭시 글이 삭제되도록 합니다.

클라우드 기반의 간편한 백엔드 서비스인 Supabase를 이용하여 데이터베이스를 추가합니다.

supabase 클라이언트 라이브러리를 설치하고 DB서버에 접속하여 글을 가져옵니다.

Good to know

Know what's good
, what to watch for
, and possible dealbreakers
Designed for coders with HTML, CSS, and JavaScript basics, who aim to extend their front-end toolkit with a modern, performant and intuitive framework
Addresses the core requirements of front-end UI development including component-based architecture, state management, event handling, routing, and more
Focuses on practical hands-on projects such as a movie listing website, a branding homepage, a casual game, a diary app, and a complete full-stack application with a database, showcasing real-world applications of Svelte
Emphasizes problem-solving skills through interactive challenges within the project-based learning approach
Leverages Vite for efficient project setup and build process, while incorporating version control and deployment techniques, ensuring a comprehensive workflow for front-end development
Utilizes the built-in Svelte store to manage global application state, enabling seamless data handling and reactivity

Save this course

Save 프로젝트로 쉽게 배우는 Svelte 기본편(SvelteKit + Supabase) to your list so you can find it easily later:
Save

Activities

Be better prepared before your course. Deepen your understanding during and after it. Supplement your coursework and achieve mastery of the topics covered in 프로젝트로 쉽게 배우는 Svelte 기본편(SvelteKit + Supabase) with these activities:
Svelte 기초 복습
Svelte 기초를 복습하여 이 코스에서 더 쉽게 학습할 수 있도록 합니다.
Browse courses on Svelte
Show steps
  • 지침서 또는 온라인 자료 검토하기
  • 기본 개념 복습하기
  • 예제 코드 살펴보기
Svelte 문제 풀기
Svelte 문제를 풀어보며 Svelte에 대한 이해를 굳건히 합니다.
Browse courses on Svelte
Show steps
  • 문제 모으기
  • 문제 풀기
  • 해결책 확인하기
  • 오류 파악 및 수정하기
Svelte 프로젝트 만들기
Svelte 프로젝트를 만들어보며 학습한 내용을 직접 적용해봅니다.
Browse courses on Svelte
Show steps
  • Svelte 프로젝트 생성
  • 컴포넌트 만들기
  • 데이터 바인딩 하기
  • 이벤트 핸들링 추가하기
  • 스타일링 하기
  • 프로젝트 배포하기
Two other activities
Expand to see all activities and additional details
Show all five activities
Svelte 커뮤니티 참여하기
Svelte 커뮤니티에 참여하여 Svelte에 대한 지식을 넓힙니다.
Browse courses on Svelte
Show steps
  • 커뮤니티 포럼 또는 채팅방 가입하기
  • 질문하기 및 다른 사람의 질문에 답하기
  • Svelte 프로젝트에 참여하기
Svelte 워크숍 참석하기
Svelte 워크숍에 참석하여 Svelte의 최신 트렌드와 기술을 배웁니다.
Browse courses on Svelte
Show steps
  • 워크숍 찾기
  • 워크숍에 등록하기
  • 워크숍에 참석하기

Career center

Learners who complete 프로젝트로 쉽게 배우는 Svelte 기본편(SvelteKit + Supabase) will develop knowledge and skills that may be useful to these careers:

Reading list

We haven't picked any books for this reading list yet.

Share

Help others find this course page by sharing it with your friends and followers:

Similar courses

Here are nine courses similar to 프로젝트로 쉽게 배우는 Svelte 기본편(SvelteKit + Supabase).
Gemini for end-to-end SDLC - 한국어
Most relevant
AI로 피그마(Figma)에 날개 달기
Most relevant
머신 러닝 기초: 사례 연구 접근 방식
Most relevant
VMware NSX를 활용한 네트워킹 및 보안 아키텍처
Most relevant
The 빠른 OPIc IH
Most relevant
Introduction to AI and Machine Learning on GC - 한국어
Most relevant
디지털 제품 경영: 현대적 기본 원칙
Most relevant
모두를 위한 머신 러닝
Most relevant
컴퓨터 비전 분야에서의 딥 러닝 응용 사례
Most relevant
Our mission

OpenCourser helps millions of learners each year. People visit us to learn workspace skills, ace their exams, and nurture their curiosity.

Our extensive catalog contains over 50,000 courses and twice as many books. Browse by search, by topic, or even by career interests. We'll match you to the right resources quickly.

Find this site helpful? Tell a friend about us.

Affiliate disclosure

We're supported by our community of learners. When you purchase or subscribe to courses and programs or purchase books, we may earn a commission from our partners.

Your purchases help us maintain our catalog and keep our servers humming without ads.

Thank you for supporting OpenCourser.

© 2016 - 2024 OpenCourser