반응형

 

 

개발 감각 있는지 확인하는 가장 현실적인 방법

 

가끔 이런 생각이 든다.
요즘도 공부는 꾸준히 하고, 새로운 기술도 따라가고, 일도 열심히 하는데 이상하게 “내가 잘 가고 있나?” 싶을 때가 있다.

이번에 본 영상(개발감각 있는지 확인하는 법)은 그 찝찝함을 꽤 정확하게 건드렸다.
핵심은 단순했다.

개발 감각은 코딩을 잘하는 능력이 아니다.

처음엔 좀 의외였다.
우리는 보통 문제를 빨리 푼다거나, 최신 스택을 잘 다룬다거나, 코드 구조를 깔끔하게 짜는 걸 ‘감각 있다’고 말하니까.
근데 영상에서 말하는 감각은 그보다 앞 단계에 있었다.

“지금 이 상황에서 진짜로 풀어야 할 문제가 뭔지 고르는 능력.”

그리고 그걸 가능한 적은 비용으로, 가장 빠르게 해결하는 판단력.


예시가 좋았다.
“실시간 채팅 기능 만들어주세요”라는 요청이 들어왔을 때를 생각해보자.

보통은 바로 기술 선택으로 달려간다.
웹소켓, 메시지 큐, 스케일링, 이런 키워드부터 머리에 뜬다.

근데 감각 있는 개발자는 그 전에 질문부터 한다.

  • 이 기능의 핵심 가치는 뭔가?
  • 이번 릴리즈에서 절대 깨지면 안 되는 건 뭔가?

만약 핵심이 ‘실시간 느낌’이 아니라 ‘메시지 누락 없는 전달’이라면,
초기 버전은 HTTP 폴링 같은 단순한 방식이 오히려 맞을 수도 있다.

화려하진 않다.
하지만 사용자 입장에서 필요한 건 “멋진 기술”이 아니라 “문제 해결”이다.


이 지점에서 좀 뜨끔했다.
나도 가끔 ‘좋은 구현’을 목표로 삼다가, 정작 ‘좋은 해결’을 놓칠 때가 있었으니까.

결국 개발 감각은 뭘 더할지보다 뭘 포기할지 결정하는 힘에 가깝다.
모든 걸 다 잘하려고 하면 대체로 아무것도 끝내지 못한다.


영상에서 실전적으로 도움됐던 건, 감각을 키우는 방법도 꽤 구체적이었다는 점이다.

첫 번째는 오픈소스의 PR 토론이나 RFC를 읽는 것.
사용법 문서만 보면 “어떻게 쓰는지”만 알게 되는데, 토론을 보면 “왜 그렇게 만들었는지”가 보인다.
그 안엔 항상 제약, 타협, 포기가 있다.
그게 결국 실무 판단력의 재료다.

두 번째는 장애 회고(postmortem)를 읽는 것.
실제 서비스는 멋진 코드보다, 망가지지 않고 복구 가능한 코드가 더 중요하다.
장애 사례를 읽다 보면 “우리 시스템은 비슷한 실수를 견딜 수 있나?”라는 질문을 자연스럽게 하게 된다.
이게 꽤 큰 차이를 만든다.


최근엔 기능 시작 전에 스스로 한 가지만 먼저 묻는다.

“이 기능에서 지금 가장 중요한 한 가지는 뭘까?”

이 질문 하나만 제대로 해도,
기술 선택이 훨씬 명확해지고, 일정도 덜 무너지고, 팀 대화도 덜 꼬인다.

개발 감각은 어떤 천재적인 재능이라기보다
좋은 질문을 반복해서 던지는 습관에 가까운 것 같다.

다음 작업 들어가기 전에,
“어떻게 만들지?”보다 먼저
“지금 진짜 해결해야 하는 게 뭔지”부터 확인해보면 좋겠다.

 

 

 

 

반응형
반응형

 

실제 안드로이드 기기 없이 Mac의 에뮬레이터 환경에서 카카오톡 채팅봇을 구축하는 방법을 단계별로 설명합니다.


목차

  1. 개요 및 동작 원리
  2. 사전 준비물
  3. BlueStacks 설치
  4. 카카오톡 설치 및 계정 설정
  5. 메신저봇R 설치 및 권한 설정
  6. 봇 스크립트 작성
  7. 테스트 및 디버깅
  8. 운영 시 주의사항
  9. 마무리

1. 개요 및 동작 원리

메신저봇R이란?

메신저봇R은 안드로이드의 알림(Notification) 시스템을 이용해 카카오톡 메시지를 감지하고, 미리 작성해둔 JavaScript 스크립트에 따라 자동으로 응답하는 앱입니다.

동작 흐름

카카오톡 메시지 수신
        ↓
 안드로이드 알림 발생
        ↓
 메신저봇R이 알림 감지
        ↓
 JavaScript 스크립트 실행 (response 함수)
        ↓
 카카오톡 알림 액션으로 자동 답장

왜 BlueStacks인가?

안드로이드 스튜디오의 AVD(Android Virtual Device)보다 BlueStacks를 권장하는 이유는 다음과 같습니다.

  • Google Play Services가 기본 탑재되어 앱 호환성이 높음
  • 카카오톡 에뮬레이터 감지 우회 가능성이 상대적으로 높음
  • Mac용 네이티브 빌드 지원 (Intel / Apple Silicon 모두 지원)
  • 설정이 간단하고 UI가 직관적

2. 사전 준비물

시작하기 전에 아래 항목들을 준비해주세요.

항목 설명
Mac (Intel 또는 Apple Silicon) macOS 11 Big Sur 이상 권장
여유 저장 공간 최소 10GB 이상
여분의 전화번호 카카오톡 봇 전용 계정 인증용
카카오 계정 (신규) 봇 전용으로 새로 만들 것을 권장
메신저봇R APK Play Store 또는 공식 채널에서 다운로드

⚠️ 중요: 기존에 사용 중인 카카오톡 계정을 그대로 사용하면 기존 기기와 충돌할 수 있습니다. 봇 전용 신규 계정을 만들고, 봇을 운영할 오픈채팅방에 해당 계정을 참여시키는 방식을 권장합니다.


3. BlueStacks 설치

3-1. 자신의 Mac 환경 확인

터미널에서 아래 명령어로 CPU 종류를 확인합니다.

uname -m
# x86_64 → Intel Mac
# arm64  → Apple Silicon (M1/M2/M3)

3-2. BlueStacks 다운로드

BlueStacks 공식 홈페이지에 접속해 Mac용 최신 버전을 다운로드합니다.

  • Intel Mac: BlueStacks 5 (x64)
  • Apple Silicon: BlueStacks 5 (Silicon) — 별도 빌드 선택

💡 Apple Silicon의 경우 공식 홈페이지에서 "Apple Silicon" 버전을 명시적으로 선택해야 합니다.

3-3. 설치 및 초기 설정

  1. 다운로드한 .dmg 파일을 실행합니다.
  2. 설치 마법사를 따라 진행하면 BlueStacks가 설치됩니다.
  3. 최초 실행 시 Google 계정 로그인을 요구합니다. 봇 전용 Google 계정을 사용하거나 기존 계정으로 로그인합니다.
  4. 로그인 후 Play Store가 정상적으로 활성화되는지 확인합니다.

3-4. 권장 에뮬레이터 설정

BlueStacks 우측 사이드바의 설정(⚙️)환경 설정에서 아래와 같이 설정합니다.

설정 항목 권장값
CPU 코어 수 2 이상
RAM 2048MB 이상
해상도 1280 x 720
Android 버전 Android 9 이상

4. 카카오톡 설치 및 계정 설정

4-1. 카카오톡 설치

  1. BlueStacks 내부의 Google Play Store를 실행합니다.
  2. 검색창에 카카오톡을 입력하고 설치합니다.
  3. 설치가 완료되면 카카오톡을 실행합니다.

⚠️ 일부 버전에서는 에뮬레이터 환경을 감지해 실행을 거부할 수 있습니다. 이 경우 BlueStacks 설정에서 루트 권한 비활성화를 확인하고, Android 버전을 변경해 재시도해보세요.

4-2. 봇 전용 계정으로 로그인

  1. 카카오톡 실행 후 새 계정 만들기 또는 기존 봇 계정으로 로그인합니다.
  2. 전화번호 인증 단계에서 준비해둔 여분 회선의 번호를 입력합니다.
  3. 해당 번호로 수신된 SMS 인증번호를 입력해 인증을 완료합니다.
  4. 로그인 완료 후 봇이 활동할 오픈채팅방에 참여합니다.

4-3. 알림 설정 확인

메신저봇R이 메시지를 감지하려면 카카오톡 알림이 반드시 활성화되어 있어야 합니다.

  • 카카오톡 앱 내 설정 → 알림 → 모든 알림 켜기
  • BlueStacks 설정 → 알림 → 알림 표시 활성화

5. 메신저봇R 설치 및 권한 설정

5-1. 메신저봇R 설치

메신저봇R은 Play Store에서 검색되지 않는 경우가 있습니다. 이 경우 APK 파일을 직접 설치합니다.

방법 1: Play Store에서 "메신저봇R" 검색 후 설치
방법 2: 공식 오픈채팅방이나 신뢰할 수 있는 출처에서 APK 다운로드 후 설치

APK를 직접 설치하려면 BlueStacks의 사이드바에서 APK 설치 버튼을 클릭하거나, APK 파일을 BlueStacks 화면으로 드래그 앤 드롭합니다.

5-2. 알림 접근 권한 허용 (가장 중요!)

메신저봇R이 정상 동작하려면 알림 읽기 권한이 반드시 필요합니다.

  1. 메신저봇R 앱을 처음 실행하면 권한 요청 팝업이 뜹니다.
  2. "알림 접근 허용" 버튼을 눌러 Android 시스템 설정으로 이동합니다.
  3. 메신저봇R 항목을 찾아 알림 접근 허용을 활성화합니다.

경로: Android 설정 → 앱 → 메신저봇R → 알림 접근

이 권한이 없으면 메시지를 아예 감지하지 못합니다. 권한 설정 후 앱을 재시작하세요.

5-3. 봇 활성화

  1. 메신저봇R 메인 화면에서 전원 버튼(▶)을 눌러 봇을 활성화합니다.
  2. 상단에 초록색 ON 상태가 표시되면 봇이 동작 중입니다.
  3. 이 상태에서 카카오톡으로 메시지를 받으면 스크립트가 실행됩니다.

6. 봇 스크립트 작성

메신저봇R은 JavaScript로 봇 로직을 작성합니다. 메인 함수는 response입니다.

6-1. response 함수 파라미터

function response(room, msg, sender, isGroupChat, replier, imageDB, packageName) {
    // room       : 채팅방 이름 (String)
    // msg        : 수신된 메시지 내용 (String)
    // sender     : 보낸 사람 닉네임 (String)
    // isGroupChat: 단체 채팅방 여부 (Boolean)
    // replier    : 답장 객체 (replier.reply()로 답장)
    // imageDB    : 이미지 관련 객체
    // packageName: 메시지를 보낸 앱의 패키지명 (String)
}

6-2. 기본 예제 - 특정 채팅방에서만 응답

function response(room, msg, sender, isGroupChat, replier, imageDB, packageName) {

    // 카카오톡 메시지만 처리
    if (packageName !== "com.kakao.talk") return;

    // 특정 오픈채팅방에서만 동작
    if (room !== "내 오픈채팅방 이름") return;

    // 인사 응답
    if (msg === "안녕" || msg === "안녕하세요") {
        replier.reply("안녕하세요! 무엇을 도와드릴까요? 😊");
        return;
    }

    // 도움말 명령어
    if (msg === "!도움말") {
        replier.reply(
            "📋 사용 가능한 명령어\n" +
            "!도움말 - 명령어 목록\n" +
            "!정보 - 봇 정보\n" +
            "!시간 - 현재 시간"
        );
        return;
    }

    // 현재 시간 출력
    if (msg === "!시간") {
        var now = new Date();
        replier.reply("현재 시간: " + now.toLocaleString("ko-KR"));
        return;
    }

    // 봇 정보
    if (msg === "!정보") {
        replier.reply("🤖 카카오톡 자동응답 봇 v1.0\nBlueStacks + 메신저봇R로 동작 중입니다.");
        return;
    }
}

6-3. 심화 예제 - 키워드 감지 및 조건 분기

function response(room, msg, sender, isGroupChat, replier, imageDB, packageName) {

    if (packageName !== "com.kakao.talk") return;
    if (room !== "내 오픈채팅방 이름") return;

    var lowerMsg = msg.toLowerCase();

    // 욕설 감지 및 경고 (예시)
    var badWords = ["욕설1", "욕설2"];
    for (var i = 0; i < badWords.length; i++) {
        if (msg.indexOf(badWords[i]) !== -1) {
            replier.reply("⚠️ " + sender + "님, 채팅 규칙을 지켜주세요!");
            return;
        }
    }

    // 특정 사람에게만 반응
    if (sender === "관리자닉네임" && msg.startsWith("!공지")) {
        var notice = msg.replace("!공지 ", "");
        replier.reply("📢 [공지사항]\n" + notice);
        return;
    }

    // 주사위 기능
    if (msg === "!주사위") {
        var result = Math.floor(Math.random() * 6) + 1;
        replier.reply(sender + "님의 주사위 결과: 🎲 " + result);
        return;
    }

    // 반복 메시지 에코 (테스트용)
    if (msg.startsWith("!에코 ")) {
        replier.reply(msg.replace("!에코 ", ""));
        return;
    }
}

6-4. 스크립트 적용 방법

  1. 메신저봇R 앱 하단의 스크립트 편집기 탭으로 이동합니다.
  2. 기존 코드를 모두 삭제하고 작성한 스크립트를 붙여넣습니다.
  3. 우측 상단의 저장(💾) 버튼을 누릅니다.
  4. 컴파일(▶) 버튼을 눌러 문법 오류가 없는지 확인합니다.
  5. 봇이 ON 상태인지 다시 확인합니다.

7. 테스트 및 디버깅

7-1. 기본 동작 테스트

  1. 다른 기기(혹은 다른 카카오톡 계정)에서 봇이 참여한 오픈채팅방에 메시지를 보냅니다.
  2. 봇 계정이 자동으로 답장하는지 확인합니다.
  3. !도움말 등 미리 정의한 명령어를 입력해 정상 동작 여부를 체크합니다.

7-2. 로그 확인

메신저봇R의 로그 탭에서 메시지 수신 및 응답 내역을 확인할 수 있습니다.

[INFO] room: 내 오픈채팅방, sender: 테스터, msg: !도움말
[INFO] reply sent: 📋 사용 가능한 명령어...

7-3. 자주 발생하는 문제

문제 원인 해결 방법
봇이 응답하지 않음 알림 접근 권한 미허용 설정에서 권한 재확인
봇이 응답하지 않음 카카오톡 알림 비활성화 카카오톡 알림 설정 켜기
일부 메시지만 감지됨 room 이름 불일치 로그에서 실제 room 이름 확인 후 수정
스크립트 오류 JavaScript 문법 오류 편집기에서 컴파일 후 오류 메시지 확인
카카오톡 설치 불가 에뮬레이터 감지 BlueStacks 버전 변경 또는 루트 비활성화

8. 운영 시 주의사항

8-1. Mac 절전 모드 해제

BlueStacks가 실행 중이더라도 Mac이 잠자기 모드에 들어가면 봇이 중단됩니다. 아래 설정으로 절전을 막아주세요.

방법 1: 시스템 설정에서 변경

시스템 설정 → 배터리(또는 에너지 절약) → 디스플레이 끄기 시간을 늘리거나 "절대 끄지 않음"으로 설정

방법 2: 터미널 명령어 (일시적)

# 카페인 앱처럼 절전 방지 (터미널 열어두는 동안 유지)
caffeinate -d

8-2. 카카오톡 계정 정책

  • 자동응답 봇은 카카오톡 이용약관상 회색 지대에 해당합니다.
  • 과도한 자동 메시지 발송 시 계정이 제한될 수 있습니다.
  • 봇 전용 계정을 사용해 메인 계정이 영향을 받지 않도록 합니다.

8-3. 리소스 관리

BlueStacks는 상당한 CPU와 메모리를 소모합니다. 장시간 운영 시:

  • 불필요한 BlueStacks 앱은 종료해 리소스를 확보하세요.
  • 주기적으로 BlueStacks를 재시작해 메모리 누수를 방지하세요.
  • Mac의 온도와 팬 소음을 주기적으로 확인하세요.

9. 마무리

이번 포스트에서는 Mac 환경에서 BlueStacks와 메신저봇R을 활용해 카카오톡 오픈채팅방 자동응답 봇을 구축하는 방법을 알아보았습니다.

요약

  1. BlueStacks 설치 (Mac 아키텍처에 맞는 버전 선택)
  2. 카카오톡 설치 → 봇 전용 계정으로 인증 및 로그인
  3. 메신저봇R 설치 → 알림 접근 권한 허용
  4. JavaScript 스크립트 작성 및 적용
  5. 봇 활성화 후 테스트

실제 기기 없이도 충분히 구축 가능하지만, 24시간 안정적인 운영이 필요하다면 중고 저가 안드로이드 폰을 별도 기기로 사용하는 것이 장기적으로 더 안정적입니다.


이 포스트가 도움이 되었다면 공유 부탁드립니다! 궁금한 점은 댓글로 남겨주세요. 🙌

반응형
반응형

 

 

웹 브라우저에서 3D 그래픽을 구현하는 것은 한때 Flash나 별도 플러그인의 영역이었습니다. 하지만 WebGL의 등장과 함께 브라우저 네이티브 3D 렌더링이 가능해졌고, Three.js는 이 WebGL을 가장 쉽고 강력하게 다룰 수 있는 JavaScript 라이브러리로 자리잡았습니다. 이 글에서는 Three.js의 핵심 아키텍처, 주요 개념, 그리고 실전 활용 패턴까지 정리합니다.

요약

  • Three.js란: WebGL을 추상화한 JavaScript 3D 라이브러리로, 복잡한 셰이더·행렬 연산 없이 선언적으로 3D 장면을 구성할 수 있음.
  • 핵심 구성요소: Scene, Camera, Renderer, Mesh(Geometry + Material), Light.
  • 활용 분야: 인터랙티브 웹사이트, 데이터 시각화, 게임, 제품 뷰어, AR/VR 등.

1. Three.js가 필요한 이유

WebGL의 한계

WebGL은 GPU 가속 2D/3D 렌더링을 위한 저수준 API입니다. 삼각형 하나를 그리기 위해서도 다음이 필요합니다:

  • 버텍스/프래그먼트 셰이더 작성 (GLSL)
  • 버퍼 생성 및 데이터 바인딩
  • 행렬 변환 (모델, 뷰, 프로젝션)
  • 렌더 루프 관리
// 순수 WebGL로 삼각형 하나 그리기 — 약 100줄 이상의 보일러플레이트
const gl = canvas.getContext('webgl');
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, `
  attribute vec4 aPosition;
  void main() { gl_Position = aPosition; }
`);
// ... 셰이더 컴파일, 링킹, 버퍼 설정 등 수십 줄 ...

Three.js의 추상화

Three.js는 이 모든 저수준 작업을 감추고, 직관적인 객체 모델을 제공합니다:

// Three.js로 동일한 결과를 얻기
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();

const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

2. 핵심 아키텍처 — Scene Graph

Three.js의 근간은 Scene Graph(장면 그래프) 패턴입니다. 이는 3D 객체들을 트리 구조로 관리하는 디자인 패턴으로, 부모-자식 관계를 통해 변환(위치, 회전, 스케일)이 상속됩니다.

Scene (루트)
├── Group (자동차)
│   ├── Mesh (차체)
│   ├── Mesh (바퀴 1)
│   ├── Mesh (바퀴 2)
│   └── PointLight (헤드라이트)
├── DirectionalLight (태양)
└── Mesh (지면)

주요 구성요소

구성요소 역할 주요 클래스
Scene 모든 3D 객체를 담는 컨테이너 THREE.Scene
Camera 장면을 바라보는 시점 정의 PerspectiveCamera, OrthographicCamera
Renderer Scene + Camera → 2D 이미지 변환 WebGLRenderer
Geometry 꼭짓점, 면 등 형상 데이터 BoxGeometry, SphereGeometry, BufferGeometry
Material 표면의 색상, 질감, 반사 속성 MeshStandardMaterial, ShaderMaterial
Mesh Geometry + Material의 결합체 THREE.Mesh
Light 장면의 조명 DirectionalLight, PointLight, AmbientLight

3. 렌더링 파이프라인

Three.js의 렌더링은 매 프레임마다 다음 과정을 거칩니다:

Scene Graph 순회
    → 월드 행렬 계산 (위치·회전·스케일)
    → 카메라 시점 기준 절두체 컬링 (보이지 않는 객체 제외)
    → Material별 정렬 (불투명 → 투명 순)
    → WebGL Draw Call 실행
    → 프레임 버퍼 → 화면 출력

렌더 루프 구현

function animate() {
  requestAnimationFrame(animate);

  // 상태 업데이트
  cube.rotation.x += 0.01;
  cube.rotation.y += 0.01;

  // 렌더링
  renderer.render(scene, camera);
}
animate();

requestAnimationFrame을 사용하면 브라우저의 화면 갱신 주기(보통 60fps)에 맞춰 렌더링이 수행되며, 탭이 비활성화되면 자동으로 일시정지됩니다.

4. 카메라 시스템

PerspectiveCamera (원근 투영)

사람의 눈과 유사한 원근감을 제공합니다. 가까운 물체는 크게, 먼 물체는 작게 보입니다.

const camera = new THREE.PerspectiveCamera(
  75,                           // fov: 시야각 (도)
  window.innerWidth / window.innerHeight, // aspect: 종횡비
  0.1,                          // near: 가까운 클리핑 면
  1000                          // far: 먼 클리핑 면
);
camera.position.set(0, 5, 10);
camera.lookAt(0, 0, 0);

OrthographicCamera (직교 투영)

거리에 관계없이 동일한 크기로 렌더링됩니다. 2D 게임, CAD, 아이소메트릭 뷰에 적합합니다.

const camera = new THREE.OrthographicCamera(
  -10, 10,   // left, right
  10, -10,   // top, bottom
  0.1, 1000  // near, far
);

5. Material과 조명 시스템

PBR (Physically Based Rendering)

Three.js의 MeshStandardMaterial은 PBR 워크플로우를 지원하여 물리적으로 정확한 렌더링 결과를 제공합니다.

const material = new THREE.MeshStandardMaterial({
  color: 0x8B4513,       // 기본 색상
  metalness: 0.3,        // 금속성 (0: 비금속, 1: 금속)
  roughness: 0.7,        // 거칠기 (0: 매끄러움, 1: 거침)
  map: texture,          // 텍스처 맵
  normalMap: normalTex,  // 노멀 맵 (표면 디테일)
  envMap: envTexture,    // 환경 맵 (반사)
});

주요 조명 유형

// 환경광 — 장면 전체를 균일하게 밝힘
const ambient = new THREE.AmbientLight(0x404040, 0.5);

// 방향광 — 태양처럼 평행한 빛 (그림자 지원)
const directional = new THREE.DirectionalLight(0xffffff, 1);
directional.position.set(5, 10, 5);
directional.castShadow = true;

// 점광원 — 전구처럼 한 점에서 퍼지는 빛
const point = new THREE.PointLight(0xff6600, 1, 50);
point.position.set(0, 5, 0);

6. 지오메트리와 커스텀 메시

내장 지오메트리

Three.js는 다양한 기본 도형을 제공합니다:

new THREE.BoxGeometry(1, 1, 1);           // 정육면체
new THREE.SphereGeometry(1, 32, 32);      // 구
new THREE.CylinderGeometry(0.5, 0.5, 2);  // 원기둥
new THREE.PlaneGeometry(10, 10);          // 평면
new THREE.TorusKnotGeometry(1, 0.3, 100, 16); // 토러스 매듭

BufferGeometry로 커스텀 형상 만들기

성능을 위해 BufferGeometryFloat32Array를 직접 사용할 수 있습니다:

const geometry = new THREE.BufferGeometry();
const vertices = new Float32Array([
  -1, -1, 0,
   1, -1, 0,
   0,  1, 0,
]);
geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3));

외부 3D 모델 로드

실무에서는 Blender 등에서 제작한 모델을 불러오는 경우가 대부분입니다:

import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';

const loader = new GLTFLoader();
loader.load('/models/robot.glb', (gltf) => {
  const model = gltf.scene;
  model.scale.set(0.5, 0.5, 0.5);
  scene.add(model);
});

glTF(.glb/.gltf)는 웹 3D의 사실상 표준 포맷으로, 메시·재질·애니메이션·스켈레톤을 하나의 파일에 담을 수 있습니다.

7. 성능 최적화 전략

3D 웹 애플리케이션에서 성능은 핵심 과제입니다. 주요 최적화 기법을 정리합니다.

Draw Call 최소화

GPU 성능 병목의 대부분은 Draw Call 수에서 발생합니다.

// 같은 지오메트리를 여러 개 배치할 때 — InstancedMesh 사용
const mesh = new THREE.InstancedMesh(geometry, material, 1000);
const dummy = new THREE.Object3D();

for (let i = 0; i < 1000; i++) {
  dummy.position.set(Math.random() * 100, 0, Math.random() * 100);
  dummy.updateMatrix();
  mesh.setMatrixAt(i, dummy.matrix);
}
scene.add(mesh); // 1000개 객체를 단 1회 Draw Call로 렌더링

LOD (Level of Detail)

카메라와의 거리에 따라 디테일 수준을 조절합니다:

const lod = new THREE.LOD();
lod.addLevel(highDetailMesh, 0);    // 가까울 때
lod.addLevel(mediumDetailMesh, 50); // 중간 거리
lod.addLevel(lowDetailMesh, 100);   // 멀 때
scene.add(lod);

기타 최적화 체크리스트

  • 텍스처: 2의 거듭제곱 크기 사용 (512×512, 1024×1024), 필요시 압축 텍스처(Basis/KTX2) 적용.
  • 지오메트리: 불필요한 폴리곤 제거, BufferGeometry 사용 (기본값).
  • 그림자: shadowMap 해상도 적절히 조절, 그림자가 불필요한 객체는 castShadow = false.
  • 렌더러 설정: renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)) 로 레티나 디스플레이 대응.
  • dispose: 사용 완료된 지오메트리·재질·텍스처는 반드시 dispose() 호출하여 GPU 메모리 해제.
// 메모리 누수 방지
geometry.dispose();
material.dispose();
texture.dispose();
renderer.dispose();

8. React와의 통합 — React Three Fiber

React 생태계에서는 React Three Fiber(R3F) 를 통해 선언적으로 Three.js를 사용할 수 있습니다:

import { Canvas } from '@react-three/fiber';
import { OrbitControls, Environment } from '@react-three/drei';

function App() {
  return (
    <Canvas camera={{ position: [0, 5, 10] }}>
      <ambientLight intensity={0.5} />
      <directionalLight position={[5, 10, 5]} />
      <mesh rotation={[0, Math.PI / 4, 0]}>
        <boxGeometry args={[2, 2, 2]} />
        <meshStandardMaterial color="royalblue" />
      </mesh>
      <OrbitControls />
      <Environment preset="sunset" />
    </Canvas>
  );
}

R3F의 장점

  • 선언적 문법: JSX로 3D 장면을 구성하여 React 개발자에게 친숙.
  • React 생태계 호환: 상태 관리(Zustand, Jotai), 라우팅 등과 자연스럽게 통합.
  • 자동 리사이즈/dispose: Canvas 크기 변경 및 메모리 정리를 자동 처리.
  • drei 라이브러리: OrbitControls, Environment, Text3D 등 자주 쓰이는 유틸리티 컴포넌트 모음.

9. 실전 활용 사례

분야 사례 핵심 기술
제품 뷰어 Nike, Apple 등 제품 3D 미리보기 GLTFLoader, OrbitControls, PBR Material
데이터 시각화 3D 차트, 지구본 기반 데이터 맵 BufferGeometry, PointsMaterial, 셰이더
인터랙티브 웹 포트폴리오, 브랜드 사이트 ScrollControls, 애니메이션, 포스트프로세싱
게임 웹 기반 캐주얼 게임 물리 엔진(Cannon.js/Rapier), InstancedMesh
AR/VR WebXR 기반 몰입형 경험 WebXRManager, XR Controllers

10. 프로젝트 시작 가이드

설치 및 기본 세팅

# npm으로 설치
npm install three

# Vite + Three.js 프로젝트 생성
npm create vite@latest my-3d-app -- --template vanilla
cd my-3d-app
npm install three
npm run dev

최소 실행 코드

import * as THREE from 'three';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

// 기본 설정
const scene = new THREE.Scene();
scene.background = new THREE.Color(0x1a1a2e);

const camera = new THREE.PerspectiveCamera(
  75, window.innerWidth / window.innerHeight, 0.1, 1000
);
camera.position.set(3, 3, 3);

const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
renderer.shadowMap.enabled = true;
document.body.appendChild(renderer.domElement);

// 조명
const ambientLight = new THREE.AmbientLight(0xffffff, 0.4);
scene.add(ambientLight);

const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);
directionalLight.position.set(5, 10, 5);
directionalLight.castShadow = true;
scene.add(directionalLight);

// 오브젝트
const cube = new THREE.Mesh(
  new THREE.BoxGeometry(1, 1, 1),
  new THREE.MeshStandardMaterial({ color: 0x6c5ce7, metalness: 0.3, roughness: 0.4 })
);
cube.castShadow = true;
cube.position.y = 0.5;
scene.add(cube);

const floor = new THREE.Mesh(
  new THREE.PlaneGeometry(10, 10),
  new THREE.MeshStandardMaterial({ color: 0x2d3436 })
);
floor.rotation.x = -Math.PI / 2;
floor.receiveShadow = true;
scene.add(floor);

// 컨트롤
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;

// 렌더 루프
function animate() {
  requestAnimationFrame(animate);
  cube.rotation.y += 0.01;
  controls.update();
  renderer.render(scene, camera);
}
animate();

// 리사이즈 대응
window.addEventListener('resize', () => {
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize(window.innerWidth, window.innerHeight);
});

마무리

Three.js는 WebGL의 복잡성을 감추면서도 강력한 3D 그래픽 기능을 제공하는 라이브러리입니다. Scene Graph 기반의 직관적인 객체 모델, PBR 렌더링, 다양한 로더와 유틸리티를 통해 웹에서 고품질 3D 경험을 구현할 수 있습니다.

프론트엔드 개발자라면 React Three Fiber를 통해 기존 워크플로우에 자연스럽게 3D를 통합할 수 있고, 성능 최적화 기법(InstancedMesh, LOD, 텍스처 압축 등)을 적용하면 모바일 환경에서도 안정적인 렌더링이 가능합니다.

참고 자료

반응형
반응형

 

들어가며

Retrieval-Augmented Generation(RAG)은 LLM의 한계를 극복하는 가장 효과적인 패턴 중 하나입니다. LLM이 모르는 최신 정보, 사내 문서, 도메인 특화 지식을 동적으로 제공하여 환각(hallucination)을 줄이고 정확도를 높입니다.

이 글은 LLM-RAG-Study 레포지토리를 바탕으로, RAG의 기초 개념을 정리합니다.

목차

  1. RAG란 무엇인가?
  2. 환경 설정과 빠른 시작
  3. Basic RAG 파이프라인

RAG란 무엇인가?

핵심 개념

RAG는 다음 두 단계로 구성됩니다:

  1. Retrieval (검색): 질의와 관련된 문서를 벡터 DB에서 찾기
  2. Generation (생성): 검색된 문서를 컨텍스트로 LLM에 제공하여 답변 생성

왜 RAG가 필요한가?

LLM 고유의 한계:

문제 LLM만 사용 시 RAG 적용 시
시간적 한계 학습 데이터 시점 이후 정보 모름 (예: 2024년 이후 이벤트) 최신 문서 검색으로 해결
환각 (Hallucination) 모르는 내용을 그럴듯하게 지어냄 실제 문서 기반 응답으로 정확도 향상
도메인 지식 부족 사내 문서, 전문 분야 지식 제한적 자체 지식 베이스 활용
출처 추적 불가 답변의 근거 확인 어려움 검색된 문서 출처 제공 가능

RAG vs Fine-tuning

기준 RAG Fine-tuning
지식 업데이트 실시간 (문서 추가 시) 재학습 필요 (시간·비용 소모)
초기 구축 비용 낮음 높음 (GPU, 데이터 준비)
추론 지연 중간 (검색 오버헤드) 낮음
도메인 적응성 매우 높음 높음 (특정 태스크)
투명성 높음 (출처 확인 가능) 낮음 (블랙박스)

권장 전략: 대부분 RAG로 시작 → 특수 태스크만 Fine-tuning 고려

환경 설정과 빠른 시작

사전 준비

# 레포지토리 클론
git clone https://github.com/Chenjae-kr/LLM-RAG-Study.git
cd LLM-RAG-Study/01-basic-rag

# 가상환경 생성 (Python 3.8+)
python -m venv .venv

# 활성화 (macOS/Linux)
source .venv/bin/activate

# 활성화 (Windows)
.venv\Scripts\activate

# 의존성 설치
pip install -r requirements.txt

최소 요구사항

  • Python: 3.8 이상
  • 메모리: 최소 4GB (임베딩 모델 로딩)
  • 디스크: 최소 2GB (모델 캐시)
  • GPU: 선택사항 (CPU도 가능하지만 느림)

30초 데모

# 1. 샘플 문서 임베딩 (벡터 저장소 생성)
python ingest.py

# 출력 예시:
# Processing documents...
# Embedding 50 chunks...
# Vector store saved to ./vector_store

# 2. 질의 실행
python query_rag.py "인공지능이란 무엇인가요?"

# 출력:
# [Retrieved Context]
# - Document 1: "인공지능(AI)은 컴퓨터 시스템이 인간의 지능을 모방..."
#
# [Generated Answer]
# 인공지능은 기계가 인간처럼 학습하고 추론하는 기술입니다...

Basic RAG 파이프라인

1. 문서 수집 및 전처리 (Ingestion)

ingest.py 핵심 로직:

from pathlib import Path
from sentence_transformers import SentenceTransformer
import numpy as np
from utils import embed_texts, save_vector_store

# 1. 문서 로드
def load_documents(data_dir: str) -> list[str]:
    """텍스트 파일 읽기"""
    documents = []
    for file_path in Path(data_dir).glob("*.txt"):
        with open(file_path, 'r', encoding='utf-8') as f:
            documents.append(f.read())
    return documents

# 2. 청킹 (Chunking)
def chunk_text(text: str, chunk_size: int = 512, overlap: int = 50) -> list[str]:
    """텍스트를 겹치는 청크로 분할"""
    words = text.split()
    chunks = []
    for i in range(0, len(words), chunk_size - overlap):
        chunk = ' '.join(words[i:i + chunk_size])
        chunks.append(chunk)
    return chunks

# 3. 임베딩 생성
def main():
    documents = load_documents("./data")

    # 모든 문서를 청크로 분할
    all_chunks = []
    for doc in documents:
        all_chunks.extend(chunk_text(doc))

    print(f"Total chunks: {len(all_chunks)}")

    # 임베딩 모델 로드 (384차원)
    embeddings = embed_texts(all_chunks, model_name="all-MiniLM-L6-v2")

    # 벡터 저장소에 저장
    save_vector_store(embeddings, all_chunks, "./vector_store")
    print("✓ Vector store created successfully")

if __name__ == "__main__":
    main()

청킹 전략 비교:

방법 장점 단점 권장 사용처
고정 크기 구현 간단, 빠름 문맥 경계 무시 구조화된 문서
문장 단위 문맥 보존 크기 불균일 자연어 텍스트
의미 기반 의미적 일관성 높음 느림, 복잡 고품질 요구 시

권장 설정:

chunk_size = 512      # 토큰 수 (약 300-400단어)
overlap = 50          # 10% 중첩으로 문맥 연결

2. 벡터 검색 (Retrieval)

utils.py의 검색 함수:

import numpy as np
from sentence_transformers import SentenceTransformer

def search(query: str, vector_store_path: str, top_k: int = 3):
    """코사인 유사도 기반 검색"""
    # 1. 벡터 저장소 로드
    embeddings, chunks = load_vector_store(vector_store_path)

    # 2. 질의 임베딩
    model = SentenceTransformer("all-MiniLM-L6-v2")
    query_embedding = model.encode([query])[0]

    # 3. 코사인 유사도 계산
    similarities = np.dot(embeddings, query_embedding) / (
        np.linalg.norm(embeddings, axis=1) * np.linalg.norm(query_embedding)
    )

    # 4. 상위 K개 반환
    top_indices = np.argsort(similarities)[-top_k:][::-1]
    results = [(chunks[i], similarities[i]) for i in top_indices]

    return results

검색 품질 개선 팁:

  1. top_k 조정: 3-5개 권장 (너무 많으면 노이즈 증가)
  2. 유사도 임계값: 0.5 이하 결과는 필터링 고려
  3. 재랭킹: Cross-Encoder로 2차 정렬 (후술)

3. 프롬프트 구성 및 생성 (Generation)

query_rag.py:

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
from utils import search

def generate_answer(query: str, context: list[str], model_name: str = "google/flan-t5-small"):
    """컨텍스트 기반 답변 생성"""
    # 1. 검색 결과를 프롬프트로 구성
    context_text = "\n\n".join([f"[{i+1}] {text}" for i, text in enumerate(context)])

    prompt = f"""다음 문서를 참고하여 질문에 답하세요.

문서:
{context_text}

질문: {query}

답변:"""

    # 2. 모델 로드 및 생성
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    model = AutoModelForSeq2SeqLM.from_pretrained(model_name)

    inputs = tokenizer(prompt, return_tensors="pt", max_length=1024, truncation=True)
    outputs = model.generate(**inputs, max_new_tokens=256)

    answer = tokenizer.decode(outputs[0], skip_special_tokens=True)
    return answer

# 메인 실행
if __name__ == "__main__":
    query = "인공지능의 주요 응용 분야는?"

    # 검색
    results = search(query, "./vector_store", top_k=3)
    contexts = [text for text, score in results]

    # 출력: 검색된 문서
    print("=== Retrieved Documents ===")
    for i, (text, score) in enumerate(results):
        print(f"\n[{i+1}] (Score: {score:.3f})")
        print(text[:200] + "...")

    # 생성
    answer = generate_answer(query, contexts)
    print("\n=== Generated Answer ===")
    print(answer)

프롬프트 엔지니어링 팁:

# ❌ 나쁜 프롬프트
prompt = f"{context}\n\n{query}"

# ✅ 좋은 프롬프트
prompt = f"""당신은 정확한 답변을 제공하는 전문가입니다.
주어진 문서에만 기반하여 답변하세요. 확실하지 않으면 "문서에 정보가 없습니다"라고 답하세요.

문서:
{context}

질문: {query}

답변 (문서 기반):"""
반응형
반응형


목차

  1. AionUi란 무엇인가?
  2. 주요 기능
  3. 시스템 요구사항
  4. 설치 방법
  5. 초기 설정
  6. 핵심 기능 활용

AionUi란 무엇인가?

AionUi는 무료, 로컬, 오픈소스 24/7 AI 협업 플랫폼입니다. Gemini CLI, Claude Code, Codex, Qwen Code, Goose CLI, Auggie 등 다양한 커맨드라인 AI 도구들을 통합하여 사용할 수 있는 그래픽 인터페이스를 제공합니다.

🎯 핵심 가치

AionUi는 단순히 CLI 도구의 GUI 래퍼가 아닙니다. 마치 Claude Cowork가 Claude Code를 더 쉽게 사용할 수 있게 만든 것처럼, AionUi는 모든 커맨드라인 AI 도구를 위한 통합 Cowork 플랫폼입니다.

📊 Claude Cowork vs AionUi

구분 Claude Cowork AionUi
지원 OS macOS만 지원 macOS, Windows, Linux 모두 지원
모델 지원 Claude만 Gemini, Claude, DeepSeek, OpenAI, Ollama 등
인터페이스 GUI GUI + WebUI 원격 접속
비용 $100/월 구독 완전 무료 & 오픈소스
데이터 보안 클라우드 로컬 저장 (SQLite)

✨ 왜 AionUi를 선택해야 할까?

커맨드라인 도구들(Gemini CLI, Claude Code, Codex, Qwen Code 등)은 강력하지만 공통적인 불편함이 있습니다:

  • ❌ 대화 내용을 저장할 수 없음
  • ❌ 단일 세션만 지원
  • ❌ 파일 작업이 번거로움
  • ❌ 하나의 모델만 사용 가능

AionUi는 이러한 모든 문제를 해결합니다:

  • 통합 플랫폼 - 하나의 인터페이스로 모든 CLI AI 도구 관리
  • 다중 도구 지원 - Gemini CLI 내장 + 다양한 도구 자동 인식
  • 크로스 플랫폼 - macOS, Windows, Linux 완벽 지원
  • 원격 접속 - 24/7 어디서나 접속 가능
  • 다중 모델 전환 - 하나의 인터페이스에서 여러 모델 유연하게 사용
  • 실시간 미리보기 - 9가지 이상 포맷 지원
  • 로컬 데이터 보안 - 모든 데이터를 로컬에 저장

주요 기능

🤖 1. 멀티 에이전트 모드

여러 CLI AI 도구를 통합 GUI로 관리

AionUi는 Gemini CLI를 내장하고 있어 설치 후 바로 사용할 수 있습니다. 이미 Gemini CLI, Claude Code, CodeX, Qwen Code, Goose AI, Augment Code 등을 설치한 경우 자동으로 감지하여 통합 인터페이스를 제공합니다.

주요 특징:

  • ✅ 자동 감지 + 통합 인터페이스
  • ✅ 로컬 저장 + 다중 세션 지원
  • ✅ 각 세션은 독립적인 컨텍스트 유지

🌐 2. 어디서나 접속 가능

24/7 AI 어비스턴트 - 어떤 기기에서든 접속!

출장 중, 집, 사무실 어디서나 WebUI 또는 다양한 채팅 플랫폼을 통해 AI 도구를 사용할 수 있습니다.

지원 접속 방법:

🌐 WebUI 모드

  • 브라우저를 통해 어떤 기기에서든 접속 (폰, 태블릿, 컴퓨터)
  • LAN, 크로스 네트워크, 서버 배포 지원
  • QR 코드 스캔 또는 계정/비밀번호로 로그인

📱 채팅 플랫폼 통합

  • Telegram - 텔레그램에서 AI 어시스턴트와 직접 대화
  • Lark (Feishu) - 페이슈 봇을 통한 엔터프라이즈 협업
  • Slack 및 기타 플랫폼 곧 지원 예정 🚧

💡 설정 방법: AionUi 설정 → WebUI 설정 → 채널에서 Bot Token 설정!

⏰ 3. 예약 작업

AI가 자동으로 작업을 실행하도록 설정

예약 작업을 설정하면 AI 어시스턴트가 설정한 시간에 자동으로 작업을 실행합니다.

특징:

  • 자연어 대화 - AI에게 일상적인 언어로 작업 지시
  • 유연한 시간 설정 - 매일, 매주, 매월 모두 가능
  • 간단한 관리 - 생성, 수정, 활성화/비활성화, 삭제, 조회 자유롭게

활용 사례:

  • 예약된 데이터 수집
  • 정기 보고서 생성
  • 자동 파일 정리
  • 예약 알림

📁 4. 스마트 파일 관리

배치 이름 변경, 자동 정리, 스마트 분류, 파일 병합

  • 자동 정리: 콘텐츠를 지능적으로 식별하고 자동 분류
  • 효율적인 배치 작업: 원클릭으로 이름 변경, 파일 병합

📄 5. 미리보기 패널

AI 생성 결과를 즉시 확인

9가지 이상 포맷의 시각적 미리보기 지원 (PDF, Word, Excel, PPT, 코드, Markdown, 이미지, HTML, Diff 등)

특징:

  • 즉시 결과 확인 - AI가 파일 생성 후 앱 전환 없이 바로 미리보기
  • 실시간 추적 + 편집 가능 - 파일 변경 자동 추적, Markdown/코드/HTML 실시간 편집 지원

🎨 6. AI 이미지 생성 & 편집

지능형 이미지 생성, 편집, 인식 (Gemini 기반)

  • 다양한 이미지 생성 모델 지원
  • AI 기반 이미지 분석 및 편집 기능

🤖 7. 다중 모델 지원

주류 모델 및 로컬 모델 지원

  • Gemini, OpenAI, Claude, Qwen 등 주류 모델
  • Ollama, LM Studio 등 로컬 모델
  • 다양한 작업 요구사항에 맞춰 모델 유연하게 전환

🛠️ 8. AI 어시스턴트 & 스킬 생태계

10가지 이상의 전문 어시스턴트 내장

  • 🤝 Cowork - 자율 작업 실행
  • 📊 PPTX Generator - PPTX 프레젠테이션 생성
  • 📄 PDF to PPT - PDF를 PPT로 변환
  • 🎮 3D Game - 단일 파일 3D 게임 생성
  • 🎨 UI/UX Pro Max - 전문 UI/UX 디자인
  • 📋 Planning with Files - 파일 기반 복잡한 작업 계획
  • 🧭 HUMAN 3.0 Coach - 개인 개발 코치
  • 📣 Social Job Publisher - 채용 공고 게시
  • 그 외 다수

커스텀 스킬: skills/ 디렉토리에서 스킬 생성 및 관리 가능

🎨 9. 개인화된 인터페이스 커스터마이징

CSS 코드로 자신만의 인터페이스 만들기

  • 완전 커스터마이징 - CSS를 통해 인터페이스 색상, 스타일, 레이아웃 자유롭게 변경

💬 10. 다중 작업 병렬 처리

여러 대화를 동시에 열고 독립적인 메모리 유지

  • 작업이 섞이지 않음
  • 효율성 2배 증가

시스템 요구사항

💻 지원 플랫폼

운영체제 최소 버전
macOS 10.15 이상
Windows Windows 10 이상
Linux Ubuntu 18.04+ / Debian 10+ / Fedora 32+

💾 하드웨어 요구사항

  • 메모리: 4GB 이상 권장
  • 저장공간: 최소 500MB 이상 여유 공간

설치 방법

방법 1: 직접 다운로드 (권장)

1단계: 최신 릴리스 다운로드

GitHub Releases 페이지에서 운영체제에 맞는 설치 파일을 다운로드합니다.

파일 선택 가이드:

운영체제 다운로드 파일
macOS (Intel) AionUi-{version}-x64.dmg
macOS (Apple Silicon) AionUi-{version}-arm64.dmg
Windows AionUi-{version}-setup.exe
Linux (Debian/Ubuntu) AionUi-{version}-amd64.deb
Linux (RedHat/Fedora) AionUi-{version}-x86_64.rpm

2단계: 설치 진행

macOS:

# DMG 파일을 다운로드한 후
1. DMG 파일을 더블클릭하여 열기
2. AionUi 아이콘을 Applications 폴더로 드래그
3. Applications 폴더에서 AionUi 실행

Windows:

# EXE 파일을 다운로드한 후
1. 설치 파일을 더블클릭하여 실행
2. 설치 마법사의 지시를 따라 진행
3. 설치 완료 후 바탕화면 아이콘 또는 시작 메뉴에서 실행

Linux (Debian/Ubuntu):

# DEB 파일 설치
sudo dpkg -i AionUi-{version}-amd64.deb

# 의존성 문제 해결 (필요시)
sudo apt-get install -f

# 실행
aionui

Linux (RedHat/Fedora):

# RPM 파일 설치
sudo rpm -i AionUi-{version}-x86_64.rpm

# 또는 dnf 사용
sudo dnf install AionUi-{version}-x86_64.rpm

# 실행
aionui

방법 2: Homebrew 설치 (macOS만)

# AionUi 설치
brew install aionui

# 실행
aionui

💡 참고: Homebrew 방식은 macOS에서만 사용 가능합니다.


초기 설정

1단계: 첫 실행

AionUi를 처음 실행하면 환영 화면이 나타납니다.

2단계: AI 서비스 설정

AionUi는 Gemini CLI를 내장하고 있어 추가 설치 없이 바로 사용할 수 있습니다!

옵션 A: Google 계정으로 로그인 (권장)

  1. 설정(⚙️) → LLM Configuration 클릭
  2. Google Account 선택
  3. Sign in with Google 버튼 클릭
  4. 브라우저에서 Google 계정 로그인
  5. AionUi 접근 권한 승인

옵션 B: API Key 사용

  1. 설정(⚙️) → LLM Configuration 클릭
  2. 사용하려는 AI 플랫폼 선택
    • Gemini
    • OpenAI
    • Claude
    • Qwen
    • 또는 Custom (로컬 모델용)
  3. API Key 입력
  4. Save 버튼 클릭

API Key 발급 방법:

플랫폼 API Key 발급 링크
Gemini Google AI Studio
OpenAI OpenAI Platform
Claude Anthropic Console
Qwen Alibaba Cloud

3단계: 첫 대화 시작

설정이 완료되면:

  1. 메인 화면에서 New Chat 버튼 클릭
  2. 사용할 모델 선택
  3. 메시지 입력 후 전송!

핵심 기능 활용

📁 파일 관리

파일 업로드

방법 1: 드래그 앤 드롭

1. 파일 탐색기에서 파일 선택
2. AionUi 채팅 창으로 드래그
3. 자동으로 업로드 및 컨텍스트에 추가

방법 2: 파일 선택

1. 채팅 창 하단의 📎 (클립) 아이콘 클릭
2. 파일 선택 대화상자에서 파일 선택
3. 업로드 완료

파일 자동 정리

사용자: "Downloads 폴더의 파일들을 종류별로 정리해줘"

AI가 자동으로:
1. 파일 분석
2. 카테고리별 폴더 생성
3. 파일 이동 및 정리
4. 결과 리포트 제공

배치 이름 변경

사용자: "이 폴더의 모든 이미지 파일 이름을 'product_001.jpg' 형식으로 변경해줘"

AI가 자동으로:
1. 폴더 내 이미지 파일 검색
2. 순차적으로 이름 변경
3. 결과 확인

📄 미리보기 활용

지원 포맷

포맷 확장자 기능
문서 PDF, DOCX, PPTX, XLSX 읽기 전용 미리보기
코드 JS, TS, PY, JAVA, 등 구문 강조 + 실시간 편집
마크다운 MD 렌더링 뷰 + 실시간 편집
HTML, CSS 브라우저 미리보기 + 실시간 편집
이미지 PNG, JPG, GIF, SVG 이미지 뷰어
Diff - 변경사항 비교

실시간 편집 예제

사용자: "간단한 HTML 페이지를 만들어줘"

AI가 HTML 파일 생성 후:
1. 미리보기 패널이 자동으로 열림
2. 왼쪽: 코드 에디터
3. 오른쪽: 브라우저 미리보기
4. 코드 수정 시 실시간으로 미리보기 업데이트

🎨 이미지 생성

기본 사용법

사용자: "석양이 지는 바다 풍경을 그려줘"

AI가 자동으로:
1. 프롬프트 최적화
2. 이미지 생성
3. 결과 표시
4. 파일로 저장 옵션 제공

이미지 편집

사용자: "이 이미지에서 배경을 하늘색으로 바꿔줘"
[이미지 업로드]

AI가 자동으로:
1. 이미지 분석
2. 배경 색상 변경
3. 수정된 이미지 생성
4. 결과 비교 표시

⏰ 예약 작업 설정

작업 생성

1. 설정(⚙️) → Scheduled Tasks 클릭
2. "New Task" 버튼 클릭
3. 작업 내용 입력
   예: "매일 오전 9시에 GitHub 트렌딩 저장소 5개를 요약해서 이메일로 보내줘"
4. 실행 시간 설정
5. "Save" 버튼 클릭

작업 관리

  • 활성화/비활성화: 토글 스위치로 간단히 제어
  • 수정: 작업 클릭 후 "Edit" 버튼
  • 삭제: 작업 클릭 후 "Delete" 버튼
  • 로그 확인: 작업 실행 기록 및 결과 확인

🌐 WebUI 원격 접속

로컬 네트워크 접속

1. 설정(⚙️) → WebUI Settings 클릭
2. "Enable WebUI" 토글 활성화
3. 접속 URL 확인
   예: http://192.168.1.100:3000
4. 같은 네트워크의 다른 기기에서 브라우저로 접속

인터넷 접속 (고급)

외부 네트워크에서 접속하려면:

  1. 포트 포워딩 설정 (라우터에서)
    • 외부 포트: 8080
    • 내부 포트: 3000
    • 내부 IP: AionUi가 실행 중인 컴퓨터 IP
  2. DDNS 설정 (동적 IP인 경우)
    • No-IP, DuckDNS 등의 서비스 이용
  3. 접속
    • http://your-ddns-domain:8080

⚠️ 보안 경고: 인터넷 접속 시 반드시 강력한 비밀번호를 설정하세요!

Telegram 연동

1. Telegram에서 @BotFather 찾기
2. /newbot 명령으로 새 봇 생성
3. Bot Token 복사
4. AionUi 설정(⚙️) → WebUI Settings → Channel
5. Telegram 섹션에서 Bot Token 입력
6. "Connect" 버튼 클릭
7. Telegram에서 봇과 대화 시작!

 

 

 

# 참고 사이트

https://github.com/iOfficeAI/AionUi

 

GitHub - iOfficeAI/AionUi: Free, local, open-source 24/7 Cowork and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen

Free, local, open-source 24/7 Cowork and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it! - iOfficeAI/AionUi

github.com

 

반응형
반응형

 

AI 발전, 정말 둔화되고 있을까?

벤치마크의 함정

최근 GPT나 제미니 같은 AI 모델의 성능에 대한 의구심과 더불어, AI 발전 속도가 둔화된 것이 아니냐는 시선도 있습니다. 그러나 이는 벤치마크의 포화 상태 때문인 착시 현상입니다.

AI가 이미 100점짜리 시험에서 만점을 받고 있기 때문에, 더 발전하더라도 점수로는 표현되지 않는 것입니다. 실제 AI는 더 복잡하고 어려운 현실 문제를 해결하며 끊임없이 성장하고 있습니다.

놀라운 성장 지표

특히 미터(MITRE) 조직의 연구에 따르면, AI가 독립적으로 해결할 수 있는 유효 작업 시간은 매 7개월마다 두 배로 길어지고 있습니다. 이는 반도체 발전 속도를 훨씬 뛰어넘는 놀라운 성장세입니다.

더욱 충격적인 것은 코딩 분야입니다. AI의 코딩 실력이 두 배로 향상되는 '더블링 타임'은 고작 70일에 불과합니다. 이는 인간 개발자가 수년 동안 쌓는 숙련도를 AI는 단 두 달 남짓 만에 달성할 수 있음을 의미합니다.

💡 핵심 인사이트: AI는 깃털처럼 가벼운 과제를 넘어 거대한 바위를 옮기는 것처럼 무거운 현실 문제를 지탱할 수 있는 기초 체력을 갖추고 있습니다.


새로운 무기: 지능형 빌딩 블록

레고처럼 조립하는 시대

우리는 지금 과거에 본 적 없던 두 개의 거대한 무기를 손에 쥐었습니다:

  1. 더 강력해진 지능
  2. 더 빨라진 속도

이제 누구나 AI 빌딩 블록 덕분에 압도적인 소프트웨어를 손쉽게 만들 수 있게 되었습니다. 복잡한 코드를 한 줄 한 줄 짜는 대신, 이미 완성된 지능형 레고 블록을 조립하는 시대가 온 것입니다.

주요 AI 빌딩 블록

  • 거대 언어 모델 (LLM)
  • 검색 증강 생성 (RAG)
  • 에이전틱 워크플로
  • 음성 AI
  • 딥러닝

흥미로운 점은 LLM들이 딥러닝에 대해 이미 박사급 연구원 수준의 깊은 이해도와 구현 능력을 갖추고 있다는 사실입니다.

개인이 가능해진 일들

이제 여러분은 거대 기업이나 엘리트 개발팀조차 1년 전에는 엄두도 못 냈던 일들을 혼자서 해낼 수 있게 됐습니다. 과거 수백 명의 박사급 엔지니어가 필요했던 나사 프로젝트 같은 거대 과업도 이제는 방구석에서 랩탑 하나로 지휘하고 완성할 수 있습니다.


도구의 최전선을 놓치지 마라

미친 속도의 진화

AI 코딩 도구들은 자고 일어나면 세상이 바뀔 정도로 미친 듯이 발전하고 있습니다. 예를 들어:

  • 앤트로픽의 클로드 코드
  • OpenAI의 GPT-5 O3 모델
  • 구글의 제미나이 3

이들은 단순히 업데이트가 아닌 명백한 종의 진화에 가까운 거대 도약을 이루어냈습니다.

3개월의 법칙

최고의 도구는 3개월, 길어도 6개월마다 바뀔 것입니다. 이 무자비한 도구의 세계에서 단 반 세대, 즉 3개월만 뒤처져도 생산성은 회복 불가능할 정도로 치명적으로 떨어질 것입니다.

⚠️ 경고: 익숙함에 속아 뒤처진 도구를 고집하지 말고 항상 최신 도구를 갈아타는 유연함만이 대체 불가능한 존재가 될 유일한 생존 열쇠입니다.


새로운 병목: 기술이 아닌 결정

제품 관리의 시대

지금 우리 손에는 더 강력한 소프트웨어를 훨씬 더 빨리 만들 수 있는 힘이 주어졌습니다. 하지만 이 엄청난 속도 뒤에는 기묘한 역설이 숨어 있습니다.

실리콘 밸리의 현장 고수들은 이미 뼈저리게 느끼고 있지만 대중에게는 잘 알려지지 않은 불편한 진실은 바로 기술이 아니라 '결정'이 발목을 잡는 제품 관리의 병목 현상입니다.

진짜 문제는 무엇을 만들 것인가

이제 잘된 기획안을 던져주면 AI가 실제 코드로 바꾸는 것은 식은 죽 먹기보다 쉬워졌습니다. 진짜 문제는:

  • '도대체 무엇을 만들 것인가'라는 근본적인 질문
  • 그 아이디어를 AI가 오해 없이 실행할 수 있도록 명확한 의도로 번역해내는 능력

현장 소장이 되어라

이제 여러분은 벽돌을 나르는 인부가 아니라 건축 결과를 평가하는 현장 소장이 된 것입니다. AI가 순식간에 지어 올린 결과물을 보고 사용자 피드백을 반영하여 설계도를 수정하고 재건축을 반복하며, 결국 사용자들이 살고 싶어 하는 완벽한 꿈의 집을 완성해 나가는 일, 이것이 바로 AI 시대의 창작입니다.


PM과 엔지니어의 비율 역전

무너지는 황금 비율

최근 실리콘 밸리 테크 기업에서 목격한 기이한 현상은 엔지니어와 제품 관리자(PM)의 인력 비율이 급격히 무너지고 있다는 점입니다.

전통적 비율 현재 추세
PM 1명 : 엔지니어 6-8명 PM 1명 : 엔지니어 1명
(황금 비율) 심지어 PM 2명 : 엔지니어 1명

속도의 불균형

AI 코딩 덕분에 엔지니어링 속도가 우주선처럼 날아가는데, 무엇을 만들지 결정하는 인간의 제품 관리 속도는 여전히 자전거를 타고 있습니다.


프로덕트 엔지니어가 되어라

공감하는 엔지니어의 부상

저는 현장에서 사용자와 대화하는 법을 익히고 피드백을 빨아들이며 깊이 공감할 줄 아는 엔지니어들이 무섭게 치고 올라오는 모습을 보고 있습니다.

이들은:

  • 더 이상 기획서가 내려오길 기다리지 않음
  • 사용자의 마음을 읽어 스스로 무엇을 만들지 결정
  • 최고의 코딩 실력보다 공감 능력으로 승부

두 능력의 통합

🎯 핵심 조언: 직접 코드를 짜는 구현 능력과 사용자와 대화하며 제품을 비전하는 기획 능력, 이 두 능력을 하나로 통합한 '프로덕트 엔지니어'만이 AI 시대에 살아남을 수 있습니다.

누군가 완성된 기획서를 가져다주길 기다리지 말고, 여러분이 직접 코드를 짜고 다음에 무엇을 할지에 대한 직관을 믿고 결과물을 다듬어 나간다면 상상이 즉시 현실이 되는 압도적인 창조의 희열을 맛보게 될 것입니다.


동료가 모든 것을 결정한다

가장 강력한 예측 변수

여러분이 앞으로 얼마나 빠르게 배우고 성공을 거둘지 알 수 있는 가장 강력한 예측 변수는:

  • ❌ 지능
  • ❌ 노력
  • 지금 여러분 곁에 어떤 사람들을 두고 있느냐

환경의 힘

흥미로운 사회학 연구 결과처럼, 가장 가까운 친구 다섯 명이 흡연자라면 여러분도 흡연자가 될 확률이 높습니다. 이는 환경의 영향력이 생각보다 훨씬 더 강력하다는 것을 보여줍니다.

가까운 친구 여럿이 치열하게 일하고 단호하게 결정하며 빛의 속도로 학습하고 AI로 세상을 바꾸려는 사람들이라면, 여러분 또한 그렇게 될 확률이 높습니다.


연결 조직의 힘

스탠포드의 비밀

전 세계가 주목하는 프런티어 랩의 내부를 들여다보면 마치 스탠포드 동문회와 같습니다:

  • GPT의 주역들
  • 테슬라 자율주행의 아버지
  • 앤트로픽을 이끄는 다리오 아모데이

그들의 커리어를 거슬러 올라가면 스탠포드 강의실이나 구글 브레인 연구실과 연결됩니다.

정보의 속도

세상을 뒤흔들 핵심 정보는 결코 여러분의 모니터 위나 구글 검색창에 먼저 나타나지 않습니다.

아침 뉴스나 X에서 접하는 정보들은 실리콘 밸리의 거물들이 새벽 2시에 주고받은 비밀스러운 텔레그램이나 통화를 통해 이미 단물이 빠진 지식의 부스러기일 뿐입니다.

📞 승패는 논문이 인쇄되기도 전 작동 여부를 묻는 짧은 전화 한 통에서 결정됩니다.


회사가 아닌 동료를 선택하라

화려한 브랜드의 함정

이제 여러분의 커리어 다음 행보를 결정하거나 회사 이직을 고민할 때, 성공을 결정짓는 것은 회사 이름표가 아닙니다.

그보다 훨씬 더 본질적인 매일 아침 눈을 떠서 밤늦게까지 살을 맞대며 일하게 될 '동료들'이 누구냐는 것입니다.

실제 사례

몇 년 전 스탠포드의 한 학생이 유명 빅테크 기업에 입사 제안을 받았지만, 회사는 그가 어떤 팀에서 일하게 될지 끝까지 말해주지 않았습니다.

그는 화려한 이름표를 믿고 계약했지만, AI 연구실이 아니라 지하 3층 레거시 자바 결제 처리 시스템 팀에 배정되었습니다. 이는 AI 최전선을 꿈꾸던 천재적인 머신러닝 전공자에게는 커리어 사형 선고나 다름없었습니다.

실용적 조언

만약 어떤 회사가 여러분이 배정될 팀과 매니저를 끝까지 숨긴다면 도망치십시오.

정말 좋은 팀과 프로젝트라면 왜 숨기겠습니까?

가장 핫한 브랜드라는 이름의 파티에 참석하는 대신, 때로는 회사의 로고가 그리 매력적이지 않더라도 진짜 실력자들이 모여 세상을 바꿀 일을 고민하는 '진짜배기 팀'을 찾아내십시오.


책임감과 허락받지 않는 혁신

책임감이라는 안전벨트

지금은 그 어느 때보다 강력한 소프트웨어를 쉽고 빠르게 만들 수 있는 시대이므로, 여러분에게 반드시 '책임감'을 가져야 한다는 의무가 생겼습니다.

사람을 해치는 소프트웨어는 만들지 마십시오.

엄청난 기회

동시에 여러분 각자가 세상에 내놓을 수 있는 결과물은 무궁무진합니다. 세상에는 해결을 기다리는 수많은 아이디어가 넘쳐나지만, 그것을 실제로 구현해 낼 엔지니어는 여전히 턱없이 부족합니다.

지금 세상에는 여러분이 직접 에이전트가 되어서 만들지 않으면 영영 세상에 나오지 못할 가치 있는 프로젝트들이 도처에 널려 있습니다.

허락받지 않는 혁신

팀장 승인, 교수의 허락, 투자 결정 같은 것은 필요 없습니다. '허락받지 않는 혁신', 그것이 바로 코딩이 우리에게 준 특권입니다.

지금은 실패 비용이 역사상 가장 저렴한 시대입니다. 설령 거창하게 시도했다가 망하더라도 잃는 것은 넷플릭스를 볼 수 있었던 주말 이틀뿐입니다.


지독한 노력의 가치

논란이 될 수 있는 조언

열심히 일하라고 독려하는 일이 마치 PC주의에 어긋난 일처럼 여겨지는 시대입니다. 하지만 저는 여러분께 감히 말씀드리고 싶습니다.

제발 지독할 정도로 열심히 일하십시오.

이해와 존중

물론 건강이나 환경 등의 이유로 지독하게 열심히 일하고 싶어도 그럴 수 없는 처지에 놓이는 때가 있습니다. 그분들이 지금 당장 전력 질주하지 못한다고 해서 그 가치가 훼손되지는 않으며, 우리는 그들을 마땅히 존중하고 지지하며 보살펴야 합니다.

변치 않는 진실

그럼에도 불구하고 제가 지켜본 수많은 성공한 제자들 중 단 한 명의 예외도 없이 믿을 수 없을 만큼 지독하게 일했다는 사실은 변치 않습니다.

모두가 잠든 새벽 2시, 정막한 연구실 모니터 앞에 홀로 앉아 모델의 하이퍼 파라미터 수치를 튜닝하며 밤새 씨름하던 그 고독하지만 위대한 시간 말입니다.

2026년의 선택

만약 제가 지금 2026년에 여러분이라면, 소파와 한 몸이 되어 넷플릭스 알고리즘이 떠먹여 주는 도파민에 주말을 헌납하는 대신, 그 주말을 전부 쏟아부어 나를 위해 일해 줄 에이전트 코더를 직접 설계하는 쪽을 택하겠습니다.


핵심 요약

생존을 위한 7가지 원칙

  1. 최신 도구를 놓치지 마라 - 3개월마다 바뀌는 도구의 최전선을 따라가라
  2. 프로덕트 엔지니어가 되어라 - 코딩과 제품 기획 능력을 통합하라
  3. 동료를 신중히 선택하라 - 회사 이름이 아닌 함께 일할 사람이 중요하다
  4. 연결 조직을 구축하라 - 네트워크가 여러분의 성장 속도를 결정한다
  5. 제품 관리 능력을 키워라 - 기술이 아닌 '무엇을 만들 것인가'가 병목이다
  6. 허락받지 말고 만들어라 - 책임감만 갖춘다면 누구의 허락도 필요 없다
  7. 지독하게 노력하라 - 예외 없이 모든 성공한 이들은 엄청나게 일했다

황금기의 메시지

저는 지금이 무언가를 만들어내려는 사람들에게 역사상 유례없는 골드러시, 즉 최고의 황금기라고 확신합니다.

AI가 독립적으로 해결할 수 있는 유효 작업 시간은 매 7개월마다 두 배로 길어지고 있으며, 코딩 실력의 더블링 타임은 고작 70일입니다.

이제 여러분은 거대 기업이나 엘리트 개발팀조차 1년 전에는 엄두도 못 냈던 일들을 혼자서 해낼 수 있게 됐습니다.


마치며

이것이 오늘 제가 여러분께 전하고 싶었던 이야기의 전부입니다.

지금 이 순간, 여러분 손에는 세상을 바꿀 수 있는 도구가 있습니다. 문제는 기술이 아닙니다. 문제는 여러분이 무엇을 만들 것인지, 누구와 함께 할 것인지, 그리고 얼마나 진지하게 임할 것인지입니다.

책임감을 갖되 멈추지 말고 시도하십시오. 닥치는 대로 많은 것을 만들어 보십시오.

이것이 바로 여러분의 커리어를 확실하게 밀어 올릴 첫 번째 조언입니다.


본 글은 스탠포드 컴퓨터 사이언스 강연을 기반으로 작성되었습니다.

반응형
반응형

들어가며

Claude Code는 Anthropic의 Claude AI를 터미널에서 직접 사용할 수 있는 강력한 CLI 도구입니다. 코드 작성, 파일 편집, 디버깅, 프로젝트 분석 등을 대화형으로 수행할 수 있으며, IDE와 통합하여 효율적인 개발 워크플로우를 구축할 수 있습니다.

이 가이드는 Claude Code의 설치부터 초기 설정, 주요 기능, 그리고 기본적인 사용법까지 다룹니다.

 

 

목차

  1. Claude Code란 무엇인가?
  2. 시스템 요구사항
  3. 설치 방법
  4. 초기 설정 및 인증
  5. 기본 사용법

 

 

Claude Code란 무엇인가?

핵심 기능

Claude Code는 다음과 같은 강력한 기능을 제공합니다:

기능 설명
코드 생성 자연어 지시로 코드 작성
파일 편집 기존 파일을 읽고 수정
프로젝트 분석 코드베이스 전체 탐색 및 이해
버그 수정 오류 진단 및 해결책 제시
리팩토링 코드 개선 및 최적화
테스트 작성 자동 테스트 코드 생성
문서화 README, 주석, API 문서 작성
터미널 명령 Git, npm, Docker 등 실행

Claude Code vs 다른 AI 코딩 도구

도구 장점 단점
Claude Code 강력한 추론 능력, 긴 컨텍스트, 파일 편집 CLI 기반 (UI 없음)
GitHub Copilot IDE 통합 우수 짧은 컨텍스트, 단순 자동완성 중심
Cursor 전용 IDE, 시각적 유료 구독, 에디터 제한
ChatGPT 웹 기반, 접근 쉬움 파일 직접 편집 불가

시스템 요구사항

최소 요구사항

  • 운영체제:
    • macOS 10.15 (Catalina) 이상
    • Linux (Ubuntu 18.04+, Debian 10+, Fedora 30+)
    • Windows 10/11 (WSL2 권장)
  • Node.js: 18.0 이상 (20.x 권장)
  • 메모리: 최소 4GB RAM
  • 디스크: 500MB 여유 공간
  • 네트워크: 인터넷 연결 (API 호출용)

권장 환경

  • 터미널: iTerm2 (macOS), Windows Terminal, Alacritty
  • : Bash, Zsh, Fish
  • 에디터: VS Code, Neovim, Vim

 

 

설치 방법

방법 1: npm으로 설치 (권장)

npm을 통한 설치가 가장 간단하고 안정적입니다.

# 1. Node.js 버전 확인
node --version
# v20.x.x 이상이어야 함

# 2. Claude Code 전역 설치
npm install -g @anthropic-ai/claude-code

# 3. 설치 확인
claude --version
# 출력: claude-code v1.x.x

설치 중 권한 오류 발생 시:

# macOS/Linux: sudo 사용
sudo npm install -g @anthropic-ai/claude-code

# 또는 nvm 사용 (권장)
# nvm으로 설치한 Node.js는 권한 문제 없음

방법 2: npx로 임시 실행

설치 없이 바로 사용하고 싶다면:

# 설치 없이 실행
npx @anthropic-ai/claude-code

# 매번 최신 버전 사용
npx @anthropic-ai/claude-code@latest

장점:

  • 설치 불필요
  • 항상 최신 버전 사용

단점:

  • 실행할 때마다 다운로드 (느림)
  • 로컬 설정 유지 어려움

방법 3: 소스에서 빌드

개발자이거나 최신 개발 버전을 사용하려면:

# 1. 레포지토리 클론
git clone https://github.com/anthropics/claude-code.git
cd claude-code

# 2. 의존성 설치
npm install

# 3. 빌드
npm run build

# 4. 전역 링크
npm link

# 5. 실행 확인
claude --version

Windows 설치 (WSL2)

Windows에서는 WSL2 사용을 강력히 권장합니다:

# PowerShell에서 WSL2 설치
wsl --install

# Ubuntu 재시작 후 WSL 터미널에서
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
npm install -g @anthropic-ai/claude-code

네이티브 Windows (실험적):

# Node.js 설치 (https://nodejs.org/)
# PowerShell에서
npm install -g @anthropic-ai/claude-code

# 경로 확인
where claude

 

 

 

초기 설정 및 인증

API 키 발급

  1. Anthropic Console 접속
  2. API 키 생성
    • 키 이름 입력 (예: "claude-code-dev")
    • 생성된 키 복사 (한 번만 표시됨!)
  3. Settings → API Keys → Create Key
  4. 크레딧 확인
    • 신규 가입 시 $5 무료 크레딧 제공
    • 사용량 확인: Settings → Billing

인증 설정

방법 1: 대화형 설정 (권장)

# Claude Code 실행
claude

# 처음 실행 시 API 키 입력 프롬프트
# API key를 입력하면 ~/.claude/config.json에 자동 저장

방법 2: 환경변수

# ~/.bashrc 또는 ~/.zshrc에 추가
export ANTHROPIC_API_KEY="sk-ant-api03-xxxxx..."

# 적용
source ~/.bashrc  # 또는 source ~/.zshrc

# 테스트
claude chat "Hello"

방법 3: 설정 파일 직접 편집

# 설정 디렉토리 생성
mkdir -p ~/.claude

# 설정 파일 생성
cat > ~/.claude/config.json << 'EOF'
{
  "apiKey": "sk-ant-api03-xxxxx...",
  "model": "claude-sonnet-4-20250514",
  "maxTokens": 8192
}
EOF

# 권한 설정 (보안)
chmod 600 ~/.claude/config.json

초기 설정 확인

# 설정 파일 위치 확인
claude config show

# API 연결 테스트
claude chat "Hello, Claude!"

# 출력 예시:
# Claude: Hello! How can I help you today?

 

 

 

기본 사용법

1. 대화형 모드 (Chat)

# 기본 실행
claude

# 프롬프트가 나타나면 질문 입력
You: Python으로 피보나치 수열을 구현해줘

Claude: 물론입니다. 재귀와 반복 두 가지 방식으로 구현해드리겠습니다.

[코드 생성...]

You: /exit  # 종료

특수 명령어:

명령어 기능
/help 도움말 표시
/exit 종료
/clear 대화 기록 초기화
/save <file> 대화 내용 저장
/load <file> 대화 내용 불러오기

2. 단발성 질의

# 한 줄 명령
claude chat "Explain Git in one sentence"

# 파이프 활용
echo "Translate to Korean: Hello World" | claude chat

# 파일에서 프롬프트 읽기
claude chat < prompt.txt

# 결과를 파일로 저장
claude chat "Write a README for a Todo app" > README.md

3. 파일 편집

# 프로젝트 디렉토리에서 실행
cd my-project

# Claude에게 파일 수정 요청
claude edit "Fix the bug in src/app.js where the user login fails"

# 특정 파일 지정
claude edit --file src/utils.js "Add error handling to all functions"

# 여러 파일 동시 수정
claude edit "Refactor the authentication system"

동작 방식:

  1. Claude가 관련 파일 자동 탐색
  2. 코드 분석 후 수정안 제시
  3. 사용자 승인 시 파일 직접 편집
  4. Git diff 형식으로 변경사항 표시

4. 프로젝트 분석

# 전체 코드베이스 이해
claude analyze

# 특정 질문
claude analyze "Where is the user authentication implemented?"

# 아키텍처 다이어그램 요청
claude analyze "Draw the system architecture"

5. Git 통합

# 커밋 메시지 자동 생성
claude commit

# Pull Request 설명 작성
claude pr

# 코드 리뷰
claude review
반응형
반응형

 

왜 Ollama인가?

클라우드 vs 로컬 LLM 비교

기준 클라우드 (OpenAI, Claude) 로컬 (Ollama)
비용 사용량 기반 (토큰당 과금) 하드웨어 투자 후 무료
프라이버시 데이터가 외부로 전송됨 데이터가 로컬에 유지
지연시간 네트워크 왕복 시간 포함 로컬 처리 (더 빠를 수 있음)
커스터마이징 제한적 완전한 제어 (모델 수정 가능)
모델 선택 제공사 모델만 오픈소스 모델 자유롭게 사용
가용성 서비스 장애 시 중단 네트워크 독립적

로컬 LLM이 적합한 시나리오

다음 경우에 Ollama를 선택하세요:

  1. 민감한 데이터 처리
    • 의료·금융·법률 문서 분석
    • 사내 기밀 정보 처리
    • GDPR/HIPAA 등 규제 준수 필요
  2. 높은 사용량
    • 일일 수백만 토큰 이상 처리
    • API 비용이 부담스러운 경우
    • 배치 처리·실험 단계
  3. 오프라인 환경
    • 인터넷 접속 제한된 환경
    • 군사·정부 프로젝트
    • 현장 디바이스 (엣지 컴퓨팅)
  4. 커스터마이징 요구
    • 파인튜닝 모델 배포
    • 특수 프롬프트 템플릿 필요
    • 모델 병합·실험

다음 경우에는 클라우드 고려:

  • 초기 프로토타입 (빠른 검증 필요)
  • 최신 최고 성능 모델 필요 (GPT-4, Claude Opus 등)
  • 인프라 관리 리소스 부족
  • 소규모·간헐적 사용

설치 및 환경 설정

시스템 요구사항

최소 사양 (소형 모델용):

  • CPU: 4코어 이상
  • RAM: 8GB
  • 디스크: 10GB 여유 공간
  • OS: macOS, Linux, Windows (WSL2)

권장 사양 (중대형 모델용):

  • CPU: 8코어 이상 (또는 GPU)
  • RAM: 16GB+
  • GPU: NVIDIA (CUDA 지원) 또는 Apple Silicon
  • 디스크: 50GB+ SSD

macOS 설치

방법 1: Homebrew (권장)

# Homebrew 설치 (없는 경우)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Ollama 설치
brew install ollama

# 설치 확인
ollama --version
# 출력: ollama version 0.1.x

방법 2: 공식 설치 스크립트

curl -fsSL https://ollama.com/install.sh | sh

# 서비스 자동 시작 (macOS)
brew services start ollama

Linux 설치 (Ubuntu/Debian)

# 공식 설치 스크립트
curl -fsSL https://ollama.com/install.sh | sh

# systemd 서비스로 자동 시작
sudo systemctl enable ollama
sudo systemctl start ollama

# 상태 확인
sudo systemctl status ollama

수동 설치 (바이너리):

# 최신 릴리스 다운로드
curl -L https://github.com/ollama/ollama/releases/latest/download/ollama-linux-amd64 -o ollama

# 실행 권한 부여
chmod +x ollama

# PATH에 추가
sudo mv ollama /usr/local/bin/

# 데몬 실행
ollama serve &

Windows 설치

WSL2 사용 (권장):

# PowerShell에서 WSL2 설치
wsl --install

# Ubuntu 재시작 후 WSL 터미널에서
curl -fsSL https://ollama.com/install.sh | sh

네이티브 Windows (실험적):

# Chocolatey로 설치
choco install ollama

# 또는 공식 Windows 인스톨러 다운로드
# https://ollama.com/download/windows

Docker 설치 (플랫폼 독립)

# CPU 전용
docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

# NVIDIA GPU 지원
docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

# 실행 확인
curl http://localhost:11434/api/version

설치 확인

# 1. 버전 확인
ollama --version

# 2. 서버 상태 확인
curl http://localhost:11434/api/tags

# 3. 테스트 모델 실행
ollama run llama3:8b

모델 관리 완전 가이드

인기 모델 카탈로그

모델 파라미터 크기 RAM 요구 속도 품질 주요 용도
llama3:8b 8B 4.7GB 8GB ★★★★☆ ★★★★☆ 범용 (추천 시작점)
llama3:70b 70B 40GB 64GB ★★☆☆☆ ★★★★★ 고품질 작업
mistral:7b 7B 4.1GB 6GB ★★★★★ ★★★☆☆ 빠른 응답 필요 시
mixtral:8x7b 47B 26GB 32GB ★★★☆☆ ★★★★★ 복잡한 추론
codellama:13b 13B 7.4GB 16GB ★★★☆☆ ★★★★☆ 코드 생성
phi-2 2.7B 1.7GB 4GB ★★★★★ ★★☆☆☆ 저사양 환경
gemma:7b 7B 5.0GB 8GB ★★★★☆ ★★★★☆ Google 모델

모델 다운로드

# 기본 다운로드 (최신 버전)
ollama pull llama3:8b

# 특정 양자화 버전 (메모리 절약)
ollama pull llama3:8b-q4_0      # 4-bit 양자화 (3.5GB)
ollama pull llama3:8b-q8_0      # 8-bit 양자화 (7.0GB)

# 여러 모델 동시 다운로드
ollama pull llama3:8b & \
ollama pull mistral:7b & \
ollama pull codellama:13b &
wait
echo "모든 모델 다운로드 완료"

모델 조회 및 삭제

# 로컬 모델 목록
ollama list

# 출력 예시:
# NAME              ID              SIZE      MODIFIED
# llama3:8b         a6f7e2f3c1d8    4.7GB     2 days ago
# mistral:7b        b8c9d0e1f2a3    4.1GB     1 week ago

# 모델 상세 정보
ollama show llama3:8b

# 모델 삭제
ollama rm mistral:7b

# 디스크 공간 확인
du -sh ~/.ollama/models
반응형
반응형

 

JDBC-8101:Column used in the ON clause cannot be updated. 

 

 

MERGE INTO 문을 사용하여 UPDATE와 INSERT를 진행하는 쿼리를 작성하였는데 위와 같은 오류가 발생하였다.

 

 

MERGE INTO ( ~ ) USING ( ~ ) ON ( ~ ) 문 사용 시에 조건절(ON)에서 사용된 칼럼을 UPDATE할 경우 발생하는 문제였다. UPDATE할 칼럼은 WHERE 문에서 사용해서 해결할 수 있었다.

 

 

반응형
반응형

 

  • JPA와 ORM은 뭘까?
  • 왜 JPA를 할까?

 

 

ORM이란

ORM은 데이터베이스 객체를 자바 객체로 매핑하여 객체 간의 관계를 바탕으로 SQL을 자동으로 생성해준다.

ORM은 관계형 데이터베이스의 ‘관계’를 Object에 반영하자는 것이 목적이라면, SQL Mapper는 단순히 필드를 매핑시키는 것이 목적이라는 점에서 지향점의 차이가 있다.

 

 

ORM의 시대

JPA

JPA는 자바진영에서 제공하는 API이며, 자바 ORM 기술에 대한 표준 명세이다.

자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다. 

JPA를 구현한 ORM 프레임워크는 Hibernate, EclipseLink, DataNucleus 등이 있다.

 

 

구글트래픽을 통해 본 개발 트렌드

전세계의 구글 유저들은 압도적으로 JPA에 대한 관심이 많다.

 

 

우리나라는 아직까지 상대적으로 MyBatis에 대한 관심도가 많으나, JPA에 대한 관심이 지속적으로 증가하고 있고 슬슬 MyBatis에 대한 관심도를 추월하고 있는 것을 확인할 수 있었다.

 

 

 

 

ORM 방식은 왜 주류가 되었나?

기존의 Sql Mapper 방식(MyBatis, JdbcTemplate)에서는 개발자가 SQL문을 직접 작성해 데이터베이스를 조작했다.

따라서, 개발자가 객체에 따른 CRUD 쿼리를 반복적으로 작성해야했고 이는 유지보수의 어려움을 야기했다.

 

하지만, ORM 방식(JPA, Hibernate)에서는 객체를 통해 간접적으로 데이터베이스를 조작한다.

ORM이 객체간 관계를 바탕으로 sql을 자동으로 생성해주기 때문에 개발자는 SQL 쿼리가 아니라 Java 메서드를 통해 데이터베이스의 데이터를 조작할 수 있다.

따라서, 개발이 특정 DBMS에 종속되지 않으며, SQL문이 코드에 들어가지 않아 깔끔한 코드를 유지할 수 있다.

 

 

 


Reference

 

반응형

+ Recent posts