개발
-
세이노 GPT 개발 후기개발/인공지능 2023. 11. 12. 11:27
최근 OpenAI 에서 제공하는 자기만의 GPT를 만들 수 있는 기능을 활용해서 세이노 GPT 를 만들었다. 학습자료는 세이노 PDF 를 사용했다. 처음에는 세이노 PDF 를 통째로 넣었는데 용량이 너무 커서 ChatGPT 에서 읽는데만 시간이 오래 걸렸고 노이즈가 많아서 그런지 답변도 정확하지 않았다. 그래서 사진 파일을 제외하고 변호사, 의사 상대하는 법처럼 부자가 되는 방법과 관련 없는 내용에 대해서는 생략하고 필요한 부분만 남겨 파일 사일즈를 400kb 이하로 줄였다. 튜닝 작업을 조금 거치고 나니까 만족할만한 답변이 나오기 시작했다. 어조까지 츤데레 스타일로 맞추니까 실제 저자가 내게 조언을 해주는 느낌이 난다. Public 에 공개를 했으니 사용하고 싶으신 분은 아래 링크로 들어가서 사용할 수..
-
Javascript LRU Cache개발/nodejs 2023. 10. 11. 11:54
Javascript 언어에서는 메모리 애플리케이션 메모리 공간을 캐시처럼 사용할 수 있는 기능을 제공한다. Redis처럼 key - value 로 사용하면 되는 줄 알았는데 사용방법이 약간 다르다. 설명에 앞서 아래 코드의 결과 값을 예상해보자 import LRU from 'lru-cache'; const cache = new LRU({ max: 3 }); const props = new Set(); cache.set(1, props); props.add('1'); props.add('2'); const result1 = cache.get(1); console.log('Result 1:', result1); set 함수가 실행된 후 props 에 ‘1’, ‘2’가 들어갔으므로 결과값이 빈 집합으로 예상할..
-
spring batch개발/spring 2023. 6. 30. 19:15
spring batch Spring batch 는 대량의 데이터를 처리하기 위한 배치 처리 프레임워크. ItemReader, ItemWriter, ItemProcessor, Execution Context 와 같은 스프링부트의 구성요소를 이용해서 작업을 쉽게 처리할 수 있다. 처음에는 복잡해보이지만 사용해보면 간편하다. ItemReader 데이터 소스에서 데이터를 읽어오는 역할을 함. 데이터베이스나 파일, 메시지 큐등에서 다양한 데이터 소스를 읽어올 수 있으며 한번에 하나씩 또는 청크 단위로 읽어오는 것이 가능하다. 예제 코드에서는 final 로 선언된 배열의 데이터를 순차적으로 읽어오도록 작성했다. 더이상 읽을 값이 없는 경우 null을 리턴해서 reader를 종료한다. public class Cust..
-
Session, Cookie, CSRF개발 2023. 6. 3. 21:42
Session, Cookie Session 서버가 사용자 상태를 저장하는 방법. 주로 웹사이트에서 로그인 정보를 유지하는 용도로 사용한다. 무신사 같은 쇼핑몰 사이트에서 로그인 하지 않은 상태로도 장바구니에 상품을 담을 수 있는데 이때 사용하는 것도 세션이다. 세션은 다양한 기술을 통해서 구현. 적절한 기술을 사용한다. 스프링이나 장고같은 웹프레임워크에 따라서 알아서 구현해주는 부분이 많다. 세션 형성 과정 클라 → 서버 요청 서버는 요청이 첫요청인지 확인 세션에서 클라이언트가 보낸 세션 id 가 정보에 존재하는지 확인 보내지 않았다면 최초 요청으로 판단 보냈으나 데이터가 없다면 만료된 것으로 판단하고 최초 사용자로 처리 최초 사용자라면 세션에 저장공간 추가 클라이언트에게 세션 id 발급 Cookie 서..
-
python - async def, asyncio개발 2023. 6. 3. 16:26
async def 비동기 함수를 정의하기 위한 파이썬 문법. async def 키워드를 사용하여 정의된 함수는 비동기적으로 실행될 수 있고 내부의 비동기 함수도 병렬로 실행할 수 있다 async def convert_int(a: str): await asyncio.sleep(1) return int(a) async def calc_add(str_a: str, str_b: str): now = datetime.now() int_a, int_b = await asyncio.gather(convert_int(str_a), convert_int(str_b)) print(datetime.now() - now) # 0:00:01.001219 return int_a + int_b loop = asyncio.get_e..
-
Redis는 왜 다른 DB보다 빠를까개발 2023. 3. 16. 16:20
Redis 는 크게 4가지 측면에서 MySQL 같은 전통 RDB와 차이점이 있다. In Memory Storage 다른 데이터베이스는 disk 에다가 데이터를 저장하고 읽는 반면 레디스는 데이터를 메모리에 저장한다. 디스크에 비해 메모리는 입출력 속도가 훨씬 빠르다. Data Structure 레디스는 string, hash, list, set, sorted set 으로 작업하기 위해 만들어졌다. 이 데이터 구조는 성능에 효율적이고 레디스가 읽고, 쓰고, 조회하는 것을 빠르게 한다. 그리고 자료 구조를 효율적으로 이용해서 레디스는 메모리 공간을 절약하고 동작에 시간 복잡도를 줄인다. 실제로 레디스는 리스트의 push/pop을 크기와 상관 없이 O(1) 시간에 처리할 수 있다. 그리고 레디스는 교집합이든 ..
-
single threaded vs multi threaded개발/기술 2023. 3. 16. 16:15
싱글 쓰레드 시스템은 쓰레드 하나로 시스템을 구성하는 방식이고 멀티 쓰레드 시스템은 두개 이상의 쓰레드를 이용해서 프로그램을 구성하는 것을 말한다. 멀티 코어가 대세인 하드웨어 환경이라면 쓰레드를 늘려서 시간당 작업량을 늘리는게 당연히 좋지 않을까 하는 생각이 들겠지만 구조마다 장/단점이 있다. Single Thread 특징 Simplicity: 쓰레드가 하나만 있기 때문에 간단한 아키텍처를 구항할 수 있다. 개발하고 배포하고 유지하기가 쉽다. 멀티 쓰레드 환경에서 발생할 수 있는 동시성 이슈 같은 것은 고민하지 않아도 된다. Limited Concurrency: 싱글 쓰레드 환경에서는 요청 하나당 한개만 처리할 수 있다. 동시에 처리할 수 없기 때문에 응답 속도도 느려지고 througput도 좋지 않다..
-
HTTP 2.0 주요사항개발/기술 2023. 3. 1. 19:36
Multiplexed Streams HTTP1 .0 에서는 요청을 보내기 위해선 반드시 이전 요청이 완료돼야했기 때문에 속도면에서 딜레이가 있었다. 그래서 HTTP 1.1에서는 하나의 TCP 안에 두개 이상의 HTTP 요청을 담아 속도를 높일 수 있는 Pipelining을 기술을 도입했다. 동시에 여러개의 요청을 보낼 수 있기 때문에 속도면에서 HTTP 1.0 에서 발생한 딜레이를 줄일 수 있다. 그러나 순서가 보장돼야하는 한계가 있었다. 서버는 TCP에서 요청을 받은 순서대로 응답해야하기 때문이다. 그래서 앞선 요청에 의해 뒤에 있는 요청이 딜레이 되는 문제가 발생한다. 이미지 세장을 받는 경우 가장 앞선 이미지 응답이 지연되면 두, 세번째 이미지도 지연이 발생하게 된다. 이 문제를 Head Of Li..