본문 바로가기
Spring Tutorial

[Spring 입문 12] 스프링 DB 접근 기술: 스프링 JdbcTemplate

by 미소5 2024. 8. 3.

[Spring 입문 10] 스프링 DB 접근 기술: 순수 JDBC (tistory.com)

 

[Spring 입문 10] 스프링 DB 접근 기술: 순수 JDBC

환경 설정build.gradle - jdbc, h2 데이터베이스 관련 라이브러리 추가implementation 'org.springframework.boot:spring-boot-starter-jdbc'runtimeOnly 'com.h2database:h2' application.properties - 스프링 부트 데이터베이스 연결 설

joly156.tistory.com

  • 스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API에서 본 반복 코드를 대부분 제거해준다. (간결해진 코드) 하지만 SQL은 직접 작성해야 한다.

  • 환경 설정
  • build.gradle - jdbc 관련 라이브러리 추가
implementation 'org.springframework.boot:spring-boot-starter-jdbc'

 


  • JdbcTemplateMemberRepository에 의존관계 추가 
private final JdbcTemplate jdbcTemplate;	//jdbcTemplate은 의존관계를 주입받을 수 없다

@Autowired  
public JdbcTemplateMemberRepository(DataSource dataSource) {	
    jdbcTemplate = new JdbcTemplate(dataSource);	//dataSource를 주입받는다
}

[Spring 입문 5] 스프링 빈과 의존관계: 자바 코드로 직접 스프링 빈 등록하기 (tistory.com)

 

[Spring 입문 5] 스프링 빈과 의존관계: 자바 코드로 직접 스프링 빈 등록하기

스프링 빈을 등록하는 2가지 방법컴포넌트 스캔과 자동 의존관계 설정자바 코드로 직접 스프링 빈 등록하기[Spring 입문 4] 스프링 빈과 의존관계: 컴포넌트 스캔과 자동 의존관계 설정 (tistory.com)

joly156.tistory.com

 


  • 스프링 JdbcTemplate 회원 리포지토리
public class JdbcTemplateMemberRepository implements MemberRepository {
    private final JdbcTemplate jdbcTemplate;

    //@Autowired  //생성자 하나만 있을땐 생략 가능
    public JdbcTemplateMemberRepository(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @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());
    }

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

 


  • JdbcTemplate 을 사용하도록 스프링 설정 변경
@Configuration
public class SpringConfig {

 	private DataSource dataSource;
    
	public SpringConfig(DataSource dataSource) {
 		this.dataSource = dataSource;
 	}
    
 	@Bean
 	public MemberService memberService() {
 		return new MemberService(memberRepository());
 	}
    
 	@Bean
 	public MemberRepository memberRepository() {
		// return new MemoryMemberRepository();
		// return new JdbcMemberRepository(dataSource);
 		return new JdbcTemplateMemberRepository(dataSource);
 }
}
  • 스프링 컨테이너에 다음과 같이 설정되었다.
    • memberController  memberService → JdbcTemplateMemberRepository(dataSource)

 


  •  memberRowMapper()  메소드
private RowMapper<Member> memberRowMapper() {
    return new RowMapper<Member>() {
        @Override
        public Member mapRow(ResultSet rs, int rowNum) throws SQLException {
            Member member=new Member();
            member.setId(rs.getLong("id"));
            member.setName(rs.getString("name"));
            return member;
        }
    }
}
  • return new RowMapper에서 ALT+ENTER, [람다로 바꾸기]로 람다식으로 변경

 

728x90
반응형