Spring framework를 다루면서, 다들 롬복을 사용을 하면서 개발을 진행할 것이다. 하지만 필자는 반복적으로 이전 프로젝트를 복사-붙여넣기를 하면서, 이 어노테이션이 "어떤...기능을 했더라...?"라는 의문이 자꾸 들어서 이번 글을 통해 주요 어노테이션들의 기능을 정리해보겠다.🙂
이름에서 알 수 있듯이 클래스의 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을 사용할 수 있게 된다.
해당 애너테이션은 기본 생성자, 즉 파라미터가 없는 생성자를 자동으로 생성을 해주는 애너테이션을 의미한다. 그럼 왜 사용을 하는 것인가? 그 이유는 우리가 자주 사용하는 JPA에서 기본적으로 클래스의 기본 생성자를 요구 한다고 한다.
(추가로 dto 클래스가 json 데이터를 담을 때 기본 생성자가 필요하다.)
더 찾아보니 @Entity 애너테이션을 추가하면 자동으로 기본 생성자가 생성이 되는데 왜 @AllArgsConstructor을 사용하는 것이지..요??🙃
이 부분에 대해서는 현재 제 지식을 넘은 개념들이 나오기 때문에 추후에 다시 정리해보겠습니다.
클래스 내부에 선언되어 있는 모든 필드를 파라미터로 가지는 생성자를 생성하는 애너테이션을 의미한다. 즉 클래스의 모든 필드의 값을 한꺼번에 초기화할 수 있는 기능을 가지게 된다. 이것을 사용하는 이유는...?
Builder를 사용하여 인스턴스를 생성할 때, 기본적으로 모든 필드의 값을 초기화할 수 있어야하기 때문에 모든 필드의 값을 파라미터로 받는 생성자가 필요하다. 그러한 이유로 ALlArgsConstructor를 사용하는 것이다.
Builer를 제외하고도 모든 필드의 값을 파라미터로 가지는 생성자는 자주 사용되기도 한다!!
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, 의존성 주입)을 의미하는데 이는 다음 포스팅에서 자세히 다뤄보겠다.)
오랜만에 글을 써보고 사실 상 처음으로 자세히 검색들을 해가면서 정리해본 것이 처음이었던 것 같다.🥲 너무 늦은감도 있는 것 같지만 하나하나 정리해가며 내 지식으로 가져가게 되면 좋은 결과가 있지 않을까. 싶다~!
꿈에 도전하는 모든 분 들 다들 화이팅입니다😁!!!