<?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: Dongdiri96</title>
    <description>The latest articles on DEV Community by Dongdiri96 (@dongdiri96).</description>
    <link>https://dev.to/dongdiri96</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%2F1758540%2F59b25ee3-e4bb-47f1-9d8c-1a5e17232acf.png</url>
      <title>DEV Community: Dongdiri96</title>
      <link>https://dev.to/dongdiri96</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dongdiri96"/>
    <language>en</language>
    <item>
      <title>Final Application on Website</title>
      <dc:creator>Dongdiri96</dc:creator>
      <pubDate>Thu, 08 Aug 2024 07:02:17 +0000</pubDate>
      <link>https://dev.to/dongdiri96/final-application-on-website-583f</link>
      <guid>https://dev.to/dongdiri96/final-application-on-website-583f</guid>
      <description>&lt;p&gt;7/29~7/31 &lt;br&gt;
I re-created my main page design on Figma on a webpage using Javascript code. I studied tailwind and CSS myself to complete this task. The following is the product I ended up with on July 31st. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flz1208t5s0xog3bayj5x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flz1208t5s0xog3bayj5x.png" alt="Image description" width="616" height="728"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxnprhuzopswfbn4fc56d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxnprhuzopswfbn4fc56d.png" alt="Image description" width="616" height="728"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main function I used was the &lt;code&gt;.map()&lt;/code&gt; function, with which I iterated a design code for every item in a dataset. These are the codes I have written for each subsection of the website. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Banner&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhuwv9z6bo9mduvu0gnaj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhuwv9z6bo9mduvu0gnaj.png" alt="Image description" width="616" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9ub2nnea8vbwlymvrtn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9ub2nnea8vbwlymvrtn.png" alt="Image description" width="800" height="655"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8nhejbr6bf6qb4cqldw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8nhejbr6bf6qb4cqldw.png" alt="Image description" width="800" height="655"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clean Code Principles and Example Codes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjysm8js74p2jazwetooa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjysm8js74p2jazwetooa.png" alt="Image description" width="616" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffi8vfgoukqmacj84gjge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffi8vfgoukqmacj84gjge.png" alt="Image description" width="800" height="855"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz4mvbvkmu91vzpdefgcs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz4mvbvkmu91vzpdefgcs.png" alt="Image description" width="800" height="855"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgumjnswu5ftm9ehjns6h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgumjnswu5ftm9ehjns6h.png" alt="Image description" width="800" height="855"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SOLID principle&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7hyhh8elfuzvc8ov4c1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7hyhh8elfuzvc8ov4c1.png" alt="Image description" width="616" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1w4qp1ab0yd5e92m5uz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1w4qp1ab0yd5e92m5uz.png" alt="Image description" width="800" height="855"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpzk9m4vtfmgr9u5k5rux.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpzk9m4vtfmgr9u5k5rux.png" alt="Image description" width="800" height="855"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Static/Dynamic Code Analyses&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2x9uun298j2bv4gwci7k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2x9uun298j2bv4gwci7k.png" alt="Image description" width="616" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmt1rmh961ogxpdk6zn43.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmt1rmh961ogxpdk6zn43.png" alt="Image description" width="800" height="855"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi2g1ja23t07naxnbq2ql.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi2g1ja23t07naxnbq2ql.png" alt="Image description" width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reflection&lt;/strong&gt;&lt;br&gt;
During my internship at WeLabs for the past few weeks, I had the opportunity to learn the holistic process of web development. I learned the principles of clean code, which is of utmost importance in the current era of AI. I also learned what elements should be in a website, how to make an effective wireframe and storyboard, and finally, how to implement the plans using computer language.&lt;br&gt;
I faced challenges in a fast-paced environment with a limited amount of time, but by seeking and collaborating closely with my team, I was able to overcome these challenges. &lt;br&gt;
Personally, I gained some confidence in my ability to manage multiple tasks and meet tight deadlines. This internship has also solidified my interest in computers and the web, as I found the work both stimulating and rewarding.&lt;br&gt;
Looking ahead, I plan to incorporate this experience with my knowledge about the backend (like Python) to refine my abilities as a full-stack developer. I want to thank everybody in WeLabs who allowed me to have this wonderful experience. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Wireframe, Figma, and Javascript</title>
      <dc:creator>Dongdiri96</dc:creator>
      <pubDate>Sat, 27 Jul 2024 14:52:19 +0000</pubDate>
      <link>https://dev.to/dongdiri96/wireframe-figma-and-javascript-47l5</link>
      <guid>https://dev.to/dongdiri96/wireframe-figma-and-javascript-47l5</guid>
      <description>&lt;p&gt;7/22~25&lt;br&gt;
I re-created what I had in my wireframe in Figma.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqafes8xkonse1x6nkc5e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqafes8xkonse1x6nkc5e.png" alt="Image description" width="800" height="679"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Javascript</title>
      <dc:creator>Dongdiri96</dc:creator>
      <pubDate>Sun, 21 Jul 2024 14:27:16 +0000</pubDate>
      <link>https://dev.to/dongdiri96/javascript-2jp4</link>
      <guid>https://dev.to/dongdiri96/javascript-2jp4</guid>
      <description>&lt;p&gt;&lt;strong&gt;Javascript basics&lt;/strong&gt;&lt;br&gt;
7/21&lt;br&gt;
Today I started to study Javascript through videos online. I learned: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;terminate syntax &lt;code&gt;;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;console.log()&lt;/code&gt; function&lt;/li&gt;
&lt;li&gt;variables with &lt;code&gt;let&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;objects (basically a dictionary)&lt;/li&gt;
&lt;li&gt;arrays (length dynamic, datatype flexible)&lt;/li&gt;
&lt;li&gt;functions 
I will continue to study to actually program the website next week. Can't wait. 
&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4crd28i9rduc7rlrtre.png" alt="Image description" width="800" height="655"&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Figma and Wireframe</title>
      <dc:creator>Dongdiri96</dc:creator>
      <pubDate>Sun, 21 Jul 2024 14:26:36 +0000</pubDate>
      <link>https://dev.to/dongdiri96/figma-and-wireframe-bai</link>
      <guid>https://dev.to/dongdiri96/figma-and-wireframe-bai</guid>
      <description>&lt;p&gt;&lt;strong&gt;Figma&lt;/strong&gt;&lt;br&gt;
7/16~7/17&lt;br&gt;
I studied basic Figma through a YouTube video. I struggled with the proper use of auto layout. I will use Figma to design wireframe. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wireframe&lt;/strong&gt;&lt;br&gt;
7/18&lt;br&gt;
Today I was given a task of structuring a wireframe of the webpage we are going to launch. I was also asked to add some more things to the SRS, like defining how clients can request for webIDE use or how the host can manage port numbers. &lt;/p&gt;

&lt;p&gt;refined version of SRS. &lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjzs8bx9jl809s5ik2ur.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjzs8bx9jl809s5ik2ur.png" alt="Image description" width="800" height="437"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7nyqbd8xt468b4lzouf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7nyqbd8xt468b4lzouf.png" alt="Image description" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7/19&lt;br&gt;
I continued to work on creating the wireframe.&lt;br&gt;
A few of the slides I've created: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa2bkn38lz0m603p53q57.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa2bkn38lz0m603p53q57.png" alt="Image description" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fklz4fqbwknmk70gkr8j6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fklz4fqbwknmk70gkr8j6.png" alt="Image description" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3s5h721dthxszeif8987.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3s5h721dthxszeif8987.png" alt="Image description" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Flowchart, SRS, and Slack</title>
      <dc:creator>Dongdiri96</dc:creator>
      <pubDate>Mon, 15 Jul 2024 08:41:04 +0000</pubDate>
      <link>https://dev.to/dongdiri96/flowchart-srs-and-slack-3cjf</link>
      <guid>https://dev.to/dongdiri96/flowchart-srs-and-slack-3cjf</guid>
      <description>&lt;p&gt;&lt;strong&gt;7/15 internship journal&lt;/strong&gt;&lt;br&gt;
Today I tried to understand what SRS is and started to write it for our own project. To do this, I learned about flowcharts and made a simple one of my own for the project we were working on. Also, I learned how to use Slack, a developer software for better communication. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;flowchart&lt;/strong&gt;&lt;br&gt;
flowchart: 프로세스의 단계를 보여주는 다이어그램&lt;br&gt;
필요한 이유: 개발자가 전체 구조를 빠르게 파악할 수 있고 누락된 프로세스가 없는지 검사할 수 있음.&lt;br&gt;
정의서를 쓰기 전에 클라이언트가 할 수 있는 행동을 정리하는 것이 좋다고 해서 로그인 프로세스에 대한 플로우 차트를 작성해 보았음&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5pq38te4g9yu4nih1y25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5pq38te4g9yu4nih1y25.png" alt="Image description" width="684" height="1016"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SRS (Software Requirements Specification)&lt;/strong&gt;&lt;br&gt;
요구사항 정의서: 서비스의 기능을 정리해서 보여주는 문서 &lt;br&gt;
필요한 이유: 보통 개발 회사에 의뢰를 할 때 무엇을 원하는지 확실하게 하기 위해 작성됨. 사전에 개발할 내용을 명확히 하여, 프로젝트가 진행되었을 때 추가적인 개발 비용과 분쟁 확률을 대폭 낮출 수 있기 때문에 중요 &lt;br&gt;
기본양식:&lt;br&gt;
요구사항 ID, 요구사항명, 상세 설명, 요청자 등&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Futcft0gkznbomd32ue69.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Futcft0gkznbomd32ue69.png" alt="Image description" width="800" height="430"&gt;&lt;/a&gt;&lt;br&gt;
출처:&lt;a href="https://brunch.co.kr/@toqha7822/15" rel="noopener noreferrer"&gt;https://brunch.co.kr/@toqha7822/15&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8e3n5trqeoylore3pox.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8e3n5trqeoylore3pox.png" alt="Image description" width="268" height="188"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;클린 코드 서비스 웹사이트를 위한 간단한 요구사항 정의서를 작성해 보았음. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5sc6v77f9cnk969u2g80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5sc6v77f9cnk969u2g80.png" alt="Image description" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgctkhktemh619dvf5tto.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgctkhktemh619dvf5tto.png" alt="Image description" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;계속해서 추가해 나갈 예정&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slack 사용법&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;질문 올릴 때 [제목] 달아서 주제 확실히 하기&lt;/li&gt;
&lt;li&gt;채널 또는 다른 사람 호출하기&lt;/li&gt;
&lt;li&gt;스레드 기능 활용하기
&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3bb4d4wjstkfuue3zfjc.png" alt="Image description" width="538" height="670"&gt;
이런 식으로 올려서 나중에 정리 가능 &lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Static/dynamic code analysis</title>
      <dc:creator>Dongdiri96</dc:creator>
      <pubDate>Mon, 15 Jul 2024 05:43:42 +0000</pubDate>
      <link>https://dev.to/dongdiri96/staticdynamic-code-analysis-3o47</link>
      <guid>https://dev.to/dongdiri96/staticdynamic-code-analysis-3o47</guid>
      <description>&lt;p&gt;&lt;strong&gt;Internship Journal&lt;/strong&gt;&lt;br&gt;
7/12&lt;br&gt;
Today I researched and wrote about static and dynamic code analyses, and what specific programs are required for each method. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;정적 코드 분석&lt;/strong&gt;&lt;br&gt;
정적 코드 분석(Static Code Analysis)은 소프트웨어의 실제 소스코드를 실행하지 않고 분석하는 방법을 말합니다. 버그 뿐만 아니라 중복되거나 표준을 준수하지 않은 코드를 발견하고 수정할 수 있는데, 비용이 적게 든다는 장점이 있습니다. 대규모 팀 프로젝트를 진행할 때는 문서를 검토하고 회의를 거쳐야 하지만, 그게 아니라면 SonarLint, SonarQube 등의 프로그램의 도움을 받을 수 있어요. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6djfov35rosepjyn56mw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6djfov35rosepjyn56mw.png" alt="Image description" width="800" height="509"&gt;&lt;/a&gt;&lt;br&gt;
SonarLint&lt;br&gt;
출처:&lt;a href="https://jiwondev.tistory.com/160" rel="noopener noreferrer"&gt;https://jiwondev.tistory.com/160&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;동적 코드 분석&lt;/strong&gt;&lt;br&gt;
동적 코드 분석(Dynamic Code Analysis)은 코드를 실행해서 소프트웨어 시스템의 동작을 검사하는 방식으로, 결함을 방지하기보다는 개발 단계 이후에 직접 찾는 것에 집중합니다. 또, 코드의 실행 시간, CPU 사용량, 보안 취약점 등 시스템의 전반적인 성능을 검토합니다. Process Monitor, Process explorer 등의 프로그램을 통해 동적 분석을 할 수 있어요.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0xlujf0d6guv9ks9m35c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0xlujf0d6guv9ks9m35c.png" alt="Image description" width="592" height="393"&gt;&lt;/a&gt;&lt;br&gt;
process monitor&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8xbkquewuct3xzzwft7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8xbkquewuct3xzzwft7.png" alt="Image description" width="800" height="836"&gt;&lt;/a&gt;&lt;br&gt;
process explorer &lt;br&gt;
출처: &lt;a href="https://hxxyxxn-1238.tistory.com/72" rel="noopener noreferrer"&gt;https://hxxyxxn-1238.tistory.com/72&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Clean Coding research</title>
      <dc:creator>Dongdiri96</dc:creator>
      <pubDate>Wed, 10 Jul 2024 10:33:52 +0000</pubDate>
      <link>https://dev.to/dongdiri96/clean-coding-1787</link>
      <guid>https://dev.to/dongdiri96/clean-coding-1787</guid>
      <description>&lt;p&gt;&lt;strong&gt;Jul 10th Internship journal:&lt;/strong&gt; &lt;br&gt;
Today, I researched about the basic concepts of clean coding, a term that refers to the code format with high readability and efficiency. The team could potentially use this introductory information for designing the website we will create. For better understanding, I tried to read Robert C. Martin’s original book. However, with a lack of background knowledge, the later parts–like data structures, boundaries, and unit tests–were hard to grasp, and thus could not be included in the summary. I felt the vital need to do further research to effectively contribute to the project. &lt;br&gt;
&lt;strong&gt;Jul 12th&lt;/strong&gt;&lt;br&gt;
Today I researched about static program analysis and looked at some example programs that help this.&lt;/p&gt;
&lt;h2&gt;
  
  
  클린 코드란?
&lt;/h2&gt;

&lt;p&gt;클린 코드는 미국의 프로그래머 Robert C. Martin이 그의 책에서 사용한 용어로, 명확하고 간결하여 이해하기 쉬운 코드를 의미합니다. 이는 코드의 가독성, 유지 보수성, 효율성을 높여주기 때문에 소프트웨어 개발에서 매우 중요한 개념입니다.&lt;/p&gt;
&lt;h2&gt;
  
  
  왜 클린 코드가 필요한가요?
&lt;/h2&gt;

&lt;p&gt;다른 사람들이 코드를 쉽게 이해하고 수정할 수 있기 때문에 팀워크가 원활하고 효과적으로 이루어집니다. 또한, 코드를 이해하기 쉬우면 버그를 훨씬 더 쉽게 찾고 수정할 수 있습니다. 따라서 장기적으로 봤을 때 많은 개발 비용을 절감할 수 있으며, 팀의 생산성을 크게 향상시킵니다.&lt;/p&gt;
&lt;h2&gt;
  
  
  클린코딩의 원칙
&lt;/h2&gt;

&lt;p&gt;클린 코딩의 원칙들을 간단한 예시와 함께 몇 가지만 살펴 보겠습니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.이름을 정확하게 지어라&lt;/strong&gt;&lt;br&gt;
변수, 함수,또는 클래스의 이름을 통해 왜 존재 이유와 역할을 정확히 알 수 있어야 합니다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def c(a, b):
    s = 0
    for i in range(a, b + 1):
        s += i
    return s

x = 1
y = 10
result = c(x, y)
print(result)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def calculate_sum_of_range(start, end):
    total_sum = 0
    for number in range(start, end + 1):
        total_sum += number
    return total_sum

start_number = 1
end_number = 10
sum_result = calculate_sum_of_range(start_number, end_number)
print(sum_result)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;위의 코드보다는 아래의 코드가 훨씬 이해하기 쉬운데, 이는 메서드와 변수들의 이름을 통해 그 역할과 존재 의의를 명확하게 정의해 주었기 때문이죠.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.함수는 간단하게 하라&lt;/strong&gt;&lt;br&gt;
함수는 단 하나의 기능만 수행해야 해요. 길이가 20줄 이상을 넘어가지 않는 것을 권장합니다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def process_data(data):
    filtered_data = [item for item in data if item['value'] &amp;gt; 10]

    sorted_data = sorted(filtered_data, key=lambda x: x['value'])

    transformed_data = [{'id': item['id'], 'value': item['value'] * 2} for item in sorted_data]

    for item in transformed_data:
        print(f"ID: {item['id']}, Value: {item['value']}")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;이 함수는 무려 4개의 기능을 수행하는데, 각각의 기능을 다른 함수 안에 넣어야 합니다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def filter_data(data, threshold):
    return [item for item in data if item['value'] &amp;gt; threshold]

def sort_data(data):
    return sorted(data, key=lambda x: x['value'])

def transform_data(data):
    return [{'id': item['id'], 'value': item['value'] * 2} for item in data]

def print_data(data):
    for item in data:
        print(f"ID: {item['id']}, Value: {item['value']}")

# Main function to process the data using the smaller functions
def process_data(data, threshold=10):
    filtered_data = filter_data(data, threshold)
    sorted_data = sort_data(filtered_data)
    transformed_data = transform_data(sorted_data)
    print_data(transformed_data)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3.코멘트를 남발하지 마라&lt;/strong&gt;&lt;br&gt;
코멘트는 저작권을 표기하거나, 이해하기 어려운 함수를 설명하거나, 의도를 밝히거나, 경고성 문구가 아니라면 쓰지 마세요.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Returns an instance of the Responder being tested.
protected abstract Responder responderInstance();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Don't run unless you
// have some time to kill.
public void _testWithReallyBigFile() {
writeLinesToFile(10000000);
response.setBody(testFile);
response.readyToSend(this);
String responseString = output.toString(); assertSubString("Content-Length: 1000000000", responseString); assertTrue(bytesSent &amp;gt; 1000000000);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;위 코드에는 설명을 위한, 아래 코드에는 경고를 위한 코멘트가 달려 있습니다. 이런 코멘트들이 좋다고 할 수 있어요.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.구조를 깔끔히 하라&lt;/strong&gt;&lt;br&gt;
책에서는 수직/수평 구조에 대해서 설명합니다. 세로로는 코드를 신문처럼 중요도에 따라서 위-아래로 정렬하고, 사용처에서 가장 가까운 곳에 변수를 정의해야 합니다. 또 가로로는 코드가 화면을 벗어나지 않게 하고, 짧든 길든 항상 들여쓰기를 해야 클린한 코드가 됩니다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import java.util.regex.*;
public class BoldWidget extends ParentWidget {
public static final String REGEXP = “‘’’.+?’’’”;
private static final Pattern pattern = Pattern.compile(“‘’’(.+?)’’’”,
Pattern.MULTILINE + Pattern.DOTALL);
public BoldWidget(ParentWidget parent, String text) throws Exception {
super(parent);
Matcher match = pattern.matcher(text); match.find(); addChildWidgets(match.group(1));}
public String render() throws Exception { StringBuffer html = new StringBuffer(“&amp;lt;b&amp;gt;”); html.append(childHtml()).append(“&amp;lt;/b&amp;gt;”); return html.toString();
} }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package fitnesse.wikitext.widgets;
import java.util.regex.*;
public class BoldWidget extends ParentWidget {
   public static final String REGEXP = "'''.+?'''";
   private static final Pattern pattern = 
   Pattern.compile("'''(.+?)'''",
   Pattern.MULTILINE + Pattern.DOTALL 
);
public BoldWidget(ParentWidget parent, String text) throws Exception { 
   super(parent);
   Matcher match = pattern.matcher(text);
   match.find();
   addChildWidgets(match.group(1)); 
} 
public String render() throws Exception { 
  StringBuffer html = new StringBuffer("&amp;lt;b&amp;gt;");
  html.append(childHtml()).append("&amp;lt;/b&amp;gt;"); 
  return html.toString();
  } 
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. 디미터의 법칙을 준수하라&lt;/strong&gt;&lt;br&gt;
디미터의 법칙은 객체는 다른 객체의 내부 세부 사항에 의존하지 말고, 제공된 인터페이스를 통해서만 상호작용해야 한다는 법칙입니다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Engine {
    public void start() {
        System.out.println("Engine started");
    }
}

class Car {
    private Engine engine;

    public Car() {
        this.engine = new Engine();
    }

    public Engine getEngine() {
        return engine;
    }
}

class Driver {
    public void startCar(Car car) {
        car.getEngine().start(); 
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        Driver driver = new Driver();
        driver.startCar(car); 
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;여기서는 driver가 car의 내부 구조 (engine)에 대해서 알고 있기 때문에 디미터의 법칙을 위반합니다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Engine {
    public void start() {
        System.out.println("Engine started");
    }
}

class Car {
    private Engine engine;

    public Car() {
        this.engine = new Engine();
    }

    public void startEngine() {
        engine.start();
    }
}

class Driver {
    public void startCar(Car car) {
        car.startEngine(); 
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        Driver driver = new Driver();
        driver.startCar(car); //
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;이 코드는 Driver가 car의 내부 기능을 몰라도 되기 때문에 클린 코드라고 할 수 있겠죠.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6.오류 코드를 예외로 대체하라&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class FileReader {
    public void readFile(String filePath) throws FileNotFoundException {
        if (filePath == null) {
            throw new FileNotFoundException("File path is null");
        }
        System.out.println("Reading file: " + filePath);
    }
}

public class Main {
    public static void main(String[] args) {
        FileReader fileReader = new FileReader();
        try {
            fileReader.readFile(null);
            System.out.println("File read successfully");
        } catch (FileNotFoundException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;위 코드는 오류가 생길 때 -1을 반환하거나 하지 않고, 즉시 FileNotFoundException을 발생시키기 때문에 더 깔끔합니다. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boy Scout Rule&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def calculate_total_price(items, tax_rate):
    total = 0
    for item in items:
        total += item['price']
    total += total * tax_rate
    return total

def apply_discount(price, discount):
    return price - (price * discount)

items = [{'name': 'apple', 'price': 0.5}, {'name': 'banana', 'price': 0.3}]
tax_rate = 0.07
discount = 0.1
total_price = calculate_total_price(items, tax_rate)
discounted_price = apply_discount(total_price, discount)
print(discounted_price)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def calculate_subtotal(items):
    subtotal = 0
    for item in items:
        subtotal += item['price']
    return subtotal

def calculate_total_price(subtotal, tax_rate):
    return subtotal + (subtotal * tax_rate)

def apply_discount(price, discount):
    return price - (price * discount)

items = [{'name': 'apple', 'price': 0.5}, {'name': 'banana', 'price': 0.3}]
tax_rate = 0.07
discount = 0.1

subtotal = calculate_subtotal(items)
total_price = calculate_total_price(subtotal, tax_rate)
discounted_price = apply_discount(total_price, discount)

print(discounted_price)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;이에 관련하여 클린한 객체 지향 프로그래밍을 위해 매우 중요한 SOLID 원칙 또한 알아보겠습니다. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;S (Single responsibility):&lt;/strong&gt; 함수와 마찬가지로, 한 클래스가 하나의 역할만 해야 한다는 원칙입니다. &lt;br&gt;
&lt;strong&gt;O (Open-closed):&lt;/strong&gt; 코드가 확장에는 열려 있으되, 수정에는 닫혀 있어야 한다는 원칙입니다. &lt;br&gt;
&lt;strong&gt;L (Liskov substitution):&lt;/strong&gt; 기반 클래스가 할 수 있는 모든 일은 파생 클래스 또한 할 수 있어야 합니다.&lt;br&gt;
이 원칙을 설명하기 위해 흔히 사용되는 예시인 직사각형과 정사각형입니다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Rectangle {
    protected int width;
    protected int height;

    public void setWidth(int width) {
        this.width = width;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }

    public int getArea() {
        return width * height;
    }
}

class Square extends Rectangle {
    @Override
    public void setWidth(int width) {
        this.width = width;
        this.height = width;
    }

    @Override
    public void setHeight(int height) {
        this.width = height;
        this.height = height;
    }
}

public class Main {
    public static void main(String[] args) {
        Rectangle rectangle = new Rectangle();
        rectangle.setWidth(5);
        rectangle.setHeight(10);
        System.out.println("Rectangle area: " + rectangle.getArea());

        Rectangle square = new Square();
        square.setWidth(5);
        square.setHeight(10);
        System.out.println("Square area: " + square.getArea());
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;이 코드는 LSP를 위반했기 때문에 정사각형의 면적이 잘못 계산됩니다. 이를 해결하려면 직사각형과 정사각형을 별도의 클래스로 만들고 같은 인터페이스를 써야 합니다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface Shape {
    int getArea();
}

class Rectangle implements Shape {
    protected int width;
    protected int height;

    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }

    @Override
    public int getArea() {
        return width * height;
    }
}

class Square implements Shape {
    private int side;

    public Square(int side) {
        this.side = side;
    }

    public int getSide() {
        return side;
    }

    @Override
    public int getArea() {
        return side * side;
    }
}

public class Main {
    public static void main(String[] args) {
        Shape rectangle = new Rectangle(5, 10);
        System.out.println("Rectangle area: " + rectangle.getArea());

        Shape square = new Square(5);
        System.out.println("Square area: " + square.getArea());
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;I (Interface segregation):&lt;/strong&gt; 클라이언트가 사용하지 않는 인터페이스에 의존해서는 안 됩니다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface Worker {
    void work();
}

interface Eater {
    void eat();
}

class Human implements Worker, Eater {
    @Override
    public void work() {
        System.out.println("Human is working");
    }

    @Override
    public void eat() {
        System.out.println("Human is eating");
    }
}

class Robot implements Worker {
    @Override
    public void work() {
        System.out.println("Robot is working");
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;여기서 work와 eater가 따로 정의됐기 때문에 Robot은 불필요한 eat 메서드를 구현할 필요가 없어집니다. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;D (Dependency Inversion):&lt;/strong&gt; 상위 모듈은 하위 모듈에 의존해서는 안 된다는 원칙입니다. &lt;/p&gt;

&lt;p&gt;이외에도 디자인이나 시스템에 관련된 더 복잡한 원칙들이 존재합니다.&lt;/p&gt;

&lt;p&gt;버그를 일으키지는 않지만 이러한 원칙들을 지키지 않아 유지 보수성이 떨어지는 코드를 code smell(냄새나는 코드)이라고 하며, 냄새를 감지하기 위해서 다양한 도구들이 존재합니다.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
