파이썬 사용자를 위한 웹개발 입문 A to Z Django + Bootstrap
파이썬 사용자를 위한 웹개발 입문 A to Z Django + Bootstrap
수강정보
(28개의 수강평)
751명의 수강생
스킬태그 #Python, #Django, #Bootstrap
55,000원
지식공유자 : SungYong Lee
73회 수업 · 총 16시간 10분 수업
기간 : 평생 무제한 시청
수료증 : 발급 강의
수강 난이도 : 초급
sonagi 프로필

다른 app에서 blog의 post모델을 가져오려면? sonagi 19일 전
main 이라는 앱을 새로 만들어서 거기서 최근에 올라온 post 몇개를 미리보기 할수있게 만드는 기능을 추가하려합니다. main/views.py에서 blog/models.py에 있는 Post를 가져와서 쓰면 될거라고 생각하는데.. 좀처럼 적절한 코드가 떠오르지 않네요. import는 어떻게 해야할지도 모르겠어요..

7
qwer993 프로필

importError 에러 질문입니다.ㅠㅠ qwer993 29일 전
admin 에서 posr 수정화면 마크다운 적용되는것까지 확인한후  오류가 나기시작했습니다. markdownx 설치후 이미지 강의 처럼 같이 했습니다.  importError이 나옵니다.  models.py에서 import 한후 makemigrations,  migrate 도 다 해줬습니다. pip freeze 로 markdownx 설치도 확인했습니다 혹시 몰라 venv/src폴더 mark Directory as- sources Root 도 해봤습니다만 해결이안됩니다.ㅠ ㅠㅠㅠㅠ 도와주세요 ㅠㅠ

3
qwer993 프로필

test중 오류가 나오는데 해답을 찾지못하겠습니다 ㅠㅠ qwer993 1달 전
이제 막 공부를 시작한터라 몇일째 혼자 해결해볼려고 해도 도저히 모르겠습니다... 전 강의 tag페이지 만들기에선 아무런 문제가없었는데 post detail개선 부분부터 오류가 나옵니다.  이 오류를 무시하고 그대로 진도를 나가도 블로그 나 어드민 페이지에선 아무런 문제가 발생하진않지만  어느부분이 잘못되어서 오류가 나오는지 가르쳐주세요!ㅠㅠ post_detail {% extends 'blog/base.html' %} {% block content %} <h1 id="blog-list-title"> Blog {% if category %}<small class="text-muted">: {{ category }}</small>{% endif %} {% if tag %}<small class="text-muted">: #{{ tag }}</small>{% endif %} </h1> {% if object_list.exists %} {% for p in object_list %} <!-- Blog Post --> <div class="card mb-4" id="post-card-{{ p.pk }}"> {% if p.head_image %} <img class="card-img-top" src="{{ p.head_image.url }}" alt="Card image cap"> {% else %} <img class="card-img-top" src="https://picsum.photos/750/300/?random" alt="Card image cap"> {% endif %} <div class="card-body"> {% if p.category %} <span class="badge badge-primary float-right">{{ p.category }}</span> {% else %} <span class="badge badge-primary float-right">미분류</span> {% endif %} <h2 class="card-title">{{ p.title }}</h2> <p class="card-text">{{ p.content | truncatewords:50 }}</p> {% for tag in p.tags.all %} <a href="{{ tag.get_absolute_url }}">#{{ tag }}</a> {% endfor %} <br/> <br/> <a href="{{ p.get_absolute_url }}" class="btn btn-primary" id="read-more-post-{{ p.pk }}">Read More &rarr;</a> </div> <div class="card-footer text-muted"> Posted on {{ p.create }} by <a href="#">{{ p.authro }}</a> </div> </div> {% endfor %} {% else %} <h3>아직 게시물이 없습니다.</h3> {% endif %} {% endblock %} test.py from django.test import TestCase, Client from bs4 import BeautifulSoup from .models import Post, Category, Tag from django.utils import timezone from django.contrib.auth.models import User def create_category(name='life', description=''): category, is_created = Category.objects.get_or_create( name=name, description=description ) category.slug = category.name.replace(' ', '-').replace('/', '') category.save() return category def create_tag(name='some tag'): tag, is_created = Tag.objects.get_or_create( name=name ) tag.slug = tag.name.replace(' ', '-').replace('/', '') tag.save() return tag def create_post(title, content, author, category=None): blog_post = Post.objects.create( title=title, content=content, created=timezone.now(), author=author, category=category, ) return blog_post class TestModel(TestCase): def setUp(self): self.client = Client() self.author_000 = User.objects.create(username='smith', password='nopassword') def test_category(self): category = create_category() def test_post(self): category = create_category() post_000 = create_post( title='The first post', content='Hello World. We are the world', author=self.author_000, category=category, ) self.assertEqual(category.post_set.count(), 1) def test_tag(self): tag_000 = create_tag(name='project') # bad_guy tag_001 = create_tag(name='portfolio') # america post_000 = create_post( title='The first post', content='Hello World. We are the world', author=self.author_000, ) post_000.tags.add(tag_000) post_000.tags.add(tag_001) post_000.save() post_001 = create_post( title='Stay Fool, Stay Hungry', content='Story about Steve jobs', author=self.author_000 ) post_001.tags.add(tag_001) post_001.save() self.assertEqual(post_000.tags.count(), 2) # post 는 여러개의 tag를 가질수잇다 self.assertEqual(tag_001.post_set.count(), 2) # 하나의 Tag는 여러개의 post에 붙을수있다 self.assertEqual(tag_001.post_set.first(), post_000) # 하나의 Tag는 자신을 가진 post들을 불러올수있다 self.assertEqual(tag_001.post_set.last(), post_001) # 하나의 Tag는 자신을 가진 post들을 불러올수있다 def test_post(self): category = create_category() post_000 = create_post( title='The first post', content='Hello World. We are the world', author=self.author_000, category=category, ) class TestView(TestCase): def setUp(self): self.client = Client() self.author_000 = User.objects.create(username='smith', password='nopassword') def check_navbar(self, soup): navbar = soup.find('div', id='navbar') self.assertIn('Blog', navbar.text) self.assertIn('About me', navbar.text) def check_right_side(self, soup): category_card = soup.find('div', id='category-card') self.assertIn('미분류 (1)', category_card.text) self.assertIn('정치/사회 (1)', category_card.text) def test_post_list_no_post(self): response = self.client.get('/blog/') self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') title = soup.title self.assertIn(title.text, 'Blog') self.check_navbar(soup) self.assertEqual(Post.objects.count(), 0) self.assertIn('아직 게시물이 없습니다', soup.body.text) def test_post_list_with_post(self): tag_portfolio = create_tag(name='portfolio') post_000 = create_post( title='The first post', content='Hello World. We are the world', author=self.author_000, ) post_000.tags.add(tag_portfolio) post_000.save() post_001 = create_post( title='The second post', content='Second Second Second', author=self.author_000, category=create_category(name='정치/사회') ) post_001.tags.add(tag_portfolio) post_001.save() self.assertGreater(Post.objects.count(), 0) response = self.client.get('/blog/') self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') body = soup.body self.assertNotIn('아직 게시물이 없습니다', body.text) self.assertIn(post_000.title, body.text) post_000_read_more_btn = body.find('a', id='read-more-post-{}'.format(post_000.pk)) self.assertEqual(post_000_read_more_btn['href'], post_000.get_absolute_url()) self.check_right_side(soup) # main_div에는 main_div = soup.find('div', id='main-div') self.assertIn('정치/사회', main_div.text) ### '정치/사회' self.assertIn('미분류', main_div.text) ### '미분류' # Tag post_card_000 = main_div.find('div', id='post-card-{}'.format(post_000.pk)) self.assertIn('#portfolio', post_card_000.text) # Tag 가 해당 post의 card 마다 있다. def test_post_detail(self): category_politics = create_category(name='정치/사회') post_000 = create_post( title='The first post', content='Hello World. We are the world', author=self.author_000, category=category_politics ) tag_portfolio = create_tag(name='portfolio') post_000.tags.add(tag_portfolio) post_000.save() post_001 = create_post( title='The second post', content='Second Second Second', author=self.author_000, category=create_category(name='정치/사회') ) self.assertGreater(Post.objects.count(), 0) post_000_url = post_000.get_absolute_url() self.assertEqual(post_000_url, '/blog/{}/'.format(post_000.pk)) response = self.client.get(post_000_url) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') title = soup.title self.assertEqual(title.text, '{} - Blog'.format(post_000.title)) self.check_navbar(soup) body = soup.body main_div = body.find('div', id='main-div') self.assertIn(post_000.title, main_div.text) self.assertIn(post_000.author.username, main_div.text) self.assertIn(post_000.content, main_div.text) self.check_right_side(soup) # Tag self.assertIn('#portfolio', main_div.text) self.assertIn(category_politics.name, main_div.text)# 카테고리가 main_div 에 있다. self.assertNotIn('EDIT', main_div.text)# 에디트 버튼이 로그인하지 않은유저에겐 보이지않는다 login_success = self.client.login(username='smith', password='nopassword')# 로그인을 한 경우에는 self.assertTrue(login_success) response = self.client.get(post_000_url) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') main_div = soup.find('div', id='main-div') self.assertEqual(post_000.author, self.author_000)# post.author 와 login 한 사용자가 동일하면 self.assertIn('EDIT', main_div)# EDIT 버튼이 있다. # 다른 사람인 경우에는 없다. def test_post_list_by_category(self): category_politics = create_category(name='정치/사회') post_000 = create_post( title='The first post', content='Hello World. We are the world', author=self.author_000, ) post_001 = create_post( title='The second post', content='Second Second Second', author=self.author_000, category=category_politics ) response = self.client.get('/blog/category/_none/') self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') # self.assertEqual('Blog - {}'.format(category_politics.name), soup.title.text) main_div = soup.find('div', id='main-div') self.assertIn('미분류', main_div.text) self.assertNotIn(category_politics.name, main_div.text) def test_teg_page(self): tag_000 = create_tag(name='project') # bad_guy tag_001 = create_tag(name='portfolio') # america post_000 = create_post( title='The first post', content='Hello World. We are the world', author=self.author_000, ) post_000.tags.add(tag_000) post_000.tags.add(tag_001) post_000.save() post_001 = create_post( title='Stay Fool, Stay Hungry', content='Story about Steve jobs', author=self.author_000 ) post_001.tags.add(tag_001) post_001.save() response = self.client.get(tag_000.get_absolute_url()) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') main_div = soup.find('div', id='main-div') blog_h1 = main_div.find('h1', id='blog-list-title') self.assertIn('#{}'.format(tag_000.name), blog_h1.text) self.assertIn(post_000.title, main_div.text) self.assertNotIn(post_001.title, main_div.text)

2
K Style 프로필

vultr domin에서 admin 접속시 로그인 방법 문의 K Style 1달 전
안녕하세요. vultr 도메인에서 admin으로 접속할 때, 로그인 화면은 뜨는데... 기존 로컬에서 만든 아이디, 비번으로 로긴이 안됩니다. 이것은 앞쪽 수업에서  로컬에서 만든 sqllite는 git에 올리지 않았기 때문에 vultr 도메인에서는 새로 superuser를 만들어야 하는 것으로 이해하고 있습니다. 우선 vultr 콘솔창에서 python manage.py createsuperuser를 치면.. 이런 알 수 없는 글자들이 나오는데.. 마치 아이디와 비번을 입력하라는 것 같은데.. 어떻게 입력해도.. 끝나지가 않네요. 확인 부탁드립니다. 감사합니다.

2
정현구 프로필

오류가 떠서 질문 드립니다. 정현구 1달 전
다른 분들과 같이 오류가 떠서 bootstrap.min.js.map과 popper.min.js.map을 추가했는데 아직도 오류가 발생해서 질문남깁니다.

1
윤태영 프로필

질문있습니다 제발... 윤태영 1달 전
저는 aws의 lightsail을 이용하여 nginx와 gunicorn 설정까지 완료했습니다 근데 http://3.35.19.80/blog/ 로 접속하니  이렇게 뜹니다... read more를 클릭하면 흰창에 server error(500)만 뜨고요 이번에 한이음에서 클라우드를 지원해줘서 강사님의 강의와 다르게 진행했는데 이 문제에 대해 조언을 주실수 있을지 여쭤봅니다 그리고 저는 2주일동안 이것만 머리털빠져라 헤매면서 겨우겨우해도 성공하기 힘든데 강사님이 하는 방법은 왜이렇게 간단한건가요 ㅠ

3
K Style 프로필

VPS연결 관련, 숫자 도메인은 접속이 되는데, garbia 구입 도메인으로 접속 안되는 문제 K Style 1달 전
안녕하세요. 도메인 구입하고 VPS에 연결하기 수업 관련 질문 드립니다. 저랑 비슷한 질문을 하신 분들이 좀 계신 것 같은데요.   숫자 도메인으로는 접속이 되는데, gabia에서 구입한 도메인으로는 접속이 안됩니다.   저는 .kr 형태의 도메인을 구입했는데.. .com이 아닌 것이 문제인지.. garbia에서 무슨 네임서버 설정 관련 글들이 보이던데.. 이건 무엇인지... 끝까지 잘 따라왔는데.. 여기서 막히네요. 해법이 있는지 답변 부탁드립니다. 감사합니다.

2
sonagi 프로필

태그 없애기 sonagi 1달 전
이미 태그가 선택된 포스트들은 태그를 바꿀순 있어도 아예 없애진 못하던데요.. 포스트를 날려버리고 새로 만들어야만 하나요?

1
윤태영 프로필

강사님 소스코드를 그대로 가져왔는데 로그인과 admin페이지가 안들어가집니다.. 윤태영 1달 전
제 원래코드의 문제점을 찾지못해서 강사님 코드로 실행하려고 했으나 로그인을 하려하면 이메일로 가입은 되나 구글로그인과 이메일로 로그인이 안되고 admin 에 접속하려하면  admin페이지를 들어가야 google allauth의 아이디와 키를 적용할수 있는데그것을 못하니 google allauth를 이용한 로그인이 안되는 것이고 admin 페이지는 로그인을 해야 접속할 수 있도록 코드가 작성되어 있어서두개가 충돌하는 문제일까요? 어떻게 해야 할까요 ㅠㅠ

2
강채린 프로필

createsuperuser할 때 패스워드 입력이 안됩니다. 강채린 1달 전
Cmder 창에서 키보드를 아무리 눌러도 password 부분에서는 엔터키를 제외하고 먹지 않아서  superuser를 못만드는데 왜 그럴까요

1
duswl7840 프로필

google login 질문 duswl7840 1달 전
영상 내용을 쭉 따라했는데 구글로그인이 안돼서 질문 남깁니다.. 이런 오류가 뜨면 어느부분을 수정해야 되나요..?

1
qwer993 프로필

OperationalError at /blog/ 오류가 생겼습니다.ㅠㅠ qwer993 1달 전
models 수정후 OperationalError at /blog/ 가 생겼습니다.(8.21 - 09:50여전히 해결안됨..)  

6
qwer993 프로필

models 헤드 부분 수정후 qwer993 1달 전
models 헤드 부분 수정후 이런 오류가 나오는데 어떻게해야될까요...

2
오은비 프로필

python manage.py test 오류 오은비 1달 전
이런 오류가 납니다ㅠㅠ tests.py 코드 입니다 from django.test import TestCase, Clientfrom bs4 import BeautifulSoupfrom .models import Post, Category, Tagfrom django.utils import timezonefrom django.contrib.auth.models import Userdef create_category(name='life', description=''): category, is_created = Category.objects.get_or_create( name=name, description=description, ) category.slug = category.name.replace('', '-').replace('/', '') category.save() return categorydef create_tag(name='some tag'): tag, is_created = Tag.objects.get_or_create( name=name ) tag.slug = tag.name.replace('', '-').replace('/', '') tag.save() return tagdef create_post(title, content, author, category=None): blog_post = Post.objects.create( title=title, content=content, created=timezone.now(), author=author, category=category, ) return blog_postclass TestModel(TestCase): def setUp(self): self.client = Client() self.author_000 = User.objects.create(username='smith', password='nopassword') def test_category(self): category = create_category() post_000 = create_post( title='The first post', content='Hello World. We are the world.', author=self.author_000, category=category, ) self.assertEqual(category.post_set.count(), 1) def test_tag(self): tag_000 = create_tag(name='bad_guy') tag_001 = create_tag(name='america') post_000 = create_post( title='The first post', content='Hello World. We are the world.', author=self.author_000, ) post_000.tags.add(tag_000) post_000.tags.add(tag_001) post_000.save() post_001 = create_post( title='Stay Fool, Stay Hungry', content='Story about Steve Jobs', author=self.author_000 ) post_001.tags.add(tag_001) post_001.save() self.assertEqual(post_000.tags.count(), 2) self.assertEqual(tag_001.post_set.count(), 2) self.assertEqual(tag_001.post_set.first(), post_000) self.assertEqual(tag_001.post_set.last(), post_001) def test_post(self): category=create_category( ) post_000 = create_post( title='The first post', content='Hello World. We are the world.', author=self.author_000, category=category, )class TestView(TestCase): def setUp(self): self.client = Client() self.author_000 = User.objects.create_user(username='smith', password='nopassword') self.user_obama = User.objects.create_user(username='obama', password='nopassword') def check_navbar(self, soup): navbar = soup.find('div', id='navbar') self.assertIn('Blog', navbar.text) self.assertIn('About me', navbar.text) def check_right_side(self, soup): category_card = soup.find('div', id='category-card') self.assertIn('미분류 (1)', category_card.text) # 미분류 (1) 있어야 함 self.assertIn('정치/사회 (1)', category_card.text) # 정치/사회 (1) 있어야 함 def test_post_list_no_post(self): response = self.client.get('/blog/') self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') title = soup.title self.assertIn(title.text, 'Blog') self.check_navbar(soup) self.assertEqual(Post.objects.count(), 0) self.assertIn('아직 게시물이 없습니다.', soup.body.text) def test_post_list_with_post(self): tag_america = create_tag(name='america') post_000 = create_post( title='The first post', content='Hello World. We are the world.', author=self.author_000, ) post_000.tags.add(tag_america) post_000.save() post_001 = create_post( title='The first post', content='Second Second Second', author=self.author_000, category=create_category(name='정치/사회') ) post_001.tags.add(tag_america) post_001.save() self.assertGreater(Post.objects.count(), 0) response = self.client.get('/blog/') self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') body = soup.body self.assertNotIn('아직 게시물이 없습니다.', body.text) self.assertIn(post_000.title, body.text) post_000_read_more_btn = body.find('a', id='read-more-post-{}'.format(post_000.pk)) self.assertEqual(post_000_read_more_btn['href'], post_000.get_absolute_url()) self.check_right_side(soup) # main_div에는 main_div = soup.find('div', id='main_div') self.assertIn('정치/사회', main_div.text) # '정치/사회' 있어야 함 self.assertIn('미분류', main_div.text) # '미분류' 있어야 함 # Tag post_card_000 = main_div.find('div', id='post-card-{}'.format(post_000.pk)) self.assertIn('#america',post_card_000.text) #Tag가 해당 post의 card마다 있다. def test_post_detail(self): category_politics = create_category(name='정치/사회') post_000 = create_post( title='The first post', content='Hello World. We are the world.', author=self.author_000, category=category_politics ) tag_america = create_tag(name='america') post_000.tags.add(tag_america) post_000.save() post_001 = create_post( title='The first post', content='Second Second Second', author=self.author_000, ) self.assertGreater(Post.objects.count(), 0) post_000_url = post_000.get_absolute_url() self.assertEqual(post_000_url, '/blog/{}/'.format(post_000.pk)) response = self.client.get(post_000_url) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') title = soup.title self.assertEqual(title.text, '{} - Blog'.format(post_000.title)) self.check_navbar(soup) body = soup.body main_div = body.find('div', id='main_div') self.assertIn(post_000.title, main_div.text) self.assertIn(post_000.author.username, main_div.text) self.assertIn(post_000.content, main_div.text) self.check_right_side(soup) # Tag self.assertIn('#america', main_div.text) # Tag가 해당 post의 card마다 있다. self.assertIn(category_politics.name, main_div.text)#category가 main_div에 있다. self.assertNotIn('EDIT', main_div.text)#EDIT 버튼이 로그인하지 않은 경우 보이지 않는다. login_success = self.client.login(username='smith', password='nopassword')#login을 한 경우에는 self.assertTrue(login_success) response = self.client.get(post_000_url) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') main_div = soup.find('div', id='main-div') self.assertEqual(post_000.author, self.author_000) #post.author와 login한 사용자가 동일하다면 self.assertIn('EDIT', main_div.text) #EDIT 버튼이 있다. # 다른 사람인 경우에는 없다. login_success = self.client.login(username='obama', password='nopassword') #login을 한 경우에는 self.assertTrue(login_success) response = self.client.get(post_000_url) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') main_div = soup.find('div', id='main-div') self.assertEqual(post_000.author, self.author_000) # post.author와 login한 사용자가 동일하다면 self.assertNotIn('EDIT', main_div.text) # EDIT 버튼이 있다. def test_post_list_by_category(self): category_politics = create_category(name='정치/사회') post_000 = create_post( title='The first post', content='Hello World. We are the world.', author=self.author_000, ) post_001 = create_post( title='The first post', content='Second Second Second', author=self.author_000, category=category_politics ) response = self.client.get(category_politics.get_absolute_url()) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') main_div = soup.find('div', id='main_div') self.assertNotIn('미분류', main_div.text) self.assertIn(category_politics.name, main_div.text) def test_post_list_no_category(self): category_politics = create_category(name='정치/사회') post_000 = create_post( title='The first post', content='Hello World. We are the world.', author=self.author_000, ) post_001 = create_post( title='The first post', content='Second Second Second', author=self.author_000, category=category_politics ) response = self.client.get('/blog/category/_none/') self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') main_div = soup.find('div', id='main_div') self.assertIn('미분류', main_div.text) self.assertNotIn(category_politics.name, main_div.text) def test_tag_page(self): tag_000 = create_tag(name='bad_guy') tag_001 = create_tag(name='america') post_000 = create_post( title='The first post', content='Hello World. We are the world.', author=self.author_000, ) post_000.tags.add(tag_000) post_000.tags.add(tag_001) post_000.save() post_001 = create_post( title='Stay Fool, Stay Hungry', content='Story about Steve Jobs', author=self.author_000 ) post_001.tags.add(tag_001) post_001.save() response = self.client.get(tag_000.get_absolute_url()) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') main_div = soup.find('div', id='main-div') blog_h1 = main_div.find('h1', id='blog-list-title') self.assertIn('#{}'.format(tag_000.name), blog_h1.text) self.assertIn(post_000.title, main_div.text) self.assertNotIn(post_001.title, main_div.text)

1
윤태영 프로필

migrate 에러 문의 윤태영 1달 전
저번에 awesome avartar 문의를 드렸었는데요 결국 포기하고 원상태로 복구시키려니 이런 에러가 뜹니다저번에 venv의 하위파일중 db를 건드렸던건지 venv안의 awesome avartar 파일들과 manage.py 파일들을 모두 삭제하고 진행시켰는데도 'blog_category'가 이미 있다고 뜹니다 전에는 blog_comment.author_id 가 있다고 뜨고  그 뒤엔 blog_comment가 이미있다고 뜨고 지금은 이상태입니다... 뭐가문제일까요 models.py와 views.py는 강사님과 다른게없습니다

3
지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스