본문 바로가기
Blog/TIL

2025-02-28 (금)

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

📌 결론

  • MySQL JSON 타입은 String, List<String>, Map<String, Any>로 매핑 가능
  • TIME 타입은 LocalTime으로 변환하여 저장하면 SQL에서 직접 시간 비교 가능
  • 참조 무결성을 비즈니스 로직에서 관리하는 경우 FOREIGN KEY 없이 KEY만 설정 가능
  • JSON 필드를 활용하면 요일 정보 등을 직관적으로 저장 가능하고, SQL에서 직접 변환 가능
  • 부모-자식 관계 데이터 조회 시 JOIN, 재귀 쿼리 등을 활용하여 필요한 데이터 구조를 가져올 수 있음

✅ 1. MySQL Number 타입과 Java/Kotlin에서의 매핑

  • MySQL의 Number 타입은 정수(TINYINT, SMALLINT, INT, BIGINT) 와 부동소수점(FLOAT, DOUBLE, DECIMAL) 으로 나뉜다.
  • Kotlin에서는 Int, Long, Float, Double로 매핑되며, Java에서는 Integer, Long, Float, Double 등이 사용된다.
  • Kotlin의 Int, Long 등은 기본적으로 Number를 상속하지 않으므로, Number 타입으로 다룰 경우 박싱된다.

✅ 2. MySQL에서 VARCHAR 크기 설정

  • JSON 형태로 데이터를 저장할 경우, 최대 길이를 계산하여 VARCHAR 크기를 설정해야 한다.
  • 쉼표로 구분된 숫자 리스트("1,2,3,4,5,...")의 경우 VARCHAR(100) 정도가 적당하다.
  • MySQL 5.7 이상이면 JSON 타입을 사용하는 것이 더 적절하며, JSON 함수를 활용하여 데이터 처리 가능하다.

✅ 3. MySQL JSON 필드와 Kotlin 매핑 방법

  • JSON을 저장하는 방법
    • VARCHAR로 저장하고 직접 파싱 (String 타입으로 저장)
    • JSON 타입을 사용하고 Kotlin에서 변환 (List<String> 또는 Map<String, Any>으로 변환)
  • Kotlin에서 JSON을 처리하는 방식
    • String으로 매핑 후 ObjectMapper를 사용하여 변환
    • List<String> 또는 Map<String, Any>로 변환하여 자동 매핑 (@Converter 활용)
    • JSON_CONTAINS, JSON_EXTRACT 등의 SQL 함수로 데이터 조회 가능

✅ 4. MySQL TIME 타입과 Kotlin 매핑

  • MySQL에서 TIME 타입을 사용할 경우, Kotlin에서는 java.time.LocalTime으로 매핑
  • JPA에서는 @Column 설정만 해주면 자동 변환이 가능하다.
  • TIME 필드를 사용하면 SQL에서 직접 비교 (BETWEEN, ORDER BY)가 가능하므로, VARCHAR보다 적절하다.
@Entity
@Table(name = "report")
data class Report(
    @Column(name = "scheduled_time", nullable = false)
    var scheduledTime: LocalTime
)

✅ 5. FOREIGN KEY 없이 KEY만 설정하는 이유

  • MySQL에서 KEY만 설정하면 인덱싱 최적화를 위해 사용되지만, 데이터 무결성을 강제하지 않는다.
  • FOREIGN KEY를 사용하면 자동으로 참조 무결성을 유지할 수 있지만,
    • DELETE, UPDATE 시 무결성 검사로 인해 성능이 저하될 수 있음
    • CASCADE 설정 시 의도치 않은 데이터 삭제 위험이 있음
  • 비즈니스 로직에서 FK 관계를 관리하는 것이 더 유연할 때 FK를 생략하고, KEY만 설정할 수 있다.
KEY `idx_a_id` (`a_id`),
KEY `idx_b_id` (`b_id`)

✅ 6. JSON을 활용한 요일 저장 및 조회 방법

  • 저장 형식:
    • ["MON", "TUE", "WED"] → WEEKLY 반복 요일
    • ["1", "15"] → MONTHLY 반복 날짜
SELECT
    CASE
        WHEN JSON_CONTAINS(report_days, '"MON"') THEN '월요일'
        WHEN JSON_CONTAINS(report_days, '"TUE"') THEN '화요일'
        WHEN JSON_CONTAINS(report_days, '"WED"') THEN '수요일'
    END AS repeat_day_kr
FROM report;

JSON을 쿼리에서 직접 파싱하여 한글 요일로 변환 가능하며,

애플리케이션에서 ObjectMapper 등을 활용해 변환할 수도 있다.

✅ 7. 계층형 데이터 조회 (부모-자식 관계 데이터 처리)

  • 특정 리소스를 선택했을 때 하위 데이터를 함께 조회하는 방법
    • JOIN을 활용한 조회 (부모 테이블과 자식 테이블 연결)
SELECT
    parent.id AS parent_id,
    child.id AS child_id
FROM parent_table parent
LEFT JOIN child_table child ON parent.id = child.parent_id
WHERE parent.id = '특정 ID';

    • 재귀 쿼리(CTE)를 활용하여 계층 구조 조회 (MySQL 8.0 이상 지원)
728x90
반응형

'Blog > TIL' 카테고리의 다른 글

2025-02-25 (화)  (0) 2025.02.25
2024-02-24 (월)  (0) 2025.02.24
2025-02-21 (금)  (0) 2025.02.21
2025-02-20 (목)  (0) 2025.02.20
2025-02-19 (수)  (0) 2025.02.19

댓글