Notice
Recent Posts
Link
Today
Total
07-07 22:50
๊ด€๋ฆฌ ๋ฉ”๋‰ด

dingdong coding

JDBC vs JDBC Template vs JPA ๋ณธ๋ฌธ

๐ŸSpring/Basic

JDBC vs JDBC Template vs JPA

๐Ÿถ ๊ฐœ๋ฐœ๊ฐœ๋ฐœ ๐Ÿพ 2022. 6. 18. 12:22

JDBC (Java Database Connectivity)

    •  JDBC๋Š” DB์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก Java์—์„œ ์ œ๊ณตํ•˜๋Š” ํ‘œ์ค€ API์ž…๋‹ˆ๋‹ค.

    •  ์ฆ‰, ๋ชจ๋“  Java DataAccess ๊ธฐ์ˆ ์˜ ๊ทผ๊ฐ„์ด๋ฉฐ ๋ชจ๋“  Persistence Framework๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ JDBC API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

       ์˜์†์„ฑ(Persistence)

 

 

build.gradle ์„ค์ •

implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'

 

๊ทธ ๋’ค์— ์–ด๋–ค DBMS๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ์—ฐ๊ฒฐ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

JDBC๋ฅผ ์ด์šฉํ•ด ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•œ ์ฝ”๋“œ

 

  1. Connection์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ
  2. ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑ ํ›„ PreparedStatement๋กœ ์‹คํ–‰ํ•˜๊ธฐ
  3. resultSet์„ ์ด์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌํ•˜๊ธฐ
  4. Connection ๋‹ซ์•„์ฃผ๊ธฐ
@Override
    public Member save(Member member) {
        String sql = "insert into member(name) values(?)";
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql,
                    Statement.RETURN_GENERATED_KEYS);
            pstmt.setString(1, member.getName());
            pstmt.executeUpdate();
            rs = pstmt.getGeneratedKeys();
            if (rs.next()) {
                member.setId(rs.getLong(1));
            } else {
                throw new SQLException("id ์กฐํšŒ ์‹คํŒจ");
            }
            return member;
        } catch (Exception e) {
            throw new IllegalStateException(e);
        } finally {
            close(conn, pstmt, rs); }
    }

    @Override
    public Optional<Member> findById(Long id) {
        String sql = "select * from member where id = ?";
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setLong(1, id);
            rs = pstmt.executeQuery();
            if(rs.next()) {
                Member member = new Member();
                member.setId(rs.getLong("id"));
                member.setName(rs.getString("name"));
                return Optional.of(member);
            } else {
                return Optional.empty();
            }
        } catch (Exception e) {
            throw new IllegalStateException(e);
        } finally {
            close(conn, pstmt, rs);
        }
    }

 

์ด์ฒ˜๋Ÿผ  JDBC API๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋ฉด ์—ฐ๊ฒฐ๋ถ€ํ„ฐ ํ•ด์ œ๊นŒ์ง€ ๋˜ํ•œ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์ƒ๊ธด๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ง€๊ธˆ๊นŒ์ง€ ํ•™๋ถ€์‹œ์ ˆ์— ๊ต๋‚ด์—์„œ ํ–ˆ๋˜ Java ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด JSP๋กœ ๊ฑฐ์˜ ์ˆœ์ˆ˜ JDBC ์ฝ”๋“œ๋กœ ๊ฐœ๋ฐœํ–ˆ๋‹ค.

Tomcat ์„ค์ • ๋ถ€ํ„ฐ JDBC, DB ์…‹ํŒ… ์ „๋ถ€.. 

 

ํ•˜์ง€๋งŒ ์ด ๊ณผ์ •์ด ์žˆ์—ˆ๊ธฐ์— ํ˜„์žฌ Spring ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ ์‹œ ์–ด๋–ค ๋ถ€๋ถ„์ด ์ž๋™ํ™”๋˜๋ฉฐ DB ์ž‘์—… ์‹œ JDBC Template, JPA์˜ ํŽธ๋ฆฌํ•จ์„ ๋Š๋‚„ ์ˆ˜ ์žˆ๋‹ค ์ƒ๊ฐํ•œ๋‹ค.

 

๋˜ํ•œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฌธ์ด ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š”์ง€ ์•Œ์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋จผ์ € ์ˆœ์ˆ˜ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๊ทธ ๋’ค์—  ๊ฐœ์„ ์‹œํ‚ค๋ฉฐ Developํ•˜๋Š” ๊ฒƒ์ด ํ•™์Šต์—๋Š” ๋” ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ( ๋‚ด ๊ฐœ์ธ์  ์˜๊ฒฌ ๐Ÿ˜‚ )


JDBC Template

    •  JDBC์™€ ๋™์ผํ•œ ํ™˜๊ฒฝ์„ค์ • 

    •  DriveManager๊ฐ€ํ•˜๋Š”์ผ๋“ค์„ JdbcTemplate์—๊ฒŒ ๋งก๊น๋‹ˆ๋‹ค.

    •  JDBC๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ƒ๋‹น ๋ถ€๋ถ„์˜ ์ฝ”๋“œ์™€ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ • ๋ฐ ๊ฒฐ๊ณผ ๋งคํ•‘์„ ๋Œ€์‹  ํ•ด์ค๋‹ˆ๋‹ค.

    •  JdbcTemplate, MyBatis๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” SQL Mapper ์ค‘ ํ•˜๋‚˜

 

  SQL Mapper

    -  SQL ๋ฌธ์žฅ์œผ๋กœ ์ง์ ‘ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

    -  SQL  ๋งคํ•‘  Object ํ•„๋“œ

    -  ์ฆ‰, SQL Mapper๋Š” SQL์„ ๋ช…์‹œํ•ด ์ค˜์•ผํ•œ๋‹ค.

    -  ex) MyBatis, Jdbc Templates 

 

 @Override
    public Member save(Member member) {
        // sql์„ ์ง์ ‘ ์งœ์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•
        SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
        jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");

        Map<String, Object> parameters = new HashMap<>();
        parameters.put("name", member.getName());

        Number key = jdbcInsert.executeAndReturnKey(new
                MapSqlParameterSource(parameters));
        member.setId(key.longValue());
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        List<Member> result = jdbcTemplate.query("select * from member where id = ?", memberRowMapper(), id);
        return result.stream().findAny();
    }

์•„๊นŒ JDBC API์— ๋ณธ ๋ฐ˜๋ณต ์ฝ”๋“œ ๋ฐ ์ค‘๋ณต๋œ ๋ถ€๋ถ„์ด ๋Œ€๋ถ€๋ถ„ ์ œ๊ฑฐ๋˜์—ˆ์ง€๋งŒ SQL์€ ์ง์ ‘ ์ž‘์„ฑํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

JDBC Template๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ถ”๊ฐ€๋กœ DataSource ์ •๋ณด๋ฅผ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

  • DataSource๋ฅผ ์ง์ ‘ Bean์œผ๋กœ ๋“ฑ๋ก
  • application.yml์— ์„ค์ •

DataSource 

-  DB Server์™€ ์—ฐ๊ฒฐ ์‹œํ‚ค๋Š” Connection์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  Bean์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ์ธ์ž๋ฅผ ๋„˜๊น€

-  DB Connection Pooling ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ


JPA ( Java Persistence API )

    •  ์ž๋ฐ” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ •์˜ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค

    •  ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋Š” ์ ์—์„œ ํŠน์ • ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋…์ด ์•„๋‹Œ ํŠน์ •ํ•œ ๊ธฐ์ˆ ์„ ๋ช…์„ธํ•œ ๊ฒƒ์— ๊ฐ€๊นŒ์›€

    •  ํŠน์ •ํ•œ ๊ธฐ์ˆ  : ์ž๋ฐ” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ 

    •  ๋Œ€ํ‘œ์ ์ธ ORM( Object Relational Mapping )  ex) hibernate

 

•  ORM

    -  ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

    -  ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋งคํ•‘(์—ฐ๊ฒฐ)ํ•ด ์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

    -  SQL ์ฟผ๋ฆฌ๊ฐ€ ์•„๋‹Œ ๋ฉ”์„œ๋“œ๋กœ ๋ฐ์ดํ„ฐ ์กฐ์ž‘ ๊ฐ€๋Šฅ

    -  ๊ฐ์ฒด๊ฐ„ ๊ด€๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ SQL์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑ 

    -  DB Data  ๋งคํ•‘  Object ํ•„๋“œ

    -  Persistence API ๋ผ๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

    -  ex) Hibernate, EclipseLink, DataNucleus .. 

 

build.gradle ์„ค์ •

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

Hibernate Framework๋ฅผ ํ™œ์šฉ

 

Spring Boot JPA ์„ค์ • ์ถ”๊ฐ€ 

resources/application.properties

spring.jpa.show-sql=true 
spring.jpa.hibernate.ddl-auto=none

/*
show-sql : JPA๊ฐ€ ์ƒ์„ฑํ•˜๋Š” SQL ์ถœ๋ ฅ
ddl-auto : JPA๋Š” ํ…Œ์ด๋ธ”์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ none์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๋ˆ๋‹ค.
*/

 

 

 

JPA๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ JDBC ์‚ฌ์ด์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ JPA๋ฅผ ํ™œ์šฉํ–ˆ์„ ๋•Œ JDBC API๋ฅผ ํ†ตํ•ด SQL์„ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ˜ธ์ถœํ•˜๋Š” ์ „๊ฐœ๋กœ ์ด๋ฃจ์–ด์ง.

์ฆ‰, ๊ฐœ๋ฐœ์ž๋Š” JPA์˜ ํ™œ์šฉ๋ฒ•๋งŒ ์ตํžˆ๋ฉด DB ์ฟผ๋ฆฌ ๊ตฌํ˜„์—†์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

    @Override
    public Member save(Member member) {
        em.persist(member);
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        Member member = em.find(Member.class, id);
        return Optional.ofNullable(member);
    }

 

์ด์ฒ˜๋Ÿผ JPA๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ธฐ์กด์˜ ๋ฐ˜๋ณต์ฝ”๋“œ๊ฐ€ ์ค„์–ด๋“ ๋‹ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๊ณ , SQL๋„ JPA๊ฐ€ ์ง์ ‘ ๋งŒ๋“ค์–ด ์‹คํ–‰ํ•ด ์ค๋‹ˆ๋‹ค.

๋˜ํ•œ SQL๊ณผ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์„ค๊ณ„์—์„œ ๊ฐ์ฒด ์ค‘์‹ฌ์˜ ์„ค๊ณ„๋กœ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ „ํ™˜ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐœ๋ฐœ์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ์ฒด ์ค‘์‹ฌ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ๋˜ํ•œ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

 ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ๊ธฐ๋ณธ์ ์ธ CRUD ๊ธฐ๋Šฅ

 findByName(), findByEmail() ๊ณผ ๊ฐ™์ด ๋ฉ”์„œ๋“œ ์ด๋ฆ„๋งŒ์œผ๋กœ Data ์กฐํšŒ ๊ฐ€๋Šฅ 

 •  ํŽ˜์ด์ง• ๊ธฐ๋Šฅ


์ •๋ฆฌ

 

ํ•™์Šต์— ๋งŽ์€ ๋„์›€์ด ๋œ ๋ธ”๋กœ๊ทธ ๋งํฌ๋ฅผ  ์ฐธ์กฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ™‚

 

์ฐธ์กฐ ๋ฐ ์ถœ์ฒ˜

JDBC, JPA, Mybatis ์ฐจ์ด์ 

JPA vs JDBC, JPA vs Mybatis, JPA vs Spring Data JPA์˜ ์ฐจ์ด์ ๊ณผ Hibernate

Jdbc, JdbcTemplate, Spring Data Jpa์— ๋Œ€ํ•ด์„œ

JPA vs Spring Data JPA

'๐ŸSpring > Basic' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Bean Life Cycle  (0) 2022.06.23
Spring Singleton  (0) 2022.06.22
Spring Framework, Spring Boot  (0) 2022.06.18
Spring Bean, Spring Container  (0) 2022.06.17
MVC, Spring MVC  (0) 2022.06.16
Comments