<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jeremy Panjaitan</title>
    <description>The latest articles on DEV Community by Jeremy Panjaitan (@jeremypanjaitan).</description>
    <link>https://dev.to/jeremypanjaitan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F521061%2F8467193b-8b35-4644-bab4-010de18cc8af.png</url>
      <title>DEV Community: Jeremy Panjaitan</title>
      <link>https://dev.to/jeremypanjaitan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jeremypanjaitan"/>
    <language>en</language>
    <item>
      <title>Backend Framework-Independent Concepts: A Guide for Modern Developers</title>
      <dc:creator>Jeremy Panjaitan</dc:creator>
      <pubDate>Wed, 28 May 2025 15:26:02 +0000</pubDate>
      <link>https://dev.to/jeremypanjaitan/backend-framework-independent-concepts-a-guide-for-modern-developers-121k</link>
      <guid>https://dev.to/jeremypanjaitan/backend-framework-independent-concepts-a-guide-for-modern-developers-121k</guid>
      <description>&lt;p&gt;In the world of software development, backend engineers often find themselves switching between frameworks - NestJS, Express, Spring Boot, Django, and more. However, beyond framework-specific syntax and tooling, there exists a set of universal backend principles that every backend developer should master. These principles are foundational and apply regardless of the language or stack you are using.&lt;br&gt;
In this article, we'll explore the most important backend framework-independent concepts that help ensure scalable, maintainable, and secure systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layered Architecture
&lt;/h2&gt;

&lt;p&gt;A good backend system separates concerns using a layered structure. Typical layers include : &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Controller Layer&lt;/strong&gt;: Handles HTTP requests and responses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Service Layer&lt;/strong&gt;: Contains business logic and core processing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Repository/Data Access Layer&lt;/strong&gt;: Interacts with the database.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This structure promotes modularity, reusability, and testability.&lt;/p&gt;

&lt;h2&gt;
  
  
  RESTful API Design
&lt;/h2&gt;

&lt;p&gt;REST (Representational State Transfer) is the most common architectural style for designing APIs. Key principles include :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Using HTTP verbs correctly (GET, POST, PUT, DELETE).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Designing intuitive URIs (e.g.,/users/123)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Returning meaningful HTTP status codes (200 OK, 400 Bad Request, 404 Not Found, etc.) &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Resources :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/architecture/best-practices/api-design" rel="noopener noreferrer"&gt;API Design Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/news/rest-api-best-practices-rest-endpoint-design-examples/" rel="noopener noreferrer"&gt;REST API Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Authentication &amp;amp; Authorization
&lt;/h2&gt;

&lt;p&gt;Security is a non-negotiable part of any backend system :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt; verifies who the user is (e.g, JWT, OAuth, API Keys).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorization&lt;/strong&gt; defines what the authenticated user is allowed to do (e.g., Role-Based Access Control).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Proper implementation ensures that sensitive data and operations are protected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Error Handling &amp;amp; Logging
&lt;/h2&gt;

&lt;p&gt;Consistent error handling improves user experience and developer productivity :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Centralized error handling logic to avoid repetition.&lt;/li&gt;
&lt;li&gt;Standardized error response formats (e.g., error code and messages).&lt;/li&gt;
&lt;li&gt;Structured loggin (JSON logs, correlation IDs) for observability and debugging.
Tools like Winston, Morgan, or Logback can help with log management.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Environment Configuration
&lt;/h2&gt;

&lt;p&gt;A robust system externalizes configuration using environment variables. Benefits include :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Easy switch between development, staging, and production&lt;/li&gt;
&lt;li&gt;Secrets and credentials are not hardcoded in the codebase.
Tools like dotenv (.env) files help manage environment-specific settings.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Database Abstraction
&lt;/h2&gt;

&lt;p&gt;Direct SQL is powerful but can be error-prone and hard to maintain. Using an ORM or query builder provides :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reusable models and relations&lt;/li&gt;
&lt;li&gt;Easier migrations&lt;/li&gt;
&lt;li&gt;Transaction support&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Caching
&lt;/h2&gt;

&lt;p&gt;Caching can significantly improve performance&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use tools like Redis or Memcached.&lt;/li&gt;
&lt;li&gt;Decide between strategies like TTL (time to live), LRU (least recently used), and manual invalidation.
Just be careful: caching adds complexity and must be invalidated correctly.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Background Jobs &amp;amp; Scheduled Tasks
&lt;/h2&gt;

&lt;p&gt;Not every task belongs in a request-response cycle.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use job queues (e.g., Bull, Celery) for heavy processing.&lt;/li&gt;
&lt;li&gt;Decide between strategies like TTL (time to live), LRU (last recently used), and manual invalidation.
Just be careful: caching adds complexity and must be invalidated correctly.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Dependency Injection (DI)
&lt;/h2&gt;

&lt;p&gt;DI makes your code more modular and testable :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Don't instantiate dependencies directly.&lt;/li&gt;
&lt;li&gt;Inject them from outside (via constructor, function args, or DI container).
This principle leads to decoupled code that's easier to mock and test.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  API Documentation
&lt;/h2&gt;

&lt;p&gt;A well-documented API is a joy to work with :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use Swagger/OpenAPI for interactive docs.&lt;/li&gt;
&lt;li&gt;Maintain a Postman collection for collaborating with frontend or third parties.
Documentation isn't optional - it's part of your API.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Testing
&lt;/h2&gt;

&lt;p&gt;You can't ship quality software without tests:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Unit tests for individual functions and services&lt;/li&gt;
&lt;li&gt;Integration tests for multi-component logic&lt;/li&gt;
&lt;li&gt;End-to-end tests for real-world scenarios
Investing in tests pays off in confidence and velocity.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Security Best Practices
&lt;/h2&gt;

&lt;p&gt;Security must be baked in from the start &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Always validate and sanitize inputs&lt;/li&gt;
&lt;li&gt;Avoid common attacks: SQL Injection, XSS, CSRF&lt;/li&gt;
&lt;li&gt;Use HTTPS, rate limiting, and secure headers.
Good security protects your users and your reputation.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  CI/CD Automation
&lt;/h2&gt;

&lt;p&gt;Continuous Integration/Deployment keeps teams moving fast:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Automate tests, linting, and builds.&lt;/li&gt;
&lt;li&gt;Use pipelines to deploy with confidence.&lt;/li&gt;
&lt;li&gt;Include rollback strategies in case things go wrong.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Observability
&lt;/h2&gt;

&lt;p&gt;Monitoring is more than just logging :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Logs: For tracing actions and debugging.&lt;/li&gt;
&lt;li&gt;Metrics: For performance (CPU, memory, latency).&lt;/li&gt;
&lt;li&gt;Tracing: For understanding complex, multi-service flows.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Use tools like Datadog, Prometheus, and Grafana to gain visibility into your systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scalability
&lt;/h2&gt;

&lt;p&gt;As your system grows, so should your architecture :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Design stateless services that can scale horizontally.&lt;/li&gt;
&lt;li&gt;Use load balancers and autoscaling.&lt;/li&gt;
&lt;li&gt;Think about sharding, partitioning, and message queues when necessary. 
Scalability is a mindset, not just a techincal feature.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Frameworks come and go, but these concepts form the foundation of backend engineering. Mastering them will help you write better code, build more robust systems, and collaborate more effectively with other developers.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>backenddevelopment</category>
    </item>
    <item>
      <title>How prepared statement prevent SQL Injection ?</title>
      <dc:creator>Jeremy Panjaitan</dc:creator>
      <pubDate>Sun, 09 Jan 2022 12:47:00 +0000</pubDate>
      <link>https://dev.to/jeremypanjaitan/how-prepared-statement-prevent-sql-injection--5bh8</link>
      <guid>https://dev.to/jeremypanjaitan/how-prepared-statement-prevent-sql-injection--5bh8</guid>
      <description>&lt;h2&gt;
  
  
  Motivation
&lt;/h2&gt;

&lt;p&gt;Have you ever heard about sql injection ?. For the nutshell sql injection performed by user/client by &lt;em&gt;injecting additional sql query to gain access to your system that you built&lt;/em&gt;. consider you have a database table with 2 field username and password to authenticate user to login into you system. You also provide a backend to query the user's data to database and then you construct string query like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sql := fmt.Sprintf("SELECT * FROM users WHERE username = '%s' AND password = '%s'", username, password)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with this query, the system will be hacked by an irresponsible person.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to prevent using prepared statement ?
&lt;/h2&gt;

&lt;p&gt;let say that an irresponsible user send username = &lt;code&gt;user' or '1' = '1&lt;/code&gt; and password = &lt;code&gt;pass' or '1' = '1&lt;/code&gt;. The result of concatenation of that sql query will be.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM users WHERE username = 'user' or '1' = '1' AND password = 'pass' or '1' = '1'"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What ever username and password that user will be passed to backend always makes that query resulting success.&lt;br&gt;
So to avoid this, we need to use prepared statement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stmt, err := db.Prepare(`SELECT * FROM users WHERE username=? AND password=?`)
row = stmt.QueryRow(username, password)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Prepared statement will treat the username and password input always as an argument not as a query statement&lt;/em&gt;. So the user password is literally &lt;code&gt;pass' or '1' = '1&lt;/code&gt;. Prepared statement will pre compiled the string query with the placeholder. Then the argument will be placed later on when you are using that precompiled prepared statement.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>security</category>
      <category>sql</category>
      <category>go</category>
    </item>
    <item>
      <title>Is anybody has project ideas for realtime app ?</title>
      <dc:creator>Jeremy Panjaitan</dc:creator>
      <pubDate>Wed, 17 Mar 2021 04:58:25 +0000</pubDate>
      <link>https://dev.to/jeremypanjaitan/is-anybody-has-project-ideas-for-realtime-app-42a</link>
      <guid>https://dev.to/jeremypanjaitan/is-anybody-has-project-ideas-for-realtime-app-42a</guid>
      <description>&lt;p&gt;Currently studying django channels. It is a library that enable django for realtime app. Any ideas for project realtime app ?&lt;/p&gt;

</description>
    </item>
    <item>
      <title>SSR vs CSR</title>
      <dc:creator>Jeremy Panjaitan</dc:creator>
      <pubDate>Wed, 23 Dec 2020 02:16:45 +0000</pubDate>
      <link>https://dev.to/jeremypanjaitan/ssr-vs-csr-2617</link>
      <guid>https://dev.to/jeremypanjaitan/ssr-vs-csr-2617</guid>
      <description>&lt;h1&gt;
  
  
  SSR vs CSR
&lt;/h1&gt;

&lt;p&gt;in this article, I want to share with you the difference between server-side rendering(SSR) and client-side rendering(CSR). knowing the difference between those two things is very important, especially when you are developing on the web. first of all, I will explain the definition of SSR and CSR, then I will cover the difference between them, and for the last, what kind of circumstances are suitable for each.&lt;/p&gt;

&lt;h2&gt;
  
  
  what is SSR ?
&lt;/h2&gt;

&lt;p&gt;SSR stands for server-side rendering. it is the ability of a web application to render the web page on the server instead of rendering it in the browser. when the page arrived on the client-side, it is fully rendered. it is because the server-side has fully rendered the page before it was sent by the server to the client. when the request is received on the server-side, it will compile everything, if the content of the page needed data from the database, the server will do that, then render the data into the fully rendered page and then send it to the client as the response. now, what if the client navigates to a different route? every time the client navigates to a different route, the server will do the work all over again. &lt;/p&gt;

&lt;h2&gt;
  
  
  what is CSR ?
&lt;/h2&gt;

&lt;p&gt;CSR stands for client-side rendering. overall, CSR is the opposite of SSR. If the SSR renders the page on the server-side, CSR renders the page on the client-side. when the request is received on the server, it will not render the page, instead, the server will send a single page that will be the skeleton of the page to the client. the server sends the page along with the javascript file. later, the js will turn the page into a fully rendered page. so where is the content? what if the page needs to take data from the database? Then, the api comes in. the client will make a request to the api to take the data and then render it to the page. Lastly, what if the client navigates to a different route? do the server will send the page again ? the server will not send the page again, instead, the client will re-render the page according to the route that client requested. so the page that is used, is always the same page as the first request.&lt;/p&gt;

&lt;h2&gt;
  
  
  the difference
&lt;/h2&gt;

&lt;p&gt;the main difference between CSR and SSR is where the page is rendered. SSR renders the page on the server-side and CSR renders the page on the client-side. Client-side manages the routing dynamically without refreshing the page every time the client requests a different route.&lt;/p&gt;

&lt;h2&gt;
  
  
  use SSR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;if SEO is your priority, typically when you are building a blog site and you want everyone who searching on google go to your website, then SSR is your choice.&lt;/li&gt;
&lt;li&gt;if your website needs a faster initial loading.&lt;/li&gt;
&lt;li&gt;if the content of your website doesn't need much user interaction.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  use CSR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;when SEO is not your priority&lt;/li&gt;
&lt;li&gt;if your site has rich interactions&lt;/li&gt;
&lt;li&gt;if you are building a web application&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title># Asynchronous vs Synchronous in javascript</title>
      <dc:creator>Jeremy Panjaitan</dc:creator>
      <pubDate>Thu, 10 Dec 2020 10:53:42 +0000</pubDate>
      <link>https://dev.to/jeremypanjaitan/asynchronous-vs-synchronous-in-javascript-1gc6</link>
      <guid>https://dev.to/jeremypanjaitan/asynchronous-vs-synchronous-in-javascript-1gc6</guid>
      <description>&lt;p&gt;synchronous and asynchronous are very confusing concepts in javascript programming language especially for the beginners. for me it will took very long time to understand those two concepts. in this article i will share with you the difference between asynchronous and synchronous in javascript. is it one better than the other ? &lt;/p&gt;

&lt;h2&gt;
  
  
  what is synchronous ?
&lt;/h2&gt;

&lt;p&gt;synchronous means that if you execute some code, it will be executed the code line by line. javascript uses single threaded and also uses synchronous execution model. single thread means that one statement is being executed at a time. so in javascript one thing is happening at a time. take a look of this code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;first statement&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;second statement&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;third statement&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result will be :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;first statement 
second statement 
third statement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;as we can see, the statement was executed line by line. &lt;/p&gt;

&lt;h2&gt;
  
  
  what is asynchronous ?
&lt;/h2&gt;

&lt;p&gt;asynchronous is the opposite of synchronous. Each statement will not wait for the previous statement to finish before executing the next statement. there are many examples of asynchronous such as promises, async/await, setTimeout function, and setInterval function. but in this article i will stick to the basic example. just for the basic understanding. consider these lines of code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;foo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;guess which console.log will be executed first...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bar
//wait for 4 seconds
foo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;as you can see the second statement was executed first. in this example setTimeout is non-blocking, because it didn't block the execution of the second statement.&lt;/p&gt;

&lt;p&gt;now, which one is better ? does one of them is better compare to the other ? &lt;/p&gt;

&lt;p&gt;actually there is none of them is better compare to the other. each of them suited for specific use cases. generally in web development asynchronous is used when making a request to the api, when doing a task that will be finished later. synchronous is used when we need to execute the code sequently&lt;/p&gt;

&lt;p&gt;that's all for this article. thank you for reading to my first article. leave a comment if i have wrong understanding about this concept. thank you&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
