본문 바로가기

Spring/이론

데이터베이스 인덱스의 구조와 특징 개요데이터베이스에서 빠른 검색을 위해 사용되는 인덱스는 여러 가지 자료구조로 구현됩니다. 이 글에서는 주요한 인덱스 구조들의 특징과 장단점을 살펴보겠습니다.인덱스의 주요 구조1. Binary Search Tree (BST)구조 특징:이진 탐색 트리 구조각 노드가 최대 2개의 자식 노드를 가짐왼쪽 자식은 부모보다 작고, 오른쪽 자식은 부모보다 큰 값검색 성능:평균 시간복잡도: O(log n)최악의 경우: O(n) - 편향 트리일 때 2. B-Tree 구조 특징:다진 탐색 트리 구조각 노드가 여러 개의 키를 가질 수 있음모든 리프 노드가 같은 레벨에 위치자식 노드의 개수가 2개 이상으로 확장 가능주요 장점:디스크 I/O 최적화균형 잡힌 트리 구조 유지 3. B+ Tree구조 특징: .. 더보기
JPA 엔티티에서 @NoArgsConstructor(access = AccessLevel.PROTECTED)를 사용하는 이유 들어가며JPA 엔티티 클래스를 작성하다 보면 다음과 같은 코드를 자주 접하게 됩니다.@Entity@NoArgsConstructor(access = AccessLevel.PROTECTED)public class User { // 필드들...}왜 AccessLevel.PROTECTED를 사용하는 걸까요? PUBLIC이나 PRIVATE는 안 될까요? 이번 글에서는 JPA의 프록시 메커니즘과 객체지향 설계 원칙을 통해 그 이유를 알아보겠습니다.JPA가 기본 생성자를 요구하는 이유 1. 프록시 객체 생성JPA는 지연 로딩(Lazy Loading)을 위해 프록시 객체를 생성합니다. 프록시는 실제 엔티티를 상속받은 가짜 객체로, 필요할 때만 실제 데이터를 로딩합니다.// 실제 엔티티@Entitypublic cl.. 더보기
Static 메서드, 언제 사용하고 언제 피해야 할까? 들어가며Spring Boot 프로젝트를 진행하다 보면 ApiResponse.success(data)와 같은 static 메서드를 자주 접하게 됩니다. 하지만 언제 static 메서드를 사용해야 하고, 언제 일반 인스턴스 메서드를 사용해야 하는지 명확한 기준을 정하기는 쉽지 않습니다.이번 글에서는 실제 코드 예시를 통해 static 메서드의 적절한 사용 시기와 피해야 할 상황을 알아보겠습니다.Static 메서드를 사용하는 이유 1. 편의성과 가독성먼저 ApiResponse 클래스를 예로 들어보겠습니다.// Static 메서드가 없다면@PostMapping("/users")public ResponseEntity> createUser() { User user = userService.createUser(.. 더보기
Spring Bean 생명주기 - 실무에서 알아야 할 핵심만 초기화와 소멸 콜백 방법Bean의 초기화와 소멸 시점에 특정 작업을 수행하는 3가지 방법을 알아보겠습니다.1. @PostConstruct / @PreDestroy (권장)@Servicepublic class FileService { private FileWriter fileWriter; @PostConstruct public void init() { try { fileWriter = new FileWriter("application.log"); System.out.println("파일 연결 완료!"); } catch (IOException e) { throw new RuntimeExcepti.. 더보기
Spring API 예외 처리 시스템 정리 목표: 깔끔하고 일관된 예외 처리 시스템 구축핵심 아이디어: ErrorCode Enum + BusinessException + ApiResponse + @ControllerAdvice 조합1단계: ErrorCode Enum 정의public enum ErrorCode { // 사용자 관련 (4xx) USER_NOT_FOUND(404, "U001", "사용자를 찾을 수 없습니다"), USER_ALREADY_EXISTS(409, "U002", "이미 존재하는 사용자입니다"), USER_UNAUTHORIZED(401, "U003", "권한이 없습니다"), // 상품 관련 (4xx) PRODUCT_NOT_FOUND(404, "P001", "상품을 찾을 수 없습니다"), .. 더보기
[트러블슈팅] JPA Cascade와 트랜잭션 전파 - 편의성 vs 안전성 "JPA 고급 기능, 정말 써야 할까?" 시리즈 4편 (완결편)들어가며시리즈의 마지막 편입니다. 1편에서 연관관계 매핑의 복잡성을, 2편에서 상속관계 매핑의 실무 한계를, 3편에서 지연로딩의 함정과 해결책을 다뤘다면, 이번에는 영속성 전이(Cascade)와 트랜잭션 전파에 대해 이야기해보겠습니다. 이 두 기능의 공통점은 "편의성"입니다. 코드를 간단하게 만들어주는 매력적인 기능들이죠. 하지만 편의성 뒤에 숨겨진 "위험성"도 함께 알아야 합니다."편리하다고 해서 항상 좋은 것은 아니다" - 이것이 이번 편의 핵심 메시지입니다.영속성 전이(Cascade): 편리하지만 위험한 마법게시판으로 이해하는 Cascade블로그 게시판을 예로 들어보겠습니다:@Entitypublic class Post { @Id @.. 더보기
[트러블슈팅] JPA 지연로딩과 Proxy - LazyInitializationException 해결하기 "JPA 고급 기능, 정말 써야 할까?" 시리즈 3편들어가며1편에서 연관관계 매핑의 복잡성을, 2편에서 상속관계 매핑의 실무 활용을 다뤘다면, 이번에는 지연로딩과 Proxy에 대해 이야기해보겠습니다.처음 Proxy 개념을 접했을 때 정말 헷갈렸습니다. "가짜 객체가 뭐지?" "언제 실제 데이터를 가져오는 거지?" 이런 의문들이 계속 들더군요. 하지만 "왜 Proxy가 필요한가?"부터 이해하니 모든 게 명확해졌습니다.문제 상황: 성능과 편의성의 딜레마배달앱으로 이해하는 즉시로딩 vs 지연로딩온라인 배달앱을 생각해보겠습니다:@Entitypublic class Order { @Id @GeneratedValue private Long id; private int amount; @Ma.. 더보기
[트러블슈팅] JPA 상속관계 매핑 3가지 전략 - 실무에서는 언제 쓸까? "JPA 고급 기능, 정말 써야 할까?" 시리즈 2편들어가며1편에서 연관관계 매핑의 복잡성에 대해 이야기했다면, 이번에는 상속관계 매핑을 다뤄보려 합니다.처음 상속관계 매핑 강의를 들을 때는 정말 이해가 안 됐습니다. @Inheritance, @DiscriminatorColumn, InheritanceType.JOINED... 무슨 말을 하고 있는지 전혀 모르겠더군요.하지만 "왜 이게 필요한가?"부터 생각해보니 개념이 명확해졌습니다. 그리고 실무에서는 언제 써야 하는지도 보이기 시작했습니다.문제 상황: 공통 속성과 개별 속성쇼핑몰 상품 관리의 고민온라인 쇼핑몰에서 다양한 상품을 관리한다고 생각해보겠습니다:// 책- 이름, 가격, 저자, ISBN// 영화 - 이름, 가격, 감독, 배우// 앨범- 이름, .. 더보기