<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>comete_yoon.log</title>
        <link>https://velog.io/</link>
        <description>개발블로그</description>
        <lastBuildDate>Wed, 12 Mar 2025 11:38:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. comete_yoon.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/comete_yoon" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[오류: git@github.com: Permission denied (publickey) Mac]]></title>
            <link>https://velog.io/@comete_yoon/%EC%98%A4%EB%A5%98-gitgithub.com-Permission-denied-publickey-Mac</link>
            <guid>https://velog.io/@comete_yoon/%EC%98%A4%EB%A5%98-gitgithub.com-Permission-denied-publickey-Mac</guid>
            <pubDate>Wed, 12 Mar 2025 11:38:00 GMT</pubDate>
            <description><![CDATA[<h1 id="git-push-오류">git push 오류</h1>
<p>공부하고 정리한 내용을 깃에 올리기 위해 push를 진행했다.
commit까지만 진행되고 push 단계에서 제목과 같은 오류가 생겼다.</p>
<p>구글링을 해보니 ssh키를 만들어야 한다고 했다.</p>
<h1 id="ssh-key-만들기">ssh key 만들기</h1>
<p>터미널에서 먼저 ssh키가 있는지 검색 </p>
<pre><code>$ cat ~/.ssh/id_rsa.pub</code></pre><p><img src="https://velog.velcdn.com/images/comete_yoon/post/4101d7da-e4f1-4bd1-9dbd-a7e5c6b3efc7/image.png" alt=""></p>
<p>아래와 같이 나왔다면 ssh키를 생성해주면 된다.</p>
<pre><code>$ ssh-keygen</code></pre><p><img src="https://velog.velcdn.com/images/comete_yoon/post/9ce0461c-dfe6-4444-b627-f692b98ee24e/image.png" alt=""></p>
<p>다른 블로그에서는 id_rsa로 나온다고 했지만 나는 id_ed25519 이렇게 나왔다.
다른이름이면 오류가 날수 있다고 했지만 그냥 이대로 진행했다.</p>
<p>엔터를 누르고 진행해준다.</p>
<p>.ssh 폴더로 이동 후</p>
<pre><code>cat id_ed25519.pub</code></pre><p>위 코드를 입력 후 ssh로 시작하는 키를 복사해준다.</p>
<h1 id="github에서-key-저장">github에서 key 저장</h1>
<p>오른쪽 상단의 프로필 이미지를 클릭 후 드롭다운박스에서 settings를 클릭해 준다.</p>
<p>ssh and gpg keys 메뉴를 클릭해 준다.</p>
<p>new ssh key를 클릭 후 (title은 아무 말이 나 적어도 무방)</p>
<p>key안에 복사한 key를 붙여넣기 해주고 add ssh key 버튼을 클릭하면 끝이다.</p>
<h2 id="이후엔-정상적으로-push-가-진행되었다">이후엔 정상적으로 push 가 진행되었다.</h2>
<p>ssh key를 이용하면 git비밀번호 입력없이 commit과 push가 진행된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[포트폴리오(pdf)파일 서버에서 공유하기]]></title>
            <link>https://velog.io/@comete_yoon/%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4pdf%ED%8C%8C%EC%9D%BC-%EC%84%9C%EB%B2%84%EC%97%90%EC%84%9C-%EA%B3%B5%EC%9C%A0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@comete_yoon/%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4pdf%ED%8C%8C%EC%9D%BC-%EC%84%9C%EB%B2%84%EC%97%90%EC%84%9C-%EA%B3%B5%EC%9C%A0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 11 Feb 2025 04:14:31 GMT</pubDate>
            <description><![CDATA[<p>국비 심화과정 종료를 앞두고 이력서를 쓰기 위해 포트폴리오에 프로젝트를 새로 추가하였다.
포트폴리오를 구글 드라이브로 공유했는데 이력서에 주소를 넣으니 오류가 나서 서버에서 공유해보기로 했다.</p>
<h2 id="1-aws-인스턴스에서">1. AWS 인스턴스에서</h2>
<h3 id="1-먼저-인스턴스를-열고-파일을-넣을-폴더를-만들어준다">1) 먼저 인스턴스를 열고 파일을 넣을 폴더를 만들어준다.</h3>
<pre><code>$ mkdir pdf</code></pre><h3 id="2-파일을-복사해서-넣을-경로를-찾아-복사한다">2) 파일을 복사해서 넣을 경로를 찾아 복사한다.</h3>
<pre><code>$ pwd</code></pre><p><img src="https://velog.velcdn.com/images/comete_yoon/post/653c7fd8-c841-4615-9ba6-906e34b6d87f/image.png" alt=""></p>
<p>아래 경로를 복사해준다.</p>
<h2 id="2-pdf-파일-복사해서-서버-디렉토리에-넣기2가지-방법">2. pdf 파일 복사해서 서버 디렉토리에 넣기(2가지 방법)</h2>
<h3 id="1-filezilla에서-ssh로-접속해-파일-넣기">1) filezilla에서 ssh로 접속해 파일 넣기</h3>
<p> 파일질라를 설치해준다.
<img src="https://velog.velcdn.com/images/comete_yoon/post/faa2eb7c-1992-4941-8b13-11efe1d8089a/image.png" alt=""></p>
<p>상단 왼쪽의 아이콘을 클릭후 site Manager(사이트관리자)에서 왼쪽 아래 new site를 클릭하고 오른쪽에 표시된 부분에 아래와 같이 정보를 입력하고 확인을 눌러준다.</p>
<blockquote>
<p>Protocol : SFTP - SSH File Transfer Protocol
Host : AWS 해당 인스턴스 퍼블릭 IPv4 DNS
Logon Type : Key file
User : ubuntu(인스턴스 생성시 선택한 os)
Key file : 인스턴스 생성시 다운로드된 ppk 키파일</p>
</blockquote>
<h3 id="2-인스턴스를-생성할-때-자동으로-다운-밨았던-키파일pem-or-ppk이-있는-디렉토리에서-터미널을-열어-명령-프롬프트로-파일-넣기">2) 인스턴스를 생성할 때 자동으로 다운 밨았던 키파일(.pem or .ppk)이 있는 디렉토리에서 터미널을 열어 명령 프롬프트로 파일 넣기</h3>
<pre><code>$ scp -i &lt;~/경로/key-pair.pem&gt; &lt;경로/파일명&gt; &lt;운영체제사용자이름&gt;@&lt;퍼블릭 ip 주소&gt;:&lt;파일을 복사해서 넣을 폴더&gt;</code></pre><blockquote>
<ul>
<li>&lt;~/경로/key-pair.pem&gt; : 키 파일의 절대 경로</li>
</ul>
</blockquote>
<ul>
<li>&lt;경로/파일명&gt; :  전송하려는 파일의 경로</li>
<li>&lt;운영체제사용자이름&gt; : AWS에서 사용중인 운영체제에 따라 이름이 다름<pre><code>   &amp;emsp; Amazon Linux - ec2-user
 &amp;emsp; Ubuntu - ubuntu
 &amp;emsp; RHEL - ec2-user
 &amp;emsp; CentOS - centos</code></pre></li>
<li>&lt;퍼블릭ip주소&gt; : 해당 인스턴스에서 찾을 수 있음</li>
<li>&lt;파일을 복사해서 넣을 폴더&gt; : EC2에서 파일을 저장할 디렉토리</li>
</ul>
<p> <em>만약 오류가 난다면 참고(EC2 서버에서 SSH로 접속)</em>
 <em>디렉토리 권한 설정: EC2 사용자가 디렉토리에 쓰기 권한을 가지도록 설정</em></p>
<pre><code> $ sudo chown ec2-user:ec2-user 디렉토리명*</code></pre><h2 id="마무리">마무리</h2>
<p> <strong>url : 인스턴스퍼블릭 IPv4 주소/8080/pdf(톰캣의 webapps에서 만든 디렉토리)/portfolio.pdf(파일명)</strong></p>
<p>url로 접속하면 서버에 올린 포트폴리오가 확인된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[war 파일로 AWS EC2 배포하기]]></title>
            <link>https://velog.io/@comete_yoon/war-%ED%8C%8C%EC%9D%BC%EB%A1%9C-AWS-EC2-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@comete_yoon/war-%ED%8C%8C%EC%9D%BC%EB%A1%9C-AWS-EC2-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 10 Feb 2025 08:40:46 GMT</pubDate>
            <description><![CDATA[<h1 id="war-파일로-프로젝트-배포하기">war 파일로 프로젝트 배포하기</h1>
<h2 id="1-war-파일-export하기">1. war 파일 Export하기</h2>
<p><img src="https://velog.velcdn.com/images/comete_yoon/post/eb1ce7a5-07de-4db4-99f2-6fc7e4a245d2/image.png" alt="">
원하는 프로젝트클릭하고 마우스 우클릭 Export 선택
<img src="https://velog.velcdn.com/images/comete_yoon/post/64de9ae0-5f34-4f82-9d6a-1d56f06ff1b1/image.png" alt="">
browser를 클릭하고 파일을 저장할 디렉토리를 선택한다.
finish를 선택하고 선택한 디렉토리로 가면 war 파일이 생성된걸 확인 할 수 있다.</p>
<h2 id="2-aws-ec2에서-인스턴스-생성-및-기타-설정하기">2. AWS EC2에서 인스턴스 생성 및 기타 설정하기</h2>
<h3 id="2-1-인스턴스-생성">2-1. 인스턴스 생성</h3>
<p><img src="https://velog.velcdn.com/images/comete_yoon/post/b75b841a-3c2c-4215-b2bc-a2bcfc556dc9/image.png" alt="">서울리전으로 선택
데이터 서버가 존재하는 지역을 말하는데 지리적으로 가까운 리적을 선택하는게 유리하다. 다른 지역의 리전이 선택 되어 있으면 생성했던 인스턴스가 보이지 않는다 그럴땐 리전을 확인해 보면 된다.
<img src="https://velog.velcdn.com/images/comete_yoon/post/f1cbdce9-d636-4818-ac48-947a009da8e4/image.png" alt="">검색창에 EC2를 검색 후 클릭해준다.
<img src="https://velog.velcdn.com/images/comete_yoon/post/729c31b7-3766-448b-ab5e-8b0f8e715a83/image.png" alt="">인스턴스 시작을 클릭해준다.<img src="https://velog.velcdn.com/images/comete_yoon/post/e296c611-c46f-4161-bdb1-b10c443566c8/image.png" alt="">
서버이름, os를 선택해준다. 
Ubuntu를 선택한 이유는 다른 os에 비해 가볍다는 이야기를 들었다!
<img src="https://velog.velcdn.com/images/comete_yoon/post/7f2826e4-34eb-48cb-8c32-6cdbdb4eaabf/image.png" alt="">인스턴스유형은 그대로 설정해준다.
새로운 키페어를 생성해준다. 키페어는 생성하면 키페어 파일이 다운로드 되는데 잃어버리지 말고 잘 보관해 둬야한다!!!
<img src="https://velog.velcdn.com/images/comete_yoon/post/1eb0f2f5-3a55-406b-89df-b68cd8e949d8/image.png" alt=""> 키페어 이름을 적고 키 페어 유형은 그대로 선택해준다.
프라이빗 키 파일 형식은 .pem을 선택한다.(PuTTY를 사용한다면 .ppk)
<img src="https://velog.velcdn.com/images/comete_yoon/post/222954b2-01ac-4b25-8986-3455f3e6cd81/image.png" alt="">다음은 보안그룹이다.
기본적으로 &#39;다음에서 SSH 트레픽 허용&#39;이 체크되어 있다. 체크를 해제 해준다.
편집을 클릭해서 보안그룹을 추가해도 되지만 일단 이과정 에서는 넘어가고 추후 추가해줄 예정이다.
<img src="https://velog.velcdn.com/images/comete_yoon/post/55be31dd-a39f-4d26-bfdd-7f449e86d1f5/image.png" alt=""> 스토리지는 30으로 바꿔준다.(최대 용량 30)
<img src="https://velog.velcdn.com/images/comete_yoon/post/d41dd519-ddc0-45a3-964e-b039e922c9a1/image.png" alt="">모든설정이 끝나고 인스턴스 시작을 눌러준다.<img src="https://velog.velcdn.com/images/comete_yoon/post/cdc6bab9-40d3-492a-82fa-a29277778f3d/image.png" alt="">
왼쪽 메뉴바에서 인스턴스를 클릭하면 생성된 인스턴스 목록이 보여진다. 
인스턴스를 사용하지 않을 때는 꼭 인스턴스 상태를 중지로 바꿔줘야 한다!!</p>
<h3 id="2-2-탄력적-ip-등록">2-2. 탄력적 IP 등록</h3>
<p><strong><del>주의!! 탄력적 IP를 사용하면 과금됩니다. 탄력적 IP없이 사용해도 무방합니다.</del></strong>
<img src="https://velog.velcdn.com/images/comete_yoon/post/f48f8128-2dcf-497e-86dd-35a24809d86e/image.png" alt="">왼쪽의 메뉴바에서 탄력적 IP를 클릭하고 오른쪽 상단에서 탄력적 IP주소 할당을 클릭한다.
<img src="https://velog.velcdn.com/images/comete_yoon/post/3bce2912-d1c0-422a-81e7-2d28feec6826/image.png" alt="">기본값으로 할당받아주면 된다. 할당을 클릭
<img src="https://velog.velcdn.com/images/comete_yoon/post/3c951f2d-224c-4298-a54e-1c7dc10045a3/image.png" alt="">생성한 탄력적 IP 주소를 선택하고 작업에서 탄력적 IP 주소 연결을 클릭한다.
<img src="https://velog.velcdn.com/images/comete_yoon/post/9be86224-131e-4a67-9c7c-d514a9938e37/image.png" alt="">생성한 인스턴스를 클릭 후 연결을 클릭하면 된다.</p>
<h3 id="2-3-보안그룹-설정">2-3. 보안그룹 설정</h3>
<p><img src="https://velog.velcdn.com/images/comete_yoon/post/1ebd9713-6273-48cd-a879-18f8dd4ecf74/image.png" alt="">
인스턴스 목록에서 내가 사용하기위해 생성한 인스턴스ID를 클릭한다.
<img src="https://velog.velcdn.com/images/comete_yoon/post/5dc55f89-5bb3-4f7e-ae52-5191010eaa89/image.png" alt="">아래 목록에서 보안을 선택
<img src="https://velog.velcdn.com/images/comete_yoon/post/8fb765a9-217b-41d6-bb1e-db019ae30e17/image.png" alt="">보안그룹 이름을 선택
<img src="https://velog.velcdn.com/images/comete_yoon/post/b18f9611-4624-49bd-816b-49e1f2b59010/image.png" alt=""><img src="https://velog.velcdn.com/images/comete_yoon/post/d8760edd-ef95-475e-aa57-b3a380f6013f/image.png" alt="">인바운드 규칙 편집 -&gt; 규칙추가 클릭
<img src="https://velog.velcdn.com/images/comete_yoon/post/d1d609aa-f199-42fa-879e-010ac3855abc/image.png" alt=""> 규칙 추가 버튼을 클릭해서 화면과 같이 만들어 준다 ssh는 내IP만 허용하도록 해준다.(소스가 IPv4라면 0.0.0.0/0 | IPv6라면 ::/0)</p>
<h2 id="3-ubuntu로-접속해-java와-tomcat-설치하기">3. Ubuntu로 접속해 java와 Tomcat 설치하기</h2>
<h3 id="3-1-ubuntu-접속">3-1. Ubuntu 접속</h3>
<p><img src="https://velog.velcdn.com/images/comete_yoon/post/d8aee07a-ce84-4533-b085-3896bc71b6dc/image.png" alt=""><img src="https://velog.velcdn.com/images/comete_yoon/post/ab2ad33d-5e38-481b-842c-db7754c3a35a/image.png" alt=""> 연결을 클릭해준다.
<img src="https://velog.velcdn.com/images/comete_yoon/post/5fd8e868-0707-4aaa-bbba-42cb69a6e6f0/image.png" alt=""> 처음 연결 후 이런 화면이 나와 너무 당황 스러웠다. 뭔가 잘 못 한줄 알고 계속 삭제하고 새로 만들고를 반복 ㅜㅜ </p>
<p>해결책을 찾았다! 아래 참고한 블로그 링크이다 이대로 따라하면 해결된다!
[참고] <a href="https://dohyeon.tistory.com/97">https://dohyeon.tistory.com/97</a></p>
<p><img src="https://velog.velcdn.com/images/comete_yoon/post/c7586b4b-45a6-4a36-ad4f-3760d7543d86/image.png" alt="">정상적으로 접속 되었다!</p>
<h3 id="3-2-java-설치">3-2. java 설치</h3>
<pre><code>$ sudo apt-get update</code></pre><p><img src="https://velog.velcdn.com/images/comete_yoon/post/912b1126-fb05-4607-a5de-27ae55e00767/image.png" alt=""></p>
<pre><code>$ sudo apt-get install openjdk-11-jdk</code></pre><p>jdk 11버전으로 프로젝트를 진행했기 때문에 11로 설치해준다.</p>
<p>설치전 업데이트를 진행 해준다.(이미 설치가 되었기 때문에 이미지는 생략)</p>
<pre><code>$ java -version</code></pre><p><img src="https://velog.velcdn.com/images/comete_yoon/post/5690f180-2419-4050-8aaa-fc51df4852f0/image.png" alt=""></p>
<p>설치 된것을 확인 할 수 있다.</p>
<pre><code>$ update-alternatives --list java</code></pre><p>설치된 경로를 먼저 찾아준다.</p>
<p>bin/java를 제외한 부분을 복사해준다.</p>
<pre><code>$ vim ~/.bashrc</code></pre><p>bashrc 파일을 열고 i를 입력하면 편집이 가능하다.</p>
<pre><code>$ export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
$ export PATH=${PATH}:${JAVA_HOME}/bin</code></pre><p>환경변수를 등록해준다.(등록 후 나올때는 :wq(저장 후 종료)입력)</p>
<pre><code>$ source ~/.bashrc</code></pre><p>환경변수 설정 적용</p>
<pre><code>$ echo $JAVA_HOME</code></pre><p>환경변수 확인</p>
<h3 id="3-3-tomcat-설치">3-3. Tomcat 설치</h3>
<p><a href="https://tomcat.apache.org/download-90.cgi">https://tomcat.apache.org/download-90.cgi</a>
위 링크로 들어가서 ( tomcat 9로 프로젝트 개발 진행함 )
<img src="https://velog.velcdn.com/images/comete_yoon/post/8f4e8484-7da8-4473-92f0-43ae079c52a4/image.png" alt=""></p>
<p>tar.gz 를 오른쪽 마우스 클릭 후 링크 복사 해준다.</p>
<pre><code>$ wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.98/bin/apache-tomcat-9.0.98.tar.gz</code></pre><p>톰캣을 다운받는다.</p>
<pre><code>$ ls</code></pre><p><img src="https://velog.velcdn.com/images/comete_yoon/post/02778e92-17dd-4636-a1ae-772b486aee06/image.png" alt="">
다운로드가 완료되면 파일을 확인해본다.</p>
<pre><code>$ tar -zvxf apache-tomcat-9.0.69.tar.gz</code></pre><p>압축을 풀어준다.
파란색은 압축 해제된 파일, 빨간색을 톰캣을 다운받고난 직후 압축파일이다.</p>
<h3 id="3-4-방화벽-설정">3-4. 방화벽 설정</h3>
<pre><code>$ sudo ufw allow from any to any port 8080 proto tcp</code></pre><p>외부에서 8080 포트 접근 허용을 위해 방화벽 포트를 열어 준다. </p>
<h2 id="4-filezilla-사용해서-war-파일-aws-서버로-배포">4. FileZilla 사용해서 war 파일 AWS 서버로 배포</h2>
<p> 파일질라를 설치해준다.</p>
<h3 id="3-1-ftp-연결">3-1. FTP 연결</h3>
<p><img src="https://velog.velcdn.com/images/comete_yoon/post/0bbbe50b-a678-46ce-94ff-51854ec99cc3/image.png" alt="">
상단 왼쪽의 아이콘을 클릭후 site Manager(사이트관리자)에서 왼쪽 아래 new site를 클릭하고 오른쪽에 표시된 부분에 아래와 같이 정보를 입력하고 확인을 눌러준다.</p>
<blockquote>
<p>Protocol : SFTP - SSH File Transfer Protocol
Host : AWS 해당 인스턴스 퍼블릭 IPv4 DNS
Logon Type : Key file
User : ubuntu(인스턴스 생성시 선택한 os)
Key file : 인스턴스 생성시 다운로드된 ppk 키파일</p>
</blockquote>
<h3 id="3-2-war-파일-배포">3-2. war 파일 배포</h3>
<p>filezilla에서 왼쪽이 내 컴퓨터이고 오른쪽이 aws에서 만든 인스턴스의 디렉토리 이다.
왼쪽에서 생성했던 war파일을 찾아 오른쪽에서 home/ubuntu/apache-tomcat-9.0.98/webapps 경로에 파일을 넣어주고 새로고침을 진행한다.</p>
<p>그럼 war파일과 같은이름의 폴더가 생성 된 것이 확인된다.</p>
<h3 id="3-3-톰캣-실행">3-3. 톰캣 실행</h3>
<pre><code>$ cd apache-tomcat-9.0.98/bin</code></pre><p>apache-tomcat-9.0.98/bin 에서 톰캣 실행</p>
<pre><code>$ ./startup.sh</code></pre><p>톰캣 실행 </p>
<pre><code>$ ./shutdown.sh </code></pre><p>톰캣 종료</p>
<p>tomcat을 실행 후 퍼블릭 IPv4 DNS 로 접속하면 화면이 뜨는 것을 확인할 수 있다.</p>
<p>참고한 사이트</p>
<p><a href="https://08genie.tistory.com/entry/AWS-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8Spring-Boot-AWS-EC2-war-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-1-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%83%9D%EC%84%B1-%EB%B0%8F-%EC%84%A4%EC%A0%95">- [AWS] 스프링부트(Spring Boot) AWS EC2 war 배포하기 (1) - 인스턴스 생성 및 설정</a></p>
<p><a href="https://08genie.tistory.com/entry/AWS-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8Spring-Boot-AWS-EC2-war-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-2-PuTTY%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-Ubuntu-java-tomcat-%EC%84%A4%EC%B9%98">-[AWS] 스프링부트(Spring Boot) AWS EC2 war 배포하기 (2) - PuTTY를 이용한 Ubuntu java , tomcat 설치</a></p>
<p><a href="https://08genie.tistory.com/entry/AWS-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8Spring-Boot-AWS-EC2-war-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-3-FileZilla%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-Spring-Boot-war-%ED%8C%8C%EC%9D%BC-%EB%B0%B0%ED%8F%AC">[AWS] 스프링부트(Spring Boot) AWS EC2 war 배포하기 (3) - FileZilla를 이용한 Spring Boot war 파일 배포</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[오류) Gradle 및 IntelliJ 오류 해결 과정]]></title>
            <link>https://velog.io/@comete_yoon/%EC%98%A4%EB%A5%98-SpringBoot-intelliJ-gradle-build-%EA%B2%BD%EB%A1%9C</link>
            <guid>https://velog.io/@comete_yoon/%EC%98%A4%EB%A5%98-SpringBoot-intelliJ-gradle-build-%EA%B2%BD%EB%A1%9C</guid>
            <pubDate>Tue, 07 Jan 2025 06:43:50 GMT</pubDate>
            <description><![CDATA[<h3 id="오류-메세지">오류 메세지</h3>
<blockquote>
<p>set process working directory to &#39;/Users/s2ong/DevData/inteliJData/VocaLab/Spring/www&#39;: could not setcwd() (errno 2: No such file or directory)</p>
</blockquote>
<p>(의존성으로 인한 jsp를 찾지못하는 오류가 났던)프로젝트를 삭제하고 새로 생성하면서 Gradle이 이전 프로젝트의 경로를 참조해 빌드에 실패했다.</p>
<p>깃에서 프로젝트를 받아오면서 이전 프로젝트의 폴더를 잠시 남겨두면서 꼬인 것으로 추정된다.</p>
<hr>
<h3 id="해결">해결</h3>
<h4 id="1-gradle-캐시와-데몬-삭제">1. Gradle 캐시와 데몬 삭제</h4>
<p>Gradle의 캐시와 데몬을 삭제하여 이전 프로젝트 경로와 관련된 잔여 데이터를 제거했다.</p>
<pre><code class="language-bash"> $  rm -rf ~/.gradle/caches/
 $  rm -rf ~/.gradle/daemon/</code></pre>
<h4 id="2-git에서-idea-폴더를-삭제">2. git에서 .idea 폴더를 삭제</h4>
<p>main branch 와 내가 사용중인 branch 에서 <code>.idea</code>폴더를 삭제했다. 
<code>.idea</code>폴더는 IntelliJ 프로젝트 설정을 담고있어 main branch를 새로 pull하면 또다시 삭제한 프로젝트의 경로를 참조했기 때문이다.</p>
<h4 id="3-macos-intellij-완전-삭제-후-재설치">3. (MacOS) IntelliJ 완전 삭제 후 재설치</h4>
<p>JetBrains 폴더들을 모두 삭제해준다.</p>
<pre><code class="language-bash">$  rm -rf ~/Library/Application\ Support/JetBrains
$  rm -rf ~/Library/Caches/JetBrains
$  rm -rf ~/Library/Preferences/JetBrains
$  rm -rf ~/Library/Logs/JetBrains</code></pre>
<p>삭제 후 새로 설치한다.</p>
<h4 id="4-gradlew을--새로-빌드해준다">4. gradlew을  새로 빌드해준다.</h4>
<pre><code class="language-bash">$  ./gradlew clean build</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[오류) Spring Boot: .jsp 파일 Not Found(404) 문제]]></title>
            <link>https://velog.io/@comete_yoon/SpringBoot-%EC%97%90%EC%84%9C-.jsp%ED%8C%8C%EC%9D%BC%EC%9D%84-%EC%9D%B8%EC%8B%9D%ED%95%98%EC%A7%80-%EB%AA%BB%ED%95%98%EB%8A%94-%ED%98%84%EC%83%81</link>
            <guid>https://velog.io/@comete_yoon/SpringBoot-%EC%97%90%EC%84%9C-.jsp%ED%8C%8C%EC%9D%BC%EC%9D%84-%EC%9D%B8%EC%8B%9D%ED%95%98%EC%A7%80-%EB%AA%BB%ED%95%98%EB%8A%94-%ED%98%84%EC%83%81</guid>
            <pubDate>Tue, 07 Jan 2025 05:55:43 GMT</pubDate>
            <description><![CDATA[<h2 id="jsp-파일을-찾을-수-없다는-오류-해결-과정">JSP 파일을 찾을 수 없다는 오류 해결 과정</h2>
<h3 id="오류-메시지">오류 메시지</h3>
<blockquote>
<p><strong>There was an unexpected error (type=Not Found, status=404).
JSP file [/WEB-INF/main.jsp] not found</strong></p>
</blockquote>
<p>팀 프로젝트를 진행하던 중, 모든 팀원에게서 <code>.jsp</code> 파일을 찾을 수 없다는 404 오류가 발생했다. <code>build.gradle</code>과 <code>application.properties</code>를 아무리 확인해도 문제가 해결되지 않았으며, 디렉토리 이름의 오타 여부와 <code>Controller</code>에서의 경로 설정 또한 점검해 보았지만 원인을 찾을 수 없었다.</p>
<h3 id="해결-방안">해결 방안</h3>
<p>위와 같은 오류를 겪었다면 아래 사항을 우선적으로 확인하기를 권장한다</p>
<ul>
<li><strong>JSP 관련 의존성 추가 여부</strong></li>
<li><strong>파일 디렉토리 이름 및 경로 설정</strong></li>
</ul>
<h4 id="1-buildgradle---jsp-의존성-추가"><strong>1. build.gradle - JSP 의존성 추가</strong></h4>
<pre><code class="language-gradle">implementation &#39;org.apache.tomcat.embed:tomcat-embed-jasper&#39;
implementation &#39;jakarta.servlet:jakarta.servlet-api&#39;
implementation &#39;jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api&#39;
implementation &#39;org.glassfish.web:jakarta.servlet.jsp.jstl&#39;</code></pre>
<h4 id="2-applicationproperties---controller-return-설정"><strong>2. application.properties - Controller return 설정</strong></h4>
<pre><code class="language-properties">spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp</code></pre>
<ul>
<li>디렉토리 구조
src/main/webapp/WEB-INF/(여기서부턴 디렉토리명마다 다름)views/</li>
</ul>
<h4 id="2maincontroller"><strong>2.MainController</strong></h4>
<pre><code class="language-java">@Controller
public class MainController {

    @GetMapping(&quot;/&quot;)
    public String main() {
        return &quot;main/main&quot;; // properties에서 views폴더까지 설정
    }
}</code></pre>
<h3 id="문제의-원인">문제의 원인</h3>
<p>해결 과정 중, 새로운 프로젝트를 생성하며 문제의 원인을 발견했다. 프로젝트 생성 시 의존성에 <strong>Spring Security</strong>와 <strong>OAuth2 Client</strong>를 추가한 것이 원인이였다. </p>
<p>이 두 의존성을 추가하면 메인 페이지 이전에 로그인 화면으로 리다이렉션되는 기본 동작이 추가된다. <code>build.gradle</code>에서 이 의존성들을 삭제한 상태로 개발을 진행하려다 보니 경로에서 문제가 발생한 것으로 보였다.</p>
<hr>
<h3 id="해결">해결</h3>
<p>새로운 프로젝트를 생성하면서 해당 의존성을 배제한 상태로 설정한 결과, 더 이상 오류는 발생하지 않았다. 이와 같은 문제를 겪었다면 의존성 추가 여부와 경로 설정을 점검하는 것이 우선이다.</p>
<br>


<h2 id="새로운-오류-발생-근데-오류-메세지는-같음-주의">새로운 오류 발생 근데 오류 메세지는 같음 주의!!</h2>
<p>위 오류를 해결하고 새로운 프로젝트를 생성 후 개발을 시작하려는 찰나 또 같은 jsp루트와 파일을 또다시 찾지 못하는 오류가 발생했다. intelliJ에서 실행하면서 생기는 오류같았다.(차라리 console에서 오류의 원인이라도 찾을 수 있으면...ㅜㅜ) 구글링으로 해결법을 찾았다!!</p>
<p>참고한 블로그 <a href="https://milenote.tistory.com/176">https://milenote.tistory.com/176</a></p>
<hr>
<h3 id="해결-1">해결</h3>
<p>intelliJ 상단 오른쪽에서 아래화살표를 누르고 Edit Configurations를 클릭해준다. 
<img src="https://velog.velcdn.com/images/comete_yoon/post/fde2f3a9-0146-4f40-882b-dec4f20ce63e/image.png" alt=""></p>
<p>Spring Boot 아래에서 프로젝트명Application을 눌러준다.
여기서 Working directory에 <strong>$MODULE_WORKING_DIR$</strong>을 넣어주고 OK를 클릭하면 끝이다.</p>
<p><img src="https://velog.velcdn.com/images/comete_yoon/post/fd300b83-6178-415e-af0e-5ee6011889be/image.png" alt=""></p>
<p>⚠️ 만약 Working directory를 찾을 수 없으면 Modify options에서 찾을 수 있다.
<img src="https://velog.velcdn.com/images/comete_yoon/post/7084ddea-21f1-48cf-9bb4-963c596d4e59/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring Framework를 SpringBoot로 마이그레이션 하기 - 2]]></title>
            <link>https://velog.io/@comete_yoon/Spring-Framework%EB%A5%BC-SpringBoot%EB%A1%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-%ED%95%98%EA%B8%B0-2</link>
            <guid>https://velog.io/@comete_yoon/Spring-Framework%EB%A5%BC-SpringBoot%EB%A1%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-%ED%95%98%EA%B8%B0-2</guid>
            <pubDate>Mon, 06 Jan 2025 12:43:05 GMT</pubDate>
            <description><![CDATA[<p><del>참고만 하세요. 과정 기록용입니다.</del></p>
<p><strong>챗 GPT에게 마이그레이션 방법을 물어보기로 했다.</strong></p>
<p><strong>기존 프로젝트는 삭제 후 새로 만들면서 myBatis Framework를 추가하지 않아서 나는 오류가 있어 기존 dependencie에 myBatis만 더 추가해 주었다.</strong></p>
<br>

<h1 id="1-pomxml-→-buildgradle--pomproperties-→-applicationproperties">1. pom.xml → build.gradle / pom.properties → application.properties</h1>
<h3 id="1-방법은-마이그레션-1-에서와-동일하다-일단-springboot-version-과-dependency-management는-최신버전으로-설정해-주었다">1) 방법은 마이그레션 1 에서와 동일하다. 일단 SpringBoot version 과 dependency-management는 최신버전으로 설정해 주었다.</h3>
<h3 id="2-pomproperties-파일의-내용을-applicationproperties에-통합해준다">2) pom.properties 파일의 내용을 application.properties에 통합해준다.</h3>
<blockquote>
<p><strong>&lt;pom.properties&gt;</strong></p>
</blockquote>
<pre><code class="language-pom.properties">#Generated by Maven Integration for Eclipse
#Fri Jan 12 16:34:16 KST 2024
m2e.projectLocation=C\:\\Users\\ITWILL\\git\\Table_zzimkong\\Table_zzimkong
m2e.projectName=Table_zzimkong
groupId=com.table
artifactId=zzimkong
version=1.0.0-BUILD-SNAPSHOT</code></pre>
<blockquote>
<p><strong>&lt;application.properties&gt;</strong></p>
</blockquote>
<pre><code class="language-application.properties"># Application Configuration
    spring.application.name=Table_zzimkong
# Maven Project Information
    project.groupId=com.table
    project.artifactId=zzimkong
    project.version=1.0.0-SNAPSHOT
# Project Path (MacOS)
    project.location=/Users/ITWILL/git/Table_zzimkong/Table_zzimkong</code></pre>
<ul>
<li>여기서 모두 추가하면 안된다!! Maven 방식에서 gradle 방식으로 변환중이기 때문이다. Maven Project Information,Project Path 이두부분은 제거해준다.<pre><code># Application Configuration
  spring.application.name=Table_zzimkong</code></pre></li>
<li>결과적으로 Application Configuration 한가지만 추가해주면 된다.<pre><code>group = &#39;com.table&#39;
version = &#39;1.0.0-SNAPSHOT&#39;</code></pre></li>
<li>group 과 version은 build.gradle에 위의 방식으로 이미 추가되어 있다.</li>
</ul>
<br>

<h1 id="2-mybatis-configxml-→-파일-그대로-사용--applicationproperties">2. mybatis-config.xml → 파일 그대로 사용 / application.properties</h1>
<h3 id="1-mybatis-configxml-파일은-그대로-사용-가능하다">1) mybatis-config.xml 파일은 그대로 사용 가능하다.</h3>
<ul>
<li>*<em>경로 : src/main/resources/mybatis-config.xml *</em></li>
</ul>
<h3 id="2-applicationpropertiesapplicationyml에서-mybatis-경로를-추가해준다">2) application.properties(application.yml)에서 myBatis 경로를 추가해준다.</h3>
<blockquote>
<pre><code>mybatis.config-location=classpath:/mybatis-config.xml</code></pre></blockquote>
<pre><code>
&lt;br&gt;

# 3. log4j.xml → log4j2.xml / log4jdbc.log4j2.properties → build.gradle,application.properties
### 1) log4j.xml파일을 log4j2.xml에 맞게 변환해준다.

&gt;**&lt;log4j.xml\&gt;**
```xml
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE log4j:configuration PUBLIC &quot;-//APACHE//DTD LOG4J 1.2//EN&quot; &quot;http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd&quot;&gt;
&lt;log4j:configuration xmlns:log4j=&quot;http://jakarta.apache.org/log4j/&quot;&gt;
    &lt;!-- Appenders --&gt;
    &lt;appender name=&quot;console&quot; class=&quot;org.apache.log4j.ConsoleAppender&quot;&gt;
        &lt;param name=&quot;Target&quot; value=&quot;System.out&quot; /&gt;
        &lt;layout class=&quot;org.apache.log4j.PatternLayout&quot;&gt;
            &lt;param name=&quot;ConversionPattern&quot; value=&quot;%-5p: %c - %m%n&quot; /&gt;
        &lt;/layout&gt;
    &lt;/appender&gt;
    &lt;!-- Application Loggers --&gt;
    &lt;logger name=&quot;com.table.zzimkong&quot;&gt;
        &lt;level value=&quot;info&quot; /&gt;
    &lt;/logger&gt;
    &lt;!-- 3rdparty Loggers --&gt;
    &lt;logger name=&quot;org.springframework.core&quot;&gt;
        &lt;level value=&quot;info&quot; /&gt;
    &lt;/logger&gt;
    &lt;logger name=&quot;org.springframework.beans&quot;&gt;
        &lt;level value=&quot;info&quot; /&gt;
    &lt;/logger&gt;
    &lt;logger name=&quot;org.springframework.context&quot;&gt;
        &lt;level value=&quot;info&quot; /&gt;
    &lt;/logger&gt;
    &lt;logger name=&quot;org.springframework.web&quot;&gt;
        &lt;level value=&quot;info&quot; /&gt;
    &lt;/logger&gt;
    &lt;!-- 이 부분부터 항목 추가 --&gt;
    &lt;!-- SQL Logger 추가 --&gt;
    &lt;!-- 1. jdbc.sqlonly : SQL 쿼리 문장에 대한 로그(전달인자 포함한 문장 표시) --&gt;
    &lt;logger name=&quot;jdbc.sqlonly&quot; additivity=&quot;false&quot;&gt;
        &lt;level value=&quot;info&quot; /&gt;
        &lt;appender-ref ref=&quot;console&quot; /&gt;
    &lt;/logger&gt;
    &lt;!-- 2. jdbc.sqltiming : SQL 문장과 실행에 소요된 시간(밀리초)에 대한 로그 --&gt;
    &lt;logger name=&quot;jdbc.sqltiming&quot; additivity=&quot;false&quot;&gt;
        &lt;level value=&quot;info&quot; /&gt;
        &lt;appender-ref ref=&quot;console&quot; /&gt;
    &lt;/logger&gt;
    &lt;!-- 3. jdbc.audit : JDBC 호출 정보에 대한 로그(ResultSet 결과값 제외) =&gt; 내용 많음 --&gt;
&lt;!--     &lt;logger name=&quot;jdbc.audit&quot; additivity=&quot;false&quot;&gt; --&gt;
&lt;!--         &lt;level value=&quot;info&quot; /&gt; --&gt;
&lt;!--         &lt;appender-ref ref=&quot;console&quot; /&gt; --&gt;
&lt;!--     &lt;/logger&gt; --&gt;
    &lt;!-- 4. jdbc.result : ResultSet 객체 내용을 포함한 JDBC 호출 정보에 대한 로그 =&gt; 내용 많음 --&gt;
&lt;!--     &lt;logger name=&quot;jdbc.result&quot; additivity=&quot;false&quot;&gt; --&gt;
&lt;!--         &lt;level value=&quot;info&quot; /&gt; --&gt;
&lt;!--         &lt;appender-ref ref=&quot;console&quot; /&gt; --&gt;
&lt;!--     &lt;/logger&gt; --&gt;    
    &lt;!-- 5. jdbc.resultsettable : SELECT 실행 결과(데이터 테이블 = ResultSet 객체 내용) 에 대한 로그 --&gt;
    &lt;logger name=&quot;jdbc.resultsettable&quot; additivity=&quot;false&quot;&gt;
        &lt;level value=&quot;info&quot; /&gt;
        &lt;appender-ref ref=&quot;console&quot; /&gt;
    &lt;/logger&gt;
    &lt;!-- 여기까지 항목 추가 --&gt;
    &lt;!-- Root Logger --&gt;
    &lt;root&gt;
        &lt;priority value=&quot;warn&quot; /&gt;
        &lt;appender-ref ref=&quot;console&quot; /&gt;
    &lt;/root&gt;    
&lt;/log4j:configuration&gt;</code></pre><br>

<blockquote>
<p><strong>&lt;log4j2.xml&gt;</strong></p>
</blockquote>
<pre><code class="language-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;Configuration status=&quot;WARN&quot;&gt;
    &lt;!-- Appenders --&gt;
    &lt;Appenders&gt;
        &lt;!-- Console Appender --&gt;
        &lt;Console name=&quot;Console&quot; target=&quot;SYSTEM_OUT&quot;&gt;
            &lt;PatternLayout pattern=&quot;%-5p: %c - %m%n&quot; /&gt;
        &lt;/Console&gt;
    &lt;/Appenders&gt;
    &lt;!-- Loggers --&gt;
    &lt;Loggers&gt;
        &lt;!-- Application Loggers --&gt;
        &lt;Logger name=&quot;com.table.zzimkong&quot; level=&quot;info&quot; additivity=&quot;false&quot;&gt;
            &lt;AppenderRef ref=&quot;Console&quot; /&gt;
        &lt;/Logger&gt;
        &lt;!-- 3rd Party Loggers --&gt;
        &lt;Logger name=&quot;org.springframework.core&quot; level=&quot;info&quot; additivity=&quot;false&quot;&gt;
            &lt;AppenderRef ref=&quot;Console&quot; /&gt;
        &lt;/Logger&gt;
        &lt;Logger name=&quot;org.springframework.beans&quot; level=&quot;info&quot; additivity=&quot;false&quot;&gt;
            &lt;AppenderRef ref=&quot;Console&quot; /&gt;
        &lt;/Logger&gt;
        &lt;Logger name=&quot;org.springframework.context&quot; level=&quot;info&quot; additivity=&quot;false&quot;&gt;
            &lt;AppenderRef ref=&quot;Console&quot; /&gt;
        &lt;/Logger&gt;
        &lt;Logger name=&quot;org.springframework.web&quot; level=&quot;info&quot; additivity=&quot;false&quot;&gt;
            &lt;AppenderRef ref=&quot;Console&quot; /&gt;
        &lt;/Logger&gt;
        &lt;!-- SQL Loggers --&gt;
        &lt;!-- 1. jdbc.sqlonly : SQL 쿼리 문장에 대한 로그(전달인자 포함한 문장 표시) --&gt;
        &lt;Logger name=&quot;jdbc.sqlonly&quot; level=&quot;info&quot; additivity=&quot;false&quot;&gt;
            &lt;AppenderRef ref=&quot;Console&quot; /&gt;
        &lt;/Logger&gt;
        &lt;!-- 2. jdbc.sqltiming : SQL 문장과 실행에 소요된 시간(밀리초)에 대한 로그 --&gt;
        &lt;Logger name=&quot;jdbc.sqltiming&quot; level=&quot;info&quot; additivity=&quot;false&quot;&gt;
            &lt;AppenderRef ref=&quot;Console&quot; /&gt;
        &lt;/Logger&gt;
        &lt;!-- 3. jdbc.audit : JDBC 호출 정보에 대한 로그(ResultSet 결과값 제외) =&gt; 내용 많음 --&gt;
        &lt;!--
        &lt;Logger name=&quot;jdbc.audit&quot; level=&quot;info&quot; additivity=&quot;false&quot;&gt;
            &lt;AppenderRef ref=&quot;Console&quot; /&gt;
        &lt;/Logger&gt;
        &lt;Logger name=&quot;jdbc.result&quot; level=&quot;info&quot; additivity=&quot;false&quot;&gt;
            &lt;AppenderRef ref=&quot;Console&quot; /&gt;
        &lt;/Logger&gt;
        --&gt;
        &lt;!-- 5. jdbc.resultsettable : SELECT 실행 결과(데이터 테이블 = ResultSet 객체 내용) 에 대한 로그 --&gt;
        &lt;Logger name=&quot;jdbc.resultsettable&quot; level=&quot;info&quot; additivity=&quot;false&quot;&gt;
            &lt;AppenderRef ref=&quot;Console&quot; /&gt;
        &lt;/Logger&gt;
        &lt;!-- 여기까지 항목 추가 --&gt;
        &lt;!-- Root Logger --&gt;
        &lt;Root level=&quot;warn&quot;&gt;
            &lt;AppenderRef ref=&quot;Console&quot; /&gt;
        &lt;/Root&gt;
    &lt;/Loggers&gt;
&lt;/Configuration&gt;</code></pre>
<h3 id="2-log4jdbclog4j2properties-파일의-dependence를-buildgradle에-추가해준다">2) log4jdbc.log4j2.properties 파일의 dependence를 build.gradle에 추가해준다.</h3>
<blockquote>
</blockquote>
<pre><code class="language-build.gradle">implementation &#39;org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16&#39;</code></pre>
<h3 id="3log4jdbclog4j2properties-파일의-내용을-applicationproperties-에-통합해준다">3)log4jdbc.log4j2.properties 파일의 내용을 application.properties 에 통합해준다.</h3>
<blockquote>
</blockquote>
<pre><code class="language-application.properties">log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
logging.level.net.sf.log4jdbc=DEBUG</code></pre>
<br>

<h1 id="4-webxml--root-contextxml--servlet-contextxml-→-applicationproperties-추가">4. web.xml / root-context.xml / servlet-context.xml → application.properties 추가</h1>
<p><strong>Spring Boot에서 기본적으로 제공되어 제거가 가능한 요소들은 추가하지 않았다.</strong></p>
<h3 id="1-webxml">1) web.xml</h3>
<blockquote>
<p><strong>&lt;web.xml&gt;</strong></p>
</blockquote>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;web-app version=&quot;2.5&quot; xmlns=&quot;Http://java.sun.com/xml/ns/javaee&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;&gt;
    &lt;!-- The definition of the Root Spring Container shared by all Servlets and Filters --&gt;
    &lt;context-param&gt; &lt;!-- spring의 루트 애플리케이션 컨텍스트를 지정 --&gt;
        &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
        &lt;param-value&gt;/WEB-INF/spring/root-context.xml&lt;/param-value&gt;
    &lt;/context-param&gt;    
    &lt;!-- Creates the Spring Container shared by all Servlets and Filters --&gt;
    &lt;listener&gt;&lt;!--  루트 컨텍스트를 로드 --&gt;
        &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;
    &lt;/listener&gt;
    &lt;!-- Processes application requests --&gt;
    &lt;!-- Spring MVC의 DispatcherServlet을 설정하고, 해당 서블릿이 사용할 컨텍스트 파일 경로를 지정 --&gt;
    &lt;servlet&gt;&lt;!--  서블릿 이름(appServlet)과 서블릿 초기화 파라미터를 정의 --&gt;
        &lt;servlet-name&gt;appServlet&lt;/servlet-name&gt;
        &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt;
        &lt;init-param&gt;
            &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
            &lt;param-value&gt;/WEB-INF/spring/appServlet/servlet-context.xml&lt;/param-value&gt;
        &lt;/init-param&gt;
        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
    &lt;/servlet&gt;        
    &lt;servlet-mapping&gt;&lt;!-- DispatcherServlet이 처리할 URL 패턴(/)을 지정 --&gt;
        &lt;servlet-name&gt;appServlet&lt;/servlet-name&gt;
        &lt;url-pattern&gt;/&lt;/url-pattern&gt;
    &lt;/servlet-mapping&gt;
    &lt;!-- POST 방식 파라미터에 대한 한글 등의 인코딩 처리를 위한 필터 설정 --&gt;
    &lt;!-- CharacterEncodingFilter를 통해 POST 요청 시 UTF-8로 인코딩 --&gt;
    &lt;filter&gt;
        &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;
        &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt;
        &lt;init-param&gt;
            &lt;param-name&gt;encoding&lt;/param-name&gt;
            &lt;param-value&gt;UTF-8&lt;/param-value&gt;
        &lt;/init-param&gt;
    &lt;/filter&gt;    
    &lt;!-- 필터가 모든 요청(/*)에 대해 동작하도록 설정 --&gt;
    &lt;filter-mapping&gt;
        &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;
        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;
&lt;/web-app&gt;</code></pre><ul>
<li><strong>Root Spring Container</strong><ul>
<li>context-param : Spring의 루트 애플리케이션 컨텍스트를 지정</li>
<li>listener : ContextLoaderListener를 통해 루트 컨텍스트를 로드</li>
</ul>
</li>
<li><strong>DispatcherServlet</strong><ul>
<li>Spring MVC의 DispatcherServlet을 설정하고, 해당 서블릿이 사용할 컨텍스트 파일 경로를 지정합니다.</li>
<li>servlet : 서블릿 이름(appServlet)과 서블릿 초기화 파라미터를 정의</li>
<li>servlet-mapping : DispatcherServlet이 처리할 URL 패턴(/)을 지정</li>
</ul>
</li>
<li><strong>CharacterEncodingFilter</strong><ul>
<li>filter : CharacterEncodingFilter를 통해 POST 요청 시 UTF-8로 인코딩</li>
<li>filter-mapping : 필터가 모든 요청(/*)에 대해 동작하도록 설정</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>&lt;application.properties&gt;</strong></p>
</blockquote>
<pre><code># CharacterEncodingFilter
spring.web.encoding.charset=UTF-8
spring.web.encoding.enabled=true
spring.web.encoding.force=true</code></pre><ul>
<li><strong>Root Spring Container</strong><ul>
<li>UTF-8인코딩 설정 추가해줌</li>
</ul>
</li>
<li><strong>DispatcherServlet / CharacterEncodingFilter</strong><ul>
<li>DispatcherServlet  : 자동으로 설정해줌</li>
<li>CharacterEncodingFilter : 기본적으로 지원함</li>
</ul>
</li>
</ul>
<h3 id="2-root-contextxml">2) root-context.xml</h3>
<blockquote>
<p><strong>&lt;root-context.xml&gt;</strong></p>
</blockquote>
<pre><code class="language-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:mybatis-spring=&quot;http://mybatis.org/schema/mybatis-spring&quot;
    xmlns:tx=&quot;http://www.springframework.org/schema/tx&quot;
    xsi:schemaLocation=&quot;http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
        http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd&quot;&gt;
    &lt;!-- Root Context: defines shared resources visible to all other web components --&gt;
    &lt;!-- HikariCP 라이브러리 사용을 위한 설정(커넥션풀 설정) --&gt;
    &lt;!-- 1. HikariCP 를 활용한 DB 접속 정보 설정 위해 HikariConfig 객체 설정(JDBC 기본 설정) --&gt;
    &lt;!-- com.zaxxer.hikari 패키지의 HikariConfig 클래스 지정 및 속성 설정 --&gt;
    &lt;!-- &lt;bean id=&quot;hikariConfig&quot; class=&quot;com.zaxxer.hikari.HikariConfig&quot;&gt; --&gt;
    &lt;!-- &lt;property name=&quot;driverClassName&quot; value=&quot;com.mysql.cj.jdbc.Driver&quot;&gt;&lt;/property&gt; --&gt;
    &lt;!-- &lt;property name=&quot;jdbcUrl&quot; value=&quot;jdbc:mysql://localhost:3306/study_spring5&quot;&gt;&lt;/property&gt; --&gt;
    &lt;!-- &lt;property name=&quot;username&quot; value=&quot;root&quot;&gt;&lt;/property&gt; --&gt;
    &lt;!-- &lt;property name=&quot;password&quot; value=&quot;1234&quot;&gt;&lt;/property&gt; --&gt;
    &lt;!-- &lt;/bean&gt; --&gt;
    &lt;!-- SQL 로그를 위한 log4jdbc 라이브러리 관련 DBCP 정보 변경(driverClassName, jdbcUrl 속성만 
        변경) --&gt;
    &lt;bean id=&quot;hikariConfig&quot; class=&quot;com.zaxxer.hikari.HikariConfig&quot;&gt;
        &lt;property name=&quot;driverClassName&quot;
            value=&quot;net.sf.log4jdbc.sql.jdbcapi.DriverSpy&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;jdbcUrl&quot;
            value=&quot;jdbc:log4jdbc:mysql://itwillbs.com:3306/c5d2308t2&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;username&quot; value=&quot;c5d2308t2&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;password&quot; value=&quot;1234&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;
    &lt;!-- 2. HikariCP 를 통해 커넥션을 관리하는 DataSource 객체(HikariDataSource) 설정 --&gt;
    &lt;!-- 생성자 파라미터(&lt;constructor-arg ref=&quot;&quot;&gt;)로 1번에서 생성한 HikariConfig 객체 전달 --&gt;
    &lt;!-- 주의! 1단계에서 입력한 정보가 일치하지 않을 경우 서버 실행 시점에 현재 단계에서 예외 발생 --&gt;
    &lt;bean id=&quot;dataSource&quot; class=&quot;com.zaxxer.hikari.HikariDataSource&quot;&gt;
        &lt;constructor-arg ref=&quot;hikariConfig&quot;&gt;&lt;/constructor-arg&gt;
    &lt;/bean&gt;
    &lt;!-- 3. Connection 객체 생성, 쿼리 전달 및 결과 리턴 등의 작업을 수행할 SQLSessionFactory 객체 
        설정 --&gt;
    &lt;!-- MyBatis - Spring 연결을 담당하며, 내부적으로 SQLSession 객체를 통해 작업 수행 --&gt;
    &lt;!-- 주의! 1) 이전에 이미 DataSource 객체 설정이 완료되어 있어야 함 2) &lt;bean&gt; 태그의 id 값, class 
        값은 고정 3) &lt;property&gt; 태그의 name 속성의 dataSource, configLocation, mapperLocations 
        이름 고정 4) dataSource 속성의 ref 속성값은 2번에서 설정한 id 속성값 사용 5) configLocation, mapperLocations 
        속성(항목)에 지정된 각각의 파일(xml)이 실제 위치에 생성되어 있어야 함 (설정 항목 중 classpath 가 가리키는 기본 위치 
        : src/main/resources 패키지) --&gt;
    &lt;bean id=&quot;sqlSessionFactory&quot;
        class=&quot;org.mybatis.spring.SqlSessionFactoryBean&quot;&gt;
        &lt;property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;configLocation&quot;
            value=&quot;classpath:/mybatis-config.xml&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;mapperLocations&quot;
            value=&quot;classpath:/com/table/zzimkong/mapper/*Mapper.xml&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;
    &lt;!-- &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; 트랜잭션 설정 추가 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; --&gt;
    &lt;!-- 내부 property 태그에 2번에서 설정한 datasource 객체지정 --&gt;
    &lt;bean id=&quot;transactionManager&quot; class=&quot;org.springframework.jdbc.datasource.DataSourceTransactionManager&quot;&gt;
        &lt;property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;
    &lt;!--  tx:anotation-driven 태그를 통해 생성한 트랜잭션 관리 객체 지정 --&gt;
    &lt;tx:annotation-driven transaction-manager=&quot;transactionManager&quot;/&gt;
    &lt;!-- 4. MyBatis 연동에 사용될 객체(클래스)들의 패키지 위치 지정(기본 루트 패키지 지정) --&gt;
    &lt;mybatis-spring:scan
        base-package=&quot;com.table.zzimkong&quot; /&gt;
&lt;/beans&gt;</code></pre>
<blockquote>
<p><strong>&lt;application.properties&gt;</strong></p>
</blockquote>
<pre><code># HikariConfig
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:mysql://itwillbs.com:3306/c5d2308t2
spring.datasource.username=c5d2308t2
spring.datasource.password=1234
# DataSource
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
# SqlSessionFactory Bean
mybatis.config-location=classpath:/mybatis-config.xml
mybatis.mapper-locations=classpath:/com/table/zzimkong/mapper/*Mapper.xml</code></pre><ul>
<li><strong>Transaction Manager</strong><ul>
<li>SpringBoot에서 기본적으로 제공된다.</li>
</ul>
</li>
</ul>
<h3 id="3-servlet-contextxml">3) servlet-context.xml</h3>
<blockquote>
<p><strong>&lt;servlet-context.xml&gt;</strong></p>
</blockquote>
<pre><code class="language-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/mvc&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xmlns:tx=&quot;http://www.springframework.org/schema/tx&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd&quot;&gt;
    &lt;!-- DispatcherServlet Context: defines this servlet&#39;s request-processing infrastructure --&gt;    
    &lt;!-- Enables the Spring MVC @Controller programming model --&gt;
    &lt;annotation-driven /&gt;
    &lt;tx:annotation-driven/&gt;
    &lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&gt;
    &lt;resources mapping=&quot;/resources/**&quot; location=&quot;/resources/&quot; /&gt;
    &lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&gt;
    &lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt;
        &lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&gt;
        &lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&gt;
    &lt;/beans:bean&gt;
        &lt;!-- 폼에 파일 업로드 위해서 설정하면 그거 자동을 처리해주는놈 아이디값은 약속된거 써야됨--&gt;
    &lt;beans:bean id=&quot;multipartResolver&quot; class=&quot;org.springframework.web.multipart.commons.CommonsMultipartResolver&quot;&gt;
        &lt;beans:property name=&quot;maxUploadSize&quot; value=&quot;10485760&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;defaultEncoding&quot; value=&quot;UTF-8&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;
    &lt;context:component-scan base-package=&quot;com.table.zzimkong&quot; /&gt;
&lt;/beans:beans&gt;</code></pre>
<blockquote>
<p><strong>&lt;application.properties&gt;</strong></p>
</blockquote>
<pre><code># View Resolver
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
# Multipart Resolver
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.default-encoding=UTF-8</code></pre><ul>
<li><strong>Annotation-driven / tx:annotation-driven</strong><ul>
<li>SpringBoot에서 자동으로 활성화 된다.</li>
</ul>
</li>
<li><strong>resources mapping</strong><ul>
<li>SpringBoot에서 기본적으로 제공 된다.</li>
</ul>
</li>
<li><strong>context:component-scan</strong><ul>
<li>@SpringBootApplication을 통해 자동으로 처리된다.</li>
</ul>
</li>
</ul>
<h2 id="기본적인-설정파일은-모두-수정되었다-refresh-gradle-project를-실행해보면-오류는-생기지-않는다-다음은-boot-dashboar에서-실행했을-때-생기는-오류를-수정해볼-생각이다">기본적인 설정파일은 모두 수정되었다. refresh gradle project를 실행해보면 오류는 생기지 않는다. 다음은 boot Dashboar에서 실행했을 때 생기는 오류를 수정해볼 생각이다.</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring Framework를 SpringBoot로 마이그레이션 하기 - 1]]></title>
            <link>https://velog.io/@comete_yoon/Spring-Framework%EB%A5%BC-SpringBoot%EB%A1%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-%ED%95%98%EA%B8%B0-1</link>
            <guid>https://velog.io/@comete_yoon/Spring-Framework%EB%A5%BC-SpringBoot%EB%A1%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-%ED%95%98%EA%B8%B0-1</guid>
            <pubDate>Sun, 05 Jan 2025 10:52:08 GMT</pubDate>
            <description><![CDATA[<p><del>참고만 하세요. 과정 기록용입니다.</del></p>
<h1 id="1-프로젝트-생성하고-파일-옮기기">1. 프로젝트 생성하고 파일 옮기기</h1>
<p>Spring Framework는 git을 이용해 협업하여 프로젝트를 만들었지만 새로 배운 기능을 추가해 더 완성도를 높이고 싶어 팀장의 리포지토리에서 파일을 다운받아 사용했다. 혹시나 모를 오류에서 원본을 보호하려는 마음도 있다.
SpringBoot로 마이그레이션에 성공한다면 새로운 리포지토리로 만들어 기능을 추가할 예정이다.</p>
<h4 id="1-spring-starter-project로-프로젝트를-생성해준다">1. Spring Starter Project로 프로젝트를 생성해준다.</h4>
<p><img src="https://velog.velcdn.com/images/comete_yoon/post/9dbf495c-3c3e-4ded-b5e6-8b54a63f15ca/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/comete_yoon/post/7a21cf81-e905-435d-8224-d3cc030783d5/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/comete_yoon/post/a527866b-41f0-4289-8cd7-9b16ba5d3acc/image.png" alt=""></p>
<ul>
<li>Spring Framework에서 사용했던 의존성과 내가 새로 추가할 기능의 의존성을 선택해준다.</li>
<li>여기에 없는건 일단 Spring Framework의 pom.xml파일에서 찾아서 따로 추가해줄 예정이다.</li>
</ul>
<h4 id="2-의존성-추가해주기">2. 의존성 추가해주기</h4>
<p><strong>Spring Framework의 pom.xml파일에서 따로 추가해준 dependency만 SpringBoot의 build.gradle에 맞게 변환해 추가하는 작업이다.</strong></p>
<p><strong>Spring의 pom.xml 파일에서 dependency태그 안에서 artifactId태그의 내용을 복사해준다.</strong></p>
<p><img src="https://velog.velcdn.com/images/comete_yoon/post/0d26d3e4-02ab-4e27-994b-9e1a788c4e57/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/comete_yoon/post/7b5411a0-a085-4207-9cb0-35db251f17ac/image.png" alt=""></p>
<p><a href="https://mvnrepository.com/">Maven Repository</a>에서 복사한 내용을 검색해준다.</p>
<p><img src="https://velog.velcdn.com/images/comete_yoon/post/518f6fc4-3130-4370-94bb-19f3b35cfb7b/image.png" alt=""></p>
<p><strong>dependency 태그아래에서 해당 버전을 확인하고 MVN repository에서 해당 버전을 클릭해준다.</strong></p>
<p><img src="https://velog.velcdn.com/images/comete_yoon/post/bb7dc1bd-45fb-4074-a7d5-db3f3e11441e/image.png" alt=""></p>
<ul>
<li>사용한 Spring Framework 버전은 5.3.31 이다. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/comete_yoon/post/389941aa-3382-4058-859a-94f06e31cbb8/image.png" alt="">
<img src="https://velog.velcdn.com/images/comete_yoon/post/789bd8df-58d1-4b0c-90db-254c6be46939/image.png" alt=""></p>
<p><strong>해당 버전으로 들어가면 maven 코드와 gradle 코드를 확인 할 수 있다.
gradle 코드를 복사해준다.(저는 short를 사용했습니다.)</strong></p>
<p><img src="https://velog.velcdn.com/images/comete_yoon/post/8af3b97e-208e-4ce7-bd0d-b32b8aabad95/image.png" alt=""></p>
<ul>
<li>gradle코드</li>
</ul>
<p><img src="https://velog.velcdn.com/images/comete_yoon/post/07226711-9d28-4ee6-a1aa-82d37379a31b/image.png" alt=""></p>
<ul>
<li>maven코드</li>
</ul>
<p><strong>해당 코드를 SpringBoot build.gradle파일에 붙여넣어 준다.</strong>
<img src="https://velog.velcdn.com/images/comete_yoon/post/e29ddff5-fdea-4409-8c4d-cb468b841733/image.png" alt=""></p>
<ul>
<li>여기선 내가 원하는 코드는 SpringBoot의 코드이고 Spring Framework의 코드를 가지고 왔기때문에 일단 주석처리해주었다.</li>
<li>혹시나 SpringBoot의 프로젝트 생성시 추가했던 dependency와 중복을 염려해 확인해본 결과 Spring web 과 Spring websocket 두가지가 context에 포함되어 있었다. </li>
<li>SpringBoot 프로젝트로 마이그레이션이 목표이기에 Spring Framework의 dependency를 주석처리 해주었다.</li>
</ul>
<p><strong>이런식으로 중복을 확인해주면서 pom.xml에서 따로 추가해준 dependency를 build.gradle파일에 모두 추가해주었다.</strong></p>
<h3 id="중간에-오류가-너무-많이-나서-다른-방법으로-새로-시도해보기로-했다">중간에 오류가 너무 많이 나서 다른 방법으로 새로 시도해보기로 했다.</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[Oracle 21c Docker에 설치하기]]></title>
            <link>https://velog.io/@comete_yoon/Oracle-21c-Docker%EC%97%90-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@comete_yoon/Oracle-21c-Docker%EC%97%90-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 05 Jan 2025 06:42:31 GMT</pubDate>
            <description><![CDATA[<p> JPA수업시간에 페이징을 배우는 중 Oracle11c 이하에서는 OFFSET과 FETCH FIRST 절을 사용할 수 없었고 버전으로 인한 오류가 발생하였다.
 게시판을 조회하면서 생긴 오류이다.<img src="https://velog.velcdn.com/images/comete_yoon/post/be27efd6-bc9a-41a3-afcd-d8a080f4f2c8/image.png" alt=""></p>
<blockquote>
<p>해당 프로젝트를 실행하면서 오류 전 경고가 떴었다.<img src="https://velog.velcdn.com/images/comete_yoon/post/77ff81bd-2235-4bd6-8ca3-e5edf234aeb3/image.png" alt=""></p>
</blockquote>
<p>비교적 크기가 작은 11c를 도커로 사용 중이였다. springBoot에서 properties를 추가, 수정도 해보았지만 다른 버전들과의 충돌로 가장 간단하게 Oracle을 21버전으로 새로 설치하기로 했다.</p>
<p> 처음엔 docker Hub에서 이미지를 받았지만 계정 로그인에서 계속 문제가 생겨 참고하게된 블로그이다. </p>
<p> 참고한 블로그 : <a href="https://taisou.tistory.com/898">https://taisou.tistory.com/898</a></p>
<blockquote>
<pre><code>$ docker pull container-registry.oracle.com/database/express:latest</code></pre></blockquote>
<pre><code>![](https://velog.velcdn.com/images/comete_yoon/post/8160254f-bd0a-49da-95cd-c813f22f9d64/image.png)
- Oracle공식 레포지터리에서 최신 이미지를 받았다.


&gt;```
$ docker run -d --name oracle21 --restart=unless-stopped -p 1521:1521 -e ORACLE_PWD=1234 container-registry.oracle.com/database/express:latest</code></pre><p><img src="https://velog.velcdn.com/images/comete_yoon/post/7fc873f9-b90a-4ca8-815e-5f89f097b85a/image.png" alt=""></p>
<ul>
<li>run : 컨테이너 실행(없으면 생성 후 실행)</li>
<li>-d : 컨테이너를 백그라운드(데몬) 모드로 실행</li>
<li>--name : 컨테이너명</li>
<li>--restart=unless-stopped : 컨테이너가 중지되거나 Docker 데몬이 재시작되더라도 컨테이너를 다시 시작할 수 있게 해준다.</li>
<li>-p 1521:1521
: 호스트의 포트 1521을 컨테이너의 포트 1521에 매핑한다. Oracle 데이터베이스의 기본 포트가 1521이므로, 이 설정을 통해 호스트 시스템에서 Oracle 데이터베이스에 접근할 수 있다.<ul>
<li>-e ORACLE_PASSWORD=비밀번호: 환경 변수를 설정합니다. 여기서는 Oracle 데이터베이스의 관리자 비밀번호를 사용자가 입력한 비밀번호로 설정한다.</li>
</ul>
</li>
</ul>
<p>설치는 여기서 끝났다. 
다음은 터미널에서 오라클에 접속하는 방법이다.</p>
<blockquote>
<pre><code>$ docker exec -it 컨데이너id(3자리) bash</code></pre></blockquote>
<pre><code></code></pre><p>$ docker sqlplus</p>
<pre><code>![](https://velog.velcdn.com/images/comete_yoon/post/3e50d959-d416-4449-8290-150735dfc25f/image.png)![](https://velog.velcdn.com/images/comete_yoon/post/992eaebf-2dbf-4ac1-b6ec-abae954a69cb/image.png)
- 접속 후 id로 system과 처음 컨테이너 생성시 입력했던 password를 입력하면 된다.(password는 입력해도 보이지 않는다.)

오라클 설치는 여기서 끝났다. 
Docker 로 새로 오라클을 설치했고 11버전의 오라클은 컨테이너 접속이 정지되었기 때문에 사용할 수 없다. 지금은 새로운 21버전의 오라클의 컨테이너가 실행중인 상황이다. 
이때 스프링에서 프로젝트를 실행하면 프로젝트와 연결된 DB가 없기 때문에 오류가 생긴다. (properties에 저장된 DB의 username,password가 모두 틀렸다고 오류가 난다.)
오라클에 접속하여 해당 데이터를 다시 만들어주고(프로젝트에서 설정해준 username과 password를 똑같이 설정해야 한다.) 실행하면 된다.

springBoot프로젝트를 실행해보면 정상적으로 실행되는 것을 확인할 수 있다!!!!
![](https://velog.velcdn.com/images/comete_yoon/post/1e3b5c68-5325-42e3-bb75-4646034fcfb3/image.png)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[.java를 AWS EC2 서버에서 컴파일하기]]></title>
            <link>https://velog.io/@comete_yoon/.java%EB%A5%BC-AWS-EC2-%EC%84%9C%EB%B2%84%EC%97%90%EC%84%9C-%EC%BB%B4%ED%8C%8C%EC%9D%BC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@comete_yoon/.java%EB%A5%BC-AWS-EC2-%EC%84%9C%EB%B2%84%EC%97%90%EC%84%9C-%EC%BB%B4%ED%8C%8C%EC%9D%BC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 31 Dec 2024 02:18:05 GMT</pubDate>
            <description><![CDATA[<h1 id="1-java로-로또번호-생성하기">1. java로 로또번호 생성하기</h1>
<h2 id="1-배열을-생성하고-정렬을-사용하여-로또번호-생성">1). 배열을 생성하고 정렬을 사용하여 로또번호 생성</h2>
<pre><code class="language-java">
package lotto;

import java.util.Arrays;
import java.util.Random;

public class QuLottoArray {

    public static void main(String[] args) {

        // 배열생성
        int[] lottoNum = new int[6];

        Random ran = new Random();

        // 난수생성 후 배열에 넣기
        for(int i=0; i&lt;6;) {

            int num = ran.nextInt(45) + 1;

            // 중복을 확인하는 메서드 호출
            if(!isDuplicate(num, lottoNum)) {
                lottoNum[i] = num;
                i++;
            }

        }

        // 배열 오름차순 정렬
        Arrays.sort(lottoNum);


        // 로또 번호 출력
        System.out.print(&quot;로또 번호 : &quot;);
        for(int num : lottoNum) {
            System.out.print(num + &quot; &quot;);
        }

    }//main

    // 중복을 확인하는 메서드
    private static boolean isDuplicate(int num, int[] lottoNum) {
        for(int i : lottoNum) {
            if(i == num) {
                return true;                
            }
        }
        return false;

    }// 듀플메서드


}//class
</code></pre>
<h2 id="2-treeset을-이용하여-로또번호-생성">2). TreeSet&lt;&gt;을 이용하여 로또번호 생성</h2>
<pre><code class="language-java">package lotto;

import java.util.Random;
import java.util.Set;
import java.util.TreeSet;

public class QuLottoCollection {

    public static void main(String[] args) {

        Random ran = new Random();

        Set&lt;Integer&gt; lottoNum = new TreeSet&lt;&gt;();


        for(int i=0; lottoNum.size()&lt;6; i++) {
            //난수 생성
            int num = ran.nextInt(45) + 1;
            //set에 난수 추가
            lottoNum.add(num);
        }

        // 로또 번호 출력
        System.out.print(&quot;로또번호 : &quot;);
        System.out.print(lottoNum);

    }

}</code></pre>
<h2 id="3-java-파일을-도커이미지로-만들기">3). java 파일을 도커이미지로 만들기</h2>
<p> 폴더를 생성하고 자바파일과 Dockerfile을 생성하여 도커에 이미지를 빌드해주었다.
이 과정도 시행착오가 많았는데 spring boot로 도커 이미지를 생성을 연습해보다 매번 자바파일만으로 아마존 서버에서 컴파일 해야한다고 생각하니 어떻게 jdk를 파일과 함께 이미지로 빌드하는가의 고민이 있었다. </p>
<p> 처음에는 Dockerfile을 만들때 java파일을 복제하면서 jdk를 같이 빌드 해주었다.</p>
<pre><code class="language-Dockerfile">FROM openjdk:17-jdk

COPY *.java /Lotto_docker/

ENTRYPOINT [&quot;/bin/bash&quot;, &quot;-c&quot;, &quot;sleep 500&quot;]</code></pre>
<p>Docker Hub에서 내가 push한 이미지를 아마존 서버로 pull하면 되었다.
또다른 방법으로는 AWS 사이트에서 IAM을 생성하고 ECR에서 프라이빗 리포지토리를 생성해서 AWS ECR에 push 하고 아마존 인스턴스에서 우분투를 켜고 pull하면 자바파일이 아마존 서버 이미지에 복제되었다.</p>
<h2 id="4-aws-ec2에-올려-컴파일-하기">4). AWS EC2에 올려 컴파일 하기</h2>
<p>아마존 서버에서 pull한 도커이미지 폴더에서 java 컴파일을 시도 했지만 성공하지 못했고 
결국 아마존 우분투 서버에 jdk 17을 설치하고 java파일을 서버로 복사하기로 했다.</p>
<p>jdk를 설치하는 명령어이다.</p>
<pre><code>$ sudo apt update
$ sudo apt install openjdk-버전-jdk
$ sudo java -version</code></pre><h3 id="4-1-인스턴스를-생성할-때-자동으로-다운-밨았던-키파일pem이-있는-디렉토리에서-터미널을-열고-명령어를-입력한다">4-1). 인스턴스를 생성할 때 자동으로 다운 밨았던 키파일(.pem)이 있는 디렉토리에서 터미널을 열고 명령어를 입력한다.</h3>
<pre><code>$ scp -i &lt;~/경로/key-pair.pem&gt; &lt;경로/파일명&gt; &lt;운영체제사용자이름&gt;@&lt;퍼블릭 ip 주소&gt;:&lt;파일을 복사해서 넣을 폴더&gt;</code></pre><blockquote>
<ul>
<li>&lt;~/경로/key-pair.pem&gt; : 키 파일의 절대 경로</li>
</ul>
</blockquote>
<ul>
<li>&lt;경로/파일명&gt; :  전송하려는 파일의 경로</li>
<li>&lt;운영체제사용자이름&gt; : AWS에서 사용중인 운영체제에 따라 이름이 다름<pre><code>   &amp;emsp; Amazon Linux - ec2-user
 &amp;emsp; Ubuntu - ubuntu
 &amp;emsp; RHEL - ec2-user
 &amp;emsp; CentOS - centos</code></pre></li>
<li>&lt;퍼블릭ip주소&gt; : 해당 인스턴스에서 찾을 수 있음</li>
<li>&lt;파일을 복사해서 넣을 폴더&gt; : EC2에서 파일을 저장할 디렉토리</li>
</ul>
<p> <em>만약 오류가 난다면 참고(EC2 서버에서 SSH로 접속)</em>
 <em>디렉토리 권한 설정: EC2 사용자가 디렉토리에 쓰기 권한을 가지도록 설정</em></p>
<pre><code> $ sudo chown ec2-user:ec2-user 디렉토리명*</code></pre><h3 id="4-2ec2-서버에서-파일이-생성된것을-확인-후-java-컴파일하기">4-2).EC2 서버에서 파일이 생성된것을 확인 후 java 컴파일하기.</h3>
<h4 id="먼저-해당-파일의-디렉토리에서-컴파일을-실행한다">먼저, 해당 파일의 디렉토리에서 컴파일을 실행한다.</h4>
<pre><code>$ javac 파일명.java</code></pre><pre><code>$ ls</code></pre><p>목록을 불러오면 같은 파일명의 .class 파일이 생성된것을 확인할 수 있다.</p>
<h4 id="두번째-생성된-class-파일을-실행시킨다">두번째 생성된 .class 파일을 실행시킨다.</h4>
<pre><code>$ java 파일명</code></pre><p>앞 명령어는 javac가 아니고 java이다.
.class 확장자는 입력하지 않는다.</p>
<h4 id="또다시-에러">또다시 에러...........</h4>
<p>여기서 정말 힘들었다.. 파일이 실행되지 않고 계속 오류가 났다.
그러다 알게된사실은 <strong><u>java파일에 pakage 선언으로 인한 오류</u></strong>였다.
<strong><u>패키지 선언이 포함되어 있다면 파일을 디렉토리 경로에 따라 저장해야한다.</u></strong></p>
<p>디렉토리명을 붙이고 다시 시도해봤다.</p>
<h4 id="결과는-성공">결과는 성공!!!!</h4>
<pre><code>$ javac 패키지명(디렉토리명)/파일명.java</code></pre><pre><code>$ java 패키지명(디렉토리명)/파일명</code></pre><p><img src="https://velog.velcdn.com/images/s2ong_comete/post/54a4638e-6200-450e-aa62-d024477ada13/image.png" alt=""></p>
<p><del>이렇게 블로그에 올리고 나니 과정이 굉장히 짧아 보이지만 도커 이미지도 몇번을 만들었다 지우고 AWS EC2 서버의 인스턴스도 새로 다시 생성했어야 했다.. 결국 돌아돌아 파일을 전송해 해결했고 자바파일을 실행하는데도 고난이... 다음번엔 과거에 스프링 프레임워크로 진행했던 팀프로젝트를 스프링부트로 바꿔볼 예정이다.</del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[1018 자바 복습기록_Object 2]]></title>
            <link>https://velog.io/@comete_yoon/1018-%EC%9E%90%EB%B0%94-%EB%B3%B5%EC%8A%B5%EA%B8%B0%EB%A1%9DObject-2</link>
            <guid>https://velog.io/@comete_yoon/1018-%EC%9E%90%EB%B0%94-%EB%B3%B5%EC%8A%B5%EA%B8%B0%EB%A1%9DObject-2</guid>
            <pubDate>Mon, 21 Oct 2024 06:32:43 GMT</pubDate>
            <description><![CDATA[<h2 id="2-object">2. Object</h2>
<h3 id="2-object-배열">(2) Object 배열</h3>
<pre><code class="language-java">package lang.object.poly;

public class ObjectPolyExamle2_1 {

    public static void main(String[] args) {
        Dog dog = new Dog();
        Car car = new Car();
        Object object = new Object();

        Object[] objects = {dog, car, object};

        size(objects);
    }

    private static void size(Object[] objects) {
        System.out.println(&quot;전달된 객체의 수는: &quot; + objects.length);
    }
}</code></pre>
<ul>
<li>Object 타입을 사용하여 모든 객체를 담을 수 있는 배열을 만들 수 있다.</li>
<li>size메서드에서 매개변수가 Object타입이기 때문에 모든 객체를 매개변수로 전달 가능하다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[1016 자바 복습기록_Object 1]]></title>
            <link>https://velog.io/@comete_yoon/1016-%EC%9E%90%EB%B0%94-%EB%B3%B5%EC%8A%B5%EA%B8%B0%EB%A1%9DObject-1</link>
            <guid>https://velog.io/@comete_yoon/1016-%EC%9E%90%EB%B0%94-%EB%B3%B5%EC%8A%B5%EA%B8%B0%EB%A1%9DObject-1</guid>
            <pubDate>Wed, 16 Oct 2024 07:32:06 GMT</pubDate>
            <description><![CDATA[<h2 id="1-intellij-jdk-21-설치">1. intelliJ, jdk-21 설치</h2>
<h2 id="2-object">2. Object</h2>
<h4 id="모든-클래스가-object클래스를-상속받는-이유">모든 클래스가 Object클래스를 상속받는 이유</h4>
<ul>
<li>필수적인 기능을 공통된 이름으로 사용하기위함.</li>
<li>객체를 생성할 때 마다 필수적인 기능의 메서드를 반복해 정의할 필요가 없어짐.</li>
</ul>
<h3 id="1-object-다형성의-장단점">(1) Object 다형성의 장단점</h3>
<ul>
<li>모든클래스의 부모클래스(슈퍼클래스)이므로 모든 객체를 참조할 수 있다.</li>
<li>메서드의 매개변수에 Object타입을 사용하면 어떤 객체든지 인자로 전달 할 수있는 장점이 있다.</li>
<li>Object를 통해 전달 받은 객체를 호출할때 Object가 가장 상위에 있는 부모이기 때문에 각 객체에 맞는 다운캐스팅 과정이 필요하다.</li>
</ul>
<pre><code class="language-java">package lang.object.poly;

class Car {
    public void move() {
     System.out.println(&quot;자동차&quot;);
    } 
}</code></pre>
<pre><code class="language-java">package lang.object.poly;

class Dog {
    public void sound() {
     System.out.println(&quot;멍멍&quot;);
    } 
}</code></pre>
<pre><code class="language-java">package lang.object.poly;

public class ObjectPolyExample1 {

 Public static void main(String[] args) {
     Dog dog = new Dog();
    Car car = new Car();
    //Object dog = new Dog(); 로 변경가능
    //Object car = new Car(); 로 변경가능
    // =&gt; 부모는 자식을 담을 수 있기때문.

    action(dog);
    action(car);
 }

 public static void action(Object obj) {
  //obj.sound(); -&gt;컴파일오류, Object에는 sound()가 없다.
  //obj.move(); -&gt;컴파일오류, Object에는 move()가 없다.

  //객체에 맞는 다운캐스팅이 필요하다.
  if (odj instanceof Dog dog) {
       dog.sound();
  } else if (odj instanceof Car car) {
    car.move();
  }
 }
}</code></pre>
<h5 id="실행결과">실행결과</h5>
<p>멍멍
자동차</p>
<blockquote>
</blockquote>
<h4 id="다운캐스팅-복습">다운캐스팅 복습</h4>
<ul>
<li>자식클래스의 레퍼런스가 부모클래스의 인스턴스를 참조하는 것</li>
<li>부모클래스의 인스턴스를 자식클래스 타입으로 형변환하는 것</li>
<li>참조 가능한 영역이 확대됨</li>
<li>자동 형변환이 일어나지 않음 = 명시적(강제) 형변환 필요</li>
<li>강제 형변환을 통해 구문 오류가 해결되더라도 실제 실행 시점에서 오류(실행 오류)가 발생하게 됨
=&gt; 존재하지 않는 영역의 참조 위험성 때문</li>
<li>무조건 다운캐스팅이 성립하는 것이 아니라 반드시 자식객체가 부모타입으로 자동 변환하면 부모타입에 선언된 필드와 메소드만 사용 가능하다는 제약이 있다.</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>