sdm32851630
@sdm32851630
Students
374
Reviews
19
Course Rating
4.9
์๋
ํ์ธ์. ์ง์๊ณต์ ์ ์ค๋๋ฏผ์
๋๋ค.
ํ์ฌ ๋๊ธฐ์
๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก ๊ทผ๋ฌดํ๊ณ ์์ผ๋ฉฐ, ๋ณต์กํ ๋ฌธ์ ๋ฅผ ๋ช
์พํ๊ฒ ํ์ด๋ด๋๊ฑธ ์ข์ํฉ๋๋ค.
๊ฒฝ์ํ๋ถ ๋น์ ๊ณต์ ์ถ์ ์ผ๋ก, ๋ค์ํ OpenSource๋ค์ ๋ํ ๋ถ์๊ณผ ์ฌ๋ฌ ๊ธฐ์ ์ ์ธ ๊ฒฝํ๋ค์ ํตํด
์น์ ์ ๋ฐ์ ์ธ ๊ธฐ์ ์ ํ์ตํ์์ต๋๋ค. OOP์ SQL, ์ด ์ด์ธ๋ฆฌ์ง ์๋ ๋๊ฐ์ง๋ฅผ ์ ์ผ ์ข์ํฉ๋๋ค.
Github: https://github.com/SightStudio
LinkedIn: https://www.linkedin.com/in/dong-min-seol-243b6119a
์ด๋ ฅ
2021. 12 ~ 2025.11: ์ ) ์นด์นด์ค ๋ฐฑ์๋ ๊ฐ๋ฐ
2020.12 ~ 2021.12 : ์ ) ์ด์คํธ์ํํธ ๋ฐฑ์๋ ๊ฐ๋ฐ
Courses
Reviews
- jOOQ in action! Type Safe SQL with Java
- jOOQ in action! Type Safe SQL with Java
- jOOQ in action! Type Safe SQL with Java
- jOOQ in action! Type Safe SQL with Java
- jOOQ in action! Type Safe SQL with Java
Posts
Q&A
monosoul jooq plugin-docker registry ๋ณ๊ฒฝ
์๋ ํ์ธ์.https://github.com/monosoul/jooq-gradle-plugin/issues/333 ํด๋น ๊นํ์ด์์์ ๋์ผํ ๋ ผ์๊ฐ ์งํ๋๊ณ ์๋๋ฐ์.ํน์ ํด๋น ์ด์๋ฅผ ์์ฑํ์ จ์๊น์? ๐ ๋ง๋ค๋ฉด ํด๋น ์ด์๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ๋ ๋ฏํฉ๋๋ค. (๋ณดํต์ ๋ง๋ ์ฌ๋์๊ฒ ๋ต๋ณ๋ฐ๋๊ฒ ์ ์ผ ์ ํํฉ๋๋ค ใ ใ )์ ๊ฐ monosoul ํ๋ฌ๊ทธ์ธ์ ์ถ์ฒํ ์ด์ ๋ํด๋น ๋ฉ์ธํ ์ด๋๊ฐ ํํ๋ฌ๊ทธ์ธ ๋๋น ๋ ํ๋ฐํ๊ฒ ๋ต๋ณํด์ฃผ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๐๊ฐ์ฌํฉ๋๋ค.
- 1
- 3
- 51
Q&A
์ง๋ฌธ) jOOQ ํ๋ก์ ํธ์์ CI/CD ์๋ํ ๋ฌธ์
KHLIM๋ ์๋ ํ์ธ์. CI ํ๊ฒฝ์์ DSL ์์ฑ์ ์ํ DB ์ฐ๊ฒฐ์ค์ ๋ก CI/CD ์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ๋ ๋ถ๋ถ์ ์ฌ๋ฌ ๊ด๋ฆฌ ํฌ์ธํธ์ ๋ง๋ถ๋ฆฌ์ ๊ฐ์ ์ด์๋ค์ด ์์ด testcontainers + flyway๋ก CI ํ๊ฒฝ์์ ํ ์คํธ์ปจํ ์ด๋๋ก DSL์ ๋ง๋๋ ๋ฐฉ์์ ์ฃผ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ํด๋น ๋ด์ฉ์ ์๋ ๊ฐ์์์ ํ์ธ ๊ฐ๋ฅํ์ญ๋๋ค. (์ฌ์ง) ์๋ ์์ฑํ ์ฝ๋๋ฅผ Git Repository์ ํจ๊ป ์ ๋ก๋ํด์ผ ํ๋์ง ์ฌ์ญ๊ณ ์ถ์ต๋๋ค.์ด ๊ฒฝ์ฐ git commit์ด ๊น๋ํด์ง์ง ์์ ๊ฒ ๊ฐ์ ๊ฑฑ์ ์ด ๋ฉ๋๋ค.์ ๋ ์๋์์ฑ๋ DSL์ git ์ผ๋ก ๊ด๋ฆฌํ์ง ์์ต๋๋ค.git์ผ๋ก ๊ด๋ฆฌํ๊ฒ ๋๋ค๋ฉด ๋ง์ํ์ ๋๋ก git commit ๋ ์ง์ ๋ถํด์ง๊ณ , ๋๊ตฐ๊ฐ ๋งค๋ฒ ์๋์ผ๋ก ์์ฑ๋๋ DSL์ ๋ก์ง์ ๋ฃ๊ฑฐ๋ ํ ๊ฐ๋ฅ์ฑ์ด ์๊ฒจ์ ์ ํธํ์ง ์์ต๋๋ค. ๐1๋ฒ์ด ํด๊ฒฐ๋๋ค๋ฉด, 2๋ฒ์ ๊ณ ๋ คํ ํ์๋ ์๋ค๊ณ ์๊ฐ๋ฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค ใ ใ
- 1
- 3
- 111
Q&A
generate dao ๋ฅผ ํตํ ์ฝ์ ์ pk auto-increment ๊ฐ ์ ์ฉ๋์ง ์์ต๋๋ค
์ด๊ฐํ๋ ์๋ ํ์ธ์. ์ ๋ ๊ถ๊ธํด์ ๋ก์ปฌ์์ ์ฝํ๋ฆฐ์ผ๋ก ํ ์คํธํด๋ดค๋๋ฐ์.์ฝํ๋ฆฐ์ ๊ฒฝ์ฐ, ๋ก๊ทธ์์๋ง auto increment ์ปฌ๋ผ์ด 0์ผ๋ก ์ฐํ๊ณ ์ ์์ ์ผ๋ก ๋์ํ๋๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. (์ ๊ธฐํ๋ค์..?) (์ฌ์ง) ์ฐธ๊ณ ๋ก kotlin์ผ๋ก jOOQ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ฝํ๋ฆฐ ์ ์ฉ generator๋ฅผ ์ฌ์ฉํ์ ์ผํฉ๋๋ค. ์๋ ๋งํฌ ์ฐธ๊ณ ๋ถํ๋๋ฆฝ๋๋ค.https://www.jooq.org/doc/latest/manual/code-generation/codegen-output-languages/kotlingenerator/ ์๋๋ ์ ๊ฐ ํ ์คํธํ์๋ ์ฌ์ฉํ build.gradle ์ค์ ์ ๋๋ค.('์น์ 5. jOOQ ๊ณ ๊ธ - ๋ค์ํ ๋ฐฉ์์ผ๋ก jOOQ DSL ๋ง๋ค๊ธฐ'์ ์๋ testcontainer + flyway ์ค์ ์ ๋ณํํด์ ์ฌ์ฉํ์ต๋๋ค.) import org.jooq.meta.jaxb.* buildscript { ext { jooqVersion = '3.19.5' } } plugins { id 'java' id 'org.springframework.boot' version '3.2.3' id 'io.spring.dependency-management' version '1.1.4' id 'dev.monosoul.jooq-docker' version '6.0.14' id "org.jetbrains.kotlin.jvm" version "1.9.24" id "org.jetbrains.kotlin.plugin.spring" version "1.9.24" } group = 'org.sight' version = '0.0.1-SNAPSHOT' java { } repositories { mavenCentral() } sourceSets { main { java { srcDirs = ["src/main/java", "src/generated"] } } } jooq { version = "${jooqVersion}" withContainer { image { name = "mysql:8.0.29" envVars = [ MYSQL_ROOT_PASSWORD: "passwd", MYSQL_DATABASE : "sakila" ] } db { username = "root" password = "passwd" name = "sakila" port = 3306 jdbc { schema = "jdbc:mysql" driverClassName = "com.mysql.cj.jdbc.Driver" } } } } tasks { generateJooqClasses { schemas.set(["sakila"]) outputDirectory.set(project.layout.projectDirectory.dir("src/generated")) includeFlywayTable.set(false) usingJavaConfig { withName('org.jooq.codegen.KotlinGenerator') generate = new Generate() .withJavaTimeTypes(true) .withDeprecated(false) .withDaos(true) .withFluentSetters(true) .withRecords(true) .withKotlinNotNullPojoAttributes(true) // NOT NULL ์ปฌ๋ผ์ Kotlin์ Non-Null ํ์ ์ผ๋ก ์์ฑ (PK ์ ์ธ) .withKotlinNotNullRecordAttributes(true) // NOT NULL ์ปฌ๋ผ์ Kotlin์ Non-Null ํ์ ์ผ๋ก ์์ฑ (PK ์ ์ธ) withStrategy( new Strategy().withName("jooq.custom.generator.JPrefixGeneratorStrategy") ) database.withForcedTypes( new ForcedType() .withUserType("java.lang.Long") .withTypes("int unsigned"), new ForcedType() .withUserType("java.lang.Integer") .withTypes("tinyint unsigned"), new ForcedType() .withUserType("java.lang.Integer") .withTypes("smallint unsigned") ) } } } dependencies { implementation "org.jooq:jooq:${jooqVersion}" implementation 'org.springframework.boot:spring-boot-starter' implementation('org.springframework.boot:spring-boot-starter-jooq') { exclude group: 'org.jooq' } runtimeOnly 'com.mysql:mysql-connector-j' testImplementation 'org.springframework.boot:spring-boot-starter-test' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' jooqCodegen project(':jooq-custom') jooqCodegen "org.jooq:jooq:${jooqVersion}" jooqCodegen "org.jooq:jooq-meta:${jooqVersion}" jooqCodegen "org.jooq:jooq-codegen:${jooqVersion}" jooqCodegen 'org.flywaydb:flyway-core:10.8.1' jooqCodegen 'org.flywaydb:flyway-mysql:10.8.1' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" } tasks.named('test') { useJUnitPlatform() } kotlin { jvmToolchain(17) }
- 1
- 1
- 78
Q&A
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
- 2
- 197
Q&A
์๋ ํ์ธ์ ์์ฑ์ผ,์์ฑ์,์์ ์ผ,์์ ์๋ ์๋์ผ๋ก ํด์ฃผ๋ ๊ธฐ๋ฅ์ด ์์๊น์?
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
- 166
Q&A
Routines ๊ด๋ จ ์ง๋ฌธ
ํด๋น ์ง๋ฌธ์ ์ฐ์ ํด๊ฒฐ ์ฒ๋ฆฌํด๋๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ง์ฝ ์์ง ํด๊ฒฐ๋์ง ์์๋ค๋ฉด, ๋๊ธ๋ก ๋ต๋ณ์ฃผ์๋ฉด ๋ง์ ๋์๋๋ฆด์ ์๋๋ก ํ๊ฒ ์ต๋๋ค.๊ฐ์ฌํฉ๋๋ค :)
- 1
- 2
- 134
Q&A
Routines ๊ด๋ จ ์ง๋ฌธ
lannn๋ ์๋ ํ์ธ์ ์ฌ์ฉ ๋ฐฉ์ธ(dialect) ํ์ธํน์ ์ด๋ค db์ ํจ๊ป ์ฌ์ฉํ์๋ ค๋๊ฑด๊ฐ์?์์ฉdb (์๋ฅผ๋ค์ด ์ค๋ผํด์ด๋ MSSQL)์ ์ฌ์ฉํ๋ ค๋ฉด ๋ผ์ด์ผ์ค๋ฅผ ๊ตฌ๋งคํ์ ์ผํฉ๋๋ค ์ฐ๋ ๋ฐฉ์ ํ์ธtestcontainer ์์ด DDLDatabase๋ก ์ฌ์ฉํ์๋ฉด H2 db๊ธฐ์ค์ผ๋ก๋ง dsl์ ์์ฑํ ์ ์์ต๋๋ค ์๋ ๊ฐ์๋ฅผ ํ์ธ๋ถํ๋๋ ค์์น์ 5. jOOQ ๊ณ ๊ธ - ๋ค์ํ ๋ฐฉ์์ผ๋ก jOOQ DSL ๋ง๋ค๊ธฐ ์ถ๊ฐ๋ก ๊ถ๊ธํ์ ๋ถ๋ถ์ด ์๋ค๋ฉด ์๋ฌ ๋ก๊ทธ๋ ๊ฐ์ด ์ฒจ๋ถ ๋ถํ๋๋ฆฝ๋๋ค
- 1
- 2
- 134
Q&A
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
- 151
Q&A
DB ๋ฒค๋๋ณ ๋ด์ฅํจ์์ ๋ํ ๋ฐฉ์ธ ์ง์ ๋ฃ๊ณ ์ง๋ฌธ๋๋ ค์
์ด๊ฒฝ์ฉ๋ ์๋ ํ์ธ์. ๊ฐ์์์ MySQL์ ๊ฒฝ์ฐ MySQLDSL.group_concant(), PostgreSQL์ ๊ฒฝ์ฐ group_concat() ์ด๋ ๊ฒ ์ ์ด๋์๋๋ฐ์. ์ค์ ๋ก๋ static import ๋์ด์ PostgreDSL.group_concat() ์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค. ใ ใ ๊ทธ๋ฆฌ๊ณ MySQLDSL, PostgreDSL ์ด ๋ ๋ชจ๋ DSL ํด๋์ค๋ฅผ ์์๋ฐ๊ธฐ ๋๋ฌธ์ ์ฌ์ค์ DSL.group_concat() ๊ณผ ๋์ผํ๋ค๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค :) (์ฌ์ง)
- 1
- 1
- 146
Q&A
์ธํ ๋ฆฌ์ ์ด ํ ๋ง ์ง๋ฌธ
Jacob Lee ๋ ์๋ ํ์ธ์. ๊ฐ์์์ ์ฌ์ฉ๋ ํ ๋ง๋ ์ดํด๋ฆฝ์ค ๋คํฌ ํ ๋ง ํ๋ฌ๊ทธ์ธ์ ์ ์ฉํด์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.https://plugins.jetbrains.com/plugin/11055-eclipse-dark-theme-color-scheme ์์ ์ ์ดํด๋ฆฝ์ค์์ ์ฐ๋ ๋คํฌํ ๋ง๋ฅผ... ์์ง ๋ชปํด์ ์ธํ ๋ฆฌ์ ์ด์์๋ ์ฌ์ฉํ๊ณ ์์ต๋๋ค๐ ๊ฐ์ฌํฉ๋๋ค ใ ใ
- 2
- 3
- 338





