Lombok 에 대한 짧은 생각

최근 Java / Spring 으로 스택을 변경하면서 작은 프로젝트를 하고 있다. 팀원의 추천으로 lombok 이라는 라이브러리를 사용하게 되었다. Lombok 을 쓰면 정말 간단하다. Getter, Setter, Constructor, equals, hashCode 과 같이 작성해야하지만 작성에 피로를 느끼는 코드들을 annotation을 통해서 너무 쉽게 만들 수 있다. 그런데, 이 라이브러리 사용할수록 필요성에 대한 의문이 생긴다. 생각을 정리할 겸 글로 남겨본다.

현재 프로젝트에서는 lombok 을 사용하고 있다. lombok 의 존재를 모르고 있다가 조사를 하고 도입을 하기로 결정한 것인데, 당시에도 나는 다소 부정적인 입장이었다. 이유는 다음과 같았다.

  • lombok 이 주입하는 코드가 어떤 코드인지 모른다.
  • 편의성을 핑계로 안전을 놓칠 가능성이 생긴다.
    • 실수의 가능성을 주지 않도록 해야한다.
    • Setter , Constructor 가 특히 그렇다.
    • EqualsAndHashCode 또한, 대충 쓰면 실수하기 쉽다.
    • Data 와 같은 복합 어노테이션은 말할 것도 없다.

그래서 이런 생각을 바탕으로, 제한해서 사용하기로 결정을 했다.

  • 허용한 어노테이션만 사용한다.
    • Getter
      • 반드시 field 에 직접 걸어야한다.
    • Builder
      • 반드시 constructor 에 직접 걸어야한다.
      • 클래스 위에서 통으로 걸어버릴 경우, 의도하지 않은 상황이 연출될 수 있다. 따라서, 생성자에서 직접 제한하도록 했다.

그럼에도 여전히 불안불안하다. (C/C++ 로 코딩을 시작해서 그런걸까?) 개발자가 직접 뜯어볼 수 없는 코드가 주입되고 있고, Lombok 에 대해서 내가 이해를 제대로 하고 있는지도 의문이다. 엄청 단순한 @Getter 로 코드를 줄일 수 있으며 꽤나 편리하다는 것에는 동의하지만, 그냥 Getter 를 intelliJ 로 넣으면 그만이다. 내 lombok 의 사용은 거의 Buiilder 를 위함이지만, 생성되는 코드가 노출되지 않고 있어서 그런지 불안불안하여 최대한 제약 조건을 건 것이다. 그런데, Builder 도 대안이 있다. BuilderGenerator 라는 플러그인을 사용하면 된다. 물론 코드의 양은 증가하겠지만, 더 명확하게 표현할 수 있으며 나중에 버그가 발생했을 때 고치기에도 편리하다.

그러면 lombok 을 사용할 이유가 있을까? Lombok 자체도 지원하는 IDE 가 제한되어 있으며, 작동 방식에 대해서도 컴파일 과정에서 AST 를 조작하는 것이므로 "일종의 해킹" 이다. 이런 문제를 차치하더라도, "개발자가 의도하지 않은 형태의 코드가 주입될 수 있다는 가능성"을 프로젝트에 심는다는 것이 큰 문제이다. 코드를 읽을 때 코드에서 표현하고자 하는 부분은 코드로 보여야한다고 생각한다. 그래야 추후에 문제가 발생했을 때 문제를 파악하고 해결할 수 있다. 아주 단순한 편의성을 위해서 위험을 짊어질 필요는 없다.

만약, 한번 빠르게 쓰고 버려둘 간단한 코드라면 lombok 의 사용으로 생산성을 증대시킬 수 있으니 꽤나 좋은 선택이다. 그러나, 내가 지금 하고 있는 프로젝트나 현실의 세계에서는 코드는 계속 읽혀야하고, 변경되어야하며 디버깅 해야한다. lombok 은 그런 환경에서 적합하지 않다. 현재 프로젝트에서도 더 많은 코드에 삽입되기 이전에 lombok 을 제외해보려고한다.


Read more

대량의 더미 데이터 DB에 주입하기

대량의 더미 데이터 DB에 주입하기

대량의 더미 데이터 DB에 주입하기 현재 만들고 있는 토이 프로젝트에서는 대량의 데이터가 존재하는 DB 를 대상으로 여러가지 테스트를 수행한다. 테스트를 수행하기 위해서 더미 데이터를 주입할 방법에 대해서 모색해야했다. SQL Procedure * SQL 문으로 직접 테이블에 데이터를 주입한다. * 직접 Insert into () values (); 와 같은 구문을 작성할 수도 있지만, Procedure 혹은 function 을

By Sungjun Park
인증 인가 정보는 어디에 담아야할까? (cookie? authentication header?)

인증 인가 정보는 어디에 담아야할까? (cookie? authentication header?)

인증 인가 정보 전달 방법의 결정 요구사항 * HTTP 표준에 부합해야한다. * 보안 이슈를 최소화해야한다. * 클라이언트에서도 처리가 간편해야한다. * 모든 HTTP request 에서 처리 가능해야한다. * JWT, Session 모두 고려해야한다. 고려대상 Request Body * Request Body 에 auth 정보를 싣어 보내는 방법의 경우 GET HEAD DELETE TRACE 와 같은 HTTP Method 에서 사용할 수 없다.

By Sungjun Park