-
첫번째 프로젝트 후 쓰는 일지카테고리 없음 2023. 12. 1. 17:45
프로젝트가 끝난 뒤 바로 쓰는 것은 아니다. 프로젝트가 끝난 뒤에도 가야하는 알바 덕에 넝마 입은 아저씨가 된듯한 마음으로 몇일 동안 못쉰 것 같다. ㅠㅠㅠㅠ
그래도 내가 만들어본 프로젝트에 대해 스스로 피드백도 하고 느낀점도 적어 봐야 오래 기억에 남을 것 같아 적어본다.
개발 환경은 window10에서 JDK 17 버전을 사용했고, Oracle sql XE 11.2 , Eclipse 2023-09를 사용했고 JDBC 라이브러리를 이용해 개발했다.
MVC 모델(패턴)
사실 프로젝트를 시작하기 전에 한두번 정도 이 모델을 사용할 것이라 들었는데, 시작하기 전까지 이게 무엇인가?에 대해서 크게 와닿지 않았다. 각각 Model, View,Controller의 약자를 의미하는데, 나름대로 조사한 것을 짧게 설명하자면,
Model : DB를 포함한 데이터들의 집합이다. 사용자가 입력한 정보를 Controller를 통해 받아온 뒤에 정보의 조작을 가하는 부분이기도 하다.
프로젝트를 진행할 때 DB에 데이터들을 저장해놓고, DAO (DATA ACESS OBJECT의 약자.) 클래스 내 기능들을 통해 정보 조작,전달,삭제를 했다. 이부분이 아마 Model에 해당하는 부분일 거라고 생각한다.
View: 사용자에게 보여지는 인터페이스. 사용자가 입력한 값을 Model에서 조작한 뒤 그 결과를 보여주는 부분이다.
프로젝트를 진행했을 때 Print 객체를 따로 만들어, Model에서 얻은 정보들을 보여주는 기능들을 만들었는데, 아마 이 부분이 View에 해당하지 않을까 싶다.
Controller : 사용자에게 값을 입력받고, 그것이 타당한 값인지 판별하고, 해당값을 Model에 전달하는 역할을 하는 부분이다.
프로젝트를 진행할 때 Controller 객체들을 만들어서 입력받은 값이 타당한지 확인하는 것과, 모델과 뷰를 이곳에서 연결하여 사용하였다.
현재 DB와 JDBC만 가지고 개발을 해봐서 그런지 이 세가지 개념에 대해 어느정도는 이해가 되지만 전부 몸소 체험한듯한 느낌은 들지 않는다. 아마 직접 화면 구현까지 하는 다음 프로젝트에서 좀더 이 세가지에 대해 잘 느낄 수 있게 될거라 생각한다.
코드 일부
String sql = "select i.itemNo, i.itemName, i.itemImage, c.categoryName,c.categoryNo, p.itemprice,"
+ " to_char(i.writeDate, 'yyyy-mm-dd')writedate "
+ " from item i, category c , price p "
+ " where (i.categoryNo = c.categoryNo) and (p.itemNo = i.itemNo) "
+ " and (p.startdate< sysdate and p.enddate >sysdate) "
+ " and (i.categoryNo = " + menu + ")";
System.out.println("||**********************::상품 정렬 기준::***********************||");
System.out.println("1. 신상품 2. 가격 높은순 3.가격 낮은순");
System.out.println("기타 선택시 상품 번호순으로 정렬됩니다.");
switch(getStr("정렬 방식 : ")) {
case "1" :
sql += "order by writeDate desc";
break;
case "2" :
sql += "order by itemPrice desc";
break;
case "3" :
sql += "order by itemPrice asc";
break;
default :
sql += "order by itemNo desc";
break;
}
DB에서 대부분의 정보를 가져올 때 join을 사용하여 가져와야 해서, sql문이 조금 난잡해 보이긴 하다. switch문으로 작성하는 동적쿼리가 뭔가 굉장히 효율적인 것처럼 보여서 배웠을 때 흥미를 많이 가졌다. 실제로 어느정도 효율차이가 날지는 모르겠지만 최소 몇줄 정도는 코딩을 줄여줄거라 확신한다.
코드 피드백
public int updateSmallerDate (PriceVO vo) throws Exception {
int result = 0;
try {
con = getConnection();
String sql = "update price set startdate = " + "'" + vo.getEndDate() + "'"
+ " where itemno = ? and "+ " (startdate <" + "'"+ vo.getStartDate()+ "'" +" "
+ "and " + "enddate >" + "'"+vo.getEndDate()+ "'" +")";
pstmt = con.prepareStatement(sql);
pstmt.setLong(1, vo.getItemNo());
result = pstmt.executeUpdate();
if(result == 0) {
// System.out.println("시작날짜 겹침 확인 - 변경된 가격정보 개수가 0개입니다.");
}else {
//System.out.println("시작날짜 정보 수정 성공");
}
} catch (Exception e) {
//e.printStackTrace();
}finally {
try {
close(con, pstmt);
} catch (Exception e) {
//e.printStackTrace();
}
}
return result;
}
예시1
ㅠㅠ 이 코드를 보니 아직도 그때 상황이 떠오른다. 발표 1시간 남았는데, 생각하지 못했던 부분의 코드를 나중에 발견하여머리가 새하얘지고 어쩔 줄 모른채 어찌어찌 기능만 원하는대로 돌아가게 만든 코드중 하나이다.
JDBC에서 쿼리를 실행할 때, sql문에 입력하는 값은 위 코드의 item = ? 처럼, ? 기호를 넣은 다음 원하는 변수 값으로 설정이 가능하다. 그런데 나는 급박한 상황에서 그냥 sql문 안에 " ' " + vo의 변수 + " ' " 형태로 직접 때려박았다.ㅋㅋㅋ
이렇게 sql문 안에 직접적으로 변수를 입력하면, ' ' 기호 같은 입력 형태도 일일히 맞춰야 하고, 데이터 조작이 까다로워지는 단점이 있다. 그러니 앞으로는 어떤 상황이 오더라도 제대로 절차를 거쳐서 코드를 실행하자!
피드백 수정
public int updateSmallerDate (PriceVO vo) throws Exception {
int result = 0;
try {
con = getConnection();
String sql = "update price set startdate = ? where itemno = ? and "+
" (startdate < ? and enddate > ? ";
//
pstmt = con.prepareStatement(sql);
pstmt.setString(1, vo.getEndDate());
pstmt.setLong(2, vo.getItemNo());
pstmt.setString(3, vo.getStartDate());
pstmt.setString(4, vo.getEndDate());
result = pstmt.executeUpdate();
if(result == 0) {
// System.out.println("시작날짜 겹침 확인 - 변경된 가격정보 개수가 0개입니다.");
}else {
//System.out.println("시작날짜 정보 수정 성공");
}
} catch (Exception e) {
//e.printStackTrace();
}finally {
try {
close(con, pstmt);
} catch (Exception e) {
//e.printStackTrace();
}
}
return result;
}
위 피드백 대로 고치면 이런 코드가 될 것이다. sql문 안에서 입력되는 값은 ?기호로 임의 처리하고, PreparedStatement의 인스턴스가 가진 setString 함수로 날짜 값을 입력해주었다.
문서에 관한 피드백은
요구사항을 작성할 때 6하원칙에 따라 "언제" 에 관한 것도 명확하게 써야한다는 점! 꼭 기억하기.
ex)버튼을 누르면, 숫자를 입력하면, 등
마무리
프로젝트를 하면서, 기초 학습 때 배우는 것과, 현재 실무 혹은 인터넷 상에서 돌아다니는 최신 코딩방법은 차이가 있다는 것을 느꼈다. 하지만 무언가를 배운다는 것은 거의 항상 그런 일련의 과정을 거친다고 생각한다.
처음은 아무것도 모르는 사람에게 친근한 방법으로 배우고, 어느정도 배우고 나면 여태 알게된 것들을 정제하는 방법을 또 배우고, 그 다음에야 최선의 방법을 스스로 적용할 수 있는 게 아닐까?
물론 처음부터 배울 수 있는 최선의 방식이 있을 수 있고, 내가 아무리 찾아보려 노력해도 그것을 놓칠 수도 있다. 하지만 그렇다고 해서 너무 조급해 하지는 않으려고 한다. 이전의 나보다 더 나아졌다면, 그걸로 된거다!
첫 프로젝트를 함께 잘 마무리한 팀원들이 고맙고, 앞으로도 내가 점점 나아질 것이라 믿는다. 코딩의 길에 발을 디딘 모두 화이팅!
소스를 전체 공개하는 것도 생각해 봤으나, 팀이 함께 만든 소스라서 파일 통째로 올리기가 좀 그렇다. 나중에 혼자 개별적으로 진행한 프로젝트는 전체 공개를 해볼 생각이 있다.