Home > Backend > CS > ๐Ÿ’พ [CS] ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด

๐Ÿ’พ [CS] ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด
CS

๐Ÿ’พ [CS] ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด.

1๏ธโƒฃ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด(Singleton pattern)

  • ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด(singleton pattern)์€ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ์˜ค์ง ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ๊ฐ€์ง€๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.
  • ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐœ๋ณ„์ ์ธ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๊ณ  ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹จ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋กœ์ง์„ ๋งŒ๋“œ๋Š”๋ฐ ์“ฐ์ž…๋‹ˆ๋‹ค.
    • ๋ณดํ†ต ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋ชจ๋“ˆ์— ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋†“๊ณ  ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋“ค์ด ๊ณต์œ ํ•˜๋ฉฐ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋“œ๋Š” ๋น„์šฉ์ด ์ค„์–ด๋“œ๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ์˜์กด์„ฑ์ด ๋†’์•„์ง„๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ Java์—์„œ์˜ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด.

  • Java์—์„œ Singleton ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ, ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ๋ช‡ ๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
    • Eager Initialization(์ฆ‰์‹œ ์ดˆ๊ธฐํ™”)
    • Lazy Initialization(์ง€์—ฐ ์ดˆ๊ธฐํ™”)
    • Thread-safe Singleton(์Šค๋ ˆ๋“œ ์•ˆ์ „ ์‹ฑ๊ธ€ํ†ค)
      • Synchronized Method
      • Double-checked Locking
    • Bill Pugh Singleton(Holder ๋ฐฉ์‹)

1๏ธโƒฃ Eager Initialization(์ฆ‰์‹œ ์ดˆ๊ธฐํ™”)

  • ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ, ํด๋ž˜์Šค๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ์ฆ‰์‹œ Singleton ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    public class Singleton {
      // ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
      private static final Singleton instance = new Singleton();
        
      // private ์ƒ์„ฑ์ž: ์™ธ๋ถ€์—์„œ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์„ ๋ฐฉ์ง€
      private Singleton() {}
        
      // ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
      public static Singleton getInstance() {
          return instance;
      }
    }
    
  • ์ด ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ด์ง€๋งŒ, ํด๋ž˜์Šค๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ๋ฐ”๋กœ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ธ์Šคํ„ด์Šค๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋”๋ผ๋„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ Lazy Initialization(์ง€์—ฐ ์ดˆ๊ธฐํ™”)

  • ์ธ์Šคํ„ด์Šค๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ํ•„์š”ํ•  ๋•Œ ์ƒ์„ฑ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๋ฐฉ๋ฒ•์€ ์ดˆ๊ธฐํ™”์— ๋“œ๋Š” ๋น„์šฉ์ด ํฐ ๊ฒฝ์šฐ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
      ```java
      public class Singleton {
      // ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜ (์ดˆ๊ธฐ์—๋Š” null)
      private static Singleton instance;

    // private ์ƒ์„ฑ์ž: ์™ธ๋ถ€์—์„œ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์„ ๋ฐฉ์ง€
    private Singleton() {}

    // ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ (ํ•„์š”ํ•  ๋•Œ๋งŒ ์ƒ์„ฑ)
    public static Singleton getInstance() {
    if (instance == null) {
    instance = new Singleton();
    }
    return instance;
    }
    }
    ```

  • ์ด ๋ฐฉ๋ฒ•์€ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์ถ”๊ฐ€์ ์ธ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ Thread-safe Singleton(์Šค๋ ˆ๋“œ ์•ˆ์ „ ์‹ฑ๊ธ€ํ†ค)

  • ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ Lazy Initialization์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๋™๊ธฐํ™”๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

1๏ธโƒฃ Synchronized Method

public class Singleton {
    private static Singleton instance;
    
    private Singleton() {}
    
    // synchronized ํ‚ค์›Œ๋“œ๋กœ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ฆ
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  • ์ด ๋ฐฉ๋ฒ•์€ ์•ˆ์ „ํ•˜์ง€๋งŒ, ์„ฑ๋Šฅ์— ์•ฝ๊ฐ„์˜ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • 'synchronized' ๋กœ ์ธํ•ด ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— โ€˜getInstance()โ€˜ ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ Double-checked Locking

  • ์ด ๋ฐฉ๋ฒ•์€ ์„ฑ๋Šฅ๊ณผ ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ์„ ๋ชจ๋‘ ๊ณ ๋ คํ•œ ์ตœ์ ํ™”๋œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
    public class Singleton {
      private static volatile Singleton instance;
        
      private Singleton() {}
        
      public static Singleton getInstance() {
          if (instance == null) {
              synchronized (Singleton.class) {
                  if (instance == null) {
                      instance = new Singleton();
                  }
              }
          }
          return instance;
      }
    }
    
  • ์—ฌ๊ธฐ์„œ 'volatile' ํ‚ค์›Œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ์Šค๋ ˆ๋“œ ๊ฐ„์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดˆ๊ธฐํ™”๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ Bill Pugh Singleton(Holder ๋ฐฉ์‹)

  • ์ด ๋ฐฉ๋ฒ•์€ Lazy Initialization์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„, ์„ฑ๋Šฅ๊ณผ ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ์„ ๋ชจ๋‘ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
    public class Singleton {
        
      private Singleton() {}
        
      // SingletonHolder๊ฐ€ ํด๋ž˜์Šค ๋กœ๋“œ ์‹œ์ ์— ์ดˆ๊ธฐํ™”๋จ
      private static class SingletonHolder {
          private static final Singleton INSTANCE = new Singleton();
      }
        
      public static Singleton getInstance() {
          return SingletonHolder.INSTANCE;
      }
    }
    
  • ์ด ๋ฐฉ๋ฒ•์€ ๋‚ด๋ถ€ ์ •์  ํด๋ž˜์Šค๊ฐ€ JVM์— ์˜ํ•ด ํด๋ž˜์Šค ๋กœ๋“œ ์‹œ ์ดˆ๊ธฐํ™”๋˜๋ฏ€๋กœ, ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
    • ํด๋ž˜์Šค๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ์ดˆ๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ, ๋™๊ธฐํ™”๋‚˜ ์ถ”๊ฐ€์ ์ธ ์ฝ”๋“œ ์—†์ด๋„ ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3๏ธโƒฃ Spring Boot์™€ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์—ฐ๊ฒฐ ๊ทธ๋ฆฌ๊ณ  ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด.

  • Spring Boot์—์„œ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ, ๋‚ด๋ถ€์ ์œผ๋กœ โ€˜์‹ฑ๊ธ€ํ„ด ํŒจํ„ดโ€™ ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ๊ทธ๋Ÿฌ๋‚˜ ์ด ํŒจํ„ด์„ ์ง์ ‘ ๊ตฌํ˜„ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
      • โ€˜Spring Frameworkโ€™ ์ž์ฒด๊ฐ€ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์„ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋ฐ ๊ด€๋ฆฌ์™€ ๊ด€๋ จ๋œ โ€˜Bean(๊ฐ์ฒด)โ€™ ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1๏ธโƒฃ Spring Boot์™€ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด.

  • Spring Framework๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ Bean์„ ์‹ฑ๊ธ€ํ„ด ์Šค์ฝ”ํ”„๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Š” ํŠน์ • ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑ๋˜์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์—์„œ ๊ณต์œ ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์—์„œ์˜ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด ์‚ฌ์šฉ.

    1. DataSource Bean.
      • Spring Boot์—์„œ MySQL๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•  ๋•Œ 'DataSource' ๋ผ๋Š” 'Bean' ์„ ์ƒ์„ฑํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
      • ์ด 'DataSource' ๊ฐ์ฒด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, Spring์€ ์ด 'Bean' ์„ ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
      • ์ฆ‰, Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ๋Š” 'DataSource' ๊ฐ์ฒด๊ฐ€ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋˜์–ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์š”์ฒญ์—์„œ ์žฌ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    1. EntityManagerFactory ๋ฐ SessionFactory.
      • JPA๋‚˜ Hibernate์™€ ๊ฐ™์€ ORM์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, 'EntityManagerFactory' ๋‚˜ 'SessionFactory' ์™€ ๊ฐ™์€ ๊ฐ์ฒด๋„ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์— ์˜ํ•ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
      • ์ด๋“ค ๊ฐ์ฒด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์—ญ์‹œ Spring์— ์˜ํ•ด ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
    1. Spring์˜ ์‹ฑ๊ธ€ํ„ด ๊ด€๋ฆฌ.
      • Spring์€ ๊ฐœ๋ฐœ์ž๊ฐ€ 'Bean' ์„ ์ง์ ‘ ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ 'Bean' ์„ ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ ๊ด€๋ จ ํด๋ž˜์Šค๋“ค์ด ์ด 'Bean' ๋“ค๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์ด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์ด ํšจ์œจ์ ์ด๊ณ  ์ผ๊ด€๋˜๊ฒŒ ๊ด€๋ฆฌ๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์˜ˆ์‹œ: Spring Boot์—์„œ MySQL ์—ฐ๊ฒฐ ์„ค์ •.

  • Spring Boot์—์„œ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ฐ˜์ ์ธ ์„ค์ •์€ 'application.properties' ํŒŒ์ผ์ด๋‚˜ 'application.yml' ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  • ์ด ์„ค์ •์€ Spring Boot๊ฐ€ 'DataSource' 'Bean' ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜๋ฉฐ, ์ด 'Bean' ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ โœ๏ธ ์š”์•ฝ

  • Spring Boot์—์„œ MySQL๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ, Spring์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • 'DataSource', 'EntityManagerFactory' ๋“ฑ์˜ ๊ฐ์ฒด๊ฐ€ ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ๊ฑธ์ณ ์ผ๊ด€๋˜๊ณ  ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ด€๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
      • Spring ์ž์ฒด๊ฐ€ ์ด ํŒจํ„ด์„ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ์ž๋Š” ๋ณ„๋„๋กœ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์„ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

4๏ธโƒฃ Java Servlet ์ปจํ…Œ์ด๋„ˆ์™€ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ทธ๋ฆฌ๊ณ  ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด.

  • Java Servlet ์ปจํ…Œ์ด๋„ˆ์—์„œ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ, ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ๋‹ค๋งŒ, ์ด ํŒจํ„ด์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์—์„œ ์ง์ ‘ ๊ตฌํ˜„๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

1๏ธโƒฃ JDBC DataSource

  • ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ(์˜ˆ: Tomcat, Jetty)์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•  ๋•Œ ๋ณดํ†ต 'DataSource' ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์ด 'DataSource' ๊ฐ์ฒด๋Š” ๋ณดํ†ต ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Connection Pooling
    • ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ๊ฒฐ ํ’€๋ง(Connection pooling)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • ์—ฐ๊ฒฐ ํ’€์€ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋„๋ก ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ์—ฐ๊ฒฐ ํ’€์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฑ„๋Š” 'DataSource' ์ด๊ณ , ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๊ด€๋ฆฌ๋˜์–ด, ์—ฌ๋Ÿฌ ์„œ๋ธ”๋ฆฟ์—์„œ ๋™์ผํ•œ 'DataSource' ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์˜ ํ™œ์šฉ.

  • DataSource ๊ฐ์ฒด
    • ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ณดํ†ต 'DataSource' ๊ฐ์ฒด๋ฅผ ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
      • 'DataSource' ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์ด ๊ฐ์ฒด๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑ๋˜์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ๊ฑธ์ณ ์žฌ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • Connection ๊ฐ์ฒด
    • ๊ฐ ์š”์ฒญ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด 'Connection' ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ํ’€์—์„œ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
      • ํ•˜์ง€๋งŒ 'DataSource' ์ž์ฒด๋Š” ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋™์ผํ•œ 'DataSource' ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

3๏ธโƒฃ ์˜ˆ์‹œ: Tomcat์—์„œ DataSource ์„ค์ •

  • Tomcat๊ณผ ๊ฐ™์€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์—์„œ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ 'context.xml' ํŒŒ์ผ์—์„œ 'DataSource' ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
<Context>
    <Resource name="jdbc/MyDB"
              auth="Container"
              type="javax.sql.DataSource"
              maxTotal="100"
              maxIdel="30"
              maxWaitMillis="10000"
              username="root"
              password="password"
              driverClassName="com.myslq.cj.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/mydb"/>
</Context>
  • ์ด ์„ค์ •์€ 'jdbc/MyDB' ๋ผ๋Š” JNDI ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , 'DataSource' ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์—ฐ๊ฒฐ ํ’€๋ง์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ์ด 'DataSource' ๋Š” Tomcat ๋‚ด์—์„œ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์˜ ์ด์ .

  • ํšจ์œจ์„ฑ.
    • ์—ฌ๋Ÿฌ ์„œ๋ธ”๋ฆฟ์ด ๋™์ผํ•œ 'DataSource' ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ์™€ ์ž์›์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ด€๋ฆฌ์˜ ์šฉ์ด์„ฑ.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ด€๋ฆฌ๋ฅผ ์ค‘์•™ํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฝ”๋“œ์—์„œ ์ง์ ‘ ๊ด€๋ฆฌํ•  ํ•„์š” ์—†์ด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ด๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

5๏ธโƒฃ โœ๏ธ ์š”์•ฝ

  • Java Servlet ์ปจํ…Œ์ด๋„ˆ์—์„œ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ, ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์€ ์ฃผ๋กœ DataSource ๊ฐ์ฒด์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ์ด DataSource ๊ฐ์ฒด๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€์„ ํ†ตํ•ด ํšจ์œจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
      • ์ด๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ๊ฑธ์ณ ์ผ๊ด€๋˜๊ณ  ์„ฑ๋Šฅ์ด ์ตœ์ ํ™”๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ด€๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

3๏ธโƒฃ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์™€ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์—ฐ๊ฒฐ ๊ทธ๋ฆฌ๊ณ  ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด.

  • Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์—์„œ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ, ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์€ ์šฐ์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ทธ๋Ÿฌ๋‚˜ ์ด ํŒจ๋„ก์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์—์„œ ์ง์ ‘ ๊ตฌํ˜„๋˜์ง€ ์•Š์œผ๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

1๏ธโƒฃ DataSource์™€ Connection Pooling

  • Java ์• ํ”Œ๋ฆฌ๊ฒŒ์ด์…˜ ์„œ๋ฒ„(์˜ˆ: JBoss/WildFly, GlassFish, WebSphere)์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ 'JDBC DataSource' ์™€ 'Connection Pooling' ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋•Œ DataSource ๊ฐ์ฒด๋Š” ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์˜ ํšจ์œจ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์—ฐ๊ฒฐ ํ’€์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • DataSource ์‹ฑ๊ธ€ํ„ด ๊ด€๋ฆฌ
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด DataSource๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
      • ์ด DataSource ๊ฐ์ฒด๋Š” ์„œ๋ฒ„์—์„œ ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
        • ์ฆ‰, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ๊ฑธ์ณ ๋™์ผํ•œ DataSource ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • DataSource๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Connection ๊ฐ์ฒด ๊ด€๋ฆฌ
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์‹ค์ œ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๋Š” Connection ๊ฐ์ฒด๋Š” ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์š”์ฒญ์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค DataSource์—์„œ ๊ฐ€์ ธ์˜ค์ง€๋งŒ, DataSource๋Š” ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฏ€๋กœ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ผ๊ด€๋œ ์—ฐ๊ฒฐ ํ’€์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ Java EE ํ™˜๊ฒฝ์—์„œ์˜ DataSource ๊ด€๋ฆฌ

  • Java EE ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์—์„œ๋Š” 'JNDI(Java Naming and Directory Interface)' ๋ฅผ ํ†ตํ•ด DataSource๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Š” ์„œ๋ฒ„์˜ ์ „์—ญ ์„ค์ •์—์„œ ๊ด€๋ฆฌ๋˜๋ฉฐ, ์—ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • JNDI๋ฅผ ํ†ตํ•œ DataSource ์„ค์ • ์˜ˆ์‹œ
    ```xml
- ์ด ์„ค์ •์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ ์‹ฑ๊ธ€ํ„ด DataSource ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

### 3๏ธโƒฃ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์˜ ์—ญํ• .
- **ํšจ์œจ์„ฑ**
    - ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” DataSource๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„ ์ „์ฒด์—์„œ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ์œ ์ง€๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ์™€ ์ž์› ์‚ฌ์šฉ์ด ์ตœ์ ํ™”๋ฉ๋‹ˆ๋‹ค.
- **์ผ๊ด€์„ฑ**
    - ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐฉ์— ๊ฑธ์ณ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์ด ์ผ๊ด€๋˜๊ฒŒ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
- **๊ด€๋ฆฌ ์šฉ์ด์„ฑ**
    - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ด€๋ฆฌ๊ฐ€ ์ค‘์•™ํ™”๋˜์–ด, ๊ฐ ์• ํ”Œ๋ฆฌ๊ฒŒ์ด์…˜์—์„œ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•  ํ•„์š” ์—†์ด ์„œ๋ฒ„์—์„œ ํ†ตํ•ฉ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

### 4๏ธโƒฃ EJB์™€์˜ ํ†ตํ•ฉ.
- JavaEE ํ™˜๊ฒฝ์—์„œ EJB(Enterprise JavaBeans)๋Š” ์ฃผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
- EJB์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•  ๋•Œ๋„ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์ด ์ ์šฉ๋œ DataSource๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
```java
@Stateless
public class MyService {
    
    @Resource(lookup = "java:/jdbc/MyDB")
    private DataSource dataSource;
    
    public void doSomething() {
        try (Connection connection = dataSource.getConnection()) {
            // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—… ์ˆ˜ํ–‰
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
  • ์ด ์ฝ”๋“œ์—์„œ 'dataSource' ๋Š” ์„œ๋ฒ„์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์‹ฑ๊ธ€ํ„ด DataSource ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

5๏ธโƒฃ โœ๏ธ ์š”์•ฝ,

  • Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์—์„œ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ, ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์€ DataSource์™€ ๊ฐ™์€ ์ค‘์š”ํ•œ ๊ฐ์ฒด ๊ด€๋ฆฌ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ์ด ํŒจํ„ด์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ํšจ์œจ์ ์ด๊ณ  ์ผ๊ด€๋˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฐ๊ฒฐ ํ’€๋ง์„ ํ†ตํ•ด ์ž์› ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.
      • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ DataSource๋ฅผ ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๊ด€๋ฆฌํ•จ์œผ๋กœ์จ, ์„œ๋ฒ„ ์ „๋ฐ˜์— ์ผ๊ด€๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์ œ๊ณตํ•˜๊ณ  ํšจ์œจ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.