본문 바로가기
IT만들기/전자정부프레임워크

전자정부 프레임워크 구조 샘플 프로젝트 구조(Service 및 Dao)(4)

by 커피향처럼 2017. 7. 13.

지난번 샘플 프로젝트 구조(Controller) 편에 이어 서비스 객체에 대하여 설명하도록 하겠습니다.
샘플 프로젝트의 "src/main/java/egovframework.example.sample.web.EgovSampleController.java" 파일을 열어 보면 다음과 같은 소스가 있습니다.

 /** EgovSampleService */
 @Resource(name = "sampleService")
 private EgovSampleService sampleService;

컨트롤러 클래스가 인스턴스화(메모리 적재)되면 EgovSampleService 인터페이스 클래스가 sampleService 변수명으로 생성됩니다.
EgovSampleService.java 파일을 열어보면 다음처럼 구현부가 없이 메소드 정의만 되어 있습니다.
파일을 쉽게 찾아서 여는 방법은 "Ctrl+Alt+R"키를 눌려 "Open resource" 창에서 파일명을 적거나 "*Service.java"와 같이 패턴으로 찾으면 됩니다.

 public interface EgovSampleService {

 /**
  * 글을 등록한다.
  * @param vo - 등록할 정보가 담긴 SampleVO
  * @return 등록 결과
  * @exception Exception
  */
    String insertSample(SampleVO vo) throws Exception;

    /**
  * 글을 수정한다.
  * @param vo - 수정할 정보가 담긴 SampleVO
  * @return void형
  * @exception Exception
  */
    void updateSample(SampleVO vo) throws Exception;

서비스 클래스는 인터페이스인데 어떻게 sampleService로 생성이 가능한 걸까?

그건 @Resource 어노테이션이 있기 때문에 가능합니다. 이클립스 메뉴에서 "Search > File"로 "sampleService"을 "*Service*.java" 패턴으로 검색을 하면  "egovframework.example.sample.service.EgovSampleServiceImpl.java" 파일이 검색되어 집니다.
또는 Controller 자바에서 메소드 위에 마우스키를 올리고 Ctrl 키를 눌려 클릭하여 "Open Implementation"을 누르면 메소드를 구현한 파일로 이동합니다.

EgovSampleServerImpl 자바 파일로 이동해보면 @Service("sampleService") 어노테이션이 지정되어 있는 것을 확인 할 수 있습니다.

 @Service("sampleService")
public class EgovSampleServiceImpl extends EgovAbstractServiceImpl implements EgovSampleService {
    /** SampleDAO */
    // TODO ibatis 사용
    @Resource(name="sampleDAO")
    private SampleDAO sampleDAO;
    // TODO mybatis 사용
    //    @Resource(name="sampleMapper")
   // private SampleMapper sampleDAO;

   ....
    /**
  * 글 목록을 조회한다.
  * @param searchVO - 조회할 정보가 담긴 VO
  * @return 글 목록
  * @exception Exception
  */
    public List<?> selectSampleList(SampleDefaultVO searchVO) throws Exception {
        return sampleDAO.selectSampleList(searchVO);
    }
}

위에 보면 "List<?>"으로 리턴 받도록 설정되어 있는데 이렇게 사용하면 안됩니다. 에러는 아니지만 컴파일시에 경고 표시가 되고 시큐어 코딩에 걸립니다. "?"는 모든 Type을 받겠다는 의미인데 "List<EgovMap>"으로 해주어야 합니다. Dao를 추적하여 Sql Id를 찾아가 보면 리턴 클래스가 EgovMap입니다. EgovMap는 Map을 상속 받은 것이니 "Map"으로 해도 됩니다.
DAO의 selectSampleList 함수가 리턴하는 type도 List<EgovMap>로 해주어야 하겠죠?

DAO 부분을 보면 TODO ibatis 사용이라는 부분과 아래에 mybatis 사용이라는 부분이 있습니다. mybatis는 ibatis의 최신 버전입니다. 그런데 왜 이름이 바뀌였을까요?
원래 아파치 프로젝트팀이였는데 google code로 가면서 명칭을 바뀌어 버렸습니다.
그럼 mybatis를 사용안하고 왜 ibatis를 사용할까? 자세한 것은 검색해서 확인해봐야겠지만 몇몇 문제가 있어 다운그레이드해서 ibatis를 사용하는 것으로 알고 있습니다. mybatis의 문제일 수도 있고 전자정부프레임워크와의 호환성 문제일 수도 있겠죠.

 SampleDAO.selectSampleList는 다음과 같이 되어 있습니다. 리턴 타입은 List<?>으로 되어 있네요. List<EgovMap>로 수정할 것을 권장합니다.

 @Repository("sampleDAO")
public class SampleDAO extends EgovAbstractDAO {
     ....
    /**
  * 글 목록을 조회한다.
  * @param searchMap - 조회할 정보가 담긴 Map
  * @return 글 목록
  * @exception Exception
  */
    public List<?> selectSampleList(SampleDefaultVO searchVO) throws Exception {
        return list("sampleDAO.selectSampleList", searchVO);
    }
    ....
}

"list"라는 함수를 사용하여 데이터를 조회합니다. 파라미터 첫번째는 Sql ID이고 두번째는 Sql이 받을 파라미터입니다. list를 DAO에서 아무리 찾아도 선언이 없는데 "EgovAbstractDAO"에서 구현되어 있는 메소드입니다.
File 찾기로 "sampleDAO.selectSampleList"를 찾으면 아래 그럼처럼 검색되어 집니다. 검색된 부분을 클릭해서 파일을 열면 아래 그림과 다르게 표시되어 질겁니다. "EgovSample_sample_SQL.xml" 클릭하면 그럼처럼 출력됩니다.

parameterClass는 "searchVO"로 되어 있고 resultClass는 "egovMap"로 되어 있는데 SQL XML 파일 맨 윗 부분으로 올라가 보면
 <typeAlias  alias="egovMap" type="egovframework.rte.psl.dataaccess.util.EgovMap"/>
 <typeAlias  alias="searchVO" type="egovframework.example.sample.service.SampleDefaultVO"/>
와 같이 얼라이어스를 준 것을 확인 할 수 있습니다.

조회된 컬럼은 "ID, NAME, DESCRIPTION, USE_YN, REG_USER" 이렇게 되어 있는데 "egovSampleList.jsp"에는 "${result.useYn}"과 같이 카멜 표기법으로 되어 있는 것을 주의해주세요. ibatis에서 EgovMap로 결과가 리턴 될 때 낙타표기법으로 변환됩니다.
jsp에서 ${result. ...} result는 어디서 나왔을까요?
Controller java 파일을 보게 되면 다음과 같이 model에 "resultList"라는 이름으로 add하고 있습니다. 

List<?> sampleList = sampleService.selectSampleList(searchVO);
  model.addAttribute("resultList", sampleList);

댓글