강의를 들으면서, JPA @Entity를 선언해준 클래스에서 ProfileImg라는 객체에 다음과 같은 어노테이션을 사용하는 것을 처음 본 저는, 이 어노테이션들에 대해서 조사를 해 보았습니다.
참고 : 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를 사용합니다.
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를 매핑해주는 설정입니다.
'SpringBoot > JPA' 카테고리의 다른 글
JPA로 객체를 가져올 때 LazyLoading을 만난 썰 (0) | 2020.09.27 |
---|---|
LazyLoading의 value를 단위테스트에서 확인하는 방법 (0) | 2020.09.26 |
다대다관계에서 ORM하는 법 (0) | 2020.09.11 |
댓글