์Šคํ”„๋ง ์ž…๋ฌธ - (16) ์Šคํ”„๋ง JdbcTemplate

2023. 1. 27. 17:56ยทSpring/Spring ์ž…๋ฌธ

 

์ˆœ์ˆ˜ Jdbc์™€ ๋™์ผํ•œ ํ™˜๊ฒฝ์„ค์ •์„ ํ•˜๋ฉด ๋œ๋‹ค.


์Šคํ”„๋ง JdbcTemplate๊ณผ MyBatis ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” JDBC API์—์„œ ๋ณธ ๋ฐ˜๋ณต ์ฝ”๋“œ๋ฅผ ๋Œ€๋ถ€๋ถ„ ์ œ๊ฑฐํ•ด์ค€๋‹ค.

ํ•˜์ง€๋งŒ SQL์€ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

 

 

์Šคํ”„๋ง JdbcTemplate ํšŒ์› ๋ฆฌํฌ์ง€ํ† ๋ฆฌ

JdbcTemplateMemberRepository.class

public class JdbcTemplateMemberRepository implements MemberRepository {
    
    private final JdbcTemplate jdbcTemplate;

    public JdbcTemplateMemberRepository(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
    }

 

DataSoruce

๋”๋ณด๊ธฐ

 

DataSource๋ž€?

  • DB์™€ ๊ด€๊ณ„๋œ ์ปค๋„ฅ์…˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ ์žˆ์œผ๋ฉฐ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ์ธ์ž๋กœ ๋„˜๊ฒจ์ค€๋‹ค.
  • → ์ด ๊ณผ์ •์„ ํ†ตํ•ด Spring์€ DataSource๋กœ DB์™€์˜ ์—ฐ๊ฒฐ์„ ํš๋“ํ•œ๋‹ค.

DataSource ๋Š” DB์™€ ์—ฐ๊ฒฐ์„ ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๊ณ  

์Šคํ”„๋ง์€ DataSoruce๋ฅผ ํ†ตํ•ด DB์™€์˜ Connect๋ฅผ ํš๋“ํ•œ๋‹ค

 

 

์ •๋ฆฌ

spring-jdbc๋ฅผ ์ด์šฉํ•ด์„œ plain jdbc์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๋ฉฐ ํ•ต์‹ฌ ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ• ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ์ด๋•Œ Spring-jdbc์˜ ์—ฌ๋Ÿฌ ์ ‘๊ทผ๋ฐฉ๋ฒ•์ค‘ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” jdbcTemplate์„ ์„ ํƒํ•œ๋‹ค.

DataSource๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ์ด๋ฅผ jdbcํ…œํ”Œ๋ฆฟ์— ์ฃผ์ž…ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์†Œ์Šค๋Š” ๋””๋น„์™€ ์—ฐ๊ฒฐ์„ ํš๋“ํ•œ๋‹ค. ์–ด๋–ค ๋””๋น„๋ฅผ ์‚ฌ์šฉํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ๋””๋น„์— ๋งž๋Š” jdbc driver๊ฐ€ ์กด์žฌํ•œ๋‹ค.

jdbcํ…œํ”Œ๋ฆฟ์ด jdbc๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ด์šฉํ•ด์„œ DB์— ์ ‘๊ทผํ•œ๋‹ค.

 

 

JdbcTemplate

๋”๋ณด๊ธฐ

JDBC์˜ ์‚ฌ์šฉ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์ผ๋ฐ˜์ ์ธ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋œ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ JDBC๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ˜๋ณต ์ž‘์—…์„ ๋Œ€์‹  ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

 

์‰ฝ๊ฒŒ ๋งํ•ด JdbcTemplate์€ ๊ฐœ๋ฐœ์ž๊ฐ€ JDBC ๊ธฐ์ˆ ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํด๋ž˜์Šค์ด๋‹ค.

 

 

3. ์ฟผ๋ฆฌ ์ž‘์„ฑ ๋ฐ ์‹คํ–‰

JdbcTemplate ํด๋ž˜์Šค๋Š” SELECT ์ฟผ๋ฆฌ ์‹คํ–‰์„ ์œ„ํ•œ query() ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ฉ”์„œ๋“œ๋“ค์€ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋“ค์ž…๋‹ˆ๋‹ค.

  • List<T> query(String sql, RowMapper<T> rowMapper)
  • List<T> query(String sql, Object[] args, RowMapper<T> rowMapper)
  • List<T> query(String sql, RowMapper<T> rowMapper, Object... args)

query() ๋ฉ”์„œ๋“œ๋Š” sql ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  RowMapper๋ฅผ ์ด์šฉํ•ด์„œ ResultSet์˜ ๊ฒฐ๊ณผ๋ฅผ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. <T>๋Š” ์–ด๋–ค ํƒ€์ž…๋„ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

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

 

 

private RowMapper<Member> memberRowMapper() {
    return (rs, rowNum) -> {
        Member member = new Member();
        member.setId(rs.getLong("id"));
        member.setName(rs.getString("name"));
        return member;
    };

 ๋‹จ์ˆœ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์•„๋‹Œ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

์—ฌ๊ธฐ์„œ RowMapper๋ฅผ ํ™œ์šฉํ•ด ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

RowMapper๋ž€?

RowMapper๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ˜ํ™˜ ๊ฒฐ๊ณผ์ธ ResultSet์„ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ํด๋ž˜์Šค์ด๋‹ค. 

 

RowMapper์˜ mapRow()๋ผ๋Š” ๋ฉ”์„œ๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.

T mapRow(ResultSet rs, int rowNum) throws SQLException;

ResultSet rs์— ๊ฒฐ๊ด๊ฐ’์„ ๋‹ด์•„์™€ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๊ฐ์ฒด์— ๋‹ด๋Š”๋‹ค. rowNum์€ ๋ฐ˜๋ณต๋˜๋Š” ๋ฃจํ”„ ์ค‘ ํ˜„์žฌ ํ–‰์˜ ๋ฒˆํ˜ธ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ฆ‰ ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

public Item mapRow(ResultSet rs, int rowNum) throws SQLException {
    // ResultSet ๊ฐ’์„ Item ๊ฐ์ฒด์— ์ €์žฅ
    Item item = new Item();
    item.setId(rs.getLong("id"));
    item.setItemName(rs.getString("item_name"));
    item.setPrice(rs.getInt("price"));
    
    // item ๋ฐ˜ํ™˜
    return item;
};

 

 

 

@Override
public Member save(Member member) {
    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();
}
@Override
public Optional<Member> findByName(String name) {
    List<Member> result = jdbcTemplate.query("select * from member where name = ?", memberRowMapper(), name);
    return result.stream().findAny();
}
@Override
public List<Member> findAll() {
    return jdbcTemplate.query("select * from member", memberRowMapper());
}

 

 

https://code-lab1.tistory.com/277

 

[Spring] JdbcTemplate์ด๋ž€? JdbcTemplate ์‚ฌ์šฉ๋ฒ•, RowMapper๋ž€?

JdbcTemplate์ด๋ž€? JdbcTemplate์€ JDBC ์ฝ”์–ด ํŒจํ‚ค์ง€์˜ ์ค‘์•™ ํด๋ž˜์Šค๋กœ JDBC์˜ ์‚ฌ์šฉ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์ผ๋ฐ˜์ ์ธ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋œ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ JDBC๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ˜๋ณต ์ž‘

code-lab1.tistory.com

 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'Spring > Spring ์ž…๋ฌธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์Šคํ”„๋ง ์ž…๋ฌธ - (18) ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA  (0) 2023.01.28
์Šคํ”„๋ง ์ž…๋ฌธ - (17) JPA(Java Persistence API)  (0) 2023.01.28
์Šคํ”„๋ง ์ž…๋ฌธ - (15) ์Šคํ”„๋ง ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ  (0) 2023.01.27
์Šคํ”„๋ง ์ž…๋ฌธ - (14) ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ  / ์ˆœ์ˆ˜ Jdbc  (0) 2023.01.26
์Šคํ”„๋ง ์ž…๋ฌธ - (13) ํšŒ์› ์›น ๊ธฐ๋Šฅ  (0) 2023.01.22
'Spring/Spring ์ž…๋ฌธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • ์Šคํ”„๋ง ์ž…๋ฌธ - (18) ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA
  • ์Šคํ”„๋ง ์ž…๋ฌธ - (17) JPA(Java Persistence API)
  • ์Šคํ”„๋ง ์ž…๋ฌธ - (15) ์Šคํ”„๋ง ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
  • ์Šคํ”„๋ง ์ž…๋ฌธ - (14) ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ  / ์ˆœ์ˆ˜ Jdbc
hello_u
hello_u
  • hello_u
    ๐Ÿ˜œ
    hello_u
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๐Ÿ˜œ (345)
      • Hardware (2)
        • BMC (2)
      • Spring (109)
        • Spring ์ž…๋ฌธ (20)
        • Spring ๊ธฐ๋ณธ (27)
        • Spring MVC (18)
        • Spring DB (22)
        • Spring JPA ๊ธฐ๋ณธ (16)
        • Spring JPA ํ™œ์šฉ (6)
      • Develop (27)
        • DB (8)
        • JAVA (4)
        • Web (2)
        • Python (7)
        • OSS (2)
        • Git (2)
        • API (2)
      • Algorithm (155)
        • CodeUp ๊ธฐ์ดˆ (44)
        • ํŒŒ์ด์ฌ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (64)
        • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (4)
        • SWEA (30)
        • Softeer (10)
        • BOJ (2)
      • CS (9)
        • ์ปดํ“จํ„ฐ์ผ๋ฐ˜ (3)
        • ์šด์˜์ฒด์ œ (3)
        • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (0)
        • ์ •๋ณดํ†ต์‹  (1)
        • ์ž๋ฃŒ๊ตฌ์กฐ (1)
        • ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ (1)
        • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (0)
        • ์ตœ์‹  ๋””์ง€ํ„ธ, ์ผ๋ฐ˜์ƒ์‹ (0)
      • ์ž๊ฒฉ์ฆ (41)
        • ์ •๋ณด๋ณด์•ˆ๊ธฐ์‚ฌ (9)
        • ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ (22)
        • ๋ฆฌ๋ˆ…์Šค๋งˆ์Šคํ„ฐ 1๊ธ‰ (3)
        • SQLD (7)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
hello_u
์Šคํ”„๋ง ์ž…๋ฌธ - (16) ์Šคํ”„๋ง JdbcTemplate
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”