본문 바로가기
SpringBoot/JPA

[JPA] 자바 영속성 어노테이션 알아보기

by devebucks 2020. 7. 5.
728x90

 강의를 들으면서, JPA @Entity를 선언해준 클래스에서 ProfileImg라는 객체에 다음과 같은 어노테이션을 사용하는 것을 처음 본 저는, 이 어노테이션들에 대해서 조사를 해 보았습니다.

 

what the ...

 

참고 : https://www.baeldung.com/jpa-basic-annotation#basic-vs-column

 

1. @Lob

Large OBject의 줄임말인 어노테이션입니다. 필드에 특정 문자열 길이를 지정하지 않는다면 Default로 varchar(255)까지 저장할 수 있지만, 사진을 저장하는 칼럼으로 사용할 경우에는 더많은 자리수를 사용하기 때문에, @Lob 어노테이션으로 Large Object를 데이터베이스에 적절하게 저장합니다.

 

 사용 예로, 사진을 DB에 저장할 경우 byte array로 변환해서 저장하게 되면, 사람이 알아볼 수 없는 형식의 문자로 엄청 길게 변환되기 때문에 이를 데이터베이스 Column에 저장하려고 @Lob를 사용합니다.

참조 : https://www.baeldung.com/hibernate-lob

 

 

2. @Basic

 

2.1 Optional annotation이라 필수적으로 명시해야 하는 어노테이션이 아닙니다.

 

 

2.2 @Basic 어노테이션은 왜 쓰나요?(feat. doc)

두 가지 목적이 있습니다. 

  •  첫번째 목적은 null이 가능한지를 옵션으로 줄 수 있습니다. 기본은 null을 허용하는 true입니다.
  •  두번째 목적은 Fetch 속성을 'lazily loaded' 와'eagerly fetched' 중 하나를 명시할 목적입니다. 기본은           FetchType.EAGER입니다.

2.3 @Basic 사용법

@Basic(optional = false) : JPA Entity field가 null을 허용하지 않습니다. == Not Null

@Basic(fetch = FetchType.LAZY) :  패치 타입이 기본 설정 값이 FetchType.EAGER가 아닌 lazily loaded를 설정합니다.

 

 

 

3. @Basic과 @Column의 차이점

위의 내용을 좀 정리하자면...

@Basic @Column
- @Basic의 속성은 JPA entities에 적용됩니다.

- @Basic(optional = false) -> JPA entity field의 null 허용여부를 결정합니다.

- layily loaded와 eagerly fetch를 옵션으로 줄 수 있습니다.
- @Column의 속성은 Database 컬럼에 적용됩니다.

- 데이터베이스의 column이 null을 허용하면, @Column의 필드 역시 null을 허용합니다. @Column은 선택권이 없습니다.

- 데이터베이스에 어느 column과 매핑될 이름을 명시할 수 있게 해줍니다.

 

 

참고로... @Column의 사용 예입니다. @Column에서 옵션 name으로 데이터베이스의 실제 컬럼 이름인 USER_ID를 매핑해주는 설정입니다.

 

728x90

댓글