Chapter 1 - KOO-YS/toby-spring GitHub Wiki
- ์คํ๋ง์ด ๊ด์ฌ์ ๋๋ ๋์์ธ ์ค๋ธ์ ํธ์ ์ค๊ณ, ๊ตฌํ, ๋์์๋ฆฌ
- ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค๋ธ์ ํธ๊ฐ ์์ฑ๋๊ณ ๋ค๋ฅธ ์ค๋ธ์ ํธ์ ๊ด๊ณ๋ฅผ ๋งบ๊ณ , ์ฌ์ฉ๋๊ณ , ์๋ฉธํ๊ธฐ๊น์ง์ ๊ณผ์
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>
๊ธฐ์กด์๋ ๋น์ฃผ์ผ ํด์์ ์กฐ์ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ฅผ ๋ปํ์ง๋ง, ์ด์ ๋ ๋ ๊ฐ์ง ๊ด๋ก๋ฅผ ๋ฐ๋ผ ๋ง๋ค์ด์ง ์ค๋ธ์ ํธ๋ฅผ ์ง์นญํ๋ค.
- ๋ํดํธ ์์ฑ์ : ํ๋ผ๋ฏธํฐ๊ฐ ์๋ ๋ํดํธ ์์ฑ์๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผํ๋ค. ํด์ด๋ ํ๋ ์์ํฌ์์๋ ๋ฆฌํ๋ ์ ์ ์ด์ฉํด ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ
- ํ๋กํผํฐ : ์๋ฐ๋น์ด ๋ ธ์ถํ๋ ์ด๋ฆ์ ๊ฐ์ง ์์ฑ์ ๋ปํจ. getter/setter๋ฅผ ํตํด ์์ or ์กฐํ ๊ฐ๋ฅ
- DB ์ฐ๊ฒฐ์ ์ํ Connection ์ค๋น
- SQL ๋ด์ Statement ์ค๋น
- Statement ์คํ
- ์กฐํ์ ๊ฒฝ์ฐ ์ฟผ๋ฆฌ ์คํ ๊ฒฐ๊ณผ๋ฅผ ResultSet์ผ๋ก ๋ฐํ
- ์ฌ์ฉํ ๋ฆฌ์์ค๋ค์ close
- ์์ธ ์ฒ๋ฆฌ
๐ฑ Branch chapter01/1.2.1์ ์ค์ต ์ ์ฉ
๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋ ํ์ํ ์์ ์ ์ต์ํํ๊ณ , ๊ทธ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ๊ณณ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค์ง ์๋๋ก ํด์ผํ๋ค.
๋ถ๋ฆฌ์ ํ์ฅ์ ๊ณ ๋ คํ ์ค๊ณ๊ฐ ํ์
๋ฌธ์
- DB ์ ์ ์ํธ๊ฐ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์ ๋ฐฑ๊ฐ์ DAO ํด๋์ค๋ฅผ ์์ ํด์ผํ๋ค๋ฉด?
- ํธ๋์ ์ ๊ธฐ์ ์ด ๋ฌ๋ผ์ ธ์ ๋น์ฆ๋์ค ๋ก์ง์ด ๋ด๊ธด ์ฝ๋์ ๊ตฌ์กฐ๊ฐ ๋ชจ๋ ๋ณ๊ฒฝ๋์ผ ํ๋ค๋ฉด?
- ๊ด์ฌ์ด ๊ฐ์ ๊ฒ๋ผ๋ฆฌ๋ ํ๋์ ๋๋ ๋น์ทํ ๊ฐ์ฒด ์์ผ๋ก, ๊ด์ฌ์ด ๋ค๋ฅธ๊ฒ์ ์๋ก๊ฐ ์ํฅ์ ์ฃผ์ง ์๋๋ก ๋ถ๋ฆฌ
-
์ค๋ณต ์ฝ๋ ์ถ์ถ
/** * ์ค๋ณต ์ฝ๋์ ๋ฉ์๋ ์ถ์ถ * -> ๋ฆฌํฉํ ๋ง์ ๋ฉ์๋ ์ถ์ถ ๊ธฐ๋ฒ(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; }
-
๋ณ๊ฒฝ์ฌํญ์ ๋ํ ๊ฒ์ฆ : ๋ฆฌํฉํ ๋ง๊ณผ ํ ์คํธ
-
๋ฆฌํฉํ ๋ง : ๊ธฐ์กด์ ์ฝ๋๋ฅผ ์ธ๋ถ์ ๋์๋ฐฉ์์๋ ๋ณํ ์์ด ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํด์ ์ฌ๊ตฌ์ฑํ๋ ์์ ๋๋ ๊ธฐ์ . ์ฝ๋ ์ดํด๋ ์ฆ๊ฐ & ๋ณํ ํจ์จ์ ๋์
-
๋ฉ์๋ ์ถ์ถ ๊ธฐ๋ฒ : ๊ณตํต์ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ ๋ฉ์๋๋ก ์ค๋ณต๋ ์ฝ๋๋ฅผ ๋ฝ์๋ด๋๊ฒ
-
-
์์์ ํตํ ํ์ฅ
-
์กฐ๊ฑด: ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ DB ์ข ๋ฅ๋ฅผ ์ฌ์ฉํด์ผํ๋ค -
๊ธฐ์กด์ UserDao ์ฝ๋ ์ถ์ ๋ฉ์๋๋ก ๋ง๋ค์ด ๋ถ๋ฆฌ
-
ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด : ๊ธฐ๋ฅ์ ์ผ๋ถ๋ง ์ถ์ํํ์ฌ ์๋ธ ํด๋์ค์์ ํ์์ ๋ง๊ฒ ๊ตฌํํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ. ๊ฐ ๋ฉ์๋๋ง๋ค ๊ตฌํํ๋ ๋ฒ์ ์ ๊ฐ๊ฐ
-
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด : ์ธํฐํ์ด์ค ํ์ ์์ ์๋ธ ํด๋์ค๊ฐ ๊ตฌํํ ์ค๋ธ์ ํธ๋ฅผ ๋ฏธ๋ฆฌ ํ์ ๊ณผ ์์ฑ๋ฐฉ๋ฒ์ ๋ฏธ๋ฆฌ ์ ์ํด๋ ๋ฉ์๋
-
โณ ๊ด์ฌ์ฌํญ์ด ๋ค๋ฅธ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํด๋ด๊ณ , ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ๋ณ๊ฒฝ ๋๋ ํ์ฅ ๊ฐ๋ฅํ๊ฒ ๊ตฌํ
1. ๋ค์ค ์์์ ๋ฐ์์ผ ํ ๊ฒฝ์ฐ
2. ์ํผ ํด๋์ค ๋ด๋ถ์ ๋ณ๊ฒฝ์ด ์์ ๊ฒฝ์ฐ ์๋ธ ํด๋์ค์ ๋ฏธ์น๋ ์ํฅ๋ ฅ
๐ฑ 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์ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ ์ค๋ธ์ ํธ๋ฅผ ์ฌ์ฉํ์
-
๋ฐํ์ ์ค, ์ค๋ธ์ ํธ๋ค์ ํ ์ค๋ธ์ ํธ๊ฐ ๋ค๋ฅธ ์ค๋ธ์ ํธ์ ๋ ํผ๋ฐ์ค๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ๊ด๊ณ๊ฐ ๋ง๋ค์ด์ง๋ค
- ์ค๋ธ์ ํธ ๊ด๊ณ ์์ฑ
- c = new DConnectionMaker() ์ฒ๋ผ ์ง์ ์์ฑ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ
- ์ฝ๋ ๋ด๋ถ๊ฐ ์๋๋ผ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ์ฌ ์ธ๋ถ์์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ
- ์ค๋ธ์ ํธ ๊ด๊ณ ์์ฑ
-
๋ฐํ์ ์ค๋ธ์ ํธ ๊ด๊ณ ๊ตฌ์กฐ๋ฅผ ์ ์ํ ์ฑ ์์ ํด๋ผ์ด์ธํธ 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; } ... }
๊ฐ์ฒด์งํฅ ๊ธฐ์ ์ ์ด๋ก ์๊ฐ
- ํด๋์ค๋ ๋ชจ๋์ ํ์ฅ์๋ ์ด๋ ค ์์ด์ผ ํ๊ณ ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค
- ์์ ์ ํต์ฌ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ , ๋ค๋ฅธ ๋ณํ์ ์ํฅ์ ๋ฐ์ง ์๊ณ ์ ์งํ ์ ์์ด์ผ ํ๋ค
-
๊ฐ๋ฐฉ ํ์ ์์น์ ๋์ ์์ง๋, ๋ฎ์ ๊ฒฐํฉ๋ ์๋ฆฌ๋ก๋ ์ค๋ช ์ด ๊ฐ๋ฅํ๋ค
-
๋์ ์์ง๋ : ํ๋์ ์ฑ ์ ๋๋ ๊ด์ฌ์ฌ๊ฐ ์ง์ค๋์ด ์๋ค
-
๋ฎ์ ๊ฒฐํฉ๋ : ์ฑ ์๊ณผ ๊ด์ฌ์ฌ๊ฐ ๋ค๋ฅธ ์ค๋ธ์ ํธ ๋๋ ๋ชจ๋๊ณผ๋ ๋์จํ๊ฒ ์ฐ๊ฒฐ๋ ํํ๋ฅผ ์ ์ง
-
๊ฒฐํฉ๋ : ํ๋์ ์ค๋ธ์ ํธ๊ฐ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋์ ๊ด๊ณ๋ฅผ ๋งบ๊ณ ์๋ ๋ค๋ฅธ ์ค๋ธ์ ํธ์๊ฒ ๋ณํ๋ฅผ ์๊ตฌํ๋ ์ ๋
-
- ์์ ์ **๊ธฐ๋ฅ๋งฅ๋ฝ(context)**์์ ํ์์ ๋ฐ๋ผ ๋ณ๊ฒฝ์ด ํ์ํ ๋ก์ง ๋ถ๋ถ์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ํต์งธ๋ก ๋ถ๋ฆฌ ์ํค๊ณ , ํ์์ ๋ฐ๋ผ ๋ฐ๊ฟ ์ฌ์ฉํ ์ ์๋ ๋์์ธ ํจํด
-
์ปจํ
์คํธ๋ฅผ ์ฌ์ฉํ๋
ํด๋ผ์ด์ธํธ๋ ์ปจํ ์คํธ๊ฐ ์ฌ์ฉํ **์ ๋ต(์ธํฐํ์ด์ค ๊ตฌํ ํด๋์ค)**์ ์ปจํ ์คํธ์ ์์ฑ์ ๋ฑ์ ํตํด ์ ๊ณต (์์ : UserDao constructor)
๐ฑ Branch chapter01/refactor1.4 ์ ์ค์ต ์ ์ฉ
ํฉํ ๋ฆฌ : ๊ฐ์ฒด์ ์์ฑ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๊ณ ์์ฑ๋ ์ค๋ธ์ ํธ๋ฅผ ๋ฐํํด์ฃผ๋ ์ญํ ์ ํด๋์ค
- ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋ ์ชฝ | ์์ฑ๋ ์ค๋ธ์ ํธ๋ฅผ ์ฌ์ฉํ๋ ์ชฝ์ ์ญํ ๊ณผ ์ฑ ์์ ๋ถ๋ฆฌ
- ํฉํ ๋ฆฌ ์ญํ ์ ๋งก์ DaoFactory ํด๋์ค ์์ฑ
- DaoFactory ๋ถ๋ฆฌ๋ก ์ป์ ์ ์๋ ์ฅ์ : ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปดํฌ๋ํธ ์ญํ ์ ํ๋ ์ค๋ธ์ ํธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ **๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ (์ค๊ณ๋)**ํ๋ ์ค๋ธ์ ํธ๋ฅผ ๋ถ๋ฆฌ
- ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ ๊ตฌ์กฐ๊ฐ ๋ค๋ฐ๋๋ ๊ฒ
- ์ค๋ธ์ ํธ๊ฐ ์์ ์ด ์ฌ์ฉํ ์ค๋ธ์ ํธ๋ฅผ ์ค์ค๋ก ์ ํํ์ง ์๊ณ , ์์ฑํ์ง ์๋๋ค.
- ๋ชจ๋ ์ ์ด์ ๊ถํ์ ์์ ์ด ์๋ ๋ค๋ฅธ ๋์์๊ฒ ์์ํ๋ค
- ์ ์ด์ ์ญ์ ์์๋ ํ๋ ์์ํฌ, ์ปจํ ์ด๋์ ๊ฐ์ด **์ ํ๋ฆฌ์ผ์ด์ ์ปดํฌ๋ํธ์ ์์ฑ๊ณผ ๊ด๊ณ ์ค์ , ์ฌ์ฉ, ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ ๋ฑ ๊ด์ฅํ๋ ์กด์ฌ**๊ฐ ํ์ํ๋ค
๋ผ์ด๋ธ๋ฌ๋ฆฌ
: ๊ฐ๋ฐ์๊ฐ ํ๋ฆ์ ์ฃผ๋ํ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ํ๋ฆ ์ค์ ํ์ํ ๊ธฐ๋ฅ์ด ์์ ๋ ๋ฅ๋์ ์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ๋ค ์ฌ์ฉํ๋ค
ํ๋ ์์ํฌ
ํ๋ ์์ํฌ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ํ๋ ์์ํฌ๊ฐ ํ๋ฆ์ ์ฃผ๋ํ๋ฉฐ ๊ฐ๋ฐ์๊ฐ ๋ง๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ค.
๐ฑ Branch chapter01/refactor1.5 ์ ์ค์ต ์ ์ฉ
-
์คํ๋ง์ด ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์ง์ ๋ง๋ค๊ณ ๊ด๊ณ๋ฅผ ๋ถ์ฌํ๋ ์ค๋ธ์ ํธ
-
์ ํ๋ฆฌ์ผ์ด์ ์ปดํฌ๋ํธ
-
์คํ๋ง ์ปจํ ์ด๋๊ฐ ์์ฑ๊ณผ ๊ด๊ณ ์ค์ , ์ฌ์ฉ๋ฑ์ ์ ์ดํด์ฃผ๋ ์ ์ด์ ์ญ์ ์ด ์ ์ฉ๋ ์ค๋ธ์ ํธ
-
๋น ํฉํ ๋ฆฌ(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() ๋ฉ์๋๋ก ๋น์ ์ด๋ฆ์ ์ด์ฉํด ๊ฒ์์ด ๊ฐ๋ฅํ๊ณ , ํ์ ์ด๋ ์ด๋ ธํ ์ด์ ๋ง์ผ๋ก๋ ๊ฒ์์ด ๊ฐ๋ฅํ๋ค.
- ๋น (Bean) : ์คํ๋ง์ด IoC ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๋ ์ค๋ธ์ ํธ. ๋จ, ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ง๋ค์ด์ง๋ ๋ชจ๋ ์ค๋ธ์ ํธ๊ฐ ๋ค ๋น์ ์๋๋ค. ์คํ๋ง์ด ์ง์ ์์ฑ๊ณผ ์ ์ด๋ฅผ ๋ด๋นํ๋ ์ค๋ธ์ ํธ๋ง์ ๋น์ด๋ผ ๋ถ๋ฅธ๋ค
- ๋น ํฉํ ๋ฆฌ (Bean Factory) : ์คํ๋ง์ IoC๋ฅผ ๋ด๋นํ๋ ํต์ฌ ์ปจํ ์ด๋. ๋น ๋ฑ๋ก๊ทธ ์์ฑ, ์กฐํ, ๋ฐํ ๋ฑ ๊ด๋ฆฌ ๊ธฐ๋ฅ ๋ด๋น
- ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ (application context) : ๋น ํฉํ ๋ฆฌ๋ฅผ ํ์ฅํ IoC ์ปจํ ์ด๋. ApplicationContext๋ BeanFactory๋ฅผ ์์ํ๋ค
- ์ค์ ์ ๋ณด/์ค์ ๋ฉํ์ ๋ณด (configuration metadata) : ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ ๋๋ ๋น ํฉํ ๋ฆฌ๊ฐ IoC๋ฅผ ์ ์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฉํ ์ ๋ณด
- ์ปจํ ์ด๋ or IoC ์ปจํ ์ด๋ (container) : IoC ๋ฐฉ์์ผ๋ก ๋น์ ๊ด๋ฆฌ
- ์คํ๋ง ํ๋ ์์ํฌ : ์คํ๋ง์ด ์ ๊ณตํ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ํตํ์ด ๋งํ ๋ ์ฌ์ฉ
๋์ผ์ฑ : ๊ฐ์ ์ ๋ณด ๊ฐ์ ๋ ํผ๋ฐ์ค ์ฃผ์๊ฐ
๋๋ฑ์ฑ : ๊ฐ์ ์ ๋ณด ๋ค๋ฅธ ๋ ํผ๋ฐ์ค ์ฃผ์๊ฐ
์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๋ก ์์ฑํ ์ค๋ธ์ ํธ๋ ๋งค๋ฒ ๋์ผํ๋ค
- ์คํ๋ง์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณ๋ค๋ฅธ ์ค์ ์ด ์๋ค๋ฉด ๋ด๋ถ์์ ์์ฑํ๋ ๋น ์ค๋ธ์ ํธ๋ฅผ ์ฑ๊ธํค์ผ๋ก ์์ฑํ๋ค.
- ์๋ฒ ํ๊ฒฝ์์ ๋งค๋ฒ ํด๋ผ์ด์ธํธ์๊ฒ์ ์์ฒญ์ด ์ฌ ๋๋ง๋ค ๊ฐ ๋ก์ง์ ๋ด๋นํ๋ ์ค๋ธ์ ํธ๋ฅผ ์๋ก ๋ง๋ค์ด์ ์ฌ์ฉํ๋ค๋ฉด, ์๋ฒ๊ฐ ๊ฐ๋นํ๊ธฐ ํ๋ค ๊ฒ์ด๋ค
- ์๋ฐ์ ๊ธฐ๋ณธ์ ์ธ ์ฑ๊ธํค ํจํด์ ๊ตฌํ๋ฐฉ์์๋ ์ฌ๋ฌ ๋จ์ ์ด ์๊ธฐ ๋๋ฌธ์, ์คํ๋ง์ ์ง์ ์ฑ๊ธํค ํํ์ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค๊ณ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ณต
- ์คํํฑ ๋ฉ์๋์ private ์์ฑ์๋ฅผ ์ฌ์ฉํด์ผํ๋ ๋น์ ์์ ์ธ ํด๋์ค๊ฐ ์๋๋ผ ํ๋ฒํ ์๋ฐ ํด๋์ค๋ฅผ ์ฑ๊ธํค์ผ๋ก ํ์ฉํ๊ฒ ํด์ค๋ค?
- ์ฑ๊ธํค ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ ์ ํ๋ฆฌ์ผ์ด์ ํด๋์ค๋ผ๋ public ์์ฑ์๋ฅผ ๊ฐ์ง ์ ์๋ค
- ์ฑ๊ธํค์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์ด๋ผ๋ฉด ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํด์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์ํ ๊ด๋ฆฌ์ ์ฃผ์ํด์ผ ํ๋ค
- ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์ํ์ ๋ณด๋ฅผ ๋ด๋ถ์ ๊ฐ๊ณ ์์ง ์์ ๋ฌด์ํ ๋ฐฉ์์ผ๋ก ๋ง๋ค์ด์ ธ์ผ ํ๋ค
- ํ๋ผ๋ฏธํฐ์ ๋ก์ปฌ ๋ณ์, ๋ฆฌํด ๊ฐ ๋ฑ์ ์ด์ฉํด์ผํ๋ค -> ๋ฉ์๋ ์์์ ๋งค๋ฒ ์๋ก์ด ๊ฐ์ ์ ์ฅํ ๋ ๋ฆฝ์ ๊ณต๊ฐ์ด ๋ง๋ค์ด์ง๊ธฐ ๋๋ฌธ
- ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ฑ๊ธํค ์ค๋ธ์ ํธ์ ์ธ์คํด์ค ๋ณ์๋ฅผ ์์ ํ๋ ๊ฒ์ ๋งค์ฐ ์ํํ๋ค
- ์๋ก ๋ฎ์ด์ฐ๊ณ ์๋ชป ๋ถ๋ฌ์ฌ ์ ์๊ธฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์คํด์ค ํ๋์ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์ ์งํ๋ ์ํ์ ์ง ๋ฐฉ์์ผ๋ก ๋ง๋ค์ง ์๋๋ค
์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ด ์๋ค๋ฉด ์ฑ๊ธํค์ ์ธ์คํด์ค ๋ณ์๋ก ์ ์ธํด๋ ๋๋ค. ๋๋ static final, final๋ก ์ ์ธํ๋ค
- ์คํ๋ง์ด ๊ด๋ฆฌํ๋ ์ค๋ธ์ ํธ, ์ฆ ๋น์ด ์์ฑ๋๊ณ ์กด์ฌํ๊ณ ์ ์ฉ๋๋ ๋ฒ์
- ์คํ๋ง ๋น์ ๊ธฐ๋ณธ ์ค์ฝํ๋ ์ฑ๊ธํค
- ํ๋กํ ํ์ ์ ์ฑ๊ธํค๊ณผ ๋ฌ๋ฆฌ ์ปจํ ์ด๋์ ๋น์ ์์ฒญํ ๋๋ง๋ค ๋งค๋ฒ ์๋ก์ด ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค์ด์ค๋ค
- ์์ฒญ ์ค์ฝํ๋ ์น์ ํตํด ์๋ก์ด HTTP ์์ฒญ์ด ์๊ธธ ๋๋ง๋ค ์์ฑ
- ์น์ ์ธ์ ๊ณผ ๋น์ทํ ์ธ์ ์ค์ฝํ
๐ฑ 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()); // ํ๋ผ๋ฏธํฐ ์ ๋ฌ๋ก ์์กด ๊ด๊ณ ์ฃผ์
}
} - ์์ ์ด ํ์๋ก ํ๋ ์์กด ์ค๋ธ์ ํธ๋ฅผ ๋ฅ๋์ ์ผ๋ก ๊ฒ์
-
๋ฐํ์ ์ ์์กด๊ด๊ณ๋ฅผ ๋งบ์ ์ค๋ธ์ ํธ ๊ฒฐ์ , ์ค๋ธ์ ํธ ์์ฑ๋ ์ธ๋ถ ์ปจํ ์ด๋์๊ฒ ๋งก๊ธฐ์ง๋ง, ์ด๋ฅผ ๊ฐ์ ธ์ฌ๋ ์ค์ค๋ก ์ปจํ ์ด๋์๊ฒ ์์ฒญํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค
- ์์กด๊ด๊ณ ๊ฒ์ ๋ฐฉ์์์ ๊ฒ์ํ๋ ์ค๋ธ์ ํธ๋ ์์ ์ด ์คํ๋ง์ ๋น์ผ ํ์๊ฐ ์๋ค.
- ์์กด๊ด๊ณ ์ฃผ์ ์์๋ ๋ฐ๋์ ์ปจํ ์ด๋๊ฐ ๋ง๋๋ ๋น ์ค๋ธ์ ํธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
DI vs DL ์ฐจ์ด์ ์ข ๋ ์์๋ณด๊ธฐ
์ฌํ๊น์ง ์์กด๊ด๊ณ ์ฃผ์ ์ ์ํด ์์ฑ์๋ฅผ ์ฌ์ฉํด์์ง๋ง, ๋ฐ๋์ ์์ฑ์๋ฅผ ์ฌ์ฉํด ์ฃผ์ ํ ํ์๋ ์๋ค.
-
์์ ์ ๋ฉ์๋(setter)๋ฅผ ์ด์ฉํ ์ฃผ์
- ์ธ๋ถ์์ ์ค๋ธ์ ํธ ๋ด๋ถ์ ์ ํธ๋ฆฌ๋ทฐํธ ๊ฐ์ ๋ณ๊ฒฝํ๋ ค๋ ์ฉ๋
- ํต์ฌ๊ธฐ๋ฅ : ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ ๊ฐ์ ๋ด๋ถ์ ์ธ์คํด์ค ๋ณ์์ ์ ์ฅ
- ์ธ๋ถ๋ก๋ถํฐ ์ ๊ณต๋ฐ์ ์ค๋ธ์ ํธ ๋ ํผ๋ฐ์ค๋ฅผ ์ ์ฅํด๋๋ค๊ฐ ๋ด๋ถ์ ๋ฉ์๋์์ ์ฌ์ฉํ๊ฒ ํ๋ DI ๋ฐฉ์์ ํ์ฉ
-
์ผ๋ฐ ๋ฉ์๋๋ฅผ ์ด์ฉํ ์ฃผ์
- ์ฌ๋ฌ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ ์ ์๋ ์ฅ์ ์ ๊ฐ์ง
- ์์ฑ์์ ๋ง์ ๊ฐ์์ ํ๋ผ๋ฏธ๋๋ฅผ ํ๊บผ๋ฒ์ ๋ฐ์ผ๋ฉด ์ค์ํ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ ์ ์ ํ ํ๋ผ๋ฏธํฐ ๊ฐ์๋ฅผ ๋๋ ์ด๊ธฐํ ๋ฉ์๋๋ฅผ ์์ฑํ ์ ์๋ค
@Bean // -> ์์ ์ ๋ฉ์๋ DI๋ฅผ ์ฌ์ฉํ๋ ํํ ๋ฆฌ ๋ฉ์๋ public UserDao userDao(){ UserDao userDao = new UserDao(); userDao.setConnectionMaker(connectionMaker()); return userDao; } // ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ์์ ๊ณผ ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ก์ ๋ฟ ๊ฒฐ๊ณผ๋ ๋์ผํ๋ค
๐ฑ Branch chapter01/refactor1.8 ์ ์ค์ต ์ ์ฉ
-
๋จ์ํ ํ ์คํธ ํ์ผ์ ์ปดํ์ผ๊ณผ ๊ฐ์ ๋ณ๋์ ๋น๋ ์์ ์ด ์๋ ์ฅ์
-
ํ๊ฒฝ์ด ๋ฌ๋ผ์ ธ์ ์ค๋ธ์ ํธ์ ๊ด๊ณ๊ฐ ๋ฐ๋๋ ๊ฒฝ์ฐ์๋ ๋น ๋ฅด๊ฒ ๋ณ๊ฒฝ์ฌํญ ๋ฐ์
| ์๋ฐ ์ฝ๋ ์ค์ ์ ๋ณด | XML ์ค์ ์ ๋ณด | |
|---|---|---|
| ๋น ์ค์ ํ์ผ | @Configuration | |
| ๋น์ ์ด๋ฆ | @Bean methodName() | <bean id="methodName" |
| ๋น์ ํด๋์ค | return new BeanClass(); | class="abc.package.BeanClass"> |
๋น์ ์ด๋ฆ, ํด๋์ค ๋๊ฐ์ง ์ ๋ณด๋ฅผ ํ๊ทธ์ id, class ์์ฑ์ผ๋ก ์ ์ํ๋ค
@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 : ์์ ์ ๋ฉ์๋๋ฅผ ์ด์ฉํด ์ฃผ์ ํด์ค ๋น ์ค๋ธ์ ํธ ์ด๋ฆ
-
DTD
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
ํ๊ทธ ์์ ์๋จ์ ์ ์ธ์ ๋ฃ์ด์ค๋ค
-
์คํค๋ง
- 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 ์ค์ ํ์ผ์ ๋ ๊ฐ์ง ๋ฐฉ์ ๋ชจ๋ ์ง์. ํน๋ณํ ์ด์ ๊ฐ ์๋ค๋ฉด ์คํค๋ง๋ฅผ ์ฌ์ฉํ๊ธธ ๊ถ์ ๋จ
GenericXmlApplicationContext๋ฅผ ์ฌ์ฉ + XML ํ์ผ์ ํด๋์คํจ์ค ์ง์
ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");@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;
}