분류 전체보기
SpringBoot ResponseBodyAdvice 특정 응답 값 암호화하기
SpringBoot ResponseBodyAdvice 특정 응답 값 암호화하기
2022.09.25본 포스팅은 ResponseBodyAdvice를 이용하여 암호화된 응답값을 생성하는 예제입니다. 사실 HandlerInterceptor의 postHandler 같은 곳에서 응답값을 가공할 수 있을 듯하지만, 사실 인터셉터 단에서 응답 가공은 불가능합니다. 하지만 특정 API만 암호화된 값으로 응답을 가공하고 싶을 때가 있는데, 그럴때 사용하는 것이 ResponseBodyAdvice입니다. ResponseBodyAdvice @RestControllerAdvice class EncryptedResponseWrapper : ResponseBodyAdvice { override fun supports(returnType: MethodParameter, converterType: Class): Boolean { ..
Kotlin 리플렉션(Reflection)
Kotlin 리플렉션(Reflection)
2022.09.06리플렉션(Reflection)이란? 리플렉션은 말 그대로 '반사', '반영'의 의미를 가지고있습니다. 구체적인 클래스 타입을 알지 못하더라도 바이트코드를 이용해 해당 클래스의 메소드, 타입, 변수들을 참조하여 값을 찾을 수 있는 JAVA API입니다. 즉 컴파일 시점이 아닌 런타임에 동적으로 특정 클래스의 정보를 추출할 수 있고 변수를 변경하거나 메소드를 호출할 수 있는 프로그래밍 기법입니다. 코드를 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를 가져와서 실행해야 하는 경우 사용됩니다. intelliJ의 자동완성 기능, Lombok, Spring Container, Spring annotation 등에서 사용됩니다. 리플렉션은 아래와 같은 정보들을 가..
jdkman으로 java 버전 관리하기
jdkman으로 java 버전 관리하기
2022.08.16SDKMAN sdkman은 SDK를 버전을 병렬로 관리하기 위한 도구입니다. 대부분의 유닉스 기반 시스템에서 사용할 수 있습니다. sdkman을 이용하여 여러 Java 버전을 관리할 수 있는 방법에 대해 알아보겠습니다. Install $ curl -s "https://get.sdkman.io" | bash 설치가 완료되면 터미널에 아래 명령을 실행합니다. $ source "$HOME/.sdkman/bin/sdkman-init.sh" 마지막으로, 설치된 SDKMAN!의 버전을 확인하여 성공적으로 설치가 완료됐는지 확인합니다. $ sdk version SDKMAN 5.16.0 Uninstall sdkman이 설치된 경로는 ~/.sdkman 입니다. 간단하게 rm 명령으로 삭제가 가능합니다. $ rm -rf ..
무중단 배포 방식 (Rolling Update, Blue/Green, Canary)
무중단 배포 방식 (Rolling Update, Blue/Green, Canary)
2022.08.14무중단 배포 무중단 배포는 말그대로 중단하지 않고 배포를 진행하는 것을 의미합니다. 보통은 애플리케이션을 업데이트 한 뒤, 배포를 하게 될 경우 애플리케이션을 중단시키고 배포하게 됩니다. 이럴경우 사용자는 배포가 완료되는 시간 동안 애플리케이션 사용에 제한이 생기게 됩니다. 이렇게 서비스가 중단되는 시간을 다운타임(Downtime)이라고 하며, 이러한 다운타임을 없애고자 생긴것이 무중단 배포입니다. 무중단 배포를 하기 위해서는 두대 이상의 서버가 필수적으로 필요합니다. 실제로 서비스 중인 서버 한대와 새롭게 배포한 서버 한대를 사용하여 무중단 배포를 할 수 있습니다. 최근에는 서비스를 더 작게 만들고 더 자주 배포하는 방식으로 변화하고 있습니다. 그만큼 변경 사항이 생겼을 때 더 빠르게 반영할 수 있지만..
MSA에서 BFF(Backend for Frontend) 패턴
MSA에서 BFF(Backend for Frontend) 패턴
2022.08.10MSA (Micro Service Architecture) MSA는 큰 서비스를 잘게 쪼개어 개발/운영 하는 아키텍처입니다. 하나의 큰 서비스는 수십~수백개의 작은 서비스로 나뉘어집니다. 또한 PC뿐만 아니라 다양한 모바일 장치를 비롯해 다양한 클라이언트를 고려해야 합니다. 또한 데이터 처리를 위해 여러 API를 조합하거나 처리하는 과정이 필요합니다. 실제 프로덕트에서 MSA를 이용한 어플리케이션을 구축할 때 여러가지 문제에 직면하게 됩니다. 만약 여러 API를 클라이언트(FE)단에서 전부 호출하게 된다면 어떤 일이 발생할까요? 만약 이를 클라이언트에서 서비스를 직접 호출하는 형태라면 다음과 같은 문제가 발생할 수 있습니다. 각각의 서비스마다 인증/인가 등 공통된 로직을 구현해야하는 번거로움이 있습..
[회고] 인프랩을 퇴사하며.
[회고] 인프랩을 퇴사하며.
2022.07.29인프랩을 퇴사하며 혼자만의 생각을 주저리주저리 적어보려 합니다. 그냥 생각나는 것들만, 기억하고 싶은 것들만 적혀있을 확률이 굉장히 큽니다. 쓰다보니 꽤나 긴 글이 되었습니다. 간단하게 요약하자면 인프랩의 장점은 성장할 수 있는 회사라는 것이고 단점은 술 안주로 상사 욕을 할게 없다는 것입니다. 2022년 첫 회고로 퇴사 회고를 쓰는 저를 보며 마음껏 비웃어주시길 바랍니다. 인프랩 면접 저는 최초로 인프랩에서 FE, BE 면접을 둘 다 본 사람입니다. 그 이야기를 잠깐 해드리자면.. 1차 기술 면접을 보러 면접장 안내를 받아서 기다리는 중 면접관 세분이 들어오셨습니다. 다들 너무 인상이 좋더군요. 하하호호 웃으면서 면접 전 아이스 브레이킹 시간을 보내는 중 뭔가 삐그덕 거리기 시작했습니다. 면접관 : 구..
Clustered Index vs Non-Clustered Index
Clustered Index vs Non-Clustered Index
2022.07.01몇일전에 Clustered Index와 Non-Clustered Index에 대해 저에게 물어보신 분이 계셨습니다. 제 기억 속에는 Clustered Index는 Primary Index와 비슷한 어구인가? 라는 생각과 테이블 당 1개만 생성할 수 있는 뜻이지 않을까 라는 유추만할 수 있을 뿐 전혀 모르겠었습니다. 또한 Primary Index와 Clusterd Index의 명확한 차이점을 모르기도 했습니다. 그래서 제 기억 속에 오랫 동안 자리 잡기를 바라는 마음으로 정리합니다. 데이터베이스에서 테이블의 데이터 탐색 속도를 향상시켜주기 위해 인덱스라는 개념을 제공하고 있습니다. 인덱스는 컬럼 단위로 생성되며, 하나의 컬럼 혹은 여러개의 컬럼에 인덱스를 지정할 수 있습니다. 또한 모든 질의는 먼저 인덱..
[javascript] ES6 문법 활용 정리
[javascript] ES6 문법 활용 정리
2022.06.12최근 프로젝트를 수행하며, ES6 문법을 한번 정리하면 좋겠다는 생각이 들었습니다. 간단히 ES6 리마인드겸 실무에서 사용할 수 있을만한 내용들을 정리해보고자 합니다. 프로퍼티 추출 object에서 value를 가져오는 것은 어플리케이션에서 매우 일반적입니다. AS-IS const obj = { a: 1, b: 2, c: 3, d: 4, e: 5, }; const a = obj.a; const b = obj.b; const c = obj.c; const d = obj.d; const e = obj.e; const f = obj.a + obj.d; const g = obj.c + obj.e; TO-BE ES6의 구조분해를 사용하면 코드의 양이 줄게됩니다. const { a, b, c, d, e } = o..
[Docker] Debian, Alpine 이미지간 cp 동작 차이
[Docker] Debian, Alpine 이미지간 cp 동작 차이
2022.06.09개요 Docker 이미지는 Base 이미지에 따라 특성이 달라집니다. 가장 널리 쓰이는 Base 이미지 중 Alpine과 Debian(ubuntu) 이미지가 있습니다. 회사 프로젝트에서 시간대 관련 오류의 원인을 파악하는 과정에서 이들의 cp 동작에 큰 차이가 있음을 발견하였습니다. 이에 따라 DevOps 파트에서 아래와 같은 기술 블로그 글을 작성하였습니다. Alpine/Debian 기반 Docker 이미지 간 cp 명령 동작 차이 안녕하세요. 인프랩 DevOps Engineer 선비입니다! 오늘은 Docker를 다루며 발견하게 된 Alpine 기반 이미지의 cp 명령과 Debian 또는 Ubuntu 기반 이미지의 cp 명령의 동작 차이점을 소개해드리겠습니다. Docker tech.inflab.com ..
[NestJS] 테스트 피라미드를 위한 에러 처리 방법 (feat. 3 layer architecture)
[NestJS] 테스트 피라미드를 위한 에러 처리 방법 (feat. 3 layer architecture)
2022.05.29서론 업무 중 동료 분의 코드를 보고 제가 작성한 코드 리뷰 내용의 일부입니다. 물론 본문과 같이 상세하게 작성하지 못했습니다. 그래도 좋은 테스트 코드에 있어서 휘발성 코드 리뷰로 지나치기 아쉬웠기 때문에 블로그에서 조금 상세하게 이야기하고자 합니다. 이 글에서 언급한 리팩토링을 하더라도 기능적, 성능적으로 나아지는 부분은 거의 없습니다. 다만, 테스트 피라미드에 부합하기 위해 수행되는 리팩토링은 유지보수 비용 측면에서 많은 이득을 챙길 수 있습니다. 또한 일관되지 않은 코드가 프로덕션에 반영되었을 때 성장하는 팀에 합류한 신규입사자가 큰 혼란을 겪을 수 있습니다. 지금부터 NestJS로 작성된 API를 jest, supertest로 테스트 코드를 작성하며 많은 테스트를 써야하는 구조와 적은 테스트를 ..
[Kotlin] companion object, Java static 차이점
[Kotlin] companion object, Java static 차이점
2022.05.15이 글은 코틀린의 companion object와 Java의 static 키워드의 차이점에 대해 학습한 것을 정리하였습니다. object class 코틀린은 자바에 없는 독특한 싱글톤(Singleton) 선언 방법이 있습니다. 아래처럼 class 키워드 대신 object 키워드를 사용하면 됩니다. object Singleton { val name = "singleton" fun print() = println("hello") } fun main() { println(Singleton.name) // "singleton" Singleton.print() // "hello" val singleton = Singleton() // 에러! } object 키워드로 선언한 속성과 메소드는 static 키워드로 선..
[node.js] localhost https 적용 (SSL)
[node.js] localhost https 적용 (SSL)
2022.05.06서론 로컬에서 개발할 때 http://localhost:8000 과 같은 형태의 URL을 상용하게 됩니다. 하지만 소셜 로그인을 local에서 수행하고 싶을 때 벤더사마다 다른 보안 정책으로 https 프로토콜에서만 로그인이 가능하도록 막아놓는 경우가 있습니다. 이런 경우 개발을 끝낸 뒤 배포 후 테스트 서버에서 확인해야 하는 번거로움이 생기게 됩니다. 본 포스팅에서 간략히 TLS(SSL) 개념에 대해 정리하고 localhost에서 https 적용 방법에 대해 설명드리겠습니다. HTTP vs HTTPS Http는 Hyper Text Transfer Protocol의 약자로 네트워크를 통해 데이터를 전송하기 위한 프로토콜입니다. Https의 S는 TLS 또는 SSL을 사용하여 HTTP 요청 및 응답 을 암..