Spring/Spring ์ž…๋ฌธ

์Šคํ”„๋ง ์ž…๋ฌธ - (14) ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ  / ์ˆœ์ˆ˜ Jdbc

hello_u 2023. 1. 26. 16:17

์ด์ „์— ์ด์šฉํ•ด์™”๋˜ ๋ฐ์ดํ„ฐ๋“ค์€

๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ๊ป๋‹ค ์ผœ๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ง€์›Œ์ง„๋‹ค

 

๋ฐ์ดํ„ฐ๋“ค์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•ด์„œ ๊ด€๋ฆฌํ•ด๋ณด์ž

 

 

H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์น˜

  1. ๋‹ค์šด๋กœ๋“œ ๋ฐ ์„ค์น˜
  2. ๊ถŒํ•œ ์ฃผ๊ธฐ: chmod 755 h2.sh
  3. ์‹คํ–‰: ./h2.sh
  4. jdbc:h2:~/test (์ตœ์ดˆ ํ•œ๋ฒˆ)
  5. ~/test.mv.db ํŒŒ์ผ ์ƒ์„ฑ ํ™•์ธ
  6. ์ดํ›„๋ถ€ํ„ฐ๋Š” jdbc:h2:tcp://localhost/~/test ์ด๋ ‡๊ฒŒ ์ ‘์†
     

ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๊ธฐ

ํ…Œ์ด๋ธ” ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— sql/ddl.sql ํŒŒ์ผ์„ ์ƒ์„ฑ

drop table if exists member CASCADE;
    create table member
    (
        id   bigint generated by default as identity,
        name varchar(255),
        primary key (id)
);

 

 

 

 

 

 

 

์ˆœ์ˆ˜ Jdbc

Jdbc ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ตฌํ˜„
์ฃผ์˜! ์ด๋ ‡๊ฒŒ JDBC API๋กœ ์ง์ ‘ ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์€ 20๋…„ ์ „ ์ด์•ผ๊ธฐ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ณ ๋Œ€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ด๋ ‡๊ฒŒ

๊ณ ์ƒํ•˜๊ณ  ์‚ด์•˜๊ตฌ๋‚˜ ์ƒ๊ฐํ•˜๊ณ , ์ •์‹ ๊ฑด๊ฐ•์„ ์œ„ํ•ด ์ฐธ๊ณ ๋งŒ ํ•˜๊ณ  ๋„˜์–ด๊ฐ€์ž.

 

build.gradle ํŒŒ์ผ์— jdbc, h2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€

 

์Šคํ”„๋ง ๋ถ€ํŠธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์„ค์ • ์ถ”๊ฐ€

์Šคํ”„๋ง์ด DB์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์ž‘์—… ์ˆ˜ํ–‰ 

 

resources/application.properties

spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa

 

 

ํšŒ์›์„ ์ €์žฅํ•˜๋Š” ์—ญํ•  - MemberRepository  ( ์ธํ„ฐํŽ˜์ด์Šค ) 

๊ตฌํ˜„์„ ๋ฉ”๋ชจ๋ฆฌ์— ํ•œ๋‹ค -> MemoryMemberRepository

 

DB์™€ ์—ฐ๋™ํ•ด์„œ Jdbc ๋กœ ๊ตฌํ˜„ -> JdbcMemberRepository

public class JdbcMemberRepository implements MemberRepository

 

DB์— ์ ‘๊ทผํ•˜๋ ค๋ฉด DataSource ๊ฐ€ ํ•„์š”ํ•˜๋‹ค

private DataSource dataSource;

public JdbcMemberRepository(DataSource dataSource) {
    this.dataSource = dataSource;
}

 

 

 

@Configuration // ์Šคํ”„๋ง์ด ๋œฐ ๋•Œ configuration ์„ ์ฝ๊ณ 
public class SpringConfig {

    private final DataSource dataSource;

    public SpringConfig(DataSource dataSource) {
        this.dataSource = dataSource;
    }
@Bean // ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ• ๊ฑฐ์•ผ ๋ผ๋Š” ์˜๋ฏธ
public MemberRepository memberRepository() {
    // return new MemoryMemberRepository();
    return new JdbcMemberRepository(dataSource);
}

 

DataSource๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜์„ ํš๋“ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด๋‹ค.

์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ DataSource๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋งŒ๋“ค์–ด๋‘”๋‹ค.

๊ทธ๋ž˜์„œ DI๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP, Open-Closed Principle) ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ๊ณ , ์ˆ˜์ •, ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€์žˆ๋‹ค.

์Šคํ”„๋ง์˜ DI (Dependencies Injection)์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ „ํ˜€ ์†๋Œ€์ง€ ์•Š๊ณ , ์„ค์ •๋งŒ์œผ๋กœ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
ํšŒ์›์„ ๋“ฑ๋กํ•˜๊ณ  DB์— ๊ฒฐ๊ณผ๊ฐ€ ์ž˜ ์ž…๋ ฅ๋˜๋Š”์ง€ ํ™•์ธํ•˜์ž.
๋ฐ์ดํ„ฐ๋ฅผ DB์— ์ €์žฅํ•˜๋ฏ€๋กœ ์Šคํ”„๋ง ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ด๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅ๋œ๋‹ค.