1. 멀티 에이전트 시스템

LLM의 본질

  • LLM은 확률 기반 다음 단어 생성기
  • 컨텍스트 = 전체 대화 기록 (대화가 핑퐁될수록 맥락 누적)
  • LLM은 텍스트만 출력 가능 (JSON 포함)

프롬프트 설계 원칙

나쁜 예: 작성+검사 프롬프트 120줄
좋은 예: 작성 60줄 + 검사 60줄

  • 작성 시점에는 검사 프롬프트가 지침 정도로만 기능
  • 작성 완료 후 검사 프롬프트가 제대로 된 피드백 제공
  • 각 단계마다 필요한 프롬프트만 포함

피드백 루프

  • 한 번에 완벽한 결과 X
  • 작고 빠른 루프를 반복하는 것이 효율적
  • 각 서브 에이전트마다 작업 가이드 배치
  • 구조: 오케스트레이터 / 서브에이전트 (예: FE 구현자/검토자)

개발 과정의 진화

CLI → 데스크톱 앱 → 컨텍스트 윈도우 문제 발생 → JSON 템플릿화

핵심 정리

  1. 논리적으로 압축하기
  2. 세부 스케치는 뒤에서 (같은 문서 공유)
  3. 같은 철학, 같은 가치관 유지
  4. 텍스트 양이 많아지는 순간 최대한 지연
  5. 자료구조 활용
  6. 프로그래밍 입출력 활용

2. 요즘 회사 일

변화한 업무 속도

  • 2~3년 전 대비 피처 개발 시간이 크게 단축
  • 회사마다 AI 수용 정도와 속도 차이가 큼

시니어 개발자의 하루

  • AI를 통해 개발 진행도만 빨라짐 (코드 작성, 리뷰, 테스트)
  • PM, 디자이너는 상대적으로 느림 (사람 중심 업무)
  • 결과: 기다리는 공백 시간 발생

남는 시간 활용법

1) AI 에이전트/도구 개발

  • 김재섭 mk.2
  • 사내용 네트워크 디버거 (Proxyman 같은 도구를 사내 워크플로우에 맞게 구현)
  • FE 의존성 업데이트 에이전트 (반복적 업그레이드 자동화, PR 자동 생성)
  • 로우 시큐(?) or Obsidian으로 작업 내용, 회의록을 맥락으로 정리

2) 제품에 기여

문제 정의 (우선순위)

  • 비즈니스 기회 / 성과 / UX 임팩트 관점
  • 어떤 기능이 일정을 폭발시킬지 판단

본질부터 (대안 제안)

  • PRD의 "왜 필요한지"를 먼저 질문
  • 더 효율적인 대안 제안 (대부분 거절돼도 OK)

지표 설계 (다음 개선)

  • 지표 대시보드 직접 설계
  • 운영 이슈를 다음 제품 개선 아이디어로 전환

PM은 직책이 아니라 역할이다

3) AI 잘 쓰는 법

  • 사내 스터디 진행
  • 반복 가능한 컨텍스트로 작업 안정화
  • 어떤 일을 에이전트/사람이 할지 잘 설계
  • 노하우를 팀으로 공유해서 전체 수준 끌어올리기

AI에게 일을 시키는 능력도 차별점이다

4) 역할 변화

  • 기존: 구현 업무를 직접 손으로
  • 현재: AI와 페어로 작업
  • 사람의 역할: 판단, 검증, 아키텍처 결정

AI가 코드를 짜줘도 그 코드를 책임지는 건 결국 나다

학생/저연차 개발자를 위한 조언

  • AI로 비즈니스 대박 노리지 말기
  • 정말 작은 문제를 한 번 풀어보기
  • 무얼 할지 방향 잡고, 작더라도 성공 경험 쌓기
  • 큰 성공보다 끝까지 풀어본 작은 문제가 다음 방향을 만든다

인디 개발의 현실

  • A/B 테스트를 정말 빠르게 진행
  • "돈 벌고 유저들한테 사랑받는 제품" → 진짜 어려움

앞으로 중요한 것

  1. 무엇을 실행할지 고르는 능력
  2. 고른 것을 실제로 성공시키는 힘

3. 신입 개발자 필요한가요?

AI의 한계

  • AI는 "가챠" (비결정적)
  • 예: 같은 코테를 같은 프롬프트로 맡겨도 매번 다른 결과

개발자 일이 줄어드는가?

줄지 않은 일:

  • 요구사항 분석
  • 리서치
  • 아키텍처 인터페이스 설계
  • 코드 설계
  • 테스트/QA

변화:

  • 한 번에 진행하는 프로젝트 개수 증가
  • 그만큼 더 많이 일함

회사가 신입에게 바라는 것

"했습니다" ❌
"왜" 했는지를 구체적으로 설명

학생이 해야 하는 것: TF 리더 연습

1) 문제부터 정의

  • "무엇을 만들지"가 아니라 "누구의 어떤 문제를 풀지"

2) AI 결과를 의심

  • "짜줘" ❌
  • "옵션 3개로 비교해줘" ✅

3) 기본기를 더 깊게

AI를 평가하려면 기준이 있어야 함:

  • CS, 알고리즘, 자료구조
  • 쓰는 기술의 동작 원리
  • OS, 네트워크, DB 동작 원리
  • 요구사항 분석
  • 디자인 패턴, 클린 코드

4) 여정을 설명하기 - 5요소

프로젝트를 다음 순서로 설명할 수 있는가?

  1. 배경 - 누구의 어떤 문제였나?
  2. 임팩트 - 그 문제가 얼마나 풀렸나? (지표, 반응)
  3. 대안 비교 - 다른 안과 무엇을 따져 골랐나?
  4. 동작 원리 - 어떻게 돌아가나?
  5. 사이드 이펙트 - 어떤 케이스에서 어떻게 처리했나?

4가지를 훈련하고 하나라도 TF 리더처럼 행동해보자!


4. 눈물의 AI 격변기

  • 링크드인 활용
  • 넓고 얕게 경험하기

5. 경쟁력 있는 개발자는?

단순 코딩 ❌ 소프트웨어 개발자 ⭕

  • 기술적으로 코드 깎는 장인보다 전체를 보는 E2E Engineer
  • 개발자 한 명의 파트/역할이 늘어남
  • "좋은 기술 만들기" → "좋은 경험 만들기"

안목 높이기

AI는 인형 뽑기 기계
뽑는 사람이 어떻게 뽑느냐?

피해야 할 세 가지

1) 인지 부채

AI에 지나치게 의존, 스스로 사고하지 않음

2) 지적 비만

너무 많은 정보를 섭취해서 실제로 소화하지 못함

3) 인지 중력

편해진 방법에서 벗어나는 것이 어려움


AI에 너무 의존하지 말라는 내용을 AI를 써서 요약했다.

2026-05-12 18:10:02.438 22875-22902 GoogleApiManager com.example.got_you_studying E Failed to get service from broker. java.lang.SecurityException: Unknown calling package name 'com.google.android.gms'. at android.os.Parcel.createExceptionOrNull(Parcel.java:3340) at android.os.Parcel.createException(Parcel.java:3324) at android.os.Parcel.readException(Parcel.java:3307) at android.os.Parcel.readException(Parcel.java:3249) at bjcn.a(:com.google.android.gms@261631035@26.16.31 (260400-900800821):36) at bjaj.z(:com.google.android.gms@261631035@26.16.31 (260400-900800821):143) at bigf.run(:com.google.android.gms@261631035@26.16.31 (260400-900800821):42) at android.os.Handler.handleCallback(Handler.java:995) at android.os.Handler.dispatchMessage(Handler.java:103) at czrc.mD(:com.google.android.gms@261631035@26.16.31 (260400-900800821):1) at czrc.dispatchMessage(:com.google.android.gms@261631035@26.16.31 (260400-900800821):5) at android.os.Looper.loopOnce(Looper.java:248)

 

안드로이드 스튜디오를 써서 과제를 하는 중, 파이어베이스가 제대로 작동하지 않았다.

 

파이어베이스 콘솔에 등록도 했고, 경로에 넣으라는 json파일도 넣고,,

다 바꿨지만 데이터베이스에 접근을 할 수가 없었다.

 

알아보니 몇가지 문제점이 있었지만

그중에는 일반적인것도 있고 맥북이라서 나는 문제도 있었다.

 

크게 나누자면 문제는 3가지였다.

1. 에뮬레이터의 Services 설정 확인

2. 네트워크 설정

3. 콘솔에서 "규칙" 설정

 


1.에뮬레이터의 버전, services 확인

    22902 GoogleApiManager	com.example.got_you_studying	E  Failed to get service from broker.

가장 처음에 떴던 에러다. 파이어베이스에 접근을 아예 못하고있는 듯 했다.

저 로그를 검색해보면 설치된 에뮬레이터의 api의 버전 문제라고 한다.

 

어느정도 검색해봤다면 버전은 무조건 맞추었을 테니까, 버전 다음으로 중요한 것은 저 play 쪽에 플레이 스토어 마크가 있는지 봐야한다.

 

설치한 에뮬레이터에 System Image를 설치해줘야하는데, 이부분을

Google APIs ARM 64 v8a System Image가 아닌

Google Play ARM 63 v8a System Image를 설치해줘야했다.

 

 

 

 

그런데 혹~시 아래처럼 Services를 펼쳤을때에 Google Play Store 가 아예 없을 수도 있다.

있음 / 없음

 

 

 

 

그럴때에는 처음 에뮬레이터에  Add Device를 할 때, 저 Play 칸에 플레이 마크가 있는지를 봐야한다.

마크가 달려있는 가상기기만 구글 플레이 스토어로 이미지를 설치할 수 있었다.

 

이렇게 에뮬레이터 설정을 하고 cold boot를 하면 아까 그 에러는 뜨지 않았다.


2. 네트워크 설정

java.net.UnknownHostException: Unable to resolve host "firestore.googleapis.com": No address associated with hostname

이건 윈도우os의 기기에서는 없고, 맥북에서 실행한 안드로이드 스튜디오에서 돌리는 에뮬레이터에서만 있는 문제같았다.

 

한마디로 에뮬레이터가 인터넷에 연결을 못하고있는 문제였다.

실제로 에뮬레이터 안에서 구글에 들어가려고 해도 네트워크가 없어서 들어갈 수 없었다.

 

꽤 유명한 문제 같았다.

아래의 스택오버플로우에 자세히 잘 나와있다.

https://stackoverflow.com/questions/50670547/android-studio-android-emulator-wifi-connected-with-no-internet

보면 두가지 방법이 있는데, 둘 다 환경에따라 되기도하고 안되기도 하는 듯 하다.

1.맥북의 네트워크를 끈다 -> 노트북 재부팅 -> 에뮬레이터 wipe data 후 cold boot ->

에뮬 네트워크 연결(안됐다고 뜨는데 사실은 된거라고 함) -> 노트북 와이파이 연결

 

2.맥북의 설정에 DNS 검색 -> DNS 서버 메뉴 진입 -> IPv4또는 IPv6주소에 직접 [8.8.8.8]을 추가

 

난 처음에 2번방법은 귀찮을 것 같아서, 그리고 오랫동안 끈 적이 없던 노트북을 재부팅할 겸 1번방법을 했다.

그렇게 3번정도를 반복했는데 안됐다.

 

2번방법이 훨씬 쉽고 간단했다. 아까 그 에러는 이제 안떴다.

 


3. 콘솔에서 규칙 설정

이건 아주 간단했다.

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

저 write: if true 부분이 false로 돼있으면 권한이 없어서 에러가 난다.

true로 바꿔주면 에러가 안난다.

 

이러면 이제 잘 작동한다!

외적,내적,,워낙 많이 들어본 두 이름이다.
두가지가 어떤 경우에 어떻게 쓰인다~ 까지는 암기하듯 외우고 있었다.
이번에 내적과 외적에 대해 찝찝하고 궁금했던것들을 제대로 공부해보았다.
혹시모를 나같은 완전 수포자분들에게 도움이될까 부족하지만 적어본다...

내적과 외적에 대해 적기 전에,

벡터(Vector)

벡터란 단순히 이야기하면 숫자를 원소로 가지는 배열이다.
이것을 사용해 하나의 숫자로는 표현이 어려운 것 들을 표현할 수 있다.

크기,방향,회전,힘,속도 등 다양한 양 을 표현할 수 있다.
게임 프로그래밍에서는 Position,Rotation,Scale도 Vector로 표현한다.

예시)
2D의 경우 A.position = new Vector2(1,0);
3D의 경우 B.position = new Vector3(1,0,3);

2D게임에서 Player의 position이 (2,3) , Enemy1의 position이 (4,1) 이라고 할때
그래프에 아래처럼 위치할 수 있다.

그래프에서의 내적

그래프, 게임응용에 가기 전에 단순히 공식으로만 먼저 봐보자.
단순히 내적을 구하는 "공식"은 (x의곱)+(y의곱) 이다.
그렇다면 위의 Player와 Enemy1의 경우에는 (2x4)+(3X1) 이니까 내적값은 11이 된다.

그래프로 그려본다면 이렇다.

여기서 Player와 Enemy1의 벡터값을 (0,0)으로부터 이은 선이 만나는 각도가 보인다.
한번 다른 점도 찍어볼까?

마찬가지로 여러개의 Enemy를 배치해 보았다.
Player(2,3)을 기준으로 위의 공식으로 내적값을 구했을때,

Enemy1(4,1)의 내적값은 11(양수)이고 예각을 나타낸다.
Enemy2(3,-2)의 내적값은 0이고 직각을 나타낸다.
Enemy3(-4,-1)의 내적값은 -11이고 둔각을 나타낸다.

아~ 내적값이 양수면 예각, 0이면 직각, 음수면 둔각이 되는구나~

...라고 이해 해 볼 수 있다.

방향벡터

방향 벡터란 쉽게말해서 객체가 바라보고 있는 방향을 나타내는 벡터다.
플레이어가 (5,7)방향으로 바라보고 있다면, 방향벡터는 (5,7)이다.

하지만 이 방향벡터는 단순히 방향만 나타내고있지 않다.
(5,7)은 방향뿐 아니라 크기를 나타내기도 한다. 이게 무슨뜻이나면


(5,7)과 (5.81,8.14)와 (6.98,9.77)은 크기가 다르지만 (0,0)을 기준으로 같은 방향으로 뻗어나가고있는 벡터다.

계산할때의 편의성과 일관성, 물리적 의미를 위해서 방향만을 표현하는 벡터를 구하고싶다.
순수한 방향만을 나타내는 방향벡터는 어떻게 구할 수 있을까?

이 때 정규화 라는걸 해주면 딱 방향만 나타내는 벡터를 구할 수 있다.
정규화란 한 벡터의 방향은 유지하지만 크기는 1이 되도록 다시 계산하는 것이다.
(값이-1 ~ 1이다.)

(5,7)과 (5.81,8.14)와 (6.98,9.77)은 정규화 하면 (0.58, 0.81)이 된다.
이 값은 유니티에서 Nomalize함수를 사용해 쉽게 얻을 수 있다.

정규화된 값(방향)에 힘을 구하면 객체의 속도를 구할 수 있다.

게임에서의 내적

이제 드디어 게임에서의 내적을 알아보기위한 재료가 다 모였다.

게임에서 벡터의 내적은 바라보는 방향을 구하는데에 응용된다.
Enemy가 Player를 바라보고있는지, 다른곳을 보고있는지 벡터의 내적을 사용해 구할 수 있다.

  1. Player와 Enemy1의 위치 벡터를 구한다.
Vector3 playerPosition = player.transform.position;
Vector3 enemy1Position = enemy1.transform.position;
  1. Player와 Enemy1사이의 방향 벡터(위에서 말한 정규화 된 값)을 구한다.
Vector3 direction = (playerPosition - enemy1Position).normalized;
  1. Enemy1이 바라보고있는 방향의 방향벡터를 구한다.
Vector3 enemyForward = enemy.transform.forward;
  1. 유니티의 Dot함수를 사용해 내적 계산을 해보자.
float dotProduct = Vector3.Dot(enemyForward, direction);
if (dotProduct > 0)
{
    // 내적값이 양수다.
}
else if (dotProduct < 0)
{
   // 내적값이 음수다.
}
else 
{
   // 내적값이 0이다.
}

지금은 검은선(player와enemy1의 방향벡터) 과
빨간선(enemy1이 바라보는방향) 이 예각을 띄고있다.

아까 빨간옷 입은 친구가 한 말을기억해보자.

내적값이 양수면 예각, 0이면 직각, 음수면 둔각

Enemy1의 시선의 방향벡터가 빨간 선이라면 플레이어 쪽을 바라보고있는것이다.
=> 두 벡터의 내적값이 양수일 때 플레이어쪽을 바라보고있는것이다.

Enemy1의 시선의 방향벡터가 파란 선이라면 플레이어와 수직의 방향을 바라보고있다.
=> 두 벡터의 내적값이 0일 때 플레이어와 수직의 방향을 보고있다.

Enemy1의 시선의 방향벡터가 초록 선이라면 플레이어 쪽을 바라보고있지 않은것이다.
=> 두 벡터의 내적값이 음수일 때 플레이어쪽을 바라보고있지 않은것이다.

이렇게 벡터의 내적값을 사용해서 객체 다른 객체를 바라보는지, 아닌지를 구할 수 있게 됐다.


면접관 : 벡터의 내적을 게임에 어떻게 적용할 수 있나요?

이제 두려워 하지 마세요!


이번 공부는 아래의 블로그에서 많은 도움을 받았다. 감사합니다!
https://gpfatp.blogspot.com/2019/08/1.html#

 

작성일: 2024년 10월 16일

 

편입공부를 했던 지금은 이 글이 다르게 읽힌다.

'아카이브 > 개발,공부' 카테고리의 다른 글

1인개발 후기  (0) 2026.05.12
Transform과 Rigidbody에 대해  (0) 2026.05.12
군것질 후기  (0) 2026.05.12
유니티,깃 협업 환경 세팅 (팀원 공유용)  (0) 2026.05.12
객체지향 프로그래밍  (0) 2026.05.12

+ Recent posts