PROJECT
- -
main.js
"use strict";
// Make navbar transparent when it is on the top
const navbar = document.querySelector("#navbar");
const navbarHeight = navbar.getBoundingClientRect().height;//현재 nav 엘레먼트의 높이 가져오기
document.addEventListener("scroll", () => {// 사용자가 페이지를 위아래로 스크롤 할 때
if (window.scrollY > navbarHeight) {//현재 스크롤 픽셀을 반환 현재 스크롤 위치가 엘리먼트의 높이를 넘어가면
navbar.classList.add("navbar--dark");//클래스를 추가
} else {
navbar.classList.remove("navbar--dark");//클래스를 제거
}
});
// Handle scrolling when tapping on the navbar menu
const navbarMenu = document.querySelector(".navbar__menu");
navbarMenu.addEventListener("click", (event) => {//사용자가 동일한 요소 위에서 마우스 버튼을 눌렀다 땔 때
const target = event.target;//현재 이벤트를 발생시킨 대상을 얻기
const link = target.dataset.link;//dataset을 통하여 data-link속성값 가져오기
scrollIntoView(link);//element를 기준으로 스크롤을 이동
});
// Handle click on "contact me" button on home
const homeContactBtn = document.querySelector(".home__contact");
homeContactBtn.addEventListener("click", () => {
scrollIntoView("#contact");
});
// Make home slowly fade to transparent as the window scrolls down
const home = document.querySelector(".home__container");
const homeHeight = home.getBoundingClientRect().height;
document.addEventListener("scroll", () => {
home.style.opacity = 1 - window.scrollY / homeHeight; //home__container영역의 투명도 조절
});
// Change Skill Value Animation
const skills = document.querySelector("#skills");
const skill__value = document.querySelectorAll(".skill__value");
const skillsTop = skills.getBoundingClientRect().top;//요소의 시작 좌표
const skillsBottom = skills.getBoundingClientRect().bottom;//끝 좌표
document.addEventListener("scroll", () => {
console.log(window.scrollY);
if (window.scrollY < skillsTop - 150 || window.scrollY > skillsBottom - 50) {
for (var i = 0; i < skill__value.length; i++) {
skill__value[i].classList.add("skill_defaultValue");
//스킬 그래프를 다시 제자리로
}
} else {
for (i = 0; i < skill__value.length; i++) {
skill__value[i].classList.remove("skill_defaultValue");
}
}
//home__container영역의 투명도 조절
});
// Show "arrow up" button when scrolling down
const arrowUp = document.querySelector("#arrow-up-btn");
document.addEventListener("scroll", () => {
if (window.scrollY > homeHeight / 2) {//스크롤 자표값이 home section height의 절반을 넘어가면
arrowUp.classList.add("visible");
} else {
arrowUp.classList.remove("visible");
}
});
// Handle click on the "arrow up" button
arrowUp.addEventListener("click", () => {
scrollIntoView("#home");
});
// Projects
const workBtnContainer = document.querySelector(".work__categories");//카테고리 버튼
const projectContainer = document.querySelector(".work__projects");//이미지 부모 div 태그
const projects = document.querySelectorAll(".project");//이미지 a 태그
workBtnContainer.addEventListener("click", (e) => {
const filter = e.target.dataset.filter || e.target.parentNode.dataset.filter;
//숫자를 표시하는 span태그를 누를시 데이터셋 속성이 존재하지 않기에 부모 요소(카테고리 버튼)의 데이터셋 속성을 가져옴
if (filter == null) {
// data 없으면 아무 일도 안일어나도록
//카테고리 버튼과 카운트 span태그를 제외한 공간을 누를시 예외처리를 하기 위해 조건문 삽입
return;
}
//이벤트를 발생시킨 요소를 나타내는 target 프로퍼티로 해당 요소의 데이토 속성값을 가져온다
// 버튼을 누르면 해당하는 리스트 출력
const active = document.querySelector(".category__btn.selected");
active.classList.remove("selected");//선택된 버튼 css 제거
const target = e.target.nodeName === "BUTTON" ? e.target : e.target.parentNode;
//현재 클릭 이벤트 발생시킨 요소가 버튼이아닌 카운트 숫자를 표시하는 span태그 누를시 상위 요소인 버튼 태그를 target에 지정
target.classList.add("selected");//선택된 버튼 css 추가
projectContainer.classList.add("anim-out");
//anim-out => 40%투명도와 y축으로 40px이동
setTimeout(() => {
projects.forEach((project) => {
if (filter === "*" || filter === project.dataset.type) {
// 전체 or data-filter(tab btn) 값이 project data 값과 같으면,
project.classList.remove("invisible");
} else {
project.classList.add("invisible");//display none
}
});
projectContainer.classList.remove("anim-out");
}, 300);//0.3초 후 실행
})
;
function scrollIntoView(selector) {
const scrollTo = document.querySelector(selector);
scrollTo.scrollIntoView({behavior: "smooth"});//smooth => 스크롤 이동 방식
}
port.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>My portfolio</title>
<!-- <link rel="icon" type="image/png"-->
<!-- href="../../Downloads/portfolio-website-main/portfolio-website-main/imgs/seedling-solid.svg"/>-->
<!-- <link-->
<!-- rel="stylesheet"-->
<!-- href="w"-->
<!-- integrity="sha384-DyZ88mC6Up2uqS4h/KRgHuoeGwBcD4Ng9SiP4dIRy0EXTlnuz47vAwmeGwVChigm"-->
<!-- crossorigin="anonymous"-->
<!-- />-->
<!-- <script src="https://kit.fontawesome.com/36e2eaaec8.js" crossorigin="anonymous"></script>-->
<link rel="preconnect" href="https://fonts.googleapis.com"/>
<!-- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin/>-->
<link
href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,600;0,700;1,400&display=swap"
rel="stylesheet"
/>
<link rel="stylesheet" href="css/port.css"/>
</head>
<body>
<!-- Navbar -->
<nav id="navbar">
<div class="navbar__logo">
<a href="#">MKC</a>
</div>
<ul class="navbar__menu">
<li class="navbar__menu__item" data-link="#home">Home</li>
<li class="navbar__menu__item" data-link="#about">About</li>
<li class="navbar__menu__item" data-link="#skills">Skills</li>
<li class="navbar__menu__item" data-link="#work">My work</li>
<li class="navbar__menu__item" data-link="#contact">Contact</li>
</ul>
<!-- Toggle button-->
<!-- <button class="navbar__toggle-btn"><i class="fas fa-bars"></i></button>-->
</nav>
<!-- Home -->
<section id="home">
<div class="home__container">
<!-- <img src="img/me.jpg" alt="profile" class="home__avatar"/>-->
<h1 class="home__title typing">Hello, <br/>I'm </h1>
<h2 class="home__description typing">
MaKiChang
</h2>
<button class="home__contact">Contact Me</button>
</div>
</section>
<!-- About -->
<section id="about" class="section section__container">
<h1>About me</h1>
<p>Tech Stack</p>
<div>
<DIV class="about__majors">
<div class="major">
<div class="major__icon">
<i class="fa-brands fa-html5"></i>
</div>
<div class="major__title">HTML</div>
</div>
<div class="major">
<div class="major__icon">
<i class="fa-brands fa-css3-alt"></i>
</div>
<div class="major__title">CSS</div>
</div>
<div class="major">
<div class="major__icon">
<i class="fa-brands fa-js"></i>
</div>
<div class="major__title">JS</div>
</div>
</DIV>
<DIV class="about__majors">
<div class="major">
<div class="major__icon">
<i class="fab fa-react"></i>
</div>
<div class="major__title">React</div>
</div>
<div class="major">
<div class="major__icon">
<i class="fab fa-java"></i>
</div>
<div class="major__title">Java</div>
</div>
<div class="major">
<div class="major__icon">
<i class="fa-solid fa-database"></i>
</div>
<div class="major__title">DB</div>
</div>
</DIV>
</div>
</section>
<!-- Skills -->
<section class="section" id="skills">
<div class="section__container">
<h1>Skills</h1>
<h2>Skills & Attributes</h2>
<p></p>
<div class="skillset">
<div class="skillset__left">
<h3 class="skillset__title">Skills</h3>
<div class="skill">
<div class="skill_description">
<span>HTML</span>
<span>80%</span>
</div>
<div class="skill__bar">
<div class="skill__value skill_defaultValue" style="width: 80%"></div>
</div>
</div>
<div class="skill">
<div class="skill_description">
<span>CSS</span>
<span>70%</span>
</div>
<div class="skill__bar">
<div class="skill__value skill_defaultValue" style="width: 70%"></div>
</div>
</div>
<div class="skill">
<div class="skill_description">
<span>JS</span>
<span>70%</span>
</div>
<div class="skill__bar">
<div class="skill__value skill_defaultValue" style="width: 70%"></div>
</div>
</div>
<div class="skill">
<div class="skill_description">
<span>React</span>
<span>0%</span>
</div>
<div class="skill__bar">
<div class="skill__value" style="width: 0%"></div>
</div>
</div>
<div class="skill">
<div class="skill_description">
<span>DB</span>
<span>70%</span>
</div>
<div class="skill__bar">
<div class="skill__value" style="width: 70%"></div>
</div>
</div>
<div class="skill">
<div class="skill_description">
<span>JAVA</span>
<span>100%</span>
</div>
<div class="skill__bar">
<div class="skill__value skill_defaultValue" style="width: 100%"></div>
</div>
</div>
</div>
<div class="skillset__right">
<div class="tools">
<h3 class="skillset__title">Tools</h3>
<ul class="tools_list">
<li><span>Visual Studio</span></li>
<li><span>Visual Studio Code</span></li>
<li><span>intellij</span></li>
<li><span>MySQL</span></li>
</ul>
</div>
<div class="etc">
<h3 class="skillset__title">Etc</h3>
<ul class="etx__list">
<li><span>Git</span></li>
</ul>
</div>
</div>
</div>
</div>
</section>
<!-- Work -->
<section id="work" class="section" style="height: 948px;">
<div class="section__container">
<h1>My work</h1>
<h3>Projects</h3>
<div class="work__categories">
<button class="category__btn selected" data-filter="*">
ALL<span class="category__count">8</span>
</button>
<button class="category__btn" data-filter="front-end">
Front-end<span class="category__count">3</span>
</button>
<button class="category__btn" data-filter="back-end">
Back-end<span class="category__count">3</span>
</button>
<button class="category__btn" data-filter="mobile">
Mobile<span class="category__count">2</span>
</button>
</div>
<div class="work__projects">
<a href="#" class="project" target="blank" data-type="front-end">
<img
src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbRr3a%2FbtrMKs9zlgU%2FmZcVp9HF3rKSHYCLfLJZd1%2Fimg.png"
alt=""
class="project__img"/>
<div class="project__description">
<h3>My Portfolio</h3>
<span>HTML and CSS</span>
</div>
</a>
<a href="#" class="project" target="blank" data-type="front-end">
<img
src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbRr3a%2FbtrMKs9zlgU%2FmZcVp9HF3rKSHYCLfLJZd1%2Fimg.png"
alt=""
class="project__img"/>
<div class="project__description">
<h3>My Portfolio</h3>
<span>HTML and CSS</span>
</div>
</a>
<a href="#" class="project" target="blank" data-type="front-end">
<img
src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbRr3a%2FbtrMKs9zlgU%2FmZcVp9HF3rKSHYCLfLJZd1%2Fimg.png"
alt=""
class="project__img"/>
<div class="project__description">
<h3>My Portfolio</h3>
<span>HTML and CSS</span>
</div>
</a>
<a href="#" class="project" target="blank" data-type="back-end">
<img
src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuB4aw%2FbtrMFFiOtAc%2FS69MzO1kKixsXZdaX7aHW1%2Fimg.png"
alt=""
class="project__img"/>
<div class="project__description">
<h3>Pet Sitting</h3>
<span>JSP</span>
</div>
</a>
<a href="#" class="project" target="blank" data-type="back-end">
<img
src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJe33b%2FbtrMIrxm6oh%2FcbLoSdLzsCQ2mXl0wrBVK1%2Fimg.png"
alt=""
class="project__img"/>
<div class="project__description">
<h3>My Portfolio</h3>
<span>JSP</span>
</div>
</a>
<a href="#" class="project" target="blank" data-type="back-end">
<img
src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJe33b%2FbtrMIrxm6oh%2FcbLoSdLzsCQ2mXl0wrBVK1%2Fimg.png"
alt=""
class="project__img"/>
<div class="project__description">
<h3>My Portfolio</h3>
<span>JSP</span>
</div>
</a>
<a href="#" class="project" target="blank" data-type="mobile">
<img
src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs7afu%2FbtrMIwSTupi%2F7KhTRk6jXq0rlxPz6dAlSk%2Fimg.png"
alt=""
class="project__img"/>
<div class="project__description">
<h3>My Portfolio</h3>
<span>Mobile</span>
</div>
</a>
<a href="#" class="project" target="blank" data-type="mobile">
<img
src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs7afu%2FbtrMIwSTupi%2F7KhTRk6jXq0rlxPz6dAlSk%2Fimg.png"
alt=""
class="project__img"/>
<div class="project__description">
<h3>My Portfolio</h3>
<span>Mobile</span>
</div>
</a>
</div>
</div>
</section>
<!-- Contact -->
<section id="contact" class="section">
<h1 class="contact__title">Let's talk</h1>
<h2 class="contact__email">smreo3839@naver.com</h2>
<div class="contact__links">
<a href="https://github.com/smreo3839" target="blank">
<i class="fab fa-github"></i>
</a>
<a href="#" target="blank">
<i class="fab fa-linkedin"></i>
</a>
</div>
<p class="contact__rights">2022 - mkc</p>
</section>
<!-- arrow-up button -->
<button id="arrow-up-btn">
<i class="fas fa-solid fa-arrow-up"></i>
</button>
<script src="js/main.js" defer></script>
<script src="https://kit.fontawesome.com/36e2eaaec8.js" crossorigin="anonymous"></script>
</body>
</html>
port.css
/* Global */
:root {
/* Color */
--color-white: #ffffff;
--color-light-white: #eeeeee;
--color-dark-white: #bdbdbd;
--color-my-blue: #005666;
--color-my-dark-blue: #3e5bc4;
--color-dark-grey: #4d4d4d;
--color-grey: #616161;
--color-light-grey: #7c7979;
--color-blue: #008080;
--color-yellow: #fff7d1;
--color-orange: #feb546;
--color-black: #000000;
/* Font size */
--font-large: 48px;
--font-medium: 28px;
--font-regular: 18px;
--font-small: 16px;
--font-micro: 14px;
/* Font weight */
--weight-bold: 700;
--weight-semi-bold: 600;
--weight-regular: 400;
/* Size */
--size-border-radius: 4px;
/* Annimation */
--animation-duration: 300ms;
--animation-duration-slow: 3000ms;
}
* {
box-sizing: border-box;
}
body {
font-family: "Open Sans", sans-serif;
margin: 0;
cursor: default; /*마우스 커서 속성*/
}
a {
text-decoration: none;
color: var(--color-white);
}
ul {
padding-left: 0;
}
li {
list-style: none;
}
button {
background-color: transparent;
cursor: pointer;
border: none;
outline: none;
padding: 0;
}
h1 {
font-size: var(--font-large);
font-weight: var(--weight-bold);
color: var(--color-black);
margin: 16px 0px;
}
h2 {
font-size: var(--font-medium);
font-weight: var(--weight-semi-bold);
color: var(--color-black);
margin: 8px 0;
}
h3 {
font-size: var(--font-regular);
font-weight: var(--weight-regular);
color: var(--color-black);
margin: 8px 0;
}
p {
font-size: var(--font-regular);
font-weight: var(--weight-regular);
color: var(--color-black);
margin: 4px 0;
}
/* Navbar */
#navbar {
position: fixed;
width: 100%;
display: flex;
justify-content: space-between;
align-items: center; /*안의 요소들 중앙 정렬*/
padding: 16px;
background-color: transparent;
transition: all var(--animation-duration) ease-in-out;
z-index: 1;
}
#navbar.navbar--dark {
background-color: var(--color-my-blue);
padding: 8px;
}
.navbar__logo {
font-size: var(--font-medium);
font-weight: var(--weight-semi-bold);
color: white;
}
.navbar__menu {
display: flex;
}
.navbar__menu__item {
padding: 8px 12px;
margin: 0 4px;
cursor: pointer;
color: var(--color-white);
transition: all 0.2s ease-in-out;
border: 1px solid transparent;
border-radius: var(--size-border-radius);
}
.navbar__menu__item:hover {
border: 1px solid white;
background-color: var(--color-my-dark-blue);
border-radius: var(--size-border-radius);
}
/* Home */
#home {
background: url("../img/bg.png") center/cover no-repeat;
padding: 50px;
padding-top: 120px;
text-align: center;
}
.home__avatar { /*썸네일*/
width: 250px;
height: 250px;
border-radius: 50%;
border: 2px solid var(--color-light-white);
}
.home__title,
.home__description {
color: var(--color-white);
}
.home__contact { /*contact Me 버튼*/
color: var(--color-white);
font-size: var(--font-regular);
font-weight: var(--weight-bold);
margin: 24px;
padding: 8px 12px;
border: 2px solid var(--color-white);
border-radius: var(--size-border-radius);
}
.home__contact:hover {
background-color: var(--color-orange);
}
/* Section common */
.section {
padding: 100px;
text-align: center;
margin: auto;
}
.section__container {
max-width: 1200px;
margin: auto;
}
/* About */
.about__majors {
display: flex;
justify-content: space-between;
margin: 80px 0;
}
.major__icon {
width: 170px;
height: 170px;
font-size: 70px;
line-height: 170px;
margin: auto;
color: var(--color-blue);
border: 1px solid var(--color-blue);
border-radius: 50%;
margin-bottom: 16px;
}
.major__icon i {
transition: all var(--animation-duration) ease;
}
.major__icon:hover i {
color: var(--color-my-blue);
transform: rotate(-30deg) scale(1.1);
}
/* Skill */
#skills {
padding-bottom: 250px;
background-color: var(--color-yellow);
}
.skillset {
display: flex;
background-color: var(--color-light-grey);
color: var(--color-light-white);
margin: auto;
}
.skillset__title {
color: var(--color-white);
}
.skillset__left {
flex-basis: 60%;
background-color: var(--color-dark-grey);
padding: 20px 40px;
}
.skill {
margin-bottom: 32px;
}
.skill__description {
display: flex;
justify-content: space-between;
}
.skill__bar {
width: 100%;
height: 7px;
background-color: var(--color-grey);
}
.skill__value {
transition: all var(--animation-duration-slow) ease;
height: 7px;
background-color: var(--color-orange);
}
.skill_defaultValue {
width: 10% !important;
}
.skillset__right {
flex-basis: 40%;
}
#css {
width: 70%;
}
.tools {
background-color: var(--color-grey);
}
.tools,
.etc {
padding: 20px;
height: 50%;
}
/* Work */
.work__categories {
margin: 40px;
}
.category__btn {
border: 1px solid var(--color-dark-white);
border-radius: var(--size-border-radius);
font-size: var(--font-regular);
padding: 8px 48px;
position: relative;
}
.category__btn.selected,
.category__btn:hover {
background-color: var(--color-my-blue);
color: var(--color-white);
}
.category__btn.selected .category__count,
.category__btn:hover .category__count {/*선택된 버튼 혹은 마우스가 올려진 버튼*/
opacity: 1;
top: 5px;
}
.category__count {
background-color: var(--color-orange);
color: var(--color-white);
border-radius: 50%;
width: 24px;
height: 24px;
line-height: 24px;
display: inline-block;
position: absolute;
top: -10px;
opacity: 0;
transition: all var(--animation-duration) ease-in;
margin-left: 5px;
}
.work__projects {
display: flex;
flex-wrap: wrap;
justify-content: center;
width: 100%;
opacity: 1;
transition: all var(--animation-duration) ease-out;
}
.work__projects.anim-out {
opacity: 0.6;
transform: scale(0.9) translateY(100px);
}
.project {
position: relative;
display: flex;
justify-content: center;
align-items: center;
width: 280px;
height: 250px;
margin: 2px;
border-color: var(--color-white);
}
.project.invisible {
display: none;
}
.project__img {
max-width: 100%;
/*max-height: 100%;*/
height: 250px;
border: 1px solid lightgray;
}
.project__description {
position: absolute;
background-color: black;
display: flex;
flex-direction: column;
justify-content: center;
width: 100%;
height: 100%;
top: 10px;
left: 0;
opacity: 0;
/*transform: translateY(10px);*/
transition: all var(--animation-duration) ease-in;
}
.project:hover .project__description {
opacity: 0.8;
/*transform: translateY(0px);*/
top: 0px;
transition: all var(--animation-duration) ease-in;
}
.project__description h3 {
color: var(--color-orange);
}
.projects {
display: flex;
}
/* Contact */
#contact {
background-color: var(--color-my-blue);
}
.contact__title,
.contact__email,
.contact__rights {
color: var(--color-white);
}
.contact__title {
margin: 32px 0;
}
.contact__links {
font-size: var(--font-large);
margin: 24px 0;
transition: all var(--animation-duration) ease-in;
}
.contact__links i:hover {
transform: scale(1.1);
color: var(--color-yellow);
}
/* arrow-up button */
#arrow-up-btn {
position: fixed;
bottom: 50px;
right: 30px;
width: 70px;
height: 70px;
background-color: var(--color-my-dark-blue);
border: 3px solid var(--color-white);
color: var(--color-white);
border-radius: 50%;
font-size: var(--font-medium);
transition: all 0.3s ease-in;
pointer-events: none;
opacity: 0;
}
#arrow-up-btn.visible {
opacity: 1;
pointer-events: auto;
}
프로젝트 진행 중 참고 내용
https://www.daleseo.com/css-width/
[CSS] width 속성과 너비 결정 매커니즘
Engineering Blog by Dale Seo
www.daleseo.com
https://studiomeal.com/archives/197
📌 요소들을 수평 나열하기위해 flex 속성을 사용하였습니다.
이번에야말로 CSS Flex를 익혀보자
이 튜토리얼은 “차세대 CSS 레이아웃” 시리즈의 첫번째 포스트입니다. 이번에야말로 CSS Flex를 익혀보자 이번에야말로 CSS Grid를 익혀보자 벌써부터 스크롤의 압박이 느껴지고,‘좀 편안하게 누
studiomeal.com
https://developer.mozilla.org/ko/docs/Web/API/Element/getBoundingClientRect
📌 스크롤 이벤트 발생시 브라우저의 y축 좌표값과 특정 요소의 좌표값을 비교하기 위해 getBoundingClientRect()를 사용하였습니다
Element.getBoundingClientRect() - Web API | MDN
Element.getBoundingClientRect() 메서드는 엘리먼트의 크기와 뷰포트에 상대적인 위치 정보를 제공하는 DOMRect 객체를 반환합니다.
developer.mozilla.org
📌 카테고리 버튼에 값을 지정하여 각각의 다른 이벤트를 발생시키기위해 데이터셋 속성을 사용하였습니다
[JS] 📚 HTML 데이터셋(data-*) 속성
데이터 속성 HTML5부터는 데이터 속성이라는 개념이 생겼습니다. 데이터 속성은 HTML 요소의 'data-' 로 시작하는 속성입니다. 이러한 데이터 속성은 특정한 데이터를 DOM 요소에 저장해두기 위함이
inpa.tistory.com
소중한 공감 감사합니다