시뻘건 개발 도전기

#13 : JDBC (Java DataBase Connectivity) 본문

Framework/spring

#13 : JDBC (Java DataBase Connectivity)

시뻘건볼때기 2020. 5. 10. 17:56
반응형

  Database를 연동하게 된다면, 우리는 코드 상에서 query를 날리는 로직이 필요할 것이다. 그렇다면 우리가 해야할 일은 다음과 같을 것이다.

 

드라이버 로드 -> connection 생성 (혹은 DB pool 사용) -> DB 연결 -> sql auery 실행 -> 자원해제

 

데이터베이스에 접근 할 때마다 상기 내용과 같은 작업이 반복적으로 이루어져야만 한다는 이야기다. 이를 해결하기 위해 JDBC를 사용하는 것이다.

 

  spring JDBC를 사용하기 위해 spring-jdbc maven lib이 필요하다. 찾는 방법은 이전 글의 maven Repository를 참고하자.

 

#12 : spring 관련 docs 및 API 참고 자료

spring을 사용하려면 spring docs는 필수로 보아야하고, 어떤 라이브러리들이 있는지, 어떻게 가져다 사용하는지 정도는 기본으로 알고 있어야한다. 그래서 spring 관련 홈페이지를 끄적여본다. 1. sprin

dotori.ga

이후 데이터베이스 설정을 해야한다. servlet-context.xml을 열어서 bean 설정을 해주자. 까먹었다면 이전 글을 다시 보자.

 

#5 : bean setting

bean을 설정하는 방법은 여러가지가 있다. 우리는 때때로 개발이 아닌 정보 변경을 필요로 할 때가 있다. 예를 들어서 DB 이전 혹은 서버 이전, 계정 변경 등과 같이 개발 건이 아니지만 개발자가 필요할 때가 있..

dotori.ga

	<beans:bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
		<beans:property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
		<beans:property name="url" value="jdbc:oracle:thin:@localhost:3664:dotori" />
		<beans:property name="username" value="dotori" />
		<beans:property name="password" value="dotori" />
	</beans:bean>
	
	<beans:bean name="template" class="org.springframework.jdbc.core.JdbcTemplate">
		<beans:property name="dataSource" ref="dataSource" />
	</beans:bean>

  JdbcTemplat의 객체가 필요하고 setter가 필요하다는 것을 바로 알 수 있다. 이제 JDBC를 위한 코드를 살펴보자.

 

 

public class DB {
	public static JdbcTemplate template;
}
@Controller
public class HomeController {
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

	public JdbcTemplate template;
	
	@Autowired
	public void setTemplat(JdbcTemplate template) {
		this.template = template;
		DB.template = this.template;
	}

	@RequestMapping("/")
	public ModelAndView home(Member member) {
		ModelAndView modelView = new ModelAndView();
		modelView.setViewName("home");
		return modelView;
	}
}
public class TestDao {
	DataSource dataSource;
	JdbcTemplate template;
	
	public TestDao() {
		template = DB.template;
	}
	
	public ArrayList<TestDto> list() {
		String query = "select * from TEST_TABLE";
		return (ArrayList<TestDto>) template.query(query, new BeanPropertyRowMapper<TestDto>(TestDto.class));
	}
	
	public TestDto dto(String key) {
		String query = "select * from TEST_TABLE where key = ?";
		return template.queryForObject(query, new BeanPropertyRowMapper<TestDto>(TestDto.class));
	}
	
	public void update(final String key) {
		String query = "update TEST_TABLE set key = testKey where key = ?";
		template.update(query, new PreparedStatementSetter() {
			
			@Override
			public void setValues(PreparedStatement ps) throws SQLException {
				ps.setString(1, String.valueOf(key));
			}
		});
	}
	
	public void write(final String key, final String name) {
		template.update(new PreparedStatementCreator() {
			String query = "insert into TEST_TABLE (key, name) values (?, ?)";
			
			@Override
			public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
				PreparedStatement statment = con.prepareStatement(query);
				statment.setString(1, key);
				statment.setString(2, name);
				
				return null;
			}
		});
	}
	
	public void modify(final String key, final String name) {
		String query = "update TEST_TABLE set key = ?, name = ?";
		template.update(query, new PreparedStatementSetter() {
			
			@Override
			public void setValues(PreparedStatement ps) throws SQLException {
				ps.setString(1, key);
				ps.setString(2, name);
			}
		});
	}
	
	public void delete(final String key) {
		String query = "delete from TEST_TABLE where key = ?";
		template.update(query, new PreparedStatementSetter() {
			
			@Override
			public void setValues(PreparedStatement ps) throws SQLException {
				ps.setString(1, key);
			}
		});
	}
}

 

  Controller에서 @Autowired 어노테이션으로 JdbcTemplate 객체를 생성하고 Const화 시키고 있다. 그리고 그 template은 dao에서 받아 DB에 접근할 때 사용하며, select, delete, update 등 어떤 query를 날리느냐에 따라 코드가 다르다. 이에 대한 예제는 상기 코드와 같이 작성해보았다.

 

  query를 xml에서 설정하는 방법(MyBatis)이 있는데 기억이 가물가물하다.. 이래서 사람은 꾸준히 공부해야하는 동물인가보다. 하핳ㅎ

반응형
Comments