Chapter 1 - KOO-YS/toby-spring GitHub Wiki


์˜ค๋ธŒ์ ํŠธ์™€ ์˜์กด๊ด€๊ณ„


Goals

  • ์Šคํ”„๋ง์ด ๊ด€์‹ฌ์„ ๋‘๋Š” ๋Œ€์ƒ์ธ ์˜ค๋ธŒ์ ํŠธ์˜ ์„ค๊ณ„, ๊ตฌํ˜„, ๋™์ž‘์›๋ฆฌ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์™€ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ , ์‚ฌ์šฉ๋˜๊ณ , ์†Œ๋ฉธํ•˜๊ธฐ๊นŒ์ง€์˜ ๊ณผ์ •

๐ŸŒฑ Branch chapter01 folder ์‚ฌ์šฉ


1.1 ์ดˆ๋‚œ๊ฐ DAO

DAO

Data Access Object

DB๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ „๋‹ดํ•˜๋„๋ก ๋งŒ๋“  ์˜ค๋ธŒ์ ํŠธ



๐ŸŒฑ Branch chapter01/setting์— ์‹ค์Šต์„ ์œ„ํ•œ ๊ธฐ๋ณธ ์„ธํŒ…



  • ์‹ค์Šต์„ ์œ„ํ•œ DB ์ƒ์„ฑ MySQL ์‚ฌ์šฉ
CREATE database toby DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
  • users ํ…Œ์ด๋ธ” ์ƒ์„ฑ
create table users (
	id varchar(10) primary key,
	name varchar(20) not null,
	password varchar(10) not null
);

Full Version

CREATE database toby DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

mysql> use toby
Database changed
mysql> create table users (
-> id varchar(10) primary key,
-> name varchar(20) not null,
-> password varchar(10) not null
-> );
Query OK, 0 rows affected (0.04 sec)

mysql> show tables;
+----------------+
| Tables_in_toby |
+----------------+
| users          |
+----------------+
1 row in set (0.01 sec)

mysql>


์ž๋ฐ”๋นˆ(javabean)

๊ธฐ์กด์—๋Š” ๋น„์ฃผ์–ผ ํˆด์—์„œ ์กฐ์ž‘ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋œปํ–ˆ์ง€๋งŒ, ์ด์ œ๋Š” ๋‘ ๊ฐ€์ง€ ๊ด€๋ก€๋ฅผ ๋”ฐ๋ผ ๋งŒ๋“ค์–ด์ง„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ง€์นญํ•œ๋‹ค.

  • ๋””ํดํŠธ ์ƒ์„ฑ์ž : ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” ๋””ํดํŠธ ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผํ•œ๋‹ค. ํˆด์ด๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ด์šฉํ•ด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ
  • ํ”„๋กœํผํ‹ฐ : ์ž๋ฐ”๋นˆ์ด ๋…ธ์ถœํ•˜๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ์†์„ฑ์„ ๋œปํ•จ. getter/setter๋ฅผ ํ†ตํ•ด ์ˆ˜์ • or ์กฐํšŒ ๊ฐ€๋Šฅ

JDBC ์—ฐ๊ฒฐ ์ž‘์—…
  1. DB ์—ฐ๊ฒฐ์„ ์œ„ํ•œ Connection ์ค€๋น„
  2. SQL ๋‹ด์„ Statement ์ค€๋น„
  3. Statement ์‹คํ–‰
  4. ์กฐํšŒ์˜ ๊ฒฝ์šฐ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ResultSet์œผ๋กœ ๋ฐ˜ํ™˜
  5. ์‚ฌ์šฉํ•œ ๋ฆฌ์†Œ์Šค๋“ค์„ close
  6. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ


1.2 DAO์˜ ๋ถ„๋ฆฌ



๐ŸŒฑ Branch chapter01/1.2.1์— ์‹ค์Šต ์ ์šฉ



๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๋•Œ ํ•„์š”ํ•œ ์ž‘์—…์„ ์ตœ์†Œํ™”ํ•˜๊ณ , ๊ทธ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ๊ณณ์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋„๋ก ํ•ด์•ผํ•œ๋‹ค.

๋ถ„๋ฆฌ์™€ ํ™•์žฅ์„ ๊ณ ๋ คํ•œ ์„ค๊ณ„๊ฐ€ ํ•„์š”


๋ฌธ์ œ

  • DB ์ ‘์† ์•”ํ˜ธ๊ฐ€ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ ๋ฐฑ๊ฐœ์˜ DAO ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค๋ฉด?
  • ํŠธ๋žœ์ ์…˜ ๊ธฐ์ˆ ์ด ๋‹ฌ๋ผ์ ธ์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋‹ด๊ธด ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๊ฐ€ ๋ชจ๋‘ ๋ณ€๊ฒฝ๋˜์•ผ ํ•œ๋‹ค๋ฉด?

๋ถ„๋ฆฌ

  • ๊ด€์‹ฌ์ด ๊ฐ™์€ ๊ฒƒ๋ผ๋ฆฌ๋Š” ํ•˜๋‚˜์˜ ๋˜๋Š” ๋น„์Šทํ•œ ๊ฐ์ฒด ์•ˆ์œผ๋กœ, ๊ด€์‹ฌ์ด ๋‹ค๋ฅธ๊ฒƒ์€ ์„œ๋กœ๊ฐ€ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ๋ถ„๋ฆฌ

  1. ์ค‘๋ณต ์ฝ”๋“œ ์ถ”์ถœ

    /**
    * ์ค‘๋ณต ์ฝ”๋“œ์˜ ๋ฉ”์†Œ๋“œ ์ถ”์ถœ
    * -> ๋ฆฌํŒฉํ† ๋ง์˜ ๋ฉ”์†Œ๋“œ ์ถ”์ถœ ๊ธฐ๋ฒ•(extract method)
    */
    public Connection getConnection() throws ClassNotFoundException, SQLException {
         // 1. DB์™€ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ Connection์„ ๊ฐ€์ ธ์˜ด
         Class.forName("com.mysql.cj.jdbc.Driver");
         Connection c = DriverManager.getConnection("jdbc:mysql://localhost/toby?characterEncoding=UTF-8&serverTimezone=UTC",
                                                    "root", "root");
    	return c;
    }
  2. ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๊ฒ€์ฆ : ๋ฆฌํŒฉํ† ๋ง๊ณผ ํ…Œ์ŠคํŠธ

    • ๋ฆฌํŒฉํ† ๋ง : ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ์™ธ๋ถ€์˜ ๋™์ž‘๋ฐฉ์‹์—๋Š” ๋ณ€ํ™” ์—†์ด ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ์ž‘์—… ๋˜๋Š” ๊ธฐ์ˆ . ์ฝ”๋“œ ์ดํ•ด๋„ ์ฆ๊ฐ€ & ๋ณ€ํ™” ํšจ์œจ์  ๋Œ€์‘

    • ๋ฉ”์†Œ๋“œ ์ถ”์ถœ ๊ธฐ๋ฒ• : ๊ณตํ†ต์˜ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋กœ ์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ๋ฝ‘์•„๋‚ด๋Š”๊ฒƒ

  3. ์ƒ์†์„ ํ†ตํ•œ ํ™•์žฅ

    • ์กฐ๊ฑด : ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ DB ์ข…๋ฅ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค

    • ๊ธฐ์กด์˜ UserDao ์ฝ”๋“œ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋กœ ๋งŒ๋“ค์–ด ๋ถ„๋ฆฌ

    • ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด : ๊ธฐ๋Šฅ์˜ ์ผ๋ถ€๋งŒ ์ถ”์ƒํ™”ํ•˜์—ฌ ์„œ๋ธŒ ํด๋ž˜์Šค์—์„œ ํ•„์š”์— ๋งž๊ฒŒ ๊ตฌํ˜„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•. ๊ฐ ๋ฉ”์†Œ๋“œ๋งˆ๋‹ค ๊ตฌํ˜„ํ•˜๋Š” ๋ฒ•์€ ์ œ๊ฐ๊ฐ

      • ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ•˜๋Š” Sub Class ์ž…์žฅ
    • ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด : ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์—์„œ ์„œ๋ธŒ ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ํ•  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฏธ๋ฆฌ ํƒ€์ž…๊ณผ ์ƒ์„ฑ๋ฐฉ๋ฒ•์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋‘” ๋ฉ”์†Œ๋“œ

      • Super ํด๋ž˜์Šค์˜ ์ฝ”๋“œ์—์„œ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ๋ฐฉ๋ฒ•์„ ๋…๋ฆฝ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

โ›ณ ๊ด€์‹ฌ์‚ฌํ•ญ์ด ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•ด๋‚ด๊ณ , ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ๋ณ€๊ฒฝ ๋˜๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ตฌํ˜„

But, ์ƒ์†์œผ๋กœ ์ธํ•œ ๋ฌธ์ œ์  ๋ฐœ์ƒ

1. ๋‹ค์ค‘ ์ƒ์†์„ ๋ฐ›์•„์•ผ ํ•  ๊ฒฝ์šฐ
2. ์Šˆํผ ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ๋ณ€๊ฒฝ์ด ์žˆ์„ ๊ฒฝ์šฐ ์„œ๋ธŒ ํด๋ž˜์Šค์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ๋ ฅ


1.3 DAO์˜ ํ™•์žฅ



๐ŸŒฑ Branch chapter01/refactor1.3 ์— ์‹ค์Šต ์ ์šฉ



ํด๋ž˜์Šค์˜ ๋ถ„๋ฆฌ

  • ๋ฐ์ดํ„ฐ ๋กœ์ง ์ฒ˜๋ฆฌ์™€ DB ์ปค๋„ฅ์…˜ ๋ถ€๋ถ„์„ ๋ณ„๋„์˜ ํด๋ž˜์Šค๋กœ ๊ด€๋ฆฌ

  • ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ธ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•ด ์ถ”์ƒํ™”๋ฅผ ์—†์•ฐ

    public void add(User user) throws ClassNotFoundException, SQLException {
    	Connection c = simpleConnectionMaker.makeNewConnection(); // -> FIXME : ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ ์‚ฌ์šฉ ์ค‘ -> 																			SimpleConnectionMaker์— ์ข…์†์   
    	. . . 
    }
  • SimpleConnectionMaker๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด์„œ N,D ์‚ฌ์˜ UserDao ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง -> ์ƒ์† ์ œ๊ฑฐ

  • ๋ฌธ์ œ ๋งŽ์Œ ใ… 


์ธํ„ฐํŽ˜์ด์Šค ๋„์ž…

  • ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด์„œ๋„ ์ค‘๊ฐ„์— Interface๋ผ๋Š” ์ถ”์ƒ์ ์ธ ๋А์Šจํ•œ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค

  • ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ™”ํ•ด๋†“์€ ์ตœ์†Œํ•œ์˜ ํ†ต๋กœ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๋Š” ์ชฝ์—์„œ๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค ๋–„ ์‚ฌ์šฉํ•  ํด๋ž˜์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชฐ๋ผ๋„ ๋œ๋‹ค

     public UserDao(){
         connectionMaker = new DConnectionMaker();           // FIXME : DB ํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ๋‹ค์‹œ DAO ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ ์‚ฌ์šฉ ์ค‘ -> ์ข…์†์ 
     	// ์ด ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฒฐ์ฝ” UserDao๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค
     }
  • ์‚ฌ์šฉํ•  ๊ณ ๊ฐ์‚ฌ๊ฐ€ ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค ์ˆ˜ ๋ฐฑ๊ฐœ์˜ Dao ์•ˆ์˜ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”์•ผํ• ๊นŒ?


๊ด€๊ณ„์„ค์ • ์ฑ…์ž„์˜ ๋ถ„๋ฆฌ

  • A ์˜ค๋ธŒ์ ํŠธ๊ฐ€ B ์˜ค๋ธŒ์ ํŠธ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด?

    • B๋Š” A์—๊ฒŒ ์„œ๋น„์Šค์ด๋‹ค
    • A๋Š” B์˜ ํด๋ผ์ด์–ธํŠธ๋‹ค
  • UserDao์™€ ConnectionMaker์˜ ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ž

  • ๋Ÿฐํƒ€์ž„ ์ค‘, ์˜ค๋ธŒ์ ํŠธ๋“ค์€ ํ•œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ๊ด€๊ณ„๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค
    • ์˜ค๋ธŒ์ ํŠธ ๊ด€๊ณ„ ์ƒ์„ฑ
      1. c = new DConnectionMaker() ์ฒ˜๋Ÿผ ์ง์ ‘ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•
      2. ์ฝ”๋“œ ๋‚ด๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฉ”์†Œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•
  • ๋Ÿฐํƒ€์ž„ ์˜ค๋ธŒ์ ํŠธ ๊ด€๊ณ„ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•  ์ฑ…์ž„์„ ํด๋ผ์ด์–ธํŠธ UserDaoTest ์—๊ฒŒ ๋– ๋„˜๊ธฐ๊ณ , ๋ฉ”์†Œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•ด ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ

    public class UserDaoTest {
        public static void main(String[] args) throws SQLException, ClassNotFoundException {
            // ๋‘ ์˜ค๋ธŒ์ ํŠธ์˜ ์˜์กด๊ด€๊ณ„ ์„ค์ •
            ConnectionMaker c = new DConnectionMaker();
            UserDao dao = new UserDao(c);		// ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ
    ...
    public class UserDao {
        private ConnectionMaker connectionMaker;
        public UserDao(ConnectionMaker connectionMaker){
            this.connectionMaker = connectionMaker;
        } ...
    }

์›์น™๊ณผ ํŒจํ„ด

๊ฐ์ฒด์ง€ํ–ฅ ๊ธฐ์ˆ ์˜ ์ด๋ก  ์†Œ๊ฐœ


๊ฐœ๋ฐฉ ํ์‡„ ์›์น™ (OCP : Open-Closed-Principle)
  • ํด๋ž˜์Šค๋‚˜ ๋ชจ๋“ˆ์€ ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์–ด์•ผ ํ•˜๊ณ  ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค
  • ์ž์‹ ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ , ๋‹ค๋ฅธ ๋ณ€ํ™”์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ณ  ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค
๋†’์€ ์‘์ง‘๋„์™€ ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„ (high coherence and low coupling)
  • ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™์€ ๋†’์€ ์‘์ง‘๋„, ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„ ์›๋ฆฌ๋กœ๋„ ์„ค๋ช…์ด ๊ฐ€๋Šฅํ•˜๋‹ค

  • ๋†’์€ ์‘์ง‘๋„ : ํ•˜๋‚˜์˜ ์ฑ…์ž„ ๋˜๋Š” ๊ด€์‹ฌ์‚ฌ๊ฐ€ ์ง‘์ค‘๋˜์–ด ์žˆ๋‹ค

  • ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„ : ์ฑ…์ž„๊ณผ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ ๋˜๋Š” ๋ชจ๋“ˆ๊ณผ๋Š” ๋А์Šจํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋œ ํ˜•ํƒœ๋ฅผ ์œ ์ง€

    • ๊ฒฐํ•ฉ๋„ : ํ•˜๋‚˜์˜ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๋•Œ์— ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์—๊ฒŒ ๋ณ€ํ™”๋ฅผ ์š”๊ตฌํ•˜๋Š” ์ •๋„

์ „๋žต ํŒจํ„ด (Strategy Pattern)
  • ์ž์‹ ์˜ **๊ธฐ๋Šฅ๋งฅ๋ฝ(context)**์—์„œ ํ•„์š”์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๋กœ์ง ๋ถ€๋ถ„์„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ํ†ต์งธ๋กœ ๋ถ„๋ฆฌ ์‹œํ‚ค๊ณ , ํ•„์š”์— ๋”ฐ๋ผ ๋ฐ”๊ฟ” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋””์ž์ธ ํŒจํ„ด
  • ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” ์ปจํ…์ŠคํŠธ๊ฐ€ ์‚ฌ์šฉํ•  **์ „๋žต(์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ํด๋ž˜์Šค)**์„ ์ปจํ…์ŠคํŠธ์˜ ์ƒ์„ฑ์ž ๋“ฑ์„ ํ†ตํ•ด ์ œ๊ณต (์˜ˆ์‹œ : UserDao constructor)


1.4 ์ œ์–ด์˜ ์—ญ์ „(IoC)



๐ŸŒฑ Branch chapter01/refactor1.4 ์— ์‹ค์Šต ์ ์šฉ



์˜ค๋ธŒ์ ํŠธ ํŒฉํ† ๋ฆฌ

ํŒฉํ† ๋ฆฌ : ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•˜๊ณ  ์ƒ์„ฑ๋œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ์—ญํ• ์˜ ํด๋ž˜์Šค

  • ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ชฝ | ์ƒ์„ฑ๋œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์˜ ์—ญํ• ๊ณผ ์ฑ…์ž„์„ ๋ถ„๋ฆฌ
  • ํŒฉํ† ๋ฆฌ ์—ญํ• ์„ ๋งก์„ DaoFactory ํด๋ž˜์Šค ์ƒ์„ฑ
    • DaoFactory ๋ถ„๋ฆฌ๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์žฅ์  : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ปดํฌ๋„ŒํŠธ ์—ญํ• ์„ ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ **๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ •(์„ค๊ณ„๋„)**ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ถ„๋ฆฌ

์ œ์–ด์˜ ์—ญ์ „

  • ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด ํ๋ฆ„ ๊ตฌ์กฐ๊ฐ€ ๋’ค๋ฐ”๋€Œ๋Š” ๊ฒƒ
  • ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ž์‹ ์ด ์‚ฌ์šฉํ•  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์Šค์Šค๋กœ ์„ ํƒํ•˜์ง€ ์•Š๊ณ , ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ชจ๋“  ์ œ์–ด์˜ ๊ถŒํ•œ์„ ์ž์‹ ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋Œ€์ƒ์—๊ฒŒ ์œ„์ž„ํ•œ๋‹ค
  • ์ œ์–ด์˜ ์—ญ์ „์—์„œ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ, ์ปจํ…Œ์ด๋„ˆ์™€ ๊ฐ™์ด **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„ ์„ค์ •, ์‚ฌ์šฉ, ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ ๋“ฑ ๊ด€์žฅํ•˜๋Š” ์กด์žฌ**๊ฐ€ ํ•„์š”ํ•˜๋‹ค
Library vs Framework

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

: ๊ฐœ๋ฐœ์ž๊ฐ€ ํ๋ฆ„์„ ์ฃผ๋„ํ•˜๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ๋ฆ„ ์ค‘์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์„ ๋•Œ ๋Šฅ๋™์ ์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ๋‹ค ์‚ฌ์šฉํ•œ๋‹ค

ํ”„๋ ˆ์ž„์›Œํฌ

ํ”„๋ ˆ์ž„์›Œํฌ ์œ„์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ๋ฆ„์„ ์ฃผ๋„ํ•˜๋ฉฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.



1.5 ์Šคํ”„๋ง์˜ IoC



๐ŸŒฑ Branch chapter01/refactor1.5 ์— ์‹ค์Šต ์ ์šฉ



์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์™€ ์„ค์ • ์ •๋ณด

๋นˆ(Bean)
  • ์Šคํ”„๋ง์ด ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์ง์ ‘ ๋งŒ๋“ค๊ณ  ๊ด€๊ณ„๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปดํฌ๋„ŒํŠธ

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„ ์„ค์ •, ์‚ฌ์šฉ๋“ฑ์„ ์ œ์–ดํ•ด์ฃผ๋Š” ์ œ์–ด์˜ ์—ญ์ „์ด ์ ์šฉ๋œ ์˜ค๋ธŒ์ ํŠธ

  • ๋นˆ ํŒฉํ† ๋ฆฌ(or ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ) : ์Šคํ”„๋ง์—์„œ ๋นˆ์˜ ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„ ์„ค์ •๊ฐ™์€ ์ œ์–ด๋ฅผ ๋‹ด๋‹นํ•˜๋Š” IoC ์˜ค๋ธŒ์ ํŠธ

@Configuration          // -> ์˜ค๋ธŒ์ ํŠธ ์„ค์ •์„ ๋‹ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค ์ธ์‹
public class DaoFactory {

    @Bean
    public ConnectionMaker connectionMaker(){
        return new DConnectionMaker();
    }
...

@Configuration : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ ๋˜๋Š” ๋นˆ ํŒฉํ† ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์„ค์ • ์ •๋ณด ํ‘œ์‹œ

@Bean : ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ์„ ๋‹ด๋‹นํ•˜๋Š” IoC ๋ฉ”์†Œ๋“œ


AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDao dao = context.getBean("userDao", UserDao.class);		// getBean()๋กœ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฐ€์ ธ์˜ด

AnnotationConfigApplicationContext ์ƒ์„ฑ์ž : @Configuration ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ์„ค์ •์ •๋ณด๋กœ ์‚ฌ์šฉ

getBean() ๋ฉ”์†Œ๋“œ : ApplicationContext๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์š”์ฒญํ•˜๋Š” ๋ฉ”์†Œ๋“œ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ IoC๋ฅผ ์ ์šฉํ•ด์„œ ๊ด€๋ฆฌํ•  ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„์„ค์ •์„ ๋‹ด๋‹นํ•œ๋‹ค.

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

์šฉ์–ด์ •๋ฆฌ

  1. ๋นˆ (Bean) : ์Šคํ”„๋ง์ด IoC ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ. ๋‹จ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งŒ๋“ค์–ด์ง€๋Š” ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋‹ค ๋นˆ์€ ์•„๋‹ˆ๋‹ค. ์Šคํ”„๋ง์ด ์ง์ ‘ ์ƒ์„ฑ๊ณผ ์ œ์–ด๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋งŒ์„ ๋นˆ์ด๋ผ ๋ถ€๋ฅธ๋‹ค
  2. ๋นˆ ํŒฉํ† ๋ฆฌ (Bean Factory) : ์Šคํ”„๋ง์˜ IoC๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ํ•ต์‹ฌ ์ปจํ…Œ์ด๋„ˆ. ๋นˆ ๋“ฑ๋กœ๊ทธ ์ƒ์„ฑ, ์กฐํšŒ, ๋ฐ˜ํ™˜ ๋“ฑ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ ๋‹ด๋‹น
  3. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ (application context) : ๋นˆ ํŒฉํ† ๋ฆฌ๋ฅผ ํ™•์žฅํ•œ IoC ์ปจํ…Œ์ด๋„ˆ. ApplicationContext๋Š” BeanFactory๋ฅผ ์ƒ์†ํ•œ๋‹ค
  4. ์„ค์ •์ •๋ณด/์„ค์ • ๋ฉ”ํƒ€์ •๋ณด (configuration metadata) : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ ๋˜๋Š” ๋นˆ ํŒฉํ† ๋ฆฌ๊ฐ€ IoC๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”ํƒ€ ์ •๋ณด
  5. ์ปจํ…Œ์ด๋„ˆ or IoC ์ปจํ…Œ์ด๋„ˆ (container) : IoC ๋ฐฉ์‹์œผ๋กœ ๋นˆ์„ ๊ด€๋ฆฌ
  6. ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ : ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ†ตํ‹€์–ด ๋งํ•  ๋•Œ ์‚ฌ์šฉ


1.6 ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์™€ ์˜ค๋ธŒ์ ํŠธ ์Šค์ฝ”ํ”„


๋™์ผ์„ฑ VS ๋™๋“ฑ์„ฑ

๋™์ผ์„ฑ : ๊ฐ™์€ ์ •๋ณด ๊ฐ™์€ ๋ ˆํผ๋Ÿฐ์Šค ์ฃผ์†Œ๊ฐ’

๋™๋“ฑ์„ฑ : ๊ฐ™์€ ์ •๋ณด ๋‹ค๋ฅธ ๋ ˆํผ๋Ÿฐ์Šค ์ฃผ์†Œ๊ฐ’

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋กœ ์ƒ์„ฑํ•œ ์˜ค๋ธŒ์ ํŠธ๋Š” ๋งค๋ฒˆ ๋™์ผํ•˜๋‹ค


์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ (Singleton registry)

  • ์Šคํ”„๋ง์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ„๋‹ค๋ฅธ ์„ค์ •์ด ์—†๋‹ค๋ฉด ๋‚ด๋ถ€์—์„œ ์ƒ์„ฑํ•˜๋Š” ๋นˆ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.
  • ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ๋งค๋ฒˆ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ์„œ ์š”์ฒญ์ด ์˜ฌ ๋•Œ๋งˆ๋‹ค ๊ฐ ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์„œ๋ฒ„๊ฐ€ ๊ฐ๋‹นํ•˜๊ธฐ ํž˜๋“ค ๊ฒƒ์ด๋‹ค
  • ์ž๋ฐ”์˜ ๊ธฐ๋ณธ์ ์ธ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์˜ ๊ตฌํ˜„๋ฐฉ์‹์—๋Š” ์—ฌ๋Ÿฌ ๋‹จ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์Šคํ”„๋ง์€ ์ง์ ‘ ์‹ฑ๊ธ€ํ†ค ํ˜•ํƒœ์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต
  • ์Šคํƒœํ‹ฑ ๋ฉ”์†Œ๋“œ์™€ private ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๋น„์ •์ƒ์ ์ธ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ํ‰๋ฒ”ํ•œ ์ž๋ฐ” ํด๋ž˜์Šค๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ํ™œ์šฉํ•˜๊ฒŒ ํ•ด์ค€๋‹ค?
    • ์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ž˜์Šค๋ผ๋„ public ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค

์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์•ผํ•  ์ 
  • ์‹ฑ๊ธ€ํ†ค์€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์ด๋ผ๋ฉด ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ƒํƒœ ๊ด€๋ฆฌ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค
  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์ƒํƒœ์ •๋ณด๋ฅผ ๋‚ด๋ถ€์— ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š์€ ๋ฌด์ƒํƒœ ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค์–ด์ ธ์•ผ ํ•œ๋‹ค
    • ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋กœ์ปฌ ๋ณ€์ˆ˜, ๋ฆฌํ„ด ๊ฐ’ ๋“ฑ์„ ์ด์šฉํ•ด์•ผํ•œ๋‹ค -> ๋ฉ”์†Œ๋“œ ์•ˆ์—์„œ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ €์žฅํ•  ๋…๋ฆฝ์  ๊ณต๊ฐ„์ด ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ
  • ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‹ฑ๊ธ€ํ†ค ์˜ค๋ธŒ์ ํŠธ์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์œ„ํ—˜ํ•˜๋‹ค
    • ์„œ๋กœ ๋ฎ์–ด์“ฐ๊ณ  ์ž˜๋ชป ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค ํ•„๋“œ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์œ ์ง€ํ•˜๋Š” ์ƒํƒœ์œ ์ง€ ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค

์ฝ๊ธฐ ์ „์šฉ ์†์„ฑ์ด ์žˆ๋‹ค๋ฉด ์‹ฑ๊ธ€ํ†ค์— ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด๋„ ๋œ๋‹ค. ๋˜๋Š” static final, final๋กœ ์„ ์–ธํ•œ๋‹ค


์Šคํ”„๋ง ๋นˆ์˜ ์Šค์ฝ”ํ”„
  • ์Šคํ”„๋ง์ด ๊ด€๋ฆฌํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ, ์ฆ‰ ๋นˆ์ด ์ƒ์„ฑ๋˜๊ณ  ์กด์žฌํ•˜๊ณ  ์ ์šฉ๋˜๋Š” ๋ฒ”์œ„
  • ์Šคํ”„๋ง ๋นˆ์˜ ๊ธฐ๋ณธ ์Šค์ฝ”ํ”„๋Š” ์‹ฑ๊ธ€ํ†ค
  • ํ”„๋กœํ†  ํƒ€์ž…์€ ์‹ฑ๊ธ€ํ†ค๊ณผ ๋‹ฌ๋ฆฌ ์ปจํ…Œ์ด๋„ˆ์— ๋นˆ์„ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค
  • ์š”์ฒญ ์Šค์ฝ”ํ”„๋Š” ์›น์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด HTTP ์š”์ฒญ์ด ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ
  • ์›น์˜ ์„ธ์…˜๊ณผ ๋น„์Šทํ•œ ์„ธ์…˜ ์Šค์ฝ”ํ”„


1.7 ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…(DI)



๐ŸŒฑ Branch chapter01/refactor1.7 ์— ์‹ค์Šต ์ ์šฉ



IoC๋ผ๋Š” ์šฉ์–ด๊ฐ€ ๋งค์šฐ ๋А์Šจํ•˜๊ฒŒ ์ •์˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์Šคํ”„๋ง์˜ IoC ๋ฐฉ์‹์˜ ์˜๋„๋ฅผ ์ข€๋” ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚˜๋Š” ์ด๋ฆ„์ธ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…(Dependency Injection) ์šฉ์–ด๋ฅผ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

์˜์กด๊ด€๊ณ„

  • ์˜์กดํ•œ๋‹ค : ์˜์กด์˜ ๋Œ€์ƒ์ธ B๊ฐ€ ๋ฐ”๋€Œ๋ฉด A์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ๋œป
  • A๊ฐ€ B์— ์ •์˜๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” **'์‚ฌ์šฉ์— ๋Œ€ํ•œ ์˜์กด๊ด€๊ณ„'**์ด๋‹ค
  • ์˜์กด๊ด€๊ณ„์—๋Š” **๋ฐฉํ–ฅ์„ฑ**์ด ์žˆ๋‹ค ( A -> B )

์˜์กด์˜ ๋Œ€์ƒ์ด ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋˜์–ด์žˆ๋‹ค๋ฉด ์˜์กด๊ด€๊ณ„์— ์žˆ๋Š” ๋‘ ์˜ค๋ธŒ์ ํŠธ์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์„ค๊ณ„ ์‹œ์ ์— ๋А์Šจํ•œ ์˜์กด๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ, ๋Ÿฐํƒ€์ž„์‹œ์— ์‚ฌ์šฉ๋  ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์–ด๋–ค ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.

์˜์กด ์˜ค๋ธŒ์ ํŠธ (dependent object) : ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋˜๊ณ ๋‚˜์„œ, ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ  ๋‚˜์„œ ๋Ÿฐํƒ€์ž„์‹œ์— ์˜์กด๊ด€๊ณ„๋ฅผ ๋งบ๋Š” ๋Œ€์ƒ, ์‹ค์ œ ์‚ฌ์šฉ๋Œ€์ƒ

์˜์กด๊ด€๊ณ„ ์ฃผ์ž… : ๊ตฌ์ฒด์ ์ธ ์˜์กด ์˜ค๋ธŒ์ ํŠธ์™€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ฃผ์ฒด, ํด๋ผ์ด์–ธํŠธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋Ÿฐํƒ€์ž„ ์‹œ์— ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์ž‘์—…

์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์˜ ์กฐ๊ฑด
  • ํด๋ž˜์Šค ๋ชจ๋ธ์ด๋‚˜ ์ฝ”๋“œ์—๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ ์—ฐ๊ฒฐ๋  ์˜์กด๊ด€๊ณ„๊ฐ€ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์Œ
    • ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•ด์•ผํ•จ
  • ๋Ÿฐํƒ€์ž„ ์‹œ์ ์˜ ์˜์กด๊ด€๊ณ„๋Š” ์ปจํ…Œ์ด๋„ˆ๋‚˜ ํŒฉํ† ๋ฆฌ ๊ฐ™์€ ์ œ3์˜ ์กด์žฌ๊ฐ€ ๊ฒฐ์ •
    • ์˜์กด๊ด€๊ณ„์— ์žˆ๋Š” ๋‘˜ ์ค‘ ๋ˆ„๊ตฌ๋ผ๋„ ๊ด€๊ณ„๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†๋‹ค
  • ์˜์กด ๋Œ€์ƒ์ด ๋˜๋Š” ์˜ค๋ธŒ์ ํŠธ '๋ ˆํผ๋Ÿฐ์Šค'๋ฅผ ์™ธ๋ถ€์—์„œ ์ œ๊ณตํ•ด์คŒ์œผ๋กœ์จ ๋งŒ๋“ค์–ด์ง„๋‹ค
@Configuration          
public class DaoFactory {

    @Bean
    public ConnectionMaker connectionMaker(){
        return new DConnectionMaker();		// DconnnectionMaker์˜ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์ „๋‹ฌ
    }

    @Bean               
    public UserDao userDao(){
        return new UserDao(connectionMaker());		// ํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋‹ฌ๋กœ ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…
    }
} 		

์˜์กด๊ด€๊ณ„ ๊ฒ€์ƒ‰ Dependency Lookup

  • ์ž์‹ ์ด ํ•„์š”๋กœ ํ•˜๋Š” ์˜์กด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋Šฅ๋™์ ์œผ๋กœ ๊ฒ€์ƒ‰
  • ๋Ÿฐํƒ€์ž„ ์‹œ ์˜์กด๊ด€๊ณ„๋ฅผ ๋งบ์„ ์˜ค๋ธŒ์ ํŠธ ๊ฒฐ์ •, ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ๋Š” ์™ธ๋ถ€ ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ๋งก๊ธฐ์ง€๋งŒ, ์ด๋ฅผ ๊ฐ€์ ธ์˜ฌ๋•Œ ์Šค์Šค๋กœ ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ์š”์ฒญํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค

์˜์กด๊ด€๊ณ„ ๊ฒ€์ƒ‰๊ณผ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์˜ ์ฐจ์ด์ 

  • ์˜์กด๊ด€๊ณ„ ๊ฒ€์ƒ‰ ๋ฐฉ์‹์—์„œ ๊ฒ€์ƒ‰ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋Š” ์ž์‹ ์ด ์Šคํ”„๋ง์˜ ๋นˆ์ผ ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋งŒ๋“œ๋Š” ๋นˆ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

DI vs DL ์ฐจ์ด์  ์ข€ ๋” ์•Œ์•„๋ณด๊ธฐ

๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•œ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…

์—ฌํƒœ๊นŒ์ง€ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„ ์œ„ํ•ด ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด์™”์ง€๋งŒ, ๋ฐ˜๋“œ์‹œ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ์ž…ํ•  ํ•„์š”๋Š” ์—†๋‹ค.

์ผ๋ฐ˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ์˜์กด ์˜ค๋ธŒ์ ํŠธ์™€์˜ ๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•
  1. ์ˆ˜์ •์ž ๋ฉ”์†Œ๋“œ(setter)๋ฅผ ์ด์šฉํ•œ ์ฃผ์ž…

    • ์™ธ๋ถ€์—์„œ ์˜ค๋ธŒ์ ํŠธ ๋‚ด๋ถ€์˜ ์• ํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ์šฉ๋„
    • ํ•ต์‹ฌ๊ธฐ๋Šฅ : ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ ๊ฐ’์„ ๋‚ด๋ถ€์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ์ €์žฅ
    • ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ œ๊ณต๋ฐ›์€ ์˜ค๋ธŒ์ ํŠธ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ €์žฅํ•ด๋’€๋‹ค๊ฐ€ ๋‚ด๋ถ€์˜ ๋ฉ”์†Œ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜๋Š” DI ๋ฐฉ์‹์— ํ™œ์šฉ
  2. ์ผ๋ฐ˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•œ ์ฃผ์ž…

    • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์„ ๊ฐ€์ง
    • ์ƒ์„ฑ์ž์— ๋งŽ์€ ๊ฐœ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธ๋”๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๋ฐ›์œผ๋ฉด ์‹ค์ˆ˜ํ•˜๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ์ ์ ˆํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜๋ˆ  ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค
    @Bean               // -> ์ˆ˜์ •์ž ๋ฉ”์†Œ๋“œ DI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽ™ํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ
    public UserDao userDao(){
        UserDao userDao = new UserDao();
        userDao.setConnectionMaker(connectionMaker());
        return userDao;
    }
    // ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ์‹œ์ ๊ณผ ๋ฐฉ๋ฒ•์ด ๋‹ฌ๋ผ์กŒ์„ ๋ฟ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๋‹ค


1.8 XML์„ ์ด์šฉํ•œ ์„ค์ •



๐ŸŒฑ Branch chapter01/refactor1.8 ์— ์‹ค์Šต ์ ์šฉ



XML
  • ๋‹จ์ˆœํ•œ ํ…์ŠคํŠธ ํŒŒ์ผ์— ์ปดํŒŒ์ผ๊ณผ ๊ฐ™์€ ๋ณ„๋„์˜ ๋นŒ๋“œ ์ž‘์—…์ด ์—†๋Š” ์žฅ์ 

  • ํ™˜๊ฒฝ์ด ๋‹ฌ๋ผ์ ธ์„œ ์˜ค๋ธŒ์ ํŠธ์˜ ๊ด€๊ณ„๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ์—๋„ ๋น ๋ฅด๊ฒŒ ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ฐ˜์˜

ํด๋ž˜์Šค ์„ค์ •๊ณผ XML ์„ค์ •์˜ ๋Œ€์‘ํ•ญ๋ชฉ
์ž๋ฐ” ์ฝ”๋“œ ์„ค์ • ์ •๋ณด XML ์„ค์ • ์ •๋ณด
๋นˆ ์„ค์ • ํŒŒ์ผ @Configuration
๋นˆ์˜ ์ด๋ฆ„ @Bean methodName() <bean id="methodName"
๋นˆ์˜ ํด๋ž˜์Šค return new BeanClass(); class="abc.package.BeanClass">

๋นˆ์˜ ์ด๋ฆ„, ํด๋ž˜์Šค ๋‘๊ฐ€์ง€ ์ •๋ณด๋ฅผ ํƒœ๊ทธ์˜ id, class ์†์„ฑ์œผ๋กœ ์ •์˜ํ•œ๋‹ค

DaoFactory.java์˜ userDao() ๋ฉ”์†Œ๋“œ XML๋กœ ๋ณ€ํ™˜
@Bean
public ConnectionMaker connectionMaker(){
    return new DConnectionMaker();
}

@Bean               
public UserDao userDao(){
    UserDao userDao = new UserDao();
    userDao.setConnectionMaker(connectionMaker());
    return userDao;
}
<beans>
    <bean id="connectionMaker" class="com.training.spring.dao.DConnectionMaker" />
    <bean id="userDao" class="com.training.spring.dao.UserDao">
        <property name="connectionMaker" ref="connectionMaker" />
    </bean>
</beans>

property ํƒœ๊ทธ

  • name : ํ”„๋กœํผํ‹ฐ์˜ ์ด๋ฆ„์œผ๋กœ ์ˆ˜์ •์ž ๋ฉ”์†Œ๋“œ(setter)์— ์‚ฌ์šฉ
  • ref : ์ˆ˜์ •์ž ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ์ฃผ์ž…ํ•ด์ค„ ๋นˆ ์˜ค๋ธŒ์ ํŠธ ์ด๋ฆ„
XML ๋ฌธ์„œ์˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•
  1. DTD

    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
            "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

    ํƒœ๊ทธ ์•ž์— ์ƒ๋‹จ์˜ ์„ ์–ธ์„ ๋„ฃ์–ด์ค€๋‹ค

  2. ์Šคํ‚ค๋งˆ

    • DI์˜ ๊ธฐ๋ณธ ํƒœ๊ทธ์ธ , ์™ธ์—๋„ ๋ณ„๋„์˜ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค -> ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ง€์›๋˜๋Š” ์Šคํ‚ค๋งˆ ์‚ฌ์šฉ
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

* ์Šคํ”„๋ง์˜ XML ์„ค์ •ํŒŒ์ผ์€ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹ ๋ชจ๋‘ ์ง€์›. ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•˜๊ธธ ๊ถŒ์œ ๋จ

XML์„ ์ด์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ

GenericXmlApplicationContext๋ฅผ ์‚ฌ์šฉ + XML ํŒŒ์ผ์˜ ํด๋ž˜์ŠคํŒจ์Šค ์ง€์ •

ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
DB ์ปค๋„ฅ์…˜ DataSource ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณ€ํ™˜
@Bean
public DataSource dataSource(){
    SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
    // DB ์—ฐ๊ฒฐ์ •๋ณด๋ฅผ ์ˆ˜์ •์ž ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋„ฃ์–ด์ค€๋‹ค [์˜ค๋ธŒ์ ํŠธ ๋ ˆ๋ฒจ์—์„œ DB ์—ฐ๊ฒฐ ๋ฐฉ์‹]
    dataSource.setDriverClass(com.mysql.cj.jdbc.Driver.class);
    dataSource.setUrl("jdbc:mysql://localhost/toby?characterEncoding=UTF-8&serverTimezone=UTC");
    dataSource.setUsername("root");
    dataSource.setPassword("root");

    return dataSource;
}
โš ๏ธ **GitHub.com Fallback** โš ๏ธ