전체 글

·Back-end
데이터베이스는 쿼리의 성능을 높이기 위해 PreparedStatement를 캐싱한다. 동일한 모양의 쿼리가 여러 번 실행되면, 그 쿼리의 구조를 미리 캐싱해 두어 다시 파싱하거나 실행 계획을 새로 세우지 않도록 한다.PreparedStatement: 미리 작성된 SQL 쿼리의 틀, 실제 실행할 때 쿼리 안의 변수를 동적으로 대입해 성능을 향상시키고, 보안적으로도 SQL 인젝션을 방지할 수 있다. 하지만 보통의 SELECT * FROM table WHERE id IN (?)라는 쿼리를 만든다고 가정할 때, 데이터가 1개일 때는 SELECT * FROM table WHERE id IN (?), 2개일 때는 SELECT * FROM table WHERE id IN (?, ?) 이런 식으로 IN 절 안에 들어가..
·Back-end
[Java] 가비지 컬렉션(Garbage Collection: GC)1. 가비지 컬렉션(Garbage Collection)이란?가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없chaewsscode.tistory.comJVM의 메모리 관리를 다시 공부하면서, 내 프로젝트에서 메모리가 실제로 어떻게 관리되는지 궁금해졌다. 그래서 프로젝트에서 사용하는 GC가 메모리를 어떻게 회수하고 얼마나 효율적으로 동작하는지, GC 알고리즘이 애플리케이션 성능에 미치는 영향을 알아보기로 했다. 특히, G1GC에 대해 이론적으로만 알고 있었던 부분을 실제로 어떻게 작동하는지 알아보면 재밌겠다는..
[JPA] N+1 문제 발생 지점 찾아 해결하기이전 글에서 N+1 문제와 해결 방법에 대해 정리해보았다. [JPA] N+1 문제 해결 방법N+1 문제란?N+1 문제는 ORM(객체-관계 매핑) 기술에서 특정 객체를 조회할 때, 그 객체와 연관된 다른 객체들도 각각chaewsscode.tistory.com이전 글에서 application.yml의 logging 설정을 통해 SQL 쿼리에 바인딩되는 파라미터 값을 확인할 수 있었다.spring: jpa: show-sql: true properties: hibernate: format_sql: truelogging: level: org: hibernate: SQL: debug type...
1️⃣ N+1 문제와 해결 방법이전 글에서 N+1 문제와 해결 방법에 대해 정리해보았다. [JPA] N+1 문제 해결 방법N+1 문제란?N+1 문제는 ORM(객체-관계 매핑) 기술에서 특정 객체를 조회할 때, 그 객체와 연관된 다른 객체들도 각각 조회되면서 N번의 추가 쿼리가 발생하는 문제를 말한다. N+1 문제는 단일 쿼리로chaewsscode.tistory.com해결 방법 간단 요약Fetch Join 사용JPQL의 join fetch를 사용하여 부모 엔티티를 조회할 때 연관된 엔티티를 함께 가져온다.@Query 어노테이션을 사용하여 메서드를 작성해야 한다. 배치 사이즈 설정Hibernate의 배치 사이즈 설정을 통해 연관된 엔티티를 한 번의 쿼리로 가져오도록 최적화한다.application.yml에..
·Back-end
N+1 문제란?N+1 문제는 ORM(객체-관계 매핑) 기술에서 특정 객체를 조회할 때, 그 객체와 연관된 다른 객체들도 각각 조회되면서 N번의 추가 쿼리가 발생하는 문제를 말한다. N+1 문제는 단일 쿼리로 해결할 수 있는 작업이 불필요하게 많은 쿼리로 분산되면서 성능 저하와 시스템 리소스 낭비를 가져오게 된다. FetchType이 EAGER(즉시 로딩)인 경우findAll() 호출findAll() 메서드를 호출하면, JPQL의 SELECT t FROM Team t 구문이 생성된다.JPQL 분석 및 SQL 생성JPQL을 분석한 후, 데이터베이스에서 실행될 SQL 쿼리 SELECT * FROM Team 가 실행된다.Team 엔티티 인스턴스 생성데이터베이스에서 Team 엔티티의 모든 결과를 가져와 Team..
🌱 문제 상황Update Failed remote: Total 104 (delta 38), reused 97 (delta 35), pack-reused 0 (from 0) bad object refs/heads/feature#52 2 ... did not send all necessary objectsdevelop 브랜치를 Update 하려고 하니 해당 에러가 발생했다. 🌱 해결 방안이 문제는 디렉토리 내의 파일 이름에 "2"가 추가되어 발생하는 문제이다. Git 저장소가 아이클라우드로 관리되는 경우 간혹 발생할 수 있는 문제인 것 같다. 레포지토리 터미널에 git gc 명령어를 입력하면, 저장소 내에서 문제가 되는 객체나 참조를 찾아낸다.rm 명령어를 통해 잘못된 참조를 삭제하면 문제가 해결..
·Back-end
정적 코드 분석이란?정적 코드 분석은 프로그램 실행 없이 소스 코드를 분석하여 코드의 품질, 성능, 보안 문제 등을 찾아내는 기법이다. 이를 통해 코드 작성 단계에서 잠재적인 오류가 결함을 조기에 발견하고 수정할 수 있다. 주요 특징잠재적인 버그가 발생할 수 있는 코드 발견코드 컨벤션 위반 여부 판단오타 검수사용되지 않는 코드(미사용 import) 발견잠재적 보안 취약점 발견 SonarCloud란?  [Spring] SonarQube로 프로젝트 정적 코드 분석SonarQube란?SonarQube는 클린 코드를 구현하기 위한 정적 코드 분석 도구이다. 🤔 정적 코드 분석 vs 동적 코드 분석정적 코드 분석은 코드가 실행되기 전 소스 코드 또는 바이너리 코드를 분석해 코chaewsscode.tistory...
·Back-end
SonarQube란?SonarQube는 클린 코드를 구현하기 위한 정적 코드 분석 도구이다. 🤔 정적 코드 분석 vs 동적 코드 분석정적 코드 분석은 코드가 실행되기 전 소스 코드 또는 바이너리 코드를 분석해 코드를 직접 실행하지 않고 코드의 구조, 문법, 스타일, 잠재적인 버그, 코드 복잡도, 보안 취약점 등을 분석한다. 정적 코드 분석은 코드 실행 없이도 오류를 조기에 발견할 수 있는 장점이 있으나, 코드의 실제 실행 환경에서 발생하는 런타임 오류나 메모리 누수와 같은 동적인 문제는 감지할 수 없다는 단점이 있다. 동적 코드 분석은 코드를 실제로 실행하는 동안 수행되는데, 프로그램을 실행하면서 그 동작을 모니터링하고, 런타임에서 발생할 수 있는 메모리 누수, 성능 문제, 예외 처리, 보안 문제 등을..
·Back-end
이전에 CI/CD 환경을 구축할 때 헤매느라 실행이 실패하는데 메인 브랜치에 푸시해야만 실행 결과를 확인해야 해서 커밋 내역이  이번 프로젝트에서 다시 Github Actions을 사용할 일이 생겨 이번에는 act라는 오픈소스를 통해 로컬 환경에서 Github Actions 스크립트를 테스트해보려고 한다. 사전 설치Docker 설치Act 오픈소스는 도커 기반으로 돌아가는 커맨드이기 때문에 도커 환경설정이 필요하다.Mac 기준 dockerdocs에서 Docker.dmg를 다운로드하여 설치한다.만약 도커를 이전에 설치한 적이 없었다면 설치 후 What is a container?을 누르면 welcome-to-docker 컨테이너가 생기고 Containers 탭에서 이를 확인할 수 있다. Act 설치맥의 경우..
서채리
chaewss