Charming-Tech
인기 글
-
[회고] 인프랩을 퇴사하며.
[회고] 인프랩을 퇴사하며.
2022.07.29인프랩을 퇴사하며 혼자만의 생각을 주저리주저리 적어보려 합니다. 그냥 생각나는 것들만, 기억하고 싶은 것들만 적혀있을 확률이 굉장히 큽니다. 쓰다보니 꽤나 긴 글이 되었습니다. 간단하게 요약하자면 인프랩의 장점은 성장할 수 있는 회사라는 것이고 단점은 술 안주로 상사 욕을 할게 없다는 것입니다. 2022년 첫 회고로 퇴사 회고를 쓰는 저를 보며 마음껏 비웃어주시길 바랍니다. 인프랩 면접 저는 최초로 인프랩에서 FE, BE 면접을 둘 다 본 사람입니다. 그 이야기를 잠깐 해드리자면.. 1차 기술 면접을 보러 면접장 안내를 받아서 기다리는 중 면접관 세분이 들어오셨습니다. 다들 너무 인상이 좋더군요. 하하호호 웃으면서 면접 전 아이스 브레이킹 시간을 보내는 중 뭔가 삐그덕 거리기 시작했습니다. 면접관 : 구.. -
Kotest를 활용해 Spring Boot에서 테스트코드 작성하기
Kotest를 활용해 Spring Boot에서 테스트코드 작성하기
2023.01.29Kotlin + Spring Boot 프로젝트에서 테스트코드를 Junit으로 작성하기는 쉽지 않습니다. Kotlin 컨벤션을 무시하고 Annotation 떡칠한 채 테스트코드를 작성한다면 분노의 찬 Jetbrains IntelliJ가 갑자기 컴파일을 하지 않을 수도 있습니다. 그래서 태생부터 Kotlin을 위해 개발된 테스트 프레임워크로 Kotlin 최신 문법을 발 빠르게 지원하고 있는 Kotest와 함께 테스트코드를 작성한다면 유지보수측면에서도 훨씬 더 효과적일 것입니다. 테스트 준비 Kotest와 Spring Boot Test를 사용하기 위해 의존성을 아래와 같이 추가합니다. (아래에 H2 DB를 이용해 테스트를 수행할 예정으로 h2 의존성도 추가합니다.) testImplementation("com... -
[Kotlin] Scope 함수 (let, run, with, apply, also)
[Kotlin] Scope 함수 (let, run, with, apply, also)
2022.03.27Scope 함수 코틀린 표준 라이브러리는 객체의 컨텍스트 내에서 코드 블럭(익명 함수)을 실행하기 위한 목적을 가진 여러가지 함수를 제공합니다. 이런 함수들은 람다식으로 호출 할 수 있고, 이는 임시로 범위(scope)를 형성합니다. 해당 범위 내에서는 객체의 이름이 없어도 객체에 접근할 수 있습니다. 이러한 함수를 Scope funtions라고 합니다. 스코프 함수의 종류는 아래와 같습니다. let run with apply also 기본적으로, 이 함수들은 동일한 역할을 수행합니다. 다른점이 있다면, scope 내에서 객체를 어떤 방식으로 호출하는지, 리턴 값을 어떻게 처리하는지입니다. 아래는 Person class가 있을 때 scope function의 사용법입니다. Person.kt data cl.. -
[node.js] DI(의존성 주입) 구현하기
[node.js] DI(의존성 주입) 구현하기
2021.08.20DI (Dependency Injection) 의존성 주입(DI)는 잘 알려진 기술이다. IoC 컨테이너를 이용한 DI는 여러 모듈의 확장성과 독립성에 큰 도움을 준다. 특히 Spring에서 Java Bean을 이용하여 DI를 구현하는 것이 국내에서 가장 유명하다고 생각한다. 하지만 Node.js에서 DI는 그렇게 활발하게 쓰이고 있지 않는 것 같다. 왜냐하면 require로 모듈을 바로 불러오면 되기 때문에 굳이 필요성을 못 느끼기 때문이다. 하지만 이번에 공부를 하면서 node에서도 DI를 해야 하는 이유를 알게 되어서 예제 코드와 함께 설명하고자 한다. DI와 테스트 코드 의존성 주입은 하나의 패턴이다. 만약 의존되는 클래스를 매개변수로 전달해준다면, 모듈 안에서 클래스를 불러오거나 새로 만드는 것.. -
[node.js] 견고한 node.js 프로젝트 설계하기 (번역)
[node.js] 견고한 node.js 프로젝트 설계하기 (번역)
2021.08.09본 포스트는 Sam Quinn의 “Bulletproof node.js project architecture” 글을 번역한 것입니다. 혼자 보기 너무 아까운 글이기에 번역하여 공유합니다. Introduction Express.js는 node.js REST API를 만드는데 좋은 프레임워크지만, 어떻게 node.js 프로젝트 구조를 잡아야 할지 알려주지 않습니다. 우습게 들릴 수도 있지만, 이건 매우 큰 문제입니다. 올바른 node.js 프로젝트 구조는 코드의 중복을 피해 주고 안정성을 높여주며, 당신의 서비스를 확장하는데 도움이 될 것입니다. 이 포스트는 다년간의 부족했던 설계와 나쁜 패턴, 그리고 수없이 많은 코드 리팩터링 경험을 통해 쓰인 하나의 리서치입니다. 목차 폴더 구조 3 계층 설계 (3 Lay.. -
[javascript] 콜스택/메모리힙 구조, 데이터 저장/참조 원리
[javascript] 콜스택/메모리힙 구조, 데이터 저장/참조 원리
2021.08.27콜 스택, 메모리 힙이란? 자바스크립트 엔진은 Memory Heap 과 Call Stack 으로 구성되어 있습니다. 가장 유명한 것이 구글의 V8 Engine입니다. 자바스크립트는 단일 스레드 (sigle thread) 프로그래밍 언어인데, 이 의미는 Call Stack이 하나 라는 이야기입니다. 즉 멀티가 되지 않고, 하나씩 하나씩 처리한다는 의미입니다. 콜 스택(Call Stack) 원시 타입(숫자 등) 데이터가 저장된다. 실행 콘텍스트(Execution Context)를 통해 1) 변수 식별자(이름) 저장, 2) 스코프 체인 및 this 관리, 3) 코드 실행 순서 관리 등을 수행. *실행 컨텍스트의 상세 구조 및 원리는 이 글의 범위를 넘어가므로 다루지 않습니다. 메모리 힙(Memory Heap).. -
[NestJS] JWT 로그인 구현 예제 (bcrypt, passport, JWT, cookie)
[NestJS] JWT 로그인 구현 예제 (bcrypt, passport, JWT, cookie)
2021.12.29사용자 인증/인가는 모든 웹 애플리케이션에서 가장 중요한 부분입니다. 이전 포스트에서는 Node.js를 이용하여 JWT로그인을 구현했습니다. [node.js] JWT 구현 예제 Intro 웹 / 앱 개발을 하면 로그인 과정에서 반드시 만나게 되는 개념이 쿠키-세션이다. 최근 들어 IT 인프라 구성에는 많은 변화가 생겼다. 웹 기반의 서비스들은 웹과 앱을 함께 서비스하 charming-kyu.tistory.com 이번에는 NPM 라이브러리에서 가장 많이 사용되는 Passport를 이용하여 NestJS 애플리케이션에 로그인을 구현해보겠습니다. 또한 해싱(Hashing)을 통해 사용자를 등록하고 비밀번호를 안전하게 암호화하여 보호하겠습니다. User Entity 인증을 고려할 때 가장 먼저 해야 할 일은 사.. -
[Kotlin] Scope 함수 (let, run, with, apply, also)
[Kotlin] Scope 함수 (let, run, with, apply, also)
2022.03.27Scope 함수 코틀린 표준 라이브러리는 객체의 컨텍스트 내에서 코드 블럭(익명 함수)을 실행하기 위한 목적을 가진 여러가지 함수를 제공합니다. 이런 함수들은 람다식으로 호출 할 수 있고, 이는 임시로 범위(scope)를 형성합니다. 해당 범위 내에서는 객체의 이름이 없어도 객체에 접근할 수 있습니다. 이러한 함수를 Scope funtions라고 합니다. 스코프 함수의 종류는 아래와 같습니다. let run with apply also 기본적으로, 이 함수들은 동일한 역할을 수행합니다. 다른점이 있다면, scope 내에서 객체를 어떤 방식으로 호출하는지, 리턴 값을 어떻게 처리하는지입니다. 아래는 Person class가 있을 때 scope function의 사용법입니다. Person.kt data cl..
최신 글
-
[mysql] 미사용 인덱스 확인하기
[mysql] 미사용 인덱스 확인하기
2024.10.13performance_schema 설정MySQL에서는 performance_schema의 table_io_waits_summary_by_index_usage 테이블을 통해 인덱스의 사용 빈도를 모니터링할 수 있습니다. 이 테이블은 각 테이블의 각 인덱스에 대한 I/O 활동을 수집하며, 이를 통해 사용되지 않는 인덱스를 파악할 수 있습니다. 인덱스 I/O 활동을 확인하려면 먼저 performance_schema 기능이 활성화되어 있어야 합니다. MySQL 8.0에서는 기본적으로 활성화되어 있지만, 비활성화되어 있다면 MySQL 설정 파일에서 다음 설정을 추가해야 합니다.[mysqld]performance_schema=ONperformance_schema 옵션이 활성화된 이후부터 인덱스 사용량이 카운팅되기 .. -
Apache Kafka 기본 개념
Apache Kafka 기본 개념
2024.07.22Apache Kafka란 현재 카프카는 Apache Software Foundation에서 오픈 소스로 관리하는 분산 이벤트 스트리밍 플랫폼입니다. 2011년 링크드인에서는 수많은 사용자 활동 로그와 시스템 이벤트를 실시간으로 처리하는 과정에서 많은 어려움을 겪었습니다. 당시 링크드인 개발자(Jay Kreps, Neha Narkhede, Jun Rao)는 카프카를 개발하게 되었습니다. 참고로 'Kafka'라는 이름은 프란츠 카프카의 소설에서 영감을 받아 붙여진 이름입니다.당시 링크드인은 이벤트를 보내는 쪽(프로듀서)과 받는 쪽(컨슈머)이 각각 여러 개 존재했습니다. 각 프로듀서와 컨슈머가 서로 직접 연결되어야 했고 따라서 새로운 생산자나 소비자가 추가될 때마다 모든 기존 시스템과 새로 연결해야 해서 연결.. -
[kotlin] withTimeout 사용시 suspend/non-suspend 함수 동작 차이
[kotlin] withTimeout 사용시 suspend/non-suspend 함수 동작 차이
2024.07.14delay()코틀린의 delay 함수는 코루틴을 지연시키는 함수입니다. 이는 스레드를 차단하지 않고 코루틴이 일정 시간 동안 대기하도록 합니다.fun main() = runBlocking { println("Start") delay(1000L) println("End")}위 코드에서 delay(1000L)은 1초 동안 코루틴을 지연시키고, 그 이후에 "End"를 출력합니다.delay() 함수는 suspend 함수로, 내부적으로 코루틴을 일시 중단(pause)시키고, 지정된 시간이 경과한 후에 코루틴을 재개합니다. withTimeoutwithTimeout 함수는 주어진 시간 내에 완료되지 않는 작업을 취소하는 함수입니다. withTimeout 블록 내에서 작업이 지정된 시간 내에 완료되지 .. -
[코루틴] 병렬성(Parallelism)과 연속성(Concurrency) 예제
[코루틴] 병렬성(Parallelism)과 연속성(Concurrency) 예제
2023.08.28팀 내에서 코루틴 병렬처리와 관련하여 코드리뷰 중 팀원간 싱크가 맞지 않는 것 같아 정리한 글입니다. 연속성(Concurrency) 1번 suspend fun main() = coroutineScope { async { someService.callAPI1() }.await() async { someService.callAPI2() }.await() } 위 코드는 두 API 호출이 순차적으로 이루어집니다. 첫 번째 async 블록은 callAPI1()를 호출하고, 그 결과를 기다린 후, 두 번째 async 블록이 시작됩니다. 이 방식은 두 번째 API 호출이 첫 번째 API 호출의 결과에 의존적인 경우 또는 순차적 실행이 필요한 경우에 사용하기 적합합니다. 2번 suspend fun main() = co.. -
SpringBoot 모니터링 하기 (feat. Grafana, Prometheus)
SpringBoot 모니터링 하기 (feat. Grafana, Prometheus)
2023.03.06애플리케이션의 메트릭과 상태를 모니터링하는 것은 성능을 개선하고, 앱을 더 나은 방식으로 관리하고, 최적화되지 않은 동작을 발견하는 데 도움이 됩니다. 많은 마이크로서비스로 구성된 시스템을 유지 관리하려면 각 서비스를 모니터링하는 것이 중요합니다. 애플리케이션의 메트릭을 노출하는 Micrometer, 메트릭 데이터를 저장하는 Prometheus, 데이터를 그래프로 시각화하는 Grafana를 사용하여 Spring Boot 웹 애플리케이션을 로컬에서 모니터링하고자 합니다. Grafana를 사용하려면 먼저 Spring Actuator를 이용해 현재 애플리케이션의 상태를 HTTP API로 응답할 수 있게 설정합니다. Prometheus를 이용하여 Spring Actuator에서 제공하는 메트릭 데이터를 수집합니.. -
Kotest를 활용해 Spring Boot에서 테스트코드 작성하기
Kotest를 활용해 Spring Boot에서 테스트코드 작성하기
2023.01.29Kotlin + Spring Boot 프로젝트에서 테스트코드를 Junit으로 작성하기는 쉽지 않습니다. Kotlin 컨벤션을 무시하고 Annotation 떡칠한 채 테스트코드를 작성한다면 분노의 찬 Jetbrains IntelliJ가 갑자기 컴파일을 하지 않을 수도 있습니다. 그래서 태생부터 Kotlin을 위해 개발된 테스트 프레임워크로 Kotlin 최신 문법을 발 빠르게 지원하고 있는 Kotest와 함께 테스트코드를 작성한다면 유지보수측면에서도 훨씬 더 효과적일 것입니다. 테스트 준비 Kotest와 Spring Boot Test를 사용하기 위해 의존성을 아래와 같이 추가합니다. (아래에 H2 DB를 이용해 테스트를 수행할 예정으로 h2 의존성도 추가합니다.) testImplementation("com...