본문 바로가기

백엔드/스프링

스프링 어노테이션 정리 (@Data, @NoArgsConstructor, @AllArgsConstuctor)

728x90

`@Data`, `@NoArgsConstructor`, `@AllArgsConstructor`는 스프링 프레임워크와는 직접적으로 관련이 없는 어노테이션들이며, Lombok 라이브러리에 속한 어노테이션입니다. Lombok은 자바 코드에서 반복적으로 작성해야 하는 뼈대 코드(boilerplate code)를 줄이기 위해 사용되는 프로젝트입니다. 각 어노테이션은 다음과 같은 역할을 합니다:

1. `@Data`: `@Data` 어노테이션은 자바 빈(JavaBean) 규칙에 따른 메서드들을 생성해주는 어노테이션입니다. 주로 데이터 객체(data object) 클래스에서 사용되며, 클래스 내의 필드(멤버 변수)들을 자동으로 게터(Getter), 세터(Setter), `toString()`, `equals()`, `hashCode()` 메서드를 생성합니다. 이를 통해 데이터 객체를 간단하게 정의하고 사용할 수 있으며, 코드의 가독성을 높일 수 있습니다.

2. `@NoArgsConstructor`: `@NoArgsConstructor` 어노테이션은 매개변수가 없는 디폴트 생성자(Default Constructor)를 생성합니다. 스프링 빈(Bean)으로 등록한 클래스에서 기본 생성자가 필요한 경우에 사용됩니다. 스프링은 기본 생성자를 통해 빈을 초기화하고 의존성 주입을 수행하기 때문에, 이 어노테이션은 스프링 컨테이너와 함께 사용할 때 편리합니다.

3. `@AllArgsConstructor`: `@AllArgsConstructor` 어노테이션은 모든 필드를 인자로 받는 생성자를 자동으로 생성합니다. 이 생성자는 클래스 내의 모든 필드에 대해 매개변수를 받아 초기화하는 생성자를 생성합니다. 주로 불변(immutable) 데이터 객체를 정의할 때 사용되며, 객체 생성 시 모든 필드를 설정할 수 있도록 합니다.

이러한 Lombok 어노테이션들은 코드 작성을 간소화하고, 코드 중복을 줄이는 데 도움을 줍니다. 이로 인해 코드의 가독성을 높이고, 유지 보수 및 확장성을 향상시킵니다. 스프링 프레임워크와 함께 사용할 수 있지만, 스프링과 직접적으로 연관된 어노테이션이 아닙니다.

 

사실 이렇게 해기하면 잘 이해가 안간다. 실제 코드를 보면 좀 더 이해가 빠름.

 

* 어노테이션을 썻을 경우

package com.example.quiz.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Quiz {
    /** id 식별 */
    private Integer id;

    /** 퀴즈 내용 */
    private String question;

    /** 퀴즈 답 */
    private Boolean answer;

    /** 작성자 */
    private  String author;

}

 

* 어노테이션을 쓰지 않았을 경우

 

public class Quiz {
    private Integer id;
    private String question;
    private Boolean answer;
    private String author;

    // 디폴트 생성자: @NoArgsConstructor
    public Quiz() {
        // 이 생성자는 매개변수 없이 Quiz 객체를 생성합니다.
        // 필드는 일반적으로 기본값 또는 null로 초기화됩니다.
    }

    // 생성자: @AllArgsConstructor
    public Quiz(Integer id, String question, Boolean answer, String author) {
        this.id = id;
        this.question = question;
        this.answer = answer;
        this.author = author;
    }

    // Getter 메서드
    public Integer getId() {
        return id;
    }

    public String getQuestion() {
        return question;
    }

    public Boolean getAnswer() {
        return answer;
    }

    public String getAuthor() {
        return author;
    }

    // Setter 메서드
    public void setId(Integer id) {
        this.id = id;
    }

    public void setQuestion(String question) {
        this.question = question;
    }

    public void setAnswer(Boolean answer) {
        this.answer = answer;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    // toString() 메서드
    @Override
    public String toString() {
        return "Quiz{" +
                "id=" + id +
                ", question='" + question + '\'' +
                ", answer=" + answer +
                ", author='" + author + '\'' +
                '}';
    }

    // equals() 및 hashCode() 메서드
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Quiz quiz = (Quiz) o;
        return Objects.equals(id, quiz.id) &&
                Objects.equals(question, quiz.question) &&
                Objects.equals(answer, quiz.answer) &&
                Objects.equals(author, quiz.author);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, question, answer, author);
    }
}

 

728x90

'백엔드 > 스프링' 카테고리의 다른 글

스프링 용어 및 짤개념 정리 - 1  (0) 2023.10.15