전체 글 9

[Java] HikariCP maxConnectionIdleTime은 필수일까? 메모리 파편화와 GC의 발전

개요얼마 전, Spring Boot 서버에서 주기적으로 CPU 사용량이 치솟는 현상을 트러블 슈팅한 글을 읽었습니다. 문제의 원인은 데이터베이스 커넥션 관리에 있었는데요, 여러 샤드에서 동시에 대량의 커넥션이 만료(idle)되었고, 이를 한꺼번에 재수립하는 과정에서 어플리케이션 서버에 부하가 발생했던 것이죠. 글쓴이는 이 문제 상황을 해결해 나가는 과정에서 독자들에게 다음과 같은 질문을 던졌습니다. 커넥션이 유지된 채로 두면 재사용에 유리한 게 아닐까?maxConnectionIdleTime 설정이 반드시 필요한가? 해당 아티클에서는 maxConnectionIdleTime(커넥션의 최대 유휴 시간) 설정이 필수적이라고 강조하며, 다양한 이유 중 하나로 힙 메모리의 파편화 방지를 꼽았습니다. 순간 머릿속에..

Java 2025.11.29

[Java] Java가 네이티브 언어의 성능을 따라잡는 방법, JIT 컴파일러

개요 우리는 흔히 C는 빠르고 Java는 느리다라고 말합니다. 주변 개발자들에게 왜 Java는 네이티브 언어에 비해서 느린가요? 라고 물어보면, 대부분 다음과 같은 답이 돌아옵니다. Java는 JVM 이라는 가상 머신 위에서 돌아가기 때문입니다 이는 틀린 말은 아닙니다.하지만 엔지니어로서 저희는 이를 조금 더 구체적으로 짚어볼 필요가 있습니다. 가상 머신 위에서 실행된다는 것이 하드웨어 입장에서 구체적으로 어떤 비용을 치르는 일일까요? 도대체 JVM 내부에서 무슨 일이 벌어지길래 태생적으로 느리다는 꼬리표가 붙었을까요? 이 글에서는 C언어와 Java가 하드웨어를 다루는 방식의 근본적인 차이를 비교해보고, Java 진영에서 이 태생적인 한계를 극복하기 위해 도입한 JIT 컴파일러라는 기술에 대해 소개해..

Java 2025.11.26

[데이터베이스] N+1 문제가 무엇이고, 어떻게 해결하나요?

개요 N + 1 쿼리 문제가 무엇인가요? 얼마 전, 동아리에서 서버 튜터로 활동하던 도중 받았던 질문입니다. 이 때, 명료하게 정리해서 답변이 되지 않더군요. 머릿속으로는 어렴풋이 알고 있었지만, 막상 말로 간단하게 설명하려니 "쿼리가... 불필요하게 많이 나가는 거...?" 정도로밖에 표현이 되지 않았고, 길게 설명을 하나씩 하다 보면 안색이 점점 나빠지던 멤버의 얼굴이 기억납니다 ㅎ.. N+1 문제는 아마 많은 주니어 개발자, 그리고 JPA나 ActiveRecord와 같은 ORM을 처음 접하는 분들이 한 번쯤은 만나게 되는 가장 대표적이고, 또 가장 치명적인 성능 저하 요인 중 하나입니다. N+1 문제는 이름 그대로, 연관 관계를 가진 엔티티를 조회할 때 처음 1번의 쿼리를 실행한 결과로 얻은 N..

데이터베이스 2025.11.12

[회고] Spring Boot 배포 환경에서 만난 OAuth 2.0 트러블슈팅

개요 간단한 웹 프로젝트 개발을 하던 중, 로그인 기능을 구글 소셜 로그인으로 만들자는 의견이 있어, 제가 그 기능을 맡아 개발하기로 하였습니다. OAuth2.0 인증 흐름에 따라 Spring Boot 서버에 엔드포인트를 구현하였고, 로컬에서 jwt 토큰이 잘 발급되는 것까지 확인한 뒤 자신 있게 배포했습니다. 그러나... 배포된 서버에서 구글 계정을 고르고 서버 콜백 엔드포인트로 돌아간 뒤에 돌아온 응답은 500에러였습니다.로컬에서 로그인이 분명히 잘 되었는데 왜 배포하면 로그인이 안되는거지??오늘은 그날 겪었던 문제를 해결하는 과정, 그리고 배포 환경의 OAuth2.0 인증 흐름에서 고려해야 할 점들을 다루어볼까 합니다. 문제 상황 먼저 제가 구현한 OAuth 2.0 인증 흐름은 다음과 같습니다...

회고 2025.11.11

[회고] AWS EC2 CPU 사용률 100% 장애 해결

문제 상황 얼마 전, 프로젝트를 AWS 프리티어(t2.micro, 1GB RAM) EC2 인스턴스에 배포하여 사용하던 중, 잘 작동하던 서버에 갑자기 SSH 접속이 불가능해진 상황을 겪었습니다. ssh: connect to host ... port 22: Connection timed out 가장 먼저 떠오른 생각은 '네트워크 문제인가?' 였습니다. 하지만 몇번이고 재시도해도 접속이 안되더군요.. 저는 AWS 관리자 계정으로 로그인하여 EC2 인스턴스가 죽었는지 확인해 보았고, 아래와 같은 메시지를 확인할 수 있었습니다. 인스턴스 연결성 검사 실패? EC2 인스턴스가 헬스체킹에 정상적으로 응답하지 못하는 것 같았습니다. AWS Console에서 EC2에 직접 붙는 것도 되지 않았습니다. 곧바로 대시보드에..

회고 2025.10.28

MSA (MicroService Architecture) 알아보기

최근 백엔드 개발자 채용 공고를 유심히 보셨다면, 'MSA'라는키워드를 심심치 않게 발견하셨을 겁니다. 대체 MSA란 무엇이고, 왜 이렇게 많은 기업들이 요구하는 걸까요? 이 질문에 답하기 위해, 오늘은 마이크로서비스가 어떤 기술적 배경에서 출발했는지, 그리고 기존 아키텍처의 어떤 한계를 극복하기 위해 등장했는지 그 발전 과정 전반을 가볍게 다루어보고자 합니다. 이 글을 통해 MSA의 개념을 명확히 이해하고, MSA 환경에서 발생하는 문제들은 무엇인지, 그리고 그 문제들을 해결하기 위한 기술적 진화의 흐름을 이해해 봅시다. Monolithic Architecture초기 서비스 개발은 대부분 모놀리식(Monolithic) 아키텍처에서 시작합니다. 이름 그대로, 모든 비즈니스 로직과 기능이 하나의 거대한 ..

CS 2025.10.22

[Java] Java와 JVM 메모리 관리

Java와 JVMJava언어가 다른 프로그래밍 언어들과 비교했을 때 가장 특별한 점은 무엇일까요? 바로 JVM 위에서 동작한다는 점입니다. C나 C++ 같은 네이티브 언어로 작성된 프로그램은 OS가 제공하는 환경 위에서 직접 시스템 콜을 호출하며 실행됩니다. 반면, Java 프로그램은 JVM이라는 중간 계층을 거치게 됩니다. 이 JVM이 OS와 상호작용하며 모든 동작을 수행하죠. 즉, Java는 OS 위에 JVM이라는 가상 머신을 한 겹 더 두고 실행되는 셈입니다.이러한 구조는 메모리 관리 관점에서도 큰 차이를 만들어냅니다. 가령, C++의 경우에는 개발자가 직접 메모리 할당과 해제를 책임져야 하지만, Java는 JVM이 이를 자동으로 관리합니다. 개발자가 이런 저수준의 동작을 신경 쓸 필요가 없다는 것..

Java 2025.10.21

TDD, 좋은 설계를 위한 내비게이션

들어가며코로나 팬데믹을 기점으로 IT산업이 크게 각광받으며 우리의 삶이 빠르게 디지털로 전환되었습니다. 이런 시대적 흐름에 따라, 프로그래머라는 직업에 대한 관심 또한 크게 증가하고 있습니다. 일례로, 제가 재학 중인 대학교에서는 '컴퓨팅적 사고' 와 같은 필수 교양을 신설하며 개발자를 꿈꾸는 학생들의 수요를 맞춰나가고 있습니다. 그렇다면 컴퓨팅적 사고란 무엇일까요? 무엇이 그렇게 다르기에 별도의 과목으로 컴퓨팅적 사고 방법을 따로 가르치려는 것일까요? Wikipedia에서는 다음과 같이 이를 정의하고 있습니다. 컴퓨팅 사고란 복잡한 문제를 컴퓨터가 효과적으로 처리할 수 있는 방식으로 정의하고 해결책을 찾는 사고 과정입니다. 컴퓨터 과학자의 문제 해결 접근법을 기반으로 하며, 분해, 패턴 인식, 추상화,..

CS 2025.10.13

AWS 보안 그룹은 IP 스푸핑 공격을 막을 수 있을까?

개요다른 사람들이 작성한 개발 블로그 글들을 보면, 개인 프로젝트에 AWS 같은 클라우드 서비스를 사용하다가 트래픽 공격이나 S3 버킷에 대량 파일이 업로드되어 수천만원 단위의 요금 폭탄을 맞는 사례를 종종 접할 수 있다. 이런 사례를 접하다 보니, 자연스레 인스턴스 보안 설정에 더욱 신경을 쓰게 된다. 그런데 하루는 문득 이런 의문이 들었다. 특정 IP 대역에만 인바운드 규칙을 허용하면 정말 안전할까?누군가 IP 주소를 속여서 접근할 수는 없는 걸까? 위의 의문에서 출발하여 네트워크 통신의 하위 계층의 동작 방식과, 통신의 신뢰성 보장 원리를 찾아보았고, 학습한 내용을 정리해본다. IP 주소 기반 접근 제어네트워크의 가장 기본적인 보안은 방화벽이나 라우터를 통해 이루어진다. 이들은 네트워크에 진입하는..

네트워크 2025.10.13