◼︎ 환경
- Model : MacBook Pro (14-inch, 2021)
- CPU : Apple M1 Pro
- MENORY : 16GB
- DISK : 512 GB SSD
- OS : macOS 13.2.4 (22F66)
- TOOLS : Visual Studio Code, Java 11, Gradle, Docker
- Version Control : GitHub
- Programming Language : Java
- Framework : Spring Boot 2.7.12
- DBMS : MySql 8.0.33
1. BLOB 바이너리 데이터
- 바이너리 데이터를 저장할 엔터티를 생성.
- @Lob 어노테이션을 사용하여 바이너리 데이터 속성을 매핑
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
@Entity
public class User {
@Id
@Column(name = "USER_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId;
@Column(name = "NAME")
private String name;
@Lob
@Column(name = "IMAGE")
private byte[] image;
}
과거 JDBC 프로그래밍의 경우는 성능 이슈가 있어 바이트 배열이 아닌 스트림을 사용했는데 JPA 에서 역시 바이트 배열 이 아닌 스트림을 사용하여 처리할 수 있다.
- image 변수의 타입을 byte[] 가 아닌 Blob 타입으로 정의한다.
- 엔터티를 저장하거나 image 데이터를 꺼내는 경우 추가적으로 Blob 을 처리하는 코드를 추가한다.
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.sql.Blob;
@Entity
public class User {
@Id
@Column(name = "USER_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId;
@Column(name = "NAME")
private String name;
@JsonIgnore
@Lob
@Column(name = "IMAGE")
private Blob image;
}
Spring Data JPA 의 경우 디폴트로 hibernate 을 사용하기 때문에 Blob 데이터는 hibernate 에서 제공하는 BlobProxy 클래스를 사용하여 생성하면 된다.
Blob blob = org.hibernate.engine.jdbc.BlobProxy.generateProxy(
FileUtils.openInputStream(file), FileUtils.sizeOf(file));
user.setImage(new AvatarImageData(imageToUse.getAvatarImageId(), blob ));
Blob 데이터는 아래와 같이 사용하면 된다.
User user = ...
File file = ...
InputStream inputStream = user.getImage().getBinaryStream();
FileUtils.copyInputStreamToFile(inputStream, file);
2. CLOB 장문 텍스트
@Column(name = "BODY", nullable = false)
@Lob
private String body ;
참고자료
- Mapping BLOBs and CLOBs with Hibernate and JPA
- How to stream large Blob from database to application using JPA?
댓글 없음:
댓글 쓰기