<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dongdong_99.log</title>
        <link>https://velog.io/</link>
        <description>JAVA를 자바💥😊😀</description>
        <lastBuildDate>Mon, 27 May 2024 16:12:26 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dongdong_99.log</title>
            <url>https://velog.velcdn.com/images/dongdong_99/profile/01629b99-6c9a-416d-a85c-a08588215852/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dongdong_99.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dongdong_99" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[OS]스레드]]></title>
            <link>https://velog.io/@dongdong_99/OS%EC%8A%A4%EB%A0%88%EB%93%9C</link>
            <guid>https://velog.io/@dongdong_99/OS%EC%8A%A4%EB%A0%88%EB%93%9C</guid>
            <pubDate>Mon, 27 May 2024 16:12:26 GMT</pubDate>
            <description><![CDATA[<h3 id="스레드란">스레드란?</h3>
<blockquote>
<p><strong>프로세스를 구성하는 실행의 흐름 단위</strong> 이다. 그렇기 때문에 하나의 프로세스는 여러 개의 스레드를 가질 수 있다. 스레드를 이용하게 되면** 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있게 된다.** 
<img src="https://velog.velcdn.com/images/dongdong_99/post/7c46d11f-a540-4022-b852-bd8105b0e1b1/image.PNG" alt=""></p>
</blockquote>
<h3 id="프로세스와-스레드">프로세스와 스레드</h3>
<p>전통적인 관점에서 보면 하나의 프로세스는 한번에 하나의 작업만을 처리하였다. 만약 현재 메모리에 웹 브라우저, 게임, 워드 프로세서와 같은 프로세스들이 적재되었다고 가정을 하면, 모든 프로세스들은 한번에 하나의 실행흐름을 가지며 한번에 하나의 부문만 실행이 된다 생각을 했을것이다.(고전적으로 생각하게 된다면😋) 이러한 프로세스를 <strong>단일 스레드 프로세스</strong>라고 칭한다.
<img src="https://velog.velcdn.com/images/dongdong_99/post/6cc84d79-b640-4864-8962-8b3ba750fa9e/image.PNG" alt=""></p>
<p>하지만 <strong>스레드</strong>라는 개념이 도입이 되면서 하나의 프로세스가 한 번에 여러일을 동시에 처리 할수 있게 되었다. 즉 프로세스를 구성하는 여러 명령어들을 동시에 실행할 수 있게 된것이다.!!😀
<img src="https://velog.velcdn.com/images/dongdong_99/post/37b8f831-9b20-4529-9fb9-819195349f1a/image.PNG" alt="">
이러한 특징들을 볼 때 스레드는 &#39;프로세스를 구성하는 실행 단위&#39;라고 볼 수 있다. 스레드는 프로세스 내에서 <strong>각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성</strong>이 되며 각자들이 PC 값을 비롯한 레지스터 값, 스택들을 가지고 있기 때문에 <strong>스레드 마다 각기 다른 코드를 실행할 수 있다.</strong>
프로세스의 스레드들은 실행에 필요한 최소한의 정보만을 유지한 채, <strong>프로세스의 자원들을 서로 공유하며 실행이 된다. 프로세스의 자원을 공유한다는 것이 스레드의 가장 큰 특징</strong>이라 말할 수 있다.
<img src="https://velog.velcdn.com/images/dongdong_99/post/0c1b2317-dba1-4ae1-91d3-3d8b3c54efb8/image.PNG" alt="">
위 그림을 보며 알 수 있듯이 스레드 마다의 코드/데이터/힙 영역이 존재하는 것이 아니라 각각의 스레드들이 하나의 프로세스에게 할당된 자원들을 모두 공유하고 있다는 것을 볼 수 있다.</p>
<blockquote>
<h4 id="정리-요약">정리, 요약..?</h4>
<p>스레드들은 각기 다른 스레드 ID, 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질 뿐 프로세스가 가지고 있는 자원을 공유 한다. 
즉 같은 프로세스에 존재하고 있는 스레드들은 동일한 주소 공간의 코드, 데이터, 힙 영역을 공유하고 열린 파일과 같은 프로세스 자원들을 공유한다. 이런 특징으로 <strong>여러 프로세스를 병렬로 싱행하는 것 보다 메모리를 더욱 효율적으로 사용할 수 있게 된다</strong>. 추가로 프<strong>로세스들은 기본적으로 자원들을 공유하지 않기 때문에</strong>, 서로가 남남처럼 독립적으로 실행되는 반면에, <strong>스레드는 프로세스의 자원을 공유하기 때문에 서로의 협력과 통신에 유리하다.</strong>
하지만 교수님이 말하셨던.. <strong>&quot;세상에는 공짜는 없다😥&quot;</strong> 라는 말이 있듯이 멀티 스레드 환경에서도 단점이 존재한다. 멀티프로세스 환경에서는 하나의 프로세스에 문제가 생겨도 다른 프로세스에는 지장이 적거나 없지만.(<strong>기본적으로 자원을 공유하지 않기 때문에.</strong>) 하지만 멀티 스레드 환경에서는 <strong>모든 스레드가 자원을 공유</strong>하기 때문에 <strong>하나의 스레드에 문제가 생기면, 다른 스레드에 문제가 생기면 다른 스레드도 영향을 받게된다.</strong>
<img src="https://velog.velcdn.com/images/dongdong_99/post/3ae1f40b-99e5-41f3-9b99-8e92ab05beb8/image.PNG" alt=""></p>
</blockquote>
<blockquote>
<h4 id="글을-마치며">글을 마치며</h4>
<p>아.. OS과목을 들은적이 벌써 2년이나 지났구나... 그때 교수님 참.. 어려워서 수업 안 듣고 맨날 카톡하면서 시간 때웠던거 같다. 그때 공부 열심히 할 껄,..ㅋㅋㅋ 진짜 운영체제만 기억이 하나도 안나는 것 같다. 뭐.. 열심히 해야지. 화이팅하자.!!</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[OS]프로세스 상태와 작동구조]]></title>
            <link>https://velog.io/@dongdong_99/OS%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%83%81%ED%83%9C%EC%99%80-%EC%9E%91%EB%8F%99%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@dongdong_99/OS%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%83%81%ED%83%9C%EC%99%80-%EC%9E%91%EB%8F%99%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Mon, 27 May 2024 15:27:24 GMT</pubDate>
            <description><![CDATA[<p>프로세스는 자신의 현재 상태를 가지고 있고 이를, PCB에 기록을 한다. 프로세스들은 아주 빠른 속도로 서로 번갈아가면서 실행이 되기 때문에, 프로세스는 당연히 여러가지 상태들을 가진다. </p>
<h3 id="프로세스의-상태들">프로세스의 상태들</h3>
<blockquote>
<p><strong>생성상태:</strong> 보조기억장치에서 이제 막 메모리에 로딩되어서 PCB를 할당받는 상태임을 의미한다. 생성 상태를 거쳐 실행할 준비가 끝마치어진 프로세스는 곧바로 실행되지 않고, 준비 상태가 되어서 CPU의 할당을 기다린다.(--&gt;준비상태)
<strong>준비 상태:</strong> 현재 실행이 가능한 상태이지만, CPU에 할당되는 것을 기다리고 있는 상태를 의미한다. (준비 상태인 프로세스가 실행 상태가 되는 것을 <strong>&quot;디스패치&quot;</strong>라고 말한다.)
<strong>실행 상태:</strong> CPU를 할당받아 실행이 진행되고 있는 프로세스를 의미한다. 이때 프로세스는 할당된 시간 범위에서만 CPU를 사용할 수 있다. 만약 프로세스가 할당된 시간을 모두 사용한다면, 다시 <strong>준비 상태</strong>(다음 할당을 기다림)가 되며, 프로세스 실행도중에 I/O장치를 사용해야 한다면. I/O 작업이 끝날 때 까지 준비 <strong>대기 상태</strong>가 된다.
<strong>대기 상태:</strong> 프로세스가 실행 도중에 입출력장치를 사용하는 경우가 있다. I/O 작업은 CPU의 속도에 비해 상당히 느리기 때문에 작업이 종료될 때까지 CPU가 기다리는 것이 아니라 다른 프로세스에게 <strong>CPU할당을 넘긴다.</strong> 이렇게 I/O작업이 끝날 때까지 기다리는 상태를 <strong>대기 상태</strong>라고 말한다. (I/O 작업이 끝난다면, 해당 프로세스는 다시 준비 상태가 됨으로써 CPU할당을 기다리게 된다.)
<strong>종료 상태:</strong> 프로세스가 종료된 상태임을 말한다. 프로세스가 종료되면 OS는 PCB와 프로세스가 사용한 메모리를 종료하게 된다.
<img src="https://velog.velcdn.com/images/dongdong_99/post/091975e9-4512-4ede-a23d-dfe926df01e2/image.PNG" alt=""></p>
</blockquote>
<h3 id="프로세스의-계층-구조">프로세스의 계층 구조</h3>
<blockquote>
<p>프로세스는 실행 도중 시스템 호출을 통해 새로운 프로세스를 생성할 수도 있다. 이때 새 프로세스를 생성한 프로세스를 <strong>부모 프로세스</strong>라 명명하며, 새로 생성이된 프로세스를 <strong>자식 프로세스</strong>라고 명명한다. 부모 프로세스와 자식 프로세스는 엄연히 다른 프로세스이기 때문에 서로 다른 PID를 가진다. 몇몇의 OS에서는 생성된 프로세스의 PCB에서 부모 프로세스의 PPID가 기록되기도 한다.</p>
</blockquote>
<h3 id="프로세스의-생성-기법">프로세스의 생성 기법.</h3>
<blockquote>
<p>부모 프로세스를 통해 생성된 자식 프로세스들은 복제와 옷 갈아입기?를 통해 실행이 된다. 정확하게 다시 말하면, 부모 프로세스는 <strong>fork</strong>통해 자신의 복사본을 자식 프로세스로 생성을 하게 되고 새로 생성이 되는 자식 프로세스는 <strong>exec</strong>을 통하여 자신의 메모리 공간을 다른 프로그램으로 교체하게 된다.
<strong>fork:</strong> 자기 자신 프로세스의 복사본을 만드는 시스템 호출을 의미한다. 자식 프로세스는 부모 프로세스의 복사본이기 때문에 부모 프로세스의 자원(메모리의 내용, 열린 파일의 목록 등이 자식 프로세스에게 상속이 된다.)
<strong>exec:</strong> <strong>자신의 메모리 공간을 새로운 프로그램으로 덮어쓰기 위한 시스템 호출</strong>을 의미한다. 다시 말해서 새로운 프로그램을 실행하기 위해서, 기존에 생성된 프로세스를 탈바꿈하는것이라 이해하면 편할 것이다. -&gt; exec을 호출하게 되면 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화가 된다.
<strong>Example.)</strong> 
1.사용자가 bash 셸에서 ls라는 명령어를 입력을 하였다 가정을 함.
2.셸 프로세스느 fork를 통하여 자신과 동일한 프로세스를 생성한다.
3.새로 생성된 자식 프로세스는(셸의 복제 프로세스)는 exec을 통하여, ls 명령어를 실행하기 위한 프로세스로 전환되어 실행이 되게 된다. 
<strong>결론) 셸의 복사본으로 탄생된 자식 프로세스는 ls 명령어를 싱행하기 위한 프로세스로 바뀌게 되며, 메모리 공간에는 ls 명렬어를 실행하기 위한 내용들로 채워지게 된다.😀</strong></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[OS]프로세스와 메모리]]></title>
            <link>https://velog.io/@dongdong_99/OS%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EB%A9%94%EB%AA%A8%EB%A6%AC</link>
            <guid>https://velog.io/@dongdong_99/OS%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EB%A9%94%EB%AA%A8%EB%A6%AC</guid>
            <pubDate>Mon, 20 May 2024 16:06:10 GMT</pubDate>
            <description><![CDATA[<p>프로세스:** 현재 메모리에 적재되어 실행중인 프로그램**을 의미한다. 
보조기억장치(HDD, SSD)에 저장된 프로그램을 메모리에 적재하고 실행되는 관정-&gt; &#39;프로세스를 생성한다.&#39;라고 표현한다.</p>
<p>운영체제는 현재 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분을 하는데, 이때 운<strong>영체제는 프로세스 제어 블록(PCB)</strong>를 이용한다.</p>
<h2 id="process-control-block프로세스-제어블록">Process Control Block(프로세스 제어블록)</h2>
<p>프로세스와 관련된 정보를 저장하는 자료 구조를 의미한다.(옷에 달려 있는 태그에 상품을 식별할 수 있는 정보와 같이 PCB에서는 <strong>해당 프로세스를 식별하기 위해 꼭 필요한 정보들이 저장이 됨!</strong>)</p>
<p>이전 게시글에 작성을 했듯이 메모리는 OS가 구동되는 커널 영역과 사용자 영역으로 나누어져 있고, <strong>PCB는 커널 영역에 생성이 된다.</strong> 이때 OS는 수 많은 프로세스들을 PCB를 통하여 특정한 프로세스를 식별하고 어떻게 프로세스를 처리하는 데 필요한 정보를 판단하게 된다.</p>
<blockquote>
<p>PCB는 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기가 된다. 즉, 새로운 프로세스가 생성 되었다라는 것은 OS가 PCB를 생성했다라는 말과 같고 프로세스가 종료되었다. 라는 것은 OS PCB를 폐기했다라는 말과 동일하다!🙂</p>
</blockquote>
<h3 id="pcb에-저장되는-요소들">PCB에 저장되는 요소들</h3>
<p><strong>프로세스 ID</strong>: 특정 프로세스를 식별하기 위해 부여되는 고유한 번호
<strong>레지스터 값</strong>: 프로세스는 자신의 실행 차례가 돌아오면 이전에 사용이 되었던 레지스터의 값들을 복구하기 위해서, PCB안에 해당 프로세서가 사용 하였던 레지스터 값들이 담는다.
<strong>프로세스 상태</strong>: 현재 프로세스가 어떤 상태인지, 즉 현재 프로세스가 I/O장치를 사용하기 위해 기다리고 있는 상태인지, CPU를 사용하기 위해 기다리고 있는 상태인지, 아니면 이용하고 있는 상태인지를 PCB에 저장을 한다. 
<strong>CPU 스케줄링 정보</strong>: 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보도 PCB에 기록이 된다. 
<strong>메모리 관리 정보</strong>: 프로세스마다 메모리에 저장이 된 위치가 다르기 때문에 프로세스가 어느 주소에 위치하여 있는지에 대한 정보를 알고 있어야한다. 
그렇기 때문에 PCB에서는 <strong>베이스 레지스터</strong>, <strong>한계 레지스터</strong> 값과 같은 정보들이 담기게 된다. -&gt; 페이지 테이블 정보 역시 담긴다(차후 장에 세세히 서술 예정!)
<strong>베이스 레지스터</strong>: 메모리 세그먼트의 시작주소가 저장이 된다.
<strong>한계 레지스터</strong>: 메모리 세그먼트의 크기가 저장이 된다. 
<strong>사용한 파일과 I/O장치의 목록들</strong>: 어떤 입출력 장치가 이 프로세스에 할당이 되었는지, 어떤 파일들을 열었는지에 대한 정보를 저장한다. </p>
<h3 id="문맥교환">문맥교환</h3>
<blockquote>
<p>하나의 프로세스에서 다른 프로세스로 실행 순서가 넘어가면 어떤 일들이 일어날까? 현재 프로세스 A가 CPU를 할당을 받아 실행이 되고 있다가 시간이 되어 프로세스 B에 CPU 할당이 넘어간다고 가정을 해보자.
이런 상활에서 cpu 할당 직전까지 실행되는 프로세스 A는 각종 레지스터 값, 메모리 정보, 실행을 위해 열었던 파일이나 사용한 입출력 장치들 지금까지의 중간 정보를 백업을 해야한다. -&gt; <strong>why? 다음 cpu 할당시간에 이전까지 실행했던 내용에 이어 다시 실행을 재개할 수 있기 때문에!!!</strong></p>
</blockquote>
<h4 id="문맥-수행이-중간에-종료되었던-프로세스를-다시-수행시키기-위해-기억해야-할-정보를-의미한다">문맥: 수행이 중간에 종료되었던 프로세스를 다시 수행시키기 위해 기억해야 할 정보를 의미한다.</h4>
<blockquote>
<p>이러한 정보들은 프로세스 실행 중 인터럽트가 발생할 때, 해당 프로세스의 PCB에 백업을 하고, 다음 차례에 실행이 계획된 프로세스 B의 문맥을 복구를 한다. 
순서도</p>
</blockquote>
<ol>
<li>프로세서 A를 실행함.</li>
<li>프로세스 A의 문맥을 PCB에 저장을 한다.(다음 실행을 위해 준비를 함)</li>
<li>PCB로 부터 다음에 실행되 프로세스 B의 문맥을 가져옴.</li>
<li>프로세스 B를 실행함.</li>
<li>프로세스 B의 문맥을 PCB에 저장을 함.</li>
<li>프로세스 A의 문맥을 PCB로 부터 가져옴</li>
</ol>
<p>문맥 교환은 여러 개의 프로세스가 끊임없이 빠르게 번갈아 가며 실행되는 원리를 의미한다. 문맥 교환이 자주 일어나면 프로세스는 그만큼 빨리 번갈아 가며 수행이 되기 때문에 여러개의 프로세스들이 동시에 실행되는 것 처럼 보이게 된다. </p>
<h3 id="프로세스의-메모리-영역">프로세스의 메모리 영역</h3>
<p>프로세스가 생성이 되면 커널 영역에 PCB가 생성이 된다. 그렇다면 사용자 영역에는 어떤 방식으로 프로세스가 배치되는 것일까? 하나의 프로세스는 사용자 영역에 크게 <strong>코드 영역, 데이터 영역, 힙 영역, 스택 영역</strong>으로 나뉘어 저장이 된다. </p>
<blockquote>
<h4 id="코드영역-텍스트-영역-기계어로-이루어진-명령어가-저장이-된다-이-곳에는-데이터가-아닌-cpu가-실행할-명령어가-담겨져-있기-때문에-쓰기가-금지되어-있다---read-only">코드영역 (텍스트 영역): 기계어로 이루어진 명령어가 저장이 된다. 이 곳에는 데이터가 아닌 CPU가 실행할 명령어가 담겨져 있기 때문에 쓰기가 금지되어 있다. -&gt; Read Only</h4>
</blockquote>
<h4 id="데이터-영역-프로그램이-실행되는-동안에-유지되는-데이터가-저장되는-영역을-의미한다-전역변수가-대표적이다">데이터 영역: 프로그램이 실행되는 동안에 유지되는 데이터가 저장되는 영역을 의미한다. 전역변수가 대표적이다.</h4>
<p><strong>코드 영역과 데이터 영역은 그 크기가 변하지 않는다. **
**why?</strong>: 프로그램을 구성하는 명령어들이 바뀔리가 없으니 코드 영역의 크기가 변할리가 없고 데이터 영역에 저장이 될 내용들은 프로그램이 실행되는 동안에는 유지되는 데이터다. 즉 <strong>코드 영역과 데이터 영역은 &#39;크기가 고정된 영역&#39;이라는 점에서 정적 할당 영역이라고 불린다.</strong> 그와 반대로 힙 영역과 스택 영역은 프로세스 실행 과정에 크기가 변할 수 있는 영역이기 때문에 <strong>정적 할당 영역</strong>이라고 불리운다.
<strong>힙 영역: 프로그래머가 직접 할당할 수 있는 저장공간을 의미한다. 프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했다면, 언젠가는 해당 공간을 반환해야 한다.</strong>
<strong>스택 영역: 데이터를 일시적으로 저장하는 공간을 의미한다. 함수의 실행이 끝나면 사라지는 매개 변수, 지역변수가 대표적이다. 일시적으로 저장할 데이터는 스택영역에 push되고, 더 이상 필요하지 않는 데이터는 pop됨으로써 스택 영역에서 사라지게 된다.</strong>
힙 영역과 스택 영역은 실시간으로 그 크기가 변할 수 있기 때문에 동적 할당 영역으로 불린다. 일반적으로 <strong>힙 영역은 메모리의 낮은 주소에서 높은 주소</strong>로 할당이 되고, 스택 영역은 <strong>높은 주소에서 낮는 주소로 할당</strong>이 된다. -&gt;그래야만 각각의 영역에 데이터가 쌓여도 새롭게 할당되는 주소가 겹칠 일이 없기 때문에!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[OS]운영체제란?]]></title>
            <link>https://velog.io/@dongdong_99/OS%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EB%9E%80</link>
            <guid>https://velog.io/@dongdong_99/OS%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EB%9E%80</guid>
            <pubDate>Sat, 18 May 2024 15:30:29 GMT</pubDate>
            <description><![CDATA[<p>시스템 자원(자원): 프로그램 실행에 필요한 요소들을 말한다.
예를 들어서, CPU, 메모리, I/O장치, 보조기억장치들을 의미한다.</p>
<h2 id="운영체제operating-system-os">운영체제(Operating System OS)</h2>
<p>실행이 진행될 프로그램에 필요한 자원들을 할당하고 프로그램이 올바르게 실행되도록 돕는 프로그램을 의미한다. </p>
<h3 id="운영체제의-역할">운영체제의 역할</h3>
<p>컴퓨터가 부팅될 때 메모리 내 <strong>커널 영역</strong>이라는 공간에 적재되어 실행이 된다. (우리들이 이용하는 응용 프로그램들은 <strong>사용자 영역</strong>이라는 메모리 영역에 실행이 된다) 운영체네의 코드는 커널 영역에 적재가 되고, 사용자 영역에 적<strong>재된 프로그램들에 자원을 할당 올바르게 실행되도록 도와준다.</strong>
현재 메모리의 2000번지, 1000번지, 1500번지에 프로그램들이 적재되어 실행중이라고 가정해보자. 어떻게 각각의 응용 프로그램들이 특정 메모리 번지에 로딩이 된 것일까.? 바로 <strong>OS가 프로그램들의 각각의 메모리 영역에 프로그램들을 적재</strong>를 하고, 더 이상 실행이 되지 않는 <strong>프로그램들을 메모리에 해제하며 지속적으로 메모리를 관리</strong>한다. </p>
<p>추가로 현재 메모리에 적재된 응용 프로그램들이 실행이 되기 위해서는 CPU 자원들이 할당이 되어야하는데, 어떤 프로그램에게 먼저 할당이 되어야하는지, 만약 할당이 된다면 얼마나 지속해야 할지, <strong>최대한 효율적으로 프로그램들을 실행시키기 위해 운영체제가 관여한다.</strong> -&gt; CPU자원들 뿐만 아니라 동일한I/O자원 접근에 대해서도 관리를 한다. (<strong>응용 프로그램과 하드웨어 사이에서 자원들을 할당하고 프로그램이 올바르게 실행되도록 관리를 함</strong>.)</p>
<p><em><del>해당 게시글은 혼자 공부하는 컴퓨터 구조+운영체제 도서를 요약하여 정리하는 글입니다. 덧붙여야 하는 내용은 공룡🦕책을 참조하여 정리해가며 시리즈를 채워갈 계획입니다.🙂 전공할때 열심히 들을껄.. 난 말하는 감자🥔다</del></em><del>~</del>!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL]서블릿이란?]]></title>
            <link>https://velog.io/@dongdong_99/TIL%EC%84%9C%EB%B8%94%EB%A6%BF%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@dongdong_99/TIL%EC%84%9C%EB%B8%94%EB%A6%BF%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Fri, 10 May 2024 06:55:45 GMT</pubDate>
            <description><![CDATA[<h3 id="서블릿servlet">서블릿(Servlet)</h3>
<p>간단히 서술하면 <strong>자바 언어를 이용하여 웹을 만들기 위한 기술</strong>을 의미하고 좀 더 자세히 말해보자면 <strong>클라이언트의 요청을 받고 그에 대응되는 결과를 반환</strong>해주는 자바 프로그램을 서블릿이라고 말한다.</p>
<p>Ex) 클라이언트가 로그인을 하기 위해 아이디와 비밀번호를 입력을 하게 되면 서버는 해당 입력 값이 유효한지를 검사를 하고 유효이 여부에 따라 적합한 응답(페이지orAlert)를 반환한게 된다. -&gt; 이러한 역할을 하는 것을 <strong>서블릿</strong>이라고 말한다.🙂</p>
<h4 id="서블릿의-특징">서블릿의 특징</h4>
<ol>
<li>클라이언트의 요청에 대해서 동적으로 처리하는 웹 애플리케이션 컴포넌트</li>
<li>html을 이용하여 요청에 대한 결과를 반환해줌</li>
<li>자바 Thread를 이용하여 동작을 한다. -&gt; 플랫폼에 독립적이며, 여러 ㅇ요청들을 동시에 처리가 가능하며 높은 보안성을 제공한다. </li>
<li>MVC패턴에서 컨트롤러로 사용이 된다.</li>
<li>한번 Servlet 인스턴스가 생성이 되면 동일한 요청에 대해서 같은 인스턴스로 동작을 수행한다. -&gt; 싱글톤 패턴</li>
</ol>
<h4 id="서블릿의-동작-순서">서블릿의 동작 순서.</h4>
<p><img src="https://velog.velcdn.com/images/dongdong_99/post/c2de4ed8-dfa2-4ccb-8b19-7989edef23cb/image.png" alt=""></p>
<ol>
<li>클라이언트가 URL을 입력하고, HTTP request가 <strong>Servlet Container</strong>로 전송이 된다.</li>
<li>요청을 받은 <strong>ServletContainer</strong>는 HttpServletRequest, HttpServletResponse객체를 생성을 한다.
<em><strong>HttpServletRequest</strong>:_클라이언트가 입력한 데이터를 담는 객체를 의미함.
_<strong>HttpServletResponse</strong>:</em>:입력에 대응되는 결과를 저장하는 객체를 의미. </li>
<li>web.xml을 이용하여 입력(요청한 URL)이 대응되는 서블릿이 무엇인지 탐색을 한다.</li>
<li>탐색이 된 서블릿은 service 메소드를 실행하고 클라이언트의 Get, Post의 여부에 따라서 <strong>doGet(), doPost()</strong>를 호출한다.-&gt;만약 해당이 되는서블릿의 클래스가 컨테이너에 로딩되지 않았으면, <strong>init()</strong>을 통해 새로운 서블릿이 초기화 된다. 이후 과정은 똑같이 동작한다.🙂</li>
<li>doGet(), doPost()는 동적 페이지를 생성을 하고 HttpSelverResponse 응답을 반환한다.</li>
<li>작업이 완료되면 작성된 HttpServleResonse, HttpServletResonse 객체는 <strong>소멸</strong>된다.</li>
</ol>
<p><strong>참고: 정적 페이지와 동적 페이지</strong>
<strong>정적 페이지</strong>: 사진과 단순한 텍스트와 같이 클라이언트와 상호작용과는 관계 없이 늘 똑같은 형식으로 표현되는 페이지를 의미한다.
<strong>동적 페이지</strong>: 클라이언트와의 상호작용에 의해 반환 값이 변화되는 페이지를 의미함-&gt; 로그인 페이지, 쇼핑몰 메인, 장바구니 페이지 등 현재 대부분의 웹 페이지들을 의미함.</p>
<h4 id="참고한-사이트🙏">참고한 사이트🙏</h4>
<p><a href="https://devpoong.tistory.com/44">https://devpoong.tistory.com/44</a>
<a href="https://mangkyu.tistory.com/14">https://mangkyu.tistory.com/14</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] MVC패턴이란]]></title>
            <link>https://velog.io/@dongdong_99/TILMVC-Spring-MVC</link>
            <guid>https://velog.io/@dongdong_99/TILMVC-Spring-MVC</guid>
            <pubDate>Wed, 08 May 2024 05:41:56 GMT</pubDate>
            <description><![CDATA[<h2 id="mvc패턴">MVC패턴</h2>
<p>사용자의 인터페이스에서 비즈니스 로직을 분리하여서 애플리케이션의 시작적인 요소나, 애플리케이션 내부에 동작하는 비즈니스 로직들을 서로 영향없이 수정을 할 수 있게 해주는 것을 의미한다.
<img src="https://velog.velcdn.com/images/dongdong_99/post/7612f1ee-0ac0-4e1a-8c67-823effbe3ebe/image.png" alt="">
<strong>시각화 된 MVC패턴</strong>
<strong>Model</strong>:애플리케이션의 데이터를 의미한다.
-뷰 또는 컨트롤러의 어떠한 정보도 가지고 있어선 안된다. 사용자가 이용하는 모든 정보들을 가지고 있어야 한다.
-변경이 일어나면 그에 따른 상호작용이 일어나야한다.</p>
<p><strong>View</strong>: 애플리케이션의 화면을 구성하기 위해서 모델로 부터 정보들을 불러온다
-모델이 가지고 있는 정보를 저장하면 안된다.
-단순히 정보들을 표현하는 기능만을 가지고 있어야함.
<strong>Controller</strong>: 데이터와 비즈니스 로직 사이와의 상호관계를 관리해준다. </p>
<p>*참고:비즈니스 로직: 실세계의 규칙에 따라서 데이터를 생성, 저장, 수정,삭제 등을 하는 행위를 일컫는다.</p>
<h2 id="mvc-1">MVC 1</h2>
<h4 id="jsp와-java-bean을-이용하여-애플리케이션을-구현하는-방법">JSP와 JAVA Bean을 이용하여 애플리케이션을 구현하는 방법</h4>
<p><img src="https://velog.velcdn.com/images/dongdong_99/post/cda7b988-3948-4fa2-aa32-0a966410ede1/image.png" alt="">
사진에 볼 수 있듯이 JSP에서 사용자의 요청을 처리하고(Controller) 모델에서 받아온 정보들을 가져와 브라우저에 출력을 한다.(View역할) -&gt;JSP에서 뷰와 컨트롤러 기능들을 구현을 해야하기 때문에 코드의 유지보수가 힘들다. </p>
<h2 id="mvc-2">MVC 2</h2>
<h4 id="기존과-다르게--jsp에서는-view-기능만을-담당을-하고-controller-기능은-servlet이-담당을함---기존의-jsp의-기능을-분활">기존과 다르게  JSP에서는 View 기능만을 담당을 하고 Controller 기능은 Servlet이 담당을함. -&gt; 기존의 JSP의 기능을 분활.</h4>
<p><img src="https://velog.velcdn.com/images/dongdong_99/post/6aa494c8-93ee-4aa4-a40f-a7e960a2a934/image.png" alt="">
클라이언트의 요청과 전체적인 프로그램의 제어는 컨트롤러가 담당을 하고, 비즈니스 로직은 빈이 처리를 하며, 화면에 출력을 하는 기능은 뷰가 담당을 한다.
--&gt; 기능들을 서로 분활하여 처리하기 때문에 코드의 유지보수가 더욱 용이해지는 장점을 가진다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 자바 Generics-1]]></title>
            <link>https://velog.io/@dongdong_99/TIL-%EC%9E%90%EB%B0%94-Generics</link>
            <guid>https://velog.io/@dongdong_99/TIL-%EC%9E%90%EB%B0%94-Generics</guid>
            <pubDate>Fri, 26 Apr 2024 08:32:53 GMT</pubDate>
            <description><![CDATA[<h2 id="제네릭이란">제네릭이란?</h2>
<p>자바에서 Generic은 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미한다.
???.. 그럼 왜 이렇게 사용하는 것 일까.? 일단 사전에 데이터 타입을 정의할 필요가 없는 파이썬 코드를 보자.</p>
<pre><code>def plusValues(a, b):
    return a+b
a = 1;
b = 2;
c = 1.1;
d = &#39;hello&#39;

plusValues(a,b); // 3
plusValues(a+c); //2.1
plusValues(a+d); //1hello</code></pre><p>하지만 Java는 데이터 타입을 정의해야 하기 때문에 여러 타입의 연산을 지원하기 위해서 더 많은 메소드를 생성해야한다.😶</p>
<pre><code>int a = 1;
int b = 2;
double c = 1.1;
String d = &quot;hello&quot;;

public void PlusValues(int a, int b){

}

public void PlusValues(int a, double b){

}

public void PlusValues(int a,String b){

}</code></pre><p>하지만 제네릭을 사용하게 된다면??</p>
<pre><code>public class Generic&lt;T, U, E&gt; {




    public E multiTypeMethod(T t, U u) { ... }
}</code></pre><p>이렇게 식을 단순화 시킬 수 가 있다.
<strong>그래서 이거를 왜 쓰고 어떻게 동작이 되는건데..?</strong>
<del><em>다음 포스팅에 열심히 공부해서.. 정리하겠습니다.. 죄송합니다. ^^😥</em></del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] Static, Final에 대해]]></title>
            <link>https://velog.io/@dongdong_99/TIL-Static-Final%EC%97%90-%EB%8C%80%ED%95%B4</link>
            <guid>https://velog.io/@dongdong_99/TIL-Static-Final%EC%97%90-%EB%8C%80%ED%95%B4</guid>
            <pubDate>Thu, 25 Apr 2024 10:38:08 GMT</pubDate>
            <description><![CDATA[<h2 id="1static">1.Static</h2>
<p><strong>static 으로 초기화 된 변수</strong>는 프로그램 실행 이후, 메모리의 Data영역에 초기화가 된다.
지역변수들과 매개변수들은 메모리의 stack 영역에 할당이 되는데 좀 더 자세히 말해보자연 지역변수와 매개변수들은 함수의 호출과 함께 메모리 공간이 할당이 되고, 함수의 종료와 동시에 할당된 공간 반환이된다.
하지만 <strong>static 변수는 프로그램의 실행과 동시에 Data 영역에 할당</strong>이 되고 프로그램이 종료되야 할당이 해제된다. 추가적으로 <strong>static 변수가 선언이 된 인스턴스를 생성하지 않더라도, 접근이 가능</strong>하고 여러 인스턴스들이 공유가 가능하다. 하지만 자바의 Garbage Collector에 의해 관리가 되지 않으므로 너무 많은 static 변수는 시스템의 성능에 영향을 끼친다.</p>
<pre><code>public class test {
    public static void main(String[] args) {
        System.out.println(x);//error 발생 x라는 변수는 바로 참조가 불가능 하다.
        System.out.println(test2.y);//y는 static 변수이기 때문에 직접 참조가 가능하다.

    }
}
class test2 {
    int x =10;
    static int y =10;
}
</code></pre><h2 id="2final">2.Final</h2>
<p>static에 비해 개념이 단순하다. final로 선언된 변수는 한번 선언이 된 이후로는 수정이 불가능 하다.</p>
<pre><code>class test{
    final double PI = 3.141592;
    PI = 3.14 // error final로 선언이되면 차후 수정이 불가능하다.
}

</code></pre><h2 id="3static-final">3.Static Final</h2>
<p>두 가지의 개념을 합쳐진 것이다 Final로 선언이 되어 있기 때문에 선언이 된 이후로도 수정이 불가능하며, static으로 선언되어 있기 때문에 선언이 진행된 클래스의 인스턴스를 생성하지 않더라도 접근이 가능하다.!</p>
<h4 id="글을-쓰며">글을 쓰며..</h4>
<p><strong>여러 글을 읽어보며 자바의 변수, 클래스 메모리 할당에 대한 지식이 상당히 부족했던것 같다.ㅎ..
정보처리기사나 마지막 학기 중간고사를 일단 끝내보고, 자바에 대해 좀 Deep하게 들어가봐야 할 것 같다. 화이팅<del>!</del>!😀</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 자바 접근제어자 정리]]></title>
            <link>https://velog.io/@dongdong_99/TIL-%EC%9E%90%EB%B0%94-%EC%A0%91%EA%B7%BC%EC%A0%9C%EC%96%B4%EC%9E%90-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@dongdong_99/TIL-%EC%9E%90%EB%B0%94-%EC%A0%91%EA%B7%BC%EC%A0%9C%EC%96%B4%EC%9E%90-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 24 Apr 2024 07:44:32 GMT</pubDate>
            <description><![CDATA[<p>자바에서 접근제어자는 클래스와 클래스의 멤버들(필드, 메소드, 생성자)를 사용할 때, 접근을 할 수 있는 범위를 지정해주는 역할을 한다.</p>
<p><strong>(코딩을 하면서 정말 수도 없이 써봤지만, 한번쯤 정리를 해서 개념을 확실히 잡는게 좋을것이라 생각이 들어서 이렇게 정리해봅니다..ㅎㅎ^^)</strong></p>
<h2 id="1클래스의-접근-제어자">1.클래스의 접근 제어자.</h2>
<h4 id="1-public-모든-클래스에서-선언된-클래스에-접근이-가능하다-패키지에도-상관이-없음">1. public: 모든 클래스에서 선언된 클래스에 접근이 가능하다. (패키지에도 상관이 없음)</h4>
<h4 id="2-default생략됨-접근-제어자를-붙이지지-않는-default클래스를-의미한다-해당-클래스는-같은-패키지에서만-접근이-가능하다">2. default(생략됨): 접근 제어자를 붙이지지 않는 (default)클래스를 의미한다. 해당 클래스는 같은 패키지에서만 접근이 가능하다.!!</h4>
<pre><code>public class Test { // public class

}

class Test {// default class


}</code></pre><h2 id="2멤버필드의-접근-제어자">2.멤버필드의 접근 제어자.</h2>
<h4 id="1-public-클래스에서의-public과-비슷하게-public이-붙은-필드는-패키지와-상관-없이-어떤-클래스에서도-접근이-가능하다">1. public: 클래스에서의 public과 비슷하게 public이 붙은 필드는 패키지와 상관 없이 어떤 클래스에서도 접근이 가능하다.</h4>
<pre><code>package pk1;
public class Test{
    public int i; //public으로 선언이 되어 있음



}

package pk2; //다른 패키지에 선언이 됨
public class Test{

    public static void main(String[] args){
        i=20; // public으로 선언이 되었기 때문에 접근이 가능함.

    }
}</code></pre><h4 id="2-private-이름에서도-알-수-있듯이-먼가-보안이-강화된-느낌이-난다-private이-붙은-필드는-같은-클래스내에서만-접근이-가능하다-private로-선언된-필드는-다른-클래스에서-접근을-할려면-getter-setter을-이용하여-접근을-해야한다">2. private: 이름에서도 알 수 있듯이 먼가 보안이 강화된 느낌이 난다. private이 붙은 필드는 같은 클래스내에서만 접근이 가능하다. (private로 선언된 필드는 다른 클래스에서 접근을 할려면 Getter, Setter을 이용하여 접근을 해야한다.)</h4>
<pre><code>package pk1;
public class Test{
    private int i; //private으로 선언이 되어 있음

}

package pk1;
public class Test{

    public static void main(String[] args){
        i=20; // Error--&gt; i는 private으로 선언이 되어 있기에 같은 클래스가 아니면 접근이 불가능함

    }
}</code></pre><h4 id="3-protected-같은-패키지안의-모든-클래스-또는-다른-패키지의-자식-클래스에서-접근이-가능하다">3. protected: 같은 패키지안의 모든 클래스 또는, 다른 패키지의 자식 클래스에서 접근이 가능하다.</h4>
<pre><code>package pk1;
public class Test1{
    protected int i; //private으로 선언이 되어 있음

}

package pk1;
public class Test2{

    public static void main(String[] args){
        i=20; // 같은 패키지 않이기 때문에 접근이 가능함

    }
}

OR
package pk1;
public class Test1{
    protected int i; //private으로 선언이 되어 있음

}

package pk2;
public class Test2 extends Test1{ //상속을 진행하였음

    public static void main(String[] args){
        i=20; // 다른 패키지 이지만 Test1을 상속하였기에 접근이 가능함.

    }
}</code></pre><h4 id="4-default-접근-제어자를-지정하지-않은-멤버-필드는-같은-패키지의-클래스에서-접근이-가능하다">4. default: 접근 제어자를 지정하지 않은 멤버 필드는 같은 패키지의 클래스에서 접근이 가능하다.</h4>
<pre><code>package pk1;
public class Test1{
    protected int i; //private으로 선언이 되어 있음

}

package pk1;
public class Test2{ //상속을 진행하였음

    public static void main(String[] args){
        i=20; // 같은 패키지의 클래스에서 접근이 가능함!.

    }
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] BOJ10986 나머지 합 구하기]]></title>
            <link>https://velog.io/@dongdong_99/Java-BOJ10986-%EB%82%98%EB%A8%B8%EC%A7%80-%ED%95%A9-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dongdong_99/Java-BOJ10986-%EB%82%98%EB%A8%B8%EC%A7%80-%ED%95%A9-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 14 Mar 2024 07:22:05 GMT</pubDate>
            <description><![CDATA[<h4 id="문제">문제</h4>
<p>N개의 수 A1, A2...., An이 주어졌을 때 연속된 부분의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그래밍을 작성하시오. 즉, Ai+.... Aj(i&lt;=j)의 합이 M으로 나누어 떻어지는 (i,j)쌍의 개수를 구하시오.
<a href="https://www.acmicpc.net/problem/10986">https://www.acmicpc.net/problem/10986</a></p>
<h4 id="입력">입력</h4>
<p>1번째 줄에 N과 M, 2번째 줄에 N개의 수 A1,A2,,,,An이 주어진다.</p>
<h4 id="출력">출력</h4>
<p>1번째 줄에 연속된 부분의 합이 M으로 나누어 떨어지는 구간의 개수를 출력한다.</p>
<h4 id="풀이-과정">풀이 과정</h4>
<p>부분합을 구하면서 입력 받은 M으로 나누어지는 구간의 개수를 구하면 되는 문제이다. 제일 먼저 해야할 일은 index 0부터 length까지의 부분합을 저장하는 배열을 만들고, 각 인덱스마다 M으로 나눈 값으로 갱신해준다. 만약 이때 값이 0(M으로 나누어짐) Answer++시켜준다. 
<em>하지만... 인덱스가 0부터 시작된 것이 아니라 중간 부터 시작되는 구간은 어떻게 생각해야하는 것일까??</em></p>
<p>책을 보면서 이해한 내용은 다음과 같다.
먼저, 배열의 구간합은 Arr[j] - Arr[i]로 표현이 가능하다.(이때 i&lt;=j)
그럼 이 구간들에서 M으로 떨어지는 구간은 도대체 어떻게 구할 수 있는 것 일까..?</p>
<p><strong>Arr[j]%M==N. Arr[i]%M==N 이면 ((Arr[j]-Arr[i])%M==0)</strong>
즉 우리가 구간합의 값을 M으로 나눈 값으로 이루어진 배열을 만들었을때, 값이 같은 인덱스들중 두개를 고르면 해당 구간은 M으로 나누어 떨어진다는 것을 의미한다는 것이다.</p>
<h4 id="풀이코드">풀이코드</h4>
<pre><code>package 자료구조;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class 나머지합구하기 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        long[] arr = new long[N];//구간합을 저장하는 배열.
        long[] remainder = new long[M];//나머지들의 개수를 저장하는 배열
        //이제 나머지를 구해야 됨. M으로 나누면서 가질수 있는 나머지 M개 0 ~ M-1
        long answer =0;
        st = new StringTokenizer(br.readLine());
        arr[0] = Integer.parseInt(st.nextToken());
        for (int i = 1; i &lt; arr.length; i++) {
            arr[i] = arr[i - 1] + Integer.parseInt(st.nextToken());
        }
        // 0 ~ N까지의 구간합을 구했음.

        for (int i = 0; i &lt; N; i++) {
            int idx = (int)(arr[i]%M);//나머지로 인덱스를 구함
            if(idx == 0) answer++;
            remainder[idx]++;
        }

        for (int i = 0; i &lt; M; i++) {
            if (remainder[i] &gt;= 2) {
                answer+=(remainder[i]*(remainder[i]-1))/2;//조합을 구하는 식.

            }
        }
        System.out.println(answer);


    }
}
</code></pre><h4 id="결론">결론</h4>
<p>확실히 골드 문제이다 보니깐 어려웠던 문제였던 것 같다. 풀때마다 느끼는데, long, int 때문에 틀리는 문제도 꽤 있는 것 같다.. kuku 열심히 해야지</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring] lombok 어노테이션 정리]]></title>
            <link>https://velog.io/@dongdong_99/firstcommit</link>
            <guid>https://velog.io/@dongdong_99/firstcommit</guid>
            <pubDate>Wed, 06 Mar 2024 09:19:33 GMT</pubDate>
            <description><![CDATA[<p>Spring framework를 다루면서, 다들 롬복을 사용을 하면서 개발을 진행할 것이다. 하지만 필자는 반복적으로 이전 프로젝트를 복사-붙여넣기를 하면서, 이 어노테이션이 &quot;어떤...기능을 했더라...?&quot;라는 의문이 자꾸 들어서 이번 글을 통해 주요 어노테이션들의 기능을 정리해보겠다.🙂</p>
<h3 id="getter-setter">Getter, Setter</h3>
<p>이름에서 알 수 있듯이 클래스의 Get, Set 메소드를 작성하지 않아도 클래스의 멤버 변수를 초기화(set)하거나, 해당 값을 가져(get)할 수 있는 애노테이션을 의미한다. 코드를 통해 더 자세히 이해해보자.</p>
<pre><code>public class ClassTest {
//테스트를 하기 위해 선언된 클래스
    static class Test{
        int x;
        int y;
        public Test(int x, int y) {
            this.x = x;
            this.y = y;
        }

        public int getX() {
            return x;
        }

        public void setX(int x) {
            this.x = x;
        }

        public int getY() {
            return y;
        }

        public void setY(int y) {
            this.y = y;
        }

    }</code></pre><p><img src="https://velog.velcdn.com/images/dongdong_99/post/f5878eb6-0d79-46f5-b002-fc9879010b2d/image.png" alt="">
<strong>위에서 볼 수 있듯이 Get, Set메소드가 없으면 오류가 발생한다. 만약 Getter, Setter 어노테이션을 작성을 하게 된다면..?</strong>
<img src="https://velog.velcdn.com/images/dongdong_99/post/f3eaa6a5-3a88-4eeb-b8b9-03ce186c943b/image.png" width=80% height=80%>
<strong>화면에 볼 수 있듯이 아무런 문제없이 get,set을 사용할 수 있게 된다.</strong></p>
<h3 id="noargsconstructor">@NoArgsConstructor</h3>
<p>해당 애너테이션은 기본 생성자, 즉 파라미터가 없는 생성자를 자동으로 생성을 해주는 애너테이션을 의미한다. 그럼 왜 사용을 하는 것인가? 그 이유는 우리가 자주 사용하는 JPA에서 기본적으로 클래스의 기본 생성자를 요구 한다고 한다.
(추가로 dto 클래스가 json 데이터를 담을 때 기본 생성자가 필요하다.)</p>
<p><em>더 찾아보니 @Entity 애너테이션을 추가하면 자동으로 기본 생성자가 생성이 되는데 왜 @AllArgsConstructor을 사용하는 것이지..요??🙃</em>
<del><em><strong>이 부분에 대해서는 현재 제 지식을 넘은 개념들이 나오기 때문에 추후에 다시 정리해보겠습니다.</strong></em></del></p>
<h3 id="allargsconstructor">@AllArgsConstructor</h3>
<p>클래스 내부에 선언되어 있는 모든 필드를 파라미터로 가지는 생성자를 생성하는 애너테이션을 의미한다. 즉 클래스의 모든 필드의 값을 한꺼번에 초기화할 수 있는 기능을 가지게 된다. <em>이것을 사용하는 이유는...?</em>
Builder를 사용하여 인스턴스를 생성할 때, 기본적으로 모든 필드의 값을 초기화할 수 있어야하기 때문에 모든 필드의 값을 파라미터로 받는 생성자가 필요하다. 그러한 이유로 ALlArgsConstructor를 사용하는 것이다.
Builer를 제외하고도 모든 필드의 값을 파라미터로 가지는 생성자는 자주 사용되기도 한다!!</p>
<h3 id="reqiredargsconstructor">@ReqiredArgsConstructor</h3>
<p>final과 같이 초기화가 필요한 변수들을 초기화 해주기 위해 final로 선언된 변수들을 파라미터로 가지는 생성자를 생성해주는 애너테이션을 의미한다.
해당 부분을 코드로 적는 것이 이해가 더 잘될 것 같아서 코드로 적어보겠다.</p>
<pre><code>@Service
@RequiredArgsConstructor
public class IdService {
    //본인의 프로젝트 Service코드.

    private final BaekjoonIdRepository repository;
</code></pre><p>위에서 볼 수 있듯이 final로 선언이 되어 있지만. 별도의 초기화 과정이 없는것을 확인할 수 있다. 만약 @RequiredArgsConstructor 애너테이션이 없으면 어떻게 작성을 해야할까..?</p>
<pre><code>
@Service
public class IdService {


    private final BaekjoonIdRepository repository;

    @Autowired
    public IdService(BaekjoonIdRepository repository) {
        this.repository = repository;
    }</code></pre><p>이렇게 해당 필드를 초기화 해 줄 수있는 생성자가 존재해야 정상적으로 repository객체를 사용할 수 있게 된다. (@Autowired는 스프링 컨테이너에 생성되어 있는 빈 객체중 파라미터의 변수로 사용될 적절한 빈 객체가 주입이 되는 것을 의미한다. 이는 스프링의 중요한 개념인 DI(Dependency Injection, 의존성 주입)을 의미하는데 이는 다음 포스팅에서 자세히 다뤄보겠다.)</p>
<h4 id="글을-마치며">글을 마치며.....</h4>
<p>오랜만에 글을 써보고 사실 상 처음으로 자세히 검색들을 해가면서 정리해본 것이 처음이었던 것 같다.🥲 너무 늦은감도 있는 것 같지만 하나하나 정리해가며 내 지식으로 가져가게 되면 좋은 결과가 있지 않을까. 싶다~!
<strong>꿈에 도전하는 모든 분 들 다들 화이팅입니다😁!!!</strong></p>
]]></description>
        </item>
    </channel>
</rss>