ResultSetMetaData. 그리고 getColumnLabel() 과 getColumnName()

랏 뜨·2024년 12월 5일

🔎 Overview

 필자는 여태껏 ResultSet에서 받은 값의 메타데이터를 사용할 때, 맵의 키로써 getColumnName()를 주로 사용했다.
그런데 다른 사람의 코드를 살펴보니 getColumnLabel() 이라는 메서드를 나와 같은 목적으로 사용하고 있었다.

  이 둘의 차이는 무엇이며, 추가로 메타데이터의 메서드는 각각 어떤 역할을 맡을까?


1️⃣ getColumnLabel()

  • SQL 쿼리에서 AS 로 지정된 별칭(레이블, 알리아스) 을 반환
  • SQL 쿼리의 결과를 별칭 기반으로 다룰 때 사용

ex)

SELECT name AS myName FROM myTable;
  • 이 테이블을 대상으로 getColumnLabel(1) 을 사용하면 별칭인 'myName'을 반환
  • 만약 별칭이 없다면 기본 테이블명인 'name'을 반환

2️⃣ getColumnName()

  • 데이터베이스 테이블에 정의된 실제 컬럼의 이름을 반환
  • SQL 쿼리의 결과를 실제 테이블 컬럼 이름으로 가져올 때 사용

ex)

SELECT name AS myName FROM myTable;
  • 이 테이블을 대상으로한 getColumnName(1) 은 항상 'name'을 반환

🔎 정리

  • 공통점
    • 테이블로부터 컬럼에 지정된 이름을 반환

  • 차이점
    • getColumnLabel()
      • SQL 쿼리에서 지정된 별칭 값을 반환
      • 별칭 사용 여부에 따라 동적으로 달라질 수 있음
    • getColumnName()
      • DB에 저장된 실제 컬럼 이름을 반환
      • 항상 일정하게 테이블에 정의된 실제 컬럼 이름을 반환

📕 ResultSetMetaData

  • ResulSet의 메타데이터(결과 집합의 구조적 정보)를 제공하는 객체
  • 컬럼 이름, 데이터 타입, 컬럼 개수 등의 메타데이터를 동적으로 얻을 수 있음

📚 ResultSetMetaData 사용법,

     그외 주로 사용하는 메서드

사용법

ResultSet rs = stmt.executeQuery()	// stmt는 이미 있다고 가정
ResultSetMetaData metaData = rs.getMetaData();
  • ResultSet에서 getMetaData() 메서드를 이용해서 메타데이터를 받아올 수 있음

종류

1. getColumnCount()

int columnCount = metaData.getColumnCount();
  • ResultSet에 포함된 컬럼의 개수를 반환
  • 매핑할 횟수를 결정하기 위해 주로 사용

2. getColumType(int column)

int columnType = metaData.getColumnType(1);
  • 특정 컬럼의 SQL 데이터 타입을 반환
  • 반환 값은 java.sql.Types 클래스의 상수
  • EX)
    • Types.INTEGER , Types.BIGINT , Types.BOOLEAN , Types.TIMESTAMP ...

3. getColumnTypeName(int column)

int columnTypeName = metaData.getColumnTypeName(1);
  • 특정 컬럼의 데이터 타입 이름(SQL 표준 이름)을 반환
  • EX)
    • column = 1 -> INTEGER , column = 2 -> VARCHAR ...

4. getColumnDisplayName(int column)

int displaySize = metaData.getColumnDisplaySize(1);
  • 특정 컬럼의 데이터가 출력될 때 사용되는 최대 크기(문자 길이)를 반환
  • EX)
    • VARCHAR(255) -> 255 , INTEGER -> 10 ...

5. isNullable(int column)

int isNullable = metadata.isNullable(1);
  • 특정 컬럼이 NULL 값을 허용하는지 반환
  • 반환 값 이해
    • ResultSetMetaData.columnNullable -> NULL 허용
    • ResultSetMetaData.columnNoNulls -> NULL 비허용
    • ResultSetMetaData.columnNullableUnknown -> NULL 허용 여부 알 수 없음

6. isAutoIncrement(int column)

boolean isAutoIncrement = metaData.isAutoIncrement(1);
  • 특정 컬럼이 auto_increment 속성을 가지고 있는지 반환

🤔 JDBC에서 컬럼의 인덱스는 왜 '1' 부터 시작할까?

  • 매핑 작업에서의 혼란을 방지하기 위해서
    • JDBC에서 '0' 은 유효한 컬럼 인덱스가 아님
      • ResultSet 이나 ResultSetMetaData 에서 0번 컬럼을 파라미터로 넣고 호출하면 SQLException 발생
    • SQL 컬럼 번호와 0 부터 시작하는 프로그래밍 언어(java ...)의 배열 인덱스를 섞어서 사용할 경우 혼란이 발생할 수 있음
      • java 같은 프로그래밍 언어의 배열 및 컬렉션 인덱스는 보통 0 부터 시작
      • 하지만 SQL 에서는 컬럼 번호가 1 부터 시작해야 함
      • 서로를 참조하는 과정에서 혼란이 발생할 가능성 존재
    • JDBC는 SQL의 컬럼 번호를 따라가도록 하여 이러한 혼란을 미연에 방지
    • 따라서 JDBC는 SQL의 컬럼 번호와 동일하게 1 부터 시작

참고) OpenAI. (2024).ChatGPT(4o)[Large language model].https://chatgpt.com/

profile
기록

0개의 댓글