본문 바로가기

카테고리 없음

@Builder 역할

 

-> 이전에 하듯이, new로 첫 생성하고, setName(), setPassword(어쩌고) 

이런식으로 하지 않고, 깔끔하게 생성해주는 역할인듯.

 

 이런식으로.

 

유연성 부분에서아주 좋다. 내 경험상! 

 

 

주어진 `Member` 클래스는 엔티티 클래스이며, Lombok 어노테이션을 사용하여 일부 메서드와 생성자를 자동으로 생성합니다. 이 클래스는 데이터베이스 테이블과 매핑되며, 여러 필드를 포함하고 있습니다. 클래스의 각 부분을 자세히 살펴보겠습니다.

### 클래스 선언과 어노테이션

```java
@Getter
@Entity
@Table(name = "member")
@NoArgsConstructor(access = PROTECTED)
public class Member extends BaseTimeEntity {
```

- `@Getter`: Lombok 어노테이션으로, 모든 필드에 대해 getter 메서드를 자동으로 생성합니다.
- `@Entity`: JPA 어노테이션으로, 이 클래스가 데이터베이스 테이블과 매핑됨을 나타냅니다.
- `@Table(name = "member")`: 이 엔티티가 `member` 테이블과 매핑됨을 지정합니다.
- `@NoArgsConstructor(access = PROTECTED)`: Lombok 어노테이션으로, 매개변수가 없는 기본 생성자를 생성합니다. `access = PROTECTED`로 설정되어 있어 외부에서 직접 인스턴스화할 수 없고, 서브클래스에서만 호출할 수 있습니다.
- `extends BaseTimeEntity`: `BaseTimeEntity` 클래스(아마도 생성 시간과 수정 시간을 추적하는 클래스)를 상속합니다.

### 필드 선언과 어노테이션

```java
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;

@Column(name = "name", nullable = false, unique = false, length = 20)
private String name;

@Column(name = "email", nullable = false, unique = true, length = 20)
private String email;

@Embedded
private Phone phone;

@Embedded
private Password password;

@Column(name = "is_male", nullable = false, unique = false)
private Boolean isMale;

@Enumerated(value = STRING)
@Column(name = "authority", nullable = false, unique = false)
private Authority authority;
```

- `@Id`: 이 필드가 엔티티의 기본 키임을 나타냅니다.
- `@GeneratedValue(strategy = IDENTITY)`: 기본 키가 데이터베이스에 의해 자동으로 증가함을 나타냅니다.
- `@Column`: 필드를 테이블의 열과 매핑합니다. 다양한 속성을 통해 제약 조건을 지정할 수 있습니다 (예: `nullable`, `unique`, `length` 등).
- `@Embedded`: 다른 임베디드 객체를 포함하여 값 객체를 나타냅니다.
- `@Enumerated(value = STRING)`: 열거형 필드를 문자열 형태로 데이터베이스에 저장합니다.

### 빌더 패턴과 생성자

```java
@Builder
public Member(
        Long id, String name, String email, String phone, String password, Boolean isMale, Authority authority
) {
    this.id = id;
    this.name = name;
    this.email = email;
    this.phone = new Phone(phone);
    this.password = new Password(password);
    this.isMale = isMale;
    this.authority = authority;
}
```

- `@Builder`: Lombok 어노테이션으로, 빌더 패턴을 사용하여 객체를 생성할 수 있게 합니다. 필드가 많거나 선택적 필드가 있을 때 객체 생성을 보다 유연하게 할 수 있습니다.
- 이 생성자는 `Member` 객체를 초기화하며, `phone`과 `password`는 각각 `Phone`과 `Password` 임베디드 객체로 변환합니다.

### 기타 메서드

```java
public String getPassword() {
    return password.getPassword();
}

public String getPhone() {
    return phone.getPhone();
}

public boolean isNotValidPassword(String inputPassword) {
    return !password.isValidPassword(inputPassword);
}

public void updateMember(String name, String phone, String password) {
    this.name = name;
    this.phone = new Phone(phone);
    this.password = new Password(password);
}
```

- `getPassword`와 `getPhone`: 임베디드 객체의 값을 반환하는 getter 메서드.
- `isNotValidPassword`: 입력된 비밀번호가 유효한지 확인하는 메서드.
- `updateMember`: 멤버 정보를 업데이트하는 메서드로, 필드를 새로운 값으로 설정합니다.

### 빌더 어노테이션을 클래스 상위에 정의하지 않은 이유

빌더 어노테이션을 클래스 상위에 정의하지 않은 이유는 빌더 패턴을 사용하는 생성자에만 적용하고자 하기 때문입니다. 클래스 수준에서 `@Builder`를 적용하면 모든 필드에 대해 빌더가 생성되지만, 특정 생성자에만 적용하면 그 생성자의 필드에 대해서만 빌더가 생성됩니다. 이는 다음과 같은 이유에서 유용할 수 있습니다:

1. **선택적 적용**: 특정 생성자에만 빌더 패턴을 적용하여 객체 생성을 보다 세밀하게 제어할 수 있습니다.
2. **기본 생성자 보호**: 기본 생성자와 다른 생성자를 구분하여, 기본 생성자는 외부에서 직접 사용되지 않도록 할 수 있습니다.
3. **복잡한 초기화 로직 처리**: 특정 생성자에만 빌더 패턴을 사용하면, 초기화 로직이 복잡한 경우 이를 보다 쉽게 처리할 수 있습니다.

### 요약

`Member` 클래스는 JPA 엔티티 클래스로, Lombok을 사용하여 간결하게 정의되었습니다. 빌더 패턴을 통해 유연하고 가독성 높은 객체 생성을 지원하며, 데이터베이스 테이블과 매핑되는 다양한 필드를 포함하고 있습니다. 빌더 어노테이션을 생성자에만 적용하여, 보다 세밀하게 객체 생성 로직을 제어하고 있습니다.