계층화 아키텍처 적용하는 이유
https://brilliantdevelop.tistory.com/51
https://bbaktaeho-95.tistory.com/98 글을 먼저 읽자.
현재는 DB연결까지 필요한 모든 코드가 JSP파일에 모두 있다.
이러면 간단한 기능만 하는 코드일때는 괜찮았지만 점점 기능이 많아지고
코드가 길어지면 에러가 발생했을 시 어디서 났는지 찾기도 힘들어지고
기능을 추가하려고 할 때마다 코드가 복잡해 어떻게 추가할지 감이 안잡힐 수 있다.
그래서 현재 JSP에 있는 코드를 계층화 아키텍처를 이용해 나눌려한다.
근데 아직 MVC패턴에 대해서는 배우지않아 Controller계층이 없다.
뷰와 Controller의 분리를 할 수 없기 때문에
지금은 view(jsp)에서 직접 Service를 호출하도록한다.
계층별 역할
JSP( view + 나중의 Controller와 분리)
먼저 request객체를 이용해서 파라미터를 처리하고
Service를 호출한다. (Controller가 해야 할 일)
Service에서 전달받은 데이터를 html로 만든다. (View로서의 역할)
Service
비즈니스로직처리, 도메인 모델 적합성 검증, 적절한 예외처리,
트랜잭션 관리,DAO호출 하는 등의
일을 하게 된다. Exception에 관한 자세한 내용은 다음을 참고하자.
https://gunju-ko.github.io/toby-spring/2018/11/07/%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC.html
DAO
DAO에서는 단순히 DB에 접근하는 역할을 한다.
DAO에서 발생하는 SQLException은 적절한 예외로 변환해서 처리해주도록 하자.
계층화 아키텍처 적용해보기
https://drive.google.com/drive/folders/1uHumdQakO7YC89ZfQeIyGcoGufJGvhdj?hl=ko 계층화 아키텍처 의 파일들을 다운받자.
우리는 I**Service. I**Dao의 인터페이스를 구현할 것이다.
구현할 때 아마 구현체가 한개만 나오게 될 것인데,
굳이 Interface를 만들어야 할 이유는 뭘까?
Dao의 경우는 나중에에 Persistence Layer의 프레임워크(Mybatis 등)를 사용하면서
Interface를 이용해야 되기 때문에 Interface를 만들어야 한다.
Service의 경우에는 굳이 Interface를 만들어야 되는지는 의견이 갈린다.
https://see-one.tistory.com/1 를 참고하자.
어쨋든 계층을 나누면 다음과 같이 동작할 것이다.
JSP( view + 나중의 Controller와 분리)
<%
IFreeBoardService freeBoardService=new FreeBoardServiceImpl();
List<FreeBoardVO> freeBoardList=freeBoardService.getBoardList();
%>
Service
public class FreeBoardServiceImpl implements IFreeBoardService {
IFreeBoardDao freeBoardDao=new FreeBoardDaoOracle();
@Override
public List<FreeBoardVO> getBoardList() {
//필요한 로직
return freeBoardDao.getBoardList();
}
...다른 메소드들
}
트랜잭션은 원칙적으로 Service단에서 관리하는게 맞지만,
나중에 mybatis를 적용하면 자동으로 service단에서 트랜잭션을 관리하게 되기 때문에
일단 DAO에서 Connection을 위치시킨다.
DAO
FreeBoardDaoOracle.java
@Override
public List<FreeBoardVO> getBoardList() {
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try{
conn= DriverManager.getConnection("dbcp주소");
List<FreeBoardVO> freeBoardList=new ArrayList<>();
//쿼리 실행 후 값 세팅
return freeBoardList;
}catch (SQLException e){
throw new DaoException("getBoardList 실행 중 에러",e); //에러 변환
}finally {
if(conn!=null) try{conn.close(); }catch (Exception e){}
if(pstmt!=null) try{pstmt.close(); }catch (Exception e){}
if(rs!=null) try{rs.close(); }catch (Exception e){}
}
...다른 메소드들
}