@Embedded
1. 새로운 값 타입을 직접 정의할 수 있다.
2. 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함
3. int, String과 같은 값 타입
@Embeddable: 값 타입을 정의하는 곳에 표시
@Embedded: 값 타입을 사용하는 곳에 표시
기본생성자 필수.
장점:
1. 재사용 가능
2. 높은 응집도
3. Period.isWork()처럼 해당 값 타입만 사용하는 의미 있는 메소드를 만들 수 있음.
4. 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명 주기를 의존함.
매핑하는 테이블은 같지만 예를 들어 Address만으로 메서드를 만들면 활용도가 높아진다.
객체와 테이블을 세밀하게 매핑할 수 있다.
만약 한 테이블 안에서 주소를 두개 가져가야 한다면 이름을 오버라이딩 해주는 @AttributeOverrides를 사용해서 이름을 재정의 해주면 된다.
@Lob
255 이상의 문자를 저장하고 싶을 때 사용한다.
CLOB은 문자기반 데이터를 저장하는데 사용된다.
BLOB은 binary 데이터를 저장하는데 사용된다.
Lob에 대해 BLOB인지 CLOB인지는 Spring의 추론으로 이뤄진다.
String과 char를 기본으로 하는 타입을 제외하면 BLOB으로 저장된다.
https://www.inflearn.com/course/ORM-JPA-Basic/lecture/21713?tab=curriculum&volume=1.00&quality=auto
+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
코드들을 보면 위와같이 많이 사용하는데 왜 그렇게 하는지 궁금했다.
기본 생성자의 접근 제어를 PROTECTED로 설정해놓으면 무분별한 객체 생성에 대해 체크할 수 있다.
/// User.java
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User {
private String name;
private Long age;
private String email;
public User(Long age, String email) {
/// 파라미터가 두 개인 경우 name은 default 설정
this.name = "blank name";
this.age = age;
this.email = email;
}
}
/// Main.java
public static void main(String[] args) {
User user = new User(15, "test@a.com");
/// 기본 생성자가 없고 객체가 지정한 생성자를 사용해야하기 때문에
/// 무조건 완전한 상태의 객체가 생성되게 된다.
}
위의 코드를 보면 컴파일 레벨에서 데이터의 누락을 방지할 수 있어서 무조건 완전한 상태의 객체를 만들 수 있다.
@Builder는 기본적 Class의 기능과 같이
생성자가 없을 경우 모든 변수를 파라미터로 받는 기본 생성자를 만들고
생성자가 있을 경우 생성자를 생성하지 않는데
만약 @NoArgsConstructor(access = AccessLevel.PROTECTED)에 @Builder를 함께 사용하게 되면 NoArgs에 의해 빈 생성자만 생기게 되고 Builder 패턴을 사용하기 위한 AllArgsConstructor가 존재하지 않기 때문에 에러가 뜨게 된다.
이는 간단하게 @AllArgs 어노테이션 추가로 해결할 수 있고 혹은 생성자에만 @Builder를 설정해주면 의미있는 객체만 생성할 수 있게된다.
출처
'spring' 카테고리의 다른 글
MVC-2 message, validation (0) | 2022.02.11 |
---|---|
HTTP 웹 기본지식 - 1 (0) | 2022.02.04 |
스프링 기본편 복습 - 2 (0) | 2022.01.28 |
스프링 기본편 복습 - 1 (0) | 2022.01.23 |
Optional, JPA N + 1, fetch (0) | 2021.11.26 |