반응형

Repository는 Entity에 대한 CRUD를 추상화한 객체입니다.

여기서 추상화라고 하면,
사용이 복잡한 것들을 핵심적인 기능만 간추려서 사용하기 쉽게 만든 것을 의미합니다.

 

예를 들면,

고양이의 정보를 Database에 저장하기 위해서는 다음과 같은 SQL을 사용합니다.

insert into cat(name, age, breed)
values('꼼지', 5, '스코티시폴드');

 

이것을 Repository 패턴으로 표현하면 다음과 같습니다.

const cat = new CreateCatDto();
cat.name = '꼼지';
cat.age = 5;
cat.breed = '스코티시폴더';
catRepository.save(cat);

SQL을 잘 아는 사람 입장에서는 쿼리를 사용하는 것이 훨씬 가독성이 좋습니다.

하지만 SQL을 잘 모르는 사람도 코딩 방법만 알면 쉽게 Database 핸들링이 가능해집니다.

 

Repository 패턴을 보시면 쿼리를 객체로 만들어서 사용하고 있는 것을 알 수 있습니다.

이렇듯 Repository 패턴은 좀 더 프로그래밍에 가깝게 쿼리를 사용할 수 있게 만든 것입니다.

 

쿼리를 잘 모르거나 간단한 쿼리를 사용하고자 할 경우에는 정말 쉽게 사용을 할 수 있습니다.

 

반응형

'TypeORM' 카테고리의 다른 글

2. TypeORM 사용법 기초 (2023, NestJS)  (2) 2023.05.07
1. TypeORM 개념과 셋팅 (2023, NestJS)  (0) 2023.05.05
반응형

Nestjs의 API를 PUT, POST 등으로 호출할 경우에 보통 Json 형식을 사용하게 됩니다.

이때 json의 용량이 커지게 되면 다음과 같은 문제가 발생합니다.

413 Payload too large

Nestjs의 오류 메시지는 다음과 같습니다.

413 Error in nestjs

이 문제를 해결하는 방법은 main.ts에 다음과 같은 내용을 추가하시면 됩니다.
(app.listen 위에 추가하면 됩니다)

import { json } from 'body-parser';

app.use(json({ limit: '50mb' }));
await app.listen(port);

이 문제의 해결법은 kamilmysliwiec 가 github에서 답변한 내용에서 가져왔습니다.

https://github.com/nestjs/nest/issues/529#issuecomment-376576929

 

How to set limit value for jsonParser · Issue #529 · nestjs/nest

I'm submitting a [ ] Regression [ ] Bug report [x] Feature request [ ] Documentation issue or request [ ] Support request => Please do not submit support request here, instead post your question on...

github.com

 

반응형

'Nestjs 활용팁' 카테고리의 다른 글

NestJS - TypeORM 트랜젝션 처리  (2) 2022.07.29
반응형

반복 작업의 필요성

Schedule이란 일정 주기별로 반복되는 Job을 처리하는 것을 의미합니다.
주기는 다음과 같은 것들이 있을 수 있습니다.

  • 매시, 매일, 매주, 매월, 매년
  • 격주, 격월
  • 특정 시간, 특정 요일, 특정 일자 등등

 

반복되는 작업들은 어떤 것들이 있을까요?

  • 어제의 사이트 통계를 다음날 아침 Slack에 뿌려주기
  • 일주일에 한번 특정 사이트를 크롤링해서 데이터 저장하기
  • 생일인 고객에게 쿠폰을 발행해서 메시지 보내기

이런 작업들을 일일이 수동으로 처리하기는 매우 어렵습니다.

이때 자동화된 스케줄러가 필요합니다.

리눅스의 Crontab

이런 Schedule을 처리하는 대표적인 프로그램이 Linux에서 제공하는 crontab입니다.

리눅스 shell에서 "crontab -e" 명령을 사용하여 편집모드에서 설정을 하게되면,

일정 주기별로 반복 수행하는 형태입니다.

crontab 형식
crontab 샘플

 

AWS 에서 Scheduler 사용하기

Cloud 환경이 되면서 오면서 crontab을 사용하는 것이 어려워졌습니다.

쿠버네티스, AWS ECS등의 도커 기반 오케스트레이션 플랫폼을 사용하게 되면서, 인스턴스의 관리를 사용자가 아닌 플랫폼이 맡게 되기 때문입니다. 이로 인해 사용자가 직접 서버를 수정하는 일이 대부분 사라지게 되었습니다.

 

crontab을 대신할 수 있도록 AWS에서는 Amazon Event Bridge라는 서비스를 제공하고 있습니다.

Amazon EventBridge

Amazon Event Bridge와 AWS Lambda를 조합하면 다양한 구현이 가능합니다.

Amazon Event Bridge + AWS Lambda

 

Amazon EventBridge는 crontab과 거의 유사한 방식으로 aws console에서 구현이 가능합니다.

 

스케줄러 샘플 구현 

Amazon Event Bridge와 Lambda를 이용해 API를 호출하는 서비스를 구현하는 방법을 샘플을 통해 알아봅니다.

순서는 다음과 같습니다.

  • (API를 호출하는) Lambda Function 만들기
  • Amazon EventBridge에 Schedule 등록하기

Lambda Function 만들기

  • AWS Lambda에서 함수를 생성합니다.
  • Python 3.10과 arm을 이용하도록 셋팅합니다.
  • 코드를 다음과 같이 작성합니다.
import json
import requests

def lambda_handler(event, context):
	print('calling...')
	url = "https://api.sample.com/..."
	header = {
		'Content-Type': 'application/json; charset=UTF-8',
		'User-Agent': ...
	}
	res = requests.get(
		url,
		headers,
		data={}
	)
	print(res.content)
	return {
		'statusCode': 200,
		'body': ...
	}
  • requests 라이브러리는 aws에서 기본 제공이 아니기 때문에 Layer를 만들어 추가해 주어야 합니다.
  • Layer는 반드시 python 폴더를 만드시고 해당 폴더에서 pip install로 추가해야 합니다.
mkdir python
cd python

pip install requests -t .
  • python 폴더를 압축합니다. (python.zip)
  • Lambda 메뉴에서 계층을 선택 후 계층 생성 버튼을 클릭합니다.

  • upload에서 python.zip 파일을 추가합니다.

 

Amazon EventBridge에 Scheduler 등록하기

  • Amazon EventBridge 서비스에서 좌측 메뉴의 Scheduler - 일정 메뉴 선택
  • 일정 생성 버튼 클릭
  • cron 형식으로 일정 패턴 등록

  • 대상 선택에서 AWS Lambda를 선택

  • Invoke를 선택하고, 생성한 Lambda function을 선택하면 됩니다.

이렇게 하면 매일 아침 9시에 API를 호출하는 Schedule을 사용할 수 있습니다.

반응형
반응형

이 글은 TypeORM의 기본적인 사용법에 대해 설명합니다.

다음은 이 글을 설명한 유튜브 영상입니다.

https://youtu.be/IfcnR7TtbCw

목차

  • table 생성
  • 소스 생성
  • 사용법

테이블 생성

다음과 같이 cats table을 생성합니다.

create table cat
(
    id    int auto_increment
        primary key,
    name  varchar(255) not null comment '고양이 이름',
    age   int          not null comment '고양이 나이',
    breed varchar(255) not null comment '고양이 종류'
);

소스 생성

  • Nestjs의 Generator(소스 자동 생성)를 사용하여 cats module을 생성합니다.
nest g resource cats
  • resource 옵션은 module, controller, service, entities, dto를 한 번에 자동으로 생성합니다.

Entity 객체 생성

  • domain/cats.entity.ts
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";

@Entity()
export class Cat {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @Column()
    age: number;

    @Column()
    breed: string;
}

DTO 수정

  • cats/dto/create-cat.dto.ts 를 다음과 같이 만듭니다.
export class CreateCatDto {
    name: string;
    age: number;
    breed: string;
}

모듈에 Entity 임포트

  • cats/cats.module.ts에 cats.entity를 임포트 해주어야 사용할 수 있습니다.
import { Module } from '@nestjs/common';
import { CatsService } from './cats.service';
import { CatsController } from './cats.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Cat } from 'src/domain/cat.entity';

@Module({
  imports: [TypeOrmModule.forFeature([Cat])],
  controllers: [CatsController],
  providers: [CatsService]
})
export class CatsModule {}

서비스에서 Repository 사용하기

cats service에서 constructor에 repository를 주입합니다.

  • cats/cats.service.ts
constructor(
  @InjectRepository(Cat)
  private catRepository: Repository<Cat>
){}
  • cats/cats.service.ts를 다음과 같이 수정합니다.
async create(createCatDto: CreateCatDto) {
  return await this.catRepository.save(createCatDto);
}

async findOne(id: number) {
  return await this.catRepository.findOne({where: {id}});
}

async update(id: number, updateCatDto: UpdateCatDto) {
  const cat = await this.findOne(id);
  if(!cat){
    throw new Error('cat not found');
  }
  Object.assign(cat, updateCatDto);
  return await this.catRepository.save(cat);
}

async remove(id: number) {
  const cat = await this.findOne(id);
  if(!cat){
    throw new Error('cat not found');
  }
  return await this.catRepository.remove(cat);
}

테스트

포스트맨을 사용하여 테스트를 합니다.

  • 생성
    • POST http://localhost:3000/cats
    • Data는 다음과 같습니다.
{
    "name": "엄지",
    "age": 7,
    "breed": "스코티시폴드"
}

  • 전체 목록 조회
    • GET http://localhost:3000/cats

  • 아이디로 조회
    • GET http://localhost:3000/cats/1

  • 업데이트
    • PATCH http://localhost:3000/cats/1
    • Data
{
    "name": "엄지양이",
    "age": 5,
    "breed": "스코티시폴드"
}

  •  삭제
    • DELETE http://localhost:3000/cats/2

이상으로 TypeORM에서 CRUD를 사용하는 방법에 대해서 알아보았습니다.

반응형

'TypeORM' 카테고리의 다른 글

3. TypeORM에서 Repository의 개념 이해하기  (0) 2023.09.12
1. TypeORM 개념과 셋팅 (2023, NestJS)  (0) 2023.05.05
반응형

이 글은 TypeORM의 기본적인 개념에 대해 설명하고, 샘플 소스를 통해 TypeORM의 기본적인 사용법에 대해 설명합니다.

 

이 글의 동영상 강의를 보고 싶으시면 아래를 클릭하세요.

https://youtu.be/yzsN620ZYpw

목차

  • ORM(TypeORM) 개념
  • ORM(TypeORM)의 장단점
  • TypeORM 셋팅하기

 

ORM(TypeORM) 개념

  • TypeORM = "Typescript + ORM"을 의미합니다. 즉, typescript에서 orm을 사용할 수 있도록 만든 프레임워크입니다.
  • ORM은 Object-Relational Mapping의 약자입니다. 
  • Object = 객체지향언어에서 말하는 객체(Object)를 의미합니다.
  • Relational =  관계형 데이터베이스(Relational Database)를 의미합니다.
  • 즉, 객체와 관계형 데이터베이스를 자동으로 맵핑 시켜주는 기술을 ORM이라고 합니다.
  • ORM을 사용하면 DB의 종류에 상관없이 코딩을 할 수 있습니다. 즉, MySQL, PostgreSQL, Oracle등 어떤 Database를 사용하더라도 동일 코드로 작성하여 사용할 수 있도록 만들어진 프레임워크입니다.
  • 결론 : TypeORM은 Typescript에서 사용하는 ORM 프레임워크입니다.

ORM(TypeORM)의 장단점

  • Database의 쿼리문을 사용하는 대신, 기존과 유사한 방식으로 코드를 작성하므로 사용이 편리하다.
  • 독립적인 코드를 사용하므로 재사용성이 증가한다.
  • DBMS에 종속적인 쿼리를 사용하지 않으므로, DB 변경이 용이하다.
  • 테이블간의 관계가 복잡해지고 쿼리가 복잡해질 수록 구현이 어렵다.
  • 쿼리를 많이 사용해본 사람일 경우, 쿼리를 사용했을때 보다 직관성이 떨어진다.

TypeORM 셋팅하기

  • Nestjs 프로젝트를 만듭니다.
nest new typeorm2023
  • TypeORM 관련 패키지를 설치합니다.
npm install --save @nestjs/typeorm typeorm mysql2
  • root 폴더에 orm.config.ts를 만들고 다음과 같이 추가합니다.
import { TypeOrmModuleOptions } from "@nestjs/typeorm";

function ormConfig(): TypeOrmModuleOptions {
    const commonConf = {
        SYNCRONIZE: false,
        ENTITIES: [__dirname + '/domain/*{.ts,.js}'],
        MIGRATIONS: [__dirname + '/migrations/**/*{.ts,.js}'],
        MIGRATIONS_RUN: false,
    };

    return {
        name: 'default',
        type: 'mysql',
        database: 'test',
        host: 'localhost',
        port: Number(3306),
        username: 'root',
        password: 'root',
        logging: true,
        synchronize: commonConf.SYNCRONIZE,
        entities: commonConf.ENTITIES,
        migrations: commonConf.MIGRATIONS,
        migrationsRun: commonConf.MIGRATIONS_RUN,
    };
}

export { ormConfig };
  • 세부사항들을 설명하면 다음과 같습니다.
    • SYNCRONIZE는 객체와 테이블을 동기화 할때 사용합니다. 즉, 객체가 변경되면 테이블에 자동 반영이 되고, 테이블이 변경되면 객체가 자동 변경되는 기능입니다. 이 기능을 운영서버에서 사용할 때는 주의가 필요합니다. 운영중인 데이터는 용량이 크고, 이런 변화가 있을 경우 문제가 생길 수 있으므로, 만약의 사고를 예방하기 위해서는 이 기능을 "false"로 설정하는 것이 좋습니다.
    • ENTITIES는 객체가 위치하는 폴더를 의미합니다. 즉, 테이블의 schema를 객체로 만들어 저장하는 파일들이 위치하는 곳입니다.

 

셋팅이 완료되면 다음과 같이 최상위 모듈에 ormConfig를 추가해 줌으로써 사용이 가능하게 됩니다.

  • app.module.ts에 ormConfig를 추가합니다.
import { ormConfig } from './orm.config';
@Module({
  imports: [
    TypeOrmModule.forRootAsync({ useFactory: ormConfig }),
    ...
  ],
  ...
})

다음은 TypeORM 기초 사용법에 대해 알아보도록 하겠습니다.

반응형

'TypeORM' 카테고리의 다른 글

3. TypeORM에서 Repository의 개념 이해하기  (0) 2023.09.12
2. TypeORM 사용법 기초 (2023, NestJS)  (2) 2023.05.07
반응형

AWS의 S3에 이미지를 올리면 자동으로 썸네일을 만들어 주는 람다에 대해 설명합니다.

다음은 이글의 유튜브 강의입니다.

https://youtu.be/fMtNmmtlLig


홈페이지에 갤러리 기능을 만들게 되면 꼭 필요한게 이미지의 썸네일 입니다.

이미지를 업로드 할때마다 썸네일을 별도로 제작하기는 너무 귀찮은 작업이죠.

이럴때 AWS의 람다를 사용하면 썸네일을 자동으로 생성할 수 있습니다.

 

해당 내용은 AWS 공식 홈페이지에 자세하게 설명이 되어 있습니다.

https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/with-s3-tutorial.html

 

자습서: Amazon S3 트리거를 사용하여 썸네일 이미지 생성 - AWS Lambda

자습서: Amazon S3 트리거를 사용하여 썸네일 이미지 생성 이 자습서에서는 Lambda 함수를 생성하고 Amazon Simple Storage Service(Amazon S3)에 대한 트리거를 구성합니다. Amazon S3는 S3 버킷에 업로드된 각 이

docs.aws.amazon.com

해당 내용을 기반으로 썸네일 자동 생성 기능을 만들어 봅니다.

 

순서는 다음과 같습니다.

1. AWS CLI 설치

2. 버킷 생성

3. IAM 역할(Role) 생성

4. 리사이즈용 프로그램 개발(Python)

5. 프로젝트 빌드

6. 배포

7. S3 트리거 생성

8. 테스트

 

1. AWS CLI 설치

간단한 파이썬 코드를 작성할 경우에는 AWS 콘솔에서도 파이썬 라이브러리가 포함되어 있기 때문에 작업이 가능하지만,

이미지 썸네일을 만드는 경우에는 pillow라는 라이브러리를 사용해야 하므로 콘솔에서는 처리가 어렵습니다.

따라서 로컬에서 라이브러리를 다운받아 서버에 배포하는 과정이 필요합니다.

 

로컬에서 람다 패키지를 만들어 서버에 배포하기 위해서는 AWS CLI를 사용합니다.

다음 URL에 각OS별 설치 방법에 따라 설치를 합니다.

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html

 

최신 버전의 AWS CLI 설치 또는 업데이트 - AWS Command Line Interface

이전 버전에서 업데이트하는 경우 unzip 명령을 실행하면 기존 파일을 덮어쓸지 묻는 메시지가 표시됩니다. 스크립트 자동화와 같은 경우에 이러한 프롬프트를 건너뛰려면 unzip에 대한 -u 업데이

docs.aws.amazon.com

 

2. 버킷 생성

AWS 콘솔에 로그인해서 S3 서비스에서 버킷을 만들어 줍니다. (기존 버킷을 사용해도 됨)

 

저는 다음과 같이 버킷을 생성하였습니다.

  • codegear-slider-bucket

 

다음과 같이 폴더를 2개 생성합니다.

  • images : 이미지 업로드용 폴더
  • resized-images : 썸네일 자동 생성 이미지 저장용 폴더

 

3. IAM 역할(Role) 생성

AWS 콘솔의 IAM으로 이동.

액세스 관리 - 역할(Role) 메뉴로 이동하여 "역할 만들기"를 클릭.

  • Role Name : S3_Image_Resize

권한 정책에는 다음 3가지를 추가합니다.

  • AmazonS3FullAccess (S3 Access 권한)
  • AWSLambdaBasicExecutionRole (Clowd Watch 로그 작성 권한)
  • AWSLambda_FullAccess (Lambda Access 권한)

 

4. 리사이즈용 프로그램 개발(Python)

로컬환경에서 이미지 리사이즈용 파이썬 프로젝트를 생성합니다.

lambda-s3-python 폴더를 생성하고 생성된 폴더로 이동합니다.

  • lambda_function.py로 파이썬 소스 파일을 생성합니다.

다음과 같이 코드를 생성합니다.

import boto3
import os
import sys
import uuid
from urllib.parse import unquote_plus
from PIL import Image
import PIL.Image

s3_client = boto3.client('s3')

def resize_image(image_path, resized_path):
  base_width = 300
  with Image.open(image_path) as image:
    w_percent = (base_width/float(image.size[0]))
    h_size = int((float(image.size[1])*float(w_percent)))
    image = image.resize((base_width,h_size), Image.ANTIALIAS)
    image.save(resized_path)

def lambda_handler(event, context):
  for record in event['Records']:
    bucket = record['s3']['bucket']['name']
    key = unquote_plus(record['s3']['object']['key'])
    tmpkey = key.replace('/', '')
    download_path = '/tmp/{}{}'.format(uuid.uuid4(), tmpkey)
    upload_path = '/tmp/resized-{}'.format(tmpkey)
    s3_client.download_file(bucket, key, download_path)
    resize_image(download_path, upload_path)
    s3_client.upload_file(upload_path, '{}'.format(bucket), 'resized-{}'.format(key))

pillow 파이썬 라이브러리를 package 폴더에 설치합니다.

pip install --target ./package pillow

template.yaml 파일을 루트폴더에 생성합니다.

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  CreateThumbnail:
    Type: AWS::Serverless::Function
    Properties:
      Handler: lambda_function.lambda_handler
      Runtime: python3.9
      Timeout: 10
      Policies: AWSLambdaExecute
      Events:
        CreateThumbnailEvent:
          Type: S3
          Properties:
            Bucket: !Ref SrcBucket
            Events: s3:ObjectCreated:*

  SrcBucket:
    Type: AWS::S3::Bucket

requirements.txt 파일을 루트폴더에 생성합니다.

Pillow == 9.2.0

 

5. 프로젝트 빌드

다음 명령어로 배포용 패키지를 빌드 합니다.

sam build --use-container

 

6. 배포

서버에 람다 함수를 배포합니다.

sam deploy --guided

 

 

7. S3 트리거 생성

AWS의 Lambda 서비스로 이동.

생성된 Lambda 함수를 클릭 후 함수명 클릭.

함수 개요에서 "트리거 추가"를 클릭합니다.

트리거 구성 아래의 소스 선택에 "S3"를 입력한 후 나타나는 S3를 선택합니다.

버킷을 선택하고, 접두어에는 버킷의 폴더명을, 체크박스를 체크하고 추가를 선택합니다.

아래와 같이 트리거가 추가 된걸 볼 수 있습니다.

8. 테스트

버킷의 images 폴더에 이미지를 업로드 합니다.

resized-images 폴더에 아래와 같이 이미지가 생성된것 볼 수 있습니다.

이미지를 다운받아 속성을 보면 크기가 "300 X 168 픽셀"로 만들어졌음을 볼 수 있습니다.

 

이상으로 AWS의 람다 기능을 이용해서 S3에 업로드된 이미지의 썸네일을 자동으로 만들어 보았습니다.

반응형
반응형

이 글은 NestJS 프로젝트에서 OpenAI의 API를 이용하는 방법에 대해 설명합니다.

 

다음은 이 글의 유튜브 강의 입니다.

https://youtu.be/2DRxtCwjFtE

순서

- OpenAI API Key 생성

- Nestjs 프로젝트 생성

- OpenAI 패키지 설치

- 프로그램 개발

- 테스트

 

OpenAI API 키 생성하기

- OpenAI 사이트에서 회원 가입을 합니다.

https://platform.openai.com/

 

OpenAI API

An API for accessing new AI models developed by OpenAI

platform.openai.com

- 우측 상단의 계정 아이콘을 클릭하고, 메뉴에서 View API Key를 선택합니다.

- "+ Create new Secret key"를 클릭하여 새로운 키를 생성합니다.

- API 사용법은 사이트 상단의 "API Reference" 메뉴에 자세히 나와 있으니 참고하시기 바랍니다.

https://platform.openai.com/docs/api-reference/introduction

 

OpenAI API

An API for accessing new AI models developed by OpenAI

platform.openai.com

 

NestJS 프로젝트 생성

- 아래와 같이 프로젝트를 생성합니다.

nest new 프로젝트명

- Editor에서 프로젝트 열기를 하고 프로젝트를 선택합니다.

 

OpenAI 패키지 설치

Nestjs에서 OpenAI API를 사용하기 위해서는 "openai" 패키지를 설치해야합니다.

- 아래와 같이 패키지를 설치합니다.

npm install openai

 

프로그램 개발

app.service.ts를 다음과 같이 작성합니다.

- 아래와 같이 패키지를 import 하고 openai를 선언합니다.

import { Configuration, OpenAIApi } from "openai";
const configuration = new Configuration({
    organization: "org-xxxxxxxxxxxxxxxxxxxxxxxxxxx",
    apiKey: "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxx",
});
const openai = new OpenAIApi(configuration);

- getHello()를 아래와 같이 작성합니다.

async getHello() {
    const response = await openai.createCompletion({
      model: "text-davinci-003",
      prompt: ""나는 인공지능 AI Chatbot이야. 질문을 하면 내가 답변을 해줄께. 만약 모른다면 \"모름\"이라고 할께.\n\nQ: 한국인의 기대 수명은 얼마야?\nA:",
      temperature: 0,
      max_tokens: 100,
      top_p: 1,
      frequency_penalty: 0.0,
      presence_penalty: 0.0,
      stop: ["\n"],
    });
    return { result: response.data.choices[0].text };
  }

- 여기선 model로 text-davinci-003을 사용하였습니다.

- 모델의 종류를 보시려면 다음과 같이 api를 호출하면 됩니다.

const response = await openai.listModels();
return { result: response.data };

- 주로 많이 사용하는 모델은 gpt-3.5-turbo, text-davinch-003 입니다.

테스트

- 브라우저에서 다음 주소를 입력합니다.

http://localhost:3000/

아래와 같이 결과가 나옵니다.

 

 

반응형

'AI & ML' 카테고리의 다른 글

개발자도 AI(인공지능)를 배워야 할까요?  (0) 2023.02.12
반응형

1. 딥러닝이 가져온 AI의 변화

ChatGPT가 쏘아올린 AI의 열기가 뜨겁습니다.

과거에도 AI에 대한 관심이 높아졌던 시기가 여러번 있었습니다. 하지만 이러한 관심은 독감처럼 잠시 유행하다 지나가 버리곤 했습니다. 사람들이 갖고 있는 AI에 대한 기대치가 너무 높았던 것 일까요? 번번히 AI는 그것에 못미치는 성과를 보여주며 실망을 안겨주었습니다.
그러던 중 "딥마인드"라는 영국의 AI 회사에서 개발한 "알파고"가 등장 하였습니다. 알파고는 "이세돌"이라는 바둑계의 젊은 영웅을 4:1로 무찌르면서 엄청난 이슈가 되었습니다. 알파고는 딥러닝이라는 새로운 알고리즘으로 무장하고 인간 바둑계의 무림을 평정한 것이었죠. 그러나 사람들은 바둑이라는 한정된 카테고리이기 때문에 가능할 것이라고 생각 했습니다. 아직까지도 AI가 사람처럼 생각하고 상황에 적절한 답을 주는 것은 어려웠기 때문이었습니다.
그러나 최근 등장한 ChatGPT는 달랐습니다.
이 서비스가 보여주는 답변은 놀라움 그 자체였습니다. 일상의 대화에서 부터 시작해 다양한 분야의 깊이 있는 질문에도 양질의 답변을 내놓습니다. 심지어 철학적인 질문에도 답변을 내어 놓습니다.
ChatGPT에게 "삶의 의미는 무엇일까?"라는 질문을 한번 해보았습니다.
ChatGPT가 내놓은 삶의 의미에 대한 답변
초기 AI는 Rule 기반의 프로그램이었습니다. 하지만 사람이 모든 Rule을 만들수 없다는 한계가 있습니다. 이를 극복하기 위해 사람의 뇌를 흉내낸 인공 신경망이 나오게 되고, 이제 컴퓨터가 스스로 학습을 할 수 있는 환경이 만들어지게 되었습니다.
거기에 하드웨어의 발달, GPU와 같은 고속 컴퓨팅 기술의 발전이 더해짐으로 인해 AI의 처리 속도가 빨라지게 되었습니다.
ChatGPT는 초거대 언어 모델의 AI 챗봇입니다. 이는 최신 딥러닝 기술과 고속 컴퓨팅, 그리고 거대 자본을 등에 업고 탄생한 것입니다. 이제 AI는 단순한 유행이 아닌 새로운 시대의 혁명이 될 수 있는 여건이 마련된 것입니다.
 

2. AI의 발전이 가져올 개발자 세계의 변화

이런 AI의 발전이 개발자의 삶에는 어떠한 영향을 미칠까요?
이미 프로그래밍 분야에서도 AI를 이용한 기술의 발전이 있었고 대중화 되기 시작했습니다.
ChatGPT에게도 아래와 같이 코드를 요청할 수 있습니다.
ChatGPT가 만든 코드
Github의 Copilot을 이용하면 내가 작성하고 있는 코드의 맥락을 이해하고 다음 코드를 자동으로 추천해줍니다.
(copilot은 월1만원의 유료서비스입니다) 개발자는 추천 코드가 맞다면 tab키를 눌러 코드를 완성할 수 있고, 다른 추천 코드를 요청할 수도 있습니다. 이런 서비스를 이용하게되면 개발자가 실제로 코딩하는 양이 획기적으로 줄어들게 됩니다.
아래는 Copilot이 코드를 추천해 주는 모습입니다.
Copilot의 코드 추천 기능
이 두가지 서비스(ChatGPT, Copilot) 모두 OpenAI에서 개발한 서비스입니다.
이렇게 개발이 자동화 되면 우리는 좀 더 고차원적인 일을 할 수 있게 됩니다. 대신 우리는 AI에게 일을 시킬수 있는 능력이 필요합니다. 당연히 일을 잘 시키기 위해서는 AI를 잘 이해하는 High Performer가 되어야겠죠.
결국 미래에는 AI를 잘 이해하고 사용하는 개발자가 살아 남을 수 밖에 없을 것입니다.
우리가 학자들처럼 AI의 모든 논문을 이해하고 연구할 필요는 없습니다. 새로운 이론과 기술이 나오고 약간의 시간이 지나면 대중화되는 단계가 오게 됩니다. 우리는 이걸 잘 이용할 수 있으면 되는 것입니다.
2010년경 모바일로 전환되는 시기에 기회가 왔던것 처럼, 어쩌면 지금이 AI로 전환하는 최적의 시기이고 개발자에게는 또다른 기회가 될 것입니다.

이런 기회를 놓치지 않으시길 바랍니다.

반응형

'AI & ML' 카테고리의 다른 글

NestJS에서 ChatGPT API 사용하기  (0) 2023.04.29
반응형

당신은 다른 사람의 성공에 기여한 적 있는가?

마이크로소프트 글로벌인플루언서팀 리전매니저로 일하고 있는 이소영씨가 쓴 책.
애플, 구글, 아마존등이 엄청난 성과를 이어가는 10년이 넘는 세월 동안 마이크로소프트는 오랜 침체를 겪었습니다.
똑똑한 직원들을 뽑아 서로 총질을 시킨다는 그림이 유명해질 정도로 내부에서는 경쟁이치열했습니다.

3대 CEO로 인도 출신 사티아 나델라가 부임한 후 마이크로소프트는 새로운 전성기를 누리게 됩니다.
마이크로소프트의 변화는 내부에서 시작되어야 한다고 생각한 사티아는 직원 평가에 있어서 다음과 같은 변화를 주었습니다.

 

"나는 다른 사람의 성공에 어떻게 기여 했나?"라는 평가 항목이 새롭게 생긴것입니다.
이전까지는 개인의 성장만이 관심사였다고 한다면, 이제는 내가 다른 사람의 성공을 위해 어떤 기여를 했는가도 중요한 관심이 된것이죠.
이 질문은 서로를 경쟁의 관계에서 파트너십의 관계로 이끌게 되었고, 마이크로소프트 변화에 큰 역할을 했다는 평가입니다.

 

다음은 마이크로소프트의 커리어 관리를 위한 트레이닝 중 하나입니다.
3시간이 넘는 트레이닝의 대부분이 질문과 오픈 답변으로 이루어진다고 합니다. 
하나하나가 깊이 있는 성찰을 끌어내는 질문들이니 천천히 생각해보시면 좋을것 같습니다. 
  1. Your big why(일의 목적): 지금 하고 있는 일을 왜 하고 있나요?
  2. Ideal professional self(이상적인 모습): 자신의 어떤 모습을 보고 싶은가요?
  3. Top strengths(자신의 장점): 당신이 가장 잘하는 것은 무엇인가요?
  4. Desired strengths(미래 비전): 미래에 무엇을 더 잘하기를 원하나요?
  5. Career goals(커리어 목표): 짧은 혹은 긴 기간 동안 성취하고 싶은 것은 무엇인가요?
  6. Current job and role(현재의 업무): 지금 맡은 업무를 위해 무엇을 하고 있나요?
  7. Core values(핵심 가치): 절대 양보할 수 없는 가치는 무엇인가요?
  8. Role modles(롤모델): 가장 선망하는 사람은 누구인가요?
  9. Contributions(기여 부분): 당신이 기여할 수 있는 것은 무엇인가요?
  10. Limits and boundaries(한계와 경계): 당신이 하고 싶지 않은 것은 무엇인가요?
 
이 책은 이러한 마이크로소프트의 변화와 그 변화의 중심에는 좋은 파트너십이 반드시 필요하다는 작가의 이야기들이 담겨 있습니다.
그리고, 여러 인플루언서들의 사례를 통해 우리 생활속에서 파트너십이 갖는 가치에 대해 설명하고 있습니다.
 
당신은 어떤 관계들을 맺고 있나요?
이런 질문에 대해 다시 생각해 볼수 있게 하는 책이었습니다.
반응형
반응형

이토록 평범한 미래

오랜만에 소설책을 한권 읽었다. SNS에서 너무나도 많이 추천되고 있는 김연수 작가의 "이토록 평범한 미래".

 

김연수 작가의 8개 단편집을 묶은 소설집이다.
 
작가 특유의 느낌이 좋은 글이다. 약간 우울하기도 하지만 따스한 온기를 느낄 수 있다.
8개의 단편중 첫번째 작품의 제목이 "이토록 평범한 미래"이다.
그해 여름 자살을 꿈꾸는 지민, 그녀의 엄마는 작가였지만 일찍 세상을 떠났다.
유일한 작품의 제목은 "재와 먼지".
 
이 책은 "1972년 10월이 시간의 끝이다"라는 단 한문장 때문에 유신정권에 의해 출판 금지를 겪게 된다.
1972년 10월은 박정희 대통령에 의해 국회가 해산되고 헌법의 효력이 정지되는 유신이 발표된 때였던 것이다.
책의 내용은 동반자살을 한 연인이 죽지않고 미래에서 과거로 진행되는 새로운 인생을 살게된다는 내용이다.
처음 만났던 순간 그토록 설레고 기쁜 마음의 순간으로... 그리고 그 시간 후 다시 정상적인 시간의 흐름으로 세번째 삶을 살게 된다.
우리는 과거의 아름다웠던 기억들을 대부분 잊고 살아간다. 그 순간의 설레이고 소중한 감정들을 망각한채...
 
김연수 작가의 아름다운 표현들도 책을 읽는 즐거움을 더해준다.
  • 군락을 이룬 황하 코스모스가 일제히 한쪽으로 몸을 수그렸고...
  • 울음의 주도권은 울음이 쥐고 있었다.

 

작가는 후기에서 어떤 글을 쓰고 싶었냐는 질문에 다음과 같이 답한다.
메리 올리버는 "골든 로드"라는 시에서 "빛으로 가득 찬 이 몸들보다 나은 곳이 있을까?"라고 썼다.
이 경이로운 문장 이전에 무슨 일이 있었는지 나는 잘 알게 됐다. 직전의 시구는 다음과 같다.
"우리의 삶이라는 힘든 노동은 / 어두운 시간들로 가득하지 않아?"
'어두운 시간'이 '빛으로 가득찬 이 몸'을 만든다.
지금 내가 쓰고 싶은 이야기도 이런 것이다. 그리고 이 이야기들은 언제가 우리의 삶이 될 것이다.

 

이 작품에서는 쓸쓸함과 아련함이 느껴진다.
사랑에 대한 이야기들, 어쩌면 다른 말로는 쓸쓸함이라고 표현할 수 있지 않을까?
누구나 마음 한편에 품고 사는...
반응형

+ Recent posts