<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bellmin_kim.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Fri, 10 May 2024 01:59:56 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>bellmin_kim.log</title>
            <url>https://velog.velcdn.com/images/bellmin_kim/profile/e7e7ac62-2002-4dc2-831d-8cd7c9351061/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. bellmin_kim.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bellmin_kim" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Stream 이해하기]]></title>
            <link>https://velog.io/@bellmin_kim/Stream-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@bellmin_kim/Stream-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 10 May 2024 01:59:56 GMT</pubDate>
            <description><![CDATA[<p>Stream API
원본의 데이터를 변경하지 않고 작업을 처리할 수 있는 API.</p>
<p>기존 JAVA는 객체 지향 언어이기에 함수형 프로그래밍을 지원하지 않았다.
JDK8 부터 Stream API, 람다 등을 지원해 함수형 프로그래밍을 지원한다.</p>
<p>Stream API의 특징
원본의 데이터 변경 X -&gt; 원본의 데이터를 읽어와 별도의 Stream 생성
일회용 -&gt; 한번 사용 후 재사용 불가 (다시 사용시 Exception 발생)
내부 반복 작업 처리 -&gt; 반복문을 내장하여 기존 반복문의 코드 필요 X</p>
<p>Stream 연산
생성 </p>
<ol>
<li>Colletion 타입의 Stream 생성<pre><code>List&lt;String&gt; list = Arrays.asList(&quot;a&quot;,&quot;b&quot;,&quot;c&quot;);
Stream&lt;String&gt; listStream = list.stream();</code></pre></li>
<li>배열의 Stream 생성<pre><code>Stream&lt;String&gt; stream = Stream.of(&quot;a&quot;,&quot;b&quot;,&quot;c&quot;);</code></pre></li>
<li>원시 Stream 생성
int, long, double 과 같은 원시 자료형<pre><code>IntStream stream = IntStream.range(4,10);</code></pre>Stream 가공(중간연산)
Filter<pre><code>List&lt;String&gt; names = new ArrayList&lt;&gt;();
     names.add(&quot;abc&quot;);
     names.add(&quot;acc&quot;);
     names.add(&quot;bbc&quot;);
     List&lt;String&gt; nameList = names.stream().filter(name-&gt; name.contains(&quot;a&quot;)).collect(Collectors.toList());
     nameList.forEach(System.out::println);</code></pre>Map<pre><code>List&lt;String&gt; upperNames = names.stream().map(s -&gt; s.toUpperCase()).collect(Collectors.toList());
     upperNames.forEach(System.out::println);</code></pre>Sorted<pre><code>List&lt;String&gt; sortedNames = names.stream().sorted().collect(Collectors.toList());
     sortedNames.forEach(System.out::println);</code></pre>Distinct<pre><code>List&lt;String&gt; distinctNames = names.stream().distinct().collect(Collectors.toList());
     distinctNames.forEach(System.out::println);</code></pre>Peek -&gt; Stream에 영향을 주지 않고 확인하는 함수
출력 또는 확인용</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[SmartEditor를 이용한 이미지 업로드 구현]]></title>
            <link>https://velog.io/@bellmin_kim/SmartEditor%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%97%85%EB%A1%9C%EB%93%9C-%EA%B5%AC%ED%98%84</link>
            <guid>https://velog.io/@bellmin_kim/SmartEditor%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%97%85%EB%A1%9C%EB%93%9C-%EA%B5%AC%ED%98%84</guid>
            <pubDate>Thu, 18 Jan 2024 08:52:21 GMT</pubDate>
            <description><![CDATA[<p>네이버의 SmartEditor를 이용한 이미지 업로드를 구현하겠습니다.</p>
<p>일단 네이버의 SmartEditor2.0 파일을 다운받아줍니다.
<a href="https://github.com/naver/smarteditor2">https://github.com/naver/smarteditor2</a>
여기가 공식 깃헙 사이트 같은데 jindo 관련 js 파일 일부분이 없네요..
따로 저작권이나 문제생길까봐 올리진 않습니다</p>
<p>지금 하고자 하는 것은
<img src="https://velog.velcdn.com/images/bellmin_kim/post/4d6db51e-af7a-41f0-901b-f39342419ba2/image.png" alt=""></p>
<p>여기 우측에 있는 사진 버튼을 통해 이미지를 올리고 본문에 보이는 과정이다.
<img src="https://velog.velcdn.com/images/bellmin_kim/post/e75b8d5d-0f8a-4dc8-b307-ba5d0090c185/image.png" alt=""></p>
<p>일단 바꿔줘야 할 부분은 attach_photo.js 의 html5Upload() 함수이다.</p>
<p><img src="https://velog.velcdn.com/images/bellmin_kim/post/10d65445-5214-4391-ac60-56c10eee6550/image.png" alt=""></p>
<p>여기서 sUploadURL 부분을 자신의 컨트롤러 매핑 URL로 변경한다.</p>
<p>또 바꿔줘야 할 부분은 attach_photo.js 의 CallAjaxForHTML5 함수이다.</p>
<p><img src="https://velog.velcdn.com/images/bellmin_kim/post/cac92d21-60c0-4b99-9ac9-5f9ed128345a/image.png" alt="">
기존의 jindo 코드를 활용하려고 했으나, 도저히 안되서 소스를 찾아보니 해당 소스를 발견했다.
해당 소스로 진행한다.</p>
<p>MultiPart Form으로 넘겨왔기 때문에 Controller에서 MultipartFile로 매핑을 해주어야한다.</p>
<pre><code> @RequestMapping(value=&quot;/singleImageUploader&quot;, method = RequestMethod.POST)
    public void smarteditorImageUpload2(MultipartFile file,HttpServletRequest request, HttpServletResponse response) throws IOException {
        try{
            if(file.isEmpty()) {
                System.out.println(&quot;이미지 미등록&quot;);
            } else {
                String filePath = path;
                File saveDir = new File(filePath);
                if(!saveDir.exists()){
                    saveDir.mkdir();
                }
                SimpleDateFormat formatter = new SimpleDateFormat(&quot;yyyyMMddHHmmss&quot;);
                String today = formatter.format(new java.util.Date());
                String rfileName = file.getOriginalFilename();
                String fileExt = file.getOriginalFilename().split(&quot;\\.&quot;)[1];
                String pFileName = file.getOriginalFilename().split(&quot;\\.&quot;)[0] + UUID.randomUUID() + &quot;-&quot; + today + &quot;.&quot;+ fileExt;
                File saveFile = new File(saveDir, pFileName);
                try {
                    file.transferTo(saveFile);
                }catch(Exception e) {
                    e.printStackTrace();
                }
                String sFileInfo = &quot;&quot;;
                sFileInfo += &quot;&amp;bNewLine=true&quot;;
                // img 태그의 title 속성을 원본파일명으로 적용시켜주기 위함
                sFileInfo += &quot;&amp;sFileName=&quot; + rfileName;
                sFileInfo += &quot;&amp;sFileURL=&quot; + &quot;/imagePath/&quot; +pFileName;
                PrintWriter print = response.getWriter();
                print.print(sFileInfo);
                print.flush();
                print.close();

            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }</code></pre><p>한글인코딩은 아직 안했습니다.
여기 path는 제 서버 변수를 사용했습니다.</p>
<p>제 환경은 gradle 환경에 yml 파일 사용중이기에
application.yml에 
upload:
    path: 실제 경로
적고
Controller 상단에
@Value(&quot;${upload.path}&quot;)
    private String path;
를 통해 접근했습니다.</p>
<p>만약 MultiPart 관련 타입을 찾을 수 없는 오류가 발생할 경우</p>
<p>설정 항목으로 Resolver를 등록한다.</p>
<pre><code>@Configuration
public class MultipartConfig {
    @Value(&quot;${file.multipart.maxUploadSize:10485760}&quot;)
    private long maxUploadSize;

    @Value(&quot;${file.multipart.maxUpladSizePerFile:10485760}&quot;)
    private long maxUploadSizePerFile;

    @Bean
    public MultipartResolver multipartResolver() {
        StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
        return multipartResolver;
    }
    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setMaxRequestSize(DataSize.ofBytes(maxUploadSize));
        factory.setMaxFileSize(DataSize.ofBytes(maxUploadSizePerFile));
        return factory.createMultipartConfig();
    }
}
</code></pre><p>이렇게 하면 파일 저장은 정상적으로 될텐데 이미지가 본문에 안 보여질 수 있다.
이유는 로컬 파일의 접근을 브라우저가 막기 때문이다.</p>
<p>따라서 해당 로컬 주소를 가상 주소로 변경하여 접근해야한다.</p>
<pre><code>@Configuration
public class WebConfig implements WebMvcConfigurer {
    private String connectPath = &quot;/imagePath/**&quot;;
    private String resourcePath = &quot;자신의 파일이 실제로 저장되는 경로&quot;;
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler(connectPath)
                .addResourceLocations(resourcePath);
    }
}</code></pre><p>위의 컨트롤러 코드에서 쓰인 /imagePath 가 가상 경로이다.
이렇게 설정하면 resourcePath에 있는 경로가 connectPath로 연결된다.</p>
<p>저장로직은 따로 작성하셔야합니다
감사합니다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Console build 명령어 (spring boot)]]></title>
            <link>https://velog.io/@bellmin_kim/Console-build-%EB%AA%85%EB%A0%B9%EC%96%B4-spring-boot</link>
            <guid>https://velog.io/@bellmin_kim/Console-build-%EB%AA%85%EB%A0%B9%EC%96%B4-spring-boot</guid>
            <pubDate>Wed, 08 Nov 2023 05:52:45 GMT</pubDate>
            <description><![CDATA[<p>메이븐
mvnw spring-boot:run</p>
<p>그레들
gradlew bootRun</p>
<p>잊어먹는 일이 많아 적어놓음</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Entity의 Serializable 역할]]></title>
            <link>https://velog.io/@bellmin_kim/Entity%EC%9D%98-Serializable-%EC%97%AD%ED%95%A0</link>
            <guid>https://velog.io/@bellmin_kim/Entity%EC%9D%98-Serializable-%EC%97%AD%ED%95%A0</guid>
            <pubDate>Thu, 06 Jul 2023 01:22:32 GMT</pubDate>
            <description><![CDATA[<p>직렬화: byte stream으로 변환하는 과정
마샬링 : 객체 데이터를 다른 데이터 형태로 변환하는 과정</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[modelmapper]]></title>
            <link>https://velog.io/@bellmin_kim/modelmapper</link>
            <guid>https://velog.io/@bellmin_kim/modelmapper</guid>
            <pubDate>Wed, 05 Jul 2023 04:23:27 GMT</pubDate>
            <description><![CDATA[<p>RequestUser -&gt; UserDto -&gt; Users 바꾸는 과정</p>
<p>일일이 Setter, Getter로 변경할 수 있지만
mapper를 통해 변경이 가능한
modelmapper 라이브러리 사용</p>
<p>UserDto는 받아온 값
Users는 DB에 직접 저장하는 값</p>
<p>ModelMapper mapper = new ModelMapper();
        mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);</p>
<p>환경설정 + 매칭 (딱 맞아떨어질때만 지정가능[STRICT])</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring Cloud]]></title>
            <link>https://velog.io/@bellmin_kim/Spring-Cloud</link>
            <guid>https://velog.io/@bellmin_kim/Spring-Cloud</guid>
            <pubDate>Wed, 28 Jun 2023 07:24:01 GMT</pubDate>
            <description><![CDATA[<p>Spring Cloud
목적 : </p>
<ol>
<li>환경설정 관리</li>
<li>서비스 검색</li>
<li>회복성</li>
<li>라우팅</li>
<li>프록시</li>
</ol>
<p>Spring Cloud &lt;-&gt; Spring Boot</p>
<p>Spring Cloud Config Server (환경설정 , GateWay, Ports 등을 데이터 값을 사용하도록 설정) - 유지보수 편리함</p>
<p>Locationg Transparency - Naming Server (Eureka)</p>
<p>Load Distribution (Load Balancing) - Spring Cloud Gateway</p>
<p>Easier REST Clients - FeignClient
Visibility and monitoring - Zipkin, Netfilx API gateway
Fault Tolerance - Hystrix</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[MSA 표준 구성요소]]></title>
            <link>https://velog.io/@bellmin_kim/MSA-%ED%91%9C%EC%A4%80-%EA%B5%AC%EC%84%B1%EC%9A%94%EC%86%8C</link>
            <guid>https://velog.io/@bellmin_kim/MSA-%ED%91%9C%EC%A4%80-%EA%B5%AC%EC%84%B1%EC%9A%94%EC%86%8C</guid>
            <pubDate>Wed, 28 Jun 2023 06:51:19 GMT</pubDate>
            <description><![CDATA[<p>MSA 표준 구성요소
<img src="https://velog.velcdn.com/images/bellmin_kim/post/0af9db4e-1d8a-406f-a264-8751c341e1dc/image.png" alt=""></p>
<p>클라이언트(서비스) -&gt; 서비스 요청 (API 게이트) -&gt; 서비스 라우터 -&gt; Service Discovery -&gt; Load Balancing -&gt; MS.. Instance 
-- CI/CD Auto (관리자 API 제공) - 모니터링</p>
<p>Service Mesh (네트워크 레이어) -- 미들웨어
프록시 역할, 인증, 권한, 암호화, 서비스 검색, 요청 라우팅, 로드 밸런싱 제공
서비스간의 통신과 관련 기능 자동화</p>
<p>CNCF(Cloud Native Computing Foindation)</p>
<ul>
<li>클라우드의 상호연관 서비스 기초</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[MicroService 와 Cloud]]></title>
            <link>https://velog.io/@bellmin_kim/MicroService-%EC%99%80-Cloud</link>
            <guid>https://velog.io/@bellmin_kim/MicroService-%EC%99%80-Cloud</guid>
            <pubDate>Tue, 27 Jun 2023 08:52:59 GMT</pubDate>
            <description><![CDATA[<p>Antifragile </p>
<ol>
<li>Auto scaling - 비수기, 수기 시즌에 맞춰 유동적</li>
<li>Microservices</li>
<li>Chaos engineering - 급격한 상황 변화에 대한 안정적인 서비스</li>
<li>contrinuous deployments - 서비스 작업 -&gt; 배포 (자동화) 이를 pipeline으로 연결 (CI/CD)</li>
</ol>
<p>Cloud Native Architecture</p>
<ol>
<li>확장 가능한 아키텍처 (컨테이너, 서버 가상화)<ul>
<li>시스템의 수평적 확정에 유연</li>
<li>확장된 서버로 시스템의 부하 분산, 가용성 보장 (리소스 반납)</li>
<li>시스템 또는, 서비스 애플리케이션 단위의 패키지(컨테이너 기반 패키지)</li>
<li>모니터링 </li>
</ul>
</li>
<li>탄력적 아케텍처<ul>
<li>서비스 생성-통합-배포(CI/CD), 비지니스 환경 변화 대응 시간 단축</li>
<li>분할된 서비스 구조</li>
<li>무상태 통신 프로토콜</li>
<li>서비스의 추가와 삭제 자동 감지 </li>
<li>변경된 서비스 요청에 따라 사용자 요청 처리 (동적 처리)
서로 분리된 서비스로 종속되지 않도록 설계
자신의 위치를 등록하고 다른 어플리케이션이 쓸 수 있도록 설정</li>
</ul>
</li>
<li>장애 격리<ul>
<li>특정 서비스에 오류가 발생하더라도 다른 서비스에 영향을 주지 않음</li>
</ul>
</li>
</ol>
<p>Microservices -&gt; CI/CD -&gt; DevOps(기능 추가 -&gt; 테스트 -&gt; 배포의 무한반복을 의미) -&gt; Container</p>
<p>CI/CD</p>
<ul>
<li>지속적인 통합 , 지속적 배포 (여러명의 코드를 통합(Git)하고 지속적으로 코드를 배포)
CD </li>
<li>지속적 전달 (Continuous Delivery)</li>
<li>지속적 배포 (Continuous Deployment)</li>
<li>Pipe line</li>
</ul>
<p>카나리 배포, 블루그린 배포
95% -&gt; 이전 버전
5% -&gt; 신규 버전</p>
<p>DevOps (Development + Operations + QA)
개발조직,운영조직과 퀄리티 보장 통합을 의미
끊임없이 계속 개발, 운영, 테스트</p>
<p>Container 가상화</p>
<ul>
<li>적은 비용으로 컨테이너를 구축 (가상화)
운영체제 -&gt; 가상머신 -&gt; 가상머신의 OS + 라이브러리 + 어플리케이션
운영체제 -&gt; 컨테이너 가상화 -&gt; 라이브러리 + 어플리케이션 (컨테이너 하나당)</li>
</ul>
<p>12가지 항목</p>
<ol>
<li>Base Code - 형상관리를 위한 코드 관리(Git과 같은 한곳에서 통일적 관리)</li>
<li>Dependency isolation - 전체 시스템의 영향을 주지 않고 변경되고 수정되어야 함</li>
<li>Configurations - 시스템 설정 외의 구성설정을 통한 MSA의 설정</li>
<li>Linkable backing Servcie - 응용프로그램 서비스를 제공 (상호작용)</li>
<li>Stages of Creation - 빌드 , 릴리즈의 상황을 분리 (CI/CD와 같이 롤백등 항상 이전/신규 상황유지)</li>
<li>Stateless processes - 독립적으로 작용하여 컨테이너당 다른 기능 수행</li>
<li>Port Binding</li>
<li>Concurrency - 많은 수의 서비스를 복사해서 이루어지므로 부하 분산이 가능하며 동시성 보장</li>
<li>Disposabilty</li>
<li>Development &amp; production parity - 개발과 운영의 분리</li>
<li>Logs - 어플리케이션이 실행되지 않더라도 로그는 정상적으로 출력되어야함</li>
<li>Admin Processes for eventual processes - 적절한 관리 도구 필요 (레포트및 데이터 정제, 정리)</li>
</ol>
<p>3가지 항목</p>
<ol>
<li>API first </li>
<li>Telemetry - 모든 지표는 수치화하여야함</li>
<li>Authentication and authorization - API 사용시 인증 단계, 인가 허락이 필요</li>
</ol>
<p>Monolith
한 소프트웨어 안에 모든걸 포함(DB, Front, back 등)
어플리케이션에서 사용하는 데이터가 한곳에 모여 참조되어 서비스되는 형태</p>
<p>일부분 수정 시 전체 프로젝트의 패키징과 배포가 필요함</p>
<p>MicroServices
각각의 기능을 분리하여 개발 (분리된 서비스가 다른 서비스에 영향을 최소화)
장치의 전체 멈춤이 발생할 상황이 없음</p>
<p>함께작동되는 작은 기능들
비지니스 로직이 분리되어야 하며, CI/CD가 무조건적으로 필수다.
굳이 통일된 언어를 사용할 필요가 없이 API 형태로 제공하면 각자 필요한 언어로 설정할 수 있다.</p>
<p>SOA</p>
<ul>
<li>공통의 서비스를 ESB(Enterprise Service Bus)에 모아 사업 측면에서 공통 서비스 형식으로 서비스 제공 (ESB를 통한 서비스송신)</li>
</ul>
<p>MSA</p>
<ul>
<li>각 독립된 서비스가 노출된 REST API를 사용</li>
</ul>
<p>RESTful Web Service
level 0. <a href="http://server/getPosts">http://server/getPosts</a>
<a href="http://server/deletePosts">http://server/deletePosts</a></p>
<p>level 1. <a href="http://server/accounts">http://server/accounts</a>
<a href="http://server/accounts/10">http://server/accounts/10</a></p>
<p>level 2. level1 + http methods</p>
<p>level 3. level2 + HATEOAS(사용자의 목록이던 그 목록으로 무엇을하던 이런것들의 총합)</p>
<p>고려해야할 사항</p>
<ol>
<li>Consumer first</li>
<li>Make best use of HTTP</li>
<li>Level2를 살려 개발 필요 (Get, Post, Put, Delete)</li>
<li>Response Status 를 사용하여 적절한 대응 필요 (200[정상], 404[클라이언트 오류], 400, 201, 401, 50*[서버오류])</li>
<li>Use plurals(복수형 사용)</li>
<li>Use nouns for resources (리소스는 명사를 통해 제공)</li>
<li>For excpeitons - define a consistent approach(목적지는 동일하도록)</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring Security 설정하기]]></title>
            <link>https://velog.io/@bellmin_kim/Spring-Security-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@bellmin_kim/Spring-Security-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 31 Mar 2023 05:01:05 GMT</pubDate>
            <description><![CDATA[<p>@Configuration
-&gt; 설정파일로 컨테이너에 띄우는 용도
@EnableWebSecurity
-&gt; 스프링 시큐리티 필터가 스프링 필터체인에 등록이 됨.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SpringBoot 기본 동작 방식 ]]></title>
            <link>https://velog.io/@bellmin_kim/SpringBoot-%EA%B8%B0%EB%B3%B8-%EB%8F%99%EC%9E%91-%EB%B0%A9%EC%8B%9D</link>
            <guid>https://velog.io/@bellmin_kim/SpringBoot-%EA%B8%B0%EB%B3%B8-%EB%8F%99%EC%9E%91-%EB%B0%A9%EC%8B%9D</guid>
            <pubDate>Fri, 31 Mar 2023 05:00:57 GMT</pubDate>
            <description><![CDATA[<p>SpringBootApplication 하위에 있는 모든 걸 ComponentScan을 해서 자동으로 빈 등록</p>
<p>@PersistenceContext -&gt; Spring entitiy manager를 주입을 해줌 (EntitiyManager 에 자동으로 주입)</p>
<p>@PersistenceUnit -&gt; EntityManagerFactory 직접 주입 가능 </p>
<p>@Service -&gt; component scan으로 대상이 되어서 빈으로 등록</p>
<p>javax와 spring annotation 이 있지만,
spring annotation의 옵션이 다수이므로 추천
@Transcational -&gt; Data 변경 시 꼭 필요함
readOnly = true -&gt; 조회 시 성능 최적화(데이터 변경 X)</p>
<p>@Autowired
단점이 있다. (바꿀 수 없음)
setter Injection으로 주입도 가능.
-&gt; public void setMemberRepository{this.memberRespository = memberRepository;}
@RequiredArgsConstructor (가장 나은 방법-&gt; lombok이 있을때 사용 가능)
-&gt; final 변수만 생성자를 만들어줌</p>
<p>//스프링부트 테스트
RunWith(SpringRunner.class)
@SpringBootTest &lt;- Autowired 지원
@Transactional &lt;- 기본 Rollback , 데이터 변경이 있을 경우 사용</p>
<p>Test 케이스는 
Given
When
Then 으로 나눠서 작성하는걸 추천</p>
<p>CASCADE 범위 :
라이프사이클에서 동일하게 관리할 경우.
다른 것들이 쓰지 않는 Private할 경우.
공통 혹은 여러개 쓸 경우 CASCADE 사용 X</p>
<p>JPA 더티체킹(변경력 감지):
변경된 사항들에 맞게 update 쿼리가 나간다.</p>
<p>Test(데이터변경이 있을 경우, 외부 DB를 사용하지 않고 자바에 메모리 디비 사용)
디렉터리
main
test 로 나뉨</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JPA 의 기초 Hibernate(2)]]></title>
            <link>https://velog.io/@bellmin_kim/JPA-%EC%9D%98-%EA%B8%B0%EC%B4%88-Hibernate2</link>
            <guid>https://velog.io/@bellmin_kim/JPA-%EC%9D%98-%EA%B8%B0%EC%B4%88-Hibernate2</guid>
            <pubDate>Fri, 31 Mar 2023 05:00:43 GMT</pubDate>
            <description><![CDATA[<p>프록시
em.find() vs em.getReference()</p>
<p>em.find() : 데이터 베이스를 통해 실제 엔티티 객체 조회
em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회
가짜(프록시) 엔티티 객체 조회 : DB에는 쿼리가 실행되지 않고 값을 가져옴.</p>
<p>find()는 사용하자마자 쿼리를 통해 조회하여 데이터를 가져옴
getReference()는 사용 당시의 쿼리를 통해 조회를 하지 않고, 실제 값이 필요로 할때
조회되도록 설정</p>
<p>프록시 특징</p>
<ul>
<li><p>실제 클래스를 상속 받아서 생성</p>
</li>
<li><p>실제 클래스와 겉 모양이 같다.</p>
</li>
<li><p>사용자 입장에서 구분하지 않은채 사용할 수 있다.</p>
</li>
<li><p>객체는 처음 사용할 때 한번만 초기화</p>
</li>
<li><p>프록시 객체가 초기화 되어도, 실제 엔티티로 바뀌진 않고 실제 엔티티에 접근만 가능</p>
</li>
<li><p>프록시 객체는 원본 엔티티를 상속받기 때문에 타입 체크 주의 ( == 비교 실패, 대신 instace of 로 사용)</p>
</li>
<li><p>프록시와 객체는 항상 동일을 보장</p>
</li>
<li><p>프록시 객체는 실제 객체의 참조(target)를 보관</p>
<p>프록시 개체의 초기화 
사용자 데이터 요청 -&gt; Proxy가 확인 -&gt; Proxy는 가짜라서 값이 없음 -&gt; 영속성 컨텍스트에 초기화 요청 -&gt; 영속성 컨텍스트는 DB를 조회 -&gt; 영속성 컨텍스트가 실제 Entity 생성 -&gt; 사용자가 요청한 데이터 표출</p>
<p>지연로딩 과 즉시로딩
지연로딩 : 프록시를 사용하여 실제로 객체가 사용될 때 SQL 
즉시로딩 : 애초부터 SQL를 실행하여 데이터 가져옴</p>
<p>프록시와 즉시로딩</p>
<ul>
<li>실무에서는 즉시로딩 사용 X (가급적 지연 로딩)</li>
<li>JPQL에서 N+1 문제를 일으킴 </li>
<li>@ManyToOne, @OneToOne은 기본이 즉시로딩 -&gt; LAZY로 변경필요</li>
<li>무조건 지연 로딩만 쓰세요</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[변경감지와 병합(merge)]]></title>
            <link>https://velog.io/@bellmin_kim/%EB%B3%80%EA%B2%BD%EA%B0%90%EC%A7%80%EC%99%80-%EB%B3%91%ED%95%A9merge</link>
            <guid>https://velog.io/@bellmin_kim/%EB%B3%80%EA%B2%BD%EA%B0%90%EC%A7%80%EC%99%80-%EB%B3%91%ED%95%A9merge</guid>
            <pubDate>Wed, 15 Mar 2023 08:53:07 GMT</pubDate>
            <description><![CDATA[<p>변경감지(dirty Checking) </p>
<ul>
<li>준영속 엔티티 (영속성 컨텍스트가 더 이상 관리하지 않는 엔티티)</li>
<li>변경감지는 원하는 속성만 선택해서 변경</li>
<li>수정 시 조회해서 업데이트할 데이터만 set 해서 하도록 설정 (@Tranactional)</li>
<li>수정 시에는 setter의 나열보다는 비즈니스 로직을 작성하여 한곳에서 이루어지도록 처리한다.
(유지보수성이 높아짐)</li>
</ul>
<p>병합 (merge) </p>
<ul>
<li>병합은 모든 속성이 변경</li>
</ul>
<p>따라서 , 병합을 쓰지 않고 변경감지를 추천한다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[타임리프 꿀팁정리]]></title>
            <link>https://velog.io/@bellmin_kim/%ED%83%80%EC%9E%84%EB%A6%AC%ED%94%84-%EA%BF%80%ED%8C%81%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@bellmin_kim/%ED%83%80%EC%9E%84%EB%A6%AC%ED%94%84-%EA%BF%80%ED%8C%81%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 15 Mar 2023 07:58:07 GMT</pubDate>
            <description><![CDATA[<p>Form 형식의 타임리프 꿀팁.</p>
<div class="form-group">
      <label th:for="name">이름</label>
      <input type="text" th:field="*{name}" class="form-control" placeholder="이름을 입력하세요"
             th:class="${#fields.hasErrors('name')}? 'form-control fieldError' : 'form-control'">
      <p th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Incorrect date</p>
    </div>

<p>여기서 name 값은 VO에서 Validator 처리로 인해 검증되고 있는 값이며, controller 쪽에서 BindingResult로 검증에 오류가 생길 경우 다시 form page로 리다이렉트 되고있다.</p>
<p>따라서 , 에러가 생길 경우 form-control class에 fieldError로 색을 칠하고 에러가 난 곳에 validator 메시지를 넘겨준다.</p>
<td th:text="${member.address?.city}"></td>
여기서 ? 문법은 만약 member.address가 null일 경우 뒤에 city등을 출력하지않는다.]]></description>
        </item>
        <item>
            <title><![CDATA[JPA의 기본값 타입]]></title>
            <link>https://velog.io/@bellmin_kim/JPA%EC%9D%98-%EA%B8%B0%EB%B3%B8%EA%B0%92-%ED%83%80%EC%9E%85</link>
            <guid>https://velog.io/@bellmin_kim/JPA%EC%9D%98-%EA%B8%B0%EB%B3%B8%EA%B0%92-%ED%83%80%EC%9E%85</guid>
            <pubDate>Sat, 25 Feb 2023 03:54:04 GMT</pubDate>
            <description><![CDATA[<p>최상위
엔티티 타입
@Entity로 정의하는 객체
데이터가 변경되어도 식별자로 지속해서 추적 가능</p>
<p>값 타입
int,integer,String 처럼 단순 값으로 사용하는 기본 타입이나 객체
식별자가 없고 값만 있으므로 추적 불가능
int a= 100 -&gt; a = 200</p>
<p>값 타입</p>
<ul>
<li>기본값 타입 : 자바 기본 타입(int, double), 래퍼 클래스(Integer, Long), String</li>
<li>임베디드 타입 (복합 값 타입)</li>
<li>컬렉션 값 타입 </li>
</ul>
<p>기본값 타입
: 생명주기를 엔티티의 의존 (엔티티가 삭제될 경우 모두 삭제)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JPA의 로딩]]></title>
            <link>https://velog.io/@bellmin_kim/JPA%EC%9D%98-%EB%A1%9C%EB%94%A9</link>
            <guid>https://velog.io/@bellmin_kim/JPA%EC%9D%98-%EB%A1%9C%EB%94%A9</guid>
            <pubDate>Sat, 25 Feb 2023 02:23:38 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p>지연 로딩
lazy
객체를 조회할 때 필요하지만 사용하지 않는 객체를 나중에 조회하도록 함.
Member에 Team에 정보가 연관되어 있지만 Member만 사용할 때, Team은 프록시로 만들어 조회를 일으키지 않아 성능 향상
@ManyToOne, @OneToOne은 기본이 즉시 로딩이므로 지연로딩으로 변경</p>
</li>
<li><p>즉시 로딩
Eager
객체를 조회할 때 연관된 객체 또한 같이 조회.
Member에 Team 정보가 연관되어 있을 경우, 두개를 한 네트워크에 올려 실행.
(실전에서는 쓰지 않는걸 추천함)</p>
</li>
</ol>
<p>3.CASCADE
영속성 전이. (연쇄작용) (편리함)
특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속상태로 만듦.
부모 객체로 자식 객체들을 한번에 Persist 할 수 있음.
cascade = CascadeType.ALL
소유자가 하나일때 사용</p>
<p>4.고아 객체
부모 엔티티와 연관관계가 끊어진 자식 엔티티를 의미.
orpaheRemoval : 고아객체일 경우 삭제 옵션
참조하는 곳이 하나일때만 사용
특정 엔티티가 개인 소유할 때 사용</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JPA 기초 Hibernate (1)]]></title>
            <link>https://velog.io/@bellmin_kim/JPA-%EA%B8%B0%EC%B4%88-Hibernate-1</link>
            <guid>https://velog.io/@bellmin_kim/JPA-%EA%B8%B0%EC%B4%88-Hibernate-1</guid>
            <pubDate>Wed, 08 Feb 2023 08:29:02 GMT</pubDate>
            <description><![CDATA[<p>데이터베이스 스키마 자동 생성</p>
<blockquote>
<p>application.yml
 jpa:
    hibernate:
      ddl-auto: create
입력</p>
</blockquote>
<p>기본적으로 사용되는 어노테이션 정리
@Entity :</p>
<ul>
<li>클래스의 테이블 매핑 JPA 관리하는 것
속성
Name : JPA에서 사용할 엔티티의 이름 지정
@Table :</li>
<li>엔티이와 매핑할 테이블 지정
속성
Name : 매핑할 테이블 이름 지정
@Id :</li>
</ul>
<p>@GeneratedValue :</p>
<ul>
<li>영속성 컨텍스트가 구별하는 엔티티 식별자 값
속성
IDENTITY : 데이터베이스가 기본으로 생성
SEQUENCE : 시퀀스를 활요한 키본키 생성 (누가 참조하든 중복되는 값이 없도록 설정)
TABLE : 키 생성 테이블 사용 (키 전용 테이블에서 이름과 값 컬럼을 이용)</li>
</ul>
<p>@Inheritance :</p>
<ul>
<li>상속관계 전략 사용 어노테이션
속성
strategy(&quot;JOINED&quot;) : 조인 전략 사용
strategy(&quot;SINGLE_TABLE&quot;) :  단일 테이블 전략 사용
strategy(&quot;TABLE_PER_CLASS&quot;) : 클래스 마다 각 테이블 전략 사용
@DiscriminatorColumn :</li>
<li>DType 지정 어노테이션 (클래스마다의 고유값을 지정)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JPA 기초인 Hibernate]]></title>
            <link>https://velog.io/@bellmin_kim/JPA-%EA%B8%B0%EC%B4%88%EC%9D%B8-Hibernate</link>
            <guid>https://velog.io/@bellmin_kim/JPA-%EA%B8%B0%EC%B4%88%EC%9D%B8-Hibernate</guid>
            <pubDate>Wed, 08 Feb 2023 08:06:23 GMT</pubDate>
            <description><![CDATA[<p>JPA의 기초인 Hibernate 사용기</p>
<p>1.상속관계 매핑</p>
<ul>
<li>엔티티 매핑 전략</li>
<li>3가지의 전략이 존재(싱글 테이블, 조인 테이블, 각 테이블)</li>
<li>기본적으로는 조인 테이블 사용</li>
</ul>
<p>1)조인 테이블</p>
<ul>
<li>조인을 사용한 전략
예) Movie, Book, Album 이라는 테이블을 만든다 가정
공통 속성 : 이름, 가격 등은 Item라는 부모에 설계
따라서,
Item - name, price
Movie - actor 등..
Book - 저자, ISBN 등..
Album - 장르, 피쳐링 등..</li>
</ul>
<p>장점:</p>
<ul>
<li>테이블이 정규화 되어있어 null을 허용하지 않는다.</li>
<li>무결성 제약조건 사용</li>
<li>저장공간 효율화 </li>
</ul>
<p>단점 :</p>
<ul>
<li>테이블이 여러개가 생겨 조인시 복잡한 쿼리</li>
<li>성능이 싱글테이블 전략보다 낮을 수 있다.</li>
<li>인서트가 두번 일어남.</li>
</ul>
<p>2) 싱글 테이블</p>
<ul>
<li><p>단일 테이블을 활용하는 전략
예) Movie, Book, Album 이라는 데이터가 필요할 때, 한 테이블의 모든 행을 넣는다.
Item - name, price, actor, 저자, ISBN, 장르, 피쳐링 등</p>
<p>장점:</p>
<ul>
<li>한 테이블에 모든 데이터가 담겨 조회 속도가 빠름</li>
<li>테이블 구조가 간단</li>
</ul>
</li>
</ul>
<p>3) 각 테이블</p>
<ul>
<li><p>각 데이터마다 테이블을 세팅하는 전략
예) Movie, Book, Album에 공통행또한 하여 만듬.</p>
<p>사용하지 않는걸 추천한다고 하였음.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[EC2 인스턴스 자바 설치 및 환경변수 설정]]></title>
            <link>https://velog.io/@bellmin_kim/EC2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%9E%90%EB%B0%94-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@bellmin_kim/EC2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%9E%90%EB%B0%94-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Fri, 27 Jan 2023 07:28:29 GMT</pubDate>
            <description><![CDATA[<p>EC2 인스턴스에 자바 설치 및 환경변수 설정을 해보려합니다.</p>
<p>1.EC2 인스턴스에 연결합니다.</p>
<p>2.java 설치를 위한 목록을 뽑습니다.</p>
<pre><code>yum list | grep java-</code></pre><p><img src="https://velog.velcdn.com/images/bellmin_kim/post/295d38ca-c331-4be0-814c-9f7537cdbf0d/image.png" alt="">
3.목록중 원하는 자바를 선택합니다.(필자는 java-11-amazon-corretto.x86_64버전 설치예정)</p>
<p>4.명령어로 자바 설치</p>
<pre><code>sudo yum install -y java-11-amazon-corretto.x86_64</code></pre><p>여기서 -y 옵션은 질문에 모두 yes 처리를 의미합니다.</p>
<p>자바의 환경변수를 설정해주려합니다.</p>
<ol>
<li><p>자바 설치 경로를 확인합니다.</p>
<pre><code>//which : 명령어 위치 파악 
which java
//readlink : 심볼릭 링크의 위치 확인 
// -f : canonicalize by following every symlink in                           every component of the given name recursively;
     all but the last component must exist
readlink -f /usr/bin/java </code></pre></li>
<li><p>환경변수 편집을 위한 profile 수정</p>
<pre><code>sudo vi /etc/profile</code></pre><p>export JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto.x86_64
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar</p>
</li>
</ol>
<pre><code>//source : 스크립트 파일을 수정한 후에 수정된 값을 바로 적용
source /etc/profile</code></pre><p>echo $JAVA_HOME $PATH $CLASSPATH
로 적용된 것을 확인 가능 </p>
<p>여기까지 자바 설치 및 환경변수 편집이었습니다.</p>
<p>자바 설치가 정상적으로 확인이 필요하신분들은 java 클래스파일을 만들어 실행해보시면 됩니다.</p>
<pre><code>cd /home
vi HelloWorld.java

public class HelloWorld{
            public static void main(String[] args){
                    System.out.println(&quot;Hello World!!&quot;);
           }
}
//컴파일
javac HelloWorld.java
//실행
java -cp . HelloWorld</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[EC2 인스턴스 연결 후 보안정책 설정]]></title>
            <link>https://velog.io/@bellmin_kim/EC2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%97%B0%EA%B2%B0-%ED%9B%84-%EB%B3%B4%EC%95%88%EC%A0%95%EC%B1%85-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@bellmin_kim/EC2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%97%B0%EA%B2%B0-%ED%9B%84-%EB%B3%B4%EC%95%88%EC%A0%95%EC%B1%85-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Fri, 27 Jan 2023 06:32:48 GMT</pubDate>
            <description><![CDATA[<p>EC2 인스턴스 생성 후 연결을 해보도록 합시다.</p>
<h1 id="인스턴스-생성-후-연결">인스턴스 생성 후 연결</h1>
<p>1.생성한 인스턴스 ID 를 클릭합니다.
(EC2 -&gt; 좌측 메뉴 인스턴스 클릭 -&gt; 목록 중 인스턴스 ID (파란거) 선택)</p>
<p>2.상단 위쪽에 있는 연결 버튼을 클릭합니다.</p>
<ol start="3">
<li><p>3번째 탭에 있는 SSH 클라이언트 연결을 해보려합니다.
<img src="https://velog.velcdn.com/images/bellmin_kim/post/3b53c457-ac4a-4541-975e-3e9ec87d4ff5/image.png" alt="">
연결 방법이 자세하게 나와있습니다.</p>
</li>
<li><p>윈도우를 사용중이라면 CMD 혹은 PowerShell을 엽니다.</p>
</li>
<li><p>예: 라고 적힌 쪽의 ssh -i ~~ 를 복사하여 붙여넣기합니다.</p>
</li>
</ol>
<p><strong>주의 : pem (key파일이 다운로드된 곳에서 해주세요)</strong>
os가 다를경우 chmod 400 key파일이름 을 통해 권한 변경을 해주세요.</p>
<p>접속이 된 상태를 확인할 수 있습니다.</p>
<h1 id="보안정책-설정하기">보안정책 설정하기</h1>
<p>보안정책을 사용하지 않으면 기본적인 80(http), 443(https) 등에 대한 접근이 어렵습니다.</p>
<p>따라서 인바운드 정책을 추가하여 기본적인 포트들을 뚫어줍니다.</p>
<p>1.좌측 메뉴탭의 <strong>보안 그룹</strong> 을 선택합니다.
2.우측 상단에 있는 <strong>보안 그룹 생성</strong>을 선택합니다.
3. 보안 그룹 이름, 설명을 추가한 뒤, 인바운드 규칙탭의 규칙 추가 버튼을 클릭합니다.
<img src="https://velog.velcdn.com/images/bellmin_kim/post/f0435c6d-4dea-44a5-b0e0-3eb9638c8c82/image.png" alt=""></p>
<p>저희는 HTTP, HTTPS, SSH, SPRING에 사용할 포트를 뚫어볼 생각입니다.
<img src="https://velog.velcdn.com/images/bellmin_kim/post/c89c2e8c-d954-4faa-88f0-2e4b30f8216c/image.png" alt="">
다음과 같이 입력한 후 , <strong>보안 그룹 생성</strong>을 클릭합니다. (아웃바운드에 대한 규칙은 설정하지 않았습니다)</p>
<p>이제 생성한 보안 그룹을 인스턴스에 적용시키겠습니다.</p>
<p>1.생성한 인스턴스 ID 를 클릭합니다.
(EC2 -&gt; 좌측 메뉴 인스턴스 클릭 -&gt; 목록 중 인스턴스 ID (파란거) 선택)
2. 우측 상단 <strong>작업</strong> 버튼 클릭후 <strong>보안</strong> &gt; <strong>보안그룹변경</strong>을 클릭합니다.</p>
<p>3.보안 그룹을 선택합니다.
<img src="https://velog.velcdn.com/images/bellmin_kim/post/1ac9060f-0028-4b5d-b514-8adfd3646377/image.png" alt=""></p>
<p>4.기존의 적용되있던 wizzard 보안정책은 제거합니다.</p>
<ol start="5">
<li><strong>저장</strong>버튼을 눌러 보안 그룹을 변경합니다.</li>
</ol>
<p>인스턴스 시작과
보안 정책 변경이 끝났습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS EC2 인스턴스 시작해보기]]></title>
            <link>https://velog.io/@bellmin_kim/AWS-EC2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%8B%9C%EC%9E%91%ED%95%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@bellmin_kim/AWS-EC2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%8B%9C%EC%9E%91%ED%95%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Fri, 27 Jan 2023 05:28:20 GMT</pubDate>
            <description><![CDATA[<h1 id="1-ec2-인스턴스-생성">1. EC2 인스턴스 생성</h1>
<p>AWS 홈페이지에 들어갑니다.
간단한 회원가입, 로그인 후 
<img src="https://velog.velcdn.com/images/bellmin_kim/post/a262f0f0-2476-4ec7-a052-5153e6befaa5/image.png" alt="">
빨간색 펜 부분을 클릭합니다.</p>
<p><img src="https://velog.velcdn.com/images/bellmin_kim/post/3656470d-3a59-49ca-956f-c861ac0bee34/image.png" alt="">
아시아 서울을 택하고,</p>
<p>검색을 통해 EC2 를 입력합니다.
<img src="https://velog.velcdn.com/images/bellmin_kim/post/75c76d8c-0334-4586-9922-243a8ef6c5b3/image.png" alt=""></p>
<p>EC2 를 클릭하고 우측 상단에 있는 인스턴스 시작을 클릭합니다.</p>
<p><img src="https://velog.velcdn.com/images/bellmin_kim/post/5a162235-8f25-4f15-ae32-b49c4cded21c/image.png" alt=""></p>
<ol>
<li>aws 로고의 아마존 리눅스를 선택합니다.</li>
<li>인스턴스 유형은 프리 티어 사용 시 프리 티어를 선택합니다.</li>
</ol>
<p>생성된 키페어가 없을 경우,
처음이면 없는게 당연함.
<img src="https://velog.velcdn.com/images/bellmin_kim/post/6d72566d-f5b8-44be-9eab-51626e8a7a52/image.png" alt="">
을 클릭하고
<img src="https://velog.velcdn.com/images/bellmin_kim/post/1a29542b-7ba4-487e-b183-7c8da3f4fdff/image.png" alt="">
원하는 이름을 적어준 뒤, 키 페어 생성버튼을 누른다.</p>
<p><img src="https://velog.velcdn.com/images/bellmin_kim/post/5cb57b9d-9ef9-458b-8362-6cf808fbb81c/image.png" alt="">
**여기 중간에 있는 &quot;에서 SSH 트래픽 허용&quot; 은 내 IP로 선택합니다.</p>
<p>스토리지 구성 
<img src="https://velog.velcdn.com/images/bellmin_kim/post/88d0ff02-3d2e-4b32-bd76-122e4e5f65c4/image.png" alt="">
프리티어는 최대 30까지 무료로 이용가능하므로 30으로 설정한 후 
<strong>인스턴스 시작</strong>
을 클릭합니다.</p>
<p>해당 인스턴스는 IP가 계속해서 변경되므로 탄력적 IP 설정을 통해 고정된 IP값을 획득할 수 있습니다.</p>
<p>탄력적 IP설정을 위해 좌측 메뉴에서 탄력적IP 를 선택합니다.</p>
<p><img src="https://velog.velcdn.com/images/bellmin_kim/post/7a71cea3-41e7-4bf3-b902-30fda6a7f15d/image.png" alt="">
좌측 위에 <strong>탄력적 IP 주소 할당</strong> 을 클릭합니다.</p>
<p>변경사항 없이 <strong>할당</strong>버튼을 클릭하여 탄력적 IP 주소를 할당 받습니다.</p>
<p>할당 받은 탄력적 IP 주소를 누르고,
<img src="https://velog.velcdn.com/images/bellmin_kim/post/3a3961f2-dc5d-4203-98db-1abfc7e437ce/image.png" alt="">
<strong>탄력적IP 주소 연결</strong>을 누릅니다.</p>
<p><img src="https://velog.velcdn.com/images/bellmin_kim/post/16deffa4-f631-4083-ae52-57fdb27034f8/image.png" alt=""></p>
<ol>
<li>인스턴스 선택을 누르면 현재 실행중인 인스턴스가 아래에 뜬다 (만든 다음 바로 할 경우 안 뜰 수 있으니, 그때는 잠시 대기 후 클릭)</li>
<li>프라이빗 IP 주소 선택 (이전 인스턴스 생성시 내 IP를 설정한 주소가 나옴)
을 선택한 뒤, <strong>연결</strong>을 누른다.</li>
</ol>
<p>이러면 인스턴스 생성 성공</p>
]]></description>
        </item>
    </channel>
</rss>