k6 성능 하는 이유

1. k6하기 전에 확인해야할 점

import http from 'k6/http';
import { check, sleep } from 'k6';
import { randomItem } from '<https://jslib.k6.io/k6-utils/1.2.0/index.js>';

// ===========================================================================
// 1. [설정] 로그에서 확보한 "진짜 토큰"
// ===========================================================================
const ACCESS_TOKEN = '진짜 토큰을 작성해주면 됨(내 db에 있는 token)';

const BASE_URL = '<http://host.docker.internal:8000>'; 

// ===========================================================================
// 2. 테스트 옵션 
// ===========================================================================
export const options = {
  scenarios: {
    write_heavy: {
      executor: 'ramping-vus',
      startVUs: 0,
      stages: [
        { duration: '5s', target: 5 },
        { duration: '10s', target: 5 },
        { duration: '5s', target: 0 },
      ],
    },
  },
  thresholds: {
    http_req_failed: ['rate<0.01'], 
    http_req_duration: ['p(95)<1000'],
  },
};

// ===========================================================================
// 3. 메인 테스트 로직
// ===========================================================================
export default function () {
  const params = {
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${ACCESS_TOKEN}`,
      'Cookie': `accessToken=${ACCESS_TOKEN}`
    },
  };

  const payload = JSON.stringify({
    title: `k6 진짜 토큰 테스트`,
    category: randomItem(['커피챗', '보드게임', '카공', '기타']),
    description: '로그에서 딴 실제 토큰으로 테스트 중입니다.',
    location: {
      latitude: 37.5,
      longitude: 127.0,
    },
    locationName: '테스트 카페',
    maxCapacity: 4,
    date: '2025-05-05',
    startTime: '14:00:00',
  });

  const res = http.post(`${BASE_URL}/api/v1/boards`, payload, params);

  check(res, {
    '성공 (201)': (r) => r.status === 201,
    '실패 (권한없음 401)': (r) => r.status !== 401,
  });

  sleep(1);
}
docker run --rm -i grafana/k6 run - < (k6파일이름).js
# docker-compose 파일에 k6를 넣지 않아도 docker로 돌릴수있음

2. 과부화되는 곳

026-02-04 16:37:06 <--- Last few GCs --->
2026-02-04 16:37:06 
2026-02-04 16:37:06 [47:0x1b2ef8a0]    54421 ms: Scavenge (reduce) 2046.0 (2082.9) -> 2045.4 (2083.1) MB, 19.7 / 0.0 ms  (average mu = 0.210, current mu = 0.003) allocation failure; 
2026-02-04 16:37:06 [47:0x1b2ef8a0]    55254 ms: Mark-sweep (reduce) 2046.2 (2083.1) -> 2045.7 (2083.4) MB, 745.3 / 0.0 ms  (+ 765.6 ms in 164 steps since start of marking, biggest step 19.9 ms, walltime since start of marking 1992 ms) (average mu = 0.330, current mu = 0.440
2026-02-04 16:37:06 
2026-02-04 16:37:06 <--- JS stacktrace --->
2026-02-04 16:37:06 
2026-02-04 16:37:06 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
2026-02-04 16:37:06  1: 0xb826e4 node::Abort() [node]
2026-02-04 16:37:07  ELIFECYCLE  Command failed with exit code 134.
2026-02-04 16:37:06  2: 0xa9bf08  [node]
2026-02-04 16:37:06  3: 0xd43e90 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]
2026-02-04 16:37:06  4: 0xd44060 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node]
2026-02-04 16:37:06  5: 0xf22814  [node]
2026-02-04 16:37:06  6: 0xf2347c v8::internal::Heap::RecomputeLimits(v8::internal::GarbageCollector) [node]
2026-02-04 16:37:06  7: 0xf339c4  [node]
2026-02-04 16:37:06  8: 0xf34588 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
2026-02-04 16:37:06  9: 0xf10930 v8::internal::HeapAllocator::AllocateRawWithLightRetrySlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node]
2026-02-04 16:37:06 10: 0xf11908 v8::internal::HeapAllocator::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node]
2026-02-04 16:37:06 11: 0xef4598 v8::internal::Factory::NewFillerObject(int, v8::internal::AllocationAlignment, v8::internal::AllocationType, v8::internal::AllocationOrigin) [node]
2026-02-04 16:37:06 12: 0x129acd4 v8::internal::Runtime_AllocateInYoungGeneration(int, unsigned long*, v8::internal::Isolate*) [node]
2026-02-04 16:37:06 13: 0x167f6ec  [node]
2026-02-04 16:37:07 Aborted

이런 에러가 뜸

backend/src/global/config/typeorm.config.ts

			logging: ['warn','error'],
      maxQueryExecutionTime: 1000,
# 2줄 추가해줌. 그러면 에러가 나면 확실하게 알려줌
docker-compose up --build 
# docker 앱 내에서 다시 restart하면 안보임. 터미널에서 보이는거라서
nest      | Decorator token: { sub: 1, iat: 1770190582, exp: 1770194182 }
nest      | 
nest      | <--- Last few GCs --->
nest      | 
nest      | [47:0x1b2ef8a0]    54421 ms: Scavenge (reduce) 2046.0 (2082.9) -> 2045.4 (2083.1) MB, 19.7 / 0.0 ms  (average mu = 0.210, current mu = 0.003) allocation failure; 
nest      | [47:0x1b2ef8a0]    55254 ms: Mark-sweep (reduce) 2046.2 (2083.1) -> 2045.7 (2083.4) MB, 745.3 / 0.0 ms  (+ 765.6 ms in 164 steps since start of marking, biggest step 19.9 ms, walltime since start of marking 1992 ms) (average mu = 0.330, current mu = 0.440
nest      | 
nest      | <--- JS stacktrace --->
nest      | 
nest      | FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
nest      |  1: 0xb826e4 node::Abort() [node]
nest      |  2: 0xa9bf08  [node]
nest      |  3: 0xd43e90 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]
nest      |  4: 0xd44060 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node]
nest      |  5: 0xf22814  [node]
nest      |  6: 0xf2347c v8::internal::Heap::RecomputeLimits(v8::internal::GarbageCollector) [node]
nest      |  7: 0xf339c4  [node]
nest      |  8: 0xf34588 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
nest      |  9: 0xf10930 v8::internal::HeapAllocator::AllocateRawWithLightRetrySlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node]
nest      | 10: 0xf11908 v8::internal::HeapAllocator::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node]
nest      | 11: 0xef4598 v8::internal::Factory::NewFillerObject(int, v8::internal::AllocationAlignment, v8::internal::AllocationType, v8::internal::AllocationOrigin) [node]
nest      | 12: 0x129acd4 v8::internal::Runtime_AllocateInYoungGeneration(int, unsigned long*, v8::internal::Isolate*) [node]
nest      | 13: 0x167f6ec  [node]
postgres  | 2026-02-04 07:37:07.103 UTC [105] LOG:  could not send data to client: Connection reset by peer
postgres  | 2026-02-04 07:37:07.103 UTC [105] STATEMENT:  SELECT "User"."created_at" AS "User_created_at", "User"."updated_at" AS "User_updated_at", "User"."deleted_at" AS "User_deleted_at", "User"."id" AS "User_id", "User"."kakao_id" AS "User_kakao_id", "User"."username" AS "User_username", "User"."region" AS "User_region", "User__User_boards"."created_at" AS "User__User_boards_created_at", "User__User_boards"."updated_at" AS "User__User_boards_updated_at", "User__User_boards"."deleted_at" AS "User__User_boards_deleted_at", "User__User_boards"."id" AS "User__User_boards_id", "User__User_boards"."title" AS "User__User_boards_title", "User__User_boards"."description" AS "User__User_boards_description", "User__User_boards"."start_time" AS "User__User_boards_start_time", "User__User_boards"."date" AS "User__User_boards_date", "User__User_boards"."category" AS "User__User_boards_category", "User__User_boards"."user_id" AS "User__User_boards_user_id", "User__User_boards"."location_id" AS "User__User_boards_location_id", "User__User_boards"."chat_room_id" AS "User__User_boards_chat_room_id", "User__User_userChatRooms"."id" AS "User__User_userChatRooms_id", "User__User_userChatRooms"."user_id" AS "User__User_userChatRooms_user_id", "User__User_userChatRooms"."chat_room_id" AS "User__User_userChatRooms_chat_room_id", "User__User_boards__User__User_boards_chatRoom"."created_at" AS "User__User_boards__User__User_boards_chatRoom_created_at", "User__User_boards__User__User_boards_chatRoom"."updated_at" AS "User__User_boards__User__User_boards_chatRoom_updated_at", "User__User_boards__User__User_boards_chatRoom"."deleted_at" AS "User__User_boards__User__User_boards_chatRoom_deleted_at", "User__User_boards__User__User_boards_chatRoom"."id" AS "User__User_boards__User__User_boards_chatRoom_id", "User__User_boards__User__User_boards_chatRoom"."chat_name" AS "User__User_boards__User__User_boards_chatRoom_chat_name", "User__User_boards__User__User_boards_chatRoom"."member_count" AS "User__User_boards__User__User_boards_chatRoom_member_count", "User__User_boards__User__User_boards_chatRoom"."max_member_count" AS "User__User_boards__User__User_boards_chatRoom_max_member_count", "User__User_boards__User__User_boards_chatRoom"."boardId" AS "User__User_boards__User__User_boards_chatRoom_boardId" FROM "user" "User" LEFT JOIN "board" "User__User_boards" ON "User__User_boards"."user_id"="User"."id" AND ("User__User_boards"."deleted_at" IS NULL)  LEFT JOIN "user_chat_room" "User__User_userChatRooms" ON "User__User_userChatRooms"."user_id"="User"."id"  LEFT JOIN "chat_room" "User__User_boards__User__User_boards_chatRoom" ON "User__User_boards__User__User_boards_chatRoom"."id"="User__User_boards"."chat_room_id" AND ("User__User_boards__User__User_boards_chatRoom"."deleted_at" IS NULL) WHERE ( (("User"."id" = $1)) ) AND ( "User"."deleted_at" IS NULL ) AND ( "User"."id" IN (1) )
postgres  | 2026-02-04 07:37:07.104 UTC [105] FATAL:  connection to client lost
postgres  | 2026-02-04 07:37:07.104 UTC [105] STATEMENT:  SELECT "User"."created_at" AS "User_created_at", "User"."updated_at" AS "User_updated_at", "User"."deleted_at" AS "User_deleted_at", "User"."id" AS "User_id", "User"."kakao_id" AS "User_kakao_id", "User"."username" AS "User_username", "User"."region" AS "User_region", "User__User_boards"."created_at" AS "User__User_boards_created_at", "User__User_boards"."updated_at" AS "User__User_boards_updated_at", "User__User_boards"."deleted_at" AS "User__User_boards_deleted_at", "User__User_boards"."id" AS "User__User_boards_id", "User__User_boards"."title" AS "User__User_boards_title", "User__User_boards"."description" AS "User__User_boards_description", "User__User_boards"."start_time" AS "User__User_boards_start_time", "User__User_boards"."date" AS "User__User_boards_date", "User__User_boards"."category" AS "User__User_boards_category", "User__User_boards"."user_id" AS "User__User_boards_user_id", "User__User_boards"."location_id" AS "User__User_boards_location_id", "User__User_boards"."chat_room_id" AS "User__User_boards_chat_room_id", "User__User_userChatRooms"."id" AS "User__User_userChatRooms_id", "User__User_userChatRooms"."user_id" AS "User__User_userChatRooms_user_id", "User__User_userChatRooms"."chat_room_id" AS "User__User_userChatRooms_chat_room_id", "User__User_boards__User__User_boards_chatRoom"."created_at" AS "User__User_boards__User__User_boards_chatRoom_created_at", "User__User_boards__User__User_boards_chatRoom"."updated_at" AS "User__User_boards__User__User_boards_chatRoom_updated_at", "User__User_boards__User__User_boards_chatRoom"."deleted_at" AS "User__User_boards__User__User_boards_chatRoom_deleted_at", "User__User_boards__User__User_boards_chatRoom"."id" AS "User__User_boards__User__User_boards_chatRoom_id", "User__User_boards__User__User_boards_chatRoom"."chat_name" AS "User__User_boards__User__User_boards_chatRoom_chat_name", "User__User_boards__User__User_boards_chatRoom"."member_count" AS "User__User_boards__User__User_boards_chatRoom_member_count", "User__User_boards__User__User_boards_chatRoom"."max_member_count" AS "User__User_boards__User__User_boards_chatRoom_max_member_count", "User__User_boards__User__User_boards_chatRoom"."boardId" AS "User__User_boards__User__User_boards_chatRoom_boardId" FROM "user" "User" LEFT JOIN "board" "User__User_boards" ON "User__User_boards"."user_id"="User"."id" AND ("User__User_boards"."deleted_at" IS NULL)  LEFT JOIN "user_chat_room" "User__User_userChatRooms" ON "User__User_userChatRooms"."user_id"="User"."id"  LEFT JOIN "chat_room" "User__User_boards__User__User_boards_chatRoom" ON "User__User_boards__User__User_boards_chatRoom"."id"="User__User_boards"."chat_room_id" AND ("User__User_boards__User__User_boards_chatRoom"."deleted_at" IS NULL) WHERE ( (("User"."id" = $1)) ) AND ( "User"."deleted_at" IS NULL ) AND ( "User"."id" IN (1) )
postgres  | 2026-02-04 07:37:07.113 UTC [97] LOG:  could not send data to client: Connection reset by peer
postgres  | 2026-02-04 07:37:07.113 UTC [97] STATEMENT:  SELECT "User"."created_at" AS "User_created_at", "User"."updated_at" AS "User_updated_at", "User"."deleted_at" AS "User_deleted_at", "User"."id" AS "User_id", "User"."kakao_id" AS "User_kakao_id", "User"."username" AS "User_username", "User"."region" AS "User_region", "User__User_boards"."created_at" AS "User__User_boards_created_at", "User__User_boards"."updated_at" AS "User__User_boards_updated_at", "User__User_boards"."deleted_at" AS "User__User_boards_deleted_at", "User__User_boards"."id" AS "User__User_boards_id", "User__User_boards"."title" AS "User__User_boards_title", "User__User_boards"."description" AS "User__User_boards_description", "User__User_boards"."start_time" AS "User__User_boards_start_time", "User__User_boards"."date" AS "User__User_boards_date", "User__User_boards"."category" AS "User__User_boards_category", "User__User_boards"."user_id" AS "User__User_boards_user_id", "User__User_boards"."location_id" AS "User__User_boards_location_id", "User__User_boards"."chat_room_id" AS "User__User_boards_chat_room_id", "User__User_userChatRooms"."id" AS "User__User_userChatRooms_id", "User__User_userChatRooms"."user_id" AS "User__User_userChatRooms_user_id", "User__User_userChatRooms"."chat_room_id" AS "User__User_userChatRooms_chat_room_id", "User__User_boards__User__User_boards_chatRoom"."created_at" AS "User__User_boards__User__User_boards_chatRoom_created_at", "User__User_boards__User__User_boards_chatRoom"."updated_at" AS "User__User_boards__User__User_boards_chatRoom_updated_at", "User__User_boards__User__User_boards_chatRoom"."deleted_at" AS "User__User_boards__User__User_boards_chatRoom_deleted_at", "User__User_boards__User__User_boards_chatRoom"."id" AS "User__User_boards__User__User_boards_chatRoom_id", "User__User_boards__User__User_boards_chatRoom"."chat_name" AS "User__User_boards__User__User_boards_chatRoom_chat_name", "User__User_boards__User__User_boards_chatRoom"."member_count" AS "User__User_boards__User__User_boards_chatRoom_member_count", "User__User_boards__User__User_boards_chatRoom"."max_member_count" AS "User__User_boards__User__User_boards_chatRoom_max_member_count", "User__User_boards__User__User_boards_chatRoom"."boardId" AS "User__User_boards__User__User_boards_chatRoom_boardId" FROM "user" "User" LEFT JOIN "board" "User__User_boards" ON "User__User_boards"."user_id"="User"."id" AND ("User__User_boards"."deleted_at" IS NULL)  LEFT JOIN "user_chat_room" "User__User_userChatRooms" ON "User__User_userChatRooms"."user_id"="User"."id"  LEFT JOIN "chat_room" "User__User_boards__User__User_boards_chatRoom" ON "User__User_boards__User__User_boards_chatRoom"."id"="User__User_boards"."chat_room_id" AND ("User__User_boards__User__User_boards_chatRoom"."deleted_at" IS NULL) WHERE ( (("User"."id" = $1)) ) AND ( "User"."deleted_at" IS NULL ) AND ( "User"."id" IN (1) )
postgres  | 2026-02-04 07:37:07.113 UTC [97] FATAL:  connection to client lost
postgres  | 2026-02-04 07:37:07.113 UTC [97] STATEMENT:  SELECT "User"."created_at" AS "User_created_at", "User"."updated_at" AS "User_updated_at", "User"."deleted_at" AS "User_deleted_at", "User"."id" AS "User_id", "User"."kakao_id" AS "User_kakao_id", "User"."username" AS "User_username", "User"."region" AS "User_region", "User__User_boards"."created_at" AS "User__User_boards_created_at", "User__User_boards"."updated_at" AS "User__User_boards_updated_at", "User__User_boards"."deleted_at" AS "User__User_boards_deleted_at", "User__User_boards"."id" AS "User__User_boards_id", "User__User_boards"."title" AS "User__User_boards_title", "User__User_boards"."description" AS "User__User_boards_description", "User__User_boards"."start_time" AS "User__User_boards_start_time", "User__User_boards"."date" AS "User__User_boards_date", "User__User_boards"."category" AS "User__User_boards_category", "User__User_boards"."user_id" AS "User__User_boards_user_id", "User__User_boards"."location_id" AS "User__User_boards_location_id", "User__User_boards"."chat_room_id" AS "User__User_boards_chat_room_id", "User__User_userChatRooms"."id" AS "User__User_userChatRooms_id", "User__User_userChatRooms"."user_id" AS "User__User_userChatRooms_user_id", "User__User_userChatRooms"."chat_room_id" AS "User__User_userChatRooms_chat_room_id", "User__User_boards__User__User_boards_chatRoom"."created_at" AS "User__User_boards__User__User_boards_chatRoom_created_at", "User__User_boards__User__User_boards_chatRoom"."updated_at" AS "User__User_boards__User__User_boards_chatRoom_updated_at", "User__User_boards__User__User_boards_chatRoom"."deleted_at" AS "User__User_boards__User__User_boards_chatRoom_deleted_at", "User__User_boards__User__User_boards_chatRoom"."id" AS "User__User_boards__User__User_boards_chatRoom_id", "User__User_boards__User__User_boards_chatRoom"."chat_name" AS "User__User_boards__User__User_boards_chatRoom_chat_name", "User__User_boards__User__User_boards_chatRoom"."member_count" AS "User__User_boards__User__User_boards_chatRoom_member_count", "User__User_boards__User__User_boards_chatRoom"."max_member_count" AS "User__User_boards__User__User_boards_chatRoom_max_member_count", "User__User_boards__User__User_boards_chatRoom"."boardId" AS "User__User_boards__User__User_boards_chatRoom_boardId" FROM "user" "User" LEFT JOIN "board" "User__User_boards" ON "User__User_boards"."user_id"="User"."id" AND ("User__User_boards"."deleted_at" IS NULL)  LEFT JOIN "user_chat_room" "User__User_userChatRooms" ON "User__User_userChatRooms"."user_id"="User"."id"  LEFT JOIN "chat_room" "User__User_boards__User__User_boards_chatRoom" ON "User__User_boards__User__User_boards_chatRoom"."id"="User__User_boards"."chat_room_id" AND ("User__User_boards__User__User_boards_chatRoom"."deleted_at" IS NULL) WHERE ( (("User"."id" = $1)) ) AND ( "User"."deleted_at" IS NULL ) AND ( "User"."id" IN (1) )
nest      | Aborted
nest      |  ELIFECYCLE  Command failed with exit code 134.
nest exited with code 134

src/user/user.service.ts
/** 유저 정보 조회(작성한 게시글 포함) */
  async getUserById(
    id: number,
    createdBoardsPagingParams: PagingParams,
    joinedBoardsPagingParams: PagingParams,
  ): Promise<UserResponseDto> {
    const user = await this.userRepository.findOne({
      where: { id },
      relations: ['boards', 'userChatRooms'], #여기가 문제임. 
    });

해결책