JDBC-intro

Updated:

Categories:

Tags: , ,

๐Ÿ“Œ ๊ฐœ์ธ์ ์ธ ๊ณต๊ฐ„์œผ๋กœ ๊ณต๋ถ€๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๋ณต์Šตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
์ •ํ™•ํ•˜์ง€ ์•Š์€ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ๋ฐ”๋ž๋‹ˆ๋‹ค :๐Ÿ˜ธ
[ํ‹€๋ฆฐ ๋‚ด์šฉ์€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๋ณต๋ฐ›์œผ์‹ค๊ฑฐ์—์š”]

JDBC๋ž€?

  1. JDBC(Java Database Connectivity)
    • Java ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ ๋ฐ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ Java ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” Java์—์„œ ์ œ๊ณตํ•˜๋Š” ํ‘œ์ค€ ์‚ฌ์–‘(๋˜๋Š” ๋ช…์„ธ, Specification)
    • JDBC API๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค์–‘ํ•œ ๋ฒค๋”(Oracle, MS SQL, MySQL ๋“ฑ)์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๋™๊ฐ€๋Šฅ

JDBC ๋™์ž‘ ํ๋ฆ„

๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ JDBC API๋ฅผ ์ด์šฉํ•ด ์ ์ ˆํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๋กœ๋”ฉํ•œ ํ›„, Database์™€ interaction ํ•œ๋‹ค

  1. JDBC Driver
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค
    • Oracle์ด๋‚˜ MS SQL, MySQL ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋ฒค๋”์—์„œ๋Š” ํ•ด๋‹น ๋ฒค๋”์— ๋งž๋Š” JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ์ œ๊ณต์„ ํ•จ,
    • ์šฐ๋ฆฌ๋Š” ์ด JDBC ๋“œ๋ผ์ด๋ฒ„์˜ ๊ตฌํ˜„์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ํŠน์ • ๋ฒค๋”์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์ž‡์Œ
  2. JDBC API
    • JDBC API ์‚ฌ์šฉ ํ๋ฆ„

    ์˜ˆ์ „์— DBํ•  ๋•Œ ๋งˆ์ง€๋ง‰์— JDBC์—์„œ ๋ฐฐ์› ๋˜ ๊ฒƒ.

    ์ž์„ธํžˆ ์•Œ ํ•„์š”๋Š” ์—†์ง€๋งŒ ๊ฐ„๋‹จํžˆ ๋ณด๊ณ  ๊ฐ€๊ธฐ

    1. JDBC ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ
      • ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๋กœ๋”ฉ
      • JDBC ๋“œ๋ผ์ด๋ฒ„๋Š” DriverManager๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด์„œ ๋กœ๋”ฉ๋จ
    2. Connection ๊ฐ์ฒด ์ƒ์„ฑ
      • JDBC ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋กœ๋”ฉ๋˜๋ฉด DriverManager๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ๋˜๋Š” ์„ธ์…˜(Session)์ธ Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
    3. Statement ๊ฐ์ฒด ์ƒ์„ฑ
      • Statement ๊ฐ์ฒด๋Š” ์ž‘์„ฑ๋œ SQL ์ฟผ๋ฆฌ๋ฌธ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด๋กœ์จ ๊ฐ์ฒด ์ƒ์„ฑ ํ›„์— ์ •์ ์ธ SQL ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ์œผ๋กœ ๊ฐ€์ง
    4. Query ์‹คํ–‰
      • ์ƒ์„ฑ๋œ Statement ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ์ž…๋ ฅํ•œ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    5. ResultSet ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ์กฐํšŒ
      • ์‹คํ–‰๋œ SQL ์ฟผ๋ฆฌ๋ฌธ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ ์…‹์ž…๋‹ˆ๋‹ค.
    6. ResultSet ๊ฐ์ฒด Close, Statement ๊ฐ์ฒด Close, Connection ๊ฐ์ฒด Close
      • JDBC API๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ๋œ ๊ฐ์ฒด๋“ค์€ ์‚ฌ์šฉ ์ดํ›„์— ์‚ฌ์šฉํ•œ ์ˆœ์„œ์˜ ์—ญ์ˆœ์œผ๋กœ ์ฐจ๋ก€๋กœ Close ํ•ด์•ผํ•จ.
  3. Connection Pool
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค Connection ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์„œ ๋ณด๊ด€ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•„์š”ํ•  ๋•Œ ์ด Connection์„ ์ œ๊ณตํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” Connection ๊ด€๋ฆฌ์ž
    • DB์™€์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•ด Connection๊ฐ์ฒด ์ƒ์„ฑํ•˜ํ•˜๋Š” ์ž‘์—…์€ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋‹ˆ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์„œ ๋ณด๊ด€ํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ ์ œ๊ณตํ•จ.
    • ์›๋ž˜ Apache Commons DBCP(Database Connection Pool, DBCP)๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ
    • Spring Boot 2.0๋ถ€ํ„ฐ๋Š” ์„ฑ๋Šฅ๋ฉด์—์„œ ๋” ๋‚˜์€ ์ด์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” HikariCP๋ฅผ ๊ธฐ๋ณธ DBCP๋กœ ์ฑ„ํƒ

Spring Data JDBC๋ž€?

SQL ์ค‘์‹ฌ ๊ธฐ์ˆ 

  • ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ mybatis์™€ Spring JDBC๋Š” ๋Œ€ํ‘œ์ ์ธ SQL ์ค‘์‹ฌ ๊ธฐ์ˆ 
  • Spring JDBC์˜ JdbcTemplate ์‚ฌ์šฉ ์˜ˆ

    1
    2
    3
    
      Member member = this.jdbcTemplate.queryForObject(
          "select * from member where member_id=?", 1, Member.class);
        
    
  • Java ์ง„์˜์—์„œ๋Š” SQL ์ค‘์‹ฌ์˜ ๊ธฐ์ˆ ์—์„œ ๊ฐ์ฒด(Object) ์ค‘์‹ฌ์˜ ๊ธฐ์ˆ ๋กœ ์ง€์†์ ์œผ๋กœ ์ด์ „์„ ํ•˜๊ณ  ์žˆ๋Š” ์ถ”์„ธ

๊ฐ์ฒด(Object) ์ค‘์‹ฌ ๊ธฐ์ˆ 

  • ๊ฐ์ฒด(Object) ์ค‘์‹ฌ ๊ธฐ์ˆ ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ SQL ์ฟผ๋ฆฌ๋ฌธ์„ ์ง์ ‘์ ์œผ๋กœ ์ž‘์„ฑํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•  ๊ฒฝ์šฐ, Java ๊ฐ์ฒด(Object)๋ฅผ ์ด์šฉํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์—์„œ ์ด Java ๊ฐ์ฒด(Object)๋ฅผ SQL ์ฟผ๋ฆฌ๋ฌธ์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜ ํ•œ ํ›„์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•จ.
  • ๊ฐ์ฒด(Object) ์ค‘์‹ฌ์˜ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ธฐ์ˆ ์„ ORM(Object-Relational Mapping)
  • Java์—์„œ ๋Œ€ํ‘œ์ ์ธ ORM ๊ธฐ์ˆ ์ด ๋ฐ”๋กœ JPA(Java Persistence API)

Spring Data JDBC

Spring Data JDBC๋Š” JPA์ฒ˜๋Ÿผ ORM ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ JPA์˜ ๊ธฐ์ˆ ์  ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถ˜ ๊ธฐ์ˆ 

  1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€

    1
    2
    3
    4
    5
    6
    
     dependencies {
     	...
     	...
     	implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
     	runtimeOnly 'com.h2database:h2'
     }
    
    • ์ธ๋ฉ”๋ชจ๋ฆฌ(In-memory) DB์ธ H2๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์˜์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ •์— ์ถ”๊ฐ€

      ์ธ๋ฉ”๋ชจ๋ฆฌ DB๋ž€? ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

      โœ”๏ธ ์ธ๋ฉ”๋ชจ๋ฆฌ(In-memory) DB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

      • ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ์ธ๋ฉ”๋ชจ๋ฆฌ(In-memory) DB๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉ
      • ์™œ ? ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ…Œ์ŠคํŠธ ์ธก๋ฉด์—์„œ ๋งŽ์€ ์ด์ 
      • ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚˜๊ณ  ๋‚˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์— ๋‚จ์•„์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ๊นจ๋—์ด ๋น„์›Œ์ ธ ์žˆ๋Š” ๊ฒƒ์ด ์ข‹์Œ
  2. H2 ๊ด€๋ จ ์„ค์ • ์ถ”๊ฐ€

    1
    2
    3
    4
    5
    
     spring:
       h2:
         console:
           enabled: true
        
    
    • ์›น ๋ธŒ๋ผ์šฐ์ € ์ƒ(H2 ์ฝ˜์†”)์—์„œ H2 DB์— ์ ‘์†ํ•œ ํ›„, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌ๊ฐ€๋Šฅ
    • yml ํŒŒ์ผ์—์„œ๋Š” indent๋ฅผ ์ฃผ์–ด์„œ depth๋ฅผ ์„ค์ •ํ•  ๋•Œ์—๋Š” Tab(ํƒญ) ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ
  3. H2 Database์— ์ ‘์†
    1. localhost:8080/h2-console
    2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๊ทธ์— ์ถœ๋ ฅ๋˜๋Š” JDBC URL์„ ํ™•์ธํ•˜์—ฌ JDBC URL์— ์ž…๋ ฅ ํ›„ Connect
    3. H2 DB ์„ค์ • ์ถ”๊ฐ€ โ†’ JDBC URL์ด ๋žœ๋ค์œผ๋กœ ๋ฐ”๋€Œ๋Š” ๋ถˆํŽธํ•จ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•จ

      1
      2
      3
      4
      5
      6
      7
      8
      
       spring:
         h2:
           console:
             enabled: true
             path: /h2     # (1) Context path ๋ณ€๊ฒฝ
         datasource:
           url: jdbc:h2:mem:test     # (2) JDBC URL ๋ณ€๊ฒฝ
              
      
      • H2 ์ฝ˜์†”์˜ ์ ‘์† URL Context path๋ฅผ ์กฐ๊ธˆ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ โ€˜/h2โ€™๋กœ ์„ค์ •
      • JDBC URL์ด ๋งค๋ฒˆ ๋žœ๋คํ•˜๊ฒŒ ๋ฐ”๋€Œ์ง€ ์•Š๋„๋ก โ€˜jdbc:h2:mem:testโ€™๋กœ ์„ค์ •
  4. ํด๋ž˜์Šค ๊ตฌํ˜„ [์ƒˆ๋กœ ๋ฐฐ์šด ๊ฒƒ๋งŒ ์ •๋ฆฌํ•จ.]
    • MessageDto(DTO ํด๋ž˜์Šค)
    • MessageController
    • MessageMapper
    • MessageService

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      
        package com.springboot.hello_world.service;
              
        import com.springboot.hello_world.entity.Message;
        import com.springboot.hello_world.repository.MessageRepository;
        import org.springframework.stereotype.Service;
              
        @Service
        public class MessageService {
            private final MessageRepository messageRepository;
              
            public MessageService(MessageRepository messageRepository) {
                this.messageRepository = messageRepository;
            }
              
            public Message createMessage(Message message){
                return messageRepository.save(message); 
            }
        }
              
      
      1. MessageRepository ์ธํ„ฐํŽ˜์ด์Šค๋Š” MessageService ํด๋ž˜์Šค์—์„œ DI๋ฅผ ํ†ตํ•ด ์ฃผ์ž…๋ฐ›์Œ
      2. messageRepository.save(message)์™€ ๊ฐ™์ด save() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ

        1) Sava ๋ฉ”์„œ๋“œ๋Š” CrudRepository๊ฐ€ ์ด ์ž‘์—…์„ ๋Œ€์‹ ํ•ด ์ฃผ๋Š” ์—ญํ• 

        2) ์ฟผ๋ฆฌ๋ฌธ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ €์žฅํ•  ๋•Œ ๊ธฐ๋Šฅ (==insert into)

    • Message (Entity ํด๋ž˜์Šค)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      
        import lombok.Getter;
        import lombok.Setter;
        import org.springframework.data.annotation.Id;
              
        @Getter
        @Setter
        public class Message {  // (1)
            @Id    // (2)
            private long messageId;
            private String message;
        }
              
      

      1) Message๋ผ๋Š” ํด๋ž˜์Šค ๋ช…์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ” ๋ช…

      2) @Id์• ๋„ˆํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ์˜ ๊ณ ์œ  ์‹๋ณ„์ž ์—ญํ•  =primary key

    • MessageRepository

      1
      2
      3
      4
      5
      
        import org.springframework.data.repository.CrudRepository;
              
        public interface MessageRepository extends CrudRepository<Message, Long> {
        }
              
      
      1. ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๋™์„ ๋‹ด๋‹นํ•˜๋Š” Repository
      2. CrudRepository
        1. CrudRepository๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†, ์ œ๋„ˆ๋ฆญ ํƒ€์ž…์ด <Message, Long>์œผ๋กœ ์„ ์–ธ
        2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— CRUD(๋ฐ์ดํ„ฐ ์ƒ์„ฑ, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ) ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด Spring์—์„œ ์ง€์›ํ•ด ์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค
        3. CrudRepository๋ฅผ ์ƒ์†ํ•จ์œผ๋กœ์จ query๋ฅผ ๋”ฐ๋กœ ์ž‘์„ฑํ•  ์ผ๋„ ์—†๊ณ  container์— bean์„ ๋“ฑ๋กํ•˜์ง€ ์•Š์•„๋„ CrudRepository๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ์–ด์„œ ๊ดœ์ฐฎ์Œ.

    1. application. yml ์ถ”๊ฐ€ ์„ค์ • - H2 DB์— MESSAGE ํ…Œ์ด๋ธ” ์ƒ์„ฑ

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      
       spring:
         h2:
           console:
             enabled: true
             path: /h2
         datasource:
           url: jdbc:h2:mem:test
         **sql:
           init:
             schema-locations: classpath*:db/h2/schema.sql**
         jpa:
           hibernate:
             ddl-auto: create  # (1) ์Šคํ‚ค๋งˆ ์ž๋™ ์ƒ์„ฑ
           show-sql: true      # (2) SQL ์ฟผ๋ฆฌ ์ถœ๋ ฅ
              
      

      schema.sql

      1
      2
      3
      4
      5
      
       CREATE TABLE IF NOT EXISTS MESSAGE(
           message_id BIGINT NOT NULL AUTO_INCREMENT,
           message varchar(100) NOT NULL,
           PRIMARY KEY (message_id)
       );
      
      • ์ธ๋ฉ”๋ชจ๋ฆฌ DB๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค schema.sql ํŒŒ์ผ์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋งค๋ฒˆ ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ ๊ธฐ์–ตํ•˜๊ธฐ.
    2. H2 ์ฝ˜์†”์— ์ ‘์†ํ•ด์„œ MESSAGE ํ…Œ์ด๋ธ” ํ™•์ธ

    3. POSTRUN

      POST์š”์ฒญ์œผ๋กœ message๋งŒ ์กฐ๊ธˆ ๋ณ€๊ฒฝํ•จ

    4. MESSAGE table ์กฐํšŒ

      POST ์š”์ฒญ์ด ์ž˜ ๋˜์—ˆ๋Š”์ง€ Message table ์กฐํšŒ

Spring Data JDBC - Entity, table์„ค๊ณ„

DDD(Domain Driven Design) : ๋„๋ฉ”์ธ ์œ„์ฃผ์˜ ์„ค๊ณ„ ๊ธฐ๋ฒ•

  1. Domain์ด๋ž€
    1. ๋„๋ฉ”์ธ์ด๋ž€ ์šฉ์–ด ์ž์ฒด๋Š” ํ•œ ๋งˆ๋””๋กœ ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ํ˜„์‹ค ์„ธ๊ณ„์—์„œ ์ ‘ํ•˜๋Š” ์—…๋ฌด์˜ ํ•œ ์˜์—ญ
    2. ๋น„์ฆˆ๋‹ˆ์Šค ์—…๋ฌด ์˜์—ญ์„ ์˜๋ฏธํ•˜๋Š” ๋„๋ฉ”์ธ ์ง€์‹(Domain Knowledge)๋“ค์„ ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
  2. Aggreagate
    1. ๋น„์Šทํ•œ ์—…๋ฌด ๋„๋ฉ”์ธ๋“ค์˜ ๋ฌถ์Œ
    2. ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ(Aggregate)๋Š” ํ•œ๋งˆ๋””๋กœ ๋น„์Šทํ•œ ๋ฒ”์ฃผ์˜ ์—ฐ๊ด€๋œ ์—…๋ฌด๋“ค์„ ํ•˜๋‚˜๋กœ ๊ทธ๋ฃนํ™”ํ•ด๋†“์€ ๊ทธ๋ฃน์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ
  3. Aggregate Root
    1. ๊ฐ๊ฐ์˜ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์—๋Š” ํ•ด๋‹น ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ๋„๋ฉ”์ธ์ด ์กด์žฌํ•จ
    2. ํ•˜๋‚˜์˜ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ๋„๋ฉ”์ธ์„ DDD์—์„œ๋Š” ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ(Aggregate Root)
    3. ์–ด๋–ค ํŠน์ • ์ง‘๋‹จ์ด๋‚˜ ๊ทธ๋ฃน์˜ ๋Œ€ํ‘œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ
    4. ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์˜ ์„ ์ •๊ธฐ์ค€ โ‡’ ๋„๋ฉ”์ธ๋“ค๊ณผ ์ง๊ฐ„์ ‘์ ์œผ๋กœ ์—ฐ๊ด€๋˜์–ด ์žˆ๋Š” ๋„๋ฉ”์ธ
    5. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ” ๊ฐ„ ๊ด€๊ณ„๋กœ ๋ณด์ž๋ฉด, ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ๋Š” ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์ด ๋˜๊ณ , ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ๋“ค์€ ์ž์‹ ํ…Œ์ด๋ธ”์ด ๋˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šท..
    6. ๋ฐฐ๋‹ฌ์ฃผ๋ฌธ ์•ฑ์„ ์„ธ๋ถ„ํ™” ํ•˜๋ฉด

      • ํšŒ์› ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ, ์ฃผ๋ฌธ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ, ์Œ์‹ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ, ๊ฒฐ์ œ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋ผ ํ•  ์ˆ˜ ์žˆ์Œ.

์—”ํ‹ฐํ‹ฐ ๊ตฌํ˜„

  1. ์—”ํ‹ฐํ‹ฐ ์„ค๊ณ„ ํ™•์ธ - ์ปคํ”ผ ์ฃผ๋ฌธ ์ƒ˜ํ”Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

    • Mebmer : Order =1: N
      • Order์— member_Id ์™ธ๋ž˜ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์กฐ์ธ.
    • Order : Coffee =N:M โ†’JoinTable๋กœ OrderCoffee
      • OrderCoffee์— order_Id์™€ coffee_Id ์™ธ๋ž˜ํ‚ค ์ถ”๊ฐ€ํ•˜์—ฌ ์กฐ์ธ
    • DB์—์„œ๋Š” ๋‹ค์— ํ•ด๋‹นํ•˜๋Š” ํ…Œ์ด๋ธ”์ด ์ฐธ์กฐํ‚ค๋ฅผ ๊ฐ€์กŒ๋‹ค๋ฉด ํด๋ž˜์Šค์—์„œ๋Š” 1์— ํ•ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค์—์„œ ๊ฐ์ฒด ์ฐธ์กฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋จ, (List)
  2. ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๊ฐ์ฒด ๋งคํ•‘ ๊ทœ์น™

    • Aggregate : ๊ด€๋ จ๋œ ๊ฐ์ฒด๋ฅผ ๋ชจ์•„๋‘” ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ Value Object์™€ Entity๋กœ ๊ตฌ์„ฑ
    • Aggregate ์ค‘์‹ฌ์—๋Š” Aggregate Root๊ฐ€ ์กด์žฌ

    (1) ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด์˜ ์ƒํƒœ๋Š” ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋ณ€๊ฒฝ๊ฐ€๋Šฅ

    โ†’ ์–ด๋–ค ์‹์œผ๋กœ๋“  ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ๊ฐ€ ๋‚˜๋จธ์ง€ ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ์— ๋Œ€ํ•œ ๊ฐ์ฒด๋ฅผ ์ง๊ฐ„์ ‘์ ์œผ๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ

    (2) ํ•˜๋‚˜์˜ ๋™์ผํ•œ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋‚ด์—์„œ์˜ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด ์ฐธ์กฐ

    • ๋™์ผํ•œ ํ•˜๋‚˜์˜ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋‚ด์—์„œ๋Š” ์—”ํ‹ฐํ‹ฐ ๊ฐ„์— ๊ฐ์ฒด๋กœ ์ฐธ์กฐ

    (3) ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ ๋Œ€ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ ๊ฐ„์˜ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด ์ฐธ์กฐ

    • ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ ๊ฐ„์˜ ์ฐธ์กฐ๋Š” ๊ฐ์ฒด ์ฐธ์กฐ ๋Œ€์‹ ์— ID๋กœ ์ฐธ์กฐํ•œ๋‹ค.
    • 1๋Œ€1 ๋˜๋Š” 1๋Œ€N ๊ด€๊ณ„์ผ ๋•Œ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ์™ธ๋ž˜ํ‚ค ๋ฐฉ์‹๊ณผ ๋™์ผํ•˜๋‹ค.
    • N๋Œ€ N ๊ด€๊ณ„์ผ ๋•Œ๋Š” ์™ธ๋ž˜ํ‚ค ๋ฐฉ์‹์ธ ID ์ฐธ์กฐ์™€ ๊ฐ์ฒด ์ฐธ์กฐ ๋ฐฉ์‹์ด ํ•จ๊ป˜ ์‚ฌ์šฉ๋จ

์—”ํ‹ฐํ‹ฐ ๊ตฌํ˜„ - ์˜ˆ์ œ

  1. Order

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
     package com.springboot.order.entity;
        
     import lombok.Getter;
     import lombok.Setter;
     import org.springframework.data.annotation.Id;
     import org.springframework.data.relational.core.mapping.MappedCollection;
     import org.springframework.data.relational.core.mapping.Table;
        
     import java.time.LocalDateTime;
     import java.util.LinkedHashSet;
     import java.util.Set;
        
     @Getter
     @Setter
     @Table("ORDERS")
     public class Order {
         @Id
         private long orderId;
        
         // ํ…Œ์ด๋ธ” ์™ธ๋ž˜ํ‚ค์ฒ˜๋Ÿผ memberId๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
         private long memberId;
        
         // (1)
         @MappedCollection(idColumn = "ORDER_ID")
         private Set<OrderCoffee> orderCoffees = new LinkedHashSet<>();
        
     		...
     		...
     }
    
    1. Order ํด๋ž˜์Šค๋Š” ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ
    2. long memberId๋กœ ์™ธ๋ž˜ํ‚ค๋ฅผ ํ‘œํ˜„ํ–ˆ๋Š”๋ฐ Spring Data JDBC์—์„œ๋Š” AggregateReference ๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์™ธ๋ž˜ํ‚ค ํ‘œํ˜„ ๊ฐ€๋Šฅ

      1
      
       private AggregateReference<Member, Long> memberId;
      
    3. โœ… @MappedCollection ์• ๋„ˆํ…Œ์ด์…˜์˜ ์—ญํ• 
      • ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ๊ฐ„์— ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ์ •๋ณด๋ฅผ ์˜๋ฏธ
      • โญ idColumn ์• ํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ž์‹ ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€๋˜๋Š” ์™ธ๋ž˜ํ‚ค์— ํ•ด๋‹น๋˜๋Š” ์—ด๋ช…์„ ์ง€์ •
      • โญ keyColumn ์• ํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์™ธ๋ž˜ํ‚ค๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธํ‚ค ์—ด๋ช…์„ ์ง€์ •
        • ex) ORDERS ํ…Œ์ด๋ธ”์˜ ์ž์‹ ํ…Œ์ด๋ธ”์ธ ORDER_COFFEE ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธํ‚ค๋Š” ORDER_COFFEE_ID ์ด๋ฏ€๋กœ, keyColumn์˜ ๊ฐ’์ด โ€˜ORDER_COFFEE_ID
  2. OrderCoffee - ์ฃผ๋ฌธ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋‚ด์— ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
     package com.springboot.order.entity;
        
     import lombok.Builder;
     import lombok.Getter;
     import org.springframework.data.annotation.Id;
     import org.springframework.data.relational.core.mapping.Table;
        
     @Getter
     @Builder
     @Table("ORDER_COFFEE") // (1)
     public class OrderCoffee {
         @Id
         private long orderCoffeeId;
         private long coffeeId; // (2)
         private int quantity; // (3)
     }
        
    

    1) @Table

    • @Table ์• ๋„ˆํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ž˜์Šค๋ช…์ด ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„๊ณผ ๋งคํ•‘๋จ
    • @Table("ORDER_COFFEE")์™€ ๊ฐ™์ด ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ๋ณ€๊ฒฝ

    2) coffeeId๋ฅผ ์™ธ๋ž˜ํ‚ค์ฒ˜๋Ÿผ ์ถ”๊ฐ€

    3) @Builder -> ๋‚ด์ผ ์—…๋กœ๋“œ ํ•˜๊ธฐ!

  3. Order

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    
     import com.springboot.member.entity.Member;
     import lombok.Getter;
     import lombok.Setter;
     import org.springframework.data.annotation.Id;
     import org.springframework.data.relational.core.mapping.MappedCollection;
     import org.springframework.data.relational.core.mapping.Table;
        
     import java.time.LocalDateTime;
     import java.util.LinkedHashSet;
     import java.util.Set;
        
     @Getter
     @Setter
     @Table("ORDERS")
     public class Order {
         @Id
         private long orderId;
        
         // ํ…Œ์ด๋ธ” ์™ธ๋ž˜ํ‚ค์ฒ˜๋Ÿผ memberId๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
         private long memberId;
        
         @MappedCollection(idColumn = "ORDER_ID")
         private Set<OrderCoffee> orderCoffees = new LinkedHashSet<>();
        
         // (1)
         private OrderStatus orderStatus = OrderStatus.ORDER_REQUEST;
        
         // (2)
         private LocalDateTime createdAt = LocalDateTime.now();
        
         // (3)
         public enum OrderStatus {
             ORDER_REQUEST(1, "์ฃผ๋ฌธ ์š”์ฒญ"),
             ORDER_CONFIRM(2, "์ฃผ๋ฌธ ํ™•์ •"),
             ORDER_COMPLETE(3, "์ฃผ๋ฌธ ์™„๋ฃŒ"),
             ORDER_CANCEL(4, "์ฃผ๋ฌธ ์ทจ์†Œ");
        
             @Getter
             private int stepNumber;
        
             @Getter
             private String stepDescription;
        
             OrderStatus(int stepNumber, String stepDescription) {
                 this.stepNumber = stepNumber;
                 this.stepDescription = stepDescription;
             }
         }
     }
        
    
    • ์ฃผ๋ฌธ ์ •๋ณด๊ฐ€ ์ €์žฅ๋  ๋•Œ ๊ธฐ๋ณธ ๊ฐ’์€ ORDER_REQUEST (์ฃผ๋ฌธ ์š”์ฒญ)
    • ์ฃผ๋ฌธ์ด ๋“ฑ๋ก๋˜๋Š” ์‹œ๊ฐ„ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์ด๋ฉฐ, LocalDateTime ํƒ€์ž…
    • OrderStatus enum
      • OrderStatus enum์ด Order ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋กœ ํฌํ•จ์ด ๋˜์–ด ์žˆ๋Š” ์ด์œ ๋Š” OrderStatus๋Š” ์ฃผ๋ฌธ์„ ์œ„ํ•œ ์ „์šฉ ์ƒํƒœ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ
      • ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์—์„œ๋„ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋ฉด ํด๋ž˜์Šค ์™ธ๋ถ€๋กœ ๋ถ„๋ฆฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ํŠน๋ณ„ํžˆ ๊ทธ๋Ÿด ์ด์œ ๊ฐ€ ์—†์Œ
    • coffee์™€ order์€ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์Œ, ์‚ฌ์šฉํ•˜์ง€ ์•Š์„๊ฒƒ์ด๋ผ์„œ.
  4. src/main/resources/db/h2/schema.sql ํŒŒ์ผ์— ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์Šคํฌ๋ฆฝํŠธ ์ถ”๊ฐ€ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์‹œ ํ…Œ์ด๋ธ” ์ƒ์„ฑ๋˜๋„๋ก ํ•˜๊ธฐ.

Spring Data JDBC - Service, Repository

Repository

  1. Spring Data JDBC, Spring Data JPA์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ(Repository)๋ผ๊ณ  ํ•จ.

    ๋ฆฌํฌ์ง€ํ† ๋ฆฌ(Repository)๋ผ๋Š” ์šฉ์–ด๋Š” DDD(Domain Driven Design, ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„)์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด

  2. ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ(Query Method)
    • Spring Data JDBC์—์„œ๋Š” ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ SQL ์ฟผ๋ฆฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์งˆ์˜๊ฐ€๋Šฅ
    • ์‚ฌ์šฉ๋ฒ• โ‡’ โ€˜find + By + SQL ์ฟผ๋ฆฌ๋ฌธ์—์„œ WHERE ์ ˆ์˜ ์—ด๋ช… + (WHERE ์ ˆ ์—ด์˜ ์กฐ๊ฑด์ด ๋˜๋Š” ๋ฐ์ดํ„ฐ) โ€™ ํ˜•์‹
    • WHERE ์ ˆ์˜ ์กฐ๊ฑด ์—ด์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ง€์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด โ€˜Andโ€™๋ฅผ ์‚ฌ์šฉ
    • Ex) findByEmailAndName(String email, String name)
    • ๋ฐ˜๋“œ์‹œ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ช…์„ ์ ์–ด์ฃผ์–ด์•ผ ํ•จ.
    • ์•ฝ Member ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์— firstName์ด๋ผ๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜, ํ…Œ์ด๋ธ”์— ์žˆ๋Š” FIRST_NAME์ด๋ผ๋Š” ์—ด๋ช…๊ณผ ๋งคํ•‘์ด ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด findByFirstName์ด ๋˜์–ด์•ผ ํ•จ.
  3. ์˜ˆ์ œ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
     import com.springboot.coffee.entity.Coffee;
     import org.springframework.data.jdbc.repository.query.Query;
     import org.springframework.data.repository.CrudRepository;
        
     import java.util.Optional;
        
     public interface CoffeeRepository extends CrudRepository<Coffee, Long> {
     		//(1)
         Optional<Coffee> findByCoffeeCode(String coffeeCode);
     		//(2)
         @Query("SELECT * FROM COFFEE WHERE COFFEE_ID = :coffeeId")
         Optional<Coffee> findByCoffee(Long coffeeId);
     }
        
    
    • CrudRepository๋ฅผ ์ƒ์† โ†’ CrudRepository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์— ์ €์žฅ, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ ๊ฐ€๋Šฅ
    • Coffee ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค, Long์€ Member ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์—์„œ @Id ์• ๋„ˆํ…Œ์ด์…˜์ด ๋ถ™์€ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ํƒ€์ž…
    • Spring Data JDBC์—์„œ๋Š” Optional์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌํ„ด ๊ฐ’์„ Optional๋กœ ๋ž˜ํ•‘ ๊ฐ€๋Šฅ
    • (1)์€ WHERE ์ ˆ์—์„œ COFFEE_CODE๋ฅผ ์กฐ๊ฑด์œผ๋กœ ์งˆ์˜ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ
    • (2) @Query ์• ๋„ˆํ…Œ์ด์…˜ : COFFEE ํ…Œ์ด๋ธ”์— ์งˆ์˜ํ•˜๊ธฐ ์œ„ํ•จ,
      • ์‹ค์ œ๋กœ๋Š” CrudRepository ์ธํ„ฐํŽ˜์ด์Šค์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” findById(ID id)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ.
      • findById(ID id)๋Š” ํ…Œ์ด๋ธ”์—์„œ ๊ธฐ๋ณธํ‚ค๋ฅผ WHERE์ ˆ์˜ ์กฐ๊ฑด์œผ๋กœ ์ง€์ •ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ๋ฆฌํ•œ ์ฟผ๋ฆฌ๋ฉ”์„œ๋“œ
      • findBy~ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ์•Œ์•„์„œ ์ฐพ์•„์คŒ-> ์นด๋ฉœ์ผ€์ด์Šค๋กœ ์ž‘์„ฑ ํ•„์š”


COMMENT

๋ญ”๊ฐ€ ํ›…ํ›… ์ง€๋‚˜๊ฐ€์„œ ๋”ฐ๋ผ๊ฐ€๊ณ  ์ดํ•ดํ•˜๋А๋ผ ์‹œ๊ฐ„์ด ํ›…ํ›… ์ง€๋‚˜๊ฐ„๋‹ค.. ๋ถ€๋”” ์ž˜ ๋”ฐ๋ผ๊ฐ€์„œ ๋ฒ„๋ฒ…๊ฑฐ๋ฆฌ์ง€ ๋ง์ž.

Spring ์นดํ…Œ๊ณ ๋ฆฌ ๋‚ด ๋‹ค๋ฅธ ๊ธ€ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

Leave a comment