[한이음 드림업(구.ICT멘토링] Ep.1 수강신청 시스템은 어떻게 돌아갈까? 서버 구조 설계해보기
·
프로젝트 도전기
1. 들어가며지난 글에서는 프로젝트를 어떻게 시작하게 되었고, 왜 이 주제를 선택했는지에 대해 이야기했다.2025.04.12 - [프로젝트 도전기] - [한이음 드림업 Ep.0] 진짜 터지지 않는 수강신청 시스템, 가능할까? [한이음 드림업 Ep.0] 진짜 터지지 않는 수강신청 시스템, 가능할까?1. 들어가며졸업 전, 나만의 규모 있는 프로젝트를 완성해보고 싶다는 욕심이 늘 있었다. 가능하다면 공모전에도 도전해보고 싶다는 생각도 있었고, 마지막 학년인 지금이 아니면 도전하기 어렵mingking2.tistory.com “진짜 안 터지는 수강신청 시스템”을 만들기 위해서는기능보다 더 중요한 것이 있다.바로, 무엇부터 만들 것인가, 그리고 어떻게 작게 시작해서 확장할 것인가다. 우리는 모든 걸 한 번에 만들지..
[DB 모르는 백엔드 탈출기 Ep.4] 연관관계 주인은 누가 되어야 할까?
·
DB 모르는 백엔드 탈출기
1. 들어가며이전 글에서 데이터베이스의 테이블 간 연관관계를 중심으로일대일 / 일대다 / 다대다식별 관계 vs 비식별 관계같은 내용을 먼저 짚고 넘어갔다.👉 2025.04.13 - [DB 모르는 백엔드 탈출기] - [DB 모르는 백엔드 탈출기 Ep.1] JPA 쓰기 전에 꼭 알아야 할 DB 기초 [DB 모르는 백엔드 탈출기 Ep.1] JPA 쓰기 전에 꼭 알아야 할 DB 기초1. 들어가며많은 백엔드 개발자들이 JPA부터 배우기 시작한다.Entity 클래스를 만들고, 어노테이션을 붙이면쿼리 없이도 데이터가 저장되고 조회되는 걸 보고 이렇게 생각한다.“와, JPA가 다 해주mingking2.tistory.comDB 관점에서 연관관계가 어떻게 구성되는지 이해했다면,이제는 JPA에서 이 연관관계를 어떻게 표현..
[DB 모르는 백엔드 탈출기 Ep.2] 테이블은 객체가 아니다.
·
DB 모르는 백엔드 탈출기
1. 들어가며JPA를 쓰면 객체만 잘 설계하면 DB도 잘 작동할 줄 알았다.User와 Post를 양방향으로 참조하고,@OneToMany, @ManyToOne을 붙이면 자바 객체처럼 자유롭게 탐색하고 저장할 수 있을 줄 알았다. 그런데…양방향 연관관계를 걸었더니 INSERT가 두 번 나간다?객체는 참조만 했는데, DB는 JOIN이 필요하다고 한다?fetch 전략을 eager로 바꿨더니 SELECT가 줄긴 했지만… 쿼리 내용이 이상하다?이 모든 문제의 출발점은 하나다.“테이블은 객체가 아니기 때문이다.”2. 객체와 테이블은 어떻게 다른가?♟️ 객체의 세계public class User { private Long id; private String name; private List posts =..
[DB 모르는 백엔드 탈출기 Ep.0] JPA가 다 해주는 거 아니었나요?
·
DB 모르는 백엔드 탈출기
1. 들어가며“나는 백엔드 개발자인데… DB를 잘 몰랐다.” 아니, 정확히 말하자면 “몰라도 된다”고 생각했다. Spring Boot를 쓰면 JPA가 알아서 다 해주는 줄 알았다.Entity만 잘 만들면 쿼리가 자동으로 나가고,CRUD는 그냥 되며,join도 fetch 하나면 다 해결되는 줄 알았다. …정확히 말하면그게 해결되는 건지조차 잘 몰랐다.2. 문제 발생 어느 순간부터 이상한 일들이 생기기 시작했다. ❌ 객체는 참조로 연결되어 있는데, DB에서는 join이 필요하다는 말이 이해되지 않았다.❌ @OneToMany를 썼더니 insert가 두 번 나간다는 말도 처음엔 무슨 말인지 감이 오지 않았다.❌ select 한 번 날렸을 뿐인데 콘솔에는 수십 줄의 쿼리가 쏟아졌다.❌ flush, commit, ..
RDS 보안 정책 때문에 접속 불가?
·
삽질로그
1. 들어가며기존에 dev 환경의 RDS와 연결되어 있던 대여기 서버를, 릴리즈를 위해 prod 환경의 RDS로 연결해야 하는 요구사항이 추가되었다.하지만 평소와 같이 연결을 시도했으나 실패했고, 원인을 조사한 결과 prod 환경의 RDS는 직접적인 연결이 차단되어 있다는 사실을 알게 되었다. 💡 왜 prod 환경의 RDS는 직접 연결이 막혀 있을까?Prod 환경은 실제 서비스가 운영되는 환경으로, 데이터 손실이나 보안 사고가 발생할 경우 사용자 및 서비스에 심각한 영향을 미치기 때문이다.prod 환경의 데이터베이스에 접근해 실수할 수 있기 때문이다. (DDL 설정 변경, 잘못된 쿼리문) 이를 해결하기 위해, SSH Tunneling을 활용하여 RDS에 간접적으로 접근해보자.2. 대여기 아키텍처기존 아..
Batch Insert로 API 응답 속도 175배 개선하기
·
삽질로그
1. 들어가며지난 글에서 예약 슬롯을 생성하는 API에서 발생한 성능 문제점을 분석했다.🔗 이전 글: 2025.03.03 - [삽질로그] - 내 API 응답시간은 왜 이렇게 오래 걸릴까?  내 API 응답시간은 왜 이렇게 오래 걸릴까?1. 들어가며최근 스타트업에서 사업장의 운영시간에 따라 구장의 예약 슬롯을 한 시간 단위로 생성하는 API를 만들게 되었다.이 기능은 다음과 같은 경우에 실행된다.✅ 구장 생성 시✅ 사업장mingking2.tistory.com 주요 문제는 다음과 같았다.✅ 중복 검사로 인한 N+1 문제 → existsReservationSlot()을 개별적으로 호출✅ 개별적인 Insert 실행 → saveAll()이 여러 번 실행되어 트랜잭션 오버헤드 증가✅ 개별적인 Delete 실행 →..
내 API 응답시간은 왜 이렇게 오래 걸릴까?
·
삽질로그
1. 들어가며최근 스타트업에서 사업장의 운영시간에 따라 구장의 예약 슬롯을 한 시간 단위로 생성하는 API를 만들게 되었다.이 기능은 다음과 같은 경우에 실행된다.✅ 구장 생성 시✅ 사업장 운영시간 변경 시그러나, 현재 코드에는 성능 이슈가 발생하고 있었다. 예약 슬롯이 많아질수록 DB 부하가 증가하고, 실행 시간이 길어지는 문제가 있었다. 이번 글에서는 기존 코드의 문제점을 분석하고, 어떤 부분이 비효율적인지 살펴보겠다.2. 기존 코드 분석예약 슬롯을 생성하는 기존 로직은 다음과 같다.public void appendSlotsOfMonth(Long fieldId) { Set uniqueStartTimes = new HashSet(); FieldDetailDao dao = fieldServic..