전체 글 19

[SQL] JOIN과 ON, 실행 순서 정리 + MySQL과 Oracle의 HAVING 차이

JOIN과 ONJOIN은 두 테이블을 연결할 때 사용하고 ON은 어떤 조건으로 두 테이블을 연결할지 지정한다.FROM CAR_RENTAL_COMPANY_CAR rJOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN d ON d.CAR_TYPE = r.CAR_TYPE 여기서는 두 테이블의 CAR_TYPE이 같은 행끼리 연결한다. ON 뒤에는 조건을 하나만 작성해야 하는 것이 아니다. AND나 OR를 이용해 여러 조건을 작성할 수 있다.JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN d ON d.CAR_TYPE = r.CAR_TYPE AND d.DURATION_TYPE = '30일 이상' 이 경우 CAR_TYPE이 같으면서 DURATION_TYPE이 30일 ..

SQL 2026.08.29

[Java] Java 21 Record로 DTO를 다시 설계해 본 이유

시작하며기존 프로젝트에서는 Response DTO를 작성할 때 주로 Lombok의 @Data, @Builder, @NoArgsConstructor, @AllArgsConstructor를 사용했습니다.@Data@Builder@NoArgsConstructor@AllArgsConstructorpublic static class CreditDTO { private Long creditId; private String name; private String charName; private String profileImageUrl;} 처음에는 이 방식이 꽤 편했습니다. DTO마다 Getter, Setter, 생성자를 직접 작성하지 않아도 됐고 Builder를 사용하면 객체를 생성할 때 어떤 필드..

Java 2026.08.16

[AWS] Official Practice Question Set 1~10

AWS Skill Builder의 1~10번을 풀면서 기억해둘 포인트를 간단히 정리해본다. 1. 단일 가용영역(Availability Zone) 애플리케이션의 가용성 높이기[단일 AZ + 가용성 향상 → Multi-AZ Auto Scaling + Load Balancer]웹 애플리케이션은 Network Load Balancer를 통해 2개의 Amazon EC2 인스턴스에서 실행된다. EC2 인스턴스는 단일 가용 영역에 있다. 아키텍처의 가용성을 높이려면 Solutions Architect는 무엇을 해야 하는가? C. EC2 인스턴스를 여러 가용 영역 전반으로 확장되는 Auto Scaling 그룹에 배치한다. Auto Scaling 그룹을 Network Load Balancer의 대상으로 지정한다.정답입니..

AWS 2026.08.13

[Kubernetes] Pod 재스케줄링으로 발생한 504 Gateway Timeout

시작하며기존 프로젝트는 OCI 위에 k3s 클러스터를 구성해 운영하고 있습니다. 클러스터는 master 1대와 worker 2대로 구성했고 nginx ingress controller와 Spring Boot 애플리케이션은 worker 노드에서 실행하는 형태로 운영할 계획이었습니다. 어느 날 deployment.yml의 probe 설정을 수정한 뒤 애플리케이션을 다시 배포했습니다. GitHub Actions는 정상적으로 완료되었고 Pod도 Running 상태였습니다. 하지만 외부에서 로그인을 시도하면 API 요청이 504 Gateway Timeout으로 실패했습니다. 처음에는 Cloudflare나 OCI Load Balancer 문제를 의심했습니다. 하지만 요청 경로를 하나씩 확인하면서 문제는 외부 인프라..

Troubleshooting 2026.06.17

[MyBatis] N+1 Query 문제 해결: JOIN 대신 Batch Select 전략으로 리뷰 조회 성능 개선하기

시작하며리뷰 목록에서는 리뷰 내용과 함께 좋아요 수와 현재 사용자의 좋아요 여부를 제공하고 있습니다. 처음에는 리뷰 목록을 조회한 뒤 각 리뷰에 필요한 좋아요 정보를 추가로 조회하는 방식으로 구현했습니다. 그러던 중 코드 리뷰를 진행하면서 리뷰마다 DB 조회가 반복되고 있다는 점을 발견했습니다. 데이터가 적을 때는 큰 문제가 드러나지 않았지만 리뷰 수가 늘어날수록 조회 쿼리도 함께 증가하는 구조였습니다. 그래서 리뷰 수가 늘어나더라도 반복적인 DB 조회가 증가하지 않도록 조회 구조를 개선하기로 했습니다. 코드 리뷰에서 포착한 2N+1 문제리뷰 목록을 먼저 조회한 뒤 각 리뷰에 필요한 좋아요 수와 현재 사용자의 좋아요 여부를 추가하는 구조였습니다. 문제는 이 과정에서 Java Stream 내부에서 호출하는..

Troubleshooting 2026.03.05

[Log] 오픈소스 기여모임 10th 밋업 후기

지난 학기부터 오픈소스에 관심이 생겨 여기저기 알아보았던 것 같다. 그러다 지난 12월 10기 모집 공고를 보고 바로 지원하며 활동을 시작하게 되었다. 평소 자주 사용하던 Spring 관련 오픈소스에 두 개의 PR을 올렸는데 그중 메인테이너가 직접 생성한 이슈를 해결한 건은 이틀 만에 빠르게 머지되었다. 비록 작은 기여였을지라도 첫 머지가 되었을 때의 뿌듯함은 기대 이상이었다. 활동을 마무리하며 평소 가졌던 의문을 해소하고자 대학교에서 열린 오픈소스 밋업을 찾았다. AI 활용이 대중화된 지금 무분별하게 생성된 코드가 오픈소스 생태계에 유입되어도 효율성이 유지될 수 있을지 고민이 많았기 때문이다. 어떻게 하면 AI와 협업하며 더 나은 코드를 짜고 이를 현명하게 활용할 수 있을지 다른 분들의 의견이 궁금..

Log 2026.03.04

[MyBatis/Oracle] ORA-17004: 열 유형이 부적합합니다 (TypeException) 해결 방법

MyBatis를 사용하여 Oracle에 데이터를 삽입할 때 특정 파라미터 값이 null인 경우 ORA-17004 에러가 발생하는 경우가 있다.특히 전역 설정을 마쳤음에도 불구하고 에러가 지속되었다. 1. 문제 상황일반 회원가입 기능을 테스트하던 중 소셜 로그인 관련 필드가 null로 넘어오면서 다음과 같은 예외가 발생했다.Caused by: org.apache.ibatis.type.TypeException: Error setting null for parameter #6 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cau..

Troubleshooting 2026.03.04

[Elasticsearch] AWS t3.micro에서 Elasticsearch 검색 쿼리 최적화하기

비용 절감을 위해 AWS 프리티어 범위 내인 t3.micro(2 vCPU, 1GiB RAM) 인스턴스를 엘라스틱서치 서버로 채택했다. 이는 엘라스틱서치를 운영하기에 매우 타이트한 조건이다.OS와 Docker의 기본 점유율을 제외하면 엘라스틱서치의 핵심인 JVM 힙 메모리에 할당할 수 있는 자원은 약 500MB 내외에 불과하다. 한글 형태소 분석기인 Nori나 N-gram 같은 토크나이저를 추가하면 검색 성능을 높여주지만 인덱싱 시점에 메모리 점유율이 상승하여 OOM(Out Of Memory) 발생 위험이 커질 수 있다. 따라서 인덱스 구조는 가볍게 유지하되 쿼리 수준에서 리소스 부하를 최소화하는 전략을 선택했다. 1. 테스트 환경 및 목적이번 실험은 제한된 시스템 자원 내에서 서비스 로직이 포함된 실제 ..

Troubleshooting 2026.01.21

[React] 빌드 무한 대기에서 초 단위 배포까지

로컬에서는 멀쩡하던 프로젝트가 배포 직전 로그도 없이 멈춰버렸다. 로그가 없어 막막한 상황에서 CRACO와 분석 도구를 활용해 원인을 찾아내고 전체 번들 구조를 개선한 트러블 슈팅 과정을 정리했다. 1. 'Creating an optimized production build...'배포를 위해 npm run build를 실행했지만 터미널은 Creating an optimized production build... 메시지 이후 어떠한 응답도 없었다.에러 로그 없는 무한 대기 상태메모리 부족이 원인이라 판단하여 $env:NODE_OPTIONS="--max_old_space_size=4096" 명령어로 힙 메모리를 강제 확장했으나 빌드는 여전히 기약이 없었다.2. 가설 검증로그가 없는 상황에서 세운 가설은 "..

Troubleshooting 2026.01.17

[Log] UMC 8기를 마치면서 (후기)

6개월간의 UMC 8기 경험을 돌아보며 느낀 점을 정리해본다. [1. 스터디 ] 학기 중 4개월은 각 학교 지부별로 파트(백엔드/프론트/기획/디자인) 기준 스터디가 진행된다. 매주 학습할 내용을 공부해오고 미션을 수행해 온 뒤 이를 바탕으로 스터디원들과 토론하는 방식이었다.스프링 관련 개념들을 정리하면서 놓치고 있던 부분들을 다시 짚을 수 있었고 새로운 기술이나 구조를 함께 고민하는 과정이 꽤 유익했다. 정리한 내용들은 워크북에 기록하면서 체계적으로 남길 수 있어 좋았다. [ 2. 프로젝트 ]방학 동안 약 두 달간은 프로젝트 기간이었다. 각 지부의 PM님들이 제안한 아이디어 중 원하는 프로젝트에 지원하는 방식이다.PM 데이에 직접 참여해 여러 발표를 들은 후 나는 시니어 일자리 플랫폼 ‘평생’ 프로젝트에..

Log 2025.12.01