[Java] JDBC의 Statement와 PreparedStatement
·
Back end/Java
데이터베이스와 통신하는 Java 애플리케이션을 개발할 때, JDBC를 통해 SQL을 실행하게 됩니다. 이때 Statement와 PreparedStatement 중 어떤 것을 사용하느냐에 따라 애플리케이션의 성능과 보안이 크게 달라집니다.Statement: 유연하지만 위험한 방식Statement는 가장 기본적인 SQL 실행 방식입니다. 쿼리를 작성할 때 문자열 연결(String concatenation)을 통해 동적으로 SQL을 구성합니다.String userId = "user123";String sql = "SELECT * FROM users WHERE id = '" + userId + "'";Statement stmt = connection.createStatement();ResultSet rs = s..
[Oracle] 테이블 통계정보 손실로 인한 배치 성능 저하 문제 해결 사례
·
Database/Oracle
개요대규모 데이터를 다루는 시스템에서 데이터베이스 최적화는 성능 유지의 핵심입니다. 최근 백업 시간 단축을 위해 데이터를 정제하는 과정에서, 역설적으로 배치 작업 성능이 급격히 저하되는 이슈를 겪었습니다. 이번 포스팅에서는 테이블 통계정보의 불일치가 시스템에 어떤 영향을 주는지, 그리고 이를 어떻게 해결했는지 공유합니다.문제 상황: "백업을 최적화했더니 배치가 느려졌다?"1. 시스템 배경저희 시스템은 다음과 같은 데이터 처리 파이프라인으로 구성되어 있습니다.Source: MSSQL (실시간 CRM 데이터)Data Warehouse: Oracle 데이터베이스에 매일 정해진 시간에 스냅샷 적재ETL: MSSQL → Oracle (스키마 및 형변환 적재)배치 처리: 변환된 데이터를 기반으로 다단계 집계 프로세..
AtomicInteger는 어떻게 동시성을 보장할까? - CAS 알고리즘 깊이 파헤치기
·
Back end/Java
들어가며이런 질문을 받았습니다."일반 int에 synchronized를 걸지 않고 100개 스레드가 각각 +1을 하면 결과가 100이 안 나올 수 있습니다. 하지만 AtomicInteger.addAndGet()을 사용하면 락 없이도 정확히 100이 보장됩니다. 어떻게 이게 가능한가요?당시에는 제대로 답변하지 못했지만, 이후 학습을 통해 그 원리를 정리해보았습니다.문제 상황: Race Condition먼저 문제를 명확히 해봅시다.// 문제가 되는 코드private int counter = 0;// 100개의 스레드가 동시에 실행public void increment() { counter++; // 이 한 줄이 사실은 3개의 작업!}counter++는 원자적(atomic) 연산이 아닙니다. 실제로는:R..
[SpringBoot] SQL 쿼리 파라미터 로그 남기는 방법
·
Back end/Spring Project
JPA를 사용하다 보면 실제로 실행된 SQL과 바인딩된 파라미터 값을 확인해야 할 때가 많습니다.하지만 기본 설정만으로는 ? 만 출력되어, 실제 값은 확인하기 어렵습니다. 이번 글에서는 쿼리 파라미터를 로그로 남기는 두 가지 방법을 알아보겠습니다. 1️⃣ Hibernate 로그 레벨 설정으로 파라미터 확인application.yml 설정 Spring Boot 버전에 따라 아래와 같이 로그 옵션을 추가합니다. logging.level: org.hibernate.SQL: debug# org.hibernate.type: trace #스프링 부트 2.x, hibernate5 org.hibernate.orm.jdbc.bind: trace #스프링 부트 3.x, hibernate6적용 결과 다음과 같이 쿼리의..
[IntelliJ] HTML 수정 사항 즉시 반영하기 (Spring Boot DevTools)
·
개발도구/IntelliJ
프로젝트를 진행하다 보면 오타 수정이나 UI 레이아웃 변경 등 View(HTML) 단에서 사소한 수정이 굉장히 빈번하게 일어납니다.하지만 코드 한 줄 바꿀 때마다 서버를 껐다 켜야 한다면 흐름도 끊기고 시간도 낭비됩니다. 이럴 때 개발 생산성을 확 올려주는 도구가 바로 Spring Boot DevTools입니다. 1. DevTools 라이브러리 추가하기 먼저 build.gradle 파일의 dependencies에 아래 라이브러리를 추가합니다. dependencies { // 개발 편의를 위한 DevTools 추가 developmentOnly 'org.springframework.boot:spring-boot-devtools'}Tip: developmentOnly는 실제 운영 환경(Produc..
[Git] GitHub Actions로 Pull Request Labeling 자동화하기
·
개발도구/Git
1. GitHub Actions에서 Workflow 생성하기리포지토리의 Actions 메뉴에서 set up a workflow yourself 버튼을 클릭하면 새로운 워크플로우 파일을 생성합니다. 오른쪽 사이드바의 GitHub Marketplace에서 "Auto Labeler"를 검색 후 선택합니다.검색 결과에서 View full Marketplace listing 버튼을 눌러 상세 설명을 확인합니다. 2. Workflow 코드 작성하기Marketplace 페이지에 있는 Create a Workflow 예시 코드를 복사하여 워크플로우 파일에 붙여 넣습니다. 작성한 코드를 저장하고 리포지토리에 커밋하면 GitHub Actions에 워크플로우가 등록됩니다. 3. labeler.yml 커스텀하기jimschub..
[Git] GitHub Actions로 Pull Request 자동 Assignees 지정하기
·
개발도구/Git
1. GitHub Actions에서 Workflow 생성하기리포지토리의 Actions 메뉴에서 set up a workflow yourself 버튼을 클릭하면 새로운 워크플로우 파일을 작성할 수 있습니다.이제 오른쪽에 있는 GitHub Marketplace에서 "Reviewer Assign action" 을 검색합니다.검색 결과에서 해당 액션을 클릭하고, View full Marketplace listing 버튼을 누르면 상세 설명을 확인할 수 있습니다. 2. Workflow 코드 작성하기 Marketplace 페이지에 있는 Usage 예시 코드를 그대로 복사한 뒤,reviewer 항목에 리뷰어로 등록할 팀원의 GitHub ID를 적어줍니다.(저는 reviewer 는 사용하지않으려고 주석처리했습니다.)..
[Back end] 네트워크 타임아웃(Timeout)
·
Back end
1. 네트워크 타임아웃이란?네트워크 타임아웃은 서버에 요청을 보냈지만 일정 시간 동안 응답을 받지 못하면 발생하는 에러입니다.타임아웃이 없다면 요청은 무한정 대기 상태에 빠져 서버 자원을 고갈시키고, 장애로 이어질 수 있습니다.즉, 타임아웃은 리소스를 보호하고 시스템 안정성을 유지하기 위한 안전장치입니다.2. 타임아웃의 종류✅ Connection Timeout정의: 클라이언트가 서버에 연결을 시도할 때, TCP 3-way handshake가 일정 시간 내에 완료되지 않으면 발생발생 지점: TCP 연결 수립 과정원인 예시: 방화벽 차단, 서버 다운, 잘못된 포트, 네트워크 단절실무 사례: 결제 API 연동 시, 클라이언트 방화벽에서 대상 서버의 IP/포트를 허용하지 않아 연결 실패할 경우 발생💡 (cc...