JAVA를 잡아라!...

Spring Framework_DAO_JdbcTemplate 본문

Spring

Spring Framework_DAO_JdbcTemplate

onivv 2024. 3. 4. 11:04

[ JdbcTemplate을 활용한 DAO version upgrade ]

  • 기존 DAO에 템플릿 패턴을 활용한 클래스를 구현해서 코드 가독성 증가
  • JdbcTemplate : 템플릿 패턴을 활용한 클래스
  • 반복되는 JDBC의 로직(DB연결 → SQL 생성 → 실행 → 결과 → DB연결해제)을 캡슐화한 클래스
  • 템플릿 패턴 : 반복적인 로직, 복잡한(어려운) 로직을 캡슐화한 클래스

ex) 반복되는 JDBC의 로직(DB연결 → SQL 생성 → 실행 → 결과 → DB연결해제)

기존 DAO의 CRUD 중 selectOne


JdbcTemplate으로 CRUD 수행 (+ RowMapper 클래스 작성)

[ SELECTALL ]
jdbcTemplate으로 selectAll
executeQuery() → selectAll의 output은 List → jdbcTemplate.query
jdbcTemplate.query(SQL구문_어떤 SQL을 실행시키고, new MemberRowMapper()_???)


[ SELECTONE ]
jdbcTemplate으로 selectOne
executeQuery() → selectOne의 output은 객체 → jdbcTemplate.queryForObject
jdbcTemplate.queryForObject(SQL구문_어떤 SQL을 실행시키고, 인자_배열 args, new MemberRowMapper()_???)
	update와는 달리 인자를 배열로 줘야함 (무슨 객체를 줄지 모르니 Object로 하면됨! → Object[] args)
	args → MemberDTO가 자동으로 매핑안됨 → RowMapper 사용
	new → 매번 새 결과를 줘야하기 때문에 결과에 대한 것은 싱글톤이 되면 안됨, new 해도됨!
output이 객체이므로 그대로 return


[ INSERT, UPDATE, DELETE ]
jdbcTemplate으로 insert, update, delete
executeUpdate() → CUD의 output은 int → CUD는 모두 jdbcTemplate.update
jdbcTemplate.update(SQL구문_어떤 SQL을 실행시키고, ?_어떤인자를 줄지 알려줘야함)

[ RowMapper ]
어떻게 매핑해서 결과를 반환할지 모르니까 RowMapper 사용
개발자의 편의를 위해 RowMapper 인터페이스 사용 (RowMapper는 상속받아서 만들어야함)

 

위 로직을 수행하려면 JdbcTemplate이 DAO의 멤버변수여야함

 

멤버변수로 두면 의존관계 형성 @Autowired (객체 new)

  • @Autowired : 메모리에 로드가 돼있어야함 (언젠가 new JdbcTemplate()을 해야함)
  • 객체 new 2가지 방법
    1. .xml <bean>
    2. @Component (@Service, @Repository)
  • 현재 우리에게 JdbcTemplate 파일이 없어 @Comopnent 사용 불가
  • 따라서 1번 방법 사용 : applicationContext.xml → 스프링 컨테이너가 객체 생성
기존 JDBCUtil에서 하던것을 xml에서 한번에 수행

// BasicDataSource 객체 new & setter주입 (DB정보_데이터베이스와의 연결에 필요한 기본 설정)
// DBCP (DBConnection Pool) : 수많은 연결들을 관리해주는 객체
// destroy-method="close" : 혹시 close 이슈있으면 지워주기 (성능 올려주는 애인데, PC가 못따라갈 수 있음)
<bean id-"dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">		
	<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
	<property name="url" value="jdbc:mysql://localhost:3306/kimdb"/>
	<property name="username" value="root"/>
	<property name="password" value="1234"/>
</bean>

// JdbcTemplate 객체 new & setter주입 (dataSource)
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
	// JdbcTemplate 쓰려면 Setter주입을 해야줘야함 ↓ (커넥션을 관리해주는 dataSource객체)
	<property name="dataSource" ref="dataSource" />	
</bean>

 

Util 역할의 dataSource 필요

applicationContext.xml

 

pom.xml에 jar 추가 (dependency 추가)

pom.xml

 

@Repository 변경 (기존DAO → 변경DAO)

 

 

xxxImpl 멤버변수 타입 변경

MemberDAO &rarr; MemberDAO02