728x90
반응형
📌 TIL (Today I Learned) - 2025.02.13
✅ 테이블 네이밍은 특정 도메인을 반영해 유지보수성을 고려하여 결정
✅ 부분 수정이 필요하면 PATCH
사용 → null
필드 무시하는 방식으로 구현
✅ int[]
내림차순 정렬은 Arrays.sort()
후 직접 뒤집는 것이 효율적
✅ HashMap
을 활용하여 O(n²) → O(n log n)
로 성능 최적화
🔹 1. 데이터베이스 테이블 네이밍 고민
- 특정 데이터를 저장하는 테이블을 만들 때, 테이블 명을 일반화할지, 특정 도메인과 연결할지 고민
- 예시:
analytics
vsdomain_analytics
analytics
→ 범용적인 애널리틱스 데이터 저장소domain_analytics
→ 특정 도메인(예: 프로젝트, 사용자 등)에 특화된 애널리틱스 데이터
- 최종적으로 특정 도메인에 한정된 데이터라면
domain_analytics
처럼 구체적으로 네이밍하는 것이 더 명확함.
📌 DDL 개선 시 고려한 점
boolean
타입 활용하여 가독성 개선updated_at
컬럼 추가하여 데이터 변경 추적 가능- FK 및 INDEX 네이밍을 명확하게 변경하여 유지보수 용이
CREATE TABLE `domain_analytics` (
`id` CHAR(13) NOT NULL COMMENT 'Unique Identifier',
`active_flag` BOOLEAN NOT NULL DEFAULT FALSE COMMENT 'Tracking Status',
`domain_id` CHAR(13) NOT NULL COMMENT 'Related Domain ID',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Creation Date',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Last Modified Date',
`created_by` VARCHAR(100) NOT NULL COMMENT 'Created By',
PRIMARY KEY (`id`),
KEY `idx_domain_analytics_domain_id` (`domain_id`),
CONSTRAINT `domain_analytics_fk_domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain_table` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
🔹 2. PUT
vs POST
vs PATCH
차이
메서드 | 용도 | 특징 |
---|---|---|
POST | 새로운 리소스 생성 | 같은 요청을 여러 번 보내면 중복 생성 가능 |
PUT | 리소스 전체 업데이트 | 기존 데이터를 덮어씌우며, 없으면 생성 가능 (업서트) |
PATCH | 리소스 부분 업데이트 | 변경된 필드만 업데이트 가능 |
📌 부분 수정이 필요하면 PATCH
가 적절함!
DTO 필드에
null
허용 후,null
이 아닌 값만 업데이트하는 방식 추천.특정 조건에 따라 다른 테이블 데이터까지 함께 수정 가능.
@Transactional fun updateFeature(id: String, request: FeatureUpdateRequest) { val feature = featureRepository.findByIdOrThrow(id) val analytics = featureAnalyticsRepository.findByFeatureId(id) request.name?.let { feature.name = it } request.description?.let { feature.description = it } request.trackingEnabled?.let { feature.trackingEnabled = it analytics?.trackingEnabled = it // 관련 테이블도 함께 수정 } featureRepository.save(feature) analytics?.let { featureAnalyticsRepository.save(it) } }
🔹 3. Java int[]
내림차순 정렬
💡 방법별 비교
방법 | 성능 | 메모리 효율 | 특징 |
---|---|---|---|
Arrays.sort() 후 직접 뒤집기 |
빠름 | 좋음 | 가장 효율적 |
Arrays.sort() + Stream 활용 |
보통 | 보통 | 코드가 간결하지만 살짝 느릴 수 있음 |
Integer[] 변환 후 Arrays.sort() |
느림 | 나쁨 | Integer[] 변환 비용 추가됨 |
📌 성능을 고려하면 Arrays.sort() 후 직접 뒤집는 방식 추천! |
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr = {5, 2, 9, 1, 5, 6};
// 오름차순 정렬 후 뒤집기
Arrays.sort(arr);
for (int i = 0; i < arr.length / 2; i++) {
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
System.out.println(Arrays.toString(arr)); // [9, 6, 5, 5, 2, 1]
}
}
🔹 4. Java 코드 리팩토링 (Arrays.sort()
활용)
원래 코드 문제점
- 이중 루프 사용 (
O(n²)
) →HashMap
을 활용하여O(n log n) + O(n) = O(n log n)
으로 개선. - 불필요한 변환 (
mapToInt(Integer::intValue)
) 제거 - 변수명 개선 (
important
→sortedValues
)
📌 리팩토링된 최적화 코드
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
class Solution {
public int[] solution(int[] values) {
// 내림차순 정렬된 배열 생성
Integer[] sortedValues = Arrays.stream(values)
.boxed()
.sorted(Collections.reverseOrder())
.toArray(Integer[]::new);
// 원본 값 → 순위 매핑
Map<Integer, Integer> rankMap = new HashMap<>();
for (int i = 0; i < sortedValues.length; i++) {
rankMap.put(sortedValues[i], i + 1);
}
// 원본 배열 기준으로 순위 할당
return Arrays.stream(values)
.map(rankMap::get)
.toArray();
}
}
✅ 결과
- O(n²) → O(n log n) 성능 개선
- 가독성과 유지보수성 향상
- 불필요한 연산 제거
🚀 오늘도 한 걸음 성장했다! 😎
728x90
반응형
'Blog > TIL' 카테고리의 다른 글
2025-02-17 (월) (0) | 2025.02.17 |
---|---|
2025-02-14 (금) (0) | 2025.02.14 |
2025-02-12 (수) (2) | 2025.02.12 |
2025-02-11 (화) (0) | 2025.02.11 |
2025-02-10 (월) (0) | 2025.02.10 |
댓글