본문 바로가기
Blog/TIL

2025-02-13 (목)

by 코젼 2025. 2. 13.
728x90
반응형

📌 TIL (Today I Learned) - 2025.02.13

✅ 테이블 네이밍은 특정 도메인을 반영해 유지보수성을 고려하여 결정
✅ 부분 수정이 필요하면 PATCH 사용 → null 필드 무시하는 방식으로 구현
int[] 내림차순 정렬은 Arrays.sort() 후 직접 뒤집는 것이 효율적
HashMap을 활용하여 O(n²) → O(n log n)로 성능 최적화

🔹 1. 데이터베이스 테이블 네이밍 고민

  • 특정 데이터를 저장하는 테이블을 만들 때, 테이블 명을 일반화할지, 특정 도메인과 연결할지 고민
  • 예시: analytics vs domain_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)) 제거
  • 변수명 개선 (importantsortedValues)

📌 리팩토링된 최적화 코드

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

댓글