방향성을 조금 수정해 보기로 했다.
나름 스프링이나 js에 대해서는 공부 목표가 있어서 완전히 의견을 굽히진 않았지만, 적어도 복습 없이 개인 공부 100으로 돌리던 방향성은 조금 수정하는게 좋다고 생각했다.
① 일단 멘탈및 긍정정 사고를 위해 운동시간을 조금씩이라도 확보할 생각이다.
② 너무 안이하게 생각하지 말고, 일단 복습 시간을 나름대로 확보하고자 한다. 복습 1시간 반, 내 공부 1시간 반 정도로 평일 루틴을 정해볼까 한다.
과거 수업때 다뤘던 TEST와 섞어서 간단한 테스트 코드를 구현해 봤다.
수동으로 테스트 돌리려다가, ②를 목표로 한다면 매번 구현이 바뀔때마다 수동으로 테스트를 돌려야 하는 대참사가 발생한다.
아래는 직접 구현해본 DAO 및 TEST 코드다.
DAO코드
package com.koreait.Challenge.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import com.koreait.Challenge.dto.ArticleDTO;
public class ArticleDAO {
Connection conn;
PreparedStatement pstmt;
ResultSet rs;
public int insert(ArticleDTO dto) {
conn = ConnectionManager.getConnection();
String sql = "INSERT INTO article(regDate, updateDate, writerId, writerName, title, `body`)"
+ " VALUES(NOW(), NOW(), ?, ?, ?, ?)";
int result = -1;
try {
pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
pstmt.setInt(1, dto.getWriterId());
pstmt.setString(2, dto.getWriterName());
pstmt.setString(3, dto.getTitle()
);
pstmt.setString(4, dto.getBody());
pstmt.executeUpdate();
rs = pstmt.getGeneratedKeys();
if(rs.next()) {
result = rs.getInt(1);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
ConnectionManager.closeResource(pstmt, rs);
}
return result;
}
// findAll
public List<ArticleDTO> findAll(){
conn = ConnectionManager.getConnection();
String sql = "SELECT * FROM article";
List<ArticleDTO> list = new ArrayList<>();
try {
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()) {
list.add(new ArticleDTO(rs));
}
}catch(SQLException e) {
e.printStackTrace();
}finally {
ConnectionManager.closeResource(pstmt, rs);
}
return list;
}
// findOne
public Optional<ArticleDTO> findOne(int id){
conn = ConnectionManager.getConnection();
Optional<ArticleDTO> result = Optional.empty();
String sql = "Select * FROM article where id = ?";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);
rs = pstmt.executeQuery();
if(rs.next()) {
result = Optional.of(new ArticleDTO(rs));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
ConnectionManager.closeResource(pstmt, rs);
}
return result;
}
// modify
public int update(ArticleDTO dto) {
conn = ConnectionManager.getConnection();
int result = 0;
String sql = "UPDATE article SET updateDate=NOW(), title = ?, body=? WHERE id = ?";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, dto.getTitle());
pstmt.setString(2, dto.getBody());
pstmt.setInt(3, dto.getId());
result = pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
ConnectionManager.closeResource(pstmt, rs);
}
return result;
}
// delete
public int delete(int id) {
int result = 0;
conn = ConnectionManager.getConnection();
String sql = "DELETE FROM article WHERE id = ?";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);
result = pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
ConnectionManager.closeResource(pstmt, rs);
}
return result;
}
}
조금 뭐하는 짓인가 싶은건 아래 코드일거다.
list.add(new ArticleDTO(rs));
resultSet에서 하나하나 데이터 꺼내서 변수에 담고,
그걸 다시 ArticleDTO의 생성자에 하나씩 꺼내 담는 작업이 너무 피곤해서 그냥 ArticleDTO에 ResultSet에서 파라미터를 꺼내서 객체 생성하는 생성자를 추가하였다.
아래는 테스트 코드다.
package com.koreait.Challenge.test;
import java.util.List;
import java.util.Optional;
import org.junit.Test;
import org.junit.jupiter.api.Assertions;
import com.koreait.Challenge.dao.ArticleDAO;
import com.koreait.Challenge.dto.ArticleDTO;
public class ArticleDAOTest {
ArticleDAO dao = new ArticleDAO();
@Test
public void insertAndFindOne() {
ArticleDTO article = new ArticleDTO(1, "kim", "title", "body");
int result = dao.insert(article);
Optional<ArticleDTO> findArticle = dao.findOne(result);
Assertions.assertEquals(article.getWriterId(), findArticle.get().getWriterId());
Assertions.assertEquals(article.getWriterName(), findArticle.get().getWriterName());
Assertions.assertEquals(article.getTitle(), findArticle.get().getTitle());
Assertions.assertEquals(article.getBody(), findArticle.get().getBody());
}
@Test
public void update() {
ArticleDTO article = new ArticleDTO(1, "kim", "title", "body");
int id = dao.insert(article);
Optional<ArticleDTO> findArticleOpt = dao.findOne(id);
ArticleDTO updateArticle = findArticleOpt.get();
updateArticle.setTitle("modify title");
updateArticle.setBody("modify body");
dao.update(updateArticle);
findArticleOpt = dao.findOne(id);
updateArticle = findArticleOpt.get();
Assertions.assertEquals("modify title", updateArticle.getTitle());
Assertions.assertEquals("modify body", updateArticle.getBody());
}
@Test
public void delete() {
ArticleDTO article = new ArticleDTO(1, "kim", "title", "body");
int id = dao.insert(article);
Optional<ArticleDTO> findArticleOpt = dao.findOne(id);
ArticleDTO findArticle = findArticleOpt.get();
Assertions.assertNotNull(findArticle);
dao.delete(id);
findArticleOpt = dao.findOne(id);
Assertions.assertEquals(findArticleOpt, Optional.empty());
}
@Test
public void list() {
for (int i = 0; i < 50; i++) {
dao.insert(new ArticleDTO(1, "kim", "title", "body"));
}
List<ArticleDTO> list = dao.findAll();
Assertions.assertTrue(list.size()>50);
}
}
상기 코드를 기반으로 매일 조금씩 변형을 즐겨보려고 한다.