본문 바로가기
반응형

Blog135

2025-03-20 (목) 🚀 오늘 배운 것isNotEmpty()는 길이 체크, isNotBlank()는 공백 여부까지 체크.launch는 단순 실행, async는 await()로 결과 반환 가능.runBlocking은 스레드 차단, CoroutineScope는 비동기 실행.🔹 isNotEmpty() vs isNotBlank()Method 대상 동작 방식isNotEmpty()String & Collection문자열 또는 컬렉션이 비어있지 않으면 trueisNotBlank()String공백(' ', '\\\\t', '\\\\n')을 제외한 문자가 하나라도 있으면 true📌 예제val str1 = " "val str2 = "abc"println(str1.isNotEmpty()) // trueprintln(str1.isNotBl.. 2025. 3. 20.
2025-03-18 (화) require를 사용하면 입력 검증을 간결하게 처리할 수 있다.filter는 결과 리스트 반환, any는 조건 만족 여부만 확인하므로 목적에 따라 선택해야 한다.apply는 객체 설정, run은 연산 결과를 반환하는 용도로 구분하면 코드가 더 명확해진다.1️⃣ require 사용법require(condition)는 주어진 조건이 false일 경우 IllegalArgumentException을 발생시킨다.이를 활용하면 함수의 입력 검증을 간결하게 처리할 수 있다.fun createReport(name: String) { require(name.isNotBlank()) { "Report name must not be blank" } println("Report created: $name")}cre.. 2025. 3. 18.
2025-03-14 (금) 🔹 1️⃣ 쿼리 최적화: JOIN을 활용한 단일 쿼리 조회✔ 문제점기존에는 여러 개의 테이블을 개별적으로 조회한 후, reportId를 기준으로 매핑하는 방식이었다.이 방식은 쿼리 실행 횟수가 많아지고, 추가적인 연산이 필요하여 성능 저하를 유발할 수 있었다.✔ 해결 방법여러 개의 개별 쿼리를 실행하는 대신, JOIN을 활용하여 한 번의 쿼리로 데이터를 조회하도록 변경했다.Report 엔티티와 관련된 데이터를 LEFT JOIN을 통해 조회하고, 최신 데이터(createdAt 기준)를 가져오는 서브쿼리를 적용했다.불필요한 데이터 연산을 줄이고, 쿼리 실행 시점에서 필요한 데이터를 가공하여 반환하는 방식으로 개선했다.✔ 개선된 방식val latestHistorySubquery = select( max.. 2025. 3. 14.
2025-03-13 (목) ✍️ 정리sealed interface는 특정 모듈 내에서만 상속이 가능하고, 선택적 override가 가능하여 when 문에서 안전성을 제공.바인딩 변수(Bind Parameter)는 SQL Injection을 방지하고, 성능과 가독성을 향상시키는 중요한 기법.📌 Kotlin의 sealed interface vs 일반 interface**✅ sealed interface란?sealed interface는 상속 계층을 제한할 수 있는 인터페이스로, 같은 모듈 내에서만 하위 타입을 정의할 수 있음.특정 메서드를 선택적으로 override할 수 있도록 설계할 수 있음.when 표현식에서 컴파일 타임 안전성을 보장할 수 있음.✅ 일반 interface와의 차이점특징 일반 interface sealed int.. 2025. 3. 13.
2025-03-11 (화) ✅ 오늘의 학습 정리INNER JOIN과 LEFT JOIN의 차이를 이해하고, 데이터 조회 시 상황에 맞게 사용할 수 있도록 함.containOrNull()을 사용하여 리스트 내 요소를 안전하게 검색하고, 없을 경우 null을 반환하는 방식 학습.리플렉션을 활용한 setPrivateField() 구현 및 이슈 해결리플렉션이 예상대로 동작하지 않을 수 있는 문제를 발견하고 generateSequence를 활용해 해결.@MappedSuperclass를 활용한 공통 엔티티 관리 방법 학습테이블이 생성되지 않는 특성과 상속을 통해 코드 중복을 줄이는 방식을 배움.generateSequence의 활용 방법무한 시퀀스 생성 및 부모 클래스 탐색 등 다양한 활용법 익힘.🔹 1. INNER JOIN vs LEFT J.. 2025. 3. 11.
2025-03-10 (월) 📌 오늘 배운 핵심 요약✅ select, selectNew, selectFrom의 차이를 이해하고 적절한 상황에서 사용✅ like와 containOrNull의 차이를 구분하여 null 안전성 고려✅ EmbeddedId 내부 필드 접근 시 path(EmbeddedId, Field) 방식 활용✅ JDSL과 JPQL의 차이점을 비교하여 JDSL의 장점을 이해✅ KProperty1, KFunction1을 활용하여 프로퍼티 및 메서드 참조하는 방법 숙지✅ :: 연산자를 활용한 프로퍼티, 함수, 생성자 참조 활용법 학습1️⃣ select, selectNew, selectFrom 차이점JDSL에서 데이터를 조회할 때 사용하는 select, selectNew, selectFrom의 차이점을 정리하면 다음과 같다.se.. 2025. 3. 10.
2025-03-07 (금) 🚀 최종 정리✅ Serializable → JPA에서 복합 키 사용 시 필수✅ @EmbeddedId + @Embeddable → MySQL 복합 키 설정 시 권장 방식✅ require → 매개변수 검증을 간결하게 처리할 때 사용✅ Set?.orEmpty() → null 방지 및 안정적인 코드 작성 가능✅ optimizeReadOnlySet() → 메모리 최적화를 위해 사용✅ first() vs any() → 첫 번째 요소 조회 vs 요소 존재 여부 확인1. Serializable (직렬화)Serializable은 객체를 바이트 스트림으로 변환하여 저장하거나 네트워크로 전송할 때 사용된다.JPA에서 @EmbeddedId 또는 @IdClass를 사용할 때, 복합 키 클래스는 반드시 Serializable을.. 2025. 3. 7.
2025-03-06 (목) 💡 정리API를 설계할 때 DELETE 요청은 Request Body를 허용하지 않으므로, Path Variable 또는 Query Parameter를 활용해야 함PUT 요청에서는 변경할 데이터를 명확히 전달하도록 JSON Body를 포함하는 것이 일반적데이터베이스 설계 시, 특정 테이블 간의 연관 관계에 따라 일부 데이터만 삭제하고 일부는 유지하는 전략을 고려해야 함API 명세 작성특정 데이터를 삭제하는 DELETE API를 설계할 때,경로 변수(Path Variable)로 ID 리스트를 전달할 경우 DELETE /resource/{ids} 형태로 처리단일 ID만 전달하는 경우 DELETE /resource/{id} 사용PUT 요청에서는 경로 변수로 ID를 받고, JSON Body로 수정할 데이터를 .. 2025. 3. 6.
2025-03-05 (수) ✅ 오늘의 핵심 정리N+1 문제는 패치 전략과 관계없이 발생할 수 있으며, fetch join 또는 EntityGraph로 해결할 수 있다.반복 주기에 따른 데이터 구조를 최적화하고, 필수/선택 필드를 명확히 정의해야 한다.쉼표로 구분된 데이터를 저장할 때, 길이 계산을 통해 적절한 VARCHAR 크기를 설정해야 한다.다양한 유형의 ID가 포함될 경우, 이를 구분할 타입 필드를 추가하는 것이 유지보수에 유리하다.RESTful API 명세를 작성할 때, 요청 구조, 필터링, 페이지네이션, 응답 데이터, 에러 핸들링을 철저히 설계해야 한다.1️⃣ N+1 문제와 Fetch Join글로벌 패치 전략(EAGER, LAZY)과 관계없이 N+1 문제는 발생할 수 있다.EAGER의 경우, JPQL 실행 시 연관된 엔티.. 2025. 3. 5.
728x90
반응형