6.1 ์„œ๋ฒ„์— ํŒŒ์ผ ์ €์žฅ

์ด์ง„ ๊ฐœ์ฒด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ํฌ๋ฉด ๋””์Šคํฌ์˜ ๋ณ„๋„ ํด๋”์— ์ €์žฅํ•˜๊ณ  ๊ฒฝ๋กœ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ์˜ˆ:

c:\db-files\users\12355\avatar.jpg

๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ํŒŒ์ผ์— ๋Œ€ํ•œ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋งŒ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

\12355\avatar.jpg

URL์„ ์‰ฝ๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

https://storage.codegym.cc/users/12355/avatar.jpg

์„œ๋ฒ„ ์ด๋ฆ„์— ๋Œ€ํ•œ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋งŒ ํ•˜๋ฉด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

6.2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ์ด๋ฏธ์ง€ ์ €์žฅ

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ฆผ์ด ์ž‘์€ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ์ €์žฅํ•˜๊ณ  ๋ฐ”์ดํŠธ ์ง‘ํ•ฉ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์— ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ SQL์—๋Š” ํŠน๋ณ„ํ•œ BLOB ๋ฐ์ดํ„ฐ ์œ ํ˜• ์ธ Binary Large Object๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์˜คํžˆ๋ ค ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • CLOB - ๋ฌธ์ž ๋Œ€ํ˜• ๊ฐ์ฒด,
  • BLOB - ์ด์ง„ ๋Œ€ํ˜• ๊ฐ์ฒด.

CLOB๋Š” ๋งค์šฐ ํฐ ํ…์ŠคํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. BLOB๋Š” ์ž‘์€ ์‚ฌ์ง„, ๋น„๋””์˜ค ๋“ฑ๊ณผ ๊ฐ™์€ ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ:

@Entity
@Table(name="user")
public class User {

    @Id
    private String id;

	@Column(name = "name", columnDefinition="VARCHAR(128)")
    private String name;

	@Lob
	@Column(name = "photo", columnDefinition="BLOB")
    private byte[] photo;

	// ...
}

์ฃผ์„์€ Large Object๊ฐ€@Lob ํ•„๋“œ์— ์ €์žฅ๋˜์–ด ์žˆ์Œ ์„ Hibernate์—๊ฒŒ ์•Œ๋ ค์ค๋‹ˆ๋‹ค . ๊ทธ๋ฆฌ๊ณ  ์ด๋ฏธ ๋ชจ๋“  ๊ฒƒ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.columnDefinition="BLOB"

์ƒˆ ์‚ฌ์šฉ์ž์™€ ๊ทธ์˜ ์‚ฌ์ง„์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š” ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

byte[] imageBuffer = Files.readAllBytes(Paths.get("C:/temp/avatar.png"))

User user = new User();
user.setId("1");
user.setName("Zapp");
user.setPhoto(imageBuffer);

session.persist(user);

6.3 XML๊ณผ JSON

Hibernate๋Š” JSON์„ ๋ฐ์ดํ„ฐ ์œ ํ˜•์œผ๋กœ ํฅ๋ฏธ๋กญ๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์˜ HashMap์„ ๋‹จ์ผ JSON ๊ฐœ์ฒด๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DBMS๊ฐ€ JSON๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@JdbcTypeCode(SqlTypes.JSON)
private Map<String, String> properties;

Hibernate๋Š” ์œ ํ˜• ๊ฐ์ฒด๊ฐ€ Map<String, String>๋‹จ์ผ JSON ๊ฐ์ฒด๋กœ ์ง๋ ฌํ™”๋˜๋„๋ก ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ์ฒด๋ฅผ ์ฝ์„ ๋•Œ JSON ๊ฐ์ฒด๋ฅผ Map<String, String>.

Hibernate๋Š” XML๋กœ ๋น„์Šทํ•œ ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

@JdbcTypeCode(SqlTypes.SQLXML)
private Map<String, String> properties;