29 5월 2025

[인공지능 기술] [알아봅시다] 개발자의 chatGPT 활용법

[인공지능 기술] [알아봅시다] 개발자의 chatGPT 활용법

25931365-b065-467e-bd43-44127efdf182.png

서론

현대 소프트웨어 개발 환경에서 AI 비서로 자리 잡은 ChatGPT는 단순한 문답을 넘어 다양한 개발 단계에서 생산성을 크게 향상시켜 줍니다. 이 포스트에서는 코드 작성부터 테스트, 문서화, CI/CD 파이프라인 통합까지 개발자가 ChatGPT를 활용할 수 있는 대표적인 방법들을 살펴봅니다.


1. 코드 스캐폴딩(Scaffolding) 및 초기 구조 생성

  • 프로젝트 템플릿 생성

    • “새로운 Django 프로젝트 기본 설정 코드를 생성해줘”

  • CRUD 엔드포인트 초안

    • “Express.js로 users CRUD API 라우터 코드를 짜줘”

  • 디렉터리 구조 제안

    • “React + TypeScript 프로젝트 구조를 어떻게 잡는 게 좋을까?”

 
javascript
// 예시: Express.js CRUD 스캐폴딩 const express = require('express'); const router = express.Router(); // GET all users router.get('/users'async (req, res) => { // ChatGPT가 제안한 기본 로직 }); // POST create user router.post('/users'async (req, res) => { // ... }); module.exports = router;

2. 디버깅 및 오류 해결

  • 에러 메시지 분석

    • “이 Node.js 에러 스택을 보고 원인과 해결 방법을 알려줘”

  • 코드 리뷰를 통한 버그 찾기

    • “다음 함수에서 잠재적인 null 참조 버그가 있을까?”

  • 리팩터링 제안

    • “이 파이썬 함수의 가독성을 높이도록 리팩터링해줘”


3. 코드 문서화 및 주석 작성

  • 함수/클래스 설명 자동 생성

    • “이 함수의 역할을 한 문장으로 요약해줘”

  • README.md 작성 보조

    • “이 프로젝트의 README 템플릿을 작성해줘”

  • 주석 일관성 유지

    • “이 자바스크립트 코드에 JSDoc 스타일 주석을 추가해줘”

 
markdown
/** * @function addTwoNumbers * @param {number} a - 첫 번째 숫자 * @param {number} b - 두 번째 숫자 * @returns {number} 두 수의 합 */ function addTwoNumbers(a, b) { return a + b; }

4. 테스트 케이스 및 자동화 스크립트 생성

  • 유닛 테스트 템플릿

    • “Jest를 이용한 add 함수 테스트 코드를 작성해줘”

  • 통합 테스트 시나리오

    • “API 엔드포인트 /login에 대한 통합 테스트 계획을 제안해줘”

  • 테스트 커버리지 개선 아이디어

    • “이 모듈의 경로 커버리지를 높이려면 어떤 테스트가 필요할까?”


5. 코드 리뷰 및 최적화 제안

  • 성능 병목 분석

    • “이 SQL 쿼리가 느린 원인과 인덱스 최적화 방안을 알려줘”

  • 비효율적 로직 리팩터링

    • “이 루프를 더 효율적인 함수형 스타일로 바꿔줄래?”

  • 보안 취약점 점검

    • “이 PHP 코드에서 SQL 인젝션 취약점이 있나?”


6. 새로운 기술 학습 및 예제 생성

  • 라이브러리 사용 예제

    • “Pandas에서 groupby와 pivot 테이블을 사용하는 예제를 보여줘”

  • 비교 분석

    • “Django와 Flask 중 어느 것을 선택해야 할까?”

  • 공식 문서 요약

    • “React 공식 문서에서 useEffect 훅 사용법을 요약해줘”


7. CI/CD 파이프라인 및 DevOps 자동화

  • GitHub Actions 워크플로우 생성

    • “Node.js 프로젝트용 GitHub Actions 워크플로우 YAML을 생성해줘”

  • Dockerfile 최적화

    • “이 Dockerfile을 멀티스테이지 빌드로 최적화해줘”

  • 배포 스크립트 작성

    • “AWS EC2에 배포하는 Bash 스크립트를 작성해줘”


8. 커밋 메시지 작성 및 이슈 템플릿

  • 의미 있는 커밋 메시지

    • “다음 변경 내용을 설명하는 커밋 메시지를 작성해줘: 사용자 로그인 로직 수정, JWT 토큰 방식으로 변경”

  • 이슈 템플릿 자동 생성

    • “버그 리포트용 GitHub 이슈 템플릿을 만들어줘”


결론

ChatGPT는 단순히 대화형 AI를 넘어, 개발 생산성을 높여주는 올인원 도구로 발전했습니다.
코드 스캐폴딩에서부터 디버깅, 테스트, 문서화, DevOps 자동화에 이르기까지 일련의 개발 과정을 ChatGPT와 협업함으로써 더 빠르고, 더 안정적이며, 더 효율적인 소프트웨어를 구현할 수 있습니다.
오늘 바로 ChatGPT를 개발 워크플로우에 통합해 보세요!


이 글이 도움이 되었다면, 댓글과 공유 부탁드립니다!

Loading

28 5월 2025

[인공지능 기술] Gradio 설치 및 실행 방법

[인공지능 기술] Gradio 설치 및 실행 방법

1. Gradio란 무엇인가?


Gradio는 Python으로 개발된 오픈 소스 패키지이다.
Gradio를 사용하면 몇 줄의 코드로 ML 모델, API 또는 임의의 Python 함수에 대해 사용하기 쉽고 커스터마이징할 수 있는 UI 구성 요소를 빠르게 생성할 수 있다.
Gradio GUI를 Jupyter 노트북에 직접 통합하거나 링크로 다른 사람과 공유할 수도 있다.

00 image.png 

2. Gradio 설치


Gradio를 설치하는 방법은 다음과 같다.
터미널에서 다음 명령을 실행하거나 Google Colab에서 실행할 수 있다.

pip install gradio

 Jupyter Notebook을 사용하는 경우에는 다음과 같이 입력한다.

!pip install gradio

 

3. Gradio 애플리케이션을 실행하는 방법


Gradio 애플리케이션을 실행하는 방법을 알아보자.
다음은 사용자의 이름을 입력받아 인사 메시지를 생성하는 간단한 Python 애플리케이션이다.

#!pip install gradio
import gradio as gr

def user_greeting(name):
    return "안녕하세요! " + name + "님, 첫 번째 Gradio 애플리케이션에 오신 것을 환영합니다!????"

app = gr.Interface(fn=user_greeting, inputs="text", outputs="text")
app.launch()

???? 에러 메시지 발생 (ModuleNotFoundError: No module named 'tqdm')

  • 내가 코드를 실행 했을 때는 위와 같은 에러 메시지가 발생 했는데, 에러 메시지에 따르면 gradio 모듈을 찾을 수 없고, gradio 모듈의 일부 파일에서 tqdm 모듈을 찾을 수 없다고 한다.

???? 해결 방법

  • gradio와 tqdm 모듈의 호환성 문제가 있을 수 있기 때문에 gradio와 tqdm 모듈을 최신 버전으로 업데이트 하였다.
    pip install -U gradio
    pip install -U tqdm
    • Gradio 애플리케이션이 실행되었다.

 

명령 프롬프트에서 Gradio 응용 프로그램 실행

Gradio 애플리케이션을 명령 프롬프트에서 실행할 수 있다.
명령 프롬프트에서 다음과 같이 입력한다.

python app.py


애플리케이션을 실행하면 다음의 URL을 열어서 결과를 확인할 수 있다: http://127.0.0.1:7862

  • 이 URL은 각자의 환경에 따라 다를 수 있다.

 

Jupyter Notebook에서 Gradio 애플리케이션 실행

Jupyter Notebook에서 코드를 실행할 수도 있다.
인터페이스를 생성한 후 app.launch()를 사용하여 애플리케이션을 실행할 수 있다.

app = gr.Interface(fn=user_greeting, inputs="text", outputs="text")
app.launch()
  • 이렇게 하면 새로운 위젯이 생성된다.

[출처] Gradio 설치 및 실행 방법

Loading

25 5월 2025

[一日30分 인생승리의 학습법] [Git] 다중 리모트를 사용하여 여러 Git 연동하기(Gitea, GitHub)

post-thumbnail


Git 다중 리모트를 사용하여 Gitea와 GitHub 연동하기

 

한 프로젝트에서 Gitea와 GitHub를 동시에 관리하려면, Git의 다중 리모트(remote) 기능을 사용하면 된다. 다중 리모트를 설정하면, 동일한 로컬 저장소에서 두 개 이상의 원격 저장소로 데이터를 주고받을 수 있게 된다.

여기서 진행할 순서는 다음과 같다:

  1. Gitea와 GitHub 레포지토리 리모트 설정.
  2. 각 리모트를 구분하여 push/pull하는 방법.
  3. 다중 리모트 관리 시 주의사항.

1. 사전 준비: 프로젝트 리포지토리 설정

  • 현재 Gitea의 레포지토리 (wbapp)는 master 브랜치로 연결되어 있다.
    • Gitea의 URL 예시: http://gitea-ip/your-username/app.git
  • GitHub에도 동일한 프로젝트(wbapp)를 만들고, 이를 main 브랜치로 관리하려고 한다.
    • GitHub의 URL 예시: https://github.com/nyaongdev/app.git

먼저 GitHub에 새로운 레포지토리를 생성하고, 여기에 다중 리모트를 설정하도록 하자.


2. 다중 리모트 설정하기

2.1 기존 리모트 상태 확인

로컬 저장소에서 리모트 설정을 확인하려면 터미널이나 명령 프롬프트에서 다음 명령어를 사용한다.


git remote -v

이 명령어를 입력하면 현재 연결된 리모트 목록이 나타난다. 예를 들어:


origin  http://gitea-ip/your-username/app.git (fetch)
origin  http://gitea-ip/your-username/app.git (push)

현재 origin이라는 이름으로 Gitea 리모트가 연결된 상태다.

2.2 GitHub 리모트 추가하기

이제 GitHub 리모트를 추가해야 한다. GitHub 리모트를 추가할 때는 리모트의 이름을 다르게 설정하여, 두 개의 리모트를 구분할 수 있도록 해야 한다. 여기서는 github-nyaong이라는 이름으로 GitHub 리모트를 추가할 것이다.


git remote add github-nyaong https://github.com/nyaongdev/app.git

이제 git remote -v 명령어를 다시 실행하면 다음과 같은 출력이 나올 것이다.


origin         http://gitea-ip/your-username/app.git (fetch)
origin         http://gitea-ip/your-username/app.git (push)
github-nyaong  https://github.com/nyaongdev/app.git (fetch)
github-nyaong  https://github.com/nyaongdev/app.git (push)

이제 origin은 Giteagithub-nyaong은 GitHub를 가리키고 있다.


3. 리모트를 구분하여 Push/Pull 사용하기

이제 각각의 리모트로 push와 pull 작업을 할 수 있는 방법을 살펴보자.

3.1 Gitea와 GitHub에 Push

  • *Gitea (origin)**에 push:
    
    git push origin master
    
  • *GitHub (github-nyaong)**에 push:
    
    git push github-nyaong main

각 리모트를 지정해 브랜치를 푸시(push)할 수 있다. 여기서는 Gitea에는 master 브랜치로, GitHub에는 main 브랜치로 푸시하는 방식이다.

3.2 각각의 리모트에서 Pull

  • *Gitea (origin)**에서 pull:
    
    git pull origin master
  • *GitHub (github-nyaong)**에서 pull:
    
    git pull github-nyaong main

이를 통해 각각의 원격 저장소에서 변경 사항을 로컬 저장소로 가져올 수 있다.

3.3 두 리모트에 동시에 Push하기

Gitea와 GitHub 두 리모트에 동시에 변경 사항을 push하고 싶다면, 두 리모트를 한 번에 지정하여 푸시할 수도 있다.


git push origin master
git push github-nyaong main

이렇게 명령어를 두 번 실행하여 두 곳에 동시에 변경 사항을 적용할 수 있다. 더 자동화하고 싶다면, Git 훅(hook)이나 스크립트를 작성해 한 번의 명령어로 여러 리모트로 푸시하도록 만들 수 있다.


4. 다중 리모트 사용 시 주의사항

4.1 브랜치 관리

  • Gitea에서는 master 브랜치를 사용하고, GitHub에서는 main 브랜치를 사용하는 상황이므로, 브랜치 간의 동기화가 중요하다. 이를 위해 로컬에서 적절히 checkout하고 변경 사항을 푸시해야 한다.
  • 예를 들어, master 브랜치에서 작업한 후 main 브랜치에도 동일하게 반영하려면, 브랜치 병합(merge)을 하거나 리베이스(rebase)를 사용해야 할 수 있다.

# master 브랜치에서 작업 후 main 브랜치로 병합
git checkout main
git merge master
git push github-nyaong main

이와 같이, 각 브랜치가 서로 다르게 유지되지 않도록 주기적으로 병합하여 두 리모트의 코드가 일관되도록 관리하는 것이 좋다.

4.2 충돌 관리

  • 같은 프로젝트를 여러 리모트에 동기화하다 보면, 가끔 충돌(conflict)이 발생할 수 있다. 이 경우, Git은 충돌을 해결해야 푸시할 수 있도록 하며, 이를 해결한 후에 다시 푸시하면 된다.
  • 만약 Gitea와 GitHub 양쪽에서 모두 병렬적으로 작업하고 있다면, 주기적으로 pull을 통해 양쪽의 변경 사항을 확인하고 반영해야 한다.

4.3 협업 시 고려사항

  • 만약 팀원들과 Gitea를 통해 협업하고, 개인적으로 GitHub에도 저장하고 싶다면, Gitea에서 작업한 후 GitHub에 백업하는 형식으로 생각하면 된다.
  • 모든 작업이 Gitea를 기준으로 이루어지고, 완료된 작업을 GitHub에 푸시하는 순서를 정하면 충돌을 줄이고 관리하기 쉽다.

5. 마무리

이제 하나의 프로젝트에서 Gitea와 GitHub 두 리모트를 동시에 관리할 수 있게 되었다. 다중 리모트를 사용하면 하나의 로컬 저장소에서 여러 원격 저장소로 쉽게 데이터를 동기화할 수 있어, 사내의 Git 서버와 외부의 GitHub를 동시에 사용하는 것이 가능해진다.

  • Gitea는 사내 협업을 위한 주요 원격 저장소로 사용하는 형태
  • GitHub는 개인 백업이나 외부 프로젝트 관리용으로 사용하는 형태

[출처] https://velog.io/@nyaong/Git-%EB%8B%A4%EC%A4%91-%EB%A6%AC%EB%AA%A8%ED%8A%B8%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%97%AC%EB%9F%AC-Git-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0Gitea-GitHub

Loading

25 5월 2025

[chatgpt] [ChatGPT] Function calling

 

 

Function Calling이란?

Chatgpt Chat Completions API를 사용하면, 질문을 하고 답변을 얻을 수 있다.
Function Calling을 사용하면, 질문에 적합한 애플리케이션 함수와 매개변수를 추천받을 수 있다. 

즉, 애플리케이션에서 어떤 함수를 호출하는게 좋을지 gpt에게 물어볼 수 있는 기능이라고 볼 수 있다.

예제코드

open ai에서 가져온 파이썬 예제 코드이다. 한줄한줄 읽어보면, 어떤 방식으로 사용하는 건지 쉽게 감이 온다. 

import openai
import json


# 항상 같은 날씨를 리턴하는 예시용 더미 함수이다. 
# 실제 개발환경에서는 상황에 맞는 코드를 구현해야한다.
def get_current_weather(location, unit="fahrenheit"):
    """Get the current weather in a given location"""
    weather_info = {
        "location": location,
        "temperature": "72",
        "unit": unit,
        "forecast": ["sunny", "windy"],
    }
    return json.dumps(weather_info)


def run_conversation():
    # Step 1: chatgpt에게 질문과 이용할 수 있는 함수 목록을 전달한다. 
    messages = [{"role": "사용자", "content": "서울 날씨는 어때? "}]
    functions = [
        {
            "name": "get_current_weather",
            "description": "위치를 전달하면, 현재 날씨를 알려준다",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "구군시  전달한다. ex. 서울특별시",
                    },
                    "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
                },
                "required": ["location"],
            },
        }
    ]
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo-0613",
        messages=messages,
        functions=functions, # 이 곳에서 함수 정보를 전달한다.
        function_call="auto",  
    )
    response_message = response["choices"][0]["message"]

    # Step 2: GPT에서 함수 호출을 하라고 했는지 확인하기 
    if response_message.get("function_call"):
        # Step 3: GPT에서 호출하라고 한 함수를 실제로 호출하기 
        available_functions = {
            "get_current_weather": get_current_weather,
        }  # 이 예제에서는 호출할 수 있는 함수를 1개만 두었지만, 실제로는 여러개를 추가할 수 있다. 
        function_name = response_message["function_call"]["name"] // GPT가 제안한 함수 이름 확인하기 
        fuction_to_call = available_functions[function_name] // GPT가 제안한 함수 할당하기  
        function_args = json.loads(response_message["function_call"]["arguments"])
        function_response = fuction_to_call(
            location=function_args.get("location"),
            unit=function_args.get("unit"),
        ) # GPT가 제안한 함수를 GPT에서 찾은 매개변수로 전달하기 

        # Step 4: 함수 호출로 얻은 결과를 gpt에게 다시 보내주기 send the info on the function call and function response to GPT
        messages.append(response_message)  # API으로 호출받은 값을 확장하기 
        messages.append(
            {
                "role": "function",
                "name": function_name,
                "content": function_response,
            }
        ) 
        second_response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo-0613",
            messages=messages,
        )  # gpt에게 응답 결과 다시 전달하기 
        return second_response


print(run_conversation())

참고

https://platform.openai.com/docs/guides/gpt/function-calling
https://github.com/joshlong/chatgpt-spring-boot-starter
https://github.com/openai/openai-cookbook/blob/main/examples/How_to_call_functions_with_chat_models.ipynb

출처: https://americanopeople.tistory.com/427 [복세편살:티스토리]

Loading

24 5월 2025

[사회과학] [박진영의 사회심리학] ‘내가 싫은 것’ 아는 것도 중요하다

[사회과학] [박진영의 사회심리학] ‘내가 싫은 것’ 아는 것도 중요하다

[박진영의 사회심리학] ‘내가 싫은 것’ 아는 것도 중요하다

입력
게티이미지뱅크 제공

게티이미지뱅크 제공

내가 어떤 사람인지 자신의 다양한 특성을 분명하고 일관적이게 정의할 수 있고 시간과 장소가 바뀌어도 자신이 어떤 사람이라는 느낌을 확실히 가지고 있는 상태를 심리학적 용어로 자기 개념 명확성(self-concept clarity)이 높다고 표현한다.

반대로 자기 개념 명확도가 낮은 사람들은 흔히 자신이 어떤 사람인지 잘 정의하지 못하고 자신의 다양한 모습에 대해 잘 이해하고 받아들이기보다 혼란스러워하는 모습을 보인다. 긍정적인 자기지각인 자존감이 때로는 좋고 때로는 나쁜 결과물들과 관련을 보이는데 어쩌면 자기 개념 명확성이 이를 설명할 수 있다고 보는 학자들이 있다.

예를 들어 자기 자신에 대해 대체로 긍정적으로 생각하고 있지만 자기 개념 명확성이 낮은 사람들의 경우 자존감이 외부의 영향에 의해 크게 좌우되는 반면 자신에 대해 긍정적으로 인식하는 정도는 그다지 높지 않지만 스스로를 잘 알고 있는 사람들의 경우 외부의 영향에 의해 자존감이 흔들리는 정도가 비교적 덜 했다는 연구들이 있다.

필자의 경우 역시 어렸을 때 자연스러운 실제 나의 모습을 잘 파악하고 받아들이기보다 외부에서 좋다고 하는 모습들을 최대한 따라하고 거기에서 오는 보상이나 긍정적인 반응들을 기반으로 자존감을 높이 쌓았던 적이 있다.

예를 들어 매우 내향적인 편이지만 사람들로부터 좋은 반응을 얻기 위해 열심히 외향적인 척을 하고 주변 사람들의 반응이 좋은 편이라면 거기에 기대어 기뻐하고, 반응이 좋지 않다면 위기감을 느끼는 위태로운 시간을 상당히 오래 보낸 것 같다.

이렇게 자기 개념 명확성이 낮으면 외부 자극에 쉽게 흔들리고 영향을 받는 모습을 보인다. 자기 개념 명확성이 낮은 사람들이 자극적인 광고에 더 쉽게 영향을 받고 자신을 과시하기 위한 소비를 한다는 연구 결과도 있었다. 어쩌면 자기 자신을 잘 모르는 사람들이 많은 사회일수록 명품 소비나 유행이 쉽게 번져나가는 것일지도 모르겠다.

최근 연구들에 의하면 자기 개념 명확성이 낮은 것이 ‘자기 통제’에도 부적 영향을 준다고 한다. 통린 장 북경대 심리학자 연구팀에 의하면 자기 개념 명확성이 낮은 사람들의 경우 ‘미래의 자신’을 현재 자신의 연장선으로 보기보다 자신과는 다른 새로운 사람, 마치 타인처럼 바라보는 경향이 높았다.

이런 특성이 자기 개념 명확성이 낮은 사람들이 원하는 목표를 이루기 위해 끈기있게 노력하지 못하는 현상을 일부 설명했다.

내가 어떤 사람인지 아는 것은 장기적으로 내가 원하는 것이나 나에게 바람직한 것이 무엇인지 파악하는 능력, ‘장기적인 비전’을 갖는 것과 관련이 있고 장기적인 비전을 갖지 못하면 끈기있게 노력하는 행동이 저하된다는 것이다.

뭐 하나에 정착하지 못하고 서로 다른 것들을 이것저것 손대기만 하며 오랜 시간 갈아타기만 하는 경우 어쩌면 자기통제력 자체가 낮기보다 자신이 어떤 사람인지 잘 모르는 것이 더 중요한 원인일지도 모르겠다.

물론 다양한 일을 하다 보면 자신이 좋아하는 것과 싫어하는 것을 알게 되고 그 과정에서 자기 개념을 좀 더 명확하게 알게 되기도 한다. 사실 대부분의 사람들이 삶에 걸쳐 다양한 도전과 실패를 통해 자신에 대해 알아간다. 이런 점에서 아무 것도 하지 않기보다는 뭐라도 하는 것이 훨씬 나을 수 있다.

자신이 좋아하는 것을 아는 것 못지 않게 ‘싫어하는 것’을 아는 것 또한 올바른 길을 찾아가는 데 있어 매우 중요하므로 기분 나쁜 경험이나 실패 역시 아무 것도 하지 않는 것 보다는 훨씬 낫다.

살아간다는 것에 대해 내가 좋아하는 것들과 싫어하는 것들에 대한 리스트를 만들어 나가는 과정이라고 한다면 그 어떤 경험도 무의미하지 않을 것이다.

Jiang, T., Wang, T., Poon, K. T., Gaer, W., & Wang, X. (2023). Low self-concept clarity inhibits self-control: The mediating effect of global self-continuity. Personality and Social Psychology Bulletin, 49(11), 1587-1600.

※필자소개
박진영. 《나, 지금 이대로 괜찮은 사람》, 《나를 사랑하지 않는 나에게》를 썼다. 삶에 도움이 되는 심리학 연구를 알기 쉽고 공감 가도록 풀어낸 책을 통해 독자와 꾸준히 소통하고 있다. 온라인에서 ‘지뇽뇽’이라는 필명으로 활동하고 있다. 현재 미국 듀크대에서 사회심리학 박사 과정을 밟고 있다.

Loading

18 5월 2025

[사회과학] [박진영의 사회심리학] 때론 ‘불확실성이’ 삶에 도움이 된다

[사회과학] [박진영의 사회심리학] 때론 ‘불확실성이’ 삶에 도움이 된다

[박진영의 사회심리학] 때론 ‘불확실성이’ 삶에 도움이 된다

입력
게티이미지뱅크 제공

게티이미지뱅크 제공

요즘은 간단한 것도 점점 더 잘 모르겠다는 생각이 든다. 예를 들어 ‘스트레스’라고 하면 무조건 나쁜 것 같지만 스트레스가 하나도 없는 환경인 경우 그만한 자극과 보상 또한 없는 환경이어서 금방 ‘지루함’을 느낄 가능성이 높다. 배움의 과정 또한 항상 익숙한 것에서 벗어나 새로움을 찾는 틀을 깨는 불편한 과정을 통해 일어난다.

물론 그렇다고 스트레스가 항상 좋아서 매일매일 24시간 스트레스를 받고 살아야 한다는 것은 아니다. 다만 우리가 쉽게 긍정적 또는 부정적 경험이라고 이름 붙이고 단정짓는 삶의 많은 경험들이 실제로도 그렇게 간단하게 완전히 좋거나 나쁜 경험인 경우는 많지 않다는 것이다. 그 사이의 어딘가 또는 전혀 다른 무엇인 경우가 의외로 많다.

일례로 ‘사랑’은 좋기만 한 경험인가. 사랑을 몰랐더라면 겪지 않았을지도 모르는 복잡한 감정과 외로움에 대한 노래들만 수천 곡은 되는 것 같다. 결혼도 아이를 갖는 것도 ‘좋은’ 일인가. 사람마다 삶의 시기마다 다른 답이 나오겠지만 삶의 경험이 아주 많은 사람들이라면 그 때 그 때 다르다거나 복잡하다는 답을 내놓을 것 같다.

제시카 알퀴스트 텍사스공대 심리학자에 의하면 ‘불확실성’ 또한 그렇다. 많은 이들이 불확실성을 줄이고 싶어하고 불확실성이 높은 상황을 곧 나쁜 상황이라고 생각하지만 꼭 그렇지만은 않다는 것이다.

예를 들어 불확실성은 주의를 집중시킨다. 사람들의 시선을 기록하는 아이트래킹(eye tracking) 실험들에 의하면 사람들은 같은 자극이라고 하더라도 확실하게 불쾌하거나 확실하게 아무렇지 않은 자극보다 불확실하게 불쾌한(예를 들어 언제 튀어나올지 모르는 무엇) 자극에 가장 많이 시선을 쏟는 경향을 보인다.

공포 영화를 예로 들어보면 무서운 자극이 항상 정해진 법칙에 의해 나타나는 경우 무서운 것을 떠나 일단 ‘재미가 없다’고 느낄 것 같다. 연구들에 의하면 기분이 좋은 것 또한 마찬가지다. 갑자기 확실하게 나타나는 것보다 불확실하게 나타나는 것(예를 들어 한번에 짠 나타나기보다 서서히 모습을 드러내는 기프트 카드)이 더 주의를 집중시키고 기분을 좋게 만들어 주는 것으로 나타났다.

아무래도 앞으로 하게 될 경험이 무엇인지 그 정체를 알 수 없을 때에는 긴장이 서서히 고조되다가 정체가 드러날 때 긴장감이 해소되는 클라이막스를 경험하게 되지만 처음부터 결말을 전부 알고 있다면 긴장감이나 기대감이 전혀 생기지 않고 궁금하지도 않을 것 같다.

그러고 보면 두근거리는 긴장감이나 과연 무엇일까 기대하고 설레어하는 것 정체를 알게 되었을 때의 기쁨 및 실망 모두 아직 알 수 없다고 하는 ‘불확실성’의 산물인 셈이다.

불확실성이 없다면 그로 인한 고통 또한 없겠지만 두근거림 설레임, 그만큼 조고된 기쁨과 실망 모두 없을지도 모르겠다. 불확실성이 없다면 인간으로서 겪는 감정의 풍부함과 깊이가 지금과는 많이 다를 것 같다.

물론 존재하는 불확실성을 앞에 두고도 불확실성을 느끼지 못하면 생존에도 큰 문제가 생긴다. 내 미래가 위태위태한데 나만 그걸 전혀 모르고 있다거나 일의 진행 방향에 다양한 가능성이 존재하는데 그것도 하나도 모르고 있다면 미리 준비하는 행동이나 다양한 선택지를 따져보는 행동이 불가능해질 것이다. 물론 불편하지만 불확실성은 꼭 느껴야 하는 불편함 중 하나다.

물론 불확실성이 불편한 정도에도 개인차가 있어서 불확실성을 무조건 안 좋게만 바라보는 사람들에 비해 불확실성에도 좋은 면이 있음을 아는 사람들이 더 적응적인 행동을 보인다는 연구들이 있었다.

예를 들어 불확실성을 보다 긍정적으로 바라보는 사람들은 확실하지만 가치가 낮은 보상을 선택하기보다 좀 더 불확실해도 가치가 높은 보상을 선택하는 경향을 보였다. 불확실성을 삶의 일부분으로 끌어안을 줄 아는 사람들은 가짜 뉴스나 만병통치약 같은 허황된 무엇에 빠지는 일 또한 적은 편이었다.

불론 그렇다고 불확실성이 항상 좋으며 불확실성이 높은 삶을 살아야 한다는 이야기는 아니다. 삶에서 늘 좋거나 나쁜 건 생각보다 별로 없고 불확실성 또한 그렇다는 이야기다. 어쩌면 이 또한 한쪽으로 치우치지 않고 기울어지지 않으며 지나침도 미치지 못함도 없는 ‘중용’의 아름다움에 대한 이야기일지도 모르겠다.

Alquist, J.L., & Baumeister, R.F. (2024). Learning to love uncertainty. Current Directions in Psychological Science, 33(6), 355-360. http://doi.org/10.1177/09637214241279539

※필자소개
박진영. 《나, 지금 이대로 괜찮은 사람》, 《나를 사랑하지 않는 나에게》를 썼다. 삶에 도움이 되는 심리학 연구를 알기 쉽고 공감 가도록 풀어낸 책을 통해 독자와 꾸준히 소통하고 있다. 온라인에서 ‘지뇽뇽’이라는 필명으로 활동하고 있다. 현재 미국 듀크대에서 사회심리학 박사 과정을 밟고 있다.

[출처] https://n.news.naver.com/article/584/0000032395?sid=110

Loading

5 5월 2025

[사회과학] [박진영의 사회심리학] 등산 vs 케이블카…정상 풍경 감흥 다를까

[사회과학] [박진영의 사회심리학] 등산 vs 케이블카…정상 풍경 감흥 다를까

[박진영의 사회심리학] 등산 vs 케이블카…정상 풍경 감흥 다를까

입력
연합뉴스 제공

연합뉴스 제공

처음에는 귀찮기만 했는데 막상 하고 나니 뿌듯하기도 하고 결과물에 애착이 가는 그런 경험을 다들 한 번쯤은 해보았을 것이다. 학교에서 과제 때문에 억지로 만들었지만 막상 만들고 나니 왠지 버리기 아깝고 소중해 보이는 미술 작품 같은 것들이 한 예다.

흔히 IKEA 효과라고 불리는 현상으로 같은 가구도 이미 조립 된 채로 온 것보다 내가 직접 노력을 들여 조립한 가구가 더 가치 있어 보이는 현상을 일컫는다.

하지만 때로는 예상했던 것보다 너무 많은 노력을 요하거나 노력 끝에 생각보다 만족스러운 결과물이 나오지 않았다면 아까운 돈과 시간, 노력을 낭비한 것 같아서 속상하기만 하다. 작업을 시작하기 전에 귀찮은 마음이 너무 커서 결과물이 어땠든 귀찮고 성가셨던 기억이 더 크게 남는 경우도 있다.

어떨 때 노력이 소모되었는지 여부가 큰 영향력을 미치는지 알기 위해 프제미스와프 마르코프스키 샌디에이고캘리포니아대 연구팀은 다음과 같은 실험을 했다.

어떤 과제를 하고 나서 정해진 액수 만큼의 보상을 돈으로 받거나 경제적으로 같은 가치를 갖는 머그컵으로 받을 수 있게 했다. 여기서 돈은 아무런 추가적 노력 없이 받을 수 있었지만 머그컵은 계단을 꽤 올라야지만 (추가적 노력 필요) 받을 수 있다고 알려주었다.

여기에 더해 어떤 보상을 받을지 선택하는 ‘타이밍’을 달리 해서 한 조건의 사람들은 ‘미래’를 생각하며 돈과 머그컵 중 무엇을 원하는지 선택하게 했고 다른 조건의 사람들에게는 이미 계단을 걸은 후 (노력이 이미 발생) ‘과거’를 생각하며 돈과 머그컵 중 선택하도록 했다.

그러니까 아직 계단을 오르지 않은 참가자들에게는 지금 그냥 돈을 받거나 아니면 계단을 오르고 나서 머그컵을 받을 수 있다고 말했고 이미 계단을 오른 조건의 참가자들에게는 이 머그컵을 받기 위해서는 계단을 올라야 하는데 참가자들은 이미 계단을 올랐으며 따라서 이 머그컵을 가지거나 또는 이를 돈으로 바꿀 수 있다고 말했다.

그러자 아직 노력이 발생하지 않은 조건의 사람들은 같은 보상이라면 가급적 노력 없이 얻을 수 있는 돈을 더 많이 선택한 반면 이미 노력이 발생한 조건의 사람들은 이들보다 더 높은 빈도로 머그컵을 선택하는 경향을 보였다(물론 이들 중 절반은 돈을 선택했다. 하지만 전자에서는 약 70% 가 돈을 선택).

노력이 어떤 선택을 더 가치있게 느끼게 해 주는 효과는 “이미 그 노력이 발생하고 나서 노력한 과거를 돌아 볼 때”에 한해 발생한다는 것이다.

물론 여기에도 개인차가 있어서 대체로 노력을 통해 얻는 보상을 긍정적으로 바라보는 사람들과 대체로 그렇지 않은 사람, 노력이 적당할 때에는 괜찮았지만 노력이 지나쳤을 때에는 보상을 덜 매력적으로 바라본 사람, 이와 반대로 노력이 지나쳤을 때 더 보상을 매력적으로 바라본 사람 등 다양한 행동 양상이 관찰되었다.

험난한 산을 힘들게 올라서 꼭대기에 섰을 때와 자동차나 케이블카 등을 타고 손쉽게 올랐을 때 보이는 풍경은 같지만 그 ‘의미’는 사람들마다 얼마든지 다를 수 있을 것 같다는 생각이 든다. 결과를 결과로만 보지 않고 그 ‘과정’에서도 의미를 찾는 사람과 그렇지 않은 사람의 개인차가 있을 것 같다.

물론 사람마다 중요하게 여기는 것이 다 다르다는 점도 고려해야 할 것 같다. 산을 좋아하는 사람에게는 등산이 큰 의미가 있겠지만 산을 별로 좋아하지 않는 사람에게는 등산이 그저 쓸모없는 일로 느껴질 수 있을 것 같다.

또한 대체로 힘겹게 노력해서 성공하는 것을 최고의 가치로 여기는 사람이 있는 반면 하루하루 소소하게 행복하고 평온하게 지내는 것을 최고로 여기는 사람이 있을 것 같다.

또 나의 경우 기초 체력이나 에너지 수준이 상당히 낮은 사람이어서 가급적이면 내가 좋아하는 것에 에너지를 쓰고자 하는 경향이 있다. 그래서 개인적으로 큰 가치를 두지 않는 일에 많은 시간과 노력을 쓰고 나면 되려 허무함을 느끼는 것 같다. 물론 소중한 이들과 만나는 시간 같이 내가 중요하게 여기는 것에는 노력을 아끼지 않는 편이다. 노력을 집중하는 편에 가까운 것 같다.

여러분은 어떤 편인지 주변 사람들과 함께 이야기해보면 즐거운 탐구 시간이 될 것 같다.

Marcowski, P., Białaszek, W., & Winkielman, P. (2025). Effort can have positive, negative, and non-monotonic impacts on outcome value in economic choice. Journal of Experimental Psychology: General. https://doi.org/10.1037/xge0001738

※필자소개
박진영. 《나, 지금 이대로 괜찮은 사람》, 《나를 사랑하지 않는 나에게》를 썼다. 삶에 도움이 되는 심리학 연구를 알기 쉽고 공감 가도록 풀어낸 책을 통해 독자와 꾸준히 소통하고 있다. 온라인에서 ‘지뇽뇽’이라는 필명으로 활동하고 있다. 현재 미국 듀크대에서 사회심리학 박사 과정을 밟고 있다.

Loading

27 4월 2025

[사회과학] [박진영의 사회심리학] 고통을 직면해야 더 나은 삶을 살 수 있다 

[사회과학] [박진영의 사회심리학] 고통을 직면해야 더 나은 삶을 살 수 있다 

[박진영의 사회심리학] 고통을 직면해야 더 나은 삶을 살 수 있다 

입력
 

01 0000032079_001_20250426080025670.jpg

 

게티이미지뱅크 제공

흔히 긍정적인 시각을 갖는 것이 좋다고 할 때 많이 하는 실수 중 하나가 어려움의 존재 자체를 인정하지 않거나 회피해버리는 것이다.

예를 들어 대부분의 사람들이 나이가 들면서 한 두 가지씩 지병을 갖게 되지만 나는 해당되지 않을 것이고 나만은 많은 사람들이 실패하는 문턱에서 실패하지 않을 것이고 삶에서 우리가 통제할 수 없는 부분들은 언제나 많지만 내 삶의 요소들은 통제할 수 있는 게 더 많을 것이고 대부분의 인생은 굴곡져있으나 내 인생만큼은 평탄할 것이라고 믿는 (또는 믿고 싶어 하는) 경우를 적지 않게 본다.

그렇다면 거꾸로 이제 곧 큰 병에 걸릴 것이고 엄청나게 실패할 것이며 내 삶의 아무 것도 통제할 수 없을 것이며 인생이 계속해서 바닥을 칠 것이라고 생각하라는 거냐는 반문을 듣기도 한다. (사실 필자의 경우는 한동안 이랬던 기간이 있어서 이것도 꽤 현실적인 예측일 수 있다는 생각을 했다)

중요한 것은 예측의 옳고 그름을 떠나 인생이라는 큰 숲을 볼 때 삶에는 행복하고 즐거운 시간들 못지 않게 그렇지 않은 시간들이 언제일지 모르지만 언젠가는 찾아올 수도 있음을 (물론 안 올 수도 있다) 큰 저항감 없이 받아들이는 것이다.

우선 저항한다고 해서 마음만 복잡해질 뿐 달라지는 것은 없고 대부분의 인간이 어느 정도의 괴로움을 안고 살아간다는 것을 인정할 줄 알아야 되려 고통 속에서도 담담하게 다시금 일어설 수 있는 힘을 얻을 수 있기 때문이다.

일례로 ‘구체적인 사건이나 결과’에 대해 갖는 낙관주의는 독이 될 수 있음을 보여준 연구들이 있었다. 어떤 일이 가급적 잘 되기를 바라고 이를 위해 최선을 다하겠다고 생각하는 것은 좋지만 ‘무조건 잘 될 거야’라고 생각하는 것은 노력을 증가시키지 않았고 따라서 성공률을 더 높이지도 않았다.

다만 잘 안 되었을 때 좌절감은 더 큰 편이었다. 자신이 하는 일이 잘 되는 것이 당연하다고 생각하는 사람들의 경우 좌절을 겪었을 때 신과 세상을 원망하는 모습을 보이기도 했다.

사실 특정 사건의 발생 여부에 대해 우리가 할 수 있는 일은 별로 없다. 실력과 노력이 둘 다 충분했어도 타이밍의 문제 같이 ‘운’에 의해 넘어지는 일이 부지기수다. 이보다는 우리가 좀 더 관여할 수 있는 삶의 ‘과정’과 자신의 ‘태도’, 일을 해석하는 나의 시각 등에 대해 긍정적인 생각을 갖는 것이 좋다.

예를 들어 어제의 내가 그럭저럭 잘 지내왔듯, 내일과 미래의 나도 여전히 넘어지고 다칠지언정 살아낼 거라고 결과가 어찌되었든 그 과정에서 많은 것들을 배울 것이고 그 경험들이 새로운 나를 만들어갈 가능성을 생각해 보는 것이다.

삶은 결국 ‘시간’이기에 언제 어디서 무엇을 하든 나의 시간들을 조금이라도 반짝이게 할 수 있다면 일의 결과는 우리가 생각하는 것보다는 (보통 실패의 무게보다 걱정의 무게가 좀 더 크기 때문에) 나에게 큰 영향을 주지 않는다.

우리 삶에서 가장 빛나는 순간들은 가장 어두운 순간들과 긴밀하게 연결되어 있다는 사실 또한 고통을 직면해야 하는 중요성을 말해준다. 삶을 대하는 성숙한 자세는 삶의 기쁨이 곧 가장 큰 고통이 되기도 한다는 역설을 이해하는 것이다.

예를 들어 세상에서 가장 행복한 사람일수록 그만큼 삶에서 기쁨을 주는 소중한 것들을 많이 가지고 있기 때문에 잃을 것이 많기 때문에 잃는 순간에는 누구보다도 큰 아픔을 겪게 될 수도 있다. 기쁨과 고통은 보통 맞닿아 있기 때문이다.

오랜 기간 많은 공을 들여 간절하게 바래온 일일수록 실패가 쓰라린 법이고 누군가를 사랑할수록 그 사람과의 헤어짐이 아픈 법이다. 소망할 줄 알고 사랑할 줄 아는 사람일수록 좌절의 쓰라림과 이별의 아픔을 안다. 만약 단 한 번도 아픔을 겪지 않은 사람이 있다면 아무것도 소중하게 여기지 않고 사랑하지 않은 사람일 것이다.

우리가 겪은 아픔들은 그만큼 내 삶에는 소중한 것들이 많으며 나는 치열하게 살아왔다는 반증이기도 하다. 이렇게 기쁨과 고통이 사실 하나에서 온다는 것을 알고 나면 삶이 쉽지 않은 이유가 자연스럽게 납득되기도 한다.

마지막으로 결국 누구나 다 늙고 병들고 죽고 만다는 명제, 삶의 유한함과 고통에 대해 직시해야 하는 또 다른 이유는 그래야 힘들어 하는 타인에게 측은지심을 가질 수 있기 때문이다. 모두 자신이 겪는 아픔이 가장 아픈 법이다.

타인의 아픔은 짐작만 할 뿐 직접 겪지 않기 때문이다. 그래서 손쉽게 서로의 아픔을 경쟁하려고 들고 내가 진짜 힘들었고 너의 인생은 편하기만 했다고 그래서 억울하다고 싸우려 든다. 이렇게 아무 것도 변하지 않은 채 모두의 괴로움이 좀 더 늘어나게 된다.

피해의식에 관한 연구들에 의하면 내가 세상에서 제일 힘들다고 생각하는 순간 또 다른 괴로움들을 안고 살아가고 있을 타인들이 미워지고 괜히 보상받고 싶다는 생각을 하게 된다. 여기에서 각종 ‘이기심’이 튀어나오게 된다. 나는 힘들게 살았으니까 지금부터는 좀 이기적으로 막 살아도 된다고 생각하는 모습을 보이게 된다.

이와 달리 ‘이제부터 함께 해결하자’는 방향으로 나아가려면 나를 포함한 모든 사람들이 자기만의 어려움을 안고 살아간다는 사실을 인정해야 한다. 여기서부터 어떤 것이 좀 더 해결 가능한지, 어떤 것이 사회적 단위의 노력을 요하는지, 서로 어떻게 도울 수 있는지 등의 좀 더 건설적인 대화가 가능해진다.

인간이 겪을 수 있는 고통들을 직면해야만 더 나은 삶을 살 수 있다는 것은 오랫동안 다양한 종교와 철학자들에 의해 전해져 왔다. 인간이 고통을 이겨내는 방식에 대한 심리학의 연구 또한 같은 이야기를 한다는 것이 당연한 것 같으면서도 신기하다는 생각이 든다.

삶이 던져주는 좋은 것들을 사랑하는 만큼 아픔 또한 받아들일 수 있다면 힘든 때에 마음이 지하로 추락하는 일은 어느 정도 피할 수 있을 것 같다.

※필자소개
박진영. 《나, 지금 이대로 괜찮은 사람》, 《나를 사랑하지 않는 나에게》를 썼다. 삶에 도움이 되는 심리학 연구를 알기 쉽고 공감 가도록 풀어낸 책을 통해 독자와 꾸준히 소통하고 있다. 온라인에서 ‘지뇽뇽’이라는 필명으로 활동하고 있다. 현재 미국 듀크대에서 사회심리학 박사 과정을 밟고 있다.

Loading

23 4월 2025

[인공지능 기술] 개발자가 맞닥뜨린 갈림길…‘바이브 코딩’을 배우거나, 은퇴하거나

[인공지능 기술] 개발자가 맞닥뜨린 갈림길…‘바이브 코딩’을 배우거나, 은퇴하거나

‘바이브 코딩’은 앞으로 개발자가 코드를 짜는 방식이 될 것이다. 지금 배우지 않으면 개발자로서 커리어는 끝난다.

01 3967678-0-70166200-1745395027-shutterstock_1724042191.pngCredit: Photoongraphy / Shutterstock

 

제목을 보고 분노하기를 바란다. 화내라. 책상을 쾅 내려치고 고개를 절레절레 흔들어라. 그리고 진지하게 받아들여라. 바이브 코딩(Vibe Coding)을 배워야 한다. 그렇지 않으면 소프트웨어 개발자 커리어는 끝난다.

바이브 코딩은 최신 세대의 코드 생성 툴, 즉 LLM(흔히 말하는 챗GPT)을 활용하는 방식을 귀엽게 부르는 말이다. 커서(Cursor), 코드라인(Codeline), 탭나인(Tabnine) 같은 수많은 툴이 있는데, 솔직히 말해 전부 별로다. 이제 여기에 이 분야의 원조 격인 깃허브 코파일럿(GitHub Copilot)까지 본격적으로 가세하고 있다. 대부분은 비주얼 스튜디오 코드(Visual Studio Code)의 파생 버전이거나 플러그인 형태다.

게임 개발 경험이 전혀 없는 사람이 GPT로 게임 하나를 뚝딱 만들어서 대통령이 트위터에 올리고, 그걸로 백만장자가 되는 일이 가능하다는 말은 아니다. (사실 그보다 더 황당한 일이 실제로 벌어지기는 했다.) 생성형 AI 코딩 툴이 훌륭하다는 얘기를 하려는 것도 아니다. 오히려 더 엉망이고, 보안 취약점이 더 많은 코드를 낼 가능성이 크다. 여기서 말하려는 건 단 하나다. 이런 툴을 배우지 않으면, 곧 업계에서 은퇴할 준비를 해야 할 거라는 점이다.

어디서 들어본 이야기

뻔한 이야기다. 이런 일은 예전에도 있었다. 커리어 초장기에 필자는 한 개발자를 만났다. 편의상 톰이라고 부른다. 톰은 전형적인 구세대 개발자였다. 키보드를 눈으로 보며 타자 치는 식의 ‘독수리 타법’으로 프로그래밍을 하던 사람이었다. 톰은 비주얼 베이직(Visual Basic)으로 보고서 하나 만드는 데 6개월이 걸렸다. 예전에는 어떤 언어를 썼는지는 모르겠지만, VB는 책을 통해 독학했다고 했다. 톰이 휴가를 간 동안, 원래는 둘이 함께하기로 했던 보고서를 10일 정도 만에 끝냈다. 일부러 톰이 할 부분은 남겨뒀는데, 그때부터 톰은 나를 싫어했다.

어떻게 그렇게 빨리 해냈느냐고? IDE를 활용했고 인터넷 검색을 했다(이때는 ‘구글링하다’라는 말이 없던 시기였다). 우리가 자바로 전환했을 때 필자는 인터넷에서 자바를 일주일 만에 익혔고 동시에 J빌더(JBuilder) 사용법도 배웠다. 반면 톰은 브루스 에켈의 『씽킹 인 자바(Thinking in Java)』 책을 사서 여전히 독수리 타법으로 쿵쾅대며 타이핑하고 마치 성경이라도 되는 듯 그 책에 의존했다. 톰은 새로운 방식으로 배우고자 하지 않았다. 세상이 바뀌는 걸 비난하면서 낡은 방식에 머무르고 싶어 했을 뿐이었다.

현재 링크드인에는 두 부류의 사람이 있다. 1년 전까지만 해도 웹3를 외치던 사람이 지금은 바이브 코딩에 대해 과장된 주장을 늘어놓는다. 그리고 또 한 부류는 ‘톰들’이다. 보안이 어쩌니, 코딩은 예술이니 하면서 온갖 불평을 늘어놓는 사람들이다. 만약 당신이 톰이라면, 이제 퇴직 알람을 맞춰야 할 때다. 새로운 방식으로 일하는 법을 배우는 것은 개발자라는 직업의 일부다.

비즈니스 소프트웨어를 만드는 개발자는 예술가도 아니고 코드 시인도 아니다. “소프트웨어 장인 정신” 같은 건 아무도 신경 쓰지 않는다. 상사의 말이 맞다. 새로운 방식을 배우고 더 빠르게 코딩해야 한다. 그게 아니면, 키보드 좀 잘 두드릴 줄 알고 구글 검색 하나 잘하는 20대를 만난 뒤 결국 은퇴를 택했던 톰이 된다. 그게 전부다. 바이브 코딩을 하든가, 은퇴하든가.

LLM이 정말 그렇게 대단하냐고? 그렇다. 완전한 애플리케이션을 생성할 수 있냐고? 그렇다. 결과물이 형편없을 거냐고? 그건 사용자의 실력에 달렸다. LLM은 만병통치약이 아니다. “코딩 없이도 할 수 있다”라는 새로운 세대의 구호는 사실 이전 세대의 “코딩 없이도 할 수 있다”라는 말과 전혀 다르지 않다. 단순한 것만 하려면 정말 코딩 없이도 되기는 한다. 하지만 버전 2.0이 필요하거나 복잡한 뭔가를 만들려면 결국 코딩이 필요하다. 예전과 똑같다. 달라진 건 단 하나, 코딩 툴의 속도와 품질이 더 좋아졌다는 점뿐이다.

 

시간이 필요하다

바이브 코딩 툴을 처음 써서 만든 애플리케이션은 형편없을 것이다. 툴이 무척 답답할 것이고 스스로 잘 활용하지 못한다고 느낄 것이다. 하지만 그건 도구 탓이 아니라 사용자 탓이다. 이런 툴은 아직 성숙도나 안정성 면에서 J빌더, (아마 이 정도까진 아니겠지만) 비주얼 베이직 4.2, 자바스크립트 1.0 수준이다. 사용하다 보면 이상한 동작을 해서 짜증이 나고 당장이라도 때려치우고 싶어질 수도 있다. 하지만 점점 적응하고 이런 툴과 함께 일하는 방법을 익히면 점점 속도가 붙기 시작한다.

코딩을 조금이라도 할 줄 아는 사람이라면 이런 툴은 처음 구조를 잡는 단계 이후부터는 오히려 속도를 늦출 수 있다. 툴이 내리는 이상한 결정에 고개를 절레절레 젓게 되겠지만, 결국에는 이 툴을 원하는 대로 사용하는 방법을 배우게 된다. 지금까지 새로운 개발 툴이나 기술을 배울 때 항상 그랬던 것처럼 말이다.

일단 요령이 생기면 새로운 역량을 얻게 된다. 필자 역시 코딩은 할 줄 알지만, 자바스크립트를 제대로 배워야겠다고 생각한 적은 별로 없었다. 그런데도 최근에 제법 복잡하고 방대한 자바스크립트 애플리케이션을 3주도 안 돼서 완성했다. 물론 생성형 AI 없이도 언젠가는 다 했을 일이다. 하지만 필요한 API를 일일이 검색하고 확장 포인트를 익히는 데는 시간이 꽤 걸렸을 것이다. 심지어 지금보다 훨씬 괜찮았던 시절의 구글링을 한다 해도 말이다. 필자가 바이브 코딩으로 완성한 결과물은 예전 같으면 석 달은 걸렸을 작업이었다. AI 덕분에 생산성이 10배 증가한 건 아니지만, 평소보다 작업 속도가 5배는 빨라졌다.

다가올 바이브 코딩 시대, 살아남고 싶다면 지금부터 준비해야 한다. 다음은 실전에 바로 쓸 수 있는 몇 가지 팁이다.

  • 우선 커서, 코드라인 같은 툴의 무료 버전부터 시작하라. 뭐든 상관없다. 그리고 곧바로 최소 40달러는 지불하라. 코드가 그려지는 걸 멍하니 보고만 있어선 실력이 늘지 않는다.
  • “시간만 있었으면 만들었을” 프로젝트를 골라라. 예를 들어, 줌 녹화 저장 문제를 스스로 해결했던 어떤 사람처럼 말이다.
  • 깃(Git)을 자주 사용하라. AI 코딩 툴은 종종 어이없는 짓을 종종 저지른다. 복구하려면 버전 관리에 익숙해야 한다.
  • 본격적으로 코딩을 시작하기 전에 LLM과 설계 대화를 나눠라. 결과를 마크다운 형식으로 받아두면 좋다. 대부분의 바이브 코딩 IDE는 이 마크다운을 지침 설정에 넣을 수 있다. 모델에게 같은 설명을 반복하지 않아도 된다. 혹시 까먹으면 다시 넣어주면 된다.
  • 매 단계마다 결과를 검토하고 모델이 엉뚱한 짓을 하면 과감히 되돌려라.
  • 답답해도 버텨라. 써먹을 줄 알게 되면 이런 툴은 무기가 된다.
  • 지금 시점에서는 클로드 3.7 소넷(Claude 3.7 Sonnet)이나 제미나이 2.5 프로(Gemini 2.5 Pro) 혹은 실험 버전(Gemini 2.5 Experimental)이 가장 쓸 만하다.

바이브 코딩은 곧 현실이 된다. 개발자는 앞으로 이렇게 코딩할 것이다. 지금 배우기 시작하라. 아니면 은퇴 준비를 하라.
dl-itworldkorea@foundryco.com

[출처] https://www.itworld.co.kr/article/3967678/%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EB%A7%9E%EB%8B%A5%EB%9C%A8%EB%A6%B0-%EA%B0%88%EB%A6%BC%EA%B8%B8%EB%B0%94%EC%9D%B4%EB%B8%8C-%EC%BD%94%EB%94%A9%EC%9D%84-%EB%B0%B0.html

Loading

22 4월 2025

[Ollama 응용개발] 로컬 환경에서 API 호스팅을 위한 Ollama 설정 종합 가이드 

[Ollama 응용개발] 로컬 환경에서 API 호스팅을 위한 Ollama 설정 종합 가이드 

2025-04-22-01 블로그 포스팅 ad1fa514-dd01-40f5-9717-90164a969d40.png

 

1. Ollama 소개

Ollama는 자체 하드웨어에서 대규모 언어 모델(LLM)을 로컬로 실행할 수 있게 해주는 오픈소스 프레임워크입니다. Llama 3, DeepSeek-R1, Phi-4, Gemma 2 등의 모델을 복잡한 인프라 설정 없이 다운로드, 설정 및 상호작용할 수 있는 과정을 단순화합니다.

Ollama의 주요 기능:

  • 로컬 머신에서 완전히 오프라인으로 LLM 실행
  • 간단한 명령줄 인터페이스
  • 애플리케이션과의 통합을 위한 RESTful API
  • CPU 및 GPU 가속 지원
  • 모델 관리(다운로드, 실행, 생성, 삭제)

2. 시스템 요구 사항

Ollama를 설치하기 전에 시스템이 다음 최소 요구 사항을 충족하는지 확인하세요:

최소 요구 사항:

  • 운영 체제: macOS, Linux 또는 Windows
  • RAM: 최소 8GB(대형 모델의 경우 16GB+ 권장)
  • 디스크 공간: Ollama 및 기본 모델용 12GB+(추가 모델을 위한 더 많은 공간)
  • CPU: 다중 코어 프로세서(합리적인 성능을 위해)

더 나은 성능을 위한 권장 사항:

  • RAM: 16GB+
  • GPU: CUDA를 지원하는 NVIDIA GPU 또는 Apple Silicon
  • 디스크 공간: 50GB+ SSD 저장 공간

3. 설치 방법

macOS 설치

  1. 공식 웹사이트에서 설치 프로그램을 다운로드하거나 Homebrew를 사용하세요:

    공식 설치 프로그램 사용:

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

    Homebrew 사용:

    brew install ollama
  2. Ollama 시작:
    ollama serve

Linux 설치

  1. 설치 스크립트를 사용하여 설치:
    curl -fsSL https://ollama.com/install.sh | sh
  2. 수동 설치나 특정 Linux 배포판의 경우 공식 문서를 확인하세요.
  3. Ollama 서비스 시작:
    ollama serve

Windows 설치

  1. 공식 웹사이트에서 설치 프로그램 다운로드: https://ollama.com/download
  2. 설치 프로그램을 실행하고 설치 마법사를 따르세요.
  3. 설치 후, 시작 메뉴에서 Ollama를 실행하거나 다음을 실행하세요:
    ollama serve

4. 기본 사용법

Ollama가 설치되면 기본 명령어로 사용을 시작할 수 있습니다:

모델 다운로드(Pull)

ollama pull llama3.2

이것은 Llama 3.2 모델을 로컬 머신에 다운로드합니다. llama3.2를 사용 가능한 다른 모델로 대체할 수 있습니다.

사용 가능한 모델 목록 보기

ollama list

대화형 모드에서 모델 실행

ollama run llama3.2

이렇게 하면 모델과 채팅할 수 있는 대화형 세션이 시작됩니다.

5. API 서버 설정 및 구성

Ollama는 ollama serve를 실행하면 자동으로 포트 11434에서 API 서버를 시작합니다. 기본적으로 localhost(127.0.0.1)에 바인딩되어 로컬 머신에서만 접근할 수 있습니다.

API 서버 구성

환경 변수를 사용하여 API 서버를 구성할 수 있습니다:

  1. 다른 머신에서 액세스할 수 있도록 바인딩 주소 변경:
    OLLAMA_HOST=0.0.0.0 ollama serve

    이렇게 하면 Ollama가 모든 네트워크 인터페이스에 바인딩되어 네트워크의 다른 머신에서 접근할 수 있습니다.

  2. 포트 변경:
    OLLAMA_HOST=127.0.0.1:8000 ollama serve

    이렇게 하면 Ollama가 기본 11434 대신 포트 8000에서 실행됩니다.

  3. 시스템 서비스로 설정(Linux):

    systemd 서비스 파일 생성:

    sudo nano /etc/systemd/system/ollama.service

    다음 내용 추가:

    [Unit]
    Description=Ollama Service
    After=network.target
    
    [Service]
    Type=simple
    User=YOUR_USERNAME
    Environment="OLLAMA_HOST=0.0.0.0"
    ExecStart=/usr/local/bin/ollama serve
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target

    서비스 활성화 및 시작:

    sudo systemctl enable ollama
    sudo systemctl start ollama

6. API 사용 예제

API 서버가 실행 중이면 다양한 방법으로 상호작용할 수 있습니다:

curl 사용

  1. 응답 생성:
    curl -X POST http://localhost:11434/api/generate -d '{
      "model": "llama3.2",
      "prompt": "기계 학습이란 무엇인가요?",
      "stream": false
    }'
  2. 채팅 API(대화형 모델용):
    curl -X POST http://localhost:11434/api/chat -d '{
      "model": "llama3.2",
      "messages": [
        {
          "role": "user",
          "content": "기계 학습이란 무엇인가요?"
        }
      ],
      "stream": false
    }'
  3. 사용 가능한 모델 나열:
    curl http://localhost:11434/api/tags
  4. 모델 다운로드:
    curl -X POST http://localhost:11434/api/pull -d '{
      "name": "phi3:mini"
    }'

Python 사용

  1. 공식 Python 라이브러리 설치:
    pip install ollama
  2. 기본 사용법:
    import ollama
    
    # 응답 생성
    response = ollama.generate(
        model='llama3.2',
        prompt='기계 학습이란 무엇인가요?'
    )
    print(response['response'])
  3. 채팅 API:
    import ollama
    
    response = ollama.chat(
        model='llama3.2',
        messages=[
            {
                'role': 'user',
                'content': '기계 학습이란 무엇인가요?'
            }
        ]
    )
    print(response['message']['content'])
  4. 스트리밍 응답:
    import ollama
    
    # 응답 스트리밍
    stream = ollama.generate(
        model='llama3.2',
        prompt='AI에 대한 시를 작성해주세요.',
        stream=True
    )
    
    for chunk in stream:
        print(chunk['response'], end='', flush=True)

7. 성능 최적화

다음 팁을 사용하여 Ollama의 성능을 최적화하세요:

  1. GPU 가속:
    • 최신 GPU 드라이버가 설치되어 있는지 확인
    • NVIDIA GPU의 경우 CUDA 및 cuDNN 설치
    • Ollama는 사용 가능한 경우 자동으로 GPU를 사용
  2. 모델 선택:
    • 제한된 하드웨어에서 더 빠른 응답을 위해 더 작은 모델 선택
    • 더 나은 성능을 위해 양자화 버전(예: Q4_K_M) 고려
  3. 매개변수 조정:
    • 메모리 사용량과 성능의 균형을 맞추기 위해 컨텍스트 길이 조정:
      ollama run llama3.2 --parameters num_ctx=2048
    • 더 빠른 추론을 위해 온도 조정:
      ollama run llama3.2 --parameters temperature=0.1
  4. 리소스 모니터링:
    • 모델 실행 중 CPU, GPU 및 메모리 사용량 모니터링
    • htopnvidia-smi 또는 top과 같은 도구를 사용하여 리소스 사용량 추적
  5. 캐시 관리:
    • Ollama는 성능 향상을 위해 생성된 응답을 캐시함
    • 필요한 경우 캐시 지우기: rm -rf ~/.ollama/cache

8. 보안 고려 사항

API가 활성화된 Ollama를 호스팅할 때 다음 보안 조치를 고려하세요:

  1. 네트워크 노출:
    • 기본적으로 Ollama는 localhost(127.0.0.1)에 바인딩되며, 이는 안전함
    • 다른 머신에서 액세스해야 하는 경우에만 OLLAMA_HOST=0.0.0.0 사용
    • 안전한 원격 액세스를 위해 TLS가 있는 리버스 프록시(Nginx와 같은) 사용 고려
  2. 액세스 제어:
    • Ollama 포트에 대한 액세스를 제한하는 방화벽 규칙 구현
    • 네트워크에 노출시키는 경우 인증 설정 고려
  3. 모델 보안:
    • 신뢰할 수 있는 출처의 모델만 사용
    • 알 수 없는 출처의 사용자 정의 모델에 주의
  4. API 토큰(사용자 정의 인증을 구현하는 경우):
    • 애플리케이션을 위한 API 토큰 시스템 구현 고려
    • Nginx와 같은 리버스 프록시를 사용한 예:
      location /api/ {
          auth_basic "Restricted";
          auth_basic_user_file /etc/nginx/.htpasswd;
          proxy_pass http://localhost:11434;
      }

9. 일반적인 문제 해결

설치 문제

  • 권한 거부 오류:
    sudo chmod +x /path/to/ollama
  • 라이브러리 종속성 누락(Linux):
    sudo apt-get install build-essential

API 연결 문제

  • API에 연결할 수 없음:
    • Ollama가 실행 중인지 확인: ps aux | grep ollama
    • 포트가 열려 있는지 확인: netstat -tuln | grep 11434
    • 방화벽 설정 확인: sudo ufw status
  • 403 Forbidden 오류:
    • 네트워크 구성 및 바인딩 주소 확인

성능 문제

  • 높은 메모리 사용량:
    • 더 작은 모델 또는 양자화 버전 사용
    • 컨텍스트 길이 감소: --parameters num_ctx=2048
  • 느린 응답:
    • 가능한 경우 GPU 가속 활성화
    • 제한된 하드웨어에서 더 작은 모델 사용
    • 배치 크기 조정: --parameters num_batch=128
  • GPU가 감지되지 않음:
    • GPU 드라이버 업데이트
    • NVIDIA의 경우 CUDA가 제대로 설치되어 있는지 확인
    • GPU와 CUDA의 호환성 확인

결론

이제 API 호스팅과 함께 로컬 환경에서 Ollama를 설정하는 방법에 대한 포괄적인 이해를 갖게 되었습니다. 이 가이드를 따르면 특정 요구 사항에 맞게 Ollama를 설치, 구성 및 최적화하는 방법을 배웠습니다. 이제 API를 사용하여 Ollama를 애플리케이션에 통합하고 강력한 언어 모델을 로컬에서 실행할 수 있습니다.

최신 업데이트 및 자세한 문서는 공식 Ollama GitHub 저장소를 방문하세요: https://github.com/ollama/ollama.

참고 문헌

  1. Ollama API 문서: https://github.com/ollama/ollama/blob/main/docs/api.md
  2. Ollama GitHub 저장소: https://github.com/ollama/ollama
  3. Ollama Python 라이브러리: https://github.com/ollama/ollama-python
  4. Ollama 공식 웹사이트: https://ollama.com/download

출처: https://memoryhub.tistory.com/entry/로컬-환경에서-API-호스팅을-위한-Ollama-설정-종합-가이드 [메모리허브:티스토리]

Loading