본문 바로가기

study/인턴일지

[CLOB/DTO/데이터베이스] CLOB으로 DB에 저장하기

게시판에 추가로 문의하는 칸 만드는 작업 중에

본내용을 DB에 저장할 때 조금 큰 사진을 첨부하면 저장이 안되었다.

크기가 너무 커서 varchar2로는 저장이 불가능했고 원글의 내용을 저장하는 데이터형을 보니

CLOB을 사용했다.

먼저 CLOB이란

CLOB

- 사이즈가 큰 데이터를 외부 파일로 저장하기 위한 데이터 타입

- 문자열 데이터를 DB외부에 저장하기 위한 타입

- CLOB타입은 SQL문에서 문자열 타입으로 입출력 값을 표현한다. 즉, varchar, char타입과 호환이 됨

 

 

 

그냥 크기가 큰 문자열 데이터 형이라고 이해하였다.

사진은 어떻게 저장이 되냐면 summerNote 편집기를 사용하여 <img='url'>이런 문자형식으로 저장이 된다.

 

 

우리 회사는 myBatis로 mapper문을 작성하여 DB에 글을 작성하거나 삭제할 수 있는데

일반 데이터형은 그냥 insert문을 사용하면 데이터 삽입이 가능하다.

그러나 CLOB은 따로 처리해주어야하는데

mapper에 insert문은 다른 부분과 똑같이 적어준다

INSERT 
  INTO TABLE_NAME
       ( 
           COLUMN1,
           COLUMN2         
           content 
       ) 
       VALUES 
       ( 
           #{data}, 
           #{data},
           #{content}
       )	

여기서 content가 CLOB을 사용할 데이터이다.

mapper문에 이렇게 적으면 service에 DTO를 작성해주어야한다.

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Lob;
import javax.persistence.Table;

@Entity
@Table(name="TABLE_NAME")
@IdClass(TABLE_NAME.class)
public class TABLE_NAME {

	@Id
	private Long column1;
	
	@Id
	private Long column2;
	
	@Column
	@Lob
	private String content;
    
    public Long getColumn1() {
		return column1;
	}
	public void setcolumn1(Long column1) {
		this.column1 = column1;
	}
    
	 public Long getColumn2() {
		return column2;
	}
	public void setcolumn2(Long column2) {
		this.column2 = column2;
	}
	
    public String getContent() {
		return content;
	}
    public void setContent(String content) {
		this.content = content;
	}
    }

@Lob 어노테이션을 사용하여 CLOB임을 알려준다

DTO를 작성하기 전에 오류가 떴는데 DTO 작성 후에는 저장이 잘 되었다..ㅎ