인프런 커뮤니티 질문&답변

버터플라잉교육용님의 프로필 이미지

작성한 질문수

실전 jOOQ! Type Safe SQL with Java

EnumConverter 사용하여 Enum 매핑하기

db column은 not null로 되어 있는데 kotlin에서 pojo가 다 nullable로 생성되요.

해결된 질문

24.07.06 12:30 작성

·

200

0

kotlin을 사용하고 있어서, kotlin with jooq로 하는데 pojo의 속성들이 모두 ?이 붙어서 nullable이 되었습니다. 실상은 not null임에도 불구하고요. 이럴 경우 따로 data class를 만들어야 할까요? 아니면 다른 방법이 있을까요?

답변 1

1

설동민님의 프로필 이미지
설동민
지식공유자

2024. 07. 06. 17:38

문서: https://www.jooq.org/doc/latest/manual/code-generation/kotlingenerator/

 

버터플라잉교육용 님 안녕하세요.

해당 부분 KotlinGenerator에서 옵션으로 지원되고 있습니다.
다만 원하시는 옵션의 default가 false여서 nullable로 처리되어있습니다.
KotlinNotNullPojoAttributes 옵션을 true로 변경하시면 됩니다.

 

해당 부분 강의자료에 추가해놓았으니 참고하시면 좋을듯합니다.
감사합니다.

https://github.com/SightStudio/jOOQ-inflearn/tree/main/issue_1314279_jooq-with-kotlin


다만 PK는 원하는 대로 not null 이 되지 않을 수 있는데요.

 

관련 이슈

https://github.com/jOOQ/jOOQ/issues/16007

 

이 부분이 마음에 들지 않는다면 이런 방법도 있습니다.

https://www.jooq.org/doc/latest/manual/code-generation/codegen-version-control/

 

POJO는 일회성 generator용도로만 생성하고 버전관리를 하는 방식입니다.

이 문서를 보면 POJO만 별도로 다른 패키지에서 생성되게 할 수 있습니다.

 

이를 통해 POJO를 다른 곳에서 생성되게하여 git으로 버전관리 하게 할 수 있습니다.

 

이렇게 하면 우리가 POJO 관리하게되니 좀 더 편하게 사용 할 수 있습니다.

 

대신 테이블에 대한 변경도 우리가 기존 마이바티스에서 했듯이 수동 필드들을 관리줘야합니다. (트레이드 오프)

버터플라잉교육용님의 프로필 이미지

2024. 07. 07. 09:40

main 외부에 생성된 generated 모듈은 git에서 제외를 하나 보군요? 그럼 협력 개발자들은 git pull을 당기고 난 후 항상 generate*DbJooq task를 실행해줘서 생성을 해야 겠네요??
그리고 github action 등으로 CICD 할 때도 job step에 빌드 cmd 전에 generate*DbJooq cmd를 추가해주고요.

반대로 pojo를 개발자가 통제하고 싶을 땐 다른 패키지에서 별도로 생성하고 git version 관리를 하고요

설동민님의 프로필 이미지
설동민
지식공유자

2024. 07. 07. 14:20

 

  1. generate된 DSL은 깃으로 관리하지 않는가?



    네 보통 git에서 제외하고 협력개발자들 각자 로컬에서 테스크 실행해서 생성하고 개발합니다.

     

    이를 통해 원본 스키마에 대응하는 일관된 DSL을 가지고 개발을 합니다.
    이렇게 되어야 원본 스키마가 변경되었을때 (DDL, 개발DB, JPA 엔티티 등) 생성된 DSL을 일관되게 관리 할 수 있고, 다른 부분을 런타임이 아닌 컴파일 타임에 확인 할 수 있습니다.

CI/CD 환경에서 generate*DbJooq 테스크를 별도로 추가 할 필요는 없습니다. 빌드시 자동으로 실행됩니다.
이를 통해 CI 환경에서 원본 스키마와 DSL이 다를 때 컴파일 에러를 발생시켜 개발자가 인지 할 수 있게합니다.

강의에 설명드린 DSL 생성 방식 (개발 DB, JPA엔티티, testcontainer + flyway)
모두 최초 도입자가 세팅만 해놓으면 협력하는 개발자들이 쉽게 생성할 수 있기 때문에 큰 부담은 없습니다.


  1. 반대로 pojo를 개발자가 통제하고 싶을 땐 다른 패키지에서 별도로 생성하고 git version 관리를 하고요.

-> 맞습니다.

 

저는 보통 1번을 선호하는 편이지만 2번도 틀린 방식은 아니기 때문에 팀내 상황을 잘 고려하시고 판단하시면 좋을듯합니다.

참고로 최근에 jOOQ 창시자가 이 주제에 관련해서 트위터에 유저들의 의견을 물은적이 있는데요.

이 포스트도 참고해보는게 결정에 도움이 될듯합니다

https://x.com/lukaseder/status/1805209257295393167