인프런 커뮤니티 질문&답변
db column은 not null로 되어 있는데 kotlin에서 pojo가 다 nullable로 생성되요.
해결된 질문
작성
·
460
0
kotlin을 사용하고 있어서, kotlin with jooq로 하는데 pojo의 속성들이 모두 ?이 붙어서 nullable이 되었습니다. 실상은 not null임에도 불구하고요. 이럴 경우 따로 data class를 만들어야 할까요? 아니면 다른 방법이 있을까요?
답변 1
1
문서: 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 관리하게되니 좀 더 편하게 사용 할 수 있습니다.
대신 테이블에 대한 변경도 우리가 기존 마이바티스에서 했듯이 수동 필드들을 관리줘야합니다. (트레이드 오프)
- generate된 DSL은 깃으로 관리하지 않는가? - 네 보통 git에서 제외하고 협력개발자들 각자 로컬에서 테스크 실행해서 생성하고 개발합니다. - 이를 통해 원본 스키마에 대응하는 일관된 DSL을 가지고 개발을 합니다. 
 이렇게 되어야 원본 스키마가 변경되었을때 (DDL, 개발DB, JPA 엔티티 등) 생성된 DSL을 일관되게 관리 할 수 있고, 다른 부분을 런타임이 아닌 컴파일 타임에 확인 할 수 있습니다.
CI/CD 환경에서 generate*DbJooq 테스크를 별도로 추가 할 필요는 없습니다. 빌드시 자동으로 실행됩니다. 
이를 통해 CI 환경에서 원본 스키마와 DSL이 다를 때 컴파일 에러를 발생시켜 개발자가 인지 할 수 있게합니다.
강의에 설명드린 DSL 생성 방식 (개발 DB, JPA엔티티, testcontainer + flyway)
모두 최초 도입자가 세팅만 해놓으면 협력하는 개발자들이 쉽게 생성할 수 있기 때문에 큰 부담은 없습니다.
- 반대로 pojo를 개발자가 통제하고 싶을 땐 다른 패키지에서 별도로 생성하고 git version 관리를 하고요. 
-> 맞습니다.
저는 보통 1번을 선호하는 편이지만 2번도 틀린 방식은 아니기 때문에 팀내 상황을 잘 고려하시고 판단하시면 좋을듯합니다.
참고로 최근에 jOOQ 창시자가 이 주제에 관련해서 트위터에 유저들의 의견을 물은적이 있는데요.
이 포스트도 참고해보는게 결정에 도움이 될듯합니다
https://x.com/lukaseder/status/1805209257295393167







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