본문 바로가기

회고록(TIL&WIL)

TIL 2023.02.13 Java Web 4 (MVC model2, maven)

MVC model 2 pattern

Model View Controller

Logger (로깅)

public class EmpDao {
	Logger log = Logger.getGlobal();
	Connection conn;
	Statement stmt;
	ResultSet rs;
	
	public EmpDao() {
		String url = "jdbc:mysql://localhost:3306/lecture";
		String user = System.getenv("MYSQL_USER");
		String password = System.getenv("MYSQL_PW");
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			conn = DriverManager.getConnection(url, user, password);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public List<EmpDto> getList() throws SQLException {
		String sql = "select * from emp";
		List<EmpDto> list = null;
		list = new ArrayList<EmpDto>();
		try {
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			while(rs.next()) {
				EmpDto bean = new EmpDto();
				bean.setEmpno(rs.getInt("empno"));
				bean.setEname(rs.getNString("ename"));
				bean.setSal(rs.getInt("sal"));
				bean.setMgr(rs.getInt("mgr"));
				bean.setComm(rs.getInt("comm"));
				bean.setHiredate(rs.getTimestamp("hiredate"));
				bean.setDeptno(rs.getInt("deptno"));
//				System.out.println(bean);
//				System.err.append("에러발생!");
//				log.info(bean.toString());
				list.add(bean);
			}
		} finally {
			if(rs!=null) rs.close();
			if(stmt!=null)stmt.close();
			if(conn!=null) conn.close();
		}
		// info < warning < severe
		log.setLevel(Level.INFO); // 개발용
//		log.setLevel(Level.WARNING);
//		log.setLevel(Level.SEVERE);  // 배포용
		// 눈에 보이지 않으나 파일에 저장되는 log
		log.config("config list size:"+list.size());
		log.fine("fine list size:"+list.size());
		log.finer("finer list size:"+list.size());
		log.finest("finest list size:"+list.size());
		// console에 찍혀서 눈에 보이는 log
		log.severe("심각 list size:"+list.size()); 
		log.warning("경고 list size:"+list.size()); 
		log.info("정보 list size:"+list.size());
		return list;
	}
}

PreparedStatement

프로시저를 이용한 쿼리문 생성
문자열에 대한 보안을 위해 생겨났으며, 속도 성능도 훨씬 좋다.
쿼리 injection 공격에 대한 방어가 된다.
검증하는 것 없이 받은 모양 그대로 만들기 때문에 보다 빠르다.

public int pushList(int empno, String ename, int sal) throws SQLException {
		String sql = "insert into emp (empno, ename, hiredate, sal) values(?,?,now(),?)";
		try {
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, empno);
			pstmt.setString(2, ename);
			pstmt.setInt(3, sal);
			return pstmt.executeUpdate();
		} finally {
			if(pstmt!=null) pstmt.close();
			if(conn!=null) conn.close();
		}
	}

procedure

DELIMITER $$
create procedure proc_emp_ins (
v_empno int,
v_ename varchar(50),
v_sal int)
begin
insert into emp (empno, ename, hiredate, sal) 
values (v_empno, v_ename, now(), v_sal);
end $$
DELIMITER ;

CALL proc_emp_ins(7777, 'user7', 700);

RequestDispatcher

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  // model
  EmpDao dao = new EmpDao();
  try {
    List<EmpDto> list = dao.getList();
    req.setAttribute("empList", list);
  } catch (SQLException e) {
    e.printStackTrace();
  }
  // view resolver
  RequestDispatcher rd = null;
  rd = req.getRequestDispatcher("index.jsp");
  rd.forward(req, resp);
}

Test

public class DaoTest {
	static EmpDto target = new EmpDto();
	static EmpDao dao = new EmpDao();
	
	public static void main(String[] args) throws SQLException {
		target.setEmpno(8888);
		target.setEname("user");
		target.setSal(800);
		// 입력테스트
		getListTest();
		pushListTest();
		// 수정테스트
		getOneTest();
		editOneTest();
		getOneTest();
		// 삭제 테스트
		deleteOneTest();
		try {
			getOneTest();
		} catch (Exception e) {
			System.out.println("삭제 성공");
		}
	}
	
	public static void deleteOneTest() throws SQLException {
		System.out.println(dao.deleteOne(target.getEmpno()) > 0);
	}
	
	public static void editOneTest() throws SQLException {
		target.setEname("user8");
		System.out.println(dao.editOne(target.getEmpno(),
				target.getEname(),
				target.getSal(),
				target.getComm(),
				target.getMgr()) > 0);
	}
	
	public static void getOneTest() throws SQLException {
		EmpDto bean = dao.getOne(target.getEmpno());
		System.out.println(bean!=null);
		System.out.println(bean.getEname().equals(target.getEname()));
	}
	
	public static void pushListTest() throws SQLException {
		System.out.println(dao.pushList(target.getEmpno(),
				target.getEname(),
				target.getSal()) > 0);
	}
	
	public static void getListTest() throws SQLException {
		List<EmpDto> list = dao.getList();
//		for(EmpDto bean : list) {
//			System.out.println(bean.toString());
//		}
		System.out.println(list!=null);
		System.out.println(list.size()>0);
	}
}

Maven 프로젝트 생성 및 tomcat 배포

설치 후 환경변수 등록
MVN_HOME\bin

설치 확인
mvn --version

프로젝트 생성
mvn archetype:generate ^
    -DarchetypeGroupId=org.apache.maven.archetypes ^
    -DarchetypeArtifactId=maven-archetype-webapp ^
    -DgroupId=com.bit.day47 ^
    -DartifactId=mvn01

패키징하여 war 파일 생성
mvn package

target 폴더안의 war파일을 tomcat webapp 폴더에 넣어서 배포완료