๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœ๏ธ Today I Learned(TIL)/์ŠคํŒŒ๋ฅดํƒ€ ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

[ TIL ] Kotlin ๋ฌธ๋ฒ• ๊ธฐ์ดˆ/์‹ฌํ™”_Day 3

by carrot0911 2025. 1. 23.

์˜ค๋Š˜ ํ•œ ๊ณต๋ถ€ ๐Ÿง 

QueryDSL ์ฑŒ๋ฆฐ์ง€๋ฐ˜ ์„ธ์…˜ ๋“ฃ๊ธฐ

  • ๊ณผ์ œ์— ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด QueryDSL ๊ณต๋ถ€
  • SQL, JPQL ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ Java ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ORM ๊ธฐ๋ฐ˜ ์ฟผ๋ฆฌ ๋นŒ๋”
  • SQL์„ Java ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋ฉด์„œ, ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋Œ€ํญ ๊ฐœ์„ ๋œ๋‹ค.
  • ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋งค์šฐ ์œ ์—ฐํ•˜๋‹ค.
  • ์ดˆ๊ธฐ ์„ธํŒ…์ด ๋งค์šฐ ๋ณต์žกํ•˜๋‹ค.
  • Q ํด๋ž˜์Šค ์ƒ์„ฑ์ด ํ•„์š”ํ•˜๋‹ค.

๊ณผ์ œ ํ•ด๊ฒฐ

  • JPQL๋กœ ์ž‘์„ฑ๋œ ๋ฉ”์„œ๋“œ๋ฅผ QueryDSL๋กœ ๋ณ€๊ฒฝ
    • ์„ธ์…˜์—์„œ ๋ฐฐ์šด๋Œ€๋กœ ์ดˆ๊ธฐ ์„ธํŒ…
    • todoId๋ฅผ ํ†ตํ•ด ์ผ์ •์„ ์กฐํšŒํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฉ”์„œ๋“œ๋ผ์„œ ์ฐจ๊ทผ์ฐจ๊ทผ ์ฝ”๋“œ ์ž‘์„ฑ
@Repository
@RequiredArgsConstructor
public class TodoQueryRepository {

    private final JPAQueryFactory queryFactory;

    public Optional<Todo> findByIdWithUser(Long todoId) {

        return Optional.ofNullable(queryFactory.select(todo)
                .from(todo)
                .leftJoin(todo.user, user)
                .fetchJoin()
                .where(
                        eqId(todoId)
                )
                .fetchFirst());
    }

    private BooleanExpression eqId(Long id) {
        if (id == null) {
            return null;
        }

        return todo.id.eq(id);
    }
}
  • fetch( ), fetchOne( ), fetchFirst( )์˜ ์ฐจ์ด์  ๊นจ๋‹ฌ์Œ.
    • fetch( ) : ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉ.
    • fetchOne( ) : ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉ. null์˜ ์œ„ํ—˜์„ฑ ์กด์žฌ.
    • fetchFirst( ) : ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉ. null์˜ ์œ„ํ—˜์„ฑ์ด ๋‚ฎ์•„ fetchOne๋ณด๋‹ค ์•ˆ์ „.

์Šคํƒ ๋‹ค๋“œ๋ฐ˜ ์„ธ์…˜ ๋“ฃ๊ธฐ

  • Docker.... ๋„ˆ๋ฌด๋‚˜๋„ ์–ด๋ ต๋‹ค..
  • Redis์— ๋Œ€ํ•ด์„œ ์•„์ฃผ ์ชผ๊ธˆ..? ์ดํ•ดํ•œ ๊ฒƒ ๊ฐ™๋‹ค.
  • ์ด์šฉํ•˜๋ฉด ํ™•์‹คํžˆ ํŽธ๋ฆฌํ•œ ์นœ๊ตฌ๋“ค์ด๋ผ๋Š” ๊ฒƒ์„ ๋Š๊ผˆ๋‹ค.

 

ํŠœํ„ฐ๋‹˜๊ป˜ ๊ฟ€ํŒ ๋“ฃ๊ธฐ

  • ๋ธ”๋กœ๊ทธ ๊ด€๋ จ ๊ฟ€ํŒ
    • ๋ฐœํ‘œํ•œ ๋ถ€๋ถ„์„ ๋”ฐ๋กœ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋‚˜๋ˆ ์„œ ๋„ฃ์–ด๋‘๋ฉด ๋” ๋ˆˆ์— ์ž˜ ๋ณด์ผ ๊ฒƒ ๊ฐ™๋‹ค.
    • ์œ ํŠœ๋ธŒ์— ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ๋„ ์ข‹์€๋ฐ, '์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐœํ‘œํ•˜๊ณ  ์žˆ๊ตฌ๋‚˜'๋ผ๋Š” ๋Š๋‚Œ์ด ๋Š๊ปด์ง€๋ฉด ๋” ์ข‹์€ ์ž๋ฃŒ๊ฐ€ ๋  ๊ฒƒ ๊ฐ™๋‹ค.
    • Test๋ฅผ ์—ฌ๋Ÿฌ ๋ฐฉํ–ฅ์—์„œ ๋Œ๋ ค๋ณด๋ฉด์„œ ์ƒํ™ฉ์„ ์ •๋ฆฌํ•˜๋Š” ๊ธ€๊ณผ ๊ฑฐ๊ธฐ์„œ ๋ฐœ์ƒํ–ˆ๋˜ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค.
    • ์ƒํ™ฉ์„ ์บก์ฒ˜ํ•˜๊ณ , ์˜ค๋ฅ˜ ์ฝ”๋“œ๋“ค๋„ ๊ฐ™์ด ์ž‘์„ฑํ•ด๋†“์œผ๋ฉด ๋„์›€์ด ๋œ๋‹ค!
  • ์„ฑ์žฅ์„ ํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฟ€ํŒ
    • ํ•œ๋‹ฌ ์ „์— ์ž‘์„ฑํ–ˆ๋˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณธ๋‹ค. → ์„ฑ์žฅํ•œ ๋ถ€๋ถ„ ํ˜น์€ ๋‹ค์‹œ ๊ณต๋ถ€ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • '์–ด... ์ด๊ฑฐ ๋‹ค์‹œ ์งœ๋ผ๊ณ  ํ•˜๋ฉด ํ•  ์ˆ˜ ์žˆ์„๊นŒ?' ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค๋ฉด ์•„์ง ๊ฐœ๋…์ด ์™„๋ฒฝํ•˜๊ฒŒ ์ž๋ฆฌ์žก์ง€ ์•Š์•˜๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋ชจ๋ฅด๋Š” ๋ถ€๋ถ„์„ ์งš๊ณ  ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
    • '์Œ... ์ž˜์งฐ๊ตฐ..' ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค๋ฉด ๋‹ค์Œ์— ์ฝ”๋“œ ์ž‘์„ฑํ•  ๋•Œ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • '๋‚ด๊ฐ€ ์ฝ”๋“œ๋ฅผ ์™œ ์ด๋ ‡๊ฒŒ ์งฐ์ง€? ์ด๋ ‡๊ฒŒ ์งœ๋ฉด ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™์€๋ฐ?' ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค๋ฉด ๋‚ด๊ฐ€ ์„ฑ์žฅํ–ˆ๋‹ค๋Š” ์ฆ๊ฑฐ์ด๋‹ค! ์˜ˆ์ „๋ณด๋‹ค ๋” ์„ฑ์žฅํ•ด์„œ ์ƒ๊ฐํ•˜๋Š” ๋ฐฉํ–ฅ์ด ๋ฐœ์ „๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์ƒ๊ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋งˆ์Œ๊ฐ€์ง ๊ฟ€ํŒ
    • ๊ณ„์† ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด ๋‚ด์šฉ๋“ค์ด ์ด์–ด์ ธ์„œ ์ง€์‹์ด ๋œ๋‹ค.
    • ์ด๋Ÿฐ ์ง€์‹์ด ๋ ๋ ค๋ฉด ์ •๋ณด๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๊ณ , ์ •๋ณด๋ฅผ ์—ด์‹ฌํžˆ ์Œ“๋Š”๋‹ค๋Š” ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ณ  ์กฐ๊ธ‰ํ•ด์ง€์ง€ ๋ง๊ณ , ๋ถ€์ •์ ์ธ ์ƒ๊ฐ์„ ํ•˜์ง€ ๋ง๊ณ  ๋ถ€์ง€๋Ÿฐํžˆ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด ์ •๋ณด๋“ค์ด ๋ชจ์—ฌ ์ง€์‹์ด ๋  ๊ฒƒ์ด๋‹ค.
    • ์ง€๊ธˆ ์‹œ์ ์—์„œ๋Š” ์ด์ „ ๋‚ด์šฉ์„ ๋‹ค์ง€๋Š” ๋…ธ๋ ฅ 6 (์ธ์ฆ/์ธ๊ฐ€, AOP, ํŠธ๋žœ์žญ์…˜) : ์ƒˆ๋กœ์šด ๊ธฐ์ˆ  ๊ณต๋ถ€ 4 (Docker, AWS, QueryDSL) ๋น„์œจ๋กœ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค!
    • ๊ณ„์†ํ•ด์„œ ๋‚˜์˜ค๋Š” ๊ธฐ์ˆ ๋“ค๋„ ๊ธฐ์กด์— ์žˆ๋˜ ๊ฒƒ๋“ค์˜ ๋ถˆํŽธํ•œ ์ ๋“ค์ด ๊ฐœ์„ ๋˜๊ณ  ๋ฐœ์ „๋˜์–ด์„œ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํƒ„ํƒ„ํ•˜๊ฒŒ ์Œ“๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
    • ํ•œ๋‹จ๊ณ„์”ฉ ์„ฑ์žฅํ•ด ๋‚˜๊ฐ„๋‹ค ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ž! ๋„ˆ๋ฌด ๊ธ‰ํ•˜๊ฒŒ ๊ฐˆ ํ•„์š”๋Š” ์—†๋‹ค.
      ์ด๋ฏธ 3๊ฐœ์›”๋™์•ˆ ๋งŽ์€ ์„ฑ์žฅ์„ ํ•ด๋ƒˆ๊ณ  ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ ์ด ๋งŽ์ด ๋‚จ์•„์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ฐฐ์บ  ๋“ฃ๋Š” ๋™์•ˆ ์ตœ๋Œ€ํ•œ ์ด ํ™˜๊ฒฝ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค!
  • ๋ถ€ํŠธ์บ ํ”„ or Spring์— ๋Œ€ํ•ด ์–ด๋Š ์ •๋„ ์ž์‹ ์ด ์žˆ๋‹ค๋ฉด ๊ทธ ํ›„์—๋Š”?!
    • CS ์ง€์‹ ๊ณต๋ถ€ → ์ •๋ณด, ์ง€์‹๋“ค์ด ๋‹ค ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด ์ƒ๊ฐํ•˜๋Š” ๊นŠ์ด๊ฐ€ ๋‹ฌ๋ผ์ง€๊ณ  ๋” ํƒ„ํƒ„ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค!
    • ํ•˜๋ฃจ์— 30๋ถ„ ์ •๋„๋Š” ์šด๋™์„ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค! ๊ธฐ๋ถ„๋„ ์ƒ์พŒํ•ด์ง€๊ณ  ์ฐŒ๋ฟŒ๋‘ฅํ•œ ๋ชธ์„ ํ’€ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹๋‹ค!

 

์˜ค๋Š˜ ํ•˜๋ฃจ ์ •๋ฆฌ โœ๏ธ

์˜ค๋Š˜์€ ์–ป์–ด๊ฐ€๋Š” ๊ฒƒ์ด ๋งŽ์€ ํ•˜๋ฃจ์˜€๋‹ค.

์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด QueryDSL์„ ํ™œ์šฉํ•ด์„œ ๊ณผ์ œ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ์„ธ์…˜์—์„œ Docker๋ฅผ ์ด์šฉํ•ด์„œ Redis๊นŒ์ง€ ์‚ฌ์šฉํ•ด๋ดค๋‹ค!
๋ฌผ๋ก  ์ฒ˜์Œ์— ๊ฐœ๋…์„ ์ตํžˆ๊ธฐ๊นŒ์ง„ ๊ณ ํ†ต์Šค๋Ÿฌ์› ๋‹ค....... ์ดํ•ด๋„ ๋˜์ง€ ์•Š์•˜๊ณ , ์ด๊ฑธ ๋„๋Œ€์ฒด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฑด์ง€ ์˜๋ฌธ๋งŒ ๊ฐ€๋“ํ–ˆ๋Š”๋ฐ ์ง์ ‘ ํ™œ์šฉํ•ด๋ณด๊ณ  ๊ฒฝํ—˜ํ•ด๋ณด๋‹ˆ๊นŒ ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์กฐ๊ธˆ์€ ์•Œ ๊ฒƒ ๊ฐ™์•˜๋‹ค.
์˜ค๋Š˜ ์‚ฌ์šฉํ•ด๋ณธ ๊ฒƒ์œผ๋กœ ๋งŒ์กฑํ•˜์ง€ ์•Š๊ณ  ๊ณ„์† ์‚ฌ์šฉํ•ด๋ณด๋ฉด์„œ ์ต์ˆ™ํ•ด์ ธ์•ผ ํ•œ๋‹ค!! ํ˜„์—…์— ๋“ค์–ด๊ฐ€๋ฉด ๊ณ„์† ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ์นœ๊ตฌ๋“ค์ด๋‹ˆ๊นŒ ๋‚ด ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ํ™•์‹คํ•˜๊ฒŒ ์งš๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•˜๋Š” ๊ฐœ๋…๋“ค์ด๋‹ค.. ๋ชจ๋ฅด๋Š” ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ๋ฐ”๋กœ๋ฐ”๋กœ ๊ณต๋ถ€ํ•ด์„œ ๋„˜์–ด๊ฐ€๋„๋ก ๋…ธ๋ ฅํ•ด์•ผ๊ฒ ๋‹ค :)

๊ทธ๋ฆฌ๊ณ  ์˜ค๋Š˜ ์ฒ˜์Œ์œผ๋กœ ํŠœํ„ฐ๋‹˜๊ณผ ์—„์ฒญ ์˜ค๋ž˜ ๋Œ€ํ™”ํ–ˆ๋‹ค!
์ฒ˜์Œ์—๋Š” ๋ชจ๋ฅด๋Š” ๊ฐœ๋…์— ๋Œ€ํ•ด ๋ฌผ์–ด๋ณด๋Ÿฌ ๊ฐ”์ง€๋งŒ ์–ด์ œ ์ง„ํ–‰ํ–ˆ๋˜ ๋ฏธ๋‹ˆ ์„ธ์…˜์„ ์‹œ์ž‘์œผ๋กœ, ๋ธ”๋กœ๊ทธ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•, ๊ณต๋ถ€ ๋ฐฉ๋ฒ• ๋“ฑ๋“ฑ ์ด๊ฒƒ์ €๊ฒƒ ๊ฟ€ํŒ์„ ์—„์ฒญ ๋งŽ์ด ์•Œ๋ ค์ฃผ์…จ๋‹ค ๐Ÿ˜ณ
๋•๋ถ„์— ์ง€๊ธˆ๊นŒ์ง€ ํ˜ผ๋ž€์Šค๋Ÿฌ์› ๋˜ ๋จธ๋ฆฌ๊ฐ€ ์กฐ๊ธˆ์€ ์ •๋ฆฌ๋˜๊ณ  ๊ธ‰ํ•ด์กŒ๋˜ ๋งˆ์Œ ๋˜ํ•œ ์ง„์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
์ฒ˜์Œ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ๋ณด๋‹ค ํ™•์‹คํžˆ ์—„์ฒญ๋‚˜๊ฒŒ ์„ฑ์žฅํ–ˆ๊ณ , ์•ž์œผ๋กœ๋„ ๊ณ„์† ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋‹ค! ์ค‘๊ฐ„์ค‘๊ฐ„ ๊ธฐ๋กํ•˜๋Š” ์Šต๊ด€์„ ๋” ๋…ธ๋ ฅํ•˜๊ณ  ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…, ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ, ์„ธ์…˜๊ณผ ๊ฐ™์€ ๊ฒƒ์— ์ข€ ๋” ์‹ ๊ฒฝ์„ ์จ์„œ ์ค€๋น„ํ•œ๋‹ค๋ฉด ๋” ์ข‹์€ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค!

๋‚ด์ผ์€ ๊ธˆ์š”์ผ.. ๊ทธ๋ฆฌ๊ณ  ์ฃผ๋ง์—๋Š” ๋ถ€์‚ฐ ์—ฌํ–‰..
๋‚ด์ผ๊นŒ์ง„ ๋ฌด์กฐ๊ฑด ํ•„์ˆ˜ ๊ณผ์ œ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ  ์ฃผ๋ง ์‹ ๋‚˜๊ฒŒ ๋ณด๋‚ด๊ณ  ์›”์š”์ผ๊นŒ์ง€ ๊ณผ์ œ ์ž˜ ๋งˆ๋ฌด๋ฆฌํ•ด์„œ ์ œ์ถœํ•ด์•ผ๊ฒ ๋‹ค!

๋‚ด์ผ๋„ ํž˜๋‚ด๋ณด์ž!!!!

 

๋‚ด์ผ ๊ณ„ํš โฐ

  • ๊ณผ์ œ ์ง„ํ–‰
  • ํ•„์š”ํ•œ ์„ธ์…˜ ๋‹ค์‹œ ๋“ฃ๊ธฐ
  • ํ•„์š”ํ•œ ๋ถ€๋ถ„ ์ถ”๊ฐ€ ๊ณต๋ถ€

+ ์ถ”๊ฐ€ ๊ณ„ํš์ด ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ์Šด๋‹ค~_~