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 |
댓글