프롬프트 AI&OpenAPI&공공데이터를 활용한 웹앱개발자 양성 과정 21일차

서명원·2024년 1월 8일

1. 상담에 대한 고찰

방향성을 조금 수정해 보기로 했다.
나름 스프링이나 js에 대해서는 공부 목표가 있어서 완전히 의견을 굽히진 않았지만, 적어도 복습 없이 개인 공부 100으로 돌리던 방향성은 조금 수정하는게 좋다고 생각했다.

① 일단 멘탈및 긍정정 사고를 위해 운동시간을 조금씩이라도 확보할 생각이다.
② 너무 안이하게 생각하지 말고, 일단 복습 시간을 나름대로 확보하고자 한다. 복습 1시간 반, 내 공부 1시간 반 정도로 평일 루틴을 정해볼까 한다.

2. JDBC CRUD 구현에 대한 고찰

과거 수업때 다뤘던 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);

	}

}

상기 코드를 기반으로 매일 조금씩 변형을 즐겨보려고 한다.

profile
백엔드 취업을 꿈꾸는 일본어 전공자

0개의 댓글