JSP 계층화아키텍처 적용하기

2021. 10. 26. 21:06jsp

 

계층화 아키텍처 적용하는 이유

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

 

토비의 스프링 - 예외 처리

이 글은 “토비의 스프링” 책 내용을 정리한 글입니다. 만약 저작권 관련 문제가 있다면 “gunjuko92@gmail.com”로 메일을 보내주시면, 바로 삭제하도록 하겠습니다. 토비의 스프링 - 예외 처리 1.

gunju-ko.github.io

 

 

 

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){}
    }
    
    ...다른 메소드들
    
}