당니의 개발자 스토리

롬복과 최신 트랜드 본문

스프링/스프링 핵심 원리 - 기본편

롬복과 최신 트랜드

clainy 2024. 1. 24. 23:02

롬복과 최신 트랜드

이번 시간에는 롬복과 최신 트렌드입니다. 의존관계 주입을 자동으로 해줄 때 생성자 주입이 다 좋긴 한데 좀 코드가 많아요. 그래서 최근에는 롬복이랑 라이브러리섞어서 아주 기가 막힌 방법이 하나 있습니다.

막상 개발해보면 대부분 다 불변이에요. 거의 한 99% 불변이고 진짜 가끔 불변이 아닌 경우가 있거든요.

그래서 생성자에 final 키워드를 사용하게 돼요. 불변이니깐요.

그런데 참 귀찮은 게 생성자를 만들어야 되고, 주입받은 값을 대입하는 코드도 만들어야 돼요.

필드 인젝션 할 수 있으면 얼마나 좋을까요? 필드에다 @Autowired 하나 해주면 필드에 바로 딱 들어오는데, '필드 주입처럼 좀 편리하게 사용하는 방법이 없을까?' 이런 고민에서 시작하는 거죠. 역시 개발자는 귀찮은 것을 못 참기 때문에

이 코드를 최적화해 봅시다.


제가 단계별로 보여드릴게요.

일단 생성자한 개 있으면, @Autowired 생략할 수 있다고 했죠.

이제 여기에다가 Lombok 이라는 라이브러리를 적용을 해볼게요.

먼저 이거를 세팅을 해야되는데 일단 build.gradle를 가셔가지고 문서에 적어놓은 걸 복사 붙이기 할게요.

참고로 start.spring.io 에서 프로젝트 생성하실 때, dependency에서 Lombok을 선택할 수 있어요.

그만큼 인기있는 유틸리티입니다. 그렇게 하면 다 자동으로 세팅을 해주는데, 저희가 처음 만들때는 롬복을 안했기 때문에,

build.gradle에 가서 설정을 해주겠습니다.

이게 annotationProcessor 라는 걸 써서 동작을 하는거거든요. 그리고 의존관계에도 넣어줍니다.

그리고 꼭 코끼리 버튼을 눌러서 refresh 해줍니다. 그래야 라이브러리를 다시 다운받아 오겠죠.

그 다음에 라이브러리에 롬복이 들어왔나볼까요?

잘 있네요.

여기서 이제 한 가지 세팅을 더 해줘야 돼요.

Settings에 들어가서

검색하고, 찾아서 설치 하시면 됩니다. 그 다음에

여기에 들어오셔서 저 체크 박스를 꼭 켜주시고,

OK 누르면 됩니다. 그러면 인텔리제이에서 롬복을 쓸 수 있게 됩니다.

이제 롬복의 대표적인 장점을 보여드리겠습니다. 아무 클래스나 만들어볼게요.

HelloLombok 이라는 클래스를 만들겠습니다.

private 필드인 name이랑 age를 만들겠습니다. 그 다음에 psvm 해서 main 메서드를 만들고,

@Getter@Setter를 적어준 다음에,

helloLombok.set 하면 메서드가 생긴 걸 볼 수 있습니다.

역시 get으로 이름을 꺼낼 수 있고 출력해보면,

잘 나오죠. 그러니까 Lombok을 깔면 Getter, Setter를 자동으로 만들어 주고요. 자동으로 annotation processing으로 만들어주는 거에요.

원래는 cmd + N 해서 Getter, Setter직접 짜야되죠. 그래서 귀찮으니까 @Getter, @Setter 애노테이션을 붙여서 롬복이 있으면, 자동으로 필드를 보고 메서드를 만들어줍니다. 굉장히 많이 사용을 합니다.

그리고 또 생성자 같은 것도 지원하고, 롬복 관련해서 검색해 보면 굉장히 많이 나올 거예요.

실무에서 진짜 많이 씁니다. @ToString도 해봅시다.

출력해보면,

이렇게 예쁘게 만들어줍니다.

이제 OrderServiceImpl로 가서, 롬복을 적용할 건데

롬복@RequiredArgsConstructor 라는 애노테이션이 있어요. 지금 보시면 빨간 불이 들어오는데, 왜냐면 @RequiredArgsConstructor가

지금 이 생성자와 관련된 코드를 똑같이 그대로 만들어주기 때문에 그렇습니다.

RequiredArgs 즉, 필수 값인 arguments들을 Constructor, 생성자로 넣어준다는 뜻으로, 필드final붙은 애들을 생성자에 넣어서 만들어줍니다.

현재 내 객체에 final이 붙은 게 두개죠. 이 두 개를 파라미터로 받는 constructor 생성자를 만들어줍니다.

그러니까 생성자를 지우고 cmd + F12를 누르면,

생성자가 있는 걸 볼 수 있습니다.

그러면 이게 최종 코드인데 굉장히 편리하죠. 이전에 했던

필드 주입보다 더 좋아요.

그리고 심지어 생성자도 있고 final도 있어요. 그래서 최근에 @RequiredArgsConstructor 이걸 많이 사용합니다.

가끔 생성자가 직접 필요할 때가 있거든요. 그럴 때만 생성자를 직접 만들고, 그러지 않은 경우에는 이렇게 쓰시면 됩니다.

써보시면, 의존관계를 추가할 때 아주 편합니다.


이제 정리를 해봅시다.

롬복을 적용해봤고, 롬복 라이브러리가 제공하는 @RequiredArgsConstructor 기능을 사용하면 final붙은 필드를 모아서 생성자를 자동으로 만들어줍니다. 코드가 줄어든 것처럼 보이지만, 실제 생성자 메서드는 그대로 존재합니다. 최종 결과는 정말 간결하죠.

사실 이전 코드와 완전히 동일해요. 눈에 안 보일 뿐이죠. 롬복자바의 애노테이션 프로세서라는 기능을 이용해서, 컴파일 시점생성자 코드를 자동으로 생성해줘요. 실제 class 코드를 열어보면 다음 코드가 추가되어 있는 것을 확인할 수 있습니다.

정리를 해보면,

최근에는 생성자를 딱 하나만 두고, @Autowired를 생략하는 방법을 주로 사용해요. 여기에 Lombok 라이브러리가 제공하는 @RequiredArgsConstructor 를 함께 사용하면, 생성자의 final과 같은 기능은 다 제공하면서, 코드는 깔끔하게 사용할 수 있습니다.


이렇게 해서 Lombok 라이브러리 적용 방법까지 알아봤구요.

다음 시간에는 @Autowired를 하는데 빈이 두 개면 어떻게 되는지, 문제에 대해서 해결 방법을 알아보겠습니다.