<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: sunj</title>
    <description>The latest articles on DEV Community by sunj (@sunj).</description>
    <link>https://dev.to/sunj</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F973332%2F281e29e4-d934-4eef-bd53-b32883ed79e7.png</url>
      <title>DEV Community: sunj</title>
      <link>https://dev.to/sunj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sunj"/>
    <language>en</language>
    <item>
      <title>테니스 레슨 스케줄링 시스템</title>
      <dc:creator>sunj</dc:creator>
      <pubDate>Wed, 18 Jun 2025 05:41:32 +0000</pubDate>
      <link>https://dev.to/sunj/teniseu-reseun-seukejulring-siseutem-7lm</link>
      <guid>https://dev.to/sunj/teniseu-reseun-seukejulring-siseutem-7lm</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
NestJS 기반의 테니스 레슨 스케줄링 시스템 백엔드 프로젝트를 진행하며 작성한 포트폴리오 요약입니다.

---

## ✅ 프로젝트 개요

- **목표**: 사용자와 코치 간의 테니스 레슨 예약 시스템 개발
- **핵심 기능**:
  - 사용자의 조건 기반 가능한 시간 탐색
  - 요일/시간 반복 예약
  - 코치별 스케줄 분리
- **기술 스택**: NestJS, TypeScript, PostgreSQL, TypeORM

---

## ⚙️ 기술 스택

- **Backend**: TypeScript, NestJS
- **Database**: PostgreSQL
- **ORM**: TypeORM
- **Testing**: Jest
- **DevTools**: ESLint, Prettier
- **기타**: dotenv 환경 설정, seed script

---

## 📡 주요 API 예시

### ✅ 가능한 레슨 시간 조회

- `GET /lesson/possibleList`

```

json
요청:
{
  "name": "김민준",
  "time": 60,
  "number": 2
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
json
응답:
{
  "success": true,
  "data": [
    "2024-04-13 07:00:00",
    "2024-04-13 07:30:00"
  ]
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h2&gt;
  
  
  🧩 ERD 요약
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;User&lt;/code&gt;, &lt;code&gt;Coach&lt;/code&gt;, &lt;code&gt;Lesson&lt;/code&gt;, &lt;code&gt;Schedule&lt;/code&gt;, &lt;code&gt;LessonTime&lt;/code&gt; 등의 엔티티가 관계형으로 연결&lt;/li&gt;
&lt;li&gt;다양한 예약 조건 (요일, 시간, 반복 예약 등)을 처리하기 위한 모델링&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;ERD 시각화는 &lt;a href="https://github.com/Jin5540/lesson/blob/main/docs/ERD.md" rel="noopener noreferrer"&gt;ERD.md (GitHub)&lt;/a&gt; 참고&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧱 서비스 계층 구조
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

[Client]
   ↓
[Controller] → [Service] → [Repository] → [PostgreSQL]


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;NestJS의 계층 기반 아키텍처&lt;/li&gt;
&lt;li&gt;도메인 단위 모듈 구조 (&lt;code&gt;lesson.module.ts&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;DI(의존성 주입) 패턴 중심 설계&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🐛 트러블슈팅 요약
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔄 순환 참조 문제
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Lesson ↔ Schedule&lt;/code&gt; 간 &lt;code&gt;forwardRef()&lt;/code&gt; 미사용 시 NestJS DI 에러&lt;/li&gt;
&lt;li&gt;→ &lt;code&gt;forwardRef()&lt;/code&gt; 사용으로 해결&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⏰ 시간대 불일치
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;DB 저장은 UTC, 클라이언트 응답은 KST로 변환 처리&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧪 테스트 환경 충돌
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;seed script가 실DB 덮어쓰는 문제 발생&lt;/li&gt;
&lt;li&gt;→ &lt;code&gt;.env.test&lt;/code&gt; 환경 구분 및 테스트 전용 설정으로 분리&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💭 회고
&lt;/h2&gt;

&lt;p&gt;NestJS의 구조와 설계 철학을 직접 체험하면서, 단순한 CRUD를 넘어서 예약 로직, 시간 조건 처리, 관계형 DB 모델링 등을 경험할 수 있었습니다. 실무형 프로젝트를 구성하며 기술적 의사결정과 구조 설계 역량을 키울 수 있는 좋은 기회였습니다.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 참고 링크
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🔗 GitHub: &lt;a href="https://github.com/Jin5540/lesson" rel="noopener noreferrer"&gt;https://github.com/Jin5540/lesson&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📄 API 명세서 (Markdown): &lt;a href="https://YOUR_DOMAIN/API.md" rel="noopener noreferrer"&gt;API.md 다운로드&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;📁 프로젝트 문서:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Jin5540/lesson/blob/main/docs/ERD.md" rel="noopener noreferrer"&gt;ERD 정리&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Jin5540/lesson/blob/main/docs/architecture.md" rel="noopener noreferrer"&gt;서비스 아키텍처&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Jin5540/lesson/blob/main/docs/troubleshooting.md" rel="noopener noreferrer"&gt;트러블슈팅 &amp;amp; 회고&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>typescript</category>
      <category>nestjs</category>
      <category>postgressql</category>
    </item>
    <item>
      <title>Redis: AWS EC2에 설치</title>
      <dc:creator>sunj</dc:creator>
      <pubDate>Sat, 05 Apr 2025 07:20:27 +0000</pubDate>
      <link>https://dev.to/sunj/redis-aws-ec2e-seolci-oh0</link>
      <guid>https://dev.to/sunj/redis-aws-ec2e-seolci-oh0</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo dnf update -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo dnf search redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;레디스 패키지 검색&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo dnf install redis6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl restart redis6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl enable redis6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;부팅 시 자동으로 시작하게 설정&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis6-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;레디스 접속&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 확인
ping
# pong이라고 뜸
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;참고 : &lt;a href="https://dangdangee.tistory.com/entry/Redis-ec2%EC%97%90-%EB%A0%88%EB%94%94%EC%8A%A4-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0" rel="noopener noreferrer"&gt;https://dangdangee.tistory.com/entry/Redis-ec2%EC%97%90-%EB%A0%88%EB%94%94%EC%8A%A4-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
    </item>
    <item>
      <title>MySQL : 초기 비밀번호 설정</title>
      <dc:creator>sunj</dc:creator>
      <pubDate>Tue, 01 Apr 2025 01:38:57 +0000</pubDate>
      <link>https://dev.to/sunj/mysql-cogi-bimilbeonho-seoljeong-428c</link>
      <guid>https://dev.to/sunj/mysql-cogi-bimilbeonho-seoljeong-428c</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo grep 'temporary password' /var/log/mysqld.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;초기비밀번호가 나옴&lt;/p&gt;

</description>
      <category>mysql</category>
    </item>
    <item>
      <title>ERROR : AWS ec2 Linux에 mysql 설치</title>
      <dc:creator>sunj</dc:creator>
      <pubDate>Tue, 01 Apr 2025 01:17:01 +0000</pubDate>
      <link>https://dev.to/sunj/error-aws-ec2-linuxe-mysql-seolci-10l2</link>
      <guid>https://dev.to/sunj/error-aws-ec2-linuxe-mysql-seolci-10l2</guid>
      <description>&lt;p&gt;sudo yum -y install mysql-community-server&lt;br&gt;
Last metadata expiration check: 0:06:16 ago on Tue Apr  1 01:01:41 2025.&lt;br&gt;
Error: &lt;br&gt;
 Problem: conflicting requests&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.11-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.11-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.11-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.11-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.12-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.12-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.12-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.12-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.13-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.13-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.13-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.13-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.14-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.14-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.14-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.14-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.15-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.15-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.15-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.15-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.16-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.16-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.16-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.16-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.16-2.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.16-2.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.16-2.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.16-2.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.17-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.17-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.17-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.17-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.18-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.18-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.18-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.18-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.19-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.19-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.19-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.19-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.20-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.20-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.20-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.20-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.21-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.21-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.21-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.21-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.22-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.22-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.22-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.22-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.23-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.23-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.23-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.23-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.24-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.24-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.24-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.24-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.25-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.25-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.25-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.25-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.26-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.26-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.26-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.26-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.27-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.27-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.27-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.27-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.28-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.28-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.28-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.28-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.30-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.30-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.30-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.30-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(OPENSSL_1.0.2)(64bit) needed by mysql-community-server-8.0.30-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.31-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.31-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.31-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.31-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(OPENSSL_1.0.2)(64bit) needed by mysql-community-server-8.0.31-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.32-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.32-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.32-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.32-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(OPENSSL_1.0.2)(64bit) needed by mysql-community-server-8.0.32-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.33-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.33-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.33-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.33-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(OPENSSL_1.0.2)(64bit) needed by mysql-community-server-8.0.33-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.34-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.34-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.34-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.34-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(OPENSSL_1.0.2)(64bit) needed by mysql-community-server-8.0.34-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.35-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.35-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.35-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.35-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(OPENSSL_1.0.2)(64bit) needed by mysql-community-server-8.0.35-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.36-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.36-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.36-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.36-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(OPENSSL_1.0.2)(64bit) needed by mysql-community-server-8.0.36-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.37-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.37-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.37-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.37-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(OPENSSL_1.0.2)(64bit) needed by mysql-community-server-8.0.37-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.39-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.39-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.39-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.39-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(OPENSSL_1.0.2)(64bit) needed by mysql-community-server-8.0.39-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.40-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.40-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.40-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.40-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(OPENSSL_1.0.2)(64bit) needed by mysql-community-server-8.0.40-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.41-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10()(64bit) needed by mysql-community-server-8.0.41-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(libcrypto.so.10)(64bit) needed by mysql-community-server-8.0.41-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libssl.so.10(libssl.so.10)(64bit) needed by mysql-community-server-8.0.41-1.el7.x86_64 from mysql80-community&lt;/li&gt;
&lt;li&gt;nothing provides libcrypto.so.10(OPENSSL_1.0.2)(64bit) needed by mysql-community-server-8.0.41-1.el7.x86_64 from mysql80-community
(try to add '--skip-broken' to skip uninstallable packages)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm

sudo dnf install mysql-community-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;참조 : &lt;a href="https://www.inflearn.com/community/questions/884613/%EB%A6%AC%EB%88%85%EC%8A%A4-mysql-%EC%84%A4%EC%B9%98-%EC%98%A4%EB%A5%98-%EB%9C%A8%EC%8B%9C%EB%8A%94-%EB%B6%84%EB%93%A4?srsltid=AfmBOoqdLRkPTH0Sau_BZdmbGlSmU-REC5iAUWSf6c3qGtAzY4LoAus3" rel="noopener noreferrer"&gt;https://www.inflearn.com/community/questions/884613/%EB%A6%AC%EB%88%85%EC%8A%A4-mysql-%EC%84%A4%EC%B9%98-%EC%98%A4%EB%A5%98-%EB%9C%A8%EC%8B%9C%EB%8A%94-%EB%B6%84%EB%93%A4?srsltid=AfmBOoqdLRkPTH0Sau_BZdmbGlSmU-REC5iAUWSf6c3qGtAzY4LoAus3&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>linux</category>
      <category>mysql</category>
    </item>
    <item>
      <title>java, 시작3</title>
      <dc:creator>sunj</dc:creator>
      <pubDate>Fri, 01 Nov 2024 06:44:55 +0000</pubDate>
      <link>https://dev.to/sunj/java-sijag3-2gb7</link>
      <guid>https://dev.to/sunj/java-sijag3-2gb7</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5g2w34qezp0kw4sustr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5g2w34qezp0kw4sustr.png" alt=" " width="314" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 함&lt;br&gt;
또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요&lt;br&gt;
따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공&lt;/p&gt;

&lt;p&gt;1) 코드(code) 영역&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;메모리의 코드(code) 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역&lt;/li&gt;
&lt;li&gt;CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 됨&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2) 데이터(data) 영역&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;메모리의 데이터(data) 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역입니다.&lt;/li&gt;
&lt;li&gt;데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸합니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3) 스택(stack) 영역&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역&lt;/li&gt;
&lt;li&gt;스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸&lt;/li&gt;
&lt;li&gt;이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)&lt;/li&gt;
&lt;li&gt;푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출&lt;/li&gt;
&lt;li&gt;이러한 스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출&lt;/li&gt;
&lt;li&gt;스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4) 힙(heap) 영역&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있는 영역&lt;/li&gt;
&lt;li&gt;힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제&lt;/li&gt;
&lt;li&gt;힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;5) 스택과 힙의 장단점&lt;/p&gt;

&lt;p&gt;(1) 스택&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;매우 빠른 액세스&lt;/li&gt;
&lt;li&gt;변수를 명시 적으로 할당 해제 할 필요가 없음&lt;/li&gt;
&lt;li&gt;공간은 CPU에 의해 효율적으로 관리되고 메모리는 단편화되지 않음&lt;/li&gt;
&lt;li&gt;지역 변수 만&lt;/li&gt;
&lt;li&gt;스택 크기 제한 (OS에 따라 다름)&lt;/li&gt;
&lt;li&gt;변수의 크기를 조정할 수 없음&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(2) 힙&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;변수는 전역 적으로 액세스 할 수 있음&lt;/li&gt;
&lt;li&gt;메모리 크기 제한 없음&lt;/li&gt;
&lt;li&gt;(상대적으로) 느린 액세스&lt;/li&gt;
&lt;li&gt;효율적인 공간 사용을 보장하지 못하면 메모리 블록이 할당 된 후 시간이 지남에 따라 메모리가 조각화되어 해제 될 수 있음&lt;/li&gt;
&lt;li&gt;메모리를 관리해야 함 (변수를 할당하고 해제하는 책임이 있습니다)&lt;/li&gt;
&lt;li&gt;변수는 C언어 realloc() or 자바 new&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
    </item>
    <item>
      <title>java, singleton</title>
      <dc:creator>sunj</dc:creator>
      <pubDate>Wed, 30 Oct 2024 06:05:25 +0000</pubDate>
      <link>https://dev.to/sunj/java-singleton-4888</link>
      <guid>https://dev.to/sunj/java-singleton-4888</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class HolderSingleton {

    private HolderSingleton() {
    }

    public static HolderSingleton getInstance() {
        return Holder.instance;
    }

    private static class Holder {
        public static final HolderSingleton instance = new HolderSingleton();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Initialization-on-demand holder idiom 방식(holder에 의한 초기화 방식)&lt;/p&gt;

</description>
      <category>java</category>
    </item>
    <item>
      <title>java, 시작2</title>
      <dc:creator>sunj</dc:creator>
      <pubDate>Wed, 30 Oct 2024 02:27:06 +0000</pubDate>
      <link>https://dev.to/sunj/java-sijag2-2dk2</link>
      <guid>https://dev.to/sunj/java-sijag2-2dk2</guid>
      <description>&lt;p&gt;JAVA VIRTUAL MACHINE =&amp;gt; JVM&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OS에 종속되지 않고 CPU가 java를 인식, 실행할 수 있게 가능한 가상 컴퓨터&lt;/li&gt;
&lt;li&gt;바이트코드(.class 파일)를 OS 에 맞는 기계어로 변환하고, 이를 클래스 로더에서 읽어와 메모리 영역에 저장/관리 하고, 이를 실행엔진에서 바이트코드 명령어 단위로 읽어들여 실행하며 가비지 컬렉터로 메모리 관리를 하는 가상 머신&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7egyqu49lwep2u34csi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7egyqu49lwep2u34csi.png" alt=" " width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;가비지&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JVM 메모리의 스택 영역, 네이티브 메서드 영역, 스태틱 영역 모두에서 참조하지 않는 객체&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;가비지 컬렉터&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;효율적인 메모리 관리를 하기 위해 힙 영역에서 가비지를 찾아내고 특정 기준으로 메모리 할당을 해제하기 위해 만들어진 것&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;클래스 로더&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;자바 바이트 코드를 읽어서 JVM의 실행 엔진이 사용할 수 있도록
Runtime Data Area(JVM Memory)의 메서드 영역(Method Area)에 적재하는 역할&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhxl17488hh4pziyk72q5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhxl17488hh4pziyk72q5.png" alt=" " width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;클래스 로더&lt;br&gt;
1) 로딩&lt;br&gt;
.class 파일을 읽어서 바이너리 코드로 만들고 이를 메모리의 메서드 영역(Method Area)에 저장하는 과정&lt;br&gt;
(1) 로드된 클래스를 비롯한 그의 부모 클래스의 정보&lt;br&gt;
(2) 클래스 파일과 Class, Interface, Enum의 관련 여부&lt;br&gt;
(3) 변수나 메소드 등의 정보&lt;/p&gt;

&lt;p&gt;2) 링크&lt;br&gt;
(1) 검증(verify): 읽어 들인 클래스가 자바 언어 명세 및 JVM 명세에 명시된 대로 잘 구성되어 있는지 검사한다.&lt;br&gt;
(2) 준비(perpare): 클래스가 필요로 하는 메모리를 할당하고, 클래스에서 정의된 필드, 메소드, 인터페이스를 나타내는 데이터 구조를 준비한다.&lt;br&gt;
(3) 분석(resolve): 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다.&lt;/p&gt;

&lt;p&gt;3) 초기화&lt;br&gt;
(1) 클래스 변수들(static 변수)을 적절한 값으로 초기화&lt;/p&gt;

&lt;p&gt;부트스트랩 클래스 로더(Bootstrap Class Loader)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JVM 시작 시 가장 최초로 실행되는 클래스 로더
자바 클래스를 로드하는 것이 아닌, 자바 클래스를 로드할 수 있는 자바 자체의 클래스 로더와 최소한의 자바 클래스(java.lang.Object, java.lang.Class, java.lang.ClassLoader, java.util.* 등)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;확장 클래스 로더 (Extension Class Loader)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;확장 클래스 로더는 부트스트랩 클래스 로더를 부모로 갖는 클래스 로더로서, 확장 자바 클래스들을 로드
ava.ext.dirs 환경 변수에 설정된 디렉토리의 클래스 파일을 로드하고, 이 값이 설정되어 있지 않은 경우 ${JAVA_HOME}/jre/lib/ext 에 있는 클래스 파일을 로드&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;애플리케이션 클래스 로더(Application Class Loader)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;자바 프로그램 실행 시 지정한 Classpath에 있는 클래스 파일 혹은 jar에 속한 클래스&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;클래스 로더의 동작 방식&lt;br&gt;
1) JVM의 메소드 영역에 클래스가 로드되어 있는지 확인한다. 만일 로드되어 있는 경우 해당 클래스를 사용한다.&lt;br&gt;
2) 메소드 영역에 클래스가 로드되어 있지 않을 경우, 시스템 클래스 로더에 클래스 로드를 요청한다.&lt;br&gt;
3) 시스템 클래스 로더는 확장 클래스 로더에 요청을 위임한다.&lt;br&gt;
4) 확장 클래스 로더는 부트스트랩 클래스 로더에 요청을 위임한다.&lt;br&gt;
5) 부트스트랩 클래스 로더는 부트스트랩 Classpath(JDK/JRE/LIB)에 해당 클래스가 있는지 확인한다. 클래스가 존재하지 않는 경우 확장 클래스 로더에게 요청을 넘긴다.&lt;br&gt;
6) 확장 클래스 로더는 확장 Classpath(JDK/JRE/LIB/EXT)에 해당 클래스가 있는지 확인한다. 클래스가 존재하지 않을 경우 시스템 클래스 로더에게 요청을 넘긴다.&lt;br&gt;
7) 시스템 클래스 로더는 시스템 Classpath에 해당 클래스가 있는지 확인한다. 클래스가 존재하지 않는 경우 ClassNotFoundException을 발생&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqg93umu7dc3wq005vb7u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqg93umu7dc3wq005vb7u.png" alt=" " width="669" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;클래스 로더의 원칙&lt;br&gt;
1) 위임 원칙&lt;br&gt;
클래스 로더는 클래스 또는 리소스를 찾기 위해 요청을 받았을 때, 상위 클래스 로더에게 책임을 위임하는 위임 모델을 따름&lt;br&gt;
위에서 설명한 클래스 로더 동작 방식을 보면, 위임 법칙을 따른다는 것을 확인&lt;br&gt;
2) 가시 범위 원칙&lt;br&gt;
하위 클래스 로더는 상위 클래스 로더가 로드한 클래스를 볼 수 있지만, 반대로 상위 클래스 로더는 하위 클래스 로더가 로드한 클래스를 알 수 없음&lt;br&gt;
이로 인해 java.lang.Object 클래스 등 상위 클래스 로더에서 로드한 클래스도 하위 클래스 로더인 시스템 클래스 로더 등에서 사용할 수 있음&lt;br&gt;
3) 유일성의 원칙&lt;br&gt;
하위 클래스 로더가 상위 클래스 로더에게 로드한 클래스를 다시 로드하지 않아야 한다는 원칙&lt;br&gt;
위임 원칙에 의해서 위쪽으로 책임을 위임하기 때문에 고유한 클래스를 보장할 수 있음&lt;/p&gt;

</description>
      <category>java</category>
    </item>
    <item>
      <title>java, 시작</title>
      <dc:creator>sunj</dc:creator>
      <pubDate>Wed, 30 Oct 2024 02:24:47 +0000</pubDate>
      <link>https://dev.to/sunj/java-sijag-9mg</link>
      <guid>https://dev.to/sunj/java-sijag-9mg</guid>
      <description>&lt;p&gt;실행 엔진(Execution Engine)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;실행 엔진(Execution Engine)은 메모리에 적재된 클래스(바이트 코드)들을 기계어로 변경하여 명령어(instruction) 단위로 실행&lt;/li&gt;
&lt;li&gt;바이트 코드를 운영체제에 맞게 해석해주는 역할을 수행&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx5iqeoj9x6o6ktxw2anr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx5iqeoj9x6o6ktxw2anr.png" alt=" " width="492" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;자바 컴파일러&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;javac를 통해서 컴파일 됨&lt;/li&gt;
&lt;li&gt;java(&lt;em&gt;.java)파일이 java bytecode(&lt;/em&gt;.class)로 변환 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;바이트 코드&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법&lt;/li&gt;
&lt;li&gt;특정 하드웨어에 대한 의존성을 줄이고, 인터프리팅도 쉬운 결과물을 생성하고자 하는 프로그래밍 언어에 의해, 출력 코드의 한 형태로 사용&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;바이트 코드를 만드는 이유&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;중간 단계를 하나 둬서 간접화를 통해 경우의 수를 낮추고 효율을 높이기 위해 중간 코드를 생성&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;바이트코드에서 기계어로 번역&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;인터프리터를 사용하여 프로그램이 실행 중인 런타임 시 한 줄씩 읽기 때문에 런타임 전 소스코드를 미리 읽어서 기계어로 변환하는 방식의 컴파일러보다는 느림
이런 문제를 개선해 주는 것이 JIT 컴파일러&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;인터프리터&lt;br&gt;
-프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경&lt;/p&gt;

&lt;p&gt;JIT 컴파일러&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Just In Time (제 때) 라는 뜻이며 이는 자바 메서드를 호출할때 의미&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvl7bethiz5b0yleofw4m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvl7bethiz5b0yleofw4m.png" alt=" " width="800" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;컴파일 임계치&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;method entry counter (JVM 내에 있는 메서드가 호출된 횟수)&lt;/li&gt;
&lt;li&gt;back-edge loop counter (메서드가 루프를 빠져나오기까지 돈 횟수)&lt;/li&gt;
&lt;li&gt;카운터의 합계를 확인하고 메서드가 컴파일될 자격이 있는지 결정 &lt;/li&gt;
&lt;li&gt;메서드가 컴파일 될 자격이 있다면 해당 메서드는 컴파일되기 위해 큐에서 대기&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;클라이언트 컴파일러(C1, 컴파일러 1)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;서버 컴파일러보다 먼저 컴파일을 시작한다. &lt;/li&gt;
&lt;li&gt;적극성이 높다고 볼 수 있다.&lt;/li&gt;
&lt;li&gt;최적화를 위한 대기시간이 짧다.&lt;/li&gt;
&lt;li&gt;코드 분석과 컴파일 시간이 서버 컴파일러보다 빠르다.&lt;/li&gt;
&lt;li&gt;메모리도 더 적게 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;하지만 코드실행은 서버가 더 빠르다.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;서버 컴파일러(C2, 컴파일러 2)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;서버 측 엔터프라이즈 Java 애플리케이션과 같은 장기 실행 애플리케이션의 경우 C1으로는 충분하지 않을 수 있다.&lt;/li&gt;
&lt;li&gt;대신 C2와 같은 서버 측 컴파일러를 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;대부분의 서버 측 프로그램은 오랫동안 실행될 것으로 예상되므로&lt;/li&gt;
&lt;li&gt;C2를 활성화하면 단기 실행되는 경량 클라이언트 응용 프로그램보다 더 많은 프로파일링 데이터를 수집 할 수 있다.&lt;/li&gt;
&lt;li&gt;따라서 더 고급 최적화 기술과 알고리즘을 적용 할 수 있다.&lt;/li&gt;
&lt;li&gt;컴파일 전에 많은 정보를 수집하여 최적화에 중점을 둔다.&lt;/li&gt;
&lt;li&gt;서버 컴파일러는 절대로 모든 코드를 컴파일하지 않는다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tiered Compiler ( C1 + C2 )&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;클라이언트와 서버 두 컴파일러의 장점을 조합한 컴파일러이다.&lt;/li&gt;
&lt;li&gt;먼저 클라이언트 컴파일러로 스타트업 시간을 빠르게 하고, 많이 쓰이는 부분을 서버 컴파일러로 재컴파일하는 방식을 사용한다.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-server -xx:+TieredCompilation 옵션으로 사용가능
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu3ffpi332c11gu9pa3ot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu3ffpi332c11gu9pa3ot.png" alt=" " width="772" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
    </item>
    <item>
      <title>java, 환경변수 설정</title>
      <dc:creator>sunj</dc:creator>
      <pubDate>Wed, 30 Oct 2024 01:01:59 +0000</pubDate>
      <link>https://dev.to/sunj/java-hwangyeongbyeonsu-seoljeong-20b7</link>
      <guid>https://dev.to/sunj/java-hwangyeongbyeonsu-seoljeong-20b7</guid>
      <description>&lt;p&gt;JAVA_HOME&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\Program Files\Java\jdk1.8.0_202
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CLASSPATH&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%JAVA_HOME%\lib;.;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Path에 추가&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%JAVA_HOME%\bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;컴파일한 파일이 실행하려고하자&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;java Hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;오류: 기본 클래스 Hello을(를) 찾거나 로드할 수 없습니다.&lt;br&gt;
&lt;br&gt;
 &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;java -classpath . Hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;하면 실행되서 클래스패스에 .을 추가하였음&lt;/p&gt;

&lt;p&gt;+) CLASSPATH를 환경변수로 설정하는 것은 원래부터 좋은 방법이 아니었습니다. 그렇게 하면 시스템 전체의 자바 프로그램이 모두 같은 버전의 라이브러리를 공유해야 하기 때문에 충돌의 문제도 있고 관리하기도 번잡하기 때문입니다.&lt;br&gt;
+) CLASSPATH 환경변수는 자바 클래스로더가 기본적으로 바라보는 경로입니다. 자바를 학습하는 단계에서는 기본 클래스패스를 설정하는게 좋을 순 있으나 애플리케이션을 개발하는 상황에서는 별도의 경로를 지정하는게 올바른 행위입니다. 자바 웹 애플리케이션을 실행할 수 있는 톰캣의 경우 CLASSPATH 환경변수를 무시하고 별도의 경로를 클래스패스로 잡도록 되어있죠.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;참조 : &lt;a href="https://okky.kr/questions/1052543" rel="noopener noreferrer"&gt;https://okky.kr/questions/1052543&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>setting</category>
    </item>
    <item>
      <title>java의 실행순서</title>
      <dc:creator>sunj</dc:creator>
      <pubDate>Tue, 29 Oct 2024 08:01:55 +0000</pubDate>
      <link>https://dev.to/sunj/javayi-silhaengsunseo-1mip</link>
      <guid>https://dev.to/sunj/javayi-silhaengsunseo-1mip</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class hello{
   public static void main(String [] args){
      System.out.println("hello");   
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;hello.java -&amp;gt; (javac hello.java) hello.class -&amp;gt; (jar -cf hello.jar *.class) hello.jar&lt;/p&gt;

&lt;p&gt;컴파일&lt;br&gt;
: 인간이 이해할 수 있게 작성된 소스코드(java, c, php 등)를 CPU가 이해할 수 있는 언어(기계어)로 변환하는 작업&lt;br&gt;
컴파일러&lt;br&gt;
: 이러한 작업을 실행하는 소프트웨어&lt;/p&gt;

</description>
      <category>java</category>
    </item>
    <item>
      <title>jar</title>
      <dc:creator>sunj</dc:creator>
      <pubDate>Tue, 29 Oct 2024 07:39:53 +0000</pubDate>
      <link>https://dev.to/sunj/jar-1582</link>
      <guid>https://dev.to/sunj/jar-1582</guid>
      <description>&lt;p&gt;.zip 파일&lt;br&gt;
하나의 파일 안에 여러 개의 파일이 들어있는 것으로 아카이브라고 함&lt;/p&gt;

&lt;p&gt;.jar 파일&lt;br&gt;
java에서 사용하는 특정 유형의 아카이브 파일이며 단일 파일들은 컴파일된 .class파일&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jar -cf  이름.jar *.class
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;참조 : &lt;a href="https://velog.io/@wpdlzhf159/Java-jar%EB%9E%80" rel="noopener noreferrer"&gt;https://velog.io/@wpdlzhf159/Java-jar%EB%9E%80&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>java</category>
    </item>
    <item>
      <title>css, 높은 특이도 부여</title>
      <dc:creator>sunj</dc:creator>
      <pubDate>Tue, 22 Oct 2024 06:07:58 +0000</pubDate>
      <link>https://dev.to/sunj/css-nopeun-teugido-buyeo-4dp</link>
      <guid>https://dev.to/sunj/css-nopeun-teugido-buyeo-4dp</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  /* 다른 스타일과 충돌 방지를 위해 높은 특이도 부여 */
  z-index: 999;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>css</category>
    </item>
  </channel>
</rss>
