Embed Discourse comments on another website via Javascript

Discourse has the ability to embed the comments from a topic in a remote site using a Javascript API that creates an IFRAME. For an example of this in action, check out Coding Horror’s blog. The blog is run via Ghost but the comments are embedded from his Discourse forum.

One important thing to note with this setup is that users have to navigate to your forum to post replies. This is intentional, as we feel that the posting interface on a Discourse forum is currently much richer than what we could embed via Javascript.

This guide will show how to set up comment embedding on your own blog or web site.

How it works

In Discourse, a topic is made up of many posts. When you are embedding Discourse on another site, you are linking a document (blog entry, HTML page, etc.) with a single topic. When people post in that topic, their comments will automatically show up on the page you embedded it in.

You have the choice to have Discourse create the topics automatically when a new embedding is found, or you can create the topics yourself in advance.

Configuring Discourse for Embedding (simple setup)

The following setup will embed a comment feed on a page on a fake blog URL of http://example.com/blog/entry-123.html, from a discourse forum running at =DISCOURSE=.

Domain for  

Domain for  

  1. Visit Admin > Customize > Embedding on your Discourse install. https://=DISCOURSE=/admin/customize/embedding

  2. Create at least one Embeddable Host. This should be the hostname (domain) where you want to embed your comments. In this case the host is =BLOG= – note the lack of http:// and path.

    • Path Allowlist allows you to specify the paths on the remote host that would accept your embed.

    • Post to Category - if you supply a category alongside the host you are entering, posts imported from that host will automatically end up in that category. Different hosts can post to different categories.

    • Tags - you can assign tags to be automatically applied to topics created from a given host.

    • Post Author - you can optionally override the topic creation user on a per-host basis. If not set, the default from the Posts and Topics tab is used.

  3. Navigate to the Posts and Topics tab and fill in the Username for topic creation field. This is the user who will create topics when new embeddings are found. Let’s assume our discourse has a user called eviltrout, so the value is eviltrout.

  4. Insert the following HTML on the web page at http://=BLOG=/blog/entry-123.html

<div id='discourse-comments'></div>

<script type="text/javascript">
  DiscourseEmbed = {
    discourseUrl: 'https://discourse.example.com/',
    discourseEmbedUrl: 'http://example.com/blog/entry-123.html',
    // className: 'CLASS_NAME',
  };

  (function() {
    var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
    d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
  })();
</script>

The configurable parts of the snippet are in the DiscourseEmbed object. discourseUrl is the full path to the base of your discourse, including the trailing slash. The discourseEmbedUrl is the document that is currently embedding a comment feed.

If you set this up correctly, the first time you visit http://=BLOG=/blog/entry-123.html it will try to load comments for the blog post. Since there are none, it will tell the Discourse forum to create a new topic in the background. A new topic will be created by eviltrout and the contents of the first post will be crawled from your blog and the text will be extracted automatically.

Once the new topic is created, users can post on it, and their comments will automatically be displayed the next time http://=BLOG=/blog/entry-123.html is visited.

className is optional and will add a class of your choice to the embed so you can customize it with CSS.

:bulb: Tip: If your blog has multiple authors, you can add a <meta name="discourse-username" content="author_username"> tag to each page. When Discourse crawls the page to create the topic, it will use this meta tag to determine the post author, overriding the default username set in the admin settings.

Embedding on more than one page

In the above example we hard coded our http://=BLOG=/blog/entry-123.html URL when embedding the snippet of Javascript. This usually won’t be enough as many sites have many pages that are generated automatically. For example on a blog each entry typically gets its own page. To support this, put the same snippet on each page you want to display comments on, but replace the value passed to discourseEmbedUrl with the current page’s URL. On my blog, I use the following value for discourseEmbedUrl: 'http://eviltrout.com<%= current_page.url %>' – as new blog pages are created, new topics will be created for them automatically on Discourse.

Styling your Embedded content

You have the ability to add a stylesheet for your embedded comments. Use the Embedded CSS section of the Theme editor at Admin > Customize > Themes > [your theme] > Edit CSS/HTML and you can add a custom stylesheet that will be served up with your embedded comments. By default we think the layout looks nice on a white background, but if your site has a unique layout you’ll want to style it yourself.

(Optional) Adding a Feed for Polling

As mentioned above, Discourse will automatically crawl any site it is embedded on. However, sometimes HTML can be hard to parse and it might not extract the contents of your posts correctly. Many blogs and web sites support RSS/Atom feeds for syndication, and Discourse can use this to extract the content of your blog posts more accurately.

Discourse ships with the RSS Polling plugin (included by default). If you have a RSS or Atom feed set up on the site you are embedding Discourse into, you can enable the rss_polling_enabled site setting and add your feed’s URL via Admin > Plugins > RSS Polling. Once the feed URL has been added, Discourse will parse the feed and publish its posts to the appropriate category based on the Allowed Hosts that you add to your Embedding settings.

(Alternate Configuration) Linking to existing topics

Some people prefer to not have Discourse create topics for them automatically on their forums. They’d like to create the topics themselves, then simply tell their embedding code what topic they want to associate with. You can do this by slightly changing your embedding code:

<div id='discourse-comments'></div>

<script type="text/javascript">
  window.DiscourseEmbed = {
    discourseUrl: 'https://=DISCOURSE=/',
    topicId: 12345
  };

  (function() {
    var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
    d.src = window.DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
  })();
</script>

The only difference here is we’ve replaced discourseEmbedUrl with the id of a topic from Discourse. If you do this, no topic will be created and the comments from that topic will automatically be displayed.

Setting the referrer policy

Due to recent (September 2020) changes to the default referrer policy that is set by many browsers, Discourse now explicitly defaults to setting the iframe’s referrer policy to "no-referrer-when-downgrade". If, for security reasons your site requires a stricter referrer policy, it can be set by adding a discourseReferrerPolicy value to the embed script’s DiscourseEmbed object. For example:

DiscourseEmbed = { discourseUrl: 'https://forum.example.com/',
                                  discourseEmbedUrl: '<your_posts_canonical_URL>',
                                  discourseReferrerPolicy: 'strict-origin-when-cross-origin'};

Programmatically querying the Embed details

We have an API endpoint to query the Embed details using the embed_url as the parameter:

curl 'https://meta.discourse.org/embed/info?embed_url=https://blog.discourse.org/2021/04/discourse-team-grows-to-50' -H 'API-KEY: logapikeygoeshere' -H 'API-USERNAME: apiusernamehere' 

And the response is:

{
  "topic_id": 187794,
  "post_id": 925017,
  "topic_slug": "discourse-team-grows-to-50-blog",
  "comment_count": 2
}

Embedding comments from a private site

For private Discourse instances, if Discourse is on a subdomain of the blog’s domain, comments will be displayed for users who are logged into Discourse. Users who are not logged into Discourse will see a ‘refused to connect’ message. If Discourse and the blog are on completely separate domains, no comments will be displayed for private forums.

Troubleshooting

The most common issue users have when embedding Discourse is setting the correct value for the embeddable hosts you added. Make sure to double check that it is only the domain of your site, and contains no extra slashes or invalid characters.

Last edited by @JammyDodger 2024-05-26T06:44:14Z

Check documentPerform check on document:
117개의 좋아요
Deeply integrating Discourse into website
Is it possible to test Discourse Embed comment on localhost?
Discourse 1.4 Released!
Is it possible to use Discourse as a "commenting system"?
Trouble connecting drupal and discourse
Create topic when a link is clicked
Learning Management Systems
Using Discourse as a comment system
Using Discourse in a web app
Can be integrated with liquid templates?
Discourse blog comments like your blog comments
Comment Reply Threading / Linking on the WordPress Side
Embedded Comments iframe Height
Using Discourse to power comments in an event system or blog?
What is Discourse Blog built with?
Integrating Discourse with a larger social network app?
Anybody using Discourse for Blog Comments on a Gatsby site?
Using Discourse as commenting system via JavaScript: Delay load or load on scroll
Cannot get embedding to work
News Plugin :newspaper:
Use Discourse as the comments section of a Jekyll site?
Embedded topic comments are missing if containing page's URL includes a fragment identifier
Imported topic via embedding will not render normally
What software you use for blog.discourse.org?
Embedded comments not displayed due to X-Frame-Options DENY
Failed to execute postMessage on DOMWindow: The target origin provided does not match
Embedding Discourse сomments with GitBook
"Error Embedding" comments
Shared Discourse/Static Site Login
Discourse + Ghost Blog Integration. Is my Understanding Wrong?
Trying to do embedding. Hit with “The referer did not match any of the following hosts:” issue
Looking for Ruby-based CMS recommendations as a compliment to Discourse
[Paid] Embedding: Allowing one RSS feed and one username per host
Discourse comment-like discussion
Discourse embedding error: Failed to execute postMessage on DOMWindow
Discourse + Ghost integration and SEO
Error Embedding
Hide or remove "Listed/Unlisted" comments when embedded
Display all posts in embedding topics with +100 comments
Embedding Topic topic-map or Topic Summary on Other Site
Wordpress integration by iFrame instead of sync
Not generate topic automatically for all blog posts
Link to Discourse topic without displaying Comments (in Drupal)
Which CMS for Discourse
Understanding how embedding works on remote site
Arguments against integrated intranet solutions?
Embed single discourse Topics to articles on news website
Displaying comments embed as a link without using the WP plugin
Get right title embedding comments
Disqus-like commenting on Wordpress
Embedding Discourse Comments *without* Javascript
How to integrate in discourse in zenodo
Co-author topics
How might we better structure #howto?
Issue with image uploads on embedded topics
Getting Discourse URL on embedded comments
Integrating registered users notifications+avatar into static website
Pandoc integration
Can I use Discourse to add Commenting to my Blogs?
How can I get the list of Discourse Topic IDs dynamically
[Question/Request] Featured image url for post
JS embed fails with "Job exception: invalid stored block lengths (Zlib::DataError)"
No `Referer:`, no embedding
Commenting system: integrate Discourse and Webflow
WP Discourse Embed Plugin
Embedding error
Best option to have category "hidden" on Discourse, but otherwise accessible if you have the link?
Topic list on the right side
Create an empty topic via API
Using Discourse for Comments?
Add button with link post forum
Add button with link post forum
Discourse embed crawls cookie warning text
The Gamification of Discourse
Embedding Discourse comment box to blog page
Pinned topic summary is using first-line link text instead of body text
Nextcloud support
Discourse comment button on blog?
Is there a Disqus like comment implementation?
One Discourse instance, Two Blogs?
Embeddable Discourse activity widget
Blog Post Styling
Integration: Discourse comments in Gitbook
Is it possible to autologin discourse via iframe?
Widget to embed in 3rd party websites
How to customize the text in an embedded post?
Benefits to using WP comments over JS embed?
Benefits to using WP comments over JS embed?
What CSS was used for Comments here?
Setting canonical URL when posting/cross-posting
Embed comments from Discourse in your single page app
Embedded site stuck at "Loading Discussions"
Threaded comments when using Discourse for website comments?
[Update] Simplify embed feature
Does setting the discourseUrl prevent other clients from creating embedded posts for moved pages?
To use Discourse completely on shopify
I'm unsure of how oneboxing is setup for blog posts to Discourse
I'm unsure of how oneboxing is setup for blog posts to Discourse
Embed my Discourse Forum as IFrame
Discourse blog (article and comments)
Most efficient way to use Discourse for comments on Shopify blog posts?
Is the Discourse content markdown toolbar available as a standalone?
Is there a blog plugin for Discourse's meta blog implementations?
Discourse Comments stuck on "Loading..."
Topic Ratings Plugin
Discourse implementation in create react app
Embed forum
BricksForge and Bricks API Query Builder with Discourse
Wordpress posts are now unlisted from latest update of forum and plugin
Most efficient way to use Discourse for comments on Shopify blog posts?
Should Discourse make an effort to become a viable comment platform?
Problem embeding a topic in a page on another domain
Want to set internal forum on our reactjs member's platform
Embed Discourse using external_id
Expose external_id in embed.js
Grow my community
Forbidden error on embed widget
Strapi discourse integration
Migrating embedded topics from topicId to automatic topic creation
Migrating embedded topics from topicId to automatic topic creation
Problem with "Publish as Unlisted Topics"
RSS Polling
Failed to execute 'postMessage' on 'DOMWindow'
Failed to execute 'postMessage' on 'DOMWindow'
RSS plugin default show full post
Is there a Disqus like comment implementation?
Embending topic in 'another' website. And change redirect page after login
Embedding full threads - possible?
How to customize the text in an embedded post?
How to show the latest discussion on the front page of our main website
Embed Most Recent Replies To Post in Specific Category
Is anyone using Discourse in higher ed for courses?
Embed a list of Discourse topics onto an external site
Is Discourse a full website or just a forum add-in?
Is Discourse a full website or just a forum add-in?
Can I send an external URL to the Discourse API for it to return topics linking to that URL?
How to use Discourse API for article forums and independent community spaces
How to Enable Terms of Service and Privacy Policy Pages in Discourse?
Bug with URLs in Embedded Comments
Blog posts would be nicer if authored by an identifiable person
Embed Discourse as a full comment system on your site
Embedded comments dates are still not localized
Embed Discourse as a full comment system on your site
Structuring an active support community migrating from Facebook
Embed Discourse as a full comment system on your site
Where in Discourse can users publicly share PII?
"Show Full Post" button doesn't work in subfolder installations
"Show Full Post" button doesn't work in subfolder installations
Statamic integration
AI sockpuppet accounts to jumpstart my community?
Include 'first post' setting for embeds. (Or better: 'create topic' embed)
Discourse Forum with my Wix website
Reply to comment directly on WordPress vs. Linked to Discourse topic
Embedding Categories in Existing SPA
JavaScript embed won’t display embed, console log shows: Failed to execute postMessage on DOMWindow…
Can i use / embed discourse to make comments on pages hosted for example on Aquia
Emoji are huge when embedding
Set topic title with Discourse Embed
Embedding Discourse Profile via Javascript
WP-discourse: comments are not pulled over
discourseEmbed, does not match recipient window origin
How to embed whole forum in another site
Possible to add comment count (to a Ghost blog)?
How can I delete or undelete topics?
Link existing forum topic to new WordPress post
How to enable Discourse comments via JavaScript in Wordpress?
How to link the existing discourse comments to wordpress posts?
Embed whole forum
WP Discourse Embed Plugin
WP Discourse Embed Plugin
Synchronising log out of discourse when logging out of WordPress
Topic as widget
Discourse a a comment system with React Native and Meteor
A post's TopicEmbed isn't destroyed when the post is deleted
Pages from Google search are not rendering
Controlling amount of embedded text
Zendesk Article Comment in Discourse Integration
Flood of new topics from Embedded Discourse
Discourse topics as Dokuwiki talk pages
Multiple cors origins on hosted discourse?
WordPress / Discourse API Strategy: Get Reply Count via API Efficiently
Error Embedding for existing posts
Making embedded JavaScript based discourse commenting responsive
[paid] Preference to create & embed a topic via JavaScript only when a user clicks the "Start Discussion" link
Embedding: Discussion not showing up for new posts
Allowing WP comments while showing Discourse comments too
Handling large pictures of embedded comments inside jquery window
"Error Embedding" comments

Is it possible to use this method if the Discourse category is hidden from public view?

Probably not, but it might work if all of your viewers are logged in.

I’ve created a tutorial that walks you through the process of setting up a local discourse instance on vagrant for your local tests to embed discourse in your front-end development project. You can find it here: Local discourse: vagrant, ansible, lxd, docker, discourse-embedding

This is different from other descriptions that I found before in that it allows you to run locally a complete discourse set-up like you would do in production to get a feel for the “real” set-up process. In addition this set-up is able to serve as a local development playground for embedding discourse into your project.

2개의 좋아요

안녕하세요, 초안 상태의 포스트에 대해 임베딩을 비활성화하는 방법이 있을까요? Ghost에서 포스트 상태를 위한 핸들바(handlebar)를 찾을 수 없는데, 포스트 미리보기에 사용되는 /p/ 경로를 제외하도록 임베딩 설정을 변경할 수 있을까요? 미리보기로 확인한 포스트가 Discourse에 추가되는 문제가 발생하고 있습니다. 감사합니다.

임베드 iframe 스타일링 설정을 더 이상 찾을 수가 없네요..? 원본 게시물이 어떻게든 구식이 된 건가요?

수정: 아, 그냥 위치가 바뀐 거였네요. 테마 컴포넌트에 추가할 수 있어요 :slight_smile: 감사합니다!

2개의 좋아요

이것은 Discourse의 질문이라기보다 Ghost의 질문으로 보입니다. 하지만 Ghost 연동이 작동하고 있다면, Discourse가 아니라 Ghost 측에서 이를 고려해야 합니다.

3개의 좋아요

안녕하세요 여러분!
READTHEDOCS(Sphinx 사용)에 Discourse를 임베드하는 방법에 대해 도움이 필요합니다.
이런 경험이 있는 분이 계신가요?

1개의 좋아요

항상 단일 토픽을 임베드하는 https://github.com/pdavide/sphinxcontrib-discourse라는 것이 있는 것 같습니다.

6개의 좋아요

답장 주셔서 감사합니다. 확인해 보겠습니다.

여러분 안녕하세요
특정 주제에 임베딩하는 데 문제가 생겨서요:
다양한 설정 변형을 시도해 봤지만 여전히 제 웹사이트에서 ‘Error Embedding’ 오류만 나고 있습니다.
제가 뭘 잘못하고 있는지 눈에 띄는 부분이 있을까요? 작동하게 하려고 정말 오랜 시간 동안 시도했는데, 도움이 되신다면 감사하겠습니다.

웹사이트에 현재 임베딩된 코드

자바스크립트 콘솔에 오류가 있나요?

첫 번째 스크린샷에서 모든 경로가 ‘분류되지 않음’ 카테고리로 게시되도록 설정되어 있습니다. 모든 게시물을 동일한 카테고리에 게시하려면 하나의 임베더블(Embeddable) 호스트 레코드만 생성하면 됩니다.

호스트 항목에 추가한 ‘경로 화이트리스트(Path Whitelist)’ 값이 문제를 일으키고 있을 수 있습니다. 블로그 사이트에 Discourse 임베드 스크립트를 추가한 모든 게시물을 게시하려면 해당 값을 비워 두면 됩니다. 특정 경로의 게시물을 특정 Discourse 카테고리에 게시하려면 경로는 /.*로 끝나야 합니다. 예를 들어 /sites/.*와 같습니다.

/t/newsletter-discussions/105 경로의 시작 부분에 있는 이중 슬래시(//)도 문제가 될 수 있습니다. 또한, 해당 경로는 Discourse 토픽의 경로처럼 보입니다. 설정할 경우, 경로는 블로그에서 게시물이 그룹화된 경로의 경로여야 합니다. ‘경로 화이트리스트’ 설정의 목적은 블로그의 특정 경로에서 게시물을 특정 Discourse 카테고리에 게시할 수 있도록 하는 것입니다.

5개의 좋아요

네, 시몬님 감사합니다. 정말 감사해요. 한번 시도해볼게요.

@codinghorror와 마찬가지로, 저도 Ghost에서 이 Discourse 통합을 사용하고 있습니다. 기본 설정을 따르고 있는데, 이 설정은 절대 URL을 discourseEmbedURL로 사용합니다.

한 주 정도 전에, Ghost 블로그의 라우팅을 변경하기로 결정했습니다. https://engineerworkshop.com/2020/02/20/how-to-set-up-wireguard-on-a-raspberry-pi/와 같은 URL의 게시물이 https://engineerworkshop.com/blog/how-to-set-up-wireguard-on-a-raspberry-pi/로 리다이렉트되도록 변경했으며, https://engineerworkshop.com/blog/how-to-set-up-wireguard-on-a-raspberry-pi/가 새로운 영구 링크(permalink)가 되었습니다.

문제

이로 인해 발생할 수 있는 문제는 이미 예상하셨을 것입니다: discourseEmbedURL은 여전히 구 URL로 설정되어 있기 때문에, 이제 URL이 달라진 임베드 스크립트가 호출될 때 Discourse에서 새로운 댓글 게시물이 생성됩니다.

해결 시도 (실패)

사전에 이 문제를 예상했기 때문에, 정규식 패턴과 remap을 사용하여 URL을 수정하는 것이 교묘한 방법이라고 생각했습니다: rake posts:remap["[0-9]{4}\/[0-9]{2}\/[0-9]{2}","blog",regex]

이 방식이 "어느 정도"는 작동했지만, 불행히도 원래의 Discourse 댓글 게시물에서 URL이 사용된 위치는 그대로였으며, 블로그 게시물을 로드할 때마다 Discourse에서 새로운 댓글 토픽이 생성되었습니다.

결국 사이트의 모든 게시물을 다시 로드하고, 구 토픽의 댓글을 새로운 토픽으로 이동한 뒤 원래 토픽을 삭제했습니다 (아는 사람 다 압니다). 물론 페이지를 삭제하는 것은 SEO에 좋지 않을 뿐만 아니라 사용자 경험에도 해롭습니다.

제 질문

제 정규식 패치 시도가 작동하지 않은 이유는 Discourse 토픽이 백엔드에서 URL에 어떻게든 키(key)가 지정되어 있기 때문이라고 추정합니다. (Discourse의 데이터 구조에 대해 무지하다는 점을 readily 인정합니다). 향후를 위해, 그리고 미래에 동일한 작업을 시도할 수 있는 다른 사람들을 위해, Discourse 토픽을 새로운 블로그 게시물 URL로 재매핑할 수 있는 방법이 있을까요?

미리 감사드립니다!

5개의 좋아요

7개의 게시글이 기존 주제에 병합되었습니다: WP Discourse Embed Plugin

저는 매거진 스타일의 콘텐츠 사이트를 많이 운영하고 있어서 이 기능을 정말 좋아합니다. 이 기능을 통해 포럼으로 주제를 자동으로 생성할 수 있거든요. 그런데 Discourse에서 보통처럼 URL 미리보기가 작동하도록 하는 방법이 있을까요?

즉, 이런 식으로:

이런 식이 아니라:

감사합니다.
짐

3개의 좋아요

링크를 별도의 줄에 단독으로 배치하면 Onebox가 적용됩니다.
그 후 첫 번째 이미지에서 보인 것처럼, 링크를 포함한 설명 전체를 그 아래 줄에 배치하세요. 그러면 Onebox로 표시된 링크 아래에 해당 내용이 나타납니다.

2개의 좋아요

음… 글쎄요, 그게 약간 문제가 됩니다. 페이지 자체가 미리보기되는 대상이거든요. 그래서 페이지 HTML이나 기사 텍스트의 맨 위에 링크를 두는 것은 다소 문제가 됩니다. 해당 페이지는 다음과 같습니다:

https://modelshipwrights.com/news/us-navy-light-cruiser-cl-89-miami

3개의 좋아요

여러분 안녕하세요. 거의 작동하도록 만들었는데, 제가 생각했던 사용 사례가 기대했던 것만큼 단순하지 않을 것 같다는 걸 깨달았고, 추가적으로 얼마나 많은 작업이 필요한지 확실하지 않습니다.

이 기능을 이용해 사용자 생성 콘텐츠 기반 사이트에서 토론을 활성화하는 것이 목표입니다. 댓글 임베딩이나 SSO 설정, 그리고 내 사이트의 사용자가 동일한 이메일, 사용자명 등으로 커뮤니티 멤버로 자동 생성되는 부분에는 문제가 없습니다.

제가 바라는 것은, 내 사이트에서 새로운 사용자 콘텐츠가 생성될 때, 해당 콘텐츠를 게시한 사용자가 관련 Discourse 게시글의 작성자로 표시되기를 원하는 것입니다. 임베딩 기능의 “토픽 생성 시 사용자명” 설정에서 정의된 단일 사용자가 아닌, 실제 게시한 사용자가 말입니다. 현재 가입 프로세스 외에는 가입을 허용하지 않으므로, 새 스레드를 생성하는 시점에 해당 Discourse 사용자가 이미 존재하거나, 최소한 그때 생성될 수 있다는 것을 100% 확신할 수 있습니다.

왜 이렇게 하고 싶은지 이해하시리라 믿습니다. 즉, 콘텐츠 작성자가 내 Discourse 사이트에서 해당 토론의 OP(첫 번째 게시자)가 되어 스레드에 자동 구독되고, 답글을 알림받으며, 다른 댓글과 구별되도록 내 게시글이 강조 표시되는 등의 효과를 얻고 싶기 때문입니다.

어디서부터 시작해야 할지 조언을 주실 수 있을까요?

감사합니다!

3개의 좋아요