반응형
window.opener를 사용하여 부모의 함수를 호출할때,
IE9 에서 문제가 발생했다. 

우선은 아래의 예제를 보면, 
typeof를 사용하여 부모함수를 return 받았다. 
함수이기 때문에 'function' 이라는 값이 돌아와야한다. 
(존재하지 않으면, 'undefined' 라고 값이 들어올 것이다.)


IE9에서만  typeof(opener.부모함수) 값이 'object' 로 들어온다.

그렇다고 함수가 실행을 못하거나, 문제가 발생하는 것이 아니므로 아래와 같이 수정하면된다.



(typeof는 String으로 문자열로 반환하는 것으로, 여기서는 단순히 window.opener.함수 를 통해 존재하는 function 을 확인하기 위해 사용된것.)


반응형
반응형

IE9 에서 구글 차트를 사용하는데 문제가 발생했습니다.

(IE8 이하에서는 구글 차트 api가 지원되지 않습니다. )


IE9에서만 차트를 그리지 못했으며, 

script5009: 'gvjs_l' is undefined ('gvjs_l'이(가) 정의되지 않았습니다.)

script445: object doesn't support this action (개체는 이 기능을 지원하지 않습니다.)
와 같은 오류가 발생했습니다.


여기서는 구글차트 api 사용 방법에 대해서는 설명하지 않겠습니다.

(다양한 구글 차트 사용 방법은 https://developers.google.com/chart/interactive/docs/gallery 에서 확인 가능)


결론적으로 문제가 되는 부분이 바로 아래의 부분이었습니다.

current 가 구글차트 api 현재 버전을 나타내는 것인데, IE9에서 문제가 발생하는 부분이었습니다.

(아마 현재 버전이 올라가게 된다면 자연스럽게 사라질 오류가 아닌가 싶다.)


google.charts.load("current", {packages:['corechart']});


위의 부분을 아래와 같이 고쳐주면 IE9에서도 차트가 나오는 것을 확인 할 수 있습니다.


google.charts.load("43", {packages:['corechart']});


(참고: https://stackoverflow.com/questions/35648530/google-visualization-charts-api-examples-are-broken-how-to-fix-them/35648674#35648674?newreg=acfb5c1d9c9c4825b34733f6cc551a04 )





반응형
반응형

3. controller / service / dao / mapper 생성


이제 마지막으로 실제 자바 소스 코드를 작성하는 부분입니다.


1. controller 파일 생성.

기본적으로 스프링 프로젝트를 생성하면 자신이 생성한 패키지명 아래에(ex com.spring.test) controller라는 폴더가 존재합니다.

또한 기본적으로 HomeController.java 파일이 존재합니다. 실행을 해보면, home.jsp파일을 화면에 띄우는 것을 확인할수있습니다.

(HomeController.java에 대한 설명 생략)

(was(톰캣...) 연동하는 부분 생략)


mybatis를 통해 쿼리문을 실행하는 것이 목표이므로, controller패키지 안에 MemberController.java파일을 생성하도록 합니다. 

MemberController.java


위와 같은 소스의 controller 파일을 만들었습니다. 

간단히 설명을 하면, 

/test/usercheck 로 호출이 가능하며, 

memberservice.userIdCheck("admin"); 를 통해 admin이란 아이디가 존재하는지 쿼리를 실행합니다.

main폴더 아래 index.jsp 파일을 호출하는 소스입니다.(jsp 호출에 관련돼서는 뒤에 설명)


2. service / serviceimpl 파일 생성

우선 기본 패키지 아래에 service라는 패키지를 생성합니다.(controller의 하위가 아닌 같은 위치)

그리고 service / serviceimpl 파일을 생성합니다.

여기서는 MemberService.java 파일과 MemberServiceImpl.java 파일을 생성합니다.

(serviceimpl파일 같은 경우 service 패키지 아래에 serviceImpl이라는 패키지를 생성하여 위치하는 경우가 많다.

어디까지나 파일의 위치가 다를뿐 만드는 사람의 자유가 아닌가 싶다.)


MemberService.java


MemberServiceImpl.java


MemberService는 인터페이스이며, 

MemberServiceImpl에서 상속받고있습니다.

MemberServiceImpl 파일에서  dao파일을 호출하고 있습니다.

(자세한 내용을 설명하려면 너무 길어지기에 간단히 설명하겠습니다.)


3.dao / daoimpl 파일 생성

위에서 service패키지를 생성하는 것과 같이 dao 패키지를 생성하고, dao / daoimpl 파일을 생성합니다.

여기서는 MemberDao.java / MemberDaoImpl.java 파일을 생성합니다.


MemberDao.java


MemberDaoImpl.java


MemberDao는 인터페이스이며, MemberDaoImpl에서 상속받고 있습니다.

MemberDaoImpl 파일에서 mapper파일(xml파일)을 호출하고 있습니다.

(dao 패키지에서는 인터페이스는 만들지 않는 경우가 더 많은 것 같습니다.

여기서는 인터페이스를 만들어서 사용하지만, 복잡하다고 생각되면, 생략하는 것이 좋을듯합니다.)


4.mapper 파일 생성

이제 실제 mybatis를 사용하여 DB에 쿼리문을 작성하여 실행하는 부분 입니다.

resources 폴더 아래에 mapper라는 폴더를 생성하고 그안에 mapper파일을 생성합니다.

여기서는 memberMapper.xml 파일을 생성합니다.


memberMapper.xml


(admin이란 테이블의 admin_id 컬럼의 값을 카운팅하는 예제로 테이블에 대한 설명은 생략합니다.)

namespace와 쿼리문의 id의 조합으로 호출이 되며, 쿼리문을 실행하고 결과를 반환합니다.

이전 글의 root-context.xml 파일에서 sqlSession의 mapperLocations의 경로를 지정했기때문에 호출이 가능합니다.

위의 MemberDaoImpl.javad에서 mapper파일의 쿼리를 'mappers.memberMapper.usercheck' 로 호출하는 것을 확인 할 수 있습니다.



결론적으로 Controller -> Service -> Dao -> Mapper 의 순서로 진행되며, 

Controller에서 받은 결과를 jsp 로 전달하는 구조입니다.

순서대로 가장 기본적인 프로젝트 셋팅이었으습니다. 

dao에서 쿼리문의 목적에 따라 selectOne이 아닌 selectList등.. 사용가능하며,

mapper파일에서 결과 또는 입력을 하기 위해 VO(domain)를 사용 하는 등 다양한 방법으로 사용가능합니다.

(사실 vo는 필수적이며, 추후 내용을 추가 하도록 하겠습니다.)


(*controller파일에서 return 값을 통해 해당 jsp를 찾는 것은 src/main/wepapp/WEB-INF/spring/appServlet/servlet-context.xml 파일에서 설정을 해줬기때문입니다.

아래 소스 부분의 수정을 통해 다른 경로를 기본 위치로 변경 할 수 있습니다.)



( https://github.com/nahosung/spring_setting )

반응형

+ Recent posts