Repository Layer 부분 실습
1. Guestbook.java
package kr.or.connect.guestbook.dto;
import java.util.Date;
public class Guestbook {
private Long id;
private String name;
private String content;
private Date regdate;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getRegdate() {
return regdate;
}
public void setRegdate(Date regdate) {
this.regdate = regdate;
}
@Override
public String toString() {
return "Guestbook [id=" + id + ", name=" + name + ", content=" + content + ", regdate=" + regdate + "]";
}
}
2. Log.java
package kr.or.connect.guestbook.dto;
import java.util.Date;
public class Log {
private Long id;
private String ip;
private String method;
private Date regdate;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public Date getRegdate() {
return regdate;
}
public void setRegdate(Date regdate) {
this.regdate = regdate;
}
@Override
public String toString() {
return "Log [id=" + id + ", ip=" + ip + ", method=" + method + ", regdate=" + regdate + "]";
}
}
3. LogDao.java
package kr.or.connect.guestbook.dao;
import javax.sql.DataSource;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.stereotype.Repository;
import kr.or.connect.guestbook.dto.Log;
@Repository
public class LogDao {
private NamedParameterJdbcTemplate jdbc;
private SimpleJdbcInsert insertAction;
public LogDao(DataSource dataSource) {
this.jdbc = new NamedParameterJdbcTemplate(dataSource);
this.insertAction = new SimpleJdbcInsert(dataSource)
.withTableName("log")
.usingGeneratedKeyColumns("id");
}
public Long insert(Log log) {
SqlParameterSource params = new BeanPropertySqlParameterSource(log);
return insertAction.executeAndReturnKey(params).longValue();
}
}
4. GuestbookDaoSqls.java
package kr.or.connect.guestbook.dao;
public class GuestbookDaoSqls {
public static final String SELECT_PAGING = "SELECT id, name, content, regdate FROM guestbook ORDER BY id DESC limit :start, :limit";
public static final String DELETE_BY_ID = "DELETE FROM guestbook WHERE id = :id";
public static final String SELECT_COUNT = "SELECT count(*) FROM guestbook";
}
5. GuestbookDao.java
package kr.or.connect.guestbook.dao;
import static kr.or.connect.guestbook.dao.GuestbookDaoSqls.DELETE_BY_ID;
import static kr.or.connect.guestbook.dao.GuestbookDaoSqls.SELECT_COUNT;
import static kr.or.connect.guestbook.dao.GuestbookDaoSqls.SELECT_PAGING;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.stereotype.Repository;
import kr.or.connect.guestbook.dto.Guestbook;
@Repository
public class GuestbookDao {
private NamedParameterJdbcTemplate jdbc;
private SimpleJdbcInsert insertAction;
private RowMapper<Guestbook> rowMapper = BeanPropertyRowMapper.newInstance(Guestbook.class);
public GuestbookDao(DataSource dataSource) {
this.jdbc = new NamedParameterJdbcTemplate(dataSource);
this.insertAction = new SimpleJdbcInsert(dataSource).withTableName("guestbook").usingGeneratedKeyColumns("id");
}
public List<Guestbook> selectAll(Integer start, Integer limit) {
Map<String, Integer> params = new HashMap<>();
params.put("start", start);
params.put("limit", limit);
return jdbc.query(SELECT_PAGING, params, rowMapper);
}
public Long insert(Guestbook guestbook) {
SqlParameterSource params = new BeanPropertySqlParameterSource(guestbook);
return insertAction.executeAndReturnKey(params).longValue();
}
public int deleteById(Long id) {
Map<String, ?> params = Collections.singletonMap("id", id);
return jdbc.update(DELETE_BY_ID, params);
}
public int selectCount() {
return jdbc.queryForObject(SELECT_COUNT, Collections.emptyMap(), Integer.class);
}
}
6. GuestbookDaoTest.java - 테스트
- 가장 이상적인건 JUnit 등으로 단위 테스트를 진행하는 것이지만, 일단 GuestbookDaoTest.java를 만들어서 Java Application으로 실행시켜 DB 저장이 잘 되는지 확인해보자.
package kr.or.connect.guestbook.dao;
import java.util.Date;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import kr.or.connect.guestbook.config.ApplicationConfig;
import kr.or.connect.guestbook.dto.Guestbook;
import kr.or.connect.guestbook.dto.Log;
public class GuestbookDaoTest {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
GuestbookDao guestbookDao = ac.getBean(GuestbookDao.class);
Guestbook guestbook = new Guestbook();
guestbook.setName("최호연");
guestbook.setContent("반갑다. 제군.");
guestbook.setRegdate(new Date());
Long id = guestbookDao.insert(guestbook);
System.out.println("id : " + id);
LogDao logDao = ac.getBean(LogDao.class);
Log log = new Log();
log.setIp("127.0.0.1");
log.setMethod("insert");
log.setRegdate(new Date());
logDao.insert(log);
}
}
결과