본문 바로가기
웹 & 앱 개발/Backend 개발

[JPA] 생성자와 기본 생성자, AllArgsConstructor와 NoArgsConstructor

by newstellar 2023. 3. 14.
반응형

 

생성자(Constructor)는 객체를 생성할 때 사용되는 특별한 메서드입니다. 클래스에 생성자가 정의되어 있으면, 객체를 생성할 때 해당 생성자를 호출하여 필드를 초기화할 수 있습니다.

 

기본 생성자(Default Constructor)는 클래스에 명시적으로 생성자를 정의하지 않았을 때, 컴파일러가 자동으로 추가하는 생성자입니다. 기본 생성자는 매개변수를 가지지 않는 public 생성자이며, 객체를 생성할 때 호출됩니다.

 

AllArgsConstructor은 Lombok에서 제공하는 어노테이션 중 하나로, 클래스에 선언된 모든 필드를 매개변수로 갖는 생성자를 자동으로 생성해주는 역할을 합니다. NoArgsConstructor는 Lombok에서 제공하는 어노테이션 중 하나로, 매개변수를 가지지 않는 생성자를 자동으로 생성해주는 역할을 합니다.

 

다음은 생성자와 기본 생성자, 그리고 AllArgsConstructor와 NoArgsConstructor의 예시입니다

 

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private String name;
    private int age;
    
    // Getter, Setter 생략
}

 

위의 예시에서는 NoArgsConstructor 어노테이션을 사용하여 Person 클래스에 매개변수를 가지지 않는 기본 생성자를 자동으로 생성했습니다. 또한, AllArgsConstructor 어노테이션을 사용하여 모든 필드를 매개변수로 받는 생성자를 자동으로 생성했습니다.

 

이렇게 생성된 Person 클래스는 다음과 같이 객체를 생성할 수 있습니다.

 

Person person1 = new Person(); // 기본 생성자
Person person2 = new Person("Alice", 30); // 모든 필드를 매개변수로 갖는 생성자

 

기본 생성자와 AllArgsConstructor 어노테이션을 모두 사용하면, 객체를 생성할 때 필드 값을 직접 지정하거나 기본값으로 초기화할 수 있습니다. 또한, 클래스에 필드를 추가하거나 삭제하더라도 생성자를 수정할 필요가 없기 때문에 코드 유지보수가 쉬워집니다.

 

따라서, AllArgsConstructor와 NoArgsConstructor 어노테이션은 코드를 간결하게 작성할 수 있도록 도와주는 유용한 어노테이션입니다.

 

반응형

 

Q. Builder 패턴과 위에서 다룬 두 어노테이션은 같이 써야하나요?

AllArgsConstructor과 NoArgsConstructor 어노테이션과 Builder 패턴은 객체를 생성하거나 초기화하는 방법과 관련이 있지만, 서로 직접적인 연관관계는 없습니다.

 

AllArgsConstructor과 NoArgsConstructor 어노테이션은 생성자를 자동으로 생성하여 객체를 초기화하는 방법을 제공하는 반면, Builder 패턴은 복잡한 객체를 생성하고 초기화하는 방법을 제공합니다. Builder 패턴을 사용하면 객체를 생성하면서 매개변수를 선택적으로 전달할 수 있으며, 코드 가독성을 높일 수 있습니다.

 

따라서, 두 기능은 서로 다른 방식으로 객체를 생성하거나 초기화하는 방법을 제공하지만, 함께 사용될 수 있습니다. 예를 들어, Lombok에서는 Builder 패턴을 쉽게 구현할 수 있는 @Builder 어노테이션을 제공하며, @AllArgsConstructor나 @NoArgsConstructor와 함께 사용하여 객체를 생성하거나 초기화할 수 있습니다.

 

즉, 생성자와 Builder 패턴은 객체를 초기화하는 방법을 제공하는 데 있어 유용한 방법이며, 필요에 따라 함께 사용될 수 있습니다.

 

 

Q. Entity나 DTO를 정의할 때 생성자 어노테이션을 어떻게 붙여야 할까요?

Entity와 DTO 파일에서 생성자 어노테이션은 각각의 용도와 특징에 맞게 사용됩니다.

 

Entity 클래스에서는 기본 생성자와 모든 필드를 매개변수로 갖는 생성자가 필요합니다. 이는 JPA에서 Entity 객체를 생성하고 초기화하는 데 사용되며, Entity의 상태를 관리하는 데 중요한 역할을 합니다. 따라서, Entity 클래스에서는 @NoArgsConstructor와 @AllArgsConstructor 어노테이션을 모두 사용하여 기본 생성자와 모든 필드를 매개변수로 갖는 생성자를 모두 정의합니다.

 

@Entity
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    private int age;
    
    // Getter, Setter 생략
}

 

DTO 클래스에서는 일반적으로 매개변수를 가지지 않는 기본 생성자와, 필드 값을 초기화하는 생성자가 필요합니다. DTO 객체는 주로 Controller와 Service 간의 데이터 전달을 위해 사용되며, 생성자를 통해 필드 값을 설정하여 객체를 생성하고 초기화합니다. 따라서, DTO 클래스에서는 @NoArgsConstructor와 @AllArgsConstructor 어노테이션 중 필요한 어노테이션을 선택하여 생성자를 정의합니다.

 

그럼 DTO에서 @NoArgsConstructor를 사용하는 예시를 한 번 알아봅시다.

 

  1. 객체를 생성할 때 모든 필드를 초기화하지 않고, 나중에 따로 값을 설정할 때
  2. @Builder 어노테이션을 사용하여 객체를 생성하는 경우
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class PersonDTO {
    private String name;
    private int age;
    private String address;
    
    // Setter 생략
    
    public PersonDTO(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

 

위의 예시 코드에서는 Lombok의 @NoArgsConstructor 어노테이션을 사용하여, 매개변수를 가지지 않는 생성자를 자동으로 생성하였습니다. 이는 객체를 생성할 때 필요한 필드를 모두 초기화하지 않고, 필요한 경우 나중에 따로 값을 설정할 수 있도록 합니다.

 

또한, @Builder 어노테이션을 사용하여 객체를 생성하는 경우에도 @NoArgsConstructor 어노테이션이 함께 사용될 수 있습니다. 예를 들어, 다음과 같은 코드를 작성할 수 있습니다.

 

PersonDTO personDTO = PersonDTO.builder()
                              .name("Alice")
                              .age(30)
                              .build();

 

이렇게 @NoArgsConstructor 어노테이션을 사용하면 코드를 간결하게 작성할 수 있으며, 객체를 생성하거나 필드 값을 초기화하는 데 유용합니다.

 

 


 

[GitHub] 깃허브 잔디 심는 법 - GitHub Contributions

깃허브를 하다 보면 어떤 날은 특별한걸 하지도 않은 것 같은데 contribution 수가 많고(진한 초록색) 또 어떤 날은 깃허브를 붙잡고 몇 시간을 썼는데도 contribution이 없거나 연한 초록색으로 남아

newstellar.tistory.com

 

[보안] Apache Log4j 보안 이슈 및 해결 방안

1. Log4j란? Log4j는 Java 기반 프로그램 작성 시 지정된 파일/포맷으로 로깅할 수 있는 Apache 오픈소스 라이브러리입니다. 이슈가 된 취약점은 CVE-2021-44228(또는 Log4Shell)로 명명되었으며, Log4j가 넘겨받

newstellar.tistory.com

반응형

댓글