반응형
반응형

[AI] AI 오케스트레이션: 여러 AI 에이전트를 조율하여 프로젝트를 완수하는 리더십.

 

https://app-place-tech.com/post/dd7ab6d3-b94e-434e-a960-ec172557a885

 

AI 시대 개발자 수요 전망 분석 (제번스의 역설 관점 포함)

주니어 절벽과 채용 양극화: AI 도구 도입으로 생산성이 최대 56% 향상되면서 단순 코딩 비중이 높은 신입 채용은 급감(국내 기준 약 43% 감소)한 반면, AI를 활용해 즉각 성과를 내는 숙련된 시니어

app-place-tech.com

 

AI 시대 개발자 수요 전망 분석 (제번스의 역설 관점 포함)

소프트웨어 산업의 가장 뜨거운 화두인 'AI 도입에 따른 개발자 수요 전망'에 대해 심층적인 분석을 공유해 보고자 합니다.

2022년 말 챗GPT의 등장 이후, 개발 현장에서는 "이제 코딩은 AI가 다 하는데, 개발자가 더 필요할까?"라는 근본적인 의문이 제기되고 있습니다. 특히 주니어 개발자들의 채용 문턱이 높아지면서 위기감이 고조되고 있는 것도 사실입니다. 하지만 경제학적 이론과 현재 글로벌 시장의 지표를 교차 검증해 보면, 우리는 단순히 '대체'의 시대를 넘어선 '수요의 대폭발' 시점에 서 있을지도 모릅니다.

1. 생산성의 임계점 돌파: "코딩의 한계 비용이 0에 수렴하다"

인공지능 코딩 어시스턴트는 이제 단순한 보조 도구를 넘어섰습니다. 통계에 따르면 AI를 활용하는 개발자는 비활용 그룹 대비 업무 속도가 약 55.8% ~ 56% 향상되는 것으로 나타났습니다. 깃허브(GitHub)의 데이터에서도 AI 도구 사용 시 주당 코드 배포량이 평균 46% 증가하며 실질적인 생산성 폭발이 입증되고 있습니다.

이러한 변화는 개발자 1인이 감당할 수 있는 프로젝트의 규모와 복잡도를 비약적으로 높였습니다. 이제 구글 내 신규 코드의 25% 이상이 AI에 의해 생성되고 있으며, 인간 엔지니어는 이를 검토하고 승인하는 '디렉터'의 역할에 집중하고 있습니다.

2. 고용 시장의 양극화: '주니어 절벽'과 시니어 레버리지

하지만 생산성 향상의 혜택은 경력 수준에 따라 다르게 나타나고 있습니다. 현재 고용 시장에는 이른바 '주니어 절벽' 현상이 관측됩니다.

  • 주니어의 위기: 단순 구현 및 반복 업무(Boilerplate, Test Case 작성 등)를 AI가 저렴하게 대체하면서, 한국 내 IT 신입 채용 공고는 전년 대비 18.9%에서 많게는 43%까지 급감했습니다.
  • 시니어의 가치 상승: 반면, AI가 쏟아내는 코드의 논리적 오류를 잡아내고 복잡한 아키텍처를 설계할 수 있는 숙련된 시니어에 대한 수요는 여전히 견고합니다. 실제로 26세 이상의 숙련 노동자 고용은 오히려 6~9% 성장하는 기염을 토하고 있습니다.

3. 제번스의 역설(Jevons Paradox): 왜 수요는 줄어들지 않는가?

그렇다면 개발자의 총 수요는 결국 줄어들까요? 경제학의 '제번스의 역설'은 정반대의 미래를 시사합니다. 기술 발전으로 어떤 자원의 이용 효율이 높아지면 비용이 낮아지고, 이는 오히려 해당 자원의 총 소비량을 늘린다는 이론입니다.

  1. 잠재 수요의 현실화: 과거에는 높은 개발 단가 때문에 포기했던 소규모 프로젝트(사내 자동화 툴, 마이크로 SaaS 등)들이 AI 덕분에 경제성을 갖게 되며 시장이 확장됩니다.
  2. 복잡성의 역설: 코딩 비용이 낮아지면 기업은 개발자를 해고하는 대신, 더 많은 기능을 구현하고 더 자주 배포하는 전략을 택합니다. 깃허브의 풀 리퀘스트(PR) 수가 전년 대비 23~25% 증가했다는 점이 이를 뒷받침합니다.
  3. 시장 규모의 확대: 전 세계 AI 지출 규모는 2026년 2조 달러를 돌파할 것으로 보이며, 특히 맞춤형 소프트웨어 시장은 2034년까지 연평균 22.7%의 경이적인 성장을 기록할 전망입니다.

3-1. (반대의견) 개발자의 수요가 전반적으로 감소될 것 (대체론)

"효율성 증가는 곧 필요 인력의 감소를 의미한다."

비관적인 전망에 따르면, 소프트웨어 프로젝트 하나를 완수하는 데 필요한 총 노동 시간이 급감합니다. 기업은 비용 절감을 위해 채용 규모를 동결하거나 축소할 것입니다.

  • 기존 인력의 생산성 2배 증가 = 신규 채용 필요성 50% 감소
  • 단순 SI, 웹 에이전시 등 진입 장벽이 낮은 시장부터 타격
  • '코딩' 자체의 부가가치 하락

4. 대한민국 시장의 특수성: AX(AI 전환)의 가속화

한국 시장 역시 글로벌 흐름과 궤를 같이하고 있습니다. 네이버, 카카오 등 빅테크는 신규 채용을 축소하고 '경력직 수시 채용' 체제로 완전히 전환했습니다. 흥미로운 점은 현대자동차나 삼성SDS 같은 전통적인 대기업들이 AX(AI 전환)를 위해 개발자 채용을 오히려 확대하고 있다는 점입니다.

5. 결론: "코더에서 오케스트레이터로"

결국 미래의 개발자에게 요구되는 핵심 역량은 문법 암기가 아닌 '판단력(Judgment)'입니다.

  • 시스템 아키텍처 역량: AI가 만든 코드 조각들을 안전하게 결합하는 설계 능력.
  • 비즈니스 도메인 지식: 어떤 문제를 해결해야 비즈니스 가치가 생기는지 정의하는 능력.
  • AI 오케스트레이션: 여러 AI 에이전트를 조율하여 프로젝트를 완수하는 리더십.

우리는 지금 '개발자의 종말'이 아니라, 개발자의 업무가 더 가치 있고 전략적인 영역으로 격상되는 '위대한 소프트웨어 시대'의 입구에 서 있습니다. 기술의 효율성이 높아질수록 우리가 해결해야 할 세상의 문제는 더 방대해질 것이며, 이를 설계할 인간 개발자의 중요성은 역설적으로 더 커질 것입니다.

반응형
반응형

PyQt5의 웹 엔진 모듈인 QtWebEngineWidgets를 사용하여 특정 URL을 임베디드 창(아이프레임 형태)으로 보여주고, 새로고침 기능을 포함한 프로그램을 제작

카카오맵과 같은 복잡한 웹 페이지를 렌더링하기 위해서는 단순한 GUI 구성 외에 WebEngine 설정이 필요

PyQt5에서 웹 브라우저 기능을 사용하려면 기본 패키지 외에 PyQtWebEngine을 추가로 설치

pip install PyQt5 PyQtWebEngine

 

 

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, 
                             QPushButton, QHBoxLayout)
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import QUrl

class MapViewer(QWidget):
    def __init__(self):
        super().__init__()
        self.target_url = "https://place.map.kakao.com/SES0331"
        self.initUI()

    def initUI(self):
        # 1. 전체 레이아웃 (수직)
        layout = QVBoxLayout()

        # 2. 컨트롤 레이아웃 (상단 가로)
        control_layout = QHBoxLayout()
        
        # 새로고침 버튼 생성
        self.btn_refresh = QPushButton('🔄 페이지 새로고침')
        self.btn_refresh.setFixedHeight(40) # 버튼 높이 조절
        self.btn_refresh.setStyleSheet("""
            QPushButton {
                background-color: #fee500; /* 카카오 테마색 */
                border-radius: 5px;
                font-weight: bold;
            }
            QPushButton:hover {
                background-color: #fada00;
            }
        """)
        self.btn_refresh.clicked.connect(self.reload_page)
        
        control_layout.addWidget(self.btn_refresh)

        # 3. 웹 엔진 뷰 (아이프레임 역할)
        self.web_view = QWebEngineView()
        self.web_view.setUrl(QUrl(self.target_url))

        # 4. 레이아웃에 위젯 추가
        layout.addLayout(control_layout)
        layout.addWidget(self.web_view)

        self.setLayout(layout)
        self.setWindowTitle('Kakao Map Place Viewer')
        self.setGeometry(100, 100, 1000, 800) # 기본 창 크기 설정
        self.show()

    def reload_page(self):
        """페이지를 다시 불러옵니다."""
        self.web_view.reload()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    
    # 웹 엔진 초기화 (일부 환경에서 필요)
    ex = MapViewer()
    sys.exit(app.exec_())
반응형
반응형

 

https://stibee.com/api/v1.0/emails/share/j7_tY4bW3WJePiXnsdTmVt24i_2jmeQ

https://www.youtube.com/watch?v=ehIdjNaJyIw

* AI 시대, 살아남으려면 어떤 역량을 길러야 할까? 

우리는 매일 판단을 내려야 합니다. 몇 시에 일어날지부터 시작해서 점심에 무엇을 먹을지 고민하는 것도 일종의 판단이 되겠죠. 하지만 그 판단이 매번 완벽할 수는 없습니다. (저의 경우 조금이라도 앉아서 출근하려고 일부러 지하철을 놓친 적이 있습니다만, 그다음 지하철에도 사람이 많아서 서서 간 적이 부지기수였습니다. 그럴 땐 그냥 이전 지하철을 탈걸..이라며 후회 가득한 표정으로 지하철 손잡이를 꽉 잡습니다.)

AI는 판단을 할 수는 있으나, 책임이 있는 결단은 하지 못합니다. 윤리적인 결단, 의미와 방향을 정하는 결단 혹은 관계 기반 결단이 책임 있는 결단에 포함됩니다. 앞서 말한 5명의 AI 전문가들은 공통적으로 ‘논리적인 사고’를 길러야 한다는 말을 했는데요. 논리적 사고를 구성하는 핵심 요소는 '비판적 사고'입니다.

우리가 흔히 생각하는 ‘비판적인 사고’는 약간 부정적으로 느껴질 수도 있습니다. 이는 우리가 가장 유용하고 믿을만한 정보만 빼고 나머지를 모두 제외하기 때문인데요. 비판적인 사고력을 기르면 상황을 신중히 분석하고, 편견과 조작 같은 숨겨진 문제를 찾아낼 수 있습니다. 다시 말해서 탁월한 선택을 할 수 있다는 것입니다. (여기서 탁월하다는 것은 무결점의 완벽한 결정이 아닌, 좋지 않은 선택을 할 확률을 줄여줄 수 있다는 것을 의미합니다.)

교육 전문가 사만다 어구스(Samantha Agoos)가 제시한 문제를 해결하는데 도움을 주는 ‘비판적 사고를 기르는 5가지 단계’는 다음과 같습니다. 

1. 질문을 체계적으로 구성한다: 내가 무엇을 바라는지 찾아낸다. e.g. 다이어트를 한다 (X) / 혈당을 낮추기 위해 건강한 식단을 진행한다 (O)
2. 정보를 수집한다: 질문에 대한 분명한 생각이 관련성을 찾는 데 도움이 될 것이다.
3. 수집한 정보를 적용한다: 비판적으로 질문하기 e.g. 어떤 개념이 들어있는가? 어떤 가정이 존재하는가? 정보에 대한 나의 해석은 논리적인가?
4. 영향력을 고려한다: 단기적, 장기적인 영향력을 고려해야 한다.
5. 다른 관점에서도 생각한다: 대안을 고려할 수 있고, 자신이 내린 결정을 평가해 보며 결과적으로 더 나은 결정을 내릴 수 있도록 도와준다.

* 가장 강력한 훈련 도구는 바로 책 

비판적 사고의 핵심은 맥락 파악과 복선 이해입니다. 이 사고를 기르기 위해 제일 좋은 방법은 바로 책을 읽는 것입니다. 책의 저자는 근거와 논리를 쌓고, 독자는 그 근거와 논리가 맞는지 계속 생각하며 글을 읽습니다. 때문에 책 읽기로 긴 호흡의 집중을 만들어 낼 수 있죠. 이 과정을 통해 인지적 웨이트 트레이닝이 가능합니다. 여기서 인지적 웨이트 트레이닝이란 뇌의 사고력을 키우기 위해 의도적으로 ‘어려운 생각’이라는 부하를 거는 과정을 말합니다. 쉽게 말해 뇌 근육을 키우기 위해 바벨을 드는 것입니다. 

사실 요즘 같은 시대에 책을 읽지 않아도 유튜브나 인스타그램, 혹은 챗GPT나 제미나이를 통해서 정보를 쉽게 체득할 수 있습니다. 책을 굳이 읽어야 하는 것은 아니죠. 이동진 평론가의 말을 인용하면 그럼에도 불구하고 책을 읽어야 하는 이유는 ‘정보의 과다’ 때문입니다. 지식의 체계와 진위 여부가 더 중요해진 현대사회에서 인터넷의 글들은 편집과 체계가 제대로 갖춰지지 않을 가능성이 큽니다. 고도화된 편집 과정을 거친 책은 전체적인 틀을 파악하는 데도 유용하며 총체적인 시각을 가질 수 있습니다.

이러한 시각은 말씀드렸다시피 비판적인 사고를 훈련하는 데 굉장히 중요합니다. 전체적인 맥락을 파악하면 핵심을 파악할 수 있기 때문이죠.

AI는 점점 더 우리들의 삶에 들어오게 될 것입니다. 이미 데이터를 분석하거나, 문장을 만들거나, 콘텐츠를 제작하는 것도 AI로 가능한 일이 되어버렸죠.

하지만 AI에겐 치명적인 단점이 있습니다. 바로 인간이 아니라는 것이죠. 그들은 감정을 느끼며, 판단을 할 수 없고, 삶의 방향성을 선택할 수 없으며 그 선택에 책임을 지지도 않습니다. 

비판적으로 사고하는 힘, 변화에 빠르게 적응하는 민첩함과, 유연함 그리고 사회적인 관계를 맺는 힘. 아직은 AI가 따라잡을 수 없는 인간만의 고유한 능력입니다.

앞으로 우리는 질문의 방향을 바꿔야 합니다. 어떤 질문을 던질 수 있는지, 어떤 선택을 하는지가 더 중요해질 것입니다.


 

반응형
반응형

Spring Boot 프로젝트의 CI/CD 파이프라인

 

[Git Push][Jenkins Trigger][Build & Test][Docker Build & Push][Deploy to Server]

Spring Boot 프로젝트의 CI/CD 파이프라인은 GitHub Actions 또는 Jenkins를 사용하여 코드 빌드, 테스트, Docker 이미지 생성 및 도커 허브/AWS 등의 저장소로 Push하여 자동 배포하는 흐름으로 구축합니다. 주요 단계는 소스 코드 체크아웃, JDK 설정, Gradle/Maven 빌드, 도커 이미지화, 서버 배포 순으로 진행됩니다.
Spring 파이프라인(CI/CD) 구축 핵심 단계
  • 1. 소스 코드 관리 (GitHub): 코드를 저장소(Repository)에 커밋 및 푸시합니다.
  • 2. CI 서버 설정 (Jenkins/GitHub Actions):
    • GitHub Actions: .github/workflows 디렉토리에 YAML 파일로 파이프라인(빌드, 테스트, 푸시)을 정의합니다.
    • Jenkins: Jenkinsfile을 프로젝트 루트에 작성하여 파이프라인을 자동화합니다.
  • 3. 빌드 및 테스트: JDK를 설치하고, Gradle(gradlew build) 또는 Maven을 사용하여 프로젝트를 빌드하고 테스트를 수행합니다.
  • 4. 컨테이너화 (Docker): 애플리케이션을 Docker 이미지로 빌드하고 도커 허브(DockerHub) 등 레지스트리에 푸시합니다.
  • 5. 배포 (CD): 빌드된 이미지를 운영 환경(AWS EC2, 쿠버네티스 등)에 배포합니다.
    • Jib를 사용하면 Docker Daemon 없이도 효율적으로 컨테이너 이미지를 빌드할 수 있습니다.
이 과정을 자동화하면 코드 품질을 높이고 서비스 배포 속도를 향상시킬 수 있습니다.

CI/CD 파이프라인은 코드 변경 사항의 빌드, 테스트, 배포 과정을 자동화하여 소프트웨어를 빠르고 안정적으로 릴리스하는 DevOps 핵심 프로세스입니다. 지속적 통합(CI)을 통해 코드 품질을 검증하고, 지속적 배포(CD)를 통해 운영 환경까지 자동 반영하여 수동 작업과 오류를 최소화합니다.
CI/CD 파이프라인의 핵심 구성 요소 및 절차
  • 소스(Source): 개발자가 원격 리포지토리(GitHub, GitLab 등)에 코드를 푸시하여 파이프라인을 트리거.
  • 빌드(Build): 소스 코드를 컴파일하고 의존성을 해결하여 실행 가능한 아티팩트(바이너리, 컨테이너 이미지) 생성.
  • 테스트(Test): 유닛 테스트, 통합 테스트, 보안 검사 등을 자동화하여 코드 품질 검증.
  • 배포(Deploy): 검증된 애플리케이션을 스테이징 또는 운영 서버(Kubernetes, 클라우드 환경 등)에 자동 배포.

https://youtu.be/F3gEkZirFMU?si=bCl4CKoP8bb5O0ZJ

CI/CD 파이프라인은 소프트웨어의 빌드, 테스트, 배포 과정을 자동화하여 개발자가 코드 변경 사항을 더 빠르고 안정적으로 사용자에게 전달할 수 있게 돕는 시스템입니다.
1. 주요 개념
  • CI (Continuous Integration, 지속적 통합): 여러 개발자가 작성한 코드를 정기적으로 통합하고, 자동화된 빌드와 테스트를 통해 코드의 결함을 조기에 발견하는 프로세스입니다.
  • CD (Continuous Delivery/Deployment, 지속적 제공/배포):
    • Continuous Delivery: 통합된 코드를 검증 후 배포 가능한 상태로 유지하며, 실제 배포는 수동으로 승인합니다.
    • Continuous Deployment: 검증된 코드를 고객이 사용하는 운영 환경에 자동으로 배포합니다.
 
2. 파이프라인의 일반적인 4단계
  1. 소스 (Source): 코드 변경(Commit)이 발생하면 파이프라인이 이를 감지하고 최신 코드를 가져옵니다.
  2. 빌드 (Build): 코드를 컴파일하고 실행 가능한 형태(Artifact)로 변환하며, 필요한 종속성을 해결합니다.
  3. 테스트 (Test): 유닛 테스트, 통합 테스트 등을 자동 실행하여 코드의 품질과 비즈니스 로직을 검증합니다.
  4. 배포 (Deploy): 검증이 완료된 결과물을 스테이징 또는 운영 서버에 반영합니다.
 
3. 도입 시 장점
  • 빠른 출시: 수동 작업을 줄여 새로운 기능이나 버그 수정을 신속하게 배포할 수 있습니다.
  • 품질 향상: 자동화된 테스트를 통해 휴먼 에러를 방지하고 소프트웨어의 안정성을 높입니다.
  • 협업 효율화: 코드 통합 과정의 충돌을 줄여 개발팀 간의 협업이 원활해집니다.
반응형
반응형

당신이 커리어를 설계하지 않으면, 누군가가 대신 설계할 것이다 (2014)

 

If You Don't Design Your Career, Someone Else Will - Greg McKeown

  • 일상과 업무에 몰두한 나머지 자신의 커리어를 성찰하지 못하는 함정을 지적하며, 이를 벗어나기 위한 구체적 절차를 제시
  • 지난 12개월을 검토하고 주요 프로젝트·성과를 목록화한 뒤, 그 안의 흐름과 의미를 분석하도록 권장
  • 제한 없는 사고로 이상적인 커리어 방향을 구상하고, 현실적 제약으로 지나치게 빨리 포기하지 말 것을 강조
  • 목표를 여섯 가지로 정리한 후 단 하나의 핵심 목표만 남기고 집중하며, 이를 방해하는 ‘좋은 일들’을 과감히 거절해야 함
  • 짧은 시간의 성찰이 향후 수천 시간의 삶의 질을 바꿀 수 있음을 강조하며, 스스로 커리어를 설계할 필요성을 환기

커리어를 스스로 설계해야 하는 이유

  • 사람들은 종종 삶을 사느라 바빠서 삶을 생각하지 못하는 함정에 빠짐
    • 커리어에서도 마찬가지로, 일에 몰두한 나머지 커리어 자체를 돌아보지 못하는 경우가 많음
  • 이러한 상태를 피하기 위해 휴일 중 몇 시간을 투자해 커리어를 성찰하는 과정을 제안

8단계 커리어 성찰 프로세스

  • 1단계: 지난 12개월 검토
    • 한 해를 월별로 돌아보며 시간 사용처, 주요 프로젝트, 책임, 성과를 목록화
    • 복잡하게 만들 필요 없이 단순한 기록으로 충분함
  • 2단계: ‘무슨 일이 일어나고 있는가?’ 질문
    • 목록을 검토하며 실제로 어떤 일이 진행 중인지, 왜 중요한지, 어떤 추세가 있는지 분석
    • 이러한 추세가 계속될 경우의 결과를 생각
  • 3단계: ‘무엇이든 할 수 있다면 무엇을 할 것인가?’ 질문
    • 비판 없이 자유롭게 아이디어를 적어내며, 제약 없는 사고를 유도
  • 4단계: 3단계 아이디어 확장
    • 현실적 제약 때문에 지나치게 빨리 포기하지 말고, 진정 원하는 방향을 더 깊이 탐색
    • “비현실적이다”라는 이유로 배제된 길이 실제로는 정당한 커리어 경로일 수 있음
  • 5단계: 향후 12개월 목표 6가지 작성
    • 달성하고 싶은 주요 커리어 목표를 우선순위에 따라 정리
  • 6단계: 하위 5개 목표 삭제
    • 단 하나의 ‘진정한 북극성’ 목표에 집중
    • 업무의 소용돌이 속에서도 방향을 잃지 않게 함
  • 7단계: 이번 달 실행 계획 수립
    • 3~4주 내 달성 가능한 단기 성과(quick wins) 를 설정
  • 8단계: ‘무엇을 거절할 것인가’ 결정
    • 핵심 목표 달성을 방해하는 ‘좋은 일들’을 목록화하고, 삭제·연기·위임 방안을 마련
    • Ralph Waldo Emerson의 말을 인용해, “주된 목적에서 벗어나 여기저기 일하는 것이 개인과 국가를 파산시킨다”고 경고
    •  
반응형
반응형

10년 차 PM이 '관리자'라는 타이틀을 버리고 'Product Architect'가 된 이유

 

AI가 코딩하고 디자인하는 시대, "일정 조율하고 리소스 관리하는" 전통적인 PM의 역할은 유효할까요?

2026년 새해를 맞아, 지난 10년간 저를 정의했던 PM(Product Manager)이라는 껍질을 깨고 'Product Architect'로 역할을 재정의했습니다. 단순히 이름만 바꾼 것이 아닙니다. 일하는 방식과 툴, 관점을 완전히 뜯어고쳤습니다.

'AI 시대 생존을 위한 3가지 원칙'을 공유합니다.

  1. 고정관념 깨기: "조율할 대상이 사라졌다"

여전히 개발자, 디자이너 사이를 조율하는 게 PM의 일일까?
AI 시대엔 직접 만들고 책임지는 사람이 가장 안전합니다.

  1. 방식 바꾸기: "익숙한 것이 가장 비효율적이다"
  • 기획서 쓰고 -> 디자인 넘기고 -> 개발 기다리는 '선형적 프로세스'의 종말.
  • 이제 Replit으로 기획과 동시에 구현하고, Snapdeck으로 10분 만에 제안서를 만듭니다.
  1. 재정의하기: "Manager에서 Architect로"
  • 매니저(Manager)로 정의하면 '관리할 일'만 생깁니다.
  • 아키텍트(Architect)로 정의해야 '설계할 가치'가 보입니다.

더 이상 '성실한 관리자'는 정답이 아닙니다. 변화하는 시대, 여러분은 스스로를 무엇으로 정의하고 계신가요?

 

 

 

https://maily.so/insightlog/posts/1gz2796xr3q

 

2026년, 저는 PM이라는 직함을 버리기로 했습니다.

고정관념, 방식, 그리고 업의 재정의에 대하여

maily.so

 

반응형

+ Recent posts