<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>you_sunning.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Fri, 09 Jan 2026 01:31:18 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. you_sunning.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/you_sunning" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[java map 사용법]]></title>
            <link>https://velog.io/@you_sunning/map-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@you_sunning/map-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Fri, 09 Jan 2026 01:31:18 GMT</pubDate>
            <description><![CDATA[<p><code>map</code> 안에서는 여러 줄 로직을 쓸 수 있다.
단, 마지막에 반드시 &quot;하나를 반환&quot; 해야 한다.</p>
<hr>
<h4 id="비교--map-vs-foreach">비교 : map vs forEach</h4>
<p><strong>map (변환)</strong></p>
<pre><code class="language-java">.map(d -&gt; {
    return new DrResponse(...);
})</code></pre>
<p><strong>forEach (소비)</strong></p>
<pre><code class="language-java">.forEach(d -&gt; {
    System.out.println(d.getName());
})</code></pre>
<table>
<thead>
<tr>
<th>구분</th>
<th>map</th>
<th>forEach</th>
</tr>
</thead>
<tbody><tr>
<td>목적</td>
<td>변환</td>
<td>실행</td>
</tr>
<tr>
<td>return</td>
<td>필수</td>
<td>없음</td>
</tr>
<tr>
<td>결과</td>
<td>새로운 Stream</td>
<td>없음</td>
</tr>
</tbody></table>
<p>조건 로직도 가능하다고 한다.</p>
<pre><code class="language-java">.map(d -&gt; {
    if (d.getName().isBlank()) {
        return new DrResponse(d.getId(), &quot;이름없음&quot;);
    }

    return new DrResponse(d.getId(), d.getName());
})</code></pre>
<p><strong>-&gt; 조건 분기 OK</strong></p>
<hr>
<h4 id="그렇다고-비즈니스-로직-전부-map에-넣지-않는다">그렇다고 &quot;비즈니스 로직&quot; 전부 map에 넣지 않는다.</h4>
<p><strong>map에 적당한 것</strong></p>
<blockquote>
<ul>
<li>DTO 변환</li>
</ul>
</blockquote>
<ul>
<li>단순 포맷 가공</li>
<li>표시용 값 처리</li>
</ul>
<p><strong>map에 부적절한 것</strong></p>
<blockquote>
<ul>
<li>DB 조회</li>
</ul>
</blockquote>
<ul>
<li>권한 판단</li>
<li>핵심 비즈니스 규칙</li>
<li><em>====&gt; 이런 것들은 Service에서 처리.*</em></li>
</ul>
<hr>
<h4 id="📌-메서드로-분리">📌 메서드로 분리</h4>
<p>&quot;</p>
<pre><code class="language-java">.map(this::toResponse)</code></pre>
<p>&quot;
&quot;</p>
<pre><code class="language-java">private DrResponse toResponse(Dr d) {
    return new DrResponse(d.getId(), d.getName());
}</code></pre>
<p>&quot;</p>
<ul>
<li>읽기 훨씬 좋고, 테스트도 쉽다.</li>
</ul>
<hr>
<h3 id="한-문장-요약">한 문장 요약</h3>
<p>map은 여러 줄 로직을 가질 수 있지만,
&quot;변환&quot;이라는 역할은 절대 벗어나면 안 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[java .map 자동 추론]]></title>
            <link>https://velog.io/@you_sunning/java-.map-%EC%9E%90%EB%8F%99-%EC%B6%94%EB%A1%A0</link>
            <guid>https://velog.io/@you_sunning/java-.map-%EC%9E%90%EB%8F%99-%EC%B6%94%EB%A1%A0</guid>
            <pubDate>Fri, 09 Jan 2026 01:10:55 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-java">//Controller.java
drService.findAll()
    .stream()
    .map(d -&gt; new DrResponse(d.getId(), d.getName()))
    .toList();</code></pre>
<h4 id="java-자동-추론">java 자동 추론.</h4>
<p><code>d</code>가 <code>Dr</code>인 건 <code>stream()</code> 앞에서 이미 타입이 정해져 있어서,
자바가 자동으로 추론하기 때문이다.</p>
<pre><code class="language-java">//Service.java
List&lt;Dr&gt; list = drinkService.findAll();</code></pre>
<ul>
<li><code>findAll()</code>의 반환 타입은 -&gt; <code>List&lt;Dr&gt;</code></li>
</ul>
<h4 id="stream의-의미">.stream()의 의미</h4>
<pre><code class="language-java">list.stream()</code></pre>
<p>이걸 타입으로 쓰면 :</p>
<pre><code class="language-java">Stream&lt;Dr&gt;</code></pre>
<p>즉, <strong>이 스트림은 Dr 만 흘러다닌다.</strong></p>
<hr>
<h4 id="그래서-map의-입력-타입은-이미-결정됨">그래서 map의 입력 타입은 이미 결정됨</h4>
<p><code>map</code> 의 정의를 보면 (개념적으로) :</p>
<pre><code>&lt;R&gt; Stream&lt;R&gt; map(Function&lt;? super T, ? extends R&gt; mapper)</code></pre><p>여기서 중요한 건 :</p>
<ul>
<li><code>T</code> = 스트림이 가진 타입</li>
<li>지금은 <code>Stream&lt;Dr&gt;</code>
즉,<pre><code class="language-java">map( Dr -&gt; ??? )</code></pre>
이 구조가 이미 고정되어 있다.</li>
</ul>
<hr>
<p>그래서 이 람다는 사실 이렇게 생긴 거다.</p>
<pre><code class="language-java">.map(d -&gt; new DrResponse(d.getId(), d.getName()))</code></pre>
<p>자바가 내부적으로 이해하는 형태는 아래에서 확인.</p>
<pre><code class="language-java">.map((Drink d) -&gt; new DrResponse(d.getId(), d.getName()))</code></pre>
<hr>
<p>선언을 안 했는데 어떻게 알지?가 궁금했는데 정체는 ㅋㅋ</p>
<blockquote>
<p><strong>타입 추론 (Type Inference)</strong></p>
</blockquote>
<p>자바의 기능 이름이 있다.
자바가 이런 정보를 이미 알고 있기 때문이다.</p>
<ul>
<li><code>stream()</code> -&gt; <code>Stream&lt;Dr&gt;</code></li>
<li><code>map()</code> -&gt; <code>Dr 하나씩 받음</code></li>
</ul>
<p>그래서 <code>d</code> 를 보면 자바는 속으로 :</p>
<blockquote>
<p><strong>&quot; 아, 이건 Dr이구나. &quot;</strong></p>
</blockquote>
<hr>
<h4 id="for-each랑-비교하면-더-이해됨">for-each랑 비교하면 더 이해됨.</h4>
<pre><code class="language-java">for (Dr d : dr) {
    System.out.println(d.getName());
}</code></pre>
<p>여기서도 <code>d</code>는 :</p>
<ul>
<li>앞에 Dr가 있어서 아는 게 아니라</li>
<li><code>dr</code>이 <code>List&lt;Dr&gt;</code>이라서 아는 거야.</li>
</ul>
<blockquote>
<p><strong>= 스트림도 똑같다.</strong></p>
</blockquote>
<hr>
<h3 id="한-문장-정리-">한 문장 정리 :</h3>
<blockquote>
<p>d는 선언이 안 된 게 아니라,
스트림의 타입<code>(Stream&lt;Dr&gt;)</code>으로부터
자동 추론된 매개변수이다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[JWT]]></title>
            <link>https://velog.io/@you_sunning/JWT</link>
            <guid>https://velog.io/@you_sunning/JWT</guid>
            <pubDate>Wed, 07 Jan 2026 07:14:51 GMT</pubDate>
            <description><![CDATA[<p><strong>인증(Authentication) :</strong>
&quot;너 누구니?&quot;</p>
<p><strong>인가(Authorization) :</strong>
&quot;너 이거 해도 되니?&quot;</p>
<h4 id="jwt-왜-필요한지">JWT 왜 필요한지</h4>
<p>현재 나의 프로젝트 구조는</p>
<ul>
<li>프론트 : React</li>
<li>백엔드 : Spring Boot</li>
<li>API : REST 방식</li>
</ul>
<h4 id="jwt-없을-때-문제">JWT 없을 때 문제</h4>
<ul>
<li>서버가 &quot; 누가 요청했는지&quot; 기억 못한다.</li>
<li>매 요청마다 로그인 필요</li>
<li>세션 쓰면 서버가 상태를 가져야 한다. (확장성 떨어짐)</li>
</ul>
<h4 id="jwt-쓰면">JWT 쓰면</h4>
<ul>
<li>서버가 상태를 안 가짐 (Stateless)</li>
<li>요청 하나하나에 &quot;내 신분증(JWT)&quot; 들고 옴.</li>
<li>서버는 검증만 하면 됨.</li>
</ul>
<p>➡️ <strong>프론트 + API 구조에 최적</strong></p>
<h4 id="jwt의-정체를-한-문장으로">JWT의 정체를 한 문장으로</h4>
<p>JWT = &quot;서버가 서명한 사용자 정보 묶음&quot;
구조</p>
<pre><code class="language-css">HEADER.PAYLOAD.SIGNATURE</code></pre>
<h4 id="payload에-보통-무엇을-넣는가">PAYLOAD에 보통 무엇을 넣는가?</h4>
<pre><code class="language-json">{
  &quot;userId&quot;: 1,
  &quot;email&quot;: &quot;test@test.com&quot;,
  &quot;role&quot;: &quot;USER&quot;,
  &quot;exp&quot;: 1712345678
}</code></pre>
<p>➡️ <strong>DB 조회 안 해도 최소한의 사용자 정보 확인 가능</strong></p>
<h4 id="인증authentication---로그인에서-jwt-발급">인증(Authentication) - 로그인에서 JWT 발급</h4>
<p>내가 가지고 있는 로그인 흐름</p>
<pre><code class="language-java">User user = userService.login(email, password);</code></pre>
<p>⬇️ 여기서 JWT를 발급한다.</p>
<pre><code class="language-java">String token = jwtProvider.createToken(user.getId(), user.getEmail());</code></pre>
<p>and 응답</p>
<pre><code class="language-json">{
  &quot;token&quot;: &quot;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...&quot;
}</code></pre>
<p>➡️ 이게 로그인 성공의 결과물</p>
<hr>
<h4 id="프론트에서-jwt-쓰는-방식">프론트에서 JWT 쓰는 방식</h4>
<p>로그인 성공 시</p>
<pre><code class="language-js">localStorage.setItem(&quot;token&quot;, token);</code></pre>
<p>API 요청마다 헤더에 첨부</p>
<pre><code class="language-js">fetch(&quot;/api/drink&quot;, {
  headers: {
    Authorization: `Bearer ${token}`
  }
});</code></pre>
<p>➡️ 이 한 줄이 인증의 전부</p>
<h4 id="백엔드에서-인증-처리-흐름">백엔드에서 인증 처리 흐름</h4>
<p>매 요청마다 서버는 이렇게 생각함.</p>
<pre><code class="language-markdown">1. Authorization 헤더 있나?
2. JWT 유효한가?
3. 서명 맞나?
4. 만료 안 됐나?
5. userId 추출</code></pre>
<ul>
<li>성공하면 :</li>
<li>*&quot; 아 , 이 요청은 userId=1이 보냈구나&quot;**</li>
<li>실패하면 :</li>
<li>*&quot;401 Unauthorized&quot;**</li>
</ul>
<h4 id="인가authorization--이-사람이-이걸-해도-되니">인가(Authorization) : &quot;이 사람이 이걸 해도 되니?&quot;</h4>
<p>여기서부터 권한 개념이 들어온다.</p>
<p><strong>예시 :</strong></p>
<ul>
<li>User -&gt; 자기 Drink만 CRUD 가능</li>
<li>ADMIN -&gt; 전체 조회 가능</li>
</ul>
<p>JWT payload에 role을 넣어준다.</p>
<pre><code class="language-json">{
  &quot;userId&quot;: 1,
  &quot;role&quot;: &quot;USER&quot;
}</code></pre>
<p>그리고 코드에서  :</p>
<pre><code>if (!userId.equals(drink.getUserId())) {
    throw new ForbiddenException();
}</code></pre><blockquote>
<p><strong>➡️인증 = 너 누구냐
➡️인가 = 너 이거 해도 되냐
➡️JWT = 서버가 서명한 신분증
➡️프론트는 JWT 들고 다님
➡️서버는 JWT만 검증
➡️DB 조회 없이 사용자 식별 가능</strong></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[어노테이션 그리고 엔티티]]></title>
            <link>https://velog.io/@you_sunning/%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%97%94%ED%8B%B0%ED%8B%B0</link>
            <guid>https://velog.io/@you_sunning/%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%97%94%ED%8B%B0%ED%8B%B0</guid>
            <pubDate>Tue, 06 Jan 2026 05:21:51 GMT</pubDate>
            <description><![CDATA[<h3 id="requestmapping-vs-getmapping">@RequestMapping vs @GetMapping</h3>
<p>공통점: 둘 다 URL을 메서드에 연결하는 어노테이션
<strong>&quot; HTTP 요청 -&gt; Controller 메서드 &quot;</strong></p>
<h4 id="requestmapping-범용">@RequestMapping (범용)</h4>
<pre><code class="language-java">@RequestMapping(&quot;/api/user&quot;)</code></pre>
<p>특징 : </p>
<ul>
<li>GET / POST / PUT / DELETE 전부 가능</li>
<li>클래스 / 메서드 둘 다 사용 가능</li>
</ul>
<p>단점 : </p>
<ul>
<li>코드 길어짐</li>
<li>한 눈에 HTTP 메서드가 안 보임</li>
</ul>
<h4 id="getmapping--postmapping-전용">@GetMapping / @PostMapping (전용)</h4>
<pre><code class="language-java">@GetMapping(&quot;/abc&quot;)
@PostMapping(&quot;/login&quot;)
@PutMapping(&quot;/{id}&quot;)
@DeleteMapping(&quot;/{id}&quot;)</code></pre>
<p>특징 :</p>
<ul>
<li>HTTP 메서드 의미가 바로 보임</li>
<li>가독성 최고</li>
<li>실무 표준</li>
</ul>
<pre><code class="language-java">@GetMapping(&quot;/abc&quot;)</code></pre>
<p>⬇️ 이거랑 같음</p>
<pre><code class="language-java">@RequestMapping(
  value = &quot;/abc&quot;,
  method = RequestMethod.GET
)</code></pre>
<h3 id="entity만-붙였는데-테이블이-생기는-이유">@Entity만 붙였는데 테이블이 생기는 이유</h3>
<ul>
<li>Spring Boot+ JPA + Hibernate가
&quot;엔티티 보고 테이블 만들어도 되네&quot; 하고 자동 생성</li>
</ul>
<h4 id="내부에서-벌어지는-일">내부에서 벌어지는 일</h4>
<p><strong>1.</strong> 애플리케이션 시작</p>
<ul>
<li>spring boot가 설정 확인<pre><code class="language-properties">spring.jpa.hibernate.ddl-auto=update</code></pre>
</li>
<li><em>2.*</em> @Entity 스캔<pre><code class="language-java">@Entity
public class User {
   @Id @GeneratedValue
   private Long id;
   private String email;
}</code></pre>
<blockquote>
<p><strong>--&gt; Hibernate :</strong>
“User → 테이블 후보”</p>
</blockquote>
</li>
</ul>
<p><strong>3.</strong> 테이블 생성 SQL 자동 생성</p>
<pre><code class="language-java">create table user (
  id bigint not null,
  email varchar(255),
  primary key (id)
);</code></pre>
<blockquote>
<p><strong>--&gt; DB에 실행</strong></p>
</blockquote>
<h3 id="왜-가능한가">왜 가능한가?</h3>
<ul>
<li>JPA는  ORM(<strong>Object ↔ Table 매핑</strong>) 기술이라서</li>
</ul>
<blockquote>
<p>자바 클래스 ↔ DB 테이블
필드 ↔ 컬럼
(자동 변환이 가능함)</p>
</blockquote>
<hr>
<blockquote>
<pre><code>@RestController  → 요청 받음
@Service         → 로직 처리
@Repository      → DB 접근
@Entity          → DB 구조</code></pre></blockquote>
<pre><code>
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[스프링부트 @어노테이션]]></title>
            <link>https://velog.io/@you_sunning/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98</link>
            <guid>https://velog.io/@you_sunning/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98</guid>
            <pubDate>Tue, 06 Jan 2026 04:57:09 GMT</pubDate>
            <description><![CDATA[<h3 id="어노테이션">어노테이션</h3>
<p><strong>&quot;이 클래스는 이런 역할이다&quot; 라고 Spring에게 알려주는 라벨이다.</strong></p>
<p>Spring은 이 라벨을 보고</p>
<ul>
<li>언제 만들기</li>
<li>어떻게 관리할지</li>
<li>어디에 주입할지</li>
</ul>
<p>결정한다.</p>
<h3 id="어노테이션을-붙이지-않을-경우엔">어노테이션을 붙이지 않을 경우엔?</h3>
<p>예)</p>
<pre><code class="language-java">public class UserService {
}</code></pre>
<p>spring 입장에서는
<strong>&quot;이건 그냥 평범한 자바 클래스이구나.&quot;</strong>
--&gt; 결과 : 객체 안 만듦, 주입 안 됨, 실행 중 에러 발생.</p>
<h3 id="핵심-어노테이션-4종">핵심 어노테이션 4종</h3>
<h4 id="1-restcontroller">1. @RestController</h4>
<pre><code class="language-java">@RestController
public class UserController {
}</code></pre>
<p>의미 :</p>
<ul>
<li>이 클래스는 HTTP 요청받는 역할.</li>
<li>반환 값을 JSON으로 자동 변환.</li>
</ul>
<p>어노테이션이 없다면?</p>
<ul>
<li>url 매핑 안 됨</li>
<li>프론트에서 호출해도 404</li>
</ul>
<h4 id="2-service">2. @Service</h4>
<pre><code class="language-java">@Service
public class UserService {
}</code></pre>
<p>의미 :</p>
<ul>
<li>이 클래스는 비즈니스 로직 담당.</li>
<li>Spring이 객체로 만들어서 관리.</li>
</ul>
<p>굳이 Service 사용하는 이유?</p>
<ul>
<li>Controller랑 역할 분리</li>
<li>트랜잭션, 테스트, 유지보수 때문</li>
</ul>
<h4 id="3-repository">3. @Repository</h4>
<pre><code class="language-java">@Repository
public interface UserRepository extends JpaRepository&lt;User, Long&gt; {
}</code></pre>
<p>의미 :</p>
<ul>
<li>DB 접근 담당</li>
<li>예외를 Spring 예외로 변환</li>
</ul>
<p>※ JPA Repository는 사실상 생략이 가능하지만
<strong>의미상 붙여두는 게 좋다.</strong></p>
<h4 id="4-entity">4. @Entity</h4>
<pre><code class="language-java">@Entity
public class User {
}</code></pre>
<p>의미 :</p>
<ul>
<li>이 클래스는 DB 테이블</li>
<li>Hibernate가 관리</li>
</ul>
<p>어노테이션이 없다면?</p>
<ul>
<li>테이블 매핑 안 됨</li>
<li>DB 저장 불가</li>
</ul>
<h3 id="spring은-어노테이션을-어떻게-찾나">Spring은 어노테이션을 어떻게 찾나?</h3>
<h4 id="springbootapplication">@SpringBootApplication</h4>
<pre><code class="language-java">@SpringBootApplication
public class DemoApplication {
}</code></pre>
<p>이 코드가 하는 일 :</p>
<ul>
<li>현재 패키지 기준으로</li>
<li>하위 패키지 전부 스캔</li>
<li>어노테이션 붙은 클래스 전부 등록</li>
</ul>
<p>※ 그래서 구조가 중요하다.</p>
<h3 id="어노테이션-없으면-di가-왜-안-되냐">어노테이션 없으면 DI가 왜 안 되냐?</h3>
<p><strong>spring의 사고 흐름 :</strong></p>
<ul>
<li>&quot;Bean으로 등록된 애들만 서로 주입해줄 수 있어&quot;</li>
</ul>
<p>-&gt; 즉 :</p>
<ul>
<li><code>@Service</code> -&gt; Bean 등록</li>
<li><code>@Repository</code> -&gt; Bean 등록</li>
<li>생성자에서 요구 -&gt; Spring이 연결</li>
</ul>
<h3 id="역할별-어노테이션-정리표">역할별 어노테이션 정리표</h3>
<table>
<thead>
<tr>
<th>계층</th>
<th>어노테이션</th>
<th>역할</th>
</tr>
</thead>
<tbody><tr>
<td>Controller</td>
<td><code>@RestController</code></td>
<td>요청/응답</td>
</tr>
<tr>
<td>Service</td>
<td><code>@Service</code></td>
<td>비즈니스 로직</td>
</tr>
<tr>
<td>Repository</td>
<td><code>@Repository</code></td>
<td>DB 접근</td>
</tr>
<tr>
<td>Entity</td>
<td><code>@Entity</code></td>
<td>DB 테이블</td>
</tr>
<tr>
<td>설정</td>
<td><code>@Configuration</code></td>
<td>설정 클래스</td>
</tr>
</tbody></table>
<ul>
<li>어노테이션은 <strong>Spring 등록 스위치</strong></li>
<li>안 붙히면 Spirng은 모른다.</li>
<li>역할에 맞는 어노테이션이 중요하다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Springboot service란]]></title>
            <link>https://velog.io/@you_sunning/Springboot-service%EB%9E%80</link>
            <guid>https://velog.io/@you_sunning/Springboot-service%EB%9E%80</guid>
            <pubDate>Tue, 06 Jan 2026 02:46:58 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-java">private final UserRepository userRepository;

public UserService(UserRepository userRepository) {
    this.userRepository = userRepository;
}</code></pre>
<blockquote>
<p><strong>&quot;UserService는 UserRepository가 반드시 필요하고, 그걸 Spring이 대신 만들어서 넣어준다&quot;</strong></p>
</blockquote>
<p>의존성 주입(Dependency Injection, DI)
spring은 앱 시작할 때 :
<strong>1.</strong> <code>UserRepository</code>를 먼저 생성한다.
<strong>2.</strong> <code>UserService</code> 생성하려고 보니까.
---&gt; &quot;어? 생성자에<code>USerRepository</code>가 필요하네?
<strong>3.</strong> 이미 만들어둔 <code>UserRepository</code>를 자동으로 넣어준다.</p>
<p>이 과정이 바로 <strong>생성자 주입</strong>.</p>
<h3 id="왜-private-final-인가">왜 private final 인가?</h3>
<p><code>private</code> : 외부에서 멋대로 바꾸지 못하도록.
<code>final</code> : 한 번 주입되면 절대 바뀌지 않게하고, <strong>Service는 &quot;의존 대상이 고정&quot;</strong> 되어야 한다.</p>
<h3 id="실생활-비유">실생활 비유</h3>
<ul>
<li>UserService = 카페 직원</li>
<li>UserRepository = POS 기계<blockquote>
<p>본사(Spring)가 POS를 준비해서 직원에게 지급.</p>
</blockquote>
</li>
</ul>
<h3 id="빠른-이해-">빠른 이해 :</h3>
<blockquote>
<p>Service는 Repository를 직접 만들지 않는다.
Spring이 만들어준 걸 &quot;생성자로 받아서 쓴다&quot;</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[비트 연산 vs 논리 연산 차이점]]></title>
            <link>https://velog.io/@you_sunning/%EB%B9%84%ED%8A%B8-%EC%97%B0%EC%82%B0-vs-%EB%85%BC%EB%A6%AC-%EC%97%B0%EC%82%B0-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
            <guid>https://velog.io/@you_sunning/%EB%B9%84%ED%8A%B8-%EC%97%B0%EC%82%B0-vs-%EB%85%BC%EB%A6%AC-%EC%97%B0%EC%82%B0-%EC%B0%A8%EC%9D%B4%EC%A0%90</guid>
            <pubDate>Mon, 14 Apr 2025 07:35:33 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/you_sunning/post/d625f01f-2ebe-4bcb-9dc1-de19d69e1ebc/image.png" alt="">
<img src="https://velog.velcdn.com/images/you_sunning/post/6eba1ab9-3998-45f4-9ddb-4af97baf64ce/image.png" alt="">
<img src="https://velog.velcdn.com/images/you_sunning/post/39cf95ba-fb4d-4935-8a5d-06dd78bd8c51/image.png" alt="">
<img src="https://velog.velcdn.com/images/you_sunning/post/0e67e9db-4ea7-4924-a315-68c9c5e61b22/image.png" alt="">
<img src="https://velog.velcdn.com/images/you_sunning/post/06f64d67-b8bb-48d3-9dd1-34d2698f883a/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Cookie & Local Storage]]></title>
            <link>https://velog.io/@you_sunning/Cookie-Local-Storage</link>
            <guid>https://velog.io/@you_sunning/Cookie-Local-Storage</guid>
            <pubDate>Fri, 11 Apr 2025 06:37:50 GMT</pubDate>
            <description><![CDATA[<h2 id="📝-간단한-개인-todolist-사이트-만들기">📝 간단한 개인 TodoList 사이트 만들기</h2>
<p>todolist를 웹브라우저가 닫혀도 저장할 수 있도록 하고 싶었다. 
DB 사용이 아닌 Cookie와 Local Storage 활용할것이다.</p>
<h3 id="1-cookie">1. Cookie</h3>
<ul>
<li>하이퍼 텍스트의 기록서(HTTP)의 일종으로서 인터넷 사용자가 어떠한 웹사이트를 방문할 경우 그 사이트가 사용하고 있는 서버를 통해 인터넷 사용자의 컴퓨터에 설치되는 작은 기록 정보 파일을 일컫는다.</li>
</ul>
<blockquote>
<p>쇼핑몰 사이트를 방문하여 이것저것 보았을 때, 하단에 최근 본 상품이라는 것을 본 적이 있을 것이다. 또한 팝업창에 오늘 하루 안보기 체크와 같은 정보들은 모두 쿠키에 저장되어 관리된다.</p>
</blockquote>
<ul>
<li>개념은 이정도로 간단하게 설명하고, JS에서는 어떻게 Cookie를 사용하고 관리 할까?</li>
</ul>
<h4 id="❓-cookie-저장하는-법">❓ Cookie 저장하는 법</h4>
<pre><code class="language-js">document.cookie = &quot;cookie-js&quot;</code></pre>
<p>기존에 있던 cookie에 key: cookie, value: js 쌍으로 저장이 된다.</p>
<p><img src="https://velog.velcdn.com/images/you_sunning/post/a09dedb5-330d-461b-b4d1-eb4f4c91e426/image.png" alt=""></p>
<h4 id="❓-cookie를-가져오는-법">❓ Cookie를 가져오는 법</h4>
<pre><code class="language-js">document.cookie</code></pre>
<p>위의 코드를 통해 cookie에 저장된 값들을 읽어올 수 있다.
각 쿠키는 ;로 구분되어 있어서 split로 쪼개고 다시한번 key.value에 맞게 쪼개서 적절히 사용하면 된다.</p>
<p><img src="https://velog.velcdn.com/images/you_sunning/post/c89a3632-ea3d-4489-a7a3-4372f40af5c3/image.png" alt=""></p>
<h4 id="❓-cookie에-유효기간-넣기">❓ Cookie에 유효기간 넣기</h4>
<p>Cookie에 유효기간을 지정하지 않으면 브라우저가 종료되면 쿠키값을 사라진다.</p>
<p>1) 그리니치 표준시(GMT)를 사용하여 유효기간을 넣는다.</p>
<pre><code class="language-js">document.cookie = &quot;cookie=js; expires=Wed, 18 Aug 2021 20:00:00 GMT&quot;;</code></pre>
<p>위와 같이 직접 넣어줄 수도 있지만, 보통 오늘 날짜 기준으로 며칠 뒤까지 유효기간을 설정하는 것이 보통이다.</p>
<pre><code class="language-js">let data = new Date();
date.setDate(date.getDate() + 1);
document.cookie = `cookie=js expires=${date.toGMTString()}`;</code></pre>
<p>data.getDate()로 오늘 날짜를 받아와 +1 (하루)를 더 해주고 그것을 setDate로 저장해주고 템플릿 리터럴을 이용해서 넣어주면 된다.</p>
<p>2) max-age로 설정
설정된 값 기준으로 유효기간 설정</p>
<pre><code class="language-js">document.cookie = &quot;cookie-js; max-age-3600&quot;;</code></pre>
<p>max-age의 단위는 1초이다. 3600은 1시간을 의미한다. 이렇게 직접 시간을 지정해서 설정할 수도 있다. </p>
<h4 id="️-cookie-주의-사항">‼️ Cookie 주의 사항</h4>
<ul>
<li>Http 요청 시 헤더에 cookie가 포함되기 때문에 Http 요청 크기가 커진다.</li>
<li>크기 제한이 있다.</li>
<li>보안 취약점이 존재한다.</li>
</ul>
<h3 id="2-local-storage">2. Local Storage</h3>
<ul>
<li>cookie와 마찬가지로 개발자 도구에서 확인 가능하고 key, value 쌍으로 저장이 된다.</li>
<li>도메인 기반으로 Storage가 생성이 된다.</li>
<li>도메인만 같다면 여러탭 내에서 같은 Storage가 공유된다.</li>
<li>직접 삭제하는 경우가 아니면 삭제되지 않는다.</li>
</ul>
<h4 id="❓-local-storage-저장하는-법">❓ Local Storage 저장하는 법</h4>
<pre><code class="language-js">window.localStorage.cookie = &quot;js&quot;;
window.localStorage[cookie] = &quot;js&quot;;
window.localStorage.setItem(&quot;cookie&quot;,&quot;js&quot;);</code></pre>
<p>setItem을 이용하는 것을 권장한다.
나머지는 특정한 상황시 내장함수를 덮어씌우는 경우를 발생하기 때문이다.
또한 Local Storage는 string만 넣을 수 있다. 그래서 만약 객체를 넣고 싶으면 JSON.stringify로 넣고, JSON.parse로 가져온다.</p>
<p><img src="https://velog.velcdn.com/images/you_sunning/post/13f136bb-9dc3-4870-97b9-fa8651704e41/image.png" alt=""></p>
<h4 id="❓-local-storage-가져오는-법">❓ Local Storage 가져오는 법</h4>
<pre><code class="language-js">localStorage.getItem(&quot;cookie&quot;); //불러오기
localStorage.removeItem(&quot;cookie&quot;) //삭제하기
localStorage.clear() //전체삭제</code></pre>
<p>위 같은 방법으로 간단한 프로젝트 시 Client Side 에서 데이터를 저장하여 활동하면 된다.</p>
<p>출처: <a href="https://ghost4551.tistory.com/132">https://ghost4551.tistory.com/132</a> [프론트엔드 개발자의 기록 공간:티스토리]</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[npm : 이 시스템에서 스크립트를 실행할 수 없으므로 ]]></title>
            <link>https://velog.io/@you_sunning/npm-%EC%9D%B4-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%97%90%EC%84%9C-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC-%EC%8B%A4%ED%96%89%ED%95%A0-%EC%88%98-%EC%97%86%EC%9C%BC%EB%AF%80%EB%A1%9C</link>
            <guid>https://velog.io/@you_sunning/npm-%EC%9D%B4-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%97%90%EC%84%9C-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC-%EC%8B%A4%ED%96%89%ED%95%A0-%EC%88%98-%EC%97%86%EC%9C%BC%EB%AF%80%EB%A1%9C</guid>
            <pubDate>Mon, 07 Apr 2025 00:24:17 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/you_sunning/post/358cfa3f-662d-48a3-a98a-30a444391884/image.png" alt=""></p>
<h3 id="1-현재-권한상태를-확인합니다-window-powershell-관리자모드-진입">1. 현재 권한상태를 확인합니다. (Window PowerShell 관리자모드 진입)</h3>
<blockquote>
<p>get-ExecutionPolicy</p>
</blockquote>
<p>  저는 상태값 &quot;Restricted&quot; 으로, 로컬에서 작성한 스크립트를 실행할 수 없는상태여서 오류가 발생한 것입니다.</p>
<ul>
<li><p>권한 상태값</p>
<p>Restricted : default설정값으로, 스크립트 파일을 실행할 수 없습니다.</p>
<p>AllSigned : 신뢰할 수 있는(서명된) 스크립트 파일만 실행할 수 있습니다.</p>
<p>RemoteSigned : 로컬에서 본인이 생성한 스크립트와, 신뢰할 수 있는(서명된) 스크립트 파일 실행할 수 있습니다.</p>
<p>Unrestricted : 모든 스크립트 실행가능</p>
<p>ByPass : 경고/차단 없이 모든 것을 실행가능하도록함</p>
<p>Undefined : 권한을 설정하지 않겠음</p>
</li>
</ul>
<h3 id="2-권한-상태를-remotesigned으로-변경합니다">2. 권한 상태를 &quot;RemoteSigned&quot;으로 변경합니다.</h3>
<blockquote>
<p>Set-ExecutionPolicy RemoteSigned</p>
</blockquote>
<blockquote>
<p>Y</p>
</blockquote>
<p>  <img src="https://velog.velcdn.com/images/you_sunning/post/7d961d17-33c0-47a5-8a83-a6922c191dd9/image.png" alt=""></p>
<h3 id="3-권한이-정상적으로-변경되었는지-다시-확인">3. 권한이 정상적으로 변경되었는지 다시 확인</h3>
<blockquote>
<p>get-ExecutionPolicy</p>
</blockquote>
<h3 id="4-vscode로-돌아가서-터미널-명령을-다시-수행하여-오류가-해결되었는지-확인">4. VSCode로 돌아가서 터미널 명령을 다시 수행하여 오류가 해결되었는지 확인</h3>
<ul>
<li><p>처음에 실행되지않았던 명령이, 이제는 정상적으로 수행되었습니다.</p>
<p><img src="https://velog.velcdn.com/images/you_sunning/post/45f9db03-b39e-4ca1-a88e-26e520ef6645/image.png" alt=""></p>
</li>
</ul>
<hr>
<hr>
<p>참고 :
<a href="https://hellcoding.tistory.com/entry/VSCode-%EC%98%A4%EB%A5%98-%EC%9D%B4-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%97%90%EC%84%9C-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC-%EC%8B%A4%ED%96%89%ED%95%A0-%EC%88%98-%EC%97%86%EC%9C%BC%EB%AF%80%EB%A1%9C">https://hellcoding.tistory.com/entry/VSCode-%EC%98%A4%EB%A5%98-%EC%9D%B4-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%97%90%EC%84%9C-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC-%EC%8B%A4%ED%96%89%ED%95%A0-%EC%88%98-%EC%97%86%EC%9C%BC%EB%AF%80%EB%A1%9C</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[실습 중 터미널 실행 문제 해결]]></title>
            <link>https://velog.io/@you_sunning/%EC%8B%A4%EC%8A%B5-%EC%A4%91-%ED%84%B0%EB%AF%B8%EB%84%90-%EC%8B%A4%ED%96%89-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0</link>
            <guid>https://velog.io/@you_sunning/%EC%8B%A4%EC%8A%B5-%EC%A4%91-%ED%84%B0%EB%AF%B8%EB%84%90-%EC%8B%A4%ED%96%89-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0</guid>
            <pubDate>Tue, 11 Mar 2025 02:21:09 GMT</pubDate>
            <description><![CDATA[<h4 id="데이터-콘솔-화면에-출력할-때-명령문">데이터 콘솔 화면에 출력할 때 명령문</h4>
<p>System.out.print() : 괄호 안의 내용을 출력
System.out.println() : 괄호 안의 내용을 출력하고 한 행을 띄움
System.out.printf() : 문자열을 서식문자를 이용하여 형식화된 내용으로 출력</p>
<p><img src="https://velog.velcdn.com/images/you_sunning/post/d89f9e6a-a156-4b00-8898-b95b1be2ceb2/image.png" alt=""></p>
<h4 id="터미널-실행-실패-문제-해결">터미널 실행 실패 문제 해결</h4>
<p>통합 터미널 설정
<img src="https://velog.velcdn.com/images/you_sunning/post/fad8d153-2562-4bf1-9674-395dd73a5ead/image.png" alt=""></p>
<p>사용자 JSON 파일에서 직접 수정.
settings.json 파일을 열거나.
명령 팔레트(Ctrl+Shift+P)에서 Preferences:Open User Settings(JSON) 명령을 사용하여 오픈</p>
<p>아래 사진과 같이
<code>&quot;terminal.integrated.defaultProfile.windows&quot;: &quot;PowerShell&quot;</code>
로 변경.</p>
<p><img src="https://velog.velcdn.com/images/you_sunning/post/9de9e6ae-1a99-48cd-9cfd-7115904503cc/image.png" alt=""></p>
<hr>
<p><img src="https://velog.velcdn.com/images/you_sunning/post/a742f94c-7d1c-49de-935e-39d0465f5910/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[홍쌤의 정규식 표현법]]></title>
            <link>https://velog.io/@you_sunning/%ED%99%8D%EC%8C%A4%EC%9D%98-%EC%A0%95%EA%B7%9C%EC%8B%9D-%ED%91%9C%ED%98%84%EB%B2%95</link>
            <guid>https://velog.io/@you_sunning/%ED%99%8D%EC%8C%A4%EC%9D%98-%EC%A0%95%EA%B7%9C%EC%8B%9D-%ED%91%9C%ED%98%84%EB%B2%95</guid>
            <pubDate>Tue, 11 Feb 2025 05:41:52 GMT</pubDate>
            <description><![CDATA[<h2 id="1-문자숫자특수기호-관련-정규-표현식">1) 문자/숫자/특수기호 관련 정규 표현식</h2>
<ul>
<li><code>\d</code> : 숫자</li>
<li><code>\D</code> : 숫자가 아닌 모든 것</li>
<li><code>\w</code> : 글자 (영어, 숫자, 한글) + _ (언더바)</li>
<li><code>\W</code> : 글자가 아닌 모든 것 (특수기호, 공백)</li>
<li><code>\s</code> : 공백</li>
<li><code>\t</code> : 탭</li>
<li><code>\n</code> : 엔터</li>
<li><code>[[:digit:]]</code> : 숫자</li>
<li><code>[[:alpha:]]</code> : 문자</li>
<li><code>[[:alnum:]]</code> : 숫자 + 문자</li>
<li><code>[[:punct:]]</code> : 특수기호</li>
</ul>
<h2 id="2-반복-횟수를-지정하는-표현식">2) 반복 횟수를 지정하는 표현식</h2>
<ul>
<li><code>?</code> : 0회 또는 1회</li>
<li><code>*</code> : 0회 이상</li>
<li><code>+</code> : 1회 이상</li>
<li><code>{n}</code> : n회</li>
<li><code>{n,}</code> : n회 이상</li>
<li><code>{n,m}</code> n회 이상 m회 이하</li>
</ul>
<h2 id="3-패턴-관련-정규-표현식">3) 패턴 관련 정규 표현식</h2>
<ul>
<li><code>[ab]</code> : a 또는 b 한글자</li>
<li><code>[a-z]</code> : 영문 소문자 한글자</li>
<li><code>[A-Z]</code> : 영문 대문자 한글자</li>
<li><code>[A-z]</code> : 영문 한글자 (대소문자 구분없이)</li>
<li><code>[가-힣]</code> 또는 <code>[가-힝]</code> : 한글 한글자</li>
<li><code>[^ab]</code> : a와 b를 제외한 것</li>
</ul>
<h2 id="4-기타">4) 기타</h2>
<ul>
<li><code>.</code> : 엔터를 제외한 모든 한 글자 (숫자, 문자, 특수기호, 공백)</li>
<li><code>^</code> : 시작</li>
<li><code>$</code> : 끝</li>
<li><code>a|b</code> : a 또는 b</li>
<li><code>()</code> : 그룹지정</li>
<li><code>\</code> : escape character (일반 초기화)</li>
</ul>
<h3 id="regexp_substr">REGEXP_SUBSTR</h3>
<ul>
<li><p>정규식 표현식을 사용한 문자열 추출</p>
</li>
<li><p>문법 : REGEXP_SUBSTR(대상, 패턴, [검색위치],[발견횟수],[옵션],[추출그룹])</p>
</li>
<li><p>특징 :</p>
<ul>
<li>검색 위치 생략 시 1</li>
<li>발견횟수 생략 시 1 (1 이상의 값 전달 가능)</li>
<li>추출 그룹은 서브패턴을 추출 시 그 중 추출할 서브패턴 번호</li>
</ul>
</li>
<li><p>옵션 : </p>
<ul>
<li>c : 대소를 구분하여 검색</li>
<li>i : 대소를 구분하지 않고 검색</li>
<li>m : 패턴을 다중라인으로 선언 가능</li>
</ul>
</li>
</ul>
<p>예제 ) 숫자, 글자, 특수기호 추출 정규표현</p>
<pre><code>SELECT ID,
    REGEXP_SUBSTR(ID,&#39;\D&#39;) AS 숫자,
    REGEXP_SUBSTR(ID,&#39;\w&#39;) AS 글자,
    REGEXP_SUBSTR(ID,&#39;\w&#39;) AS 글자가 아닌 것,
    REGEXP_SUBSTR(ID, &#39;[[:punct:]]&#39;) AS 특수기호
FROM REGEXP1;</code></pre><p><img src="https://velog.velcdn.com/images/you_sunning/post/43f532fc-a7a9-402b-84cf-837c666ad485/image.png" alt=""></p>
<p>예제 ) 횟수 관련 정규 표현</p>
<pre><code>SELECT ID,
    REGEXP_SUBSTR(ID,&#39;[A-Z]\D+&#39;) AS &quot;영문-숫자 필수&quot;
    REGEXP_SUBSTR(ID,&#39;[A-Z]&#39;\D*) AS &quot;영문-숫자 선택&quot;
FROM REGEXP1;</code></pre><p><img src="https://velog.velcdn.com/images/you_sunning/post/70c9386a-01f7-4d46-a062-1eac7b47dde1/image.png" alt="">
20:03</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 기본 및 활용 - 집합 연산자, 계층형 질의, 서브쿼리, 그룹 함수]]></title>
            <link>https://velog.io/@you_sunning/SQL-%EA%B8%B0%EB%B3%B8-%EB%B0%8F-%ED%99%9C%EC%9A%A9-%EC%A7%91%ED%95%A9-%EC%97%B0%EC%82%B0%EC%9E%90-%EA%B3%84%EC%B8%B5%ED%98%95-%EC%A7%88%EC%9D%98</link>
            <guid>https://velog.io/@you_sunning/SQL-%EA%B8%B0%EB%B3%B8-%EB%B0%8F-%ED%99%9C%EC%9A%A9-%EC%A7%91%ED%95%A9-%EC%97%B0%EC%82%B0%EC%9E%90-%EA%B3%84%EC%B8%B5%ED%98%95-%EC%A7%88%EC%9D%98</guid>
            <pubDate>Mon, 10 Feb 2025 04:55:26 GMT</pubDate>
            <description><![CDATA[<h2 id="집합-연산자">집합 연산자</h2>
<h3 id="union">UNION</h3>
<p>합집합 (중복 행은 1개로 처리), 자동으로 정렬</p>
<ul>
<li>컬럼 수와 데이터 타입이 완전 일치해야함</li>
</ul>
<h3 id="union-all">UNION ALL</h3>
<p>합집합 (중복 행도 표시)</p>
<ul>
<li>UNION ALL이 UNION보다 성능 우수</li>
<li>정렬 자동적으로 발생하지 않는다.</li>
<li>컬럼 수와 데이터 타입이 완전 일치해야 한다.</li>
</ul>
<h3 id="intersect">INTERSECT</h3>
<ul>
<li>교집합 (INTERSCTION)</li>
</ul>
<h3 id="exceptmy-sql--minusoracle">EXCEPT(MY-SQL) / MINUS(ORACLE)</h3>
<ul>
<li>차집합 (DIFFERENCE)</li>
</ul>
<h3 id="cross-join">CROSS JOIN</h3>
<ul>
<li>곱집합(PRODUCT)</li>
</ul>
<h2 id="계층형-질의">계층형 질의</h2>
<h3 id="statrt-with">STATRT WITH</h3>
<ul>
<li>계층 구조 전개의 시작 위치 지정</li>
</ul>
<h3 id="connect-by">CONNECT BY</h3>
<ul>
<li>다음에 전개될 자식 데이터 지정</li>
<li>부모 계층형 쿼리에서 부모노드와 자식 노드 사이의 특정한 관계를 나타내는데 사용</li>
</ul>
<h3 id="prior">PRIOR</h3>
<ul>
<li>CONNNECT BY 절에 사용되며, 현재 읽은 컬럼을 지정한다.</li>
<li><strong>PRIOR 자식 = 부모</strong> 형태 :
  계층구조에서 부모 데이터에서 자식 데이터(부모 -&gt; 자식) 방향으로 전개하는 순방향 전개,
  하위의 모든 노드 추출
<strong>PRIOR 부모 = 자식</strong> 형태 :
(자식 -&gt; 부모) 방향, 역방향 전개로, 상위의 모든 노드 추출</li>
</ul>
<h3 id="nocycle">NOCYCLE</h3>
<ul>
<li>동일한 데이터가 전개되지 않는다. 순환구조 발생 지점까지만 전개</li>
</ul>
<h3 id="order-siblings-by">ORDER SIBLINGS BY</h3>
<ul>
<li>모든 전개를 수행한 후에 지정된 조건을 만족하는 데이터만 추출한다. (필터링)</li>
</ul>
<h3 id="level">LEVEL</h3>
<ul>
<li>루트 데이터이면 1, 그 하위 데이터면2, 리프 데이터까지 1씩 증가</li>
</ul>
<h3 id="connect_by_isleaf">CONNECT_BY_ISLEAF</h3>
<ul>
<li>해당 데이터가 리프 데이터면1, 그렇지 않으면 0</li>
</ul>
<h3 id="connect_by_iscycle">CONNECT_BY_ISCYCLE</h3>
<ul>
<li>해당 데이터가 조상이면1, 아니면 0 (CYCLE 옵션을 사용했을 시에만 사용가능)</li>
</ul>
<h3 id="sys_connect_by_path">SYS_CONNECT_BY_PATH</h3>
<ul>
<li>루트 데이터부터 현재 전개할 데이터까지의 경로를 표시</li>
</ul>
<h3 id="connect_by_root">CONNECT_BY_ROOT</h3>
<ul>
<li>현재 전개할 데이터의 루트 데이터(최상위)를 표시. 단항 연산자.</li>
</ul>
<blockquote>
<p>START WITH절에서 필터링된 시작 데이터는 결과목록에 포함!!
이후 데이터는 CONNECT BY절에 의해 필터링</p>
</blockquote>
<blockquote>
<p><strong>[SQL SERVER]</strong> 계층형 질의문은</p>
<ul>
<li>CRE(common table expression)를 재귀 호출함으로싸 계층 구조 전개</li>
<li>앵커 멤버를 실행하여 기본 결과 집합을 만들고 이후 재귀 멤버를 지속적으로 실행</li>
</ul>
</blockquote>
<blockquote>
<p><strong>[Oracle]</strong> 계층형 질의문은</p>
<ul>
<li>WHERE절은 모든 전개를 진행한 이후 필터 조건. 조건을 만족하는 데이터만 추출하는데 활용.</li>
<li>PRIOR 키워드는 SELEC,WHERE 절에서도 사용 가능하다.</li>
</ul>
</blockquote>
<blockquote>
<p>SELECT (스칼라 서브쿼리)
    FROM (인라인뷰)
  WHERE (서브쿼리)</p>
</blockquote>
<h2 id="서브쿼리-">서브쿼리 :</h2>
<p>하나의 SQL문 안에 포함되어 있는 또 다른 SQL문, 알려지지 않은 기준을 이용한 검색에 사용</p>
<ul>
<li><p>서브쿼리를 괄호로 감싸서 사용</p>
</li>
<li><p>서브쿼리는 단일 행 또는 복수행 비교 연산자와 함게 사용가능</p>
<ul>
<li>단일 행 비교 연산자는 서브쿼리의 결과가 반드시 1건 이하여야 하고
복수 행 비교 연산자는 결과 건수와 상관 없다.</li>
</ul>
</li>
<li><p><strong>서브쿼리에서는 ORDER BY를 사용하지 못한다.</strong></p>
</li>
<li><p>SELECT, FROM, WHERE, HAVING, ORDER BY, INSERT-VALUES, UPDATE-SET 절에 사용가능 <strong>WHERE 절에 있는 서브쿼리</strong></p>
</li>
</ul>
<h3 id="top-n-서브쿼리">TOP-N 서브쿼리</h3>
<ul>
<li><p>INLINE VIEW 의 정렬된 데이터를 ROWNUM을 이용해 결과 행수를 제한 하거나 TOP(N)조건을 사용한다.</p>
</li>
<li><p>SELECT * 
  FROM (SELECT ROWNUM TOP, A FROM B) a
WHERE a.TOP =2 ;</p>
</li>
</ul>
<h3 id="단일-행-비교-연산자">단일 행 비교 연산자</h3>
<ul>
<li>=, &lt;, &gt;, &lt;=, &gt;= 등, 항상 1건 이하인 서브쿼리</li>
</ul>
<h3 id="다중-행-비교-연산자">다중 행 비교 연산자</h3>
<ul>
<li>IN,ALL, ANY, SOME 등 하나 이상의 데이터가 RETURN</li>
<li>ALL : 서브쿼리 값 모두가 조건에 만족하면 TRUE
(WHERE 컬럼명 &lt; ALL(A,B) : A보다 작으면서, B보다도 작아야함)</li>
<li>ANY: 서브쿼리 값 중 어느 하나의 값이라도 만족하면 결과 값을 리턴</li>
</ul>
<h3 id="다중-컬럼-서브쿼리">다중 컬럼 서브쿼리</h3>
<ul>
<li>여러 컬럼을 반환</li>
<li>메일쿼리의 조건절에 여러 컬럼을 동시 비교 가능</li>
<li>서브쿼리와 메인쿼리에서 비교하고자 하는 컬럼 개수와 컬럼 위치가 동일해야한다.</li>
<li>SQL SERVER에서는 현재 지원이 되지 않는다.</li>
</ul>
<h3 id="상호-연관-서브쿼리-correlated-subquery">상호 연관 서브쿼리 (Correlated SubQuery)</h3>
<ul>
<li>메인 쿼리 값을 서브쿼리가 사용하고 서브쿼리의 값을 받아서 메인 쿼리가 계산되는 쿼리</li>
<li>서브쿼리가 메인쿼리의 행 수 만큼 실행되는 쿼리</li>
<li>실행 속도가 상대적으로 떨어짐</li>
<li>복잡한 일반 배치 프로그램을 대체할 수 있어 조건에 맞는다면 적극적 검토 필요</li>
</ul>
<h3 id="스칼라-서브쿼리">스칼라 서브쿼리</h3>
<ul>
<li>한 행, 한 컬럼만을 반환하는 서브쿼리</li>
<li>메인쿼리의 컬럼 사용 가능. 메인쿼리는 스칼라 서브쿼리의 컬럼 사용 불가능</li>
<li>ORDER BY구 사용할 수 없다.</li>
</ul>
<h3 id="sql-개선-측면-서브쿼리-종류">SQL 개선 측면 서브쿼리 종류</h3>
<ul>
<li>Access Subquery : 쿼리의 변형불가, 제공자 역할</li>
<li>Filter Subquery : 쿼리의 변형불가, 확인자 역할</li>
<li>Early Subquery : 쿼리의 변형불가, 서브쿼리가 먼저 실행하여 데이터를 걸러낸다.</li>
</ul>
<h3 id="인라인-뷰-inline-view">인라인 뷰 (INLINE VIEW)</h3>
<ul>
<li>테이블 명이 올 수 있는 FROM절에서 정의</li>
<li>ORDER BY 사용 가능</li>
<li>SQL 문장 내 절차성을 주는 효과를 볼 수 있다.</li>
<li>실질적인 오브젝트는 아니지만, SQL 문장에서 마치 VIEW나 테이블처럼 사용</li>
<li>메인쿼리에서 컬럼 사용 가능</li>
</ul>
<h3 id="뷰">뷰</h3>
<ul>
<li>테이블은 실제로 데이터를 가지고 있는 반면, 뷰는 실제 데이터를 가지고 있지 않다. 가상테이블이라고도 한다.</li>
<li>단지 정의만을 가지고 있으며, 실행 시점에 질의를 재작성하여 수행한다.
[뷰 사용 장점]</li>
</ul>
<ol>
<li>독립성 : 테이블 구조가 변경되어도 뷰를 사용하는 응용 프로그림은 변경하지 않아도 된다.</li>
<li>편리성 : 복잡한 질의를 뷰로 생성함으로써 관련 질의를 단순하게 작성할 수 있다.</li>
<li>보안성 : 직원의 급여정보와 같이 숨기고 싶은 정보가 존재할 때 사용
CREATE VIEW 뷰명 AS
DROP VIRE 뷰명;</li>
</ol>
<h2 id="그룹함수">그룹함수</h2>
<h3 id="rollup">ROLLUP</h3>
<p>Subtotal을 생성하기 위해 사용, Grouping Columns의 수를 N이라고 했을 때 N+1 Level의 Subtotal이 생성된다. 인수 순서에 주의</p>
<ul>
<li>ROLLUP(A,B) : A별 합계, A/B별 합계, 전체 합계</li>
<li>ROLLUP(COL1,COL2) = GROUPING SETS((COL1,COL2),(COL1),())</li>
</ul>
<h3 id="grouping">GROUPING</h3>
<p>-Subtotal의 total을 생성</p>
<h3 id="cube">CUBE</h3>
<ul>
<li>결합 가능한 모든 값에 대하여 다차원 집계를 생성, ROLLUP에 비해 시스템에 부하가 심함</li>
<li>GROUPING SETS(A,B(A,B),())=CUBE(A,B)</li>
</ul>
<h3 id="grouping-sets">GROUPING SETS</h3>
<ul>
<li>인수들에 대한 개별 집계를 구할 수 있다, 다양한 소계 집합 생성 가능</li>
</ul>
<p><a href="https://calmmimiforest.tistory.com/113">https://calmmimiforest.tistory.com/113</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 기본 및 활용 - 표준 조인]]></title>
            <link>https://velog.io/@you_sunning/SQL-%EA%B8%B0%EB%B3%B8-%EB%B0%8F-%ED%99%9C%EC%9A%A9</link>
            <guid>https://velog.io/@you_sunning/SQL-%EA%B8%B0%EB%B3%B8-%EB%B0%8F-%ED%99%9C%EC%9A%A9</guid>
            <pubDate>Wed, 05 Feb 2025 04:29:50 GMT</pubDate>
            <description><![CDATA[<h1 id="표준-조인">표준 조인</h1>
<h3 id="inner-join">INNER JOIN</h3>
<ul>
<li>join 조건에서 동일한 값이 있는 행만 반환, USING 이나 ON 절을 필수적으로 사용</li>
<li>(ANSI 표준)
  SELETE * FROM A, B WHERE A.aa = B.bb AND B.cc=&#39;dd&#39;
  SELETE * FROM A INNER JOIN B ON A.aa =B.bb WHERE B.cc=&#39;dd&#39;</li>
</ul>
<h3 id="natural-join">NATURAL JOIN</h3>
<ul>
<li>두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI JOIN 수행</li>
<li>NATTURAL JOIN 이 명시되면 추가로 USING, ON, WHERE 절에서 JOIN 조건을 정의할 수 없다.</li>
<li>SQL Sever는 지원하지 않음</li>
</ul>
<h3 id="equal-join">EQUAL JOIN</h3>
<ul>
<li>EQUAL JOIN 은 두개의 테이블 간에 컬럼 값이 일치하는 걸 조인, 두개의 테이블에서 교집합을 찾음
NON EQUAL JOIN</li>
<li>NON EQUAL JOIN 은 &lt;,&gt;,=,&lt;=,&gt;= 사용</li>
</ul>
<h3 id="self-join">SELF JOIN</h3>
<ul>
<li>한 테이블에서 두 개의 컬럼이 연관관계를 가지고 있는 경우에 사용한다.</li>
</ul>
<h3 id="using-조건절">USING 조건절</h3>
<ul>
<li>같은 이름을 가진 컬럼들 중에서 원하는 컬럼에 대해서만 선택적으로 equal join 수행</li>
<li>join 컬럼에 대해서 alias나 테이블 이름과 같은 접두사를 붙일 수 없다.</li>
</ul>
<h3 id="on-조건절">ON 조건절</h3>
<ul>
<li>ON 조건절과 WHERE조건절을 분리하여 이해가 쉬우며, 컬럼명이 다르더라도 join 조건을 사용할 수 있다.</li>
<li>alias나 테이블명 반드시 사용</li>
</ul>
<h3 id="cross-join">CROSS JOIN</h3>
<ul>
<li>JOIN 조건에서 동일한 값이 없는 행도 반환 가능, using이나 on 조건절 반드시 사용해야 한다.</li>
</ul>
<h3 id="outer-join">OUTER JOIN</h3>
<ul>
<li>join 조건에서 동일한 값이 없는 행도 반환 가능, using이나 on조건절 반드시 사용해야한다.</li>
</ul>
<h3 id="left-outer-join">LEFT OUTER JOIN</h3>
<ul>
<li>조인 수행시 먼저 표기된 좌측 테이블에 해당하는 데이터를 읽은 후, 나중 표기된 우측 테이블에서 join대상 데이터를 읽어온다.</li>
<li>우측 값에서 같은 값이 없는 경우 null 값으로 한다.</li>
</ul>
<h3 id="right-outer-join">RIGHT OUTER JOIN</h3>
<ul>
<li>left outer join의 반대</li>
<li>우측 테이블 값은 채워져 있으나, 좌측 테이블 값은 없을 때</li>
</ul>
<p>-(ANSI 표준)
    SELECT * FROM A,B WHERE A.aa(+)=B.bb
    SELECT * FROM A RIGHT OUTER JOIN B ON (A.aa=B.bb)</p>
<h3 id="full-outer-join">FULL OUTER JOIN</h3>
<ul>
<li>조인 수행시 좌측, 우측 테이블의 모든 데이터를 읽어 join하여 결과를 생성</li>
<li>중복 데이터는 삭제</li>
</ul>
<p> <a href="https://calmmimiforest.tistory.com/113">https://calmmimiforest.tistory.com/113</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 관리 구문 (DCL, DDL, DML, TCL)]]></title>
            <link>https://velog.io/@you_sunning/SQL-%EA%B4%80%EB%A6%AC-%EA%B5%AC%EB%AC%B8-DCL-DDL-DML-TCL</link>
            <guid>https://velog.io/@you_sunning/SQL-%EA%B4%80%EB%A6%AC-%EA%B5%AC%EB%AC%B8-DCL-DDL-DML-TCL</guid>
            <pubDate>Tue, 04 Feb 2025 00:20:52 GMT</pubDate>
            <description><![CDATA[<h2 id="sql-관리구문">SQL 관리구문</h2>
<h3 id="ddl-데이터-정의어-definition">DDL 데이터 정의어 (Definition)</h3>
<p>데이터 구조 정의
CREATE : 데이터 구조 생성
ALTER : 구조 변경
DROP : 구조 삭제
RENAME : 이름 변경
TRUNCATE : 테이블 초기화</p>
<h3 id="dml-데이터-조작-언어-mainpulation">DML 데이터 조작 언어 (Mainpulation)</h3>
<p>데이터 변형
INSERT : 데이터 입력
UPDATE : 데이터 수정
DELETE : 데이터 삭제</p>
<p>데이터 조회
SELETE : 조회</p>
<h3 id="dcl-데이터-조작어-control">DCL 데이터 조작어 (Control)</h3>
<p>권한받기
GRANT : 권한 부여
REVOKE : 권한 회수 </p>
<h3 id="tcl-트랜잭션-제어어">TCL 트랜잭션 제어어</h3>
<p>권한받기
COMMIT : 반영
ROLLBACK : 취소
SAVEPOINT : 위치지정</p>
<h3 id="요약">요약</h3>
<h3 id="ddl-데이터-정의어--create-alter-drop-rename-truncate">DDL 데이터 정의어 : CREATE, ALTER, DROP, RENAME, TRUNCATE</h3>
<pre><code># 1. 테이블(구조) 생성
CREATE TABLE 테이블명 (칼럼명1 DATETYPE [DEFAULT 형식], ..) ;

# 2. 테이블 변경
ALTER TABLE 테이블명 ADD 추가할_칼럼명 데이터유형;   # 칼럼 추가
ALTER TABLE 테이블명 DROP COLUMN 삭제할_칼럼명;   # 칼럼 삭제
ALTER TABLE 테이블명 MODIFY (칼럼명, 데이터유형);   # Oracle 칼럼 수정
ALTER TABLE 테이블명 ALTER (칼럼명, 데이터유형);   # SQL Server 칼럼 수정
ALTER TABLE 테이블명 RENAME COLUMN 변경될_칼럼명 TO 새칼럼명;   # 칼럼 이름 변경
ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명;   # 제약조건 삭제
ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명;   # 제약조건 추가

# 3. 테이블명 변경
RENAME 변경전_테이블명 TO 변경후_테이블명;

# 4. 테이블/데이터 삭제
DROP TABLE 테이블명 [CASCADE CONSTRAINT];   # 테이블 구조/데이터, [관계 있던 참조 제약조건] 삭제
TRUNCATE TABLE 테이블명;   # 테이블 구조는 유지, 데이터만 전부 삭제
</code></pre><h3 id="dml-데이터-조작어--select-insert-update-delete">DML 데이터 조작어 : SELECT, INSERT, UPDATE, DELETE</h3>
<pre><code># 1. 데이터 입력
INSERT INTO 테이블명 (컬럼 리스트) VALUES (데이터 리스트);

# 2. 데이터 변경
UPDATE 테이블명 SET 수정할 컬럼명 = 새로운 데이터 [WHERE 수정할 데이터에 대한 조건];

# 3. 데이터 삭제
DELETE FROM 테이블명;

# 4. 데이터 조회
SELECT * FROM [WHERE __ GROUP BY __ HAVING __ ORDER BY];</code></pre><h3 id="dcl-데이터-제어어--grant-revoke">DCL 데이터 제어어 : GRANT, REVOKE</h3>
<h3 id="tcl-트랜잭션-제어어--commit-rollback-savepoint">TCL 트랜잭션 제어어 : COMMIT, ROLLBACK, SAVEPOINT</h3>
<hr>
<h3 id="정리">정리</h3>
<h4 id="delete-drop-truncate-차이">DELETE, DROP, TRUNCATE 차이</h4>
<p>DELETE - 테이블 안 데이터 삭제 (오래 걸림)
DROP - 테이블 완전 삭제
TRUNCATE - 테이블 구조 유지, 데이터 전체 삭제 (비교적 빠름)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[VM Docker install]]></title>
            <link>https://velog.io/@you_sunning/Docker-install</link>
            <guid>https://velog.io/@you_sunning/Docker-install</guid>
            <pubDate>Sun, 17 Nov 2024 04:35:36 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/you_sunning/post/a3ab7caf-9836-48bf-a4ed-a7567d8f5d5b/image.png" alt=""></p>
<p>도커 &amp; 쿠버네티스 설치하기1</p>
<h3 id="cnicontainer-network-interface">CNI(Container Network interface)</h3>
<ul>
<li>파트와 파드의 통신을 책임져 주는 역할</li>
<li>container간 통신을 지원하는 VxLAN. Pod Network라고도 부른다.</li>
</ul>
<p>쿠버네티스 클러스터 구성</p>
<ul>
<li><p>control plane (master node)</p>
<ul>
<li>워커노드들의 상태를 관리하고 제어</li>
<li>single master</li>
<li>multi master (3, 5개의 master nodes)</li>
</ul>
</li>
<li><p>worker node</p>
<ul>
<li>도커 플랫폼을 통해 컨테이너를 동작하며 실제 서비스 제공</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/you_sunning/post/4080f108-0aaa-4e0e-a174-117423f733d9/image.png" alt=""></p>
<p>password 인증 받은 후 sudo 명령어 자유롭게 사용
<img src="https://velog.velcdn.com/images/you_sunning/post/a6be7df4-9b0e-40c6-9855-a0631ee89ce9/image.png" alt="">
각 항목별로 복사해서 각 노드에 입력하여 다운받기
<img src="https://velog.velcdn.com/images/you_sunning/post/3453c832-aecf-42b2-9679-923f39e2c0f1/image.png" alt=""></p>
<p>crtl+instert 복사
shift+insert 붙여넣기</p>
<p>레포지토리 등록하는 과정</p>
<p>업데이트 명령
<img src="https://velog.velcdn.com/images/you_sunning/post/d211df74-532d-4e78-bf02-5f98af0042ef/image.png" alt="">
업데이트 하고 가져오기</p>
<p>다운로드 완료된 후에 확인하는 명령어</p>
<pre><code>sudo systemctl enable docker
sudo systemctl start docker
sudo docker version</code></pre><p><img src="https://velog.velcdn.com/images/you_sunning/post/b426c67f-513b-428e-8d20-b4f2f9a4e42b/image.png" alt=""></p>
<p>위처럼 나왔으면 도커 설치 성공적</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컨테이너란?]]></title>
            <link>https://velog.io/@you_sunning/%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EB%9E%80</link>
            <guid>https://velog.io/@you_sunning/%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EB%9E%80</guid>
            <pubDate>Sun, 17 Nov 2024 03:48:38 GMT</pubDate>
            <description><![CDATA[<p>1강. 소개, 설치 , 컨테이너 실행하기</p>
<p>컨테이너란</p>
<h2 id="cat--appjs">cat &gt; app.js</h2>
<pre><code>const http = require(&#39;http&#39;);
const os = require(&#39;os&#39;);
console.log(&quot;Test server starting...&quot;);
var handler = function(req, res){
    res.writeHead(200);
    res.end(&quot;Container Hostname: &quot; +os.hostname() +&quot;₩n&quot;)
};
var www = http.createServer(handler);
www.listen(8080);</code></pre><p>간단한 node.js 기반의 프로그램 이 프로그램이 실행되기 위해서 node.js를 설치해준다.
그 다음 노드 명령어에 app.js 소스코드 파일이름을 넣어주면 실행된다.</p>
<h2 id="cat--dockerfile">cat &gt; Dockerfile</h2>
<pre><code>FROM node:12
COPY app.js /app.js
ENTRYPOINT [&quot;node&quot;,app.js&quot;]</code></pre><pre><code>&lt;ctrl&gt;&lt;d&gt;</code></pre><p>도커파일에 아까 만든 파일이름을 그대로 도커 컨테이너 위에 쌓아서 실행할 수 있다.
위 컨테이너를 열면 클라이언트의 요청을 기다리고 있다가 접속하게 되면 hostname과 Container Hostname의 메세지를 200번의 상태코드를 전달해준다.</p>
<h3 id="위처럼-만든-컨테이너를-어떻게-동작시킬-수-있을까">위처럼 만든 컨테이너를 어떻게 동작시킬 수 있을까?</h3>
<p>그 컨테이너를 실행시킬 수 있는 플랫폼이 필요한데, 도커라는 플랫폼을 사용하여 실행.</p>
<p>컨테이너 이미지를 생성
web server 컨테이너 생성</p>
<ol>
<li>컨테이너 저장소에 저장하는 법 먼저 설명
linux 운영체제 위에 도커 설치
컨테이너 빌드하기
허브- 도커닷컴에서 운영하고 있는 저장소에 컨테이너를 빌드하여 푸쉬해줄 수 있다.
앞에 만든 두개의 파일(node.js파일과 도커파일)을 사용하여 명령어를 통해 빌드할 수 있다.<pre><code>docker build -t smlinusx(containername)/nodeinfo:v1</code></pre>하나의 컨테이너가 하드디스크에 들어가게 된다.
만들어진 컨테이너를 docker push smlinux/nodeinfo:v1 (push명령어 저장된다.)<h3 id="저장된-컨테이너-사용방법">저장된 컨테이너 사용방법</h3>
<pre><code>$docker pull smlinux/nodeinfo:v1 &lt;- 저장한 도커컨테이너를 다운받고
$docker create --name app -p 80:8080 smlinux/nodeinfo:v1
$docker start app</code></pre>바로 도커컨테이너를 열고 노드js 8080열어 클라이언트를 listen 할 수 있다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/you_sunning/post/553806a6-999e-42d4-b229-ccc588330b5c/image.png" alt="">
쿠버네티스가 도커를 관리하고 스케줄링하고 운영하는 오케스트레이션이다.
지휘자 역할, 리더 역할</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA 반복문의 제어]]></title>
            <link>https://velog.io/@you_sunning/JAVA-%EB%B0%98%EB%B3%B5%EB%AC%B8%EC%9D%98-%EC%A0%9C%EC%96%B4</link>
            <guid>https://velog.io/@you_sunning/JAVA-%EB%B0%98%EB%B3%B5%EB%AC%B8%EC%9D%98-%EC%A0%9C%EC%96%B4</guid>
            <pubDate>Sun, 27 Oct 2024 19:37:05 GMT</pubDate>
            <description><![CDATA[<h3 id="for">for</h3>
<pre><code>public static void main(String[] args) {

  **int i = 0;**

  while**(i&lt;10){**
      System.out.printlin(&quot;ohh&quot;+i);
  **i++**
  }
}
</code></pre><p>for문을 활용 시에 아래 같은 코드가 된다.</p>
<pre><code>public static void main(String[] args) {

  for(초기화int i = 0; 종료조건i&lt;10; 반복실행i++){
      //반복적으로 실행될 구문
      System.out.println(&quot;ohh&quot;+i);
  }
}</code></pre><pre><code>public static void main(String[] args) {

  for(int i = 5; i &lt; 20; i=i+2){
      //반복적으로 실행될 구문
      System.out.println(&quot;ohh&quot;+i);
  }
}</code></pre><p>반복문 사용할 때 가변적인 것과 고정적인 것을 구분하고 설계하는 것이 중요하다.
(예 : 변수 할당) </p>
<h3 id="break--continue">break &amp; continue</h3>
<p>while(조건문){    } 활용</p>
<pre><code>    public static void main(String[] args) {

        for(int i =0; i &lt; 10; i++){
          if (i==5)
              break(해당 조건에 멈춤); or continue(해당 조건 건너뛰기);
        System.out.printl(&quot;Hi&quot;+i);
    }
 }</code></pre><h3 id="중첩-반복문">중첩 반복문</h3>
<pre><code>public class BreakDemo {

    public static void main(String[] args) {
        for(int i =0; i &lt; 10; i++){
          for(int j=0; j &lt; 10; j++){
          System.out.printl(i+&quot;&quot;+j);
          }
        }
    }
 }</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA 연산자]]></title>
            <link>https://velog.io/@you_sunning/JAVA-%EC%97%B0%EC%82%B0%EC%9E%90</link>
            <guid>https://velog.io/@you_sunning/JAVA-%EC%97%B0%EC%82%B0%EC%9E%90</guid>
            <pubDate>Wed, 23 Oct 2024 05:11:57 GMT</pubDate>
            <description><![CDATA[<p>이항 연산자
특정한 작업을 하기 위해 사용하는 기호를 의미한다.</p>
<p>산술연산자 arithmetic
더하기, 빼기, 곱하기,나누기, 나머지
<code>+  ,  -  ,  *  ,  /  ,  %</code></p>
<p> 단항 연산자
 <code>+</code> : 양수를 표현한다. 실제로는 사용할 필요가 없다.
<code>-</code> : 음수를 표현한다.
<code>++</code> : 증가 (increment) 연산자러 항의 값을 1씩 증가 시킨다.
<code>--</code> : 감소 (Decrement) 연산자 </p>
<h4 id="증가연산자">증가연산자</h4>
<pre><code>public class PrePostDemo{
    public static void main(String[] args){
        int i = 3;
        i++;
        System.out.println(i); // 4 출력
        ++i;
        System.out.println(i); // 5 출력
        System.out.println(++i); // 6 출력 
        (괄호 안에서 더해지는 연산자)
        System.out.println(i++); // 6 출력 
        (괄호 밖에서 더해지는 연산자)
        System.out.println(i); // 7 출력
    }
}</code></pre><h4 id="연산자-우선순위">연산자 우선순위</h4>
<ul>
<li>우선순위에 따라 계산이 된다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA 자동 형변환]]></title>
            <link>https://velog.io/@you_sunning/JAVA-%EC%9E%90%EB%8F%99-%ED%98%95%EB%B3%80%ED%99%98</link>
            <guid>https://velog.io/@you_sunning/JAVA-%EC%9E%90%EB%8F%99-%ED%98%95%EB%B3%80%ED%99%98</guid>
            <pubDate>Tue, 22 Oct 2024 04:56:27 GMT</pubDate>
            <description><![CDATA[<h3 id="암시적-형변환">암시적 형변환</h3>
<p>실수 : float / double</p>
<p><code>double:a =3.3F;</code></p>
<p>3.3F; 라는 상수를 a 변수에 대입하는 순간 자바가 F가 붙어있어도 더블형으로 자동으로 암시적으로 형변환이 되는것이다.</p>
<p>자동으로 형변환 해주는 이유
더 많은 정보를 수용할 수 있도록하기 위해</p>
<hr>
<p><code>float:a =3.3;</code></p>
<p>3.3;더블형의 데이터를 float에 넣는 코드
but 오류 발생 why?
더블이 더 많은 데이터를 수용할 수 있기 때문이다.</p>
<p>자동 형 변환의 원칙은 표현범위가 좁은 데이터 타입에서 넓은 데이터 타입으로의 변환만 허용된다는 것이다.</p>
<p><code>(정수)byte -&gt; short / char -&gt; int -&gt; long -&gt; (실수)float -&gt; double</code></p>
<blockquote>
<p><strong>int a = 3;
float b = 1.0F;
double c = a+b ;</strong></p>
</blockquote>
<ol>
<li>int인 3을 float 형으로 변환시켜 3.0F로 만든다.</li>
<li>float 타입인 b 의 1.0F</li>
<li>변환시킨 a = 3.0F 와 b 인 1.0F 값을 더한다.</li>
<li>고로 c의 값은 4.0F</li>
</ol>
<hr>
<h3 id="명시적-형-변환">명시적 형 변환</h3>
<p>수동으로 직접 형변환 하는 것, Explic Conversion</p>
<p><code>float a =100.0;</code> -&gt; 정보 손실 때문에 자동형변환이 되지 않음
<code>int b =100.0F;</code> -&gt; int보다 float이 넓은 범위기 때문에 정보손실의 우려로 자동 형변환이 되지 않는다.</p>
<p>하지만 명시적으로 변환할 수 있는 방법은 아래와 같다.</p>
<blockquote>
<p><strong>float a = (float)100.0;
int b = (int)100.0F;</strong></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Linux]]></title>
            <link>https://velog.io/@you_sunning/Linux</link>
            <guid>https://velog.io/@you_sunning/Linux</guid>
            <pubDate>Thu, 04 Jul 2024 08:32:47 GMT</pubDate>
            <description><![CDATA[<h4 id="lslist">ls(list)</h4>
<p><code>ls</code> : 현재 디렉토링의 모든 파일 및 폴더를 기본 형식으로 보여준다.
<code>ls -l</code> : 파일 및 폴더에 대한 자세한 정보와 함께 리스트업 한다.
<code>ls -a</code> : 숨겨진 파일을 포함하여 모든 파일을 보여준다.</p>
<h4 id="cd-change-directory">cd (change directory)</h4>
<p><code>cd</code>: 디렉토리 변경
<code>cd Documents</code> : 현재 디렉토리에서 &#39;Documents&#39;라는 이름의 폴더로 이동한다.
<code>cd ..</code> : 현재의 디렉토리의 상위 폴더로 이동한다.</p>
<h4 id="pwd-print-working-directory">pwd (print working directory)</h4>
<p><code>pwd</code> : 현재 작업 중인 데렉토리의 경로를 표시한다.</p>
<h4 id="mkdir-make-directory">mkdir (make directory)</h4>
<p><code>mkdir</code> : 새로운 디렉토리(폴더)를 생성한다.
<code>mkdir new_folder</code> : 현재 디렉토리에&#39;new_folder&#39;라는 이름의 새 디렉토리를 만든다.
<code>mkdir -p folder1/folder2</code> : &#39;folder1&#39;내에 &#39;folder2&#39;를 생성한다. -p는 상위 디렉토리가 없는 경우, 그 상위 디렉토리를 생성하는 옵션이다.</p>
<h4 id="rmdir-remove-directory">rmdir (Remove Directory)</h4>
<p><code>rmdir</code> : 디렉토리를 삭제한다.
<code>rmdir old_folder</code> : &#39;old_folder&#39;라는 이름의 디렉토리를 삭제한다.
<code>rmdir</code> : 디렉토리가 비어있을 때만 작동한다. 내부에 파일이나 다른 디렉토리가 있으면 오류가 발생한다.
<code>rm- r</code> : 디렉토리 안의 파일과 함께 삭제.</p>
<h4 id="rm-remove">rm (remove)</h4>
<p><code>rm</code> : 파일이나 디렉토리를 삭제한다.
<code>rm file.txt</code> : &#39;fild.txt&#39;라는 파일을 삭제한다. 
<code>rm -r folder</code> : &#39;folder&#39;라는 디렉토리와 그 안의 모든 내용을 삭제한다.</p>
<ul>
<li>삭제한 파일은 복구가 어렵기 때문에, 중요한 파일을 삭제하기 전에는 항상 확인하는 것이 좋다.</li>
</ul>
<h4 id="touch">touch</h4>
<p><code>touch</code> : 새로운 빈 파일을 생성하거나, 기존 파일의 타임스탬프(날짜 및 시간 정보)를 현재 시간으로 갱신한다.
<code>touch new_file.txt</code> : &#39;new_file.txt&#39;라는 새파일을 생성한다. 파일이 이미 존재한다면, 타임 스탬프가 갱신된다,</p>
<p><a href="https://velog.io/@tngus0325/16%EA%B0%80%EC%A7%80-%EB%A6%AC%EB%88%85%EC%8A%A4-%EA%B8%B0%EB%B3%B8-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC">https://velog.io/@tngus0325/16%EA%B0%80%EC%A7%80-%EB%A6%AC%EB%88%85%EC%8A%A4-%EA%B8%B0%EB%B3%B8-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC</a></p>
]]></description>
        </item>
    </channel>
</rss>