Skip to content
Go back

[Spring๐ŸŒฑ] JDBC,Spring JDBC,Spring JPA ๊ฐœ๋…๊ณผ ์‚ฌ์šฉ๋ฒ• ์ด์ •๋ฆฌ

Edit page

JDBC, Spring JDBC, Spring JPA ๊ฐœ๋…๊ณผ ์‚ฌ์šฉ๋ฒ• ์ด์ •๋ฆฌ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. JDBC๋กœ ์‹œ์ž‘ํ•ด, ์ด๋ฅผ ์ถ”์ƒํ™”ํ•œ Spring JDBC, ๊ทธ๋ฆฌ๊ณ  ORM ๊ธฐ๋ฐ˜์˜ Spring JPA(Hibernate)๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๊ณ„์ธต์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ด ์„ธ ๊ฐ€์ง€ ๊ธฐ์ˆ ์˜ ํŠน์ง•๊ณผ ์‚ฌ์šฉ๋ฒ•์„ ๊ฐ„๋žตํžˆ ์‚ดํŽด๋ณด๊ณ , ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์ฐจ์ด์ ์„ ๋น„๊ตํ•ด๋ณธ๋‹ค.

CommandLineRunner์™€ ApplicationRunner

Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ๋™ํ•  ๋•Œ, ํŠน์ • ๋กœ์ง์„ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด CommandLineRunner ๋˜๋Š” ApplicationRunner ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

@Component
public class CourseJdbcCommandLineRunner implements CommandLineRunner {

    @Autowired
    private CourseJdbcRepository repository;

    @Override
    public void run(String... args) throws Exception {
        repository.insert();
    }
}

๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋ฐ ํ•„์š”์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


JDBC

**JDBC (Java Database Connectivity)**๋Š” ์ž๋ฐ”์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ  SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋ฉฐ, ๋ชจ๋“  DB ์ž‘์—…์„ ์ง์ ‘ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ๋Š” ๋‹จ์ˆœํ•œ ์‚ญ์ œ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ์Šต์ด๋‹ค.

public void deleteTodo(int id) {
    PreparedStatement st = null;
    try {
        st = db.conn.prepareStatement("delete from todo where id=?");
        st.setInt(1, id);
        st.execute();
    } catch (SQLException e) {
        logger.fatal("Query Failed : ", e);
    } finally {
        if (st != null) {
            try { st.close(); }
            catch (SQLException e) {}
        }
    }
}

JDBC์˜ ํŠน์ง•


Spring JDBC

Spring JDBC๋Š” JDBC๋ฅผ ๋”์šฑ ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์ถ”์ƒํ™” ๊ณ„์ธต์ด๋‹ค. JdbcTemplate ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ(์—ฐ๊ฒฐ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋“ฑ)๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , SQL ์‹คํ–‰ ๋กœ์ง์„ ๊ฐ„๋‹จํžˆ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

@Repository
public class CourseJdbcRepository {

    @Autowired
    private JdbcTemplate springJdbcTemplate;

    private static final String INSERT_QUERY =
            """
            insert into course (id,name,author) values(2, 'azure', 'solo');
            """;

    public void insert() {
        springJdbcTemplate.update(INSERT_QUERY);
    }
}

JdbcTemplate๊ณผ queryForObject() ํ™œ์šฉ

insert, delete ์˜ˆ์‹œ

@Repository
public class CourseJdbcRepository {

    private static final String INSERT_QUERY = """
            insert into course (id, name, author) values(?, ?, ?);
            """;

    private static final String DELETE_QUERY = """
            delete from course where id = ?
            """;

    @Autowired
    private JdbcTemplate springJdbcTemplate;

    public void insert(Course course) {
        springJdbcTemplate.update(INSERT_QUERY,
                course.getId(), course.getName(), course.getAuthor());
    }

    public void deleteById(long id) {
        springJdbcTemplate.update(DELETE_QUERY, id);
    }
}

queryForObject()์™€ RowMapper

๋‹จ์ผ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • id๋กœ Course ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

public Course findById(long id) {
    String sql = "SELECT * FROM course WHERE id = ?";
    return springJdbcTemplate.queryForObject(
        sql,
        new BeanPropertyRowMapper<>(Course.class),
        id
    );
}

RowMapper์˜ ์ž‘๋™ ์›๋ฆฌ

  1. SQL ์‹คํ–‰ ๊ฒฐ๊ณผ์ธ ResultSet์„ ๋ฐ›๋Š”๋‹ค.
  2. RowMapper ๊ตฌํ˜„์ฒด๊ฐ€ ResultSet์˜ ๊ฐ ์ปฌ๋Ÿผ์„ Java ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•œ๋‹ค.
  3. ๋งคํ•‘๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Spring JPA์™€ Hibernate

**JPA (Java Persistence API)**๋Š” ์ž๋ฐ” ์ง„์˜์—์„œ ์ •์˜ํ•œ ORM(Object-Relational Mapping) ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. Hibernate๋Š” ์ด JPA ํ‘œ์ค€์˜ ๋Œ€ํ‘œ์ ์ธ ๊ตฌํ˜„์ฒด์ด๋‹ค.

JPA ์‚ฌ์šฉ ์‹œ ์žฅ์ 

์™œ ์ง์ ‘ Hibernate๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  JPA ์ฝ”๋“œ๋ฅผ ์“ฐ๋‚˜?


JDBC vs Spring JDBC vs Spring JPA ๋น„๊ต

1) JDBC

2) Spring JDBC

3) Spring JPA (Hibernate)

ํ•ญ๋ชฉJDBCSpring JDBCSpring JPA (Hibernate)
์ถ”์ƒํ™” ์ˆ˜์ค€๋‚ฎ์Œ์ค‘๊ฐ„๋†’์Œ
์ฝ”๋“œ ๊ฐ„๊ฒฐ์„ฑ๋‚ฎ์Œ๋†’์Œ๋งค์šฐ ๋†’์Œ
์˜ˆ์™ธ ์ฒ˜๋ฆฌ์ง์ ‘ ์ฒ˜๋ฆฌSpring ์˜ˆ์™ธ ๋ณ€ํ™˜ ์ง€์›Spring ์˜ˆ์™ธ ๋ณ€ํ™˜ + ORM ์ง€์›
์ฟผ๋ฆฌ ์ž‘์„ฑ์ง์ ‘ SQL ์ž‘์„ฑ์ง์ ‘ SQL ์ž‘์„ฑ๋ฉ”์„œ๋“œ ๊ธฐ๋ฐ˜ ์ž๋™ ์ƒ์„ฑ + JPQL
์œ ์—ฐ์„ฑ๋งค์šฐ ๋†’์Œ๋†’์Œ์ค‘๊ฐ„ (ORM ๊ทœ์น™์— ๋”ฐ๋ฆ„)
ํ•™์Šต ๊ณก์„ ๋‚ฎ์Œ๋‚ฎ์Œ์ค‘๊ฐ„~๋†’์Œ
์œ ์ง€๋ณด์ˆ˜์„ฑ๋‚ฎ์Œ์ค‘๊ฐ„~๋†’์Œ๋†’์Œ

๊ฒฐ๋ก  ๐ŸŽฏ

ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๋‚˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ JDBC, Spring JDBC, Spring JPA๋ฅผ ์ ์ ˆํžˆ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.

๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์„ ์ž˜ ์ดํ•ดํ•˜๊ณ , ์ƒํ™ฉ์— ๋งž์ถฐ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.


์ฐธ๊ณ ์ž๋ฃŒ ๐Ÿ“š


Edit page
Share this post on:

Previous Post
[DB] ์ธ๋ฑ์Šค ์ดํ•ด ๋ฐ ํ™œ์šฉ
Next Post
[Spring๐ŸŒฑ] ๋กœ๊น…(Logging) ์™„๋ฒฝ ๊ฐ€์ด๋“œ ๐Ÿ“