JDBC
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
JDBC(Java Database Connectivity)는 자바 프로그래밍 언어를 사용하여 데이터베이스에 접근하기 위한 API이다. 썬 마이크로시스템즈는 1997년 2월, JDK 1.1의 일부로 JDBC를 처음 출시했으며, 이후 자바 SE의 일부로 포함되었다. JDBC는 java.sql 및 javax.sql 패키지를 통해 제공되며, 자바 커뮤니티 프로세스를 통해 지속적으로 발전해왔다. JDBC는 데이터베이스 연결, SQL 문 실행, 결과 처리 등의 기능을 제공하며, Statement, PreparedStatement, CallableStatement 클래스를 사용하여 SQL 문을 나타낸다. JDBC 드라이버는 자바 프로그램과 DBMS 간의 통신을 중개하며, 타입 1부터 타입 4까지 다양한 유형이 존재한다.
더 읽어볼만한 페이지
- 데이터베이스 API - 임베디드 SQL
임베디드 SQL은 호스트 프로그래밍 언어 내에 SQL 문을 삽입하여 데이터베이스와 상호 작용하는 기술로, 데이터베이스 액세스를 표준화하지만 보안 취약점과 이식성 저하의 단점도 가진다. - 데이터베이스 API - ODBC
ODBC는 응용 프로그램이 데이터베이스 관리 시스템에 접근하도록 하는 표준 API로서, 서로 다른 데이터베이스에 대한 접근 방식을 표준화하여 응용 프로그램이 데이터베이스 종류에 관계없이 동일한 코드로 데이터에 접근하도록 하며, 드라이버 관리자와 데이터베이스 시스템에 특화된 명령으로 변환하는 드라이버로 구성된다. - 자바 API - 자바 암호화 확장
- 자바 API - 표준 위젯 툴킷
표준 위젯 툴킷(SWT)은 자바 GUI 툴킷으로, 네이티브 룩앤필과 고성능을 위해 윈도 시스템의 그래픽 요소를 직접 사용하며, 이클립스 IDE의 기반 기술로 IBM에 의해 개발되었다.
| JDBC - [IT 관련 정보]에 관한 문서 | |
|---|---|
| 개요 | |
| 이름 | JDBC (Java Database Connectivity) |
| 종류 | 데이터 접근 API |
| 개발 | Oracle Corporation |
| 최신 릴리스 버전 | JDBC 4.3 |
| 최신 릴리스 날짜 | 2017년 9월 21일 |
| 운영 체제 | 크로스 플랫폼 |
| 웹사이트 | JDBC API 가이드 |
2. 역사
썬 마이크로시스템즈는 1997년 2월 19일 JDK 1.1의 일부로 JDBC를 처음 출시하였고[19], 이후 자바 SE에 포함되어 발전해왔다. JDBC 클래스는 `java.sql` 및 `javax.sql` 자바 패키지에 포함되어 있다. JDBC 3.1 버전부터는 자바 커뮤니티 프로세스(JCP)를 통해 개발되고 있다. JSR 54는 JDBC 3.0 (J2SE 1.4에 포함), JSR 114는 JDBC Rowset 추가, JSR 221은 JDBC 4.0 (Java SE 6에 포함)의 사양을 정의한다.[20] JDBC 4.1 (JSR 221 유지보수판 1, Java SE 7), JDBC 4.2 (JSR 221 유지보수판 2, Java SE 8), JDBC 4.3 (JSR 221 유지보수판 3, Java SE 9)으로 판올림되었다.
2. 1. JDBC API 역사
썬 마이크로시스템즈는 1997년 2월 19일 JDBC를 JDK 1.1의 일부로 출시하였다.[19] 그 뒤로 자바 SE의 일부가 되었다.JDBC 클래스는 자바 패키지 java.sql과 javax.sql에 포함되어 있다.
버전 3.1을 기점으로 JDBC는 자바 커뮤니티 프로세스를 통해 개발되고 있다. JSR 54는 JDBC 3.0을 규정(J2SE 1.4에 포함)하고, JSR 114는 JDBC Rowset addition을 규정하며, JSR 221은 JDBC 4.0의 사양(자바 SE 6에 포함됨)이다.[20]
JDBC 4.1은 JSR 221의 유지보수판 1에 규정되어 있고[21], 자바 SE 7에 포함되어 있다.[22]
JDBC 4.2는 JSR 221의 유지보수판 2에 규정되어 있고[23], 자바 SE 8에 포함되어 있다.[24]
JDBC 4.3은 JSR 221의 유지 관리 릴리스 3에 의해 지정되었으며[7] Java SE 9에 포함되어 있다.[8]
JDBC ( '자바 데이터베이스 연결')는 인터페이스 정의와 규격의 집합이다. 런타임 시 동일한 애플리케이션에서 이러한 인터페이스의 여러 구현이 존재하고 사용될 수 있다. JDBC API는 올바른 자바 패키지를 동적으로 로드하고 JDBC 드라이버 관리자(DriverManager)에 등록하는 메커니즘을 제공한다. JDBC 드라이버 관리자는 JDBC 연결을 생성하기 위한 팩토리로 사용된다.
3. 기능
JDBC 연결은 문을 생성하고 실행하는 것을 지원한다. SQL의 CREATE, INSERT, UPDATE, DELETE 와 같은 업데이트 문이나 SELECT와 같은 쿼리 문을 지원하며, 저장 프로시저를 호출할 수 있다. JDBC는 다음 클래스를 사용하여 문을 나타낸다.
INSERT, UPDATE, DELETE와 같은 업데이트 문은 정수로 데이터베이스에서 영향을 받은 행 수를 나타내는 업데이트 수를 반환한다.[2] 이러한 문은 다른 정보를 반환하지 않는다.
쿼리 문은 JDBC 행 결과 집합을 반환한다. 행 결과 집합은 결과 집합을 탐색하는 데 사용된다. 행의 개별 열은 이름 또는 열 번호로 검색된다. 결과 집합에는 행이 몇 개든 있을 수 있다. 행 결과 집합에는 열의 이름과 해당 유형을 설명하는 메타데이터가 있다.
에 기본적인 JDBC API의 확장이 있다.
JDBC 연결은 드라이버에서 직접 얻는 대신 연결 풀을 통해 관리되는 경우가 많다.[5]
3. 1. 지원 데이터베이스 타입
JDBC는 다양한 데이터베이스 시스템을 지원하며, 각 데이터베이스에 맞는 JDBC 드라이버를 통해 연결한다. 다음은 오라클 데이터베이스를 기준으로 JDBC에서 지원하는 자료형과 `setXXX()` 메서드의 예시이다.
| 오라클 자료형 | setXXX() 메소드 |
|---|---|
| CHAR | setString() |
| VARCHAR2 | setString() |
| NUMBER | setBigDecimal() |
setBoolean() | |
setByte() | |
setShort() | |
setInt() | |
setLong() | |
setFloat() | |
setDouble() | |
| INTEGER | setInt() |
| FLOAT | setDouble() |
| CLOB | setClob() |
| BLOB | setBlob() |
| RAW | setBytes() |
| LONGRAW | setBytes() |
| DATE | setDate() |
setTime() | |
setTimestamp() |
JDBC는 인터페이스 정의와 사양의 모음이므로, 런타임 시 동일한 애플리케이션에서 이러한 인터페이스의 여러 구현이 존재하고 사용될 수 있다. API는 올바른 자바 패키지를 동적으로 로드하고 JDBC 드라이버 관리자(DriverManager)에 등록하는 메커니즘을 제공한다. JDBC 드라이버 관리자는 JDBC 연결을 생성하기 위한 팩토리로 사용된다.
4. JDBC 드라이버
JDBC 드라이버는 자바 프로그램의 요청을 DBMS가 이해할 수 있는 프로토콜로 변환하는 클라이언트 측 어댑터이다. (서버가 아닌 클라이언트 컴퓨터에 설치) 대부분의 관계형 데이터베이스 서버에 대해 상용 및 무료 드라이버가 제공된다.[9]
JDBC를 이용하기 위해서는 100% Pure Java|퓨어 자바영어로 제작된 아파치 더비가 포함된 Java Platform, Standard Edition|자바 SE|Java SE영어 6 이후의 SDK[17]를 제외하고는 각 DBMS용 JDBC 드라이버를 준비해야 한다. 현재 개발이 진행 중인 대부분의 데이터베이스에서는 JDBC 드라이버가 제공된다.
JDBC 드라이버의 구체적인 종류와 동작 방식에 대해서는 하위 섹션에서 더 자세히 설명한다.
4. 1. JDBC 드라이버 타입
JDBC 드라이버는 자바 프로그램의 요청을 DBMS가 이해할 수 있는 프로토콜로 변환해주는 클라이언트 측 어댑터이다. (서버가 아닌 클라이언트 머신에 설치) 상용 및 자유 드라이버들은 대부분의 관계형 데이터베이스 서버로의 연결을 제공한다.JDBC 드라이버는 다음 네 가지 유형으로 분류된다.[9][10]
- 타입 1: JDBC-ODBC 브리지 드라이버
- 로컬에서 사용 가능한 ODBC 드라이버의 네이티브 코드를 호출한다.
- JDBC로부터의 쿼리 요청을 ODBC를 경유하여 전달하고, 데이터베이스에 액세스한다.
- ODBC 드라이버가 필수적이며, 하드웨어와 OS에 의존한다.
- Java Platform, Standard Edition|자바 SE|Java SE영어 7까지 표준으로 첨부된 드라이버였으나, Java 7에서는 비권장되었고, Java 8에서는 표준에서 삭제되었다.[18]
- 타입 2: 네이티브 API 드라이버
- 클라이언트 사이드의 데이터베이스 벤더 네이티브 라이브러리를 호출한다. 이 코드는 네트워크 상의 데이터베이스와 통신하게 된다.
- JDBC로부터의 쿼리 요청을 운영 체제상의 DLL이나 전용 라이브러리에 전달하고, 거기에서 데이터베이스에 액세스한다.
- 타입 1에 비해 계층이 얇아 속도 향상을 기대할 수 있고, TCP/IP에 의존하지 않는다는 장점이 있지만, 하드웨어와 운영 체제에 의존한다.
- 오라클의 경우 OCI 드라이버가 이에 해당한다.
- 타입 3: 네트워크 프로토콜 드라이버 (미들웨어 드라이버)
- 서버 사이드 미들웨어와 통신하는 순수 자바 드라이버로서, 이후에 데이터베이스와 통신한다.
- JDBC로부터의 쿼리 요청을 Java|자바영어로 기술된 드라이버 내에서 독자적인 프로토콜로 변환하여, 이를 애플리케이션 서버를 통해 데이터베이스에 액세스한다.
- 기종 및 데이터베이스 의존성 없이 가벼운 드라이버를 생성할 수 있지만, 중간 서버를 거치기 때문에 성능에 문제가 발생한다.
- 타입 4: 데이터베이스 프로토콜 드라이버 (순수 자바 드라이버)
- 데이터베이스 네이티브 프로토콜을 사용하는 순수 자바 드라이버이다.
- JDBC로부터의 쿼리 요청을 모두 Java|자바영어 상에서 처리한다.
- Java|자바영어상에 데이터베이스에 액세스하기 위한 모든 기능을 탑재하기 때문에 드라이버의 크기가 커지고, 성능이 약간 저하된다.
- 기본적으로 TCP/IP로만 사용할 수 있다는 등의 단점이 있지만, 하드웨어와 운영 체제에 의존하지 않아 이식성이 우수하다.
- 오라클의 경우 thin|씬영어 드라이버가 이에 해당한다.
타입 1, 타입 2는 DBMS의 DLL 파일이나 라이브러리 파일을 호출하는 형태이므로, JVM의 메모리 관리 외부가 된다. 타입 3, 타입 4는 JVM상에서 Java|자바영어의 클래스로 구현되어 있기 때문에 JVM상의 가비지 컬렉션의 대상이 되어 관리가 용이하며, 현재는 타입 4가 주류를 이루고 있다.
- 내부 JDBC 드라이버
- 자바 지원 SQL 데이터베이스의 JRE에 내장된 드라이버이다.
- 자바 저장 프로시저에 사용된다.
- 위의 분류 체계에 맞지 않지만, 데이터베이스 자체가 자바로 구현되었는지 여부에 따라 타입 2 또는 타입 4 드라이버와 유사하다.
- Oracle RDBMS와 함께 제공되는 KPRB(Kernel Program Bundled) 드라이버가 그 예시이다.[10]
- "jdbc:default:connection"은 이러한 연결을 만드는 비교적 표준적인 방법을 제공한다(최소한 Oracle 데이터베이스와 아파치 더비가 이를 지원한다).
- 내부 JDBC 드라이버의 경우, JDBC 클라이언트는 실제로 액세스 중인 데이터베이스의 일부로 실행되므로 네트워크 프로토콜을 통하지 않고 직접 데이터에 액세스할 수 있다.
4. 2. 드라이버 관리
JDBC 드라이버 매니저는 여러 개의 JDBC 드라이버를 동시에 사용할 수 있도록 관리한다. JDBC를 사용하는 사용자는 JDBC 드라이버를 로드하고, JDBC 드라이버 매니저를 사용하여 데이터베이스 드라이버를 얻어 데이터베이스와 연결하고, 데이터베이스 애플리케이션을 기술하게 된다.[17]JDBC 4.0부터는 드라이버 자동 해결 기능이 제공되어 `DriverManager.getConnection("jdbc:subprotocol:subname" 형식의 데이터베이스 URL)` 메서드를 사용할 수 있다. 이러한 메서드를 이용할 경우 컴파일러에 의한 해당 드라이버의 의존성 검사가 이루어지지 않으므로, 컴파일 시 드라이버를 미리 참조할 수 있도록 설정할 필요가 없는 등의 장점이 있다.[17]
또한, Java|자바영어의 객체 지향 언어의 특성을 살려, 각 드라이버는 JDBC의 기본 API에 없는 기능을 함께 제공할 수도 있다. 예를 들어, 초기 오라클의 Oracle Database|오라클 데이터베이스영어 (Oracle 8영어)용 JDBC 드라이버는 당시 JDBC API가 BLOB, CLOB를 지원하지 않았기 때문에, 자체적으로 기능 확장을 통해 BLOB와 CLOB를 지원했다.[17]
5. 예제
자바 애플리케이션에서 데이터베이스 연결이 필요할 때, `DriverManager.getConnection()` 메소드 중 하나를 사용하여 JDBC 연결을 생성한다. 사용되는 URL은 특정 데이터베이스와 JDBC 드라이버에 따라 다르다. URL은 "jdbc:" 프로토콜로 시작하지만, 나머지는 벤더에 따라 다르다.
Connection conn = DriverManager.getConnection(
"jdbc:somejdbcvendor:other data needed by some jdbc vendor",
"myLogin",
"myPassword" );
try {
/* you use the connection here */
} finally {
//It's important to close the connection when you are done with it
try { conn.close(); } catch (Throwable e) { /* Propagate the original exception
instead of this one that you want just logged */ logger.warn("Could not close JDBC Connection",e); }
}
자바 SE 7부터는 `try-with-resources` 문을 사용하여 위의 코드를 더 간결하게 만들 수 있다.
try (Connection conn = DriverManager.getConnection(
"jdbc:somejdbcvendor:other data needed by some jdbc vendor",
"myLogin",
"myPassword" ) ) {
/* you use the connection here */
} // the VM will take care of closing the connection
연결이 확립되면 다음과 같이 문을 작성할 수 있다.
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );
}
`Connection`, `Statement`, `ResultSet`은 운영 체제 리소스(소켓, 파일 디스크립터)나 원격 데이터베이스 서버의 리소스(예: 열려있는 `ResultSet`에 대한 커서)와 묶이는 경우가 많다. 따라서 역할을 다 한 JDBC 객체는 `close()` 메소드를 사용하여 즉시 닫는 것이 중요하다. 가비지 수집에 의존해서는 안 된다. 위의 `try-with-resources` 구문은 이러한 문제를 해결하는 코드 패턴이다.
데이터는 데이터베이스 쿼리를 통해 검색된다. 아래 예제는 statement를 생성하고 쿼리를 실행한다.
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM MyTable")
) {
while (rs.next()) {
int numColumns = rs.getMetaData().getColumnCount();
for (int i = 1; i <= numColumns; i++) {
// 열 번호는 1부터 시작합니다.
// 또한 열을 특정 유형으로 반환하는 ResultSet에 많은 메소드가 있습니다.
// 유효한 변환 목록은 Sun 문서를 참조하십시오.
System.out.println( "COLUMN " + i + " = " + rs.getObject(i));
}
}
}
다음은 `PreparedStatement` 쿼리 예제이다.
try (PreparedStatement ps =
conn.prepareStatement("SELECT i.*, j.* FROM Omega i, Zappa j WHERE i.name = ? AND j.num = ?")
) {
// 준비된 SQL 문에서 각 물음표는
// "set" 메소드 호출을 통해 제공해야 하는 값으로 대체되어야 하는 자리 표시자입니다.
// 다음 두 메소드 호출은 두 자리 표시자를 대체합니다. 첫 번째는
// 문자열 값으로 대체되고 두 번째는 정수 값으로 대체됩니다.
ps.setString(1, "Poor Yorick");
ps.setInt(2, 8008);
// ResultSet, rs는 SQL 문 실행의 결과를 전달합니다.
// rs.next()를 호출할 때마다 내부 행 포인터 또는 커서가
// 결과의 다음 행으로 이동합니다. 커서는 처음에
// 첫 번째 행 앞에 위치합니다.
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
int numColumns = rs.getMetaData().getColumnCount();
for (int i = 1; i <= numColumns; i++) {
// 열 번호는 1부터 시작합니다.
// 또한 열을 특정 유형으로 반환하는 ResultSet에 많은 메소드가 있습니다.
// 유효한 변환 목록은 Sun 문서를 참조하십시오.
System.out.println("COLUMN " + i + " = " + rs.getObject(i));
} // for
} // while
} // try
} // try
데이터베이스 작업 실패 시 JDBC는 `SQLException`을 발생시킨다.
다음은 데이터베이스 트랜잭션 예제이다.
boolean autoCommitDefault = conn.getAutoCommit();
try {
conn.setAutoCommit(false);
/* 여기서 conn에 대해 트랜잭션 방식으로 문을 실행합니다 */
conn.commit();
} catch (Throwable e) {
try { conn.rollback(); } catch (Throwable e) { logger.warn("트랜잭션을 롤백할 수 없습니다", e); }
throw e;
} finally {
try { conn.setAutoCommit(autoCommitDefault); } catch (Throwable e) { logger.warn("AutoCommit 설정을 복원할 수 없습니다",e); }
}
`CallableStatement` (데이터베이스 저장 프로시저 호출) 예제는 JDBC API 가이드 문서를 참조한다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class Mydb1 {
static String URL = "jdbc:mysql://localhost/mydb";
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(URL, "root", "root");
Statement stmt = conn.createStatement();
String sql = "INSERT INTO emp1 VALUES ('pctb5361', 'kiril', 'john', 968666668)";
stmt.executeUpdate(sql);
System.out.println("Inserted records into the table...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
6. Java와 데이터베이스
대규모 시스템 개발에서 Java를 사용한 응용 소프트웨어 개발이 일반화된 계기는 관계 데이터베이스에 대한 액세스를 Java에서 수행하는 JDBC가 발표되면서부터이다.[1]
Java로 대규모 엔터프라이즈 시스템을 개발하기 위한 사양인 Jakarta EE에는 관계 데이터베이스의 테이블의 행 데이터를 Java의 객체에 1:1로 대응시키고, 객체 내용의 영속성(행 데이터 저장)과 객체의 메서드 호출(데이터베이스로의 트랜잭션 처리)을 동기화하는 특수한 자바 빈즈를 동작·관리하는 기구인 "엔터프라이즈 자바 빈즈"의 "엔티티 빈"이 도입되었다.[1]
EJB 2.1까지는 객체-관계 임피던스 불일치로 인해 관계 데이터베이스의 기능을 충분히 활용하지 못하고 성능 면에서 문제가 있었지만, EJB 3.0 이후의 사양으로 개선되었다.[1]
EJB 3.2에서 "엔티티 빈"이 폐지되고, Java SE 및 Java EE(현재 Jakarta EE) 공통용 독립적인 영속성 프레임워크인 Java Persistence API(JPA)로 발전했다.[1]
7. JDBC 드라이버 공급
오라클은 [http://www.oracle.com/technetwork/java/index-136695.html JDBC 드라이버 및 공급업체 목록]을 제공한다. 심바 테크놀로지스는 외부 데이터 소스의 사용자 정의 JDBC 드라이버를 개발할 수 있는 SDK를 출시하고 있다. CData Software는 [https://www.cdata.com/jp/jdbc/ 다양한 애플리케이션, 데이터베이스, 웹 API의 타입 4 JDBC 드라이버]를 출시하고 있다.
참조
[1]
웹사이트
Sun Ships JDK 1.1 -- Javabeans Included
http://www.sun.com/s[...]
Sun Microsystems
1997-02-19
[2]
웹사이트
JDBC API Specification Version: 4.0
http://java.sun.com/[...]
[3]
웹사이트
The Java Community Process(SM) Program - communityprocess - mrel
http://jcp.org/about[...]
2018-03-22
[4]
웹사이트
JDBC 4.1
http://docs.oracle.c[...]
2018-03-22
[5]
웹사이트
The Java Community Process(SM) Program - communityprocess - mrel
https://jcp.org/abou[...]
2018-03-22
[6]
웹사이트
JDBC 4.2
http://docs.oracle.c[...]
2018-03-22
[7]
웹사이트
The Java Community Process(SM) Program - communityprocess - mrel
https://jcp.org/abou[...]
2018-03-22
[8]
웹사이트
java.sql (Java SE 9 & JDK 9)
http://docs.oracle.c[...]
2018-03-22
[9]
웹사이트
Java JDBC API
https://docs.oracle.[...]
2018-03-22
[10]
서적
Oracle Essentials: Oracle Database 10g
https://books.google[...]
O'Reilly Media, Inc.
2016-11-03
[11]
웹사이트
JDBC Drivers - CData Software
http://www.cdata.com[...]
2018-03-22
[12]
웹사이트
JDBC Drivers - CData Software
http://www.rssbus.co[...]
2018-03-22
[13]
웹사이트
New Type 5 JDBC Driver — DataDirect Connect
http://www.datadirec[...]
[14]
웹사이트
Access External Databases from RPG with JDBCR4 Meat of the Matter
http://iprodeveloper[...]
2016-04-12
[15]
웹사이트
SchemaCrawler
https://github.com/s[...]
[16]
웹사이트
Java JDBC API
https://docs.oracle.[...]
[17]
문서
JavaDB (Apache Derby) は、エンドユーザ向けのJREには同梱されないため、アプリケーションとともに再配布する必要がある。
[18]
웹사이트
http://docs.oracle.c[...]
[19]
웹인용
Sun Ships JDK 1.1 -- Javabeans Included
http://www.sun.com/s[...]
Sun Microsystems
1997-02-19
[20]
웹사이트
JDBC API Specification Version: 4.0
http://java.sun.com/[...]
[21]
웹사이트
JSR-000221 JDBC API Specification 4.1 (Maintenance Release 1)
http://jcp.org/about[...]
[22]
웹사이트
http://docs.oracle.c[...]
[23]
웹사이트
JSR-000221 JDBC API Specification 4.2 (Maintenance Release 2)
https://jcp.org/abou[...]
[24]
웹사이트
http://docs.oracle.c[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com