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..
최신 글
-
[코루틴] 병렬성(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... -
Kotlin 'by' 키워드의 역할 (feat. Composition)
Kotlin 'by' 키워드의 역할 (feat. Composition)
2023.01.21코틀린의 by 키워드는 Delegate Pattern을 쉽게 구현할 수 있도록 도와주는 키워드입니다. Delegate Pattern Delegate Pattern이란 객체의 메소드를 다른 객체(Helper Object)에 위임하여 처리하는 패턴입니다. 즉 어떤 기능을 자신이 수행하지 않고 다른 객체가 수행하도록 하는 패턴입니다. 특히 이 Delegate Pattern과 항상 붙어다니는 "상속 vs 조합" 이라는 단어입니다. 자식클래스에서 부모클래스의 요소를 사용할 때 상속(Ingeritance) 또는 조합(Composition)을 이용할 수 있습니다. 상속은 모든 요소를 물려받기 때문에 변수나 메소드 등을 다시 구현할 필요가 없어 편리하지만, 객체의 유연성이 떨어진다는 치명적인 단점이 있습니다. 만약 부.. -
SSH no matching host key type found. Their offer: ssh-rsa,ssh-dss 에러 해결 방법
SSH no matching host key type found. Their offer: ssh-rsa,ssh-dss 에러 해결 방법
2023.01.04ssh 접속 시도시 아래와 같은 에러를 발생시키면서 접근이 불가능합니다. $ ssh -i ./something.pem user@server.com Unable to negotiate with server.com port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss 원인은 MacOS를 Ventua 13.0로 업데이트하면서 발생되었습니다. 하지만 근본적인 원인은 ssh 접속에 cbc 알고리즘을 사용하였기 때문입니다. 아래 링크를 통해 cbc 알고리즘은 2008년 공격에 취약한 것으로 판명되었음을 확인할 수 있습니다. CERT Coordination Center The Vulnerability Notes Database provides .. -
Hikari Connection Pool 확인
Hikari Connection Pool 확인
2022.12.09SpringBoot는 사용이 보편화됨에 따라 Embedded Tomcat을 사용하고 있습니다. 따라서 Application 레벨에서 Datasource 관련 설정을 모두 할 수 있습니다. Hikari CP는 SpringBoot 2.0부터 기본 JDBC connection pool 의존성으로 도입되었습니다. 또한 HikariCP는 다른 DBCP보다 성능이 높다고 알려져있습니다. HikariCP 설정 application.yml spring: datasource: hikari: connectionTimeout : 30000 maximumPoolSize : 10 maxLifetime : 1800000 poolName : HikariCP readOnly : false connectionTestQuery : SE..