16 10월 2025

[一日30分 인생승리의 학습법] 명령형 vs 선언형 프로그래밍

[一日30分 인생승리의 학습법] 명령형 vs 선언형 프로그래밍

명령형 프로그래밍은 절차적 프로그래밍이라고도 하는데,

최근에 우테코 미션을 하다가 요런 말을 들은 적이 있다.

 

전반적으로, 너무 절차적 프로그래밍으로 코드를 작성하는 경향이 있습니다.
좀 더 선언적으로 기능을 구현할 수 있게 사고 전환을 해보시면 나중에 큰 도움이 될 거예요.

 

처음에는 무슨 말인지 정확히 감이 잡히질 않아서 여기저기 찾아보다가

ui.dev라는 사이트에서 Tyler McGinnis라는 분이 작성한 글을 보고 조금씩 이해가 되기 시작했다.

그래서 기분이 좋아져서 번역이나 해봐야겠다 싶었다.


나는 언젠가 분명 ‘명령적(Imperative) 프로그래밍 vs 선언적(Declarative) 프로그래밍’에 대해 들어본 적이 있다.

저게 무엇을 의미하는지를 당연히 검색해봤지만, 그 때마다 요런 정의 정도만 접해볼 수 있었다.

 

명령형(절차적) 프로그래밍은 당신이 어떤 일을 어떻게 할 것인가에 관한 것이고,
선언적 프로그래밍은 당신이 무엇을 할 것인가에 관한 것입니다.

 

만약 내가 명령형과 선언형의 차이를 이미 알고 있었더라면 이 정의가 명확하게 다가왔겠지만 나는 그렇지 않았다.

사실 나 뿐만 아니라 많은 사람들이 이 주제에 대해 어려움을 느끼는데,

아마 직관적으로는 무슨 말인지 알지만, 누군가에게 설명할 만큼 명확하지는 않기 때문일 것이다.

 

많은 개발자들이 여기기에 가장 효과적인 방법은 비유와 실제 코드를 조합해서 설명해주는 것이었다고 하니,

해당 방법으로 ‘명령형 vs 선언적 프로그래밍’이라는 주제를 다뤄보도록 하자.


우선, 위에서 언급했던 저 ‘어떻게, 무엇을’에 관한 정의는

사실 ‘명령형 vs 선언형’의 핵심을 담고있다고 봐도 무방하다.

이를 이해하기 위해, 프로그래밍의 관점에서 잠깐 벗어나 현실에서의 예시를 들어보도록 하자.

 

■ Red Lobster

당신은 회사에서 너무 오랜 시간 자바스크립트를 다루느라 피곤해졌습니다.

그리고 이를 달래기 위해 퇴근 후에 아내와 함께 ‘Red Lobster’ 식당에 근사한 데이트를 하러 갔습니다.

당신은 Red Lobster에 도착했고, 프론트 데스크에 가서 다음과 같이 말했습니다.

  • 명령형 접근(HOW): “저기 Gone Fishin’ 이라고 적힌 표지판 아래에 있는 테이블이 비어있네요.
    우리는 저기로 걸어가서 저 테이블에 앉도록 하겠습니다.”
  • 선언형 접근(WHAT): “2명 자리 주세요.”

 

명령형 방식은 내가 실제로 자리에 어떻게 앉을지에 관심이 있다. 

이를 위해 나는 내가 어떻게 테이블을 잡아서 자리에 앉을지에 관해, 필요한 단계들을 하나하나 나열해야 한다.

반면, 선언형 방식은 오로지 내가 무엇을 원하는지에 관심이 있다. 여기서 말한 ‘두 명을 위한 테이블’ 처럼.

 

■ Wal-Mart

친구가 당신의 집에 집들이를 오기 위해 Wal-Mart에서 선물을 샀습니다.

현재 친구는 Wal-Mart 바로 옆에 있으며, 당신의 집에 어떻게 도달해야 하는지를 전화로 물어봅니다.

이에 관한 명령형 대답과 선언형 대답을 모두 생각해보세요.

  • 명령형 접근(HOW): “주차장 북쪽 출구로 나와서 좌회전을 해. 12번가 출구에 도착할 때까지
    I-15 북쪽 도로를 타고 와야 해. 거기서 IKEA에 가는 것처럼 출구에서 우회전을 해. 그리고 거기서
    직진하다가 첫 번째 신호등에서 우회전을 해. 그 다음에 나오는 신호등을 통과한 후에 좌회전을 하면 돼.
    우리 집은 #298 이야.”
  • 선언형 접근(WHAT): “우리 집 주소는 298 West Immutable Alley, Eden, Utah 84310 이야.”

 

추가로 한 가지 비유를 더 하자면, 수동 스틱 자동차와 오토 스틱 자동차를 예로 들 수 있다.

친구가 ‘우리 집에 어떻게 도착하는가’ 와는 별개로, 친구가 어떤 차를 운전하느냐에 관한 이야기이다.

수동 스틱(1종)은 명령형 방식이고 오토 스틱(2종)은 선언적 방식이다.

만약 당신이라면 어떤 차를 운전하겠는가?


실제 코드로 예시를 들기 전에, “자리에 앉는 방법은 누가 알지?”,

“주소는 아는데, 집에 가는 방법은 누가 알지?”와 같은 의문이 생길 수 있을거라 생각한다.

이에 대한 대답은, 선언적 방식의 접근을 위해서는 명령형 방식으로

‘어떻게 접근하는가’에 관한 내용이 먼저 추상화 되어있어야 한다 라는 것.

  • Red Lobster 직원에게 사용했던 선언형 접근(“2명 자리 주세요.”)에는, Red Lobster 직원이
    ‘테이블에 어떻게 앉는가’에 관한 모든 명령형(절차적) 단계들을 알고 있다는 가정이 뒷받침되어 있다.
  • 친구에게 우리 집의 주소를 알려주는 것도, 친구가 ‘우리 집에 어떻게 도착할 수 있는가’에 관한 명령적 절차들을
    모두 알고있는 일종의 GPS 같은 것을 가지고 있다는 것을 전제로 한다.
  • 오토 스틱(2종) 자동차는 변속 기어에 대해 일종의 추상화 계층(Layer)을 가지고 있다.

 

위의 내용들을 다음의 문장으로 다시 한 번 정리할 수 있다.

 

많은 선언적(Declarative) 접근 방식들의 기반에는 일종의 ‘명령적(Imperative) 추상화’가 존재한다.


이제, 여러가지 비유로 떡칠된 예시들을 졸업하고 현실 세계의 코드 예시를 살펴볼 차례이다.

그 전에, ‘선언적 프로그래밍 언어’와 ‘명령적 프로그래밍 언어’에는 어떤 것들이 있는지 간단히 살펴보자.

  • 명령적 언어: C, C++, Java
  • 선언적 언어: SQL, HTML
  • (Can be) Mix: Javascript, C#, Python

우선, 대표적인 선언형 언어인 SQL과 HTML의 코드를 살펴보자.

SELECT * FROM Users WHERE Country='Mexico';
<article>
  <header>
    <h1>Declarative Programming</h1>
    <p>Sprinkle Declarative in your verbiage to sound smart</p>
  </header>
</article>

이 두 가지 예시 모두 문법만 알고 있다면, 어떤 일이 일어나고 있는지 명확히 알 수 있다.

이 둘은 모두 선언형 프로그래밍이며, 어떤 일을 어떻게 수행하는가 보다는 무엇을 수행하는가에 관심이 있다.

즉, 우리가 무엇을 얻고자 하는가에 관해서만 묘사하고 있고, 그것을 어떻게 얻는가에 관해서는 알려주지 않는다.

 

SQL 예시에서는 멕시코에 거주하는 모든 유저들을 선택하는 ‘방법에 대한 구현’은 우리에게서 추상화되어있다.

HTML 예시에서는 ‘웹 브라우저가 어떻게 article 엘리먼트를 파싱해서 화면에 보여주는가’는 고려하지 않는다.

우리의 WHAT은 오직 ‘멕시코 유저들‘과 웹사이트의 ‘header와 paragraph‘이다.

 

지금까지는 충분히 알아먹을 수 있을 것 같다.

이제, 조금 더 실전적인 자바스크립트 예제로 들어가보자.


■ 기술 면접

당신은 현재 기술 면접을 보는 중이고, 나는 해당 기술 면접의 interviewer입니다.

콘솔창을 열고, 제가 묻는 질문에 해당하는 답을 작성해보세요.

 

1. 숫자 배열을 받아서, 해당 배열의 모든 원소들을 두 배 시킨
새로운 배열을 리턴하는 ‘double’이라는 이름의 함수를 작성하세요.

ex) double([1, 2, 3]) // [2, 4, 6]

 

2. 숫자 배열을 받아서, 해당 배열의 모든 원소들을 더한 값을 리턴하는 ‘add’라는 함수를 작성하세요.

ex) add([1, 2, 3]) // 6

 

3. jQuery나 Vanilla Javascript를 이용해서, btn이라는 id를 가진 엘리먼트에 이벤트 리스너를 달아보세요.

해당 버튼을 클릭했을 때 highlight라는 class를 toggle(add or remove)해야 하고,

엘리먼트의 현재 상태에 따라 버튼의 텍스트를 ‘Add Highlight’와 ‘Remove Highlight’로 바꿔야 합니다.

 

이 문제들에 대해, 가장 흔히들 작성하는 ‘명령적’ 코드들을 먼저 살펴보자.

function double (arr) {
  let results = []
  for (let i = 0; i < arr.length; i++){
    results.push(arr[i] * 2)
  }
  return results
}

function add (arr) {
  let result = 0
  for (let i = 0; i < arr.length; i++){
    result += arr[i]
  }
  return result
}

$("#btn").click(function() {
  $(this).toggleClass("highlight")
  $(this).text() === 'Add Highlight'
    ? $(this).text('Remove Highlight')
    : $(this).text('Add Highlight')
})

 

무엇이 이 코드들을 명령적으로 만드는지 알기 위해서는, 이 세 가지 코드들에서 공통점을 뽑아내야 한다.

 

1. 가장 명백한 공통점은 이들이 어떤 일을 어떻게 처리하는지에 관해 묘사하고 있다는 것.

각각의 예시에서, 우리는 명시적으로 배열을 반복하거나(for 문),

우리가 원하는 기능을 수행하기 위한 단계들을 명시적으로 나열하고 있다.

 

2. 각각의 예시에서 우리는 ‘상태(state)의 일부’를 변경하고 있다. 
(상태: 메모리에 저장되어 있는 것들에 대한 정보. 변수와 비슷하다고 생각하면 됨)

처음 두 예시에서는 ‘results’라는 변수를 만들어 그것을 계속해서 수정하고 있다.

세 번째 예시에서는 아무런 변수도 없지만, 여전히 DOM 자체에 state가 존재하고 있다.

그리고 해당 코드는 DOM의 state를 수정하고있다.

 

3. 약간 주관적이지만, 위의 코드들은 가독성이 떨어진다.

위의 코드들을 한 번 슥 훑어보고 어떤 일이 일어나고 있는지 바로 알아채기는 쉽지 않을 것이다.

우리의 뇌는 코드가 존재하는 맥락을 고려해가며, 해당 코드들을 인터프리터처럼 차근차근 살펴봐야 한다.


이런 똥쓰레기같은 코드들은 이제 그만 보고, 이제 선언적 예시들을 살펴보자.

선언적 예시들의 목적은 위에서 봤던 예시들의 문제점들을 모두 해결하는 것이다.

그러기 위해서 이 코드들은 무엇이 일어나는지에 관해 묘사해야 하고,

state를 변경해선 안되며한 눈에 파악할 수 있어야 한다(가독성이 좋아야 한다).

function double (arr) {
  return arr.map((item) => item * 2)
}

function add (arr) {
  return arr.reduce((prev, current) => prev + current, 0)
}

<Btn
  onToggleHighlight={this.handleToggleHighlight}
  highlight={this.state.highlight}>
    {this.state.buttonText}
</Btn>

처음 두 예제에서, 자바스크립트의 내장 함수인 map과 reduce를 활용한 레버리징에 주목하자.

이는 이 글 내내 반복해서 언급했던,

가장 효율적인 선언적 프로그래밍 방법은 명령적으로 작성된 코드를 추상화하는 것이다

라는 것에 관한 내용이다.

 

해당 예제들은 우리가 어떻게 처리할지보다, 무엇을 원하는지를 설명한다.

(우리는 map과 reduce가 어떻게 구현되어있는지는 전혀 알지도 못하고, 관심도 없다)

우리는 아무런 state도 변경하지 않는다. 모든 변경들은 map과 reduce 내부에 추상화되어있다.

그리고 당신이 map과 reduce에 익숙하다는 가정 하에, 훨씬 더 가독성이 좋다.

 

이제, 마지막 예제를 살펴보자.

여기서는 약간의 편법으로 리액트를 사용했다.

그러나 중요한 것은 명령형의 세 가지 문제점들이 모두 해결이 되었다는 것.

리액트의 진정한 강점은 이러한 선언적인 방식으로 UI를 작성할 수 있다는 것이다.

우리의 Btn 컴포넌트를 보면, 해당 UI가 어떤 식으로 보일지를 빠르게 알아챌 수 있다.

또 다른 강점은 state가 DOM에 존재하는 대신, 우리가 만든 리액트 컴포넌트 자체에 존재한다는 것.

 

선언적 프로그래밍의 또 다른, 덜 알려진 장점 중의 하나는

우리의 프로그램이 context-independent 해질 수 있다는 것이다.

(전체적인 맥락, 상황에 좀 더 독립적이다)

 

선언적 코드들은 최종적인 목표가 무엇인지에 대해서만 관심이 있지,

해당 목표를 이루기 위한 세부적인 단계들(해당 목표에 의존적인 과정들)에는 관심이 없다는 것.

그래서 동일한 코드들이 다른 프로그램에 쓰이더라도 정상적으로 동작할 수 있게 된다.

 

당장 위의 세 예시만 보더라도, 저 함수들이나 컴포넌트는

우리가 만들고자 하는 어떤 프로그램에 갖다붙여도 정상적으로 동작한다.

저들은 현재 어떤 프로그램에 속해있는가 하는 것에 전혀 구애받지 않는다.

명령형 코드들은 그렇지 못한 경우가 많은데, 그 이유는 대부분의 경우

명령형 코드들이 현재 상태의 컨텍스트에 의존적이기 때문이다.

(그래서 다른 곳에서 재사용하기가 어렵다)


이 글의 저자는, 선언적 프로그래밍에서 더 나아가 함수형 프로그래밍까지 다뤄보라고 권유하고 있다.

map, reduce, filter를 사용해보면서 차근차근 시작하라고 하는데, 함수형 프로그래밍에 관해서도

조만간 한 번 알아보는 시간을 가지면 좋을 듯.

 

개인적으로 가장 와닿았던 부분은, 선언적 프로그래밍은 절차적 구현을 추상화함으로써 이루어진다는 것.

선언적 프로그래밍을 어떻게 해야 하는가에 대해 좀 더 감을 잡을 수 있게 해준 내용인 듯.

리뷰어분들께서 말씀하시는 ‘재사용성’이나 ‘순수 함수’에 관한 것들이 약간 일맥상통하는 부분이 아닌가 싶다.

 

최대한 독립적이고 재사용성이 높은 함수들을 구현하여, 해당 함수들의 조합으로 프로그래밍을 구성하면

전체 코드의 유지보수가 쉬워지고 가독성도 훨씬 높아지겠지. 그게 말처럼 쉽겠냐마는..


아래는 저자가 웹을 돌아다니며 발견한 선언적 프로그래밍의 또 다른 정의들.

 

Declarative programming is “the act of programming in languages that conform to the mental model of the developer rather than the operational model of the machine.”

 

선언적 프로그래밍은 “기계의 동작을 모델로 하는 것이 아닌, 개발자의 두뇌(정신, 생각)를 모델로 본딴 언어를 가지고 프로그래밍 하는 것” 이다.

 

 

Declarative Programming is programming with declarations, i.e., declarative sentences.

 

선언적 프로그래밍은 선언(선언적 문장, 선언문)들을 사용해서 프로그래밍하는 것이다.

?

 

 

The declarative property is where there can exist only one possible set of statements that can express each specific modular semantic. The imperative property is the dual, where semantics are inconsistent under composition and/or can be expressed with variations of sets of statements.

 

선언적 속성이란, 특정 모듈을 설명하는 문장 집합이 단 하나만 존재할 수 있다는 것을 의미한다. 명령적 속성은 이중적이고, 이는 의미들의 구성에 일관성이 없고 여러 가지 문장 집합들로 표현될 수 있다는 것을 의미한다.

 

 

Declarative languages contrast with imperative languages which specify explicit manipulation of the computer’s internal state; or procedural languages which specify an explicit sequence of steps to follow.

 

선언적 언어는 컴퓨터의 내부 상태를 명시적으로 조작하는 명령형 언어, 또는 밟아야 하는 일련의 절차들을 명시적으로 지정하는 절차적 언어와 반대된다.

 

 

In computer science, declarative programming is a programming paradigm that expresses the logic of a computation without describing its control flow.

 

CS에서 선언적 언어는 제어 흐름을 설명하지 않고, 계산 로직을 표현하는 패러다임(개념)이다.

 

 

I draw the line between declarative and non-declarative at whether you can trace the code as it runs. Regex is 100% declarative, as it’s untraceable while the pattern is being executed.

 

나는 코드의 실행을 추적할 수 있는지 여부에 따라 선언형과 비선언형을 구분한다.

정규표현식(Regex)은 패턴이 실행되는 동안 그것을 전혀 추적할 수 없기 때문에 100% 선언적이라고 할 수 있다.

+ Zereight’s Blog에서 본 인상적인 설명

명령형 프로그래밍은 문제를 어떻게 해결해야하는지 컴퓨터에게 명시적으로 명령을 내리는 방법을 의미하고,

선언형 프로그래밍은 무엇을 해결할 것인지에 보다 집중하여 어떻게 문제를 해결하는지에 대해서는

컴퓨터에게 위임하는 방법이다.

 

처음 프로그래밍이라는 개념이 등장했을 떄부터, 지금까지도 컴퓨터에게 명시적으로 명령을 내리는 방법인

명령형 프로그래밍을 주로 사용했지만, 함수형 프로그래밍은 문제를 해결하는 방법에 더 집중하고

사소한 작업은 컴퓨터에게 넘겨버리는 선언형 프로그래밍의 일종이다.

 

즉, 컴퓨터에게 사소한 작업들을 위임해버리는 패러다임의 특성 상

선언형 프로그래밍에는 필연적으로 높은 수준의 추상화라는 키워드가 붙는다.

추상화 수준이 낮다면 저 사소한 작업들을 개발자가 일일이 다 컨트롤해야한다는 의미이기 때문이다.

[출처] https://iborymagic.tistory.com/73

Loading

12 10월 2025

▲ “튜토리얼 지옥”을 대체한 “바이브 코딩 지옥”의 등장

13P by GN⁺ 16시간전 | ★ favorite | 댓글 2개
  • 최근 코딩 교육 환경에서 “튜토리얼 지옥” 대신 “바이브 코딩 지옥” 이 새로운 문제로 대두됨
  • 튜토리얼 지옥이 “튜토리얼 없이는 아무것도 만들지 못하는” 상태였다면, 바이브 코딩 지옥은 “AI 없이는 코딩할 수 없고, AI가 생성한 코드가 어떻게 작동하는지 이해하지 못하는” 상태를 의미
  • AI 도구의 과도한 사용이 학습 동기를 저하시키며, AI 리터러시가 낮은 사람일수록 AI를 더 많이 사용하는 역설적 상황이 발생하고 있음
  • AI 도구는 적절하게 활용하면 학습 보조에 큰 도움이 될 수 있으나, 무작정 ‘답만 얻기’식 사용은 건설적 이해 형성에 방해가 됨
  • 학습 과정에서 직접 고민하고 스스로 해결하려는 노력이 핵심, 튜토리얼·AI 보조 없이 문제 해결 경험을 쌓는 자세가 중요함

문제의 배경: 튜토리얼 지옥에서 바이브 코딩 지옥으로

  • 2019년 당시 코딩 교육의 주요 문제는 “튜토리얼 지옥” 이었음
    • 튜토리얼을 따라하는 데는 성공하지만 혼자서는 아무것도 만들지 못함
    • 실제 프로그래밍보다 프로그래밍 관련 동영상 시청에 더 많은 시간을 소비하며, 핵심 개념은 이해하지 못함
    • 결과적으로 피상적 지식만 쌓고, 내부 작동 원리는 이해하지 못해서 현실에서는 코드를 스스로 쓰지 못하는 상태
  • Boot.dev는 이를 해결하기 위해 세 가지에 집중함
    • 심층 커리큘럼: 전통 대학 외부에서도 CS 기초를 배울 필요성 강조
    • 실습 중심 방식: 모든 개념 학습과 함께 코드를 직접 작성
    • 비디오보다 리치 텍스트 강화: 비디오는 수동적 소비에 그칠 위험성 있음
  • 2019년에는 수백만 조회수를 기록하던 긴 YouTube 강의들이 현재는 5만 조회수도 달성하기 어려움
    • FreeCodeCamp, Traversy Media, Web Dev Simplified 등의 채널이 이러한 추세를 보임
  • 그러나 “learn to code”에 대한 Google Trends 데이터는 여전히 높은 관심도를 유지하고 있음
  • Boot.dev에 매일 약 1,300명의 신규 사용자가 등록하며, 최근 18개월간 튜토리얼 지옥에 대한 불만은 줄었지만 새로운 형태의 어려움이 나타남

바이브 코딩 지옥의 정의

  • 튜토리얼 지옥의 특징
    • “튜토리얼 없이는 아무것도 만들 수 없다”
    • “문서를 이해하지 못하니 동영상이 필요하다”
    • “간단한 작업에도 복잡한 프레임워크가 필요하다”
  • 바이브 코딩 지옥의 특징
    • “Cursor의 도움 없이는 아무것도 할 수 없다”
    • “멋진 타워 디펜스 게임을 만들었어요. 여기 링크에요 http://localhost:3000″;
    • “이미지 lazy-load를 위해 Claude가 6,379줄을 추가한 이유를 모르겠어요”
  • 현재 자기주도 학습자들은 많은 것을 만들고 있지만, 소프트웨어 작동 방식에 대한 멘탈 모델을 발전시키지 못하는 프로젝트를 구축
  • AI의 환각(hallucination)과 싸우고, 테스트 통과에만 집중하는 봇과 씨름하며 실제 문제 해결보다는 AI가 생성한 코드를 맹목적으로 신뢰

AI 코딩의 미래와 현실

  • 나는 단기적으로 AI가 개발자를 완전히 대체하지는 않을 것이라는 데 긍정적 입장
    • “AI가 일자리를 빼앗을 때까지 6개월”이라는 말이 나온 지 3년이 지났지만 여전히 개발자를 고용하고 있음
  • GPT-5가 출시되었지만 GPT-4 대비 점진적 개선에 그쳤으며, AGI가 곧 도래하지 않을 것임을 보여주는 증거로 해석됨
  • 매일 AI 도구를 사용하지만 실제로 생산성이 얼마나 향상되는지 확신하지 못함
    • AI가 더 생산적이게 만드는지, 아니면 더 게으르게 만드는지 불분명
  • 2025년 연구 결과: 개발자들은 AI가 20-25% 생산성을 높인다고 가정했지만, 실제로는 19% 느려짐
    • 7조 달러 투자 대비 실망스러운 결과

AI와 학습동기 저하의 위험성

  • AI 활용 문화가 학습자의 동기 부여에 부정적일 수 있음
  • AI 열풍(버블?)에서 가장 우려되는 점은 “왜 배워야 하나? AI가 다 알잖아”라는 태도를 가진 세대가 등장한다는 것
  • AI가 실제로 모든 화이트칼라 직업을 대체하지 못한다면, 주식 시장 버블뿐 아니라 교육받은 인력의 가뭄도 겪게 될 것
  • 기술적 배경이 없는 투자자들은 “AI가 이미 코딩의 전부를 대체했다”고 오해하고, 시니어 개발자들은 여전히 AI 도구를 일상 업무에 통합할 유용한 방법을 찾지 못함
  • AI 리터러시가 낮은 사람일수록 AI를 더 많이 사용하는 경향이 있어 우려됨
    • 궁극적인 ‘Dunning-Kruger(더닝-크루거)’ 함정으로 작용 – 지식이 부족한 사람이 오히려 자신이 잘 안다고 착각하는 현상
    • 학습자들이 “AI가 이미 알고 있으니” 자기계발이 무의미하다고 결론 내림

AI는 학습에 유익한가?

  • 여전히 코딩 배우기에 대한 사회적 관심도 높음
  • AI가 학습에 유익할 수도 있지만, 두 가지 구조적 문제가 존재함
  • 첫 번째: 아첨(sycophant) 문제

    • AI 챗봇은 질문자 의견에 과도하게 동조하는 경향이 있음
    • “ROAS(광고수익률)에 대해” 채팅해보면, 같은 데이터를 놓고 질문 방향에 따라 정반대 결론을 내며, 모두 전문가적 어조로 확신 있게 답함
    • 이는 학습자에게 검증, 비판적 사고, 오류 지적을 경험할 기회를 박탈함
      • 전문가에게 묻는 이유는 우리가 틀렸을 때 알려주기 위함
      • IRC 채팅이나 Stack Overflow는 이를 잘 수행했음(아마도 너무 잘)
      • LLM(대형언어모델) 챗봇은 기존 학습자의 근본적 오해를 바로잡지 못하는 경향이 강함
      • 현재 학생들은 LLM과 편안한 대화를 나누며 필요한 것이 아닌 듣고 싶은 것을 듣게 됨
  • 두 번째 문제: 학습자는 실질적 ‘의견’을 원함

    • AI는 지나치게 균형 잡힌 입장을 제시함
      • “어떤 사람들은 X라고 생각하고 어떤 사람들은 Y라고 생각한다”
      • 학습자가 어느 쪽에 동의할지 결정하기 더 어려워짐
    • “자본주의자 역할” 또는 “마르크스주의 혁명가 역할”을 하도록 프롬프트했지만 만족스러운 결과를 얻지 못함
    • 학습자는 실제 경험에서 나온 의견과 논평을 듣고 싶어함
      • DHH가 Turbo에서 TypeScript를 제거한 이유
      • Anders Hejlsberg가 TypeScript가 JavaScript 개발자에게 해결해주는 것
      • 각 저자의 편견과 맥락이 명확히 드러나는 실제 의견을 통해 미묘한 멘탈 모델이 형성됨
    • LLM 특유의 중립적·조심스러운 답변은 실제 지식 내면화에 방해가 됨

AI가 학습에 진짜 도움 되는 경우

  • AI는 올바르게 사용하면 학습을 위한 놀라운 도구
  • 코딩을 배우기에 이보다 쉬운 시대는 없었음
  • Boot.dev의 Boots(AI 교육 보조 도구) 사례
    • 학생들이 인스트럭터 솔루션(이상적인 정답)을 보는 것보다 AI 튜터(Boots)와 채팅하는 것을 거의 4배 더 많이 사용
    • Boots는 일반 챗봇과 달리 다음 방식으로 학습에 도움 줌
      • 답을 직접 알려주지 않도록 사전 프롬프팅
      • 소크라테스식 방법을 사용하여 학생이 문제에 대해 더 깊이 생각하도록 유도
      • 강사의 솔루션에 접근할 수 있어 정답에 대한 환각 가능성이 훨씬 낮음
      • 즐거운 캐릭터성 부여(마법사 곰)

바이브 코딩 지옥 탈출법

  • 결론적으로, 튜토리얼 지옥이든 바이브 지옥이든, ‘남에게 맡기지 말고 스스로 해보는 경험’ 이 매우 중요함
    • 튜토리얼 지옥: 비디오 끄고 직접 코드 작성 경험 쌓기
    • 바이브 지옥: 코파일럿 등 AI 자동완성 꺼두고, 스스로 문제 해결 경험 쌓기
  • 피해야 할 것:
    • 에디터 내 AI 자동완성
    • 에이전트 모드 및 AI 자동화 도구로 프로젝트 처리
  • 활용할 수 있는 것:
    • 질문에 답하고, 개념을 설명하고, 예제를 제공하는 챗봇
    • 소크라테스식 방법으로 질문하도록 유도하는 시스템 프롬프트를 통해 깊은 사고 촉진
    • 주장을 할 때 출처를 인용하고 문서에 링크하도록 요청하는 시스템 프롬프트로 정보 신뢰성 확보

핵심 원칙

  • 학습은 반드시 불편해야 함
    • 튜토리얼 지옥은 다른 사람이 코딩하는 것을 보면서 불편함을 피할 수 있게 해줌
    • 바이브 코딩 지옥은 AI가 코드를 작성하게 하면서 불편함을 피할 수 있게 해줌
  • 진짜 학습은 막히고, 좌절하고, 가장 중요하게는 문제 해결을 강제당할 때 일어남
    • 이것이 인간의 신경망이 재배선되는 방식
  • “학습은 어려워야 한다”는 개념을 지나치게 확대하면 형편없는 교육 설계의 변명이 될 수 있음
    • 저자는 이를 옹호하지 않음
    • 개념이 최선의 방식으로 설명되더라도, 학생은 여전히 그것과 씨름하고 새로운 맥락에서 스스로 사용해야 진정으로 이해할 수 있음
  • 진짜 학습 은 직접 막히고, 좌절하고, 자신의 힘으로 돌파하는 과정에서 완성됨

[출처] https://news.hada.io/topic?id=23590

Loading

23 9월 2025

[Java 일반] Public static void main(String[] args)는 죽었다 | GeekNews

[Java 일반] Public static void main(String[] args)는 죽었다 | GeekNews

  • 이제 Java의 첫 번째 프로그램은 더 이상 public static void main(String[] args) 로 시작하지 않고, 단순화된 void main() 문법으로 작성 가능해짐
  • 새로운 문법에서는 IO.readln과 IO.println 같은 간단한 호출만으로 입출력을 처리할 수 있어 코드가 훨씬 직관적으로 바뀜
  • 기존의 new Scanner(System.in)System.out.println 같은 장황한 구문은 불필요해짐
  • 그동안의 불편함이 “마침내 끝남”, 이제 Java의 기본 구조가 가벼워지면서 입문 장벽이 낮아지고 학습 친화성이 크게 향상될 것

  • 전통적으로 Java는 프로그램 시작을 위해 public static void main(String[] args) 라는 긴 선언을 요구했음
  • 그러나 2025년 9월 16일 기준, Java의 가장 첫 번째 예제로 여겨지던 main 함수의 복잡한 선언문이 새로운 간단한 형태로 대체됨
  • 기존 방식:
    public class Main {  
        public static void main(String[] args) {  
            Scanner scanner = new Scanner(System.in);  
            System.out.print("What is your name? ");  
            String name = scanner.nextLine();  
            System.out.println("Hello, " + name);  
        }  
    }  
    
  • 새로운 방식:
    void main() {  
        var name = IO.readln("What is your name? ");  
        IO.println("Hello, " + name);  
    }  
    
  • 초보자에게는 불필요하게 장황하고, “주술적 주문”처럼 외워야만 했던 구문이라는 비판을 받아왔음
  • 기존 선언문의 번거로움과 난해함을 해소하고, 간결한 문법 도입으로 코드 가독성이 높아졌으며, Java 입문의 진입 장벽이 크게 낮아짐
    • 더 이상 Scanner, System.out.println 등 복잡한 객체 생성과 호출을 기본 예제로 쓰지 않음

Good Fucking Riddance = “드디어 없어져서 속 시원하다. 잘 가라”

[출처] https://news.hada.io/topic?id=23138&utm_source=weekly&utm_medium=email&utm_campaign=202538

Loading

6 9월 2025

[python 데이터분석] [jupyter] 주피터 노트북에 이미지 삽입

[python 데이터분석] [jupyter] 주피터 노트북에 이미지 삽입

python ide로 많이 사용하는 jupyter notebook에 이미지를 삽입하는 방법입니다!

방법은 두가지가 있습니다

먼저 패키지를 설치하고

# !pip install IPython 
from IPython.display import Image  # 주피터 노트북에 이미지 삽입

1. 코드블럭 안에 삽입하는 법

Image(“파일경로/파일명.확장자명”)

ex) Image(“img/picture.png”)

2. markdown 안에 삽입하는 법

![이미지이름?](파일경로/파일명.확장자명)

ex) ![nn](img/99.01_01.png)

[출처] https://ssoondata.tistory.com/87

 

Loading

6 8월 2025

[알아봅시다] [리버스 프롬프트 엔지니어링] Reverse Prompt Engineering

[알아봅시다] [리버스 프롬프트 엔지니어링] Reverse Prompt Engineering

Reverse Prompt Engineering

 
 
 
 

????리버스 프롬프트 엔제니어링 패턴(In English)

1.Can we talk about Reverse Prompt Engineering? By Reverse Prompt Engineering I mean creating a prompt from a given text.

2.Nice. Can you give me a simple example of Reverse Prompt Engineering?

3.Good. Write a short expaination on how dog training works, and Reverse Prompt Engineer the explaination.

4.Great. Can you create a very technical reverse prompt engineering template?

5-1.Reverse Prompt Engineeing the following {text}, capture the TONE and WRITING STYLE of the {text} to include in the prompt:
text = “이 부분에다가 실제 텍스트 내용(오바마 연설, 세익스피어 문구 등의 스타일로)을 넣는다.”

 

5-2-1.Can you reverse engineer the following {product describtion}, capture the writing style an dthe length fo the text:

product describtion= “이 부분에다가 실제 제품 내용(아이폰 제원 등)을 넣는다.”

5-2-2.Rewrite the reverse prompt into a prompt that can be used for any product describtion with a user input feature in the prompt that uses {}:

 

5-3. Reverse engineer the following {html-code} in to a prompt:

html-code=“이 부분에다가 코드(html코드) 넣는다.”

 
 

????방법(In Korean)

 

1.리버스 프롬프터 엔지니어링에 대해 얘기할 수 있을까요? Reverse Prompt Engineering은 주어진 텍스트에서 프롬프트를 생성하는 것을 의미합니다. 

 
 
 
 

2.좋아요. 리버스 프롬프트 엔지니어링의 간단한 예를 들어주시겠어요? 

 
 
 
 

3.좋아요. 강아지 훈련이 어떻게 작동하는지에 대한 간단한 설명을 쓰고, 설명을 리버스 프롬프트 엔지니어인 나에게 작성해주세요. 

 
 
 
 

4.내가 ‘강아지 훈련은, 강아지가 원하는 행동을 보이면 보상을 주어서 그 행동을 강화하고, 원치 않는 행동을 보이면 그 행동에 대해 무시하거나, 보상을 주지 않음으로써 그 행동을 감소시키는 방법입니다. 예를 들어, 강아지가 기본적인 훈련인 “앉아”를 배우기 위해서는, 강아지가 앉아앉은 행동을 보이면 간식이나 칭찬 등의 보상을 주어서 그 행동을 강화하게 됩니다.’와 같은 답을 듣기 위해서는 어떤 프롬프트를 작성해야 되요? 

 
 
 
 

5.내가 당신에게 사용할 수 있는 리버스 프롬프트 엔지니어링 탬플릿을 프롬프트 형태로 제공해 줄 수 있나요? 

 
 
 
 

6.연설문이나 시를 작성하기 위한 리버스 엔지니어링 템플릿을 프롬프트 형태로 제공해 줄 수 있나요? 

 
 
 
 

7.한국어로는 없나요?

 
 
 
 

8.혹시, {text}를 변수로 사용하는 리버스 엔지니어링 프롬프트 템플릿을 제공해 줄 수 있나요? 

 
 
 
 

9.한국어로 제공 부탁해요.

 
 
 
 

10.{text}의 시를 작성하기 위한 프롬프트를 제공해주세요.

text=죽는 날까지 하늘을 우러러

한 점 부끄럼이 없기를,

잎새에 이는 바람에도 

나는 괴로워했다.

별을 노래하는 마음으로 

모든 죽어가는 것을 사랑해야지

그리고 나한테 주어진 길을 

걸어가야겠다.

오늘 밤에도 별이 바람에 스치운다. 

 
 
 
 

11.{text}의 시는 윤동주님의 ‘서시’라는 제목의 시에요. 알고 있나요? 

 
 
 
 

12.{text}와 같은 운율, 어조, 억양을 고려하여 ‘청소년들이 겪는 아픔’에 대한 시로 재창작 부탁해요. 

 
 
 
 

13.{text}와 같은 운율, 어조, 억양을 고려하여 ‘청소년들이 겪는 아픔‘에 대한 시 작성하기

text=죽는 날까지 하늘을 우러러

한 점 부끄럼이 없기를,

잎새에 이는 바람에도 

나는 괴로워했다.

별을 노래하는 마음으로 

모든 죽어가는 것을 사랑해야지

그리고 나한테 주어진 길을 

걸어가야겠다.

오늘 밤에도 별이 바람에 스치운다. 

 
 
 
 

14.재창작하여 작성해주세요. 

 
 
 
 

여기 까지가 리버스 프롬프트 엔지니어링(Reverse Prompt Engineering) 한국어 루틴입니다. 리버스 프롬프트 엔지니어링은 프롬프트 엔지니어가 원하는 답을 하기 위한 질문을 찾는 과정이라 생각하면 됩니다. 아래는 리버스 프롬프트 엔지니어링을 GPT에게 이해시키고 시를 다작한 사례입니다. 

 
 

[출처] https://www.learnmore.co.kr/education/ai-literacy/open-ai/prompt-example/reverse-prompt-engineering

Loading

1 8월 2025

[인공지능기술] [프롬프트 엔지니어링] 프롬프트 엔지니어링의 개념, 기법, 예시

[인공지능기술] [프롬프트 엔지니어링] 프롬프트 엔지니어링의 개념, 기법, 예시

프로젝트 과정에서 활용할 수 있는 프롬프트 엔지니어링에 대하여 개념과 다양한 구현 기법, 작성 예시에 대해 공부해본다. 

1. 프롬프트 엔지니어링 

2. 프롬프트 엔지니어링 예시 


1. 프롬프트 엔지니어링 

– AI가 원하는 결과를 생성하도록 가이드하는 최적의 프롬프트를 설계하는 과정 
  LLM에서 원하는 결과를 얻기 위해 프롬프트를 정교하게 최적화하는 과정

– 프롬프트 엔지니어링을 통해 다양한 종류의 task에서 LLM의 역량을 향상시킬 수 있음 

  복잡한 task에서도 hallucination과 같은 오류를 해소하는데 기여

– AI의 성능은 프롬프트의 퀄리티에 큰 영향을 받기 때문에 프롬프트를 잘 설계하는 것이 AI를 효과적으로 쓰는 것과 직결됨 
– 프롬프트 엔지니어는 AI가 의도치 않거나 엉뚱한 출력값을 만들어내지 않도록 어떻게 명령을 내려야 원하는 결과를 얻을 수 있을지 연구함 

* hallucination (할루시네이션) :  AI 모델이 실제로 존재하지 않거나 잘못된 정보를 생성하는 현상으로, 주로 자연어 처리(NLP) 모델에서 자주 발생하는 문제이다.

1) 프롬프트 구성 요소 

  • Instruction 지시 : LLM 모델이 수행해야하는 과제나 구체적인 목표를 제시하는 역할
  • Context 문맥 : 모델의 정확도를 높이기 위해 사용될 수 있는 문제 해결에 필요한 배경 정보나 추가 문맥
  • Input data 입력 데이터 : 모델이 답해야하는 질문 
  • Output Indicator 출력 지시자 : 출력의 유형이나 형식과 같이 모델의 답이 어떤 방식으로 출력되어야 하는지 지정

2) 프롬프트 엔지니어링 기법 

기법 설명
Zero-Shot Prompting task에 대한 사전 예시 없이 모델이 바로 문제 해결
One-Shot Prompting task에 대한 1개의 예시를 제시
Few-Shot Prompting task에 대한 2개 이상의 예시 제시 
Chain of Thought chain of thought 과정으로 문제 해결을 하는 예시를 제시함으로써 복잡한 중간 추론 과정을 사용하여 답을 제시하도록 만듬 
Zero Shot Chain of Thought  별도의 예시 없이 chain of thought 과정을 사용하도록 유도
“Let’s think step be step”이라는 trigger 문장을 프롬프트에 추가함 
Self Consistency few-shot CoT를 사용해 여러 형태의 추론 과정을 활용한 후 다수에 해당하는 답을 최종 결과로 제시하도록 만듬, 모델이 더 일관성 있는 답변을 선택하도록 유도 
Genereated Knowledge Prompting 질문과 함께 모델에서 생성된 지식이나 정보를 함께 제공하는 방식
지식(Knowledge)을 만드는 과정을 보여주는 프롬프트 예시를 제공하는 Few-Shot Prompting를 통해 원래의 질문과 관련된 Knowledge를 모델이 직접 생성
→ 기존의 질문에 생성된 Knowlegde를 추가한 프롬프트를 사용함으로써 모델이 Knowledge를 사용해 답을 제시하도록 만듬 
Automatic Prompt Engineering 사람이 아닌 모델이 스스로 프롬프트를 만들고 이를 활용해 답을 제시하는 방식, 프롬프트 내부에 <INSERT>라는 빈 칸을 만들고 answer를 함께 입력하여 모델이 <INSERT> 부분을 추론함으로써 프롬프트를 생성하도록 만듬 
ReAct Prompting ‘생각-행동-관찰’ 과정을 번갈아 수행하는 방식으로 답을 제시하도록 유도하는 방식, ‘생각-행동-관찰’ 과정을 반복하며 주어진 질문에 대한 답을 찾아가는 문제 해결 과정을 예제로 제시하는 Few-Shot Prompting (CoT와 유사하나 생각-행동-관찰 이라는 일련의 형식화된 과정을 사용한다는 차이점)
Active-Prompt 여러 개의 질의 예시를 만들어 모델이 답변하게 한 후 모델의 답변에 대한 모호성(Uncertainty)를 평가
→ 모델이 답하기 어려운 것으로 보이는 질문들만 골라 사람이 직접 답변을 라벨링한 후 Few-Shot CoT의 예제로 사용하여 다시 답변하게 만드는 방식
답변의 모호성은 모델에게 동일한 질문을 여러 번 제시한 후 disagreement를 계산하여 사용함, 더 효율적으로 질의-답변 예제를 만들 수 있음 

※ 그외 : Tree of Thought (ToT), Meta-Reasoning over Mulpitle Chains, Synthetic Prompting, MRKL, Self Refine 등 

– few-shot CoT와 zero-shot CoT 프롬프트 차이 

출처 : https://www.researchgate.net/figure/Few-shot-left-and-zero-shot-right-CoT-Both-prompts-the-LLM-to-output-intermediate_fig3_370981716

– 일반적인 CoT와 Self Consistency 비교 : 서로 다른 추론 과정을 사용하는 CoT의 다수결로 출력 결정 

출처 : https://velog.io/@xuio/SELF-CONSISTENCY-IMPROVES-CHAIN-OF-THOUGHT-REASONING-IN-LANGUAGE-MODELS

– Genereated Knowledge Prompting 매커니즘 : 모델이 knowledge를 생성하는 과정 진행 

출처 : https://www.promptingguide.ai/kr/techniques/knowledge

– Automatic Prompt Engineering 매커니즘 : 모델이 스스로 프롬프트를 생성 

출처 : https://www.promptingguide.ai/kr/techniques/ape

– Active-Prompt 매커니즘 : uncertainty estimation 과정 진행 

출처 : https://www.promptingguide.ai/kr/techniques/activeprompt

3) 프롬프트 작성 시 유의사항 

① 모델이 수행해야할 task가 무엇인지 명확하고 구체적으로 지시
– 모델이 어떤 task를 해야하는지 명시적으로 드러내기
– 모델이 따라야 할 출력 방식에 대해서도 구체적으로 지시 

② 질문과 관련된 정보와 맥락이 정확하고 상세하게 제시 
– 프롬프트가 구체적일수록 더 좋은 결과 
– 프롬프트의 길이가 제한적이기 때문에 답변과 관련성이 높은 핵심 정보를 잘 전달하는 것이 중요 

③ LLM에게 답변자로써 페르소나를 지정
– LLM이 가지는 역할 혹은 LLM이 답변해야할 대상에 대해 페르소나를 지정 

2. 프롬프트 엔지니어링 예시 

참고 자료 : https://www.promptingguide.ai/kr/introduction/examples

  • Text Summarization 
  • Information Extraction 
  • Question Answering
  • Text Classification
  • Reasoning
  • Conversation
  • Code Generation

Reference

https://www.promptingguide.ai/kr
https://tech.kakaoenterprise.com/188
https://rgbitcode.com/blog/senspond/11
https://velog.io/@boyunj0226/GPT%ED%95%9C%ED%85%8C-%EC%9E%98-%EB%AC%BC%EC%96%B4%EB%B3%B4%EB%8A%94-%EB%B2%95-3-%EB%B0%9C%EC%A0%84%EB%90%9C-Prompt-Engineering-%EB%B0%A9%EB%B2%95#active-prompt
https://rimiyeyo.tistory.com/entry/%EB%8B%A4%EC%96%91%ED%95%9C-%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81Prompt-Engineering%EC%97%90-%EB%8C%80%ED%95%B4-%EC%82%B4%ED%8E%B4%EB%B3%B4%EC%9E%901-Zero-shot-One-shot-Few-shot-CoT#LLM%20Prompt%20Engineering-1
https://medium.com/@minji.sql/prompt-%ED%99%9C%EC%9A%A9%ED%8E%B8-%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-%EC%9E%91%EC%84%B1%EA%B0%80%EC%9D%B4%EB%93%9C-%ED%8C%81%EA%B3%BC-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD-%EC%98%88%EC%8B%9C-0357f81bc969

 [출처] https://working-helen.tistory.com/105

Loading

1 8월 2025

[인공지능 기술] AI 프롬프트 엔지니어링 완벽 정리

[인공지능 기술] AI 프롬프트 엔지니어링 완벽 정리

최근 뉴스 기사에서 요즘 10대~50대까지 가장 많이 사용하는 앱 중 하나가 ChatGPT라는 조사결과가 있었습니다. 그만큼 우리 일상에서 없어서는 안 될 도구가 되었는데, 우리는 과연 제대로 사용하고 있는 것일까요?

이 놀라운 도구들을 제대로 활용하려면 좋은 ‘프롬프트’를 작성하는 법을 알아야 해요.

이번엔 AI를 200% 활용할 수 있는 프롬프트 작성법을 단계별로 알려드릴게요!

1. 프롬프트 엔지니어링이 뭐길래?

프롬프트는 AI에게 주는 지시나 질문이에요. 쉽게 말해 ‘무엇을 해달라고 부탁하는 방법’이라고 할 수 있죠.

여러분이 “안녕?”이라고 물으면 AI는 간단히 인사를 건넬 테지만, 구체적이고 명확한 질문을 던지면 훨씬 유용한 답변을 받을 수 있어요.

간단한 프롬프트부터 연습해 보세요.

“다음 주제에 대해 500자로 설명해 줘 : 인공지능의 역사”

“인공지능의 장점과 단점을 각각 3가지씩 알려줘”

2. 다양한 프롬프트 유형

프롬프트는 목적에 따라 여러 유형이 있습니다. 각 유형을 알아두면 상황에 맞게 활용할 수 있어요.

정보 요청 프롬프트

“비타민 D가 부족하면 나타나는 증상 5가지는 무엇인가요?”

“한국 역사에서 가장 중요한 사건 3가지를 시간순으로 설명해 줘.”

창의적 글쓰기 프롬프트

“고양이의 시선으로 본 하루를 일기 형식으로 써줘.”

“2050년 서울의 모습을 묘사하는 짧은 글을 작성해 줘.”

문제 해결 프롬프트

“다음 논리 퍼즐을 풀어줘 : 항상 거짓말을 하는 A와 항상 진실을 말하는 B가 있다. A가 ‘나는 B다’라고 말했다. 이것이 가능한가?”

“주방에 계란, 밀가루, 설탕만 있을 때 만들 수 있는 간단한 디저트 레시피를 알려줘.”

코드 작성 프롬프트

“파이썬으로 간단한 투두리스트 앱을 만드는 코드를 작성해 줘.”

“자바스크립트로 버튼 클릭 시 색상이 변하는 기능을 구현하는 방법은?”

도전! 각 유형별로 2-3개의 프롬프트를 직접 만들어보고, AI의 답변을 비교해 보세요.

어떤 표현이 더 좋은 결과를 가져오는지 느낌이 올 거예요.

3. 실패와 성공 사례

프롬프트의 좋고 나쁨을 가르는 실제 사례를 한번 볼게요

나쁜 프롬프트

“여행에 대해 알려줘”

-> 너무 광범위해서 AI가 무엇을 설명해야 할지 모르겠죠?

좋은 프롬프트

“20대 직장인이 일본 오사카를 3박 4일 동안 여행할 때 추천 일정과 꼭 가볼 곳 5곳을 알려줘. 예산은 100만 원이고, 맛집 다니는 것을 좋아해.”

-> 구체적인 정보와 맥락을 제공해서 맞춤형 답변을 받을 수 있어요.

연습해 봅시다 : 여러분이 실제로 궁금한 주제로 ‘나쁜 프롬프트’와 ‘좋은 프롬프트’를 각각 작성해 보고 결과를 비교해 보세요.

4. AI의 강점과 한계를 이해

AI를 잘 활용하려면 무엇을 잘하고 못하는지 알아야 합니다.

AI가 잘하는 것은

방대한 정보 기반 지식 제공

다양한 관점에서 아이디어 제안

텍스트 요약 및 분석

창의적인 콘텐츠 생성

AI의 한계

최신 정보는 모를 수 있다 (학습 데이터 기준일 이후 발생한 일)

가끔 사실이 아닌 정보를 제공할 수 있다 (환각 현상:할루시네이션)

맥락을 완벽하게 이해하지 못할 수 있다

프롬프트 작성 팁 : AI의 한계를 보완하려면 필요한 정보와 맥락을 충분히 제공해 보세요.

5. 매일매일 연습

프롬프트 작성 실력은 연습이 핵심!

매일 도전하기 :

#1. 매일 2~3개의 다양한 프롬프트를 작성

#2. 마음에 들지 않는 응답이 나오면 프롬프트를 수정해 다시 시도

#3. “더 자세히 설명해 줘” 또는 “이해하기 쉽게 다시 설명해 줘” 같은 후속 질문으로 답변을 발전

함께 배우기

Reddit의 r/PromptEngineering이나 Discord 커뮤니티에 참여해 다른 사람들의 프롬프트를 살펴보고 피드백도 받아봅시다!

6. 고급 프롬프트 기법 배우기

기본을 익혔다면 이제 프로처럼 프롬프트를 작성해 봅시다

Few-Shot 학습 기법

AI에게 예시를 보여주고 비슷한 패턴으로 대답하도록 유도하는 방법

-다음은 영어 문장을 한국어로 번역한 예시야 :

영어 : “The weather si nice today.”

한국어 : “오늘 날씨가 좋네요.”

영어 : “I love watching movies on weekends.”

한국어 :

Chain-of-thought (사고 연쇄) 프롬프팅

복잡한 문제를 풀 때 단계별로 생각하도록 유도하는 방법

-다음 수학 문제를 단계별로 풀어줘. 각 단계에서 어떤 계산을 하는지 설명하면서 풀어보자.

문제 : 가게에서 3,000원짜리 펜을 5개 구매하고 1,500원짜리 노트를 2개 구매했다. 총금액의 10%를 할인받았다면 최종 지불 금액은 얼마인가?

추천 자료 : Open AI의 프롬프트 가이드라인, DeepLearning.AI의 “ChatGPT Prompt Engineering for Developers” 강의

7. 도구와 리소스의 활용

프롬프트 작성 실력을 키울 수 있는 다양한 도구와 자료들이 있습니다.

AI 도구 테스트

ChatGPT (Plus 구독 시 GPT-4.5까지 사용 가능)

Claude

Gemini

Perplexity AI

추천 강의 :

Udemy의 “Mastering ChatGPT Prompts”

Coursera의 “Prompt Engineering for ChatGPT”

추천 책 :

“The ChatGPT Prompt Handbook”

“Prompt Engineering for Business”

8. 실전 프로젝트로 응용

이론만 공부하면 지루한, 작은 프로젝트를 통해 실제로 적용해 봅시다.

프로젝트 아이디어 :

AI로 블로그 글 초안 작성

코드 리뷰나 버그 수정 도움받기

주간 운동 계획 만들기

창의적인 스토리나 시 작성하기

외국어 학습 도우미로 활용하기

나만의 프롬프트 라이브러리 만들기 : 특히 효과적이었던 프롬프트를 모아두면 나중에 다시 활용 가능!

9. 최신 트렌드 따라가기

AI 기술은 정말 빠르게 발전하고 있습니다. 최신 소식을 놓치지 맙시다!

DeepLearning.AI의 ‘The Batch’ 뉴스레터

‘Towards AI’ 블로그

OpenAI와 Anthropic 블로그

Twitter/X에서 #PromptEngineering 해시태그 검색

마무리 : 나만의 AI 비서 만들어보기

프롬프트 엔지니어링은 AI와 효과적으로 소통하는 언어를 배우는 과정이에요. 처음에는 어색할 수 있지만, 연습할수록 점점 더 나아갈 거예요!

가장 중요한 건 직접 해보는 것입니다. 위 내용으로 공부해 보시고, 적용해 보세요.

어떤 질문이든 AI에게 물어보고, 응답이 마음에 들지 않으면 프롬프트를 개선해 보세요. 그렇게 하다 보면 어느새 AI는 여러분만의 강력한 비서가 되어 있을 테니까요.

[출처] https://brunch.co.kr/@jaylep/120

Loading

8 7월 2025

[python 인공지능] Deploy ML models with FastAPI, Docker, and Heroku | Tutorial

[python 인공지능] Deploy ML models with FastAPI, Docker, and Heroku | Tutorial

 

🔧 머신러닝 모델 배포 전반

  • (00:00) FastAPI + Docker + Heroku 조합으로 머신러닝 모델을 프로덕션 수준으로 배포하는 전체 과정을 설명.

  • 다양한 프레임워크(Scikit-learn, TensorFlow, PyTorch)에서도 동일한 접근 방식으로 활용 가능.


🧠 모델 개발 및 저장

  • (01:03~03:53)

    • Google Colab에서 언어 감지 모델 개발 (Scikit-learn 기반 Naive Bayes + CountVectorizer).

    • 모델은 Pipeline으로 결합하여 추론을 단일 객체로 수행.

    • pickle로 모델 저장, 버전 관리(major.minor.patch) 권장.

    • 텐서플로나 파이토치 사용 시 zip 압축하여 다운로드하는 팁 소개.


🏗️ FastAPI 애플리케이션 구성

  • (05:10~08:11)

    • app/main.py에서 FastAPI 엔드포인트 구현 (헬스 체크 및 /predict POST API).

    • model.py에서 저장된 모델 로드 및 전처리/예측 로직 구현.

    • pydantic.BaseModel 기반 입력/출력 유효성 검사 적용 (타입 안전성 보장).


🐳 Docker 컨테이너화

  • (08:46~11:27)

    • FastAPI 컨테이너화를 위한 Dockerfile, .dockerignore, requirements.txt 생성.

    • 공식 FastAPI + Gunicorn 기반 Docker 이미지 활용.

    • 의존성은 scikit-learn만 추가 설치 (==1.0.2 등 버전 고정 권장).

    • docker build, docker run 명령어로 로컬 실행 및 포트 매핑 확인.


📋 FastAPI 자동 문서화

  • (12:50~13:34)

    • /docs 경로에서 Swagger 기반 API 문서 자동 생성.

    • 입력 텍스트에 따른 언어 예측 테스트 가능 (Postman 없이도 가능).


☁️ Heroku 배포

  • (14:17~17:51)

    • heroku login, heroku create, git push heroku main으로 CLI 기반 배포 진행.

    • heroku.yaml 파일 작성 필수 (Heroku Dev Center 문서 참고).

    • heroku stack:set container로 Docker 기반 스택 설정.

    • 배포 후 Heroku URL에서 API 접근 가능.


배포 후 테스트

  • (17:51~18:38)

    • Postman으로 GET /Health Check OK, POST /predict"language": "german", "language": "italian" 확인.

    • 실시간 언어 감지 API 배포 완료!


필요 시 각 섹션별로 관련 코드/구성요소를 다시 정리해드릴 수 있습니다.

 

나의 말:
섹션별로 관련 코드/구성요소를 다시 정리
 
ChatGPT의 말:

아래는 영상에서 설명한 FastAPI + Docker + Heroku를 활용한 머신러닝 모델 배포 과정을 섹션별로 코드 및 구성요소 중심으로 재정리한 내용입니다:


1️⃣ 모델 개발 및 저장 (Colab)

✅ 사용 기술:

  • scikit-learn, pandas, re, pickle

📄 주요 코드:

python
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
import pickle

# 데이터 준비 및 전처리
label_encoder = LabelEncoder()
y_encoded = label_encoder.fit_transform(df['language'])

# 모델 파이프라인 정의
pipeline = Pipeline([
('vectorizer', CountVectorizer()),
('classifier', MultinomialNB())
])

# 훈련
pipeline.fit(df['text'], y_encoded)

# 저장
with open('model_v0.1.0.pkl', 'wb') as f:
pickle.dump(pipeline, f)

# 레이블 저장 (선택)
label_classes = label_encoder.classes_


2️⃣ FastAPI 앱 구성

📁 디렉터리 구조:

bash
app/
├── main.py # FastAPI 엔트리포인트
├── model/
│ ├── model.py # 모델 로딩 및 예측 함수
│ └── model_v0.1.0.pkl # 저장된 모델 파일

📄 model/model.py (모델 로딩 및 예측)

python
import pickle
import os
import re

BASE_DIR = os.path.dirname(__file__)
MODEL_PATH = os.path.join(BASE_DIR, "model_v0.1.0.pkl")

with open(MODEL_PATH, "rb") as f:
model = pickle.load(f)

label_classes = ["english", "german", "italian", ...] # 실제 label list

def predict_pipeline(text: str) -> str:
text = re.sub(r"[^\w\s]", "", text)
pred = model.predict([text])[0]
return label_classes[pred]

📄 main.py (FastAPI 엔드포인트)

python
from fastapi import FastAPI
from pydantic import BaseModel
from app.model.model import predict_pipeline

app = FastAPI()

class TextIn(BaseModel):
text: str

class PredictionOut(BaseModel):
language: str

@app.get("/")
def health_check():
return {"status": "ok", "model_version": "0.1.0"}

@app.post("/predict", response_model=PredictionOut)
def predict(payload: TextIn):
language = predict_pipeline(payload.text)
return {"language": language}


3️⃣ Docker 구성

📄 Dockerfile

dockerfile
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.8

WORKDIR /app
COPY ./app /app/app
COPY requirements.txt /app

RUN pip install --no-cache-dir -r /app/requirements.txt

📄 requirements.txt

txt
scikit-learn==1.0.2

📄 .dockerignore

txt
__pycache__/
*.pyc
*.pkl
*.zip
.venv

4️⃣ 로컬 Docker 테스트 명령어

bash
# 빌드
docker build -t language-detection-app .

# 실행 (포트 매핑)
docker run -p 8080:80 language-detection-app


5️⃣ FastAPI 자동 문서화

접속:

bash
http://localhost:8080/docs

자동 생성된 Swagger UI에서 /predict POST API 테스트 가능


6️⃣ Heroku 배포 구성

📄 heroku.yml

yaml
build:
docker:
web: Dockerfile
run:
web: uvicorn app.main:app --host=0.0.0.0 --port=${PORT:-5000}

🧪 Heroku CLI 명령어:

bash
heroku login
heroku create language-detection-app123
heroku stack:set container
git add .
git commit -m "Deploy to Heroku"
git push heroku main

7️⃣ 배포 확인

  • 배포 URL 예시: https://language-detection-app123.herokuapp.com

  • GET / → 헬스체크

  • POST /predict → 언어 예측

Loading

1 7월 2025

[Next.js 개발] pm2 로 Next.js 실행하기

[Next.js 개발] pm2 로 Next.js 실행하기

상황

pm2 로 React+Next.js 로 구성된 어플리케이션를 무중단 배포 하고자 함.

방법

  1. build

    먼저, 어플리케이션 build를 실행 함.

    npm run build 

    또는 package.json의 scripts에 prestart를 다음과 같이 추가 해주면 npm start 를 실행 할 때 자동으로 prestart가 먼저 실행되고, prestart의 명령대로 build가 이루어져 npm run build를 따로 실행 안 해도 됨.

    package.json

    "scripts": {
        "dev": "next -p 3000",
        "build": "next build",
        "prestart": "npm run build",
        "start": "next start -p 80"
      },
  2. pm2 등록

    package.json

    "scripts": {
    ...
        "start": "next start -p 80"
    ...
      },

    cmd

    pm2 --name 어플리케이션이름 start npm -- start

    위의 명령어 실행 후 사이트 접속 했을 경우, 페이지가 나타나지 않으면 제대로 실행이 되지 않은 것이다.

    ( pm2 목록은 생성 되었으나, 사이트를 실제로 접속 했을 경우, 페이지가 뜨지 않았다.)

    필자는 그러하였고, pm2 목록을 지우고 다음과 같은 명령어로 새로 실행하였다.

    pm2 start "npm run start" --name 어플리케이션이름

참고 문헌

[출처] https://velog.io/@mangojang/pm2-%EB%A1%9C-Next.js-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0

Loading

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