기술 면접관이 QPS를 물었을 때, 머리가 하얘졌다면 꼭 읽어야 할 글
Tech/Server2024. 11. 24. 17:28기술 면접관이 QPS를 물었을 때, 머리가 하얘졌다면 꼭 읽어야 할 글

프롤로그어느 날 기술 면접에서 "캐시 도입 이후 데이터베이스의 QPS는 얼마나 나왔나요?"라는 질문이 나왔다고 가정해 볼게요.만약 이 순간, "TPS랑 비슷한 것 같은데.."라며 유추해보지만 QPS가 정확히 무엇을 의미하는지, 캐시와 QPS 그리고 TPS가 어떤 관계가 있는지 바로 떠오르지 않는다면 당황스러운 상황이 될 수 있습니다. QPS(Query Per Second)와 TPS(Transaction Per Second)는 단순한 숫자가 아닙니다.이들은 시스템의 상태를 진단하고, 성능을 개선하며, 안정성을 확보하는 데 필요한 중요한 지표에요. 대규모 트래픽을 다룰 일이 없는 환경이라도, 이 지표를 이해하면 더 나은 시스템 설계와 효율적인 문제 해결 방법을 찾을 수 있죠. 이 글에서는 QPS와 TPS의 ..

리더가 MSA 전환을 하자고 했다. 그리고 처참히 실패했다.
Tech/Server2024. 10. 27. 17:32리더가 MSA 전환을 하자고 했다. 그리고 처참히 실패했다.

서론이 글은 리더, 경영진, 그리고 실무 개발자들을 대상으로 합니다. MSA 전환을 고려하거나 이미 추진 중인 조직의 이해관계자들이, 전환 과정에서 발생할 수 있는 문제와 그 해결 방안을 이해하는 데 도움이 되기를 기대합니다. 마이크로서비스 아키텍처(MSA)는 현재 많은 조직에서 주니어 개발자 채용 공고에도 우대사항으로 언급될 만큼 널리 채택되고 있는 아키텍처 패턴입니다. 그러나 MSA 전환은 단순한 기술 도입 이상의 도전으로, 조직 내 모든 구성원의 협력과 상당한 노력이 필요합니다. 기술적인 변화를 성공적으로 이루기 위해서는 단순히 시스템 구조를 변경하는 것만으로는 충분하지 않습니다. 조직의 문화, 비즈니스 전략, 그리고 운영 모델 전반에 걸친 변화가 필요하며, 이러한 변화는 경영진의 확고한 의지와 실..

String 함수 사용을 조심해야 하는 이유
Tech/Java&Spring2024. 3. 31. 17:12String 함수 사용을 조심해야 하는 이유

서론 실무에서 코드리뷰를 하다가 String 함수 관련해서 개발자 의도와 다르게 작동할 수 있는 코드를 발견했습니다.이 부분에 대해 바로 피드백드리고 정정할 수 있도록 가이드를 제공해 드렸는데요.어떤 부분인지 어떻게 올바른 코드를 작성할 수 있는지 알아보겠습니다. Java 17, SpringBoot3를 기준으로 작성되었습니다. 배경현재 회사에서 수개월의 설계를 끝낸 후 아주 활발하게 개발이 이뤄지고 있습니다.저와 함께 협력하는 개발자는 같은 회사 동료도 있고 다른 회사에서 협력 중이신 분들도 계십니다. 현재 개발에 들어간 지 겨우 1개월 정도인데요. (3월에 시작)모든 동료분들이 Java/Spring에 익숙한 상황이 아니기에 각 파트별로 기술적 논의와 표준을 정의하는 담당자를 배정했고 제가 그 역할을 하..

Java10 무분별한 var를 지양해야 하는 이유
Tech/Java&Spring2023. 6. 18. 16:18Java10 무분별한 var를 지양해야 하는 이유

서론 회사에서 코드 리팩토링을 하는 업무를 하고 있었습니다. 레거시 코드 중 중첩 Map 형태로 반환하는 부분 때문에 프론트엔드에서는 불필요하게 반환된 객체의 key를 모두 읽고(Object.keys) 가장 최하단의 value에 직접 접근하는 로직을 항상 작성해야 했습니다. 그러다 보니 매번 프론트에서 작성되는 반복문 로직이 작성되어야만 했고 그 반복문 내에서 비즈니스 로직이라도 들어가게 되면 가독성을 매우 저하시키는 상황이 종종 생겼습니다. 그래서 이 중첩 Map 형태를 중첩이 없는 List형태로 반환하고자 코드를 수정하던 중, 누군가가 작성한 var 타입 추론을 만나게 됩니다. 간단히 눈으로 디버깅을 할 때 타입 추론은 IDE에 의존적임을 깨달았는데요, IDE가 없는 Github, GitLab 환경에..

멀티스레드 분산 환경에서의 로깅(2)
Tech/Java&Spring2023. 6. 4. 23:15멀티스레드 분산 환경에서의 로깅(2)

서론 이전 포스팅과 이어 작성됩니다. 2023.05.21 - [Tech/Java&Spring] - 멀티스레드 분산 환경에서의 로깅(1) 멀티스레드 분산 환경에서의 로깅(1) 서론 담당하고 있는 프로젝트에서 사용자 수가 점점 늘어나고, Batch 작업 갯수가 늘어나기 시작했습니다. 드물게 에러가 발생하기도 하는데, 이 때 어떤 상황인지 파악하고 원인을 알아내기 위 imksh.com 지난 포스팅에서 결론은 하나의 요청에서 파생된 로그인지 확인하기 어렵다는 결론이었습니다. 그래서, 이번 포스팅에서는 이를 해결할 수 있는 MDC Filter를 적용해봅니다. MDC란 MDC: Mapped Diagnostic Context MDC는 slf4j 패키지에 속해있는 클래스입니다. 또한 ThreadLocal을 이용해 각 ..

멀티스레드 분산 환경에서의 로깅(1)
Tech/Java&Spring2023. 5. 21. 22:43멀티스레드 분산 환경에서의 로깅(1)

서론 담당하고 있는 프로젝트에서 사용자 수가 점점 늘어나고, Batch 작업 갯수가 늘어나기 시작했습니다. 드물게 에러가 발생하기도 하는데, 이 때 어떤 상황인지 파악하고 원인을 알아내기 위해 로그를 추적하기 시작합니다. Kibana로 로그 모니터링을 하고 있으나 한 가지 문제점을 경험했습니다. 멀티 스레드 및 분산 환경의 모든 로그를 하나로 모아보니 굉장히 많은 로그가 적재되고, 내가 원하는 로그를 찾기가 정말 어려워졌습니다. 이 포스팅에서는 이러한 문제점에 대해 알아보고, 다음 포스팅을 통해 하나의 요청에서 파생된 로그들을 쉽게 구분할 수 있도록 하는 방법인 MDC Filter에 대해 알아볼 계획입니다. 상황 가정 테스트에 사용된 모든 코드는 Github Repository에서 확인할 수 있습니다. ..

JPA saveAll이 Bulk INSERT 되지 않았던 이유
Tech/Java&Spring2023. 4. 5. 21:01JPA saveAll이 Bulk INSERT 되지 않았던 이유

실습 환경MySQL 5.7버전 사용Windows 10Entity ID 전략은 IDENTITYJava 11서론실무에서 MySQL 5.7 버전을 사용하고 있고, JPA Entity의 ID 전략은 IDENTITY를 사용하고 있는데, 이때 JPARepository를 이용한 saveAll과 save가 bulk insert로 처리되지 않는 것을 발견했습니다. 당장은 saveAll로 아주 많은 데이터를 저장할 일이 없다고 하더라도, 왜 이렇게 작동하는지 확인하고 추후에 동일한 환경에서 bulk 연산을 처리해야 할 때 유연하게 대처할 수 있어야 합니다. 따라서, 이번 기회에 상황과 원인을 파악하고 어떻게 대처할 수 있는지 알아보겠습니다. 결론만 보고 싶으시다면 하단의 “정리” 부분을 보시면 되겠습니다.작동 원리바로 결..

try-with-resources와 native 영역
Tech/Java&Spring2023. 3. 11. 00:24try-with-resources와 native 영역

소개 try-with-resources 구문과 native 자원의 관계 이해 대상 독자: 초보 Java 개발자 자바 관련 스터디를 하고 있는데, 이번엔 try-with-resources와 관련된 주제로 얘길 나누었습니다. (이 주제는 이펙티브 자바, 자바의 신에서 꼭 등장하는 내용이기도 합니다) 정말 별 것 아닌 것 같지만, 해당 주제로 대화를 나누기 위해 정말 광범위하고 깊은 키워드들이 등장했었습니다. GC, JVM, JNI, native 영역, FileDescriptor 등등 기본적인 개념에 대해서는 알고 있었으나, 이들의 관계에 대해 간단하게 살펴보고 왜 try-with-resources를 쓰는지에 대해 좀 더 자세하게 알아보겠습니다. (FileDescriptor는 다른 포스팅에서 다룰 예정이라 이..

[Javscript] HTTP Header에 한글 넣으면 발생하는 오류
Tech/Javascript2022. 5. 30. 00:33[Javscript] HTTP Header에 한글 넣으면 발생하는 오류

서론 Vue.js로 프로젝트를 진행하다 게이트웨이로 헤더 값을 보내는 과정 중에 겪었던 일이었다. 기존엔 영어나 숫자로 이루어진 값을 헤더에 담아 보냈었는데, 한글 데이터를 보내게 되면 에러가 발생했다. 한글 이름을 헤더에 담아 보내야했기 때문에 반드시 필요했던 과정이었다. 원인 HTTP Header 표준에 한글은 포함되어 있지 않기 때문이다. 그래서 한글 데이터만 담으면 에러가 발생했고 해당 내용은 링크에서 알 수 있었다. 실제 에러도 HTTP RFC와 관련된 에러가 발생하는 것을 볼 수 있었다. 대처 방법 이미 잘 알고 있겠지만, 인코딩을 해서 보내면 된다. URIEncoding 방식을 이용했고, Javscript에서 제공해주는 함수를 이용했다. 대표적으로 encodeURI()와 encodeURICo..

Suggestion 블럭 내에 코드 블럭 작성하기
Tech/Git2022. 1. 24. 01:34Suggestion 블럭 내에 코드 블럭 작성하기

서론 최근 클린코드 스터디를 진행하며 겪었던 일이었습니다. ```java boolean isVisited = false; ``` 위처럼 백틱(`) 3개로 코드를 감싸는 것을 코드 블럭이라고 합니다. ```suggestion ```java boolean isVisited = false; ``` ``` Pull Request에 코드 블럭을 포함한 Suggestion을 등록했으나 백틱(`)이 제대로 동작하지 않았습니다. 원인 ```suggestion# suggestion 블럭 시작 ```java boolean isVisited = false; ```# suggestion 블럭 끝으로 인식!! ```# 실제 동작해야 하는 블럭의 끝 내용을 보면 유추할 수 있을텐데, 백틱(`)이 자신의 구역을 인지하지 못하고 j..

반응형
image