@AllArgsConstructor
- 클래스에 모들 필드에 대한 생성자를 자동으로 생성해준다.
- 단점 : 기존에 멤버 변수의 순서를 바꾼다면, 기존 생성자의 파라미터의 순서가 바뀐다. 만약 두 멤버 변수의 타입이 동일하다면 개발자가 인지 하기 어렵다.
- 멤버 변수 생성자 호출 (멤버 변수 순서 변경 전 / 후 모두 동일 소스)
class UserTest {
@Test
@DisplayName("생성자 테스트")
void constructor_test(){
User user = new User(1L, "name", "email", "password");
System.out.println(user);
}
}
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class UserData {
public Long id;
@NotBlank(message = "잘못된 요청입니다. 파라미터를 확인해 주세요.")
public String name;
@Email(message = "잘못된 요청입니다. 파라미터를 확인해 주세요.")
public String email;
@NotBlank(message = "잘못된 요청입니다. 파라미터를 확인해 주세요.")
public String password;
}
User(id=1, name=name, email=email, password=password)
- 멤버 변수 순서 변경(email과 name을 변경)
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class UserData {
public Long id;
@Email(message = "잘못된 요청입니다. 파라미터를 확인해 주세요.")
public String email;
@NotBlank(message = "잘못된 요청입니다. 파라미터를 확인해 주세요.")
public String name;
@NotBlank(message = "잘못된 요청입니다. 파라미터를 확인해 주세요.")
public String password;
}
- 출력(멤버 변수 순서 변경) → 같은 String 타입이라 별도의 오류가 발생하지 않는다.
User(id=1, email=name, name=email, password=password)
- 그렇다고
@AllArgsConstructor
를 삭제 할까?
@Builder
에서 오류가 발생 → 모든 멤버변수를 갖는 생성자가 필요하다.
/Users/jw.lee/ljw-study/spring/spring-week5-assignment-1/app/src/main/java/com/codesoom/assignment/domain/User.java:17
java: constructor User in class com.codesoom.assignment.domain.User cannot be applied to given types;
required: no arguments
found: java.lang.Long,java.lang.String,java.lang.String,java.lang.String
reason: actual and formal argument lists differ in length
access = AccessLevel.PRIVATE
옵션으로 외부에서 접근못하게 막는다
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder
@Getter
@ToString
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
private String password;
}
@NoArgsConstructor
- 기본 생성자를 생성해준다.
- final 멤버 변수가 있을 경우 초기화 문제로
force = true
옵션으로 final 멤버 변수를 초기화 시켜 생성한다.
- 단점 : 기본생성자를 public으로 생성하게 되면 객체가 Immutable하지 않다. → 외부 변경에 취약하다. →
access = AccessLevel.PROTECTED
으로 접근을 제어하자.