[Spring] lombok 어노테이션 정리

신동하·2024년 3월 6일

Spring

목록 보기
1/3
post-thumbnail

Spring framework를 다루면서, 다들 롬복을 사용을 하면서 개발을 진행할 것이다. 하지만 필자는 반복적으로 이전 프로젝트를 복사-붙여넣기를 하면서, 이 어노테이션이 "어떤...기능을 했더라...?"라는 의문이 자꾸 들어서 이번 글을 통해 주요 어노테이션들의 기능을 정리해보겠다.🙂

Getter, Setter

이름에서 알 수 있듯이 클래스의 Get, Set 메소드를 작성하지 않아도 클래스의 멤버 변수를 초기화(set)하거나, 해당 값을 가져(get)할 수 있는 애노테이션을 의미한다. 코드를 통해 더 자세히 이해해보자.

public class ClassTest {
//테스트를 하기 위해 선언된 클래스
    static class Test{
        int x;
        int y;
        public Test(int x, int y) {
            this.x = x;
            this.y = y;
        }

        public int getX() {
            return x;
        }

        public void setX(int x) {
            this.x = x;
        }

        public int getY() {
            return y;
        }

        public void setY(int y) {
            this.y = y;
        }
		
    }


위에서 볼 수 있듯이 Get, Set메소드가 없으면 오류가 발생한다. 만약 Getter, Setter 어노테이션을 작성을 하게 된다면..?

화면에 볼 수 있듯이 아무런 문제없이 get,set을 사용할 수 있게 된다.

@NoArgsConstructor

해당 애너테이션은 기본 생성자, 즉 파라미터가 없는 생성자를 자동으로 생성을 해주는 애너테이션을 의미한다. 그럼 왜 사용을 하는 것인가? 그 이유는 우리가 자주 사용하는 JPA에서 기본적으로 클래스의 기본 생성자를 요구 한다고 한다.
(추가로 dto 클래스가 json 데이터를 담을 때 기본 생성자가 필요하다.)

더 찾아보니 @Entity 애너테이션을 추가하면 자동으로 기본 생성자가 생성이 되는데 왜 @AllArgsConstructor을 사용하는 것이지..요??🙃
이 부분에 대해서는 현재 제 지식을 넘은 개념들이 나오기 때문에 추후에 다시 정리해보겠습니다.

@AllArgsConstructor

클래스 내부에 선언되어 있는 모든 필드를 파라미터로 가지는 생성자를 생성하는 애너테이션을 의미한다. 즉 클래스의 모든 필드의 값을 한꺼번에 초기화할 수 있는 기능을 가지게 된다. 이것을 사용하는 이유는...?
Builder를 사용하여 인스턴스를 생성할 때, 기본적으로 모든 필드의 값을 초기화할 수 있어야하기 때문에 모든 필드의 값을 파라미터로 받는 생성자가 필요하다. 그러한 이유로 ALlArgsConstructor를 사용하는 것이다.
Builer를 제외하고도 모든 필드의 값을 파라미터로 가지는 생성자는 자주 사용되기도 한다!!

@ReqiredArgsConstructor

final과 같이 초기화가 필요한 변수들을 초기화 해주기 위해 final로 선언된 변수들을 파라미터로 가지는 생성자를 생성해주는 애너테이션을 의미한다.
해당 부분을 코드로 적는 것이 이해가 더 잘될 것 같아서 코드로 적어보겠다.

@Service
@RequiredArgsConstructor
public class IdService {
	//본인의 프로젝트 Service코드.

    private final BaekjoonIdRepository repository;

위에서 볼 수 있듯이 final로 선언이 되어 있지만. 별도의 초기화 과정이 없는것을 확인할 수 있다. 만약 @RequiredArgsConstructor 애너테이션이 없으면 어떻게 작성을 해야할까..?


@Service
public class IdService {


    private final BaekjoonIdRepository repository;
    
    @Autowired
    public IdService(BaekjoonIdRepository repository) {
        this.repository = repository;
    }

이렇게 해당 필드를 초기화 해 줄 수있는 생성자가 존재해야 정상적으로 repository객체를 사용할 수 있게 된다. (@Autowired는 스프링 컨테이너에 생성되어 있는 빈 객체중 파라미터의 변수로 사용될 적절한 빈 객체가 주입이 되는 것을 의미한다. 이는 스프링의 중요한 개념인 DI(Dependency Injection, 의존성 주입)을 의미하는데 이는 다음 포스팅에서 자세히 다뤄보겠다.)

글을 마치며.....

오랜만에 글을 써보고 사실 상 처음으로 자세히 검색들을 해가면서 정리해본 것이 처음이었던 것 같다.🥲 너무 늦은감도 있는 것 같지만 하나하나 정리해가며 내 지식으로 가져가게 되면 좋은 결과가 있지 않을까. 싶다~!
꿈에 도전하는 모든 분 들 다들 화이팅입니다😁!!!

profile
JAVA를 자바💥😊😀

0개의 댓글