본문 바로가기
spring

JPA @Embedded, @Lob, 생성자

by 오우지 2022. 1. 15.

@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 

https://kogle.tistory.com/250

 

 

+

@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를 설정해주면 의미있는 객체만 생성할 수 있게된다.

 

출처

https://cobbybb.tistory.com/14#--%--%--NoargsConstructor-AccessLevel-PROTECTED-%EC%--%--%--%--Builder%EB%A-%BC%--%ED%--%A-%EA%BB%--%--%EC%--%AC%EC%-A%A-%ED%--%--%EB%A-%B-%--%EC%A-%--%--%EB%-D%--%--%EA%B-%--%EB%-B%A-%ED%--%--%EC%A-%--%--%EC%--%-A%EC%-D%--%EA%B-%-C

 

 

 

 

'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