게시글
질문&답변
jooq+flyway에서 질문드립니다
JaeWon Kim님 안녕하세요. 요건 olima가 아니라 colima를 말씀하신것으로 이해했습니다.제가 colima를 안써봐서 당장 답변드리기는 어렵네요.이부분은 금주 중으로 테스트해보고 알려드리도록 하겠습니다. 1.olima로 인텔리j에서 dev.monosoul.jooq-docker 설정에 맞게 실행 시키는법-> 테스트 후 답변드리도록 하겠습니다. 2.도커 없이 flyway 사용할때에는 nu.studer.jooq + flyway 이 조합으로 하는게 권장되는 방식인지?-> 이 경우를 정리해보자면, 로컬에 db 설치, 또는 개발db에서 설치하고 flyway로 DDL을 마이그레이션 하는 방식으로 보이는데요. nu.studer.jooq가 flyway를 지원해서 해당 플러그인을 사용하셔서 처리하셔도 될듯합니다.다만 지금 시도하시려는 방식이 권장되는 방식이 아니라 권장드린다고 답변하기는 어렵네요 ㅎㅎ 해당 방식은 관리의 번거로움이 있어서 가능하다면 1번으로 하는게 훨씬 간단할듯합니다. (jOOQ에서 권장하는 방식은 testcontainers + flyway 조합입니다.) 감사합니다!
- 0
- 1
- 72
질문&답변
안녕하세요 생성일,생성자,수정일,수정자는 자동으로 해주는 기능이 있을까요?
JaeWon Kim 님 안녕하세요.jOOQ에서 JPA Auditing에 대응하는 기술을 찾고 계신걸로 이해했는데요. 저도 이부분에 대한 답을 얻기위해 정말 많이 찾아다녔었습니다.결론부터 말씀드리면 jOOQ 오픈소스 버전에서 해당기능을 사용하려면RecordListener가 유일한 답입니다.(개인적으로는 상용 라이센스가 제공하는 Audit Columns를 사용 할 수 있더라도, RecordListener가 더 효율적일것으로 생각됩니다.) RecordListener를 사용하면 JPA Auditing과 유사하게 insert, update, delete 등의 작업시에 추가작업을 할 수 있습니다. @Override public void insertStart(RecordContext ctx) { if (ctx.record().field(TABLE.CREATED_AT) != null) { ctx.record().set(TABLE.CREATED_AT, LocalDateTime.now()); } } 이건에 대한 문의는 꽤 많았고, 대표적으로 창시자가 답변한 깃헙 문의 이슈와 제가 다른 질문에서 한 답변도 참고해보면 좋을것같아요 (사진) 만약 라이센스를 구매한 경우, jOOQ의 Audit columns 기능을 사용하시면 RecordListener 없이도 Auditing을 사용 할 수 있는데요. 이 기능의 장점은 그 어떤 DB접근 기술에서도 구현 하지못한 다중 row 벌크 update 에서도 Auditing이 가능하다는 점입니다. 현존하는 대부분의 db 접근 기술은 이런 쿼리에서 Auditing이 불가능하지만, jOOQ의 Audit columns 은 해당 쿼리에서도 동작합니다. UPDATE users SET status = 'INACTIVE', updated_at = NOW() WHERE last_login 다만, 문서를 보시면 해당 기능을 사용하는데 필요한 컬럼들을 설정에서 문자로 지정 해야해서만약 컬럼명이 다 다르다면 꽤 긴 설정을 해야 할 수도 있습니다. (사진) 추가적으로 궁금하신 점 있으면, 댓글 달아주세요! 추가적으로 답변드리도록 하겠습니다.
- 0
- 2
- 75
질문&답변
Routines 관련 질문
해당 질문은 우선 해결 처리해놓도록 하겠습니다. 만약 아직 해결되지 않았다면, 댓글로 답변주시면 마저 도움드릴수 있도록 하겠습니다.감사합니다 :)
- 1
- 2
- 90
질문&답변
Routines 관련 질문
lannn님 안녕하세요 사용 방언(dialect) 확인혹시 어떤 db와 함께 사용하시려는건가요?상용db (예를들어 오라클이나 MSSQL)을 사용하려면 라이센스를 구매하셔야합니다 연동 방식 확인testcontainer 없이 DDLDatabase로 사용하시면 H2 db기준으로만 dsl을 생성할 수 있습니다 아래 강의를 확인부탁드려요섹션 5. jOOQ 고급 - 다양한 방식으로 jOOQ DSL 만들기 추가로 궁금하신부분이 있다면 에러 로그도 같이 첨부 부탁드립니다
- 1
- 2
- 90
질문&답변
JOOQ 환경설정 중에 db 패스워드 관련 질문입니다.
안녕하세요. 임준용님우선 결론부터 말씀드리면 gradle 파일에 패스워드를 넣지 않고도 사용 할 수 있습니다. 개발 db를 직접 보고 DSL을 만드는 경우, 다음과 같이 gradle 파일이 아닌 외부에서 환경변수로db 비밀번호를 넣도록 처리 할 수 있습니다. 실무에서는 보통 vault hashicorp 같은 곳에 db 비밀번호를 저장하는데요.그 값 또한 gradle 파일에서 가져오게 처리하고 있습니다. String dbUser = System.properties["db-user"] ?: "root" String dbPasswd = System.properties["db-passwd"] ?: "passwd" jooq { configurations { testDB { generationTool { jdbc { driver = 'com.mysql.cj.jdbc.Driver' url = 'jdbc:mysql://localhost:3306' user = "${dbUser}" password = "${dbPasswd}" } } } // ...... } } 또한 개발(혹은 운영) DB를 직접 접근하지 않아도 DSL을 만들 수 있습니다.섹션 5. jOOQ 고급 - 다양한 방식으로 jOOQ DSL 만들기-> 해당 섹션 영상을 참고부탁드려요.
- 1
- 1
- 86
질문&답변
DB 벤더별 내장함수에 대한 방언 지원 듣고 질문드려요
이경용님 안녕하세요. 강의에서 MySQL의 경우 MySQLDSL.group_concant(), PostgreSQL의 경우 group_concat() 이렇게 적어놓았는데요. 실제로는 static import 되어서 PostgreDSL.group_concat() 이라고 보시면 됩니다. ㅎㅎ 그리고 MySQLDSL, PostgreDSL 이 둘 모두 DSL 클래스를 상속받기 때문에 사실상 DSL.group_concat() 과 동일하다고 보시면 됩니다 :) (사진)
- 1
- 1
- 117
질문&답변
인텔리제이 테마 질문
Jacob Lee 님 안녕하세요. 강의에서 사용된 테마는 이클립스 다크 테마 플러그인을 적용해서 사용하고 있습니다.https://plugins.jetbrains.com/plugin/11055-eclipse-dark-theme-color-scheme 예전에 이클립스에서 쓰던 다크테마를... 잊지 못해서 인텔리제이에서도 사용하고 있습니다🙂 감사합니다 ㅎㅎ
- 2
- 3
- 191
질문&답변
jooq로 auditing 구현하는방법
안녕하세요. 질문이 올라왔는지 몰랐네요 ㅎㅎ제 메일로도 받았던 질문인데 기록차 인프런에도 올려달라고 요청드렸던 글입니다. jOOQ RecordListener는 ActiveRecord 기반으로 동작합니다.아래의 코드는 ActiveRecord 기반으로 동작하지 않기때문에 이벤트 리스너가 트리거되지 않습니다. // RecordListener가 트리거되지 않음 fun insertUser(user: UsersRecord): Long? { return dslContext .insertInto( USERS, USERS.NAME, USERS.AGE, ).values( user.name, user.age ).returningResult(USERS.ID) .fetchOneInto(Long::class.java) } // RecordListener가 트리거됨 fun insertUser_record(user: UsersRecord): Long? { user.insert(); return user.getId(); } JPA처럼 영속성 컨텍스트 내에서 insert or update가 되는 형태를 원하신다면 ActiveRecord 내부에 DB 연동 상태가 있는데요. 이를 통해 처리 할 수 있습니다. JPA의 경우 엔티티 매니저가 영속성 컨텍스트 내에서 이 insert or update의 라이프사이클을 관리하지만 jOOQ는 영속성 컨텍스트 개념이 없기 때문에 ActiveRecord 객체 단위로 라이프사이클을 관리합니다. 이부분을 유의해서 적용 부탁드립니다. 이 부분 관련 질문이 몇번 들어와서 강의에 추가해놔야겠네요. 감사합니다 ~
- 1
- 2
- 141
질문&답변
FilmWithActor로 fetch 시 select와 생성자의 매개변수 순서가 다를 경우 map이 정상적으로 이루어 지지않는 케이스
하디님 안녕하세요 강의에서는 일부 row를 그룹핑해서 다른 객체로 만들 수 있다는걸 보여주기 위해서 위의 방식으로 소개했었는데요. 테이블 자체를 select하는 경우에는 Tables as SelectField 방식으로 처리하는것을 추천드립니다. 🙂 테이블 객체를 field로 사용하는 경우 아래와 같이 mapping 할 때 테이블 명으로 매핑할 클래스 필드명을 찾아서 매칭해주기 때문에 순서를 고려하지 않으셔도 됩니다. 예시 1) 위의 "Table as SelectField"를 사용한 경우 (사진) 예시 2) 강의의 DSL.row를 사용한 경우 (사진) 강의오픈 후에 이부분 설명이 아쉽다고 생각해서 강의노트에 추가했었는데요.이부분은 추후에 다른분들도 어떻게 잘 알 수 있을지 고민해보도록 하겠습니다. 테이블이 아닌경우 DSL.row()와 매퍼를 적절히 사용해주시면 됩니다.dslContext.select( DSL.row( FILM.FILM_ID, FILM.TITLE, FILM.DESCRIPTION ).mapping(SimpleFilmInfo::new) ) .from(FILM) .where(FILM.FILM_ID.eq(id)) .fetchOneInto(SimpleFilmInfoWrapper.class); // class SimpleFilmInfoWrapper { private SimpleFilmInfo simpleFilmInfo; }
- 1
- 1
- 124
질문&답변
from절 subquery table filed nullable 처리
안녕하세요. 어떤상황인지 정확히 파악이 안되서 답변드리기가 어려운데요.관련된 예시 코드나 사진이 있을까요?
- 1
- 1
- 154