본문 바로가기

전체 글

(58)
[Database] RIGHT OUTER JOIN은 언제 쓸까? (JOIN의 동작 원리와 실무 활용 패턴) 개발을 하다 보면 INNER JOIN이나 LEFT OUTER JOIN은 자연스럽게 쓰지만, RIGHT OUTER JOIN은 왠지 어색하게 느껴질 때가 많습니다. "어차피 테이블 위치만 바꾸면 LEFT JOIN 아닌가?"라는 생각이 들기 때문이죠.이번 글에서는 각 JOIN의 핵심 동작 원리부터 RIGHT OUTER JOIN이 실무와 아키텍처 관점에서 가지는 진짜 의미, 그리고 ORM(JPA) 사용 시 주의점까지 깔끔하게 정리해 봅니다.1. 쉽게 이해하는 JOIN 쉬운 비유JOIN이란?서로 다른 두 개의 스티커북에서 같은 캐릭터(기본키/외래키)가 그려진 장을 찾아 한 장의 종이에 이어 붙이는 작업입니다.INNER JOIN: 양쪽 스티커북에 모두 존재하는 캐릭터만 모아서 보여줍니다.LEFT JOIN: 왼쪽 스..
int vs Integer: 수백만 트래픽을 견디는 백엔드 데이터 타입 설계 가이드 실제 라이브 서비스를 운영하고 코드를 리뷰하다 보면, int와 Integer, boolean과 Boolean을 특별한 기준 없이 혼용하는 경우를 자주 보게 됩니다. 겉보기엔 비슷해 보이지만, 이 작은 차이가 시스템 성능과 안정성에 큰 영향을 미칩니다.오늘은 퍼스트 프린시플(First Principles) 관점에서, 언제 어떤 타입을 선택해야 하는지 실무 기준으로 정리해 보겠습니다.1. 원시 타입(Primitive)과 래퍼 클래스(Wrapper)자바의 숫자·논리 타입은 크게 두 가지로 나뉩니다.원시 타입 (Primitive Type): int, boolean, double 등 순수한 데이터 그 자체입니다. int는 정확히 4바이트의 메모리만 사용하며, null 개념이 존재하지 않습니다. 항상 기본값(0, ..
유지보수 비용 30% 절감하는 Entity-DTO 매핑의 표준, MapStruct 1. MapStruct란 무엇인가? 백엔드 개발을 하다 보면 데이터베이스와 통신하는 Entity와 클라이언트(React 등)로 데이터를 응답하는 DTO 사이의 변환 작업이 끊임없이 발생합니다. MapStruct는 이 지루하고 반복적인 변환(Mapping) 코드를 개발자 대신 자동으로 작성해 주는 강력한 Java 라이브러리입니다. 2. MapStruct가 없을 때는 어떻게 변환했을까?MapStruct 같은 자동화 도구가 없던 시절(혹은 지금도 쓰지 않는 곳)에는 개발자가 100% 수동으로 변환 코드를 작성했습니다. 주로 다음과 같은 3가지 방식을 사용했습니다. ① 생성자 또는 Setter 방식 (가장 원시적인 방식)서비스 레이어에서 DTO나 Entity를 생성한 뒤, 일일이 getter로 꺼내서 sett..
대용량 트래픽을 견디는 JPA 성능 최적화: 쓰기 지연, 배치 인서트, 그리고 더티 체킹의 미학 1. 도입: 퍼스트 프린시플(First Principles), JPA는 왜 쓰기를 지연시키는가?웹 서비스 아키텍처에서 가장 비싸고 느린 작업은 무엇일까요? 바로 애플리케이션 서버와 데이터베이스(RDBMS) 간의 네트워크 통신과 디스크 I/O입니다.JPA는 이 극악의 통신 비용을 최소화하기 위해 '영속성 컨텍스트(1차 캐시)'와 '쓰기 지연(Write-Behind)'이라는 파괴적 혁신을 도입했습니다. 즉, 데이터베이스에 쿼리를 즉시 쏘지 않고 메모리에 차곡차곡 모아두었다가 한 번에 처리하는 것입니다.💡 초등학생도 이해할 수 있는 비유:save() (쓰기 지연): 대형 마트에서 카트에 물건을 담는 것과 같습니다. 아직 결제를 안 했으니 언제든 물건을 뺄 수 있고, 나중에 계산대로 가서 한 번에 묶어서 결제..
이메일을 DB에 그냥 저장하면 안 되는 이유 — AES + HMAC-SHA256 실무 사례 1. 왜 이메일을 평문으로 저장하면 안 되나? (First Principles)개인정보 보호의 본질은 '유출되었을 때의 피해 최소화'에 있습니다. 보안 사고에서 DB 유출은 "만약"의 문제가 아니라 "언제"의 문제입니다.근본 원인: 평문 저장 시 해커는 즉시 유효한 이메일 리스트를 확보하며, 이는 보이스피싱, 스팸, 타 사이트 '크리덴셜 스터핑' 공격의 핵심 재료가 됩니다.비즈니스 임팩트: 개인정보 유출 사고는 징벌적 손해배상과 브랜드 신뢰도 추락으로 이어집니다. 초기 스타트업에게는 사실상의 '사업 사망 선고'와 같습니다.2. 두 가지 보안 기법: 암호화(AES) vs 해시(HMAC)우리는 이메일을 보여줘야(Display) 하고, 동시에 찾아야(Search) 합니다. 하지만 이 두 목적은 기술적으로 충돌..
Java Record로 DTO 리팩토링하기 — 코드가 절반으로 줄었다 1. 들어가며 — 왜 DTO가 점점 무거워졌나?프로젝트가 커지면서 DTO 파일마다 반복되는 boilerplate에 지쳤습니다. Lombok으로도 한계가 있었죠. Java Record로 리팩토링한 결과, DTO 코드가 평균 35% 줄었고, setter로 인한 잠재적 버그도 사라졌습니다.// 변환 전 BookingRequest.java@Data@NoArgsConstructor@AllArgsConstructorpublic class BookingRequest { @NotNull(message = "사용자 ID는 필수입니다") private UUID userId; @NotNull(message = "헬스장 ID는 필수입니다") private UUID gymId; private UUID..
유지보수에 큰 도움이 되는 React 절대 경로 설정 React로 개발을 하다 보면 import 문은 필수입니다. 하지만 프로젝트 규모가 커지면 다음과 같은 상대 경로의 지옥을 맛보게 됩니다. 매번 경로를 찾아서 ../../ 와 같이 상대 경로를 작성하다 보면 파일이 이동할 때마다 import 구문에 있는 경로를 바꿔야 하고 ../../../ 이렇게 너무 길어지면 경로를 파악하기에도 불편합니다. 이런 복잡한 상대 경로 대신, 프로젝트 루트를 기준으로 하는 절대 경로를 사용하면 코드가 훨씬 깔끔해집니다.아래 이미지와 같이 @/ 을 이용해서 위치를 알아서 찾을 수 있습니다. 절대 경로 세팅은 크게 두 단계로 나뉩니다. "왜 두 번이나 설정해야 하지?"라는 의문이 드신다면 아래 내용을 참고해 주세요. 1. TypeScript 설정 (tsconfig.json)..
[네트워크 기초] 보이지 않는 인터넷의 지도: NIC부터 공인 IP까지 우리가 매일 쓰는 인터넷 뒤에는 수많은 식별자와 우체국(중계 장비)들이 숨어 있습니다. 이 흐름을 이해하면 장애 발생 시 “왜 안 되지?” 하며 당황하지 않고, 어디서부터 확인해야 할지 빠르게 파악할 수 있어요.아래는 집(가정용)과 회사(기업용) 환경을 비교한 그림입니다. 기본 구조는 비슷하지만, 규모와 보안·관리 요구사항이 다르죠. Home Network Diagram - All Network Layouts Explained(집 네트워크 예시: ISP 모뎀 → 라우터 → 스위치 → 여러 기기, 대부분 DHCP + NAT 사용) 1. 스위치(Switch)와 라우터(Router)의 본질적인 차이항목스위치 (Switch)라우터 (Router)OSI 계층Layer 2 (데이터 링크 계층)Layer 3 (네트..