<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>J_Log</title>
        <link>https://velog.io/</link>
        <description>공부합시다</description>
        <lastBuildDate>Fri, 24 Nov 2023 11:12:36 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>J_Log</title>
            <url>https://velog.velcdn.com/images/j_log/profile/97c40cb7-a756-4ffb-b698-7e1cc1fd7c2e/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. J_Log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/j_log" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[블로그-2]]></title>
            <link>https://velog.io/@j_log/%EB%B8%94%EB%A1%9C%EA%B7%B8-2-ru32b4uu</link>
            <guid>https://velog.io/@j_log/%EB%B8%94%EB%A1%9C%EA%B7%B8-2-ru32b4uu</guid>
            <pubDate>Fri, 24 Nov 2023 11:12:36 GMT</pubDate>
            <description><![CDATA[<h1 id="restful-api">RESTful API</h1>
<h2 id="에러">에러</h2>
<p> 기본 기능 구성이 끝나고 주소 매핑이 잘 됐는지 확인을 해봤는데 의외의 결과가 나왔다. 
 html 상에 Posts 버튼을 누르면 페이지 이동과 함께 DB에 연결된 게시글을 보여줘야하는데, 실제 보여준 창은 html 파일의 text 뿐이었다. 
 에러 메세지라도 떴으면 어디서 문제가 있는 지 바로 알았을텐데 그것조차 없어서 당황했다. </p>
<h3 id="controller-vs-restcontroller">@Controller vs @RestController</h3>
<p>  알고보니 컨트롤러 클래스의 애너테이션을 @RestController로 설정한 것이 문제였다. 
 @Controller는 뷰를 전달해주는 데에 반해, @RestController는 데이터를 전달한다. 
 그러니 템플릿에서 html 파일을 찾는 것이 아니라 string 자체를 보여줬던 것이다. 
 직접 해보니 눈으로 이론만 봤을 때와 달리 이해가 빠르게 됐다. 
 정확하진 않지만 view를 렌더링할 때는 반환형을 string, 데이터를 반환할 때는 ResponseEntity를 이용하는 것도 알았다. </p>
<h1 id="계획">계획</h1>
<h2 id="thymeleaf">Thymeleaf</h2>
<h2 id="주소매핑">주소매핑</h2>
<h2 id="css-bem-ddd">CSS, BEM, DDD....</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[블로그 만들기]]></title>
            <link>https://velog.io/@j_log/%EB%B8%94%EB%A1%9C%EA%B7%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@j_log/%EB%B8%94%EB%A1%9C%EA%B7%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Wed, 22 Nov 2023 14:09:53 GMT</pubDate>
            <description><![CDATA[<h1 id="블로그-만들기">블로그 만들기</h1>
<h2 id="강의">강의</h2>
<p> 알바를 하는 동안 몇 가지 강의를 보면서 스프링 웹 개발을 공부해왔다. 공부를 하면 할수록 배워야 될 게 무궁무진해지는 것을 느꼈는데, 모든 것을 강의를 통해 공부하려고 하면 제 풀에 지칠 듯 했다. 
 더군다나 나는 대강이라도 전체적인 흐름을 파악해야 빠른 습득이 가능하다. 그로 인해 중간중간 궁금한 점을 서칭하면서 시간을 보냈다. 그래서 이제는 강의를 통해 배운 바로 구조를 세우고 챗지피티를 이용하여 진행해보려 한다.</p>
<h2 id="도구">도구</h2>
<p> 프레임워크는 인텔리제이, 라이브러리와 플러그 인은 최대한 사용해보려고 한다. 스프링 이니셜라이저를 통해 프로젝트를 생성했다.</p>
<h2 id="웹-계층">웹 계층</h2>
<p> 레이어는 Model, Service, Repository, DTO 이렇게 나눴다. 처음 강의 봤을 땐 왜 이렇게 나누는 지 이해가 안 갔었는데 웹 계층에 따라 나눈 거라고 한다. 지금은 간단한 CRUD 기능을 구현해놨다.</p>
<h3 id="ddddomain-driven-design">DDD(Domain-Driven Design)</h3>
<p> 글 정리하면서 검색하다가 DDD에 대해 알게 되았다. 비즈니스 로직을 서비스 레이어가 아닌 도메인 모델에서 작성한다는 것이다. get 요청같은 경우엔 간단하게 서비스 레이어에서 처리하고, update같은 경우엔 도메인 모델에서 update 메서드를 추가해준다. 재사용성뿐만 아니라 유지보수에도 좋고 응집성을 줄여준다고 한다.</p>
<h2 id="프론트">프론트</h2>
<p> 백엔드를 하면서 당황한 부분은 프론트다. thymeleaf 템플릿 엔진을 따로 공부해야 할 필요가 있기 때문이다. 하지만 챗지피티 덕분에 빠른 학습이 가능하다. 강의를 일방적으로 듣는 것보다 주요 기능, 장단점, 트렌드를 묻고나서 모르거나 의아한 점이 들면 바로 질문하는 것이 나에게 더 도움이 된다. 금방 익힐 수 있다.</p>
<h2 id="계획">계획</h2>
<p> 현재는 틀만 만들어 놓은 상태다. 수많은 문답을 하면서 유지보수와 트렌드 위주로 학습할 생각이다. 우선 thymeleaf를 배우고 이를 통해 게시글을 보여주는 블로그를 만들고, 게시글 검색, 댓글, 카테고리 등 여러 기능을 추가해 볼 예정이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹2]]></title>
            <link>https://velog.io/@j_log/%EC%9B%B92</link>
            <guid>https://velog.io/@j_log/%EC%9B%B92</guid>
            <pubDate>Thu, 09 Nov 2023 11:19:40 GMT</pubDate>
            <description><![CDATA[<p>html 문서를 주고받던 기존의 방식에서 데이터만 주고받는 형식으로 변화
이러한 변화로 인해 I/O 요청이 CRUD의 형태로 구분됨
CRUD를 각각 매핑하여 함수로 만든 것이 RESTful API
서버에서는 데이터만 주고 클라이언트에서 JS로 나타냄</p>
<p>APM(Application Purpose Management system)</p>
<ol>
<li>응답시간 모니터링<blockquote>
<p>인터넷과 처리 속도가 빠르다해도 DB 응답시간이 늦으면 소용이 없다. DB에 대한 질의가 들어왔을 때 응답시간을 체크한다.</p>
</blockquote>
</li>
<li>JVM 모니터링<blockquote>
<p>Java 바이트 코드를 실행시켜주는 가상 머신</p>
</blockquote>
</li>
</ol>
<ul>
<li>제니퍼, Scouter가 있음
운영 측에서 이러한 화면을 xlog를 통해 감시함</li>
</ul>
<p>server, WAS, DB를 각 1티어로 해서 3-Tier 아키텍처라고 한다.</p>
<p>보안은 1차로 IPS, SSL이 있고, WAF는 1차 또는 Web Server 이후의 2차에 두기도 한다.
외부에서의 허용 범위를 DMZ라고 한다.</p>
<p>유저는 입력 칸에 JS 또는 SQL문을 넣어 보안 공격을 할 수 있으며 이를 시큐어 코드를 통해 방지할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹]]></title>
            <link>https://velog.io/@j_log/%EC%9B%B9</link>
            <guid>https://velog.io/@j_log/%EC%9B%B9</guid>
            <pubDate>Tue, 07 Nov 2023 11:59:20 GMT</pubDate>
            <description><![CDATA[<p>웹의 주요 기능 </p>
<ol>
<li><p>HTTP + HTML(CSS)</p>
</li>
<li><p>WAS</p>
</li>
<li><p>DB</p>
<p>HTTP는 티모시 버너스리에 의해 만들어짐.
클라이언트에서 url을 입력하여 요청하면 서버가 응답하는 형식.
처음엔 문서만 확인하였지만 HTML이 발전하면서 CSS와 이미지를 포함했다. 이러한 파일을 서버에선 static한 형태로 저장했다.
HTTP는 stateless의 특성을, tcp 통신은 stateful의 특성을 지녔기 때문에 파일을 한 번에 송신할 수 없다.
이후, JS가 생기면서 HTML,CSS를 구문분석(parser), 화면에 표시하는 렌더링, JS를 해석할 JS엔진 세 가지로 나뉘어 웹 서비스 프론트사이드 클라이언트의 3요소로 구성하게 된다. </p>
<blockquote>
<p>JS는 백에서 저장되지만 프론트에서 실행된다(보안문제)</p>
</blockquote>
<p>기존 단방향 통신이었던 웹은 JS의 등장으로 양방향(상호작용) 통신으로 바뀐다. 이로 인해 상태라는 개념(전, 중, 후)이 등장하고, 상태의 전이를 기억할 수 있는 수단이 필요했다.
백에서는 많은 데이터가 생기기 때문에 DB라는 저장소를 만들고, 프론트에서는 http가 stateless기 때문에 cookie를 만들어 클라이언트의 컴퓨터에 저장하도록 했다.
양방향 통신이 됨으로써 클라이언트에서는 get뿐만 아닌 post를 할 수 있게 됐다. 이런 요청에 대해 처리할 구체가 WAS이다. 화면에 렌더링하는 것은 VIEW, DB는 MODEL, 여러 가지 처리를 할 CONTROL, MVC 아키텍처라고 불린다.</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[다시 공부시작]]></title>
            <link>https://velog.io/@j_log/%EB%8B%A4%EC%8B%9C-%EA%B3%B5%EB%B6%80%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@j_log/%EB%8B%A4%EC%8B%9C-%EA%B3%B5%EB%B6%80%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Tue, 19 Sep 2023 02:03:59 GMT</pubDate>
            <description><![CDATA[<p>근 세 달 동안 매일 알바를 했다.. 
나에겐 너무 좋았던 조건이었는데 어쩌다보니 매일 일할 기회가 생겨서 하게 됐다
다만 이런 스케줄이 몸에는 부담이었는지 난생 처음 겪어보는 형태의 감기를 앓고 말았다
밤에 숨을 쉴 때마다 기침이 나와 사흘 간 뜬 눈으로 밤을 보내야 했다
지금은 스케줄이 조정돼서 다시 공부할 여유가 생겼다</p>
<p>힘내봅시다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring] 클론 코딩]]></title>
            <link>https://velog.io/@j_log/Spring-%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9</link>
            <guid>https://velog.io/@j_log/Spring-%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9</guid>
            <pubDate>Tue, 13 Jun 2023 14:35:30 GMT</pubDate>
            <description><![CDATA[<p>유튜브의 프로젝트를 클론 코딩하면서 익히고 있다</p>
<p>service, repository, dto 등 레이어라는 게 나오면서 관계를 이해하기 힘들어지고 어떻게 공부해야할 지도 어려웠다</p>
<p>백엔드를 처음 제대로 접한 나로서는 spring 이론 공부와 클론 코딩만 하다보니 레이어에 대해 알 수 없던 것이다</p>
<p>아키텍처라는 것을 모른 체로 무작정 여러 프로젝트를 클론 코딩해보며 익히고자 했다</p>
<p>첫번째 프로젝트와 달리 두번째 프로젝트는 스프링 라이브러리를 보다 적극적으로 이용했다</p>
<p>DI와 getter &amp; setter, 테이블 생성을 JPA와 lombok 애노테이션으로 슥삭 처리하는 걸 보고 새삼 라이브러리의 위대함을 느꼈다🥹</p>
<p>동시에 이전 프로젝트와 비슷한 구조를 띤다는 것을 알았다</p>
<p>프로젝트마다 구조가 달라지는 게 아니라 틀이 비슷한 아키텍처라는 것을 알고 공부 방향이 보여 한결 편해졌다</p>
<p>앞으론 레이어 관련 공부를 병행하며 클론 코딩을 진행할 생각이다😁</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring] Failed to configure a DataSource 에러 해결]]></title>
            <link>https://velog.io/@j_log/Spring-Failed-to-configure-a-DataSource-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0</link>
            <guid>https://velog.io/@j_log/Spring-Failed-to-configure-a-DataSource-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0</guid>
            <pubDate>Wed, 07 Jun 2023 03:04:40 GMT</pubDate>
            <description><![CDATA[<h1 id="💥에러-발생">💥에러 발생</h1>
<p>새 spring 프로젝트를 만들고 실행하려고 보니 다음 에러가 발생했다.</p>
<pre><code>Description:

Failed to configure a DataSource: 
&#39;url&#39; attribute is not specified and no embedded datasource could be configured.</code></pre><p>db를 찾을 수 없다고 하는 거 같다.</p>
<h1 id="✅문제-해결">✅문제 해결</h1>
<h2 id="디펜던시-추가">디펜던시 추가</h2>
<p><code>build.gradle</code>에 디펜던시를 추가해줬다.</p>
<pre><code>implementation &#39;mysql:mysql-connector-java:[mysql 버전]&#39;</code></pre><h2 id="db-경로-설정">db 경로 설정</h2>
<h3 id="maven-applicaitonproperties">maven: applicaiton.properties</h3>
<pre><code>spring.datasource.url=jdbc:mysql://localhost:3306/db_name
spring.datasource.username=db_username
spring.datasource.password=db_password</code></pre><h3 id="gradle-applicationyml">gradle: application.yml</h3>
<pre><code>spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db_name
    username: db_username
    password: db_password</code></pre><h3 id="mysql-idpw-모를-때">mysql id,pw 모를 때</h3>
<blockquote>
<p>mysql을 이용한 프로젝트의 application 파일을 뒤져보자...</p>
</blockquote>
<h1 id="😎해결">😎해결!</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 간단 정리 6]]></title>
            <link>https://velog.io/@j_log/Java-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-6</link>
            <guid>https://velog.io/@j_log/Java-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-6</guid>
            <pubDate>Mon, 29 May 2023 13:43:08 GMT</pubDate>
            <description><![CDATA[<h1 id="배열로-여러-종류의-객체-다루기">배열로 여러 종류의 객체 다루기</h1>
<ul>
<li><p>조상 타입의 배열에 자손들의 객체를 담을 수 있음</p>
</li>
<li><p>다형성의 장점</p>
</li>
</ul>
<ol>
<li>다형적 배개변수</li>
<li>하나의 배열에 여러 종류 객체 저장</li>
</ol>
<h1 id="추상클래스-추상메서드">추상클래스, 추상메서드</h1>
<h2 id="추상-클래스abstract-class">추상 클래스(abstract class)</h2>
<ul>
<li>미완성 설계도, 미완성 메서드를 갖고 있는 클래스</li>
<li>제어자 abstract를 앞에 붙임</li>
<li>다른 클래스 작성에 도움을 주기 위한 것, 인스턴스 생성 불가</li>
<li>상속을 통해 추상 메서드를 완성해야 인스턴스 생성 가능</li>
</ul>
<h2 id="추상-메서드abstract-method">추상 메서드(abstract method)</h2>
<ul>
<li>미완성 메서드, 구현부가 없는 메서드</li>
<li>꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우, 만약 자손에서 일부 메서드를 구현하지 않는다면 abstract 제어자를 붙여서 추상 메서드를 선언해야 함 -&gt; 추상 메서드(미완성 메서드)가 존재함으로 그 클래스 또한 abstract </li>
<li>추상 메서드 호출 가능(호출 시 선언부만 필요)</li>
</ul>
<h1 id="인터페이스">인터페이스</h1>
<ul>
<li>추상 메서드의 집합</li>
<li>구현된 것이 전혀 없는 설계도, 모든 멤버가 public</li>
<li>상속 받을 시 implements 이용</li>
<li>인터페이스의 조상은 인터페이스만 가능(최고 조상 Object 아님)</li>
<li>다중 상속 가능(구현된 메서드가 없기 때문에 문제 없음)</li>
</ul>
<h2 id="인터페이스와-다형성">인터페이스와 다형성</h2>
<ul>
<li>인터페이스 타입 파라미터는 인터페이스를 구현한 클래스의 객체만 가능</li>
<li>인터페이스를 메서드의 리턴 타입으로 지정할 수 있음</li>
</ul>
<h2 id="인터페이스의-장점">인터페이스의 장점</h2>
<ul>
<li>두 객체 간의 &#39;연결, 대화, 소통&#39;을 돕는 중간 역할을 함</li>
<li>선언(설계)과 구현을 분리시켜 줌
<img src="https://velog.velcdn.com/images/j_log/post/95bbd563-ce92-4877-b7b2-e9f494554f3a/image.png" alt=""></li>
<li>개발 시간 단축</li>
<li>변경에 유리한 유연한 설계 가능</li>
<li>표준화 가능</li>
<li>서로 관계없는 클래스들에 관계를 맺어줄 수 있음</li>
</ul>
<h2 id="디폴트-static-메서드">디폴트, static 메서드</h2>
<ul>
<li>인터페이스는 추상 메서드의 집합이다. 근데 default와 static을 곁들인..(jdk 1.8부터)</li>
<li>여기저기 상속받은 자손들이 있기에 인터페이스에 새로운 메서드를 추가하기 어려움 -&gt; default method 사용</li>
<li>default 메서드는 인스턴스 메서드(인터페이스 원칙 위반)</li>
<li>디폴트 메서드가 기존의 메서드와 충돌할 때 해결책</li>
</ul>
<ol>
<li>여러 인터페이스의 디폴트 메서드 간 충돌 -&gt; 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩해야 함</li>
<li>디폴트 메서드와 조상 클래스의 메서드 간 충돌 -&gt; 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시됨<blockquote>
<p>모두 오버라이딩하면 해결됨</p>
</blockquote>
</li>
</ol>
<h1 id="내부-클래스inner-class">내부 클래스(inner class)</h1>
<ul>
<li>클래스 안 클래스</li>
</ul>
<h2 id="내부-클래스의-장점">내부 클래스의 장점</h2>
<ul>
<li>내부 클래스에서 외부 클래스의 멤버들에 쉽게 접근 가능</li>
<li>코드의 복잡성을 줄일 수 있음 -&gt; 캡슐화</li>
<li>익명 클래스(anonymous class)를 제외한 기존의 iv, cv, lv와 포지션이 동일함 -&gt; instance class, static class, local class</li>
</ul>
<h2 id="내부-클래스의-제어자와-접근성">내부 클래스의 제어자와 접근성</h2>
<ul>
<li>내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일</li>
<li>static 멤버는 static 클래스에만 정의할 수 있음(단, final static 상수는 모두 정의 가능)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 간단 정리 4]]></title>
            <link>https://velog.io/@j_log/Java-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-4</link>
            <guid>https://velog.io/@j_log/Java-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-4</guid>
            <pubDate>Thu, 25 May 2023 04:10:01 GMT</pubDate>
            <description><![CDATA[<h1 id="제어자modifier">제어자(modifier)</h1>
<ul>
<li>접근제어자: public, protected, (default), private</li>
<li>그 외: static, final, abstract, native, transient, synchronized, volatile, strictfp</li>
</ul>
<p>접근 제어자는 하나만, 그 외의 제어자는 중복으로 사용 가능
<code>public static final int WIDTH = 200;</code></p>
<h2 id="final-static-abstract">final, static, abstract</h2>
<h3 id="제어자-static">제어자 static</h3>
<h4 id="멤버변수">멤버변수</h4>
<ul>
<li>모든 인스턴스에 공통적으로 사용되는 cv가 됨</li>
<li>cv는 인스턴스를 생성하지 않고도 사용 가능</li>
<li>클래스가 메모리에 로드될 때 생성됨</li>
</ul>
<h4 id="메서드">메서드</h4>
<ul>
<li>인스턴스를 생성하지 않고도 호출 가능한 static 메서드가 됨</li>
<li>static 메서드 내에서는 im을 직접 사용할 수 없음</li>
</ul>
<h3 id="제어자-final">제어자 final</h3>
<h4 id="클래스">클래스</h4>
<ul>
<li>변경될 수 없는 클래스, 다른 클래스의 조상이 될 수 없음(확장될 수 없음)</li>
<li>e.g. String, Math 클래스</li>
</ul>
<h4 id="메서드-1">메서드</h4>
<ul>
<li>변경될 수 없는 메서드, 오버라이딩을 통해 재정의 될 수 없음</li>
</ul>
<h4 id="멤버변수지역변수">멤버변수&amp;지역변수</h4>
<ul>
<li>값을 변경할 수 없는 상수가 됨</li>
</ul>
<h3 id="제어자-abstract">제어자 abstract</h3>
<h4 id="클래스-1">클래스</h4>
<ul>
<li>클래스 내에 추상 메서드가 선언되어 있음을 의미</li>
</ul>
<h4 id="메서드-2">메서드</h4>
<ul>
<li>선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알림</li>
</ul>
<h2 id="접근제어자">접근제어자</h2>
<h3 id="private">private</h3>
<p>같은 클래스 내에서만 접근 가능</p>
<h3 id="default">(default)</h3>
<p>같은 패키지 내에서만 접근 가능</p>
<h3 id="protected">protected</h3>
<p>같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근 가능</p>
<h3 id="public">public</h3>
<p>접근 제한이 없음</p>
<blockquote>
<p>public 클래스는 소스 파일에 하나만 존재할 수 있다.</p>
</blockquote>
<h2 id="캡슐화">캡슐화</h2>
<ol>
<li><p>외부로부터 데이터를 보호하기 위해 사용됨
<img src="https://velog.velcdn.com/images/j_log/post/027aa439-6c4b-4df7-9b39-38f892d22c58/image.png" alt=""></p>
</li>
<li><p>외부에는 불필요하고, 내부적으로만 사용되는 부분을 감추기 위함</p>
</li>
</ol>
<blockquote>
<p>기본적으로 좁은 범위의 제어자로 설정하고, 필요시 확장하는 것이 좋다.</p>
</blockquote>
<h2 id="다형성polymorphism">다형성(polymorphism)</h2>
<ol>
<li>여러 가지 형태를 가질 수 있는 능력</li>
<li>조상 타입 참조 변수로 자손 타입 객체를 다루는 것</li>
</ol>
<p><img src="https://velog.velcdn.com/images/j_log/post/c67c33bc-9a19-4ae3-ae23-a9fee7fb87a8/image.png" alt=""></p>
<h2 id="참조변수의-형변환">참조변수의 형변환</h2>
<ol>
<li>사용할 수 있는 멤버의 개수 조절</li>
<li>조상 자손 관계의 참조변수는 서로 형변환 가능</li>
</ol>
<h2 id="instanceof-연산자">instanceof 연산자</h2>
<ol>
<li>참조변수의 형변환 가능 여부 확인</li>
<li>형변환 전 반드시 instanceof로 확인 </li>
</ol>
<h2 id="파라미터의-다형성">파라미터의 다형성</h2>
<p>참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있음</p>
<p><img src="https://velog.velcdn.com/images/j_log/post/357d9212-00d6-4267-8284-2897ffc562ba/image.png" alt=""></p>
<blockquote>
<p>다형성 왜 쓰는건지 궁금했는데 이제야 제대로 알아서 속이 후련하다
source: 남궁성의 정석코딩, <a href="https://www.youtube.com/watch?v=U-VGYYH-obM&amp;list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&amp;index=84">https://www.youtube.com/watch?v=U-VGYYH-obM&amp;list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&amp;index=84</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 간단 정리 3]]></title>
            <link>https://velog.io/@j_log/Java-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-3</link>
            <guid>https://velog.io/@j_log/Java-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-3</guid>
            <pubDate>Wed, 24 May 2023 03:14:19 GMT</pubDate>
            <description><![CDATA[<h1 id="단일-상속">단일 상속</h1>
<ul>
<li>C++과 달리 자바는 단일 상속만 허용함(인터페이스를 활용)</li>
</ul>
<h1 id="object-클래스">Object 클래스</h1>
<ul>
<li>부모가 없는 클래스는 자동으로 Object 클래스를 상속받게 된다(<code>toString()</code>, <code>equals(Object obj)</code>, <code>hashCode()</code> 등)</li>
</ul>
<h1 id="오버라이딩overriding">오버라이딩(overriding)</h1>
<ul>
<li>상속받은 조상의 메서드를 자신에 맞게 변경하는 것</li>
</ul>
<h2 id="오버라이딩의-조건">오버라이딩의 조건</h2>
<ol>
<li>선언부가 조상 클래스의 메서드와 일치해야 한다(반환 타입, 메서드 이름, 파라미터 목록)</li>
<li>접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다</li>
<li>예외는 조상 클래스의 메서드보다 많이 선언할 수 없다</li>
</ol>
<h1 id="참조변수-super-생성자-super">참조변수 super, 생성자 super()</h1>
<h2 id="참조변수-super">참조변수 super</h2>
<ul>
<li>객체 자신을 가리키는 참조변수, 인스턴스 메서드(생성자) 내에서만 존재</li>
<li>조상의 멤버를 자신과 구별할 때 사용</li>
</ul>
<h2 id="생성자-super">생성자 super()</h2>
<ul>
<li>조상의 생성자를 호출할 때 사용</li>
<li>조상의 멤버는 조상의 생성자를 호출해서 초기화</li>
</ul>
<h3 id="생성자의-조건">생성자의 조건</h3>
<blockquote>
<p>생성자의 첫 줄에 반드시 생성자를 호출해야 한다
안하면 컴파일러가 생성자 첫 줄에 <code>super();</code>를 삽입함</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/j_log/post/9b9d9ef4-a8b6-4525-9b07-4450d5f23944/image.png" alt=""></p>
</blockquote>
</blockquote>
<h1 id="import문">import문</h1>
<h2 id="import">import</h2>
<ul>
<li>클래스를 사용할 때 패키지 이름을 생략할 수 있다</li>
<li>컴파일러에게 클래스가 속한 패키지를 알려준다</li>
<li>java.lang 패키지는 import 하지 않아도 기본적으로 사용할 수 있다</li>
<li>import 문은 컴파일할 때 처리되므로 프로그램의 성능에 영향을 미치지 않는다</li>
</ul>
<h2 id="static-import">static import</h2>
<ul>
<li>static 멤버를 사용할 때 클래스 이름을 생략할 수 있게 해준다
<code>import static java.lang.System.out</code>
<code>System.out.println()</code> -&gt; <code>out.println()</code></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 간단 정리 2]]></title>
            <link>https://velog.io/@j_log/Java-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-2</link>
            <guid>https://velog.io/@j_log/Java-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-2</guid>
            <pubDate>Tue, 23 May 2023 04:41:44 GMT</pubDate>
            <description><![CDATA[<h1 id="this와-this">this와 this()</h1>
<h2 id="this-생성자">this() 생성자</h2>
<ul>
<li>다른 생성자를 호출할 때 쓰는 생성자</li>
<li>메서드의 첫 줄에 쓰여야 함</li>
</ul>
<h2 id="참조변수-this">참조변수 this</h2>
<ul>
<li>인스턴스 자신을 가리킴</li>
<li>인스턴스 메서드에서 사용 가능</li>
<li>lv와 iv를 구별할 때 사용</li>
</ul>
<p><img src="https://velog.velcdn.com/images/j_log/post/ed259d68-dd42-4d14-9224-3e136ab69ff8/image.png" alt=""></p>
<p><code>this</code>와 <code>this()</code>는 관련이 없다</p>
<h1 id="변수의-초기화">변수의 초기화</h1>
<p>lv는 수동으로 초기화를 시켜줘야 한다. iv와 cv는 자동 초기화가 된다.</p>
<p><img src="https://velog.velcdn.com/images/j_log/post/017421dc-e654-47b5-bfc7-ce0ce7d48033/image.png" alt=""></p>
<h2 id="멤버-변수의-초기화">멤버 변수의 초기화</h2>
<ol>
<li>명시적 초기화(=)</li>
<li>초기화 블럭({}, static {}) </li>
<li>생성자</li>
</ol>
<p>1번은 간단 초기화, 2번과 3번은 복잡한 초기화</p>
<p><img src="https://velog.velcdn.com/images/j_log/post/9b4f0760-ccb5-4c6f-98c7-2d681197ce77/image.png" alt=""></p>
<h1 id="상속inheritance">상속(Inheritance)</h1>
<ul>
<li>기존의 클래스를 이용해서 새로운 클래스를 만듬 -&gt; 코드의 재사용</li>
<li>두 클래스를 부모와 자식의 관계로 이어줌</li>
<li>자손은 조상(부모의 부모 등)의 생성자와 초기화 블럭을 제외한 모든 멤버를 상속받음</li>
<li>자손의 멤버는 조상의 멤버보다 많거나 같다</li>
<li>자손에 변경이 있어도 조상에 영향을 미치지 않는다</li>
</ul>
<h1 id="포함composite">포함(Composite)</h1>
<ul>
<li>클래스의 멤버로 참조변수를 선언하는 것
<img src="https://velog.velcdn.com/images/j_log/post/f0f15aed-9be0-49a6-a48b-2361fdd64e46/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 간단정리]]></title>
            <link>https://velog.io/@j_log/Java-%EA%B0%84%EB%8B%A8%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@j_log/Java-%EA%B0%84%EB%8B%A8%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Mon, 22 May 2023 04:09:28 GMT</pubDate>
            <description><![CDATA[<h1 id="java">Java</h1>
<ol>
<li>iv(instance variable) : 인스턴스 변수, 클래스 전역에서 사용 가능한 변수(a, b)</li>
<li>lv(local variable) : 로컬 변수, 선언된 블럭 안에서만 사용 가능</li>
<li>cv(class variable) : 클래스 변수, 클래스 내에서만 사용 가능</li>
<li>im(instance member) : iv를 사용하는 메서드</li>
</ol>
<h2 id="string-클래스">String 클래스</h2>
<h3 id="특성">특성</h3>
<ol>
<li>String 클래스는 char[] 와 메서드를 합친 것</li>
<li>String 클래스는 내용을 변경할 수 없음
<img src="https://velog.velcdn.com/images/j_log/post/74b37516-9261-4f60-af07-47713170d32c/image.png" alt=""></li>
</ol>
<h3 id="주요-메서드">주요 메서드</h3>
<ul>
<li>char charAt(int index) : 문자열에서 해당 index에 있는 문자를 반환</li>
<li>int length() : 문자열의 길이 반환</li>
<li>String substring(int from, int to) : from부터 to까지 반환, to는 미포함</li>
<li>boolean equals(Object obj) : 내용이 같은지 확인 </li>
<li>char[] toCharArray() : 문자열을 문자배열로 변환해서 반환</li>
</ul>
<h2 id="호출-스택call-stack">호출 스택(call stack)</h2>
<p>메서드 수행에 필요한 메모리가 제공되는 공간</p>
<p><img src="https://velog.velcdn.com/images/j_log/post/6d988d76-9a58-42fc-8f6f-899dd72f4151/image.png" alt=""></p>
<ul>
<li>아래에 있는 메서드가 위의 메서드를 호출한 것</li>
<li>하나의 메서드만 실행 중, 나머지는 대기 상태(스택의 한계)</li>
</ul>
<h2 id="매개변수parameter">매개변수(parameter)</h2>
<h3 id="기본형-매개변수">기본형 매개변수</h3>
<p><img src="https://velog.velcdn.com/images/j_log/post/8237d190-bc22-4d72-a8c3-ee62bb4f569e/image.png" alt=""></p>
<p>x의 값을 바꾸는 메서드가 메모리에서 삭제되면서 변경된 x값도 없어지게 된다.(read only)</p>
<p>x의 값은 기본형 매개변수가 아닌 참조형 매개변수를 통해 바꿀 수 있다.</p>
<h3 id="참조형-매개변수">참조형 매개변수</h3>
<p><img src="https://velog.velcdn.com/images/j_log/post/d0e16d41-d147-4f9e-96b8-d872960ed86d/image.png" alt=""></p>
<p>참조형 매개변수를 이용하면 x의 값이 아닌, x의 주소를 가져오게 된다.</p>
<h3 id="참조형-반환타입">참조형 반환타입</h3>
<p><img src="https://velog.velcdn.com/images/j_log/post/c40d6e2a-c8a6-46e2-a7ea-d8a31e1f3662/image.png" alt=""></p>
<p>참조형 반환타입은 객체의 주소를 반환한다.</p>
<h2 id="메서드">메서드</h2>
<p><img src="https://velog.velcdn.com/images/j_log/post/70aa7c59-691d-4567-b5b3-fdb137838dbd/image.png" alt=""></p>
<h3 id="인스턴스-메서드">인스턴스 메서드</h3>
<ul>
<li>인스턴스 생성 후 &#39;참조변수.메서드명()&#39;으로 호출</li>
<li>인스턴스 멤버(iv, im)과 관련된 작업을 하는 메서드</li>
<li>메서드 내에서 iv, cv 사용 가능</li>
</ul>
<h3 id="static-메서드">Static 메서드</h3>
<ul>
<li>객체 생성 없이 &#39;클래스이름.메서드명()&#39;으로 호출</li>
<li>인스턴스 멤버와 관련 없는 작업을 하는 메서드</li>
<li>메서드 내에서 iv 사용 불가, cv는 사용 가능</li>
</ul>
<h3 id="언제-메서드에-static을-붙여아-하나">언제 메서드에 static을 붙여아 하나?</h3>
<blockquote>
<p>iv, im의 사용 유무</p>
</blockquote>
<h2 id="오버로딩overloading">오버로딩(overloading)</h2>
<h3 id="오버로드의-조건">오버로드의 조건</h3>
<ol>
<li>이름이 같아야 함</li>
<li>파라미터의 개수나 타입이 달라야 함</li>
<li>변환 타입은 상관 없음</li>
</ol>
<blockquote>
<p>파라미터는 다르지만 같은 작업을 수행하는 것이 좋다</p>
</blockquote>
<pre><code>long add(int a, long b) { return a+b; }
long add(long a, int b) { return a+b; }

// add(3, 3)  하면 ambiguous error</code></pre><h2 id="생성자constructor">생성자(constructor)</h2>
<ul>
<li>인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드<pre><code>Time t = new Time();
t.hour() = 12;
t.minutes() = 30;</code></pre></li>
<li>인스턴스 생성 시 수행할 작업(iv 초기화)에 사용<pre><code>Time t = new Time(12, 30);</code></pre></li>
<li>클래스와 이름이 같아야 한다.</li>
<li>리턴값이 없다. (void x)</li>
<li>모든 클래스는 반드시 생성자를 가져야 한다.</li>
</ul>
<h2 id="생성자-this">생성자 this()</h2>
<p>생성자에서 다른 생성자를 호출할 때 사용</p>
<h2 id="오버라이드">오버라이드</h2>
<p>부모 클래스를 상속 받은 자녀 클래스가 부모 클래스의 메서드를 재정의하는 것을 말한다.</p>
<blockquote>
<p>강의 출처: 남궁성의 정석코딩,
<a href="https://www.youtube.com/watch?v=LqCkLdlcC7M&amp;list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&amp;index=68">https://www.youtube.com/watch?v=LqCkLdlcC7M&amp;list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&amp;index=68</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring] AOP]]></title>
            <link>https://velog.io/@j_log/Spring-AOP</link>
            <guid>https://velog.io/@j_log/Spring-AOP</guid>
            <pubDate>Fri, 19 May 2023 02:28:38 GMT</pubDate>
            <description><![CDATA[<h1 id="aopaspect-oriented-programming">AOP(Aspect Oriented Programming)</h1>
<h2 id="모든-메소드의-호출-시간을-알고-싶다면">모든 메소드의 호출 시간을 알고 싶다면?</h2>
<ul>
<li>호출에 걸리는 시간을 측정하는 기능은 핵심 관심 사항이 아닌 공통 관심 사항이다.</li>
<li>핵심 기능 로직과 시간 측정 로직이 결합되면 유지보수가 어렵다.</li>
<li>시간 측정 로직을 따로 공통 로직으로 만드는 것은 매우 어렵다.</li>
</ul>
<blockquote>
<p>공통 관심 사항 (cross-cutting concern) vs 핵심 관심 사항 (core concern)</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/j_log/post/b74fcf3b-14a4-4eac-8b5e-7478250d9a21/image.png" alt=""></p>
<blockquote>
<p>AOP <a href="https://engkimbs.tistory.com/746">https://engkimbs.tistory.com/746</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring] DB 연동]]></title>
            <link>https://velog.io/@j_log/Spring-DB-%EC%97%B0%EB%8F%99</link>
            <guid>https://velog.io/@j_log/Spring-DB-%EC%97%B0%EB%8F%99</guid>
            <pubDate>Thu, 18 May 2023 03:48:52 GMT</pubDate>
            <description><![CDATA[<h1 id="db-연동">DB 연동</h1>
<h2 id="스프링-db-접근-기술">스프링 DB 접근 기술</h2>
<ol>
<li><p>H2 데이터베이스 설치 </p>
</li>
<li><p>순수 JDBC
직접 코드를 짬</p>
</li>
<li><p>스프링 JdbcTemplate
스프링에서 제공하는 JDBC 템플릿</p>
</li>
<li><p>JPA
쿼리 없이 DB를 조작 가능하게 함</p>
</li>
<li><p>스프링 데이터 JPA</p>
</li>
</ol>
<h2 id="h2-db">H2 DB</h2>
<p><a href="h2database.com">@H2 DB </a> 콘솔 실행</p>
<p><img src="https://velog.velcdn.com/images/j_log/post/b79482b5-0bd2-448f-a433-13d90d6ceb48/image.png" alt=""></p>
<p>ID와 NAME이 있는 DB를 만들었다.
first, second, third를 넣고 스프링으로 돌려보겠다.</p>
<h2 id="jdbc">JDBC</h2>
<p><img src="https://velog.velcdn.com/images/j_log/post/84faf25d-3802-40f4-976d-2a128aa6c93f/image.png" alt=""></p>
<p>잘 저장되어 있다.
페이지에서 직접 등록한 test도 저장된 모습이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring]스프링 빈]]></title>
            <link>https://velog.io/@j_log/Spring%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B9%88</link>
            <guid>https://velog.io/@j_log/Spring%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B9%88</guid>
            <pubDate>Wed, 17 May 2023 03:12:55 GMT</pubDate>
            <description><![CDATA[<h1 id="스프링-빈">스프링 빈</h1>
<p>스프링 컨테이너에 저장돼서 필요한 의존 관계를 설정해 줄 수 있음</p>
<p>스프링은 스프링 컨테이너에 스프링 빈을 등록할 때 싱글톤을 적용함</p>
<pre><code>싱글톤은 유일하게 하나만 등록해서 사용하는 방법이다.</code></pre><h2 id="스프링-빈을-등록하는-방법">스프링 빈을 등록하는 방법</h2>
<ol>
<li>컴포넌트 스캔과 자동 의존 관계 설정</li>
<li>직접 자바 코드로 스피링 빈 등록</li>
</ol>
<h3 id="컴포넌트-스캔과-자동-의존-관계-설정">컴포넌트 스캔과 자동 의존 관계 설정</h3>
<p><img src="https://velog.velcdn.com/images/j_log/post/28c3f95b-09e2-4875-81f4-574374e8fa68/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/j_log/post/ec21e798-f621-4883-95f3-14a02883ad00/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/j_log/post/3e61d271-d928-4685-998b-6ad01ad31119/image.png" alt=""></p>
<p>@Component 애노테이션이 있으면 자동으로 스프링 빈으로 저장된다
@Controller, @Service, @Repository 모두 @Component를 포함한다</p>
<blockquote>
<blockquote>
</blockquote>
</blockquote>
<h4 id="di-dependancy-injection">DI (Dependancy Injection)</h4>
<p>생성자에 @Autowired 애노테이션이 있으면 스프링이 연관된 객체를 스프링 컨테이너로부터 찾아서 연결해준다. </p>
<blockquote>
</blockquote>
<ol>
<li>필드 주입
<img src="https://velog.velcdn.com/images/j_log/post/d77edbde-5b88-40ca-9708-bd80763a73fa/image.png" alt="">
생성자나 세터 없이 만드는 방법이다. 조작에 좋지 않은 방법이다.<blockquote>
</blockquote>
</li>
<li>setter 주입
<img src="https://velog.velcdn.com/images/j_log/post/9248a5cc-0ca3-4ca5-9d8e-2b816d099bf9/image.png" alt="">
setter에 @Autowired를 붙여 만드는 방법이다. public으로 된 메서드기 때문에 불필요한 호출이 있을 수 있다. <blockquote>
</blockquote>
</li>
<li>생성자 주입
<img src="https://velog.velcdn.com/images/j_log/post/f539962b-0bda-4e18-9272-f6d5e5db023a/image.png" alt="">
애플리케이션이 조립될 때, 생성되고 나서 setter처럼 호출될 일 없다. 권장되는 방법이다.</li>
</ol>
<h3 id="직접-자바-코드로-스프링-빈-등록">직접 자바 코드로 스프링 빈 등록</h3>
<p><img src="https://velog.velcdn.com/images/j_log/post/2dde3498-b81d-44d4-bf52-f82ec4845fb3/image.png" alt=""></p>
<p>실행 파일이 있는 패키지에 Config 페이지를 만든다.
@Configuration 클래스와 @Bean 메소드를 만들어서 직접 정의가 가능하다.</p>
<h2 id="각각의-장단점">각각의 장단점</h2>
<p>XML로 설정하는 방법은 생략</p>
<h3 id="컴포넌트-스캔과-자동-의존-관계-설정-1">컴포넌트 스캔과 자동 의존 관계 설정</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring]기초]]></title>
            <link>https://velog.io/@j_log/Spring%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@j_log/Spring%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Mon, 15 May 2023 02:35:41 GMT</pubDate>
            <description><![CDATA[<h1 id="웹-개발-기초">웹 개발 기초</h1>
<ul>
<li>정적 컨텐츠</li>
<li>MVC &amp; 템플릿 엔진</li>
<li>API</li>
</ul>
<h2 id="정적-컨텐츠">정적 컨텐츠</h2>
<p>정적인 페이지를 표시한다.</p>
<p>웹 브라우저에서 페이지를 요청했을 때, 톰캣 내장 서버를 통해서 스프링 컨테이너 안 컨트롤러에서 메서드를 찾는다.</p>
<p>그 다음 resource 안에서 정적 페이지를 찾는다.</p>
<h2 id="mvcmodel-view-controller">MVC(Model, View, Controller)</h2>
<ul>
<li><p>Model one 방식: 뷰로만 다 짬</p>
</li>
<li><p>MVC 방식: 뷰는 화면 그리는 데 집중, 모델과 컨트롤러에서는 비즈니스 로직을 짬</p>
</li>
</ul>
<p>웹 브라우저에서 요청이 들어오면, 정적 컨텐츠와 마찬가지로 내장 톰캣 서버를 통해 스프링 컨테이너에서 메서드를 찾는다. </p>
<p>이후 viewResolver가 연결된 뷰를 thymeleaf 템플릿 엔진 처리한다.</p>
<p>마지막으로 html 변환 후 페이지를 표시한다.</p>
<p>컨트롤러에서 getMapping으로 모델에 속성을 추가하여 뷰로 넘긴다.</p>
<h2 id="apiapplication-programming-interface">API(Application Programming Interface)</h2>
<p>(컨트롤러까지 동일)</p>
<p>@ResponseBody를 보고 viewResolver가 아닌 HttpMessageConverter로 전송</p>
<p>기본 문자 처리는 StringHttpMessageConverter</p>
<p>기본 객체 처리는 MappingJackson2HttpMessageConverter</p>
<p>템플릿을 조작하는 것이 아닌 데이터만을 넘겨준다.</p>
<p>객체를 리턴해서 json 형식으로 전송할 수 있다.</p>
<blockquote>
<p>Intellij 단축키
alt + insert : 게터 세터 자동 생성 단축키
ctrl + shift + enter : 자동 완성 기능
alt + enter : implements
shift + F6 : Rename
ctrl + p : 필요한 파라미터를 보여주는 단축키</p>
</blockquote>
<h1 id="관련-내용">관련 내용</h1>
<blockquote>
<p>xmlns: xml name space(xml 명칭을 사용하는 공간)
<a href="https://velog.io/@alicesykim95/Thymeleaf">https://velog.io/@alicesykim95/Thymeleaf</a></p>
</blockquote>
<blockquote>
<p>Spring boot와 React 개발 환경 연동
<a href="https://velog.io/@u-nij/Spring-Boot-React.js-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85">https://velog.io/@u-nij/Spring-Boot-React.js-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85</a></p>
</blockquote>
<blockquote>
<p>출처: 인프런, <a href="https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8">https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[배우는 게 재밌다]]></title>
            <link>https://velog.io/@j_log/%EB%B0%B0%EC%9A%B0%EB%8A%94-%EA%B2%8C-%EC%9E%AC%EB%B0%8C%EB%8B%A4</link>
            <guid>https://velog.io/@j_log/%EB%B0%B0%EC%9A%B0%EB%8A%94-%EA%B2%8C-%EC%9E%AC%EB%B0%8C%EB%8B%A4</guid>
            <pubDate>Sun, 14 May 2023 15:38:33 GMT</pubDate>
            <description><![CDATA[<h1 id="배움의-재미">배움의 재미</h1>
<p>누구나 배우는 재미를 가지고 있을 것이다. </p>
<p>특히 나는 생활이 안정화 되면서 이것 저것 배우는 시간을 주로 살고 있다.</p>
<p>물론 대부분은 CS와 관련된 학습 위주이다.</p>
<p>하지만 벨로그를 하면서 <em>&#39;꼬리 물기식 배움&#39;</em> 을 하고 있다.</p>
<p>최근 포스팅을 예로 들면,</p>
<blockquote>
<p>&quot;빌드의 과정에는 테스트 코드 실행이 포함되어있다.&quot;
테스트 코드는 어떻게 작성해야 하지? 
&quot;테스트를 CI/CD를 통해 자동화 시키는 게 좋다.&quot;
CI/CD는 무엇이지?</p>
</blockquote>
<p>이런 식으로 무언가에 대해 배울 때, 잘 모르는 부분이 나올 때마다 의구심을 갖고 알아보는 것이다.</p>
<p>지금은 스피칭에 대해 배우고 있다.</p>
<p>예전부터 나는 내 생각을 조리있게 말하지 못했다.</p>
<p>목소리와 말투, 발음, 말 더듬기, 말하는 속도 등등 스피칭과 관련된 모든 것에 컴플렉스가 있다고 봐도 무방했다.</p>
<p>스스로 자각한 부분이기에 목소리 문제는 발성을 배우며, 발음은 말하는 속도를 천천히, 그리고 입을 크게 하며 하나 하나 고쳐가기 시작했다.</p>
<p>그러나 가장 큰 문제는 조리있게 말하기다. 어떻게 하면 말이 끊기지 않고 얘기를 할 수 있는걸까? </p>
<blockquote>
<p><a href="https://youtu.be/i8a-Bh-Uh34">https://youtu.be/i8a-Bh-Uh34</a></p>
</blockquote>
<p>하루 1분 동안 스피칭 연습을 해야겠다. 그러고보니 스피칭은 단어 선택도 중요하다... 단어 선택은 어떻게 해야 잘 하지?</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java]자바 관련 용어]]></title>
            <link>https://velog.io/@j_log/Java%EC%9E%90%EB%B0%94-%EA%B4%80%EB%A0%A8-%EC%9A%A9%EC%96%B4</link>
            <guid>https://velog.io/@j_log/Java%EC%9E%90%EB%B0%94-%EA%B4%80%EB%A0%A8-%EC%9A%A9%EC%96%B4</guid>
            <pubDate>Sun, 14 May 2023 14:06:53 GMT</pubDate>
            <description><![CDATA[<h1 id="자바-관련-용어-알아보기">자바 관련 용어 알아보기</h1>
<h2 id="jvm-jre-jdk">JVM, JRE, JDK</h2>
<h3 id="jvmjava-virtual-machine">JVM(Java Virtual Machine</h3>
<p>C언어는 컴파일을 할 때, 다른 운영체제가 바이트 코드를 이해할 수 있도록 각각의 운영체제에 맞는 컴파일러가 필요하다. </p>
<p>하지만 java는 컴파일러 하나면 충분하다. 왜? 컴파일한 바이트 코드를 JVM이 각자 OS에 알맞은 코드로 변환해주기 때문이다.</p>
<p>그루비, 스칼라, 코틀린도 JVM을 이용한다고 한다.</p>
<h3 id="jrejava-runtime-environment">JRE(Java Runtime Environment)</h3>
<p>JRE는 JVM과, 자바를 실행하기 위한 여러 외부 라이브러리들을 포함한 실행 환경이다. </p>
<ul>
<li>JVM + 외부 라이브러리</li>
</ul>
<h3 id="jdkjava-development-kit">JDK(Java Development Kit)</h3>
<p>JDK는 JRE와 컴파일러, 디버그 도구와 같은 여러 개발 도구를 포함한다.</p>
<ul>
<li>JVM + JRE + 개발 도구</li>
</ul>
<p>JDK가 JRE, JVM을 내포하기 때문에 JDK를 설치하면 다 설치된다. 따라서 JDK와 자바의 버전은 동일하다고 볼 수 있다.</p>
<p>JDK는 여러 종류와 버전이 있다.</p>
<ul>
<li><p>종류
OracleJDK, OpenJDK, Zulu등</p>
</li>
<li><p>버전
자바는 베타부터 현재(23.05.14) 기준 JavaSE 20까지 출시했다. lts(long time support)를 지원한다. 자바8, 11, 17, 21이 이에 해당하는데, 말 그대로 서비스를 오랫동안 지원하겠다는 의미다. 21은 올 해 9월 출시 예정이다.</p>
</li>
</ul>
<h2 id="빌드">빌드</h2>
<h3 id="빌드-1">빌드</h3>
<p>빌드는 소스 코드를 여러 과정에 거쳐 독립 SW 가공물(artifact)로 변환하는 작업을 말한다.</p>
<p>빌드 과정은 다음과 같다.</p>
<ol>
<li>코드 컴파일</li>
<li>테스트 코드 컴파일</li>
<li>테스트 코드 실행</li>
<li>테스트 코드 리포트 작성</li>
<li>기타 추가 설정한 작업 수행</li>
<li>패키징 수행</li>
<li>아티팩트 생성</li>
</ol>
<h3 id="실행">실행</h3>
<p>실행은 내가 작성한 코드를 컴파일을 거쳐 작동시키는 것을 말한다. 아티팩트가 무조건 나오는 빌드와 다르게 실행은 아티팩트가 나올 수도 있고 안 나올 수도 있다. </p>
<h2 id="빌드-툴">빌드 툴</h2>
<blockquote>
<p>source: 
공부하는 개발자, <a href="https://youtu.be/f0cAmTYo4tQ">https://youtu.be/f0cAmTYo4tQ</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring]IntelliJ 설치부터 Git 연동까지]]></title>
            <link>https://velog.io/@j_log/SpringIntelliJ-%EC%84%A4%EC%B9%98%EB%B6%80%ED%84%B0-Git-%EC%97%B0%EB%8F%99%EA%B9%8C%EC%A7%80</link>
            <guid>https://velog.io/@j_log/SpringIntelliJ-%EC%84%A4%EC%B9%98%EB%B6%80%ED%84%B0-Git-%EC%97%B0%EB%8F%99%EA%B9%8C%EC%A7%80</guid>
            <pubDate>Sun, 14 May 2023 09:40:26 GMT</pubDate>
            <description><![CDATA[<h1 id="준비과정">준비과정</h1>
<h2 id="jetbrains-intellij-다운">Jetbrains IntelliJ 다운</h2>
<p><img src="https://velog.velcdn.com/images/j_log/post/720c32b6-0713-48ab-a11e-1527189deb65/image.png" alt=""></p>
<p><a href="https://www.jetbrains.com/ko-kr/idea/download/#section=windows">https://www.jetbrains.com/ko-kr/idea/download/#section=windows</a></p>
<p>Ultimate 버전과 Community 버전이 있는데 Ultimate은 한 달간 무료 체험을 제공하는 유료 버전, Community는 무료 버전이다.</p>
<p>나는 Community 버전을 zip파일로 받아서 압축을 해제 중이다. 압축 해제는 시간이 좀 걸리니 그 동안 자바의 버전을 확인했다.</p>
<ul>
<li>cmd<pre><code>java -version
javac -version</code></pre>둘 다 java11이 잘 적용돼 있는 것을 확인했다.</li>
</ul>
<h2 id="intellij-실행">IntelliJ 실행</h2>
<p>압축 해제한 폴더의 bin 폴더로 들어가서 idea64.exe 를 실행해준다.
실행하면 설치 경로를 따로 설정할 수 있는 화면이 뜨고, 설정이 끝나면 실행된다.</p>
<h2 id="새-프로젝트-생성">새 프로젝트 생성</h2>
<h3 id="springinitializr">SpringInitializr</h3>
<p><img src="https://velog.velcdn.com/images/j_log/post/80e9f454-03cf-4d63-a175-d45d23ee4698/image.png" alt=""></p>
<p><a href="https://start.spring.io/">https://start.spring.io/</a></p>
<p>스프링 프로젝트를 만들어주는 유용한 사이트이다.</p>
<p>Project - maven or gradle(groovy, kotlin)
나는 강의에서 gradle을 이용해서 gradle로 선택!</p>
<p>Spring Boot - snapshot rc2 m2 이런 것은 개발중인 버전이라고 한다..
3.0.6 선택!</p>
<p>Group과 Artifact에 이름 설정해주고 
Packaging은 Jar, Java는 아까 확인한 대로 Java 11!</p>
<p>Dependencies는 각자 원하는 라이브러리를 선택해주면 된다.</p>
<p>다 했으면 Generate! 생성한 프로젝트가 zip 파일로 다운된다.</p>
<ol>
<li>zip 파일을 원하는 위치로 이동시킨 후 압축 해제</li>
<li>IntelliJ 실행 - Open - 압축 해제한 폴더의 build.gradle 선택</li>
<li>신뢰하는 프로젝트인지 확인</li>
</ol>
<h2 id="github-pull">Github Pull</h2>
<p>프로젝트를 새로 만드는 것이 아니라 깃헙으로부터 가져온다면 다음을 따라하면 된다.</p>
<p>Intellij 실행 후 Get from VCS 클릭.</p>
<p>Github에 로그인하고 원하는 프로젝트 선택해서 받아주면 끝!</p>
<h1 id="관련-내용">관련 내용</h1>
<blockquote>
<p>IntelliJ에서 Git 사용법
<a href="https://leirbag.tistory.com/53">https://leirbag.tistory.com/53</a></p>
</blockquote>
<blockquote>
<p>Eclipse와 IntelliJ의 차이점
<a href="https://devuna.tistory.com/76">https://devuna.tistory.com/76</a></p>
</blockquote>
<blockquote>
<p>문득 궁금해진 maven, gradle-groovy, gradle-kotlin의 차이점
<a href="https://kdhyo98.tistory.com/87">https://kdhyo98.tistory.com/87</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[A JNI error has occured 에러 해결법]]></title>
            <link>https://velog.io/@j_log/JNI-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%EB%B2%95</link>
            <guid>https://velog.io/@j_log/JNI-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%EB%B2%95</guid>
            <pubDate>Fri, 12 May 2023 13:21:27 GMT</pubDate>
            <description><![CDATA[<h1 id="에러">에러</h1>
<p> 오늘 스프링하면서 cmd로 빌드를 하다가 JNI 에러를 맞딱뜨렸다. 읽어보니 javan runtime은 클래스 파일 52버전 까지 지원한다고 한다. 클래스 파일 52는 내가 사용하고 있는 자바 8과 상응하는 버전이었다. </p>
<h2 id="시도">시도</h2>
<h3 id="java와-javac의-버전이-다르면-에러가-뜰-수-있다">java와 javac의 버전이 다르면 에러가 뜰 수 있다.</h3>
<ul>
<li>cmd<pre><code>java -version
javac -version</code></pre>확인해보니 둘 다 자바 1.8로 동일했다</li>
</ul>
<h3 id="환경변수가-잘못-설정되었다">환경변수가 잘못 설정되었다.</h3>
<ul>
<li>환경 변수를 확인해봤지만 잘못된 부분은 없었다.</li>
</ul>
<h2 id="해결-과정">해결 과정</h2>
<p>위의 시도가 안되자 버전을 올려보자는 생각을 하게 됐다.</p>
<h3 id="1jdk-17-깔고-환경-변수-설정">(1)jdk 17 깔고 환경 변수 설정</h3>
<p>시스팀 환경 변수를 설정 하였으나 분명히 수정을 했음에도 반영이 안되는 버그가 있었다.</p>
<h3 id="2기존의-jdk-삭제">(2)기존의 jdk 삭제</h3>
<p>기존에 자바 홈 환경 변수로 설정했던 jdk 1.8을 삭제해보았다. </p>
<h3 id="3환경-변수-순서-조정">(3)환경 변수 순서 조정</h3>
<p>버그때문에 시스템 환경 변수 %JAVA_HOME%₩bin을 최상위로 올려야 적용이 된다고 해서 jdk 삭제 중에 순서를 올려봤다.</p>
<h2 id="해결">해결!</h2>
<p>jdk 삭제 완료 후, 다시 cmd로 확인해봤다.</p>
<pre><code>java -version</code></pre><p>성공적으로 jdk 버전 수정을 완료했다.</p>
<pre><code>java -jar [spring-project].jar</code></pre><p>빌드까지 성공! </p>
]]></description>
        </item>
    </channel>
</rss>