프로그래밍(Basic)

    Nest - Swagger에서 변수 optional하게 처리해야 할 때

    Controller 부분에서 아래와 같이 함수를 짜면 잘 보이지만 swagger에서는 잘 잡히지 않는 경우가 있습니다. @Query('쿼리파라미터1') 쿼리파라미터1?: string, @Query('쿼리파라미터2') 쿼리파라미터2?: string, @Query('쿼리파라미터3') 쿼리파라미터3?: string, 위와 같이 optional 하게 주려고 해도 스웨거 상에서 필수값으로 지정 되버리더라구요. 해결 방법은 아래 깃허브 링크를 클릭하면 찾을 수 있습니다. Please Add `optional: boolean` to @Query route param decorator · Issue #2169 · nestjs/nest I'm submitting a... [x] Feature request Current..

    [바미] SSR과 CSR

    브라우저 렌더링 먼저 브라우저 랜더링이란 브라우저가 서버로부터 요청해 받은 내용을 브라우저 화면에 표시해주는 작업을 말합니다. 브라우저가 서버로부터 HTML, CSS, JS 문서를 전달받아 브라우저 엔진이 각 문서를 해석해 브라우저 화면을 그려주는 것이죠. 예를 들어, 아무 브라우저에 접속해서 주소창에 https://www.naver.com/ 을 입력한다면 브라우저는 네이버 서버로부터 네이버 웹사이트에 대한 정보를 받아 브라우저 화면에 네이버 홈페이지를 그려 주게 되는 것이죠. 그리고 이러한 브라우저 렌더링은 크게 ' 서버 사이드 렌더링'과 ' 클라이언트 사이드 렌더링' 방식으로 나누어 지죠. 서버 사이드 렌더링 서버 사이드 렌더링은 클라이언트(브라우저)가 서버에 매번 데이터를 요청하여 서버에서 처리하는..

    Node.js 동작 원리

    Node.JS? JavaScript를 브라우저 외부에서 실행하는 런타임입니다. Node.js는 싱글 스레드, 논블로킹 모델을 사용합니다. 이 모델은 비동기 I/O 작업을 통해 여러 요청을 동시에 처리하며, 클러스터링을 통해 확장성을 갖추고 있죠. 싱글스레드? 프로세스 내에서 하나의 스레드가 하나의 요청만을 수행합니다. 한 번에 여러 요청을 수행할 수 없는 것이죠 그래서 싱글 스레드는 블로킹 모델이라고 합니다. 반면 멀티스레드는 스레드 풀에서 실행의 요청만큼 스레드를 매칭 하여 작업을 수행합니다. NodeJS 는 완전한 싱글 스레드인가? NodeJS는 싱글 스레드이지만 완전한 싱글 스레드를 기반으로 동작하지는 않습니다. 무슨 말일까요? 일부 블로킹 작업들은 libuv의 스레드 풀에서 수행되기 때문이죠. 이..

    Go - GC에 대해 알아봅시다.

    GC란 가비지 컬렉션(Garbage Collection, GC)은 프로그래밍 언어가 자동으로 메모리 관리를 수행하는 메커니즘을 말합니다. 프로그램이 실행되는 동안 동적으로 할당된 메모리 중에서 더 이상 사용되지 않는 부분을 탐지하고 자동으로 해제함으로써 메모리 누수를 방지합니다. Go 언어도 가비지 컬렉션을 지원하며, 이를 통해 개발자는 명시적인 메모리 관리에 대한 부담을 덜 수 있습니다. 메모리 누수는 프로그램이 메모리를 계속해서 사용하지만 더 이상 필요하지 않은 메모리 블록이 해제되지 않는 상황을 의미합니다. Go 언어의 GC 작동 원리 가비지 컬렉션의 주요 원리는 더 이상 사용되지 않는 메모리를 식별하고 회수하는 것입니다. 이를 위해 가비지 컬렉터는 프로그램 내의 모든 객체 간의 참조 관계를 추적하..

    defer와 GC의 상관관계

    안녕하세요. 최근 질문 중에 "Go에서는 defer가 있는데 왜 GC를 사용해야 할까요?"라는 질문이 있었어요. defer와 GC는 하는 역할이 서로 다르기 때문에 '이건 무슨 내용의 질문이지?'하며 한 동안 벙쪄서 아무 말도 하지 못했죠. 그 후 그 질문에 대한 답변을 해주기 위해 공부했던 것들을 정리 해봅니다. 역시 Go에서의 defer와 가비지 컬렉터(GC)는 서로 다른 개념이였어요. 즉, 그들 간에 직접적인 관련은 없었죠. Go를 사용해보신 분들이라면 defer는 함수 내에서 특정 코드를 지연 실행시키는 데 사용되는 기능이며, 주로 리소스 정리나 오류 처리에 유용하고, 가비지 컬렉터는 메모리 관리를 자동으로 처리하여 더 이상 사용되지 않는 객체를 탐지하고 해제하여 메모리 누수를 방지해주는 도구라는..

    Go 1.20 릴리즈 요약

    1.19 이후 6개월 만의 릴리즈. 하위호환 정책으로 기존 프로그램 컴파일/실행은 문제 없음 언어에 4가지 변화 slice를 array로 변환 가능 unsafe 패키지에 SliceData, String, StringData 함수 추가 구조체의 필드값이 정의에 나타난 순서대로 하나씩 비교되도록 하고, 첫번째 미스매치에서 중단되도록 정의됨. 비슷하게 배결 값도 하나씩 인덱스 순으로 비교 Comparable 타입들이 타입 인자가 strictly comparable 하지 않은 경우에도 comparable 조건을 충족 가능 GC 데이터 구조 개선으로 메모리 오버헤드가 줄어들고 전체 CPU 성능 최대 2% 향상 그외 툴체인, 런타임, 라이브러리 구현등이 개선

    Go 1.19 릴리즈

    오늘 Go 팀은 다운로드 페이지 를 방문하여 다운로드 받을 수 있는 Go 1.19를 출시하게 된 것을 기쁘게 생각합니다 . Go 1.19는 올해 초 Go 1.18 릴리스 를 개선하였습니다. Go 1.19의 제네릭 개발은 커뮤니티에서 보고한 미묘한 문제와 코너 케이스를 해결하는 데 집중했으며 중요한 성능 향상(일부 제네릭 프로그램의 경우 최대 20%)을 제공했습니다. 문서 주석은 이제 링크, 목록 및 더 명확한 제목 구문을 지원합니다. 이 변경 사항은 특히 큰 API가 포함된 패키지에서 사용자가 더 명확하고 탐색하기 쉬운 문서 주석을 작성하는 데 도움이 됩니다. 이 변경 사항의 일부로 gofmt이 이제 문서 주석의 형식을 다시 지정하여 이러한 기능을 사용할 때 표준 형식을 적용합니다. 자세한 내용은 "Go..

    [바미] WebSocket과 Socket.io차이는 무엇일까?

    들어가기전에.. Socket.io와 WebSocket 모두 실시간 양방향 통신을 가능하게 하는 기술인데요. 지금 다니는 회사에서는 Socket.io를 주로 사용하고 있어요. 처음 Socket.io를 공부할 때 WebSocket에 대해 먼저 공부했고, 그 당시에는 Socket.io를 사용하기 위해 공부할 때는 단순히 'room'의 개념 여부로만 알고 있었어요. 하지만 그 외에도 차이가 존재하는 것을 발견하여 리마인드 할 겸 정리해보려해요. 프로토콜의 차이점 Websocket은 TCP 소켓을 사용한 HTTP와 독립적인 프로토콜로, 양방향 통신을 제공해요. 브라우저에서 WebSocket을 지원하는 경우, 서버와의 연결을 유지한 상태로 언제든지 데이터를 주고받을 수 있죠. 반면에 Socket.io는 WebSoc..

    [바미] Pattern matching algorithms - Rabin-Karp 알고리즘 구현하기

    Rabin-Karp? Rabin-Karp 알고리즘은 문자열 매칭 알고리즘 중 하나로, 주어진 문자열에서 패턴 문자열을 찾는데 사용되는데 문자열을 해시값으로 변환하여 패턴 문자열의 해시값과 일치하는 부분을 찾아내는 방법을 사용해요. 그럼 구현 해볼까요? 코드 구현 function RabinKarp(text, pattern) { const n = text.length; const m = pattern.length; const base = 26; // 사용할 기수 const prime = 101; // 사용할 소수 // 패턴 문자열과 전체 문자열의 해시값을 계산합니다. let patternHash = 0; let textHash = 0; let power = 1; for (let i = 0; i < m; i+..