묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨강의 하나로 끝내는 백엔드 모든 지식!
백엔드 신입으로써 알아야할 보안에 대한 기본 수준이 궁금합니다
검색을 해보니 강의 내용 중 나오는sql인젝션xss, HttpOnlycsrf, SameSitehttps이 부분들은 보통 기본적으로 많이 선택해서 꼭 알아야 하고 연습해야 하는 것으로 생각됩니다그 외에도 알려주신 것들에 대해 자세히 알아야 할까요? 아니면 이런 방법들이 있구나 하고 굳이 직접 사용해볼 필요는 없는 걸까요
-
해결됨김영한의 실전 데이터베이스 - 기본편
두개 이상의 테이블을 조인할때 인덱스 질문이 있습니다.
두개 이상의 테이블을 조인 할 때 서로 다른 테이블에 있는 데이터로 ORDER BY 정렬을 하게 되는 경우가 있을 것 같은데 이런 경우에는 인덱스를 어떻게 생성해야 하는지 궁금합니다
-
미해결김영한의 실전 데이터베이스 - 기본편
파일을 만드는 단위가 궁금해요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요! 강의를 듣다보니 db 파일들은 히스토리가 어떻게 관리되고 어떤 단위로 파일을 나누는지 궁금합니다!
-
미해결김영한의 실전 데이터베이스 - 설계 1편, 현대적 데이터 모델링 완전 정복
실무에서 SQLP 자격증의 유효성에 대한 질문.
안녕하세요, 김영한 지식공유자님.현재 자바개발 2년차 개발자입니다.자바와 DB공부를 병행하고 있습니다.자바와 스프링 공부 vs SQLP 공부로 고민을 한다면,자바와 스프링 공부보다 SQLP를 따기위한 노력에 가중치 높이는게 좋은 선택일까요?
-
해결됨면접 전에 알고 가면 좋을 것들 - 신입 Java 백엔드 개발자편
JVM/GC 최적화 관련 질문드립니다!
안녕하세요! 강의에서 GC와 JVM 메모리 관리에 대해 설명해주신 부분을 듣다가, 제가 겪었던 Thread Starvation 문제가 떠올라 질문을 남기게 되었습니다 🤓 제가 겪었던 상황에 대해서 정리해보겠습니다. ✔ 1차 문제 발생[프로젝트 환경]- Spring Boot 3.x, Java 21- AWS EC2 t3.small (2 vCPU, 2GB RAM)- Docker 컨테이너 배포- 개발 서버 (비용 최적화 목적) [문제 발생 과정]초기에는 Docker 메모리 제한 없이 JVM만 -XX:MaxRAMPercentage=75.0로 설정했습니다. 카카오 소셜 로그인 기능을 추가한 후 배포 시 Thread Starvation 문제가 발생했습니다.# 초기 설정 (문제 발생)- Docker: 메모리 제한 없음- JVM: -XX:MaxRAMPercentage=75.0 (호스트 2GB의 75% = 1.5GB) [결과]- JVM이 힙 1.5GB + 스택/Metaspace 400MB = 총 1.9GB 사용- OS/Docker 600MB 사용- 총 2.5GB 필요 → t3.small 2GB 초과- Thread Starvation 발생 [1차 해결]Docker 메모리 제한을 추가하고 JVM heap을 축소했습니다.# DockerfileENTRYPOINT ["java", "-XX:+UseZGC", "-Xms512m", "-Xmx1g", "-jar", "app.jar"]# 배포 스크립트docker run -d --memory="1.5g" --memory-swap="1.5g" --cpus="1.8" ... ✔ 2차 문제 발생이후 구글/네이버 소셜 로그인, CRUD API들이 추가되면서 다시 Thread Starvation이 발생했습니다.AWS EC2 서버를 재부팅하고 SSH로 서버에 접속해서 원인을 파악해보았습니다. 아래 내용은 당시 작성했던 깃허브 이슈 내용입니다.✏ 문제 상황 정리1. 컨테이너 상태 확인- docker ps -a | grep nugudi-dev (컨테이너는 실행중이지만 unhealthy 상태)- docker top nugudi-dev (컨테이너 내부 프로세스 확인: 아무런 프로세스도 출력되지 않았습니다 → Java 프로세스가 죽은 상태) 2. 헬스체크 실패 원인 확인- Connection reset by peer 에러 → Spring Boot 애플리케이션이 정상적으로 응답할 수 없는 상태 3. 컨테이너 로그 확인- HikariCP에서 반복적으로 Thread Starvation 경고 → GC가 CPU를 독점하여 애플리케이션 스레드들이 실행될 기회를 얻지 못하고 있는 상태 4. OOM Killer 확인- docker inspect 명령으로 OOMKilled 여부 확인 → false → Linux의 OOM Killer가 프로세스를 강제 종료한 것이 아니라, Java 프로세스가 메모리 부족으로 인한 GC Thrashing 상태에서 스스로 응답 불가 상태 5. 메모리 사용량 측정- EC2 인스턴스의 실제 메모리 사용 현황을 파악하기 위해 컨테이너를 중지한 상태에서 free -m 명령 실행- OS + Docker 데몬: 256MB 사용- t3.small 인스턴스의 총 메모리: 1901MB- → 컨테이너에 안전하게 할당 가능한 메모리: 1901MB - 256MB = 1645MB (약 1.6GB) 6. Docker 메모리 사용량 확인 (docker stats nugudi-dev --no-stream)- 재부팅 후 안정화된 상태에서 컨테이너의 메모리 사용량 확인: 866MB / 1.5GB (56%) 사용- 안정화된 상태의 메모리 사용량. (따라서 애플리케이션 시작 단계에서의 피크 메모리 사용량은 아닙니다.) 7. CPU 크레딧 확인- 78-90 크레딧 유지하고 있음. 따라서 CPU 크레딧 고갈 문제는 아니라고 생각했습니다.- 문제의 원인은 메모리 부족으로 인한 GC Thrashing으로 예상됩니다. 🧐 원인 파악[메모리 부족 원인]애플리케이션 시작 단계에서는 모든 클래스를 한 번에 로딩하고, 모든 Spring Bean을 생성하며, DB 커넥션 풀을 초기화하는 등 메모리 사용량이 피크에 달합니다. 이 시점에서 필요한 메모리가 Docker limit인 1.5GB를 초과하면서 메모리 부족 상태가 발생했습니다.메모리를 확보할 수 없게 된 GC는 계속해서 메모리 확보를 시도하며 CPU의 90% 이상을 소비하게 되고, 이로 인해 애플리케이션 스레드들이 실행될 기회를 얻지 못하는 Thread Starvation 상태에 빠지게 된 것으로 예상됩니다.[ZGC의 문제점]현재 사용 중인 ZGC는 초저지연을 목표로 설계된 GC 알고리즘입니다. 이를 위해 복잡한 메모리 구조를 사용하며, 이 과정에서 heap 크기의 10-20%를 Native Memory로 추가 소비합니다. 현재 너구디의 설정인 1GB heap 기준으로 약 200MB의 Native Memory를 사용하는 것입니다.반면 G1GC는 heap의 약 5%만을 Native Memory로 사용하므로 약 50MB 정도만 필요합니다.따라서 ZGC를 G1GC로 변경하면 약 150MB의 Native Memory를 절약할 수 있습니다.ZGC는 수백 GB 이상의 대용량 heap과 초저지연이 중요한 프로덕션 환경에 적합하지만, 1GB 정도의 작은 heap을 사용하는 너구디 개발 서버에서는 오히려 메모리 오버헤드가 부담이 됩니다. G1GC는 10-50ms의 pause time을 가지지만, 개발 서버에서는 이 정도의 지연은 문제가 되지 않으며, 메모리 효율성이 훨씬 중요하다고 판단했습니다.[애플리케이션 시작 vs 안정화 메모리 차이]docker stats로 확인한 866MB(56%)는 애플리케이션이 시작을 완료하고 안정화된 상태의 메모리 사용량입니다. 하지만 애플리케이션 시작 단계에서는 훨씬 더 많은 메모리가 필요합니다.시작 단계(0-2분)에서는 JVM이 모든 클래스를 메모리에 로딩하고(+200MB), Metaspace를 초기화하며(+150MB), Spring Boot가 모든 Bean을 생성하고(+300MB), DB 커넥션 풀을 초기화하며(+100MB), 캐시를 초기화(+100MB)합니다.이 시점의 피크 메모리 사용량은 1400-1500MB 입니다. 시작이 완료된 후(3분 이후)에는 GC가 불필요한 임시 객체들을 정리하면서 메모리 사용량이 800-900MB로 감소하여 안정화됩니다. 🤔 질문1. GC 알고리즘 선택에 대해1GB 수준의 heap에서 ZGC보다 G1GC가 적합하다고 판단하여 변경했습니다. 이러한 판단이 적절한지 여쭤보고싶습니다. ZGC는 어느 정도 규모의 heap부터 효과적인지 궁금합니다. 2. -Xms = -Xmx 설정에 대해gemini 코드 리뷰에서 "서버 애플리케이션은 초기 힙과 최대 힙을 동일하게 설정하여 힙 확장 오버헤드를 제거하는 것이 좋다"는 의견을 받았습니다.메모리가 빡빡한 상황(여유 100MB)에서 처음부터 1.2GB를 할당하는 것이 안전한 선택이 맞을까요..! 오히려 512MB로 시작해서 필요할 때 늘리는 게 더 안전한것일지 여쭤보고 싶습니다. 3. Docker 메모리 제한과 JVM heap 비율에 대해현재 Docker 1.6GB 중 JVM heap 1.2GB (75%)로 설정했는데, 이 비율이 적절한지 여쭤보고 싶습니다. 일반적으로 권장되는 비율이 있는지 궁금합니다! 4. Native Memory 측정에 대해현재는 관련해서 정리해둔 기술 블로그 등을 통해 (G1GC는 heap의 5%, Metaspace 100MB 등)로 추정했는데, 실제로 정확히 측정하려면 어떻게 해야 하는지 궁금합니다! -XX:NativeMemoryTracking=detail 같은 옵션을 운영 환경에서 사용해도 성능에 영향이 없을까요?! 5. 현업에서의 리소스 관리이런 제한된 리소스 환경을 어떻게 관리하시나요?! 메모리 설정의 기준은 어떻게 정하시는지 궁금합니다! 6. 모니터링 지표Thread Starvation을 사전에 감지하려면 어떤 지표를 모니터링해야 할까요?? 강의 내용과 연결하여 최근에 개발하면서 궁금했던 부분들을 남기게 되었습니다! 초기 스타트업에서 백엔드 개발을 하고 있는데 개발하면서 이슈가 생기면, 강의들을 보기도 하고 구글링을 열심히 하기도 하고 AI와 정말 긴 대화를 나누기도 하면서 원인을 찾고 저희 상황에 제일 적합한 해결책을 찾고있습니다. 하지만 제가 문제 상황을 맞게 파악한건지, 가장 최선의 해결책을 찾은게 맞는지 늘 더 생각하게 되는 것 같습니다. 그리고 스스로의 판단에 확신을 갖기 위해서 더욱 더 많이 공부하고 기반을 탄탄하게 해야함을 느낍니다.Thread Starvation 문제를 겪고 제가 파악하고 해결한 방법이 적합한지, 리소스 관리와 관련해서 현업에서는 어떻게 관리하고 모니터링하는지 여쭤볼 수 있는 분이 주변에 없어서 긴 글을 남기게 되었습니다 🤓..읽어주셔서 감사합니다 :)
-
미해결김영한의 실전 데이터베이스 - 설계 1편, 현대적 데이터 모델링 완전 정복
UPDATE, DELETE 시 대리키, 자연키 활용 여부가 궁금합니다.
안녕하세요. 강사님의 강의를 2회독하며 궁금한 것들이 어느정도 정리가 되어 질문 드립니다.제가 SI에 있어서 그런건지 혹은 프로젝트? 운이 없어서인지 차세대를 하더라도 돌이켜보면 경험했던 실무에서는 늘 자연키를 PK로 사용 했었습니다. 그러다보니 UPDATE, DELETE등 데이터를 핸들링 할 때에도 늘 PK(자연키)를 전부 들고다니며 사용 했었는데대리키를 PK로 사용할 경우에는 PK도 항상 같이 다른 데이터 들과 함께 객체등에 담는지.. 혹은 데이터를 갱신 할 때에만 자연키들로 따로 pk를 조회 한 후 사용하는지 아니면 unique 조건이 걸린 자연키들로만 갱신을 하는지 궁금해서요 ㅜㅜ
-
미해결김영한의 실전 데이터베이스 입문 - 모든 IT인을 위한 SQL 첫걸음(SQL부터 차근차근)
mysql 버전
mysql 커뮤니티버전과 사용버전의 차이가 크게 없는건가요?
-
미해결JPA (ORM) 개발자를 위한 고성능 SQL (High-Performance SQL)
강의 질문 - JSON 관련
안녕하세요. 좋은 강의 진행해 주셔서 감사합니다.강의 수강 중 JSON 관련하여 의견을 여쭤보고 싶은 내용이 있습니다.기존 RDB를 통해 JSON 데이터를 저장하면 기존 데이터와 연계성이 좋다는 장점이 있을 것 같습니다.다만, 성능을 고려하면 MongoDB와 같은 NoSQL DB를 도입하는 것이 좋은 상황이 있지 않을까 생각합니다.특정한 상황마다 어떤 방식으로 시스템 인프라를 운영하는게 좋을지판단하시는 기준이나 방법 또는 노하우가 있으실지 궁금합니다.감사합니다.
-
미해결김영한의 실전 데이터베이스 - 기본편
MySQL은 실무에서 사용하는 케이스도 있을까요?
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 아니오2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]MySQL은 학습용으로는 많이 사용하는데, 실무에서도 MySQL을 쓰는 회사가 있을까요?만약 그렇지 않다면 어떤 이유에서 쓰지 않는지 궁금합니다.
-
해결됨김영한의 실전 데이터베이스 - 설계 1편, 현대적 데이터 모델링 완전 정복
자연 키를 PK로 써도 되는 예외 조건!
안녕하세요!현대적인 설계에서는 대부분 자연 키가 아닌 대리 키를 기본 키로 사용하는 것이 권장된다고 하셨는데요.그렇다면 혹시 자연 키를 기본 키로 사용해도 괜찮은 예외적인 상황이 있을까요?예를 들어, 변경 가능성이 거의 없는 코드성 데이터나 표준화된 식별자(예: ISO 코드, 통화 코드 등) 같은 경우에도 무조건 대리 키를 추가하는 것이 좋은지, 아니면 자연 키를 PK로 두어도 실무적으로 문제가 없는 기준이 있는지 궁금합니다. 감사합니다 ☺︎
-
미해결김영한의 실전 데이터베이스 - 기본편
JOIN 방향에 따른 결과 행수와 효율적 데이터 조회 방법 질문
안녕하세요, 강사님.데이터를 효율적으로 JOIN 하여 어떻게 가져올지에 대한 방안에 대해 고민하던 중, 궁금한 점이 있어 질문을 드립니다. 강사님의 강의를 들으며 JOIN 시 결과 행수 차이에 대해 아래와 같이 이해했습니다.부모 테이블에서 자식 테이블로 JOIN할 경우→ 결과 행수가 부모 기준으로 유지된다.자식 테이블에서 부모 테이블로 JOIN할 경우→ 결과 행수가 자식 행수에 따라 크게 늘어날 수 있다.그렇다면 아래와 같은 상황에서 어떻게 처리하는 게 효율적일지 궁금합니다. 강의 상세 페이지처럼 여러 유형의 데이터를 한 번에 가져와야 하는 경우> 예시) 강의 정보, 강사 정보, 강의 평점, 강의 리뷰 등부모 테이블(강의)에서 자식 테이블(강사 정보, 강의 평점)로 JOIN할 때, 결과 행수가 부모 테이블 기준으로 유지되거나 크게 늘어나지 않는 상황에서는 한 번의 쿼리로 모든 데이터를 조회하는 것이 좋은 방법일까요 ?반대로, 강의 리뷰처럼 자식 테이블의 데이터가 많아져서 결과 행수가 급격히 늘어날 경우에는 리뷰 데이터만 별도의 쿼리 또는 API로 분리해서 조회하는 것이 더 바람직할지 궁금합니다.결국, 관계 방향과 데이터 양에 따라 결과 행수가 크게 늘어나지 않는 JOIN까지만 한 번에 처리하고,행수가 많아지는 데이터(예: 리뷰)는 별도로 쿼리하거나 API를 분리하는 전략이 좋을지, 그리고 쿼리/API 분리 기준을 어떻게 결정하는게 좋을지 설명해주시면 큰 도움이 될 것 같습니다.감사합니다.
-
미해결김영한의 실전 데이터베이스 - 설계 1편, 현대적 데이터 모델링 완전 정복
데이터베이스의 컬럼명과 애플리케이션 코드의 일치성
데이터베이스의 컬럼명과 애플리케이션 코드의 일치성을 가져가는게 가독성면에서 좋다고 생각하는데..모든 컬럼이 앱 코드와 일치되어야하는건 또 아닐거같아서요. e.g) 앱 코드에서는 필드를 두개로 나눌수도 있지만 데이터베이스 컬럼에서는 하나의 컬럼으로 가져가는 경우도 있나요?
-
미해결김영한의 실전 데이터베이스 - 기본편
인덱스 설계와 실제 운영의 관계
혹시 테스트 데이터베이스에서 인덱스를 설계하고, EXPLAIN을 통해 점검도 했는데, 실제 서비스 운영에서는 정작 풀 테이블 스캔 결과가 더 빠른 경우가 존재할 수도 있나요?
-
미해결김영한의 실전 데이터베이스 - 기본편
수업 자료 만드는 방법
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요 영한님. 만들어주신 수업 자료 덕분에 수월하게 복습하고 있습니다. 감사합니다.수업자료를 만드시는 과정과 도구가 궁금합니다. (이미지도 전부 직접 만드시나요?)
-
미해결김영한의 실전 데이터베이스 - 기본편
실행 계획 공부 방법
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 강사님. 실무에서 SQL 실행 속도가 느릴 때 실행 계획을 확인해야 하는 경우가 종종 있는데요.실행 계획에 대한 이해가 부족하다 보니 좀 더 깊이 있게 공부해보고 싶습니다.혹시 추천해주실 만한 자료나 책이 있을까요?또한, 강사님께서는 실행 계획을 어떻게 공부하셨는지도 궁금합니다. 감사합니다.
-
미해결김영한의 실전 데이터베이스 - 설계 1편, 현대적 데이터 모델링 완전 정복
단일 키로 행을 식별할 수 없을 때 어떻게 설계하나요?
실무에서 단일 컬럼 PK만으로 행을 식별할 수 없는 경우가 있습니다.예를 들어 영화 예매 시스템에서 ‘상영회차’와 ‘좌석’ 정보를 조합해야만 특정 예매 내역을 정확히 구분할 수 있을 때가 있죠.이런 경우 복합키를 사용하게 되는데, 실제 설계에서는 어떤 방식으로 복합키를 구성하고, 단일 PK와 비교했을 때 어떤 장단점이 있는지 경험 기반으로 설명해주실 수 있나요?
-
미해결김영한의 실전 데이터베이스 - 설계 1편, 현대적 데이터 모델링 완전 정복
혼합 모델링의 선택 기준
정규 테이블과 JSON 컬럼을 함께 사용할 때, 정규화를 유지할지 JSON으로 비정규화할지 어떤 기준으로 결정하나요?
-
미해결김영한의 실전 데이터베이스 - 기본편
실무 관련 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의 수강하면서, 문득 궁금한거 질문드립니다.실무에서는 어떤 제약 조건들을 주로 쓰고, 어떤 건 잘 안 쓰는지 궁금합니다.
-
미해결김영한의 실전 데이터베이스 - 설계 1편, 현대적 데이터 모델링 완전 정복
정규형은 종속 분리의 연속으로 받아들이면 될까요?
제 1,2,3 정규형 강의를 들었을 때, 정규형은 종속 분리의 연속이다라는 생각이 들어서 질문 남깁니다. 앞에서부터 '제1 정규형 만족 -> 제2 정규형 만족 -> 제3 정규형 만족' 이라는 과정이 종속 분리가 차근차근 진행되는거죠? 제가 생각한 것처럼 이해하면 될까요?
-
미해결김영한의 실전 데이터베이스 - 기본편
외래키 사용 여부
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요! 개인적으로 설계하다가 궁금한 점이 있어 질문드립니다.외래키 사용으로 데이터 정합성을 지킨다는 전제는 이해했으나,현재 다니고 있는 회사에서 외래키 사용으로 인하여 쿼리복잡성과 성능이슈로 인하여 사용하지 않고, FK를 걸지않고 seq를 테이블에 넣는식으로 작업하고있습니다.개인적인 의견으로는 정합성을 지켜야 한다고 생각해 외래키를 적용하는게 맞다고 생각하는데,영한님의 의견이 궁금합니다!