반응형

IBATIS 와 MYBATIS는 연동방법이 좀다르다.

IBATIS는 context-sqlMap.xml 을사용하고

MYBATIS는 context-mapper.xml 을 사용한다.

그리고 datasource도

IBATIS 는 org.springframework.jdbc.datasource.DriverManagerDataSource

MYBATIS 는 org.springframework.jdbc.datasource.SimpleDriverDataSource

더 자세한거는 밑에 소스를 참고하시길..

실행환경 SPRING 3.2.9 , EGOV 3.0.0

전자정부는 기본적으로 템플릿에 context-xxxx 이렇게 붙은파일이 나온다.

전자정부는 pom.xml에 mybatis , ibatis 라이브러리를 안써줘도된다.

다 깔려있으니간.


◎ context-mapper.xml (mybatis config 라 생각하셈)

▼ 내용

datasource 의 ref 를 보면 sub_ 를 붙엿다 ibatis, mybatis 둘다 연동을 위해

mapperLocations 의 쿼리 날릴 SQL.XML 등의 경로를 기술해주면 된다

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- MapperConfigurer setup for MyBatis Database Layer with @Mapper("deptMapper") in DeptMapper Interface --> <bean class="egovframework.rte.psl.dataaccess.mapper.MapperConfigurer"> <property name="basePackage" value="org.egovframework.karico.service.impl" /> </bean> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="sub_dataSource" /> <property name="mapperLocations" value="classpath:/egovframework/sqlmap/seis_web/sql/NewFile.xml" /> </bean> </beans>

◎ context-sqlMap.xml (Ibatis config 라 생각하셈)


▼ 내용

configLocation 의 SQL.XML 의 쿼리를 기술해줄 경로를 지정하면된다

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> <!-- SqlMap setup for iBATIS Database Layer --> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation" value="classpath:/egovframework/sqlmap/seis_web/sql-map-config.xml"/> <property name="dataSource" ref="dataSource"/> </bean> </beans>


◎ context-datasource (mybatis , ibatis 둘다 써놧음)


▼ 내용

abcd

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd"> <!-- <jdbc:embedded-database id="dataSource" type="HSQL"> --> <!-- <jdbc:script location= "classpath:/db/sampledb.sql"/> --> <!-- </jdbc:embedded-database> --> <!-- IBATIS 환경설정--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!-- MYBATIS 환경설정--> <bean id="sub_dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> <property name="driverClass" value="${jdbc2.driverClassName}" /> <property name="url" value="${jdbc2.url}" /> <property name="username" value="${jdbc2.username}" /> <property name="password" value="${jdbc2.password}" /> </bean> </beans>

XML 연동은 이걸로 끝이다.

이 이후 service,dao,impl,controller 만 알아서 작성하면된다

ibatis는 생략...

밑에는 mybatis 연동이다.

(내 플젝이 ibatis가 되잇는걸 추가 db 연동으로 mybatis 연동하는거라서)

(ibatis 써논건 귀찮아서 안씀... 궁금하면 댓글 ㄱ)


◎ NewFile.xml (mybatis 쿼리.xml)


▼ 내용

위의 환경설정에 보면 MYBATIS 쿼리 SQL 경로설정하는거에 NewFile로 되잇을거다

난 이 파일명으로 사용하였다. 대충하였기 떄문에....

ibatis sql은 따로 안쓸것이다 (대충 아는사람들은 알겟지... 구지쓸필요없음을)

그래도 모르겠으면 댓글 ㄱ

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="egovframework/sqlmap/seis_web/sql/NewFile"> <select id="sub_station" resultType="Map"> select * from station where STA_NO = '1' </select> </mapper>


◎ NewFileService.java (service 인터페이스다)


▼ 내용

package org.egovframework.karico.dao; import java.util.List; import java.util.Map; public interface NewFileService { public List<Map<String,Object>> getNewFile () throws Exception; }


◎ NewFileServiceImpl.java (service 인터페이스다)


▼ 내용

package org.egovframework.karico.dao; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.springframework.stereotype.Service; import egovframework.rte.fdl.cmmn.AbstractServiceImpl; @Service("NewFileService") public class NewFileServiceImpl extends AbstractServiceImpl implements NewFileService { @Resource(name="newfiledao") private NewFileDao newfiledao; @Override public List<Map<String, Object>> getNewFile() throws Exception { return newfiledao.NewFileDaoSelect(); } }


◎ NewFileDao.java


▼ 내용

package org.egovframework.karico.dao; import java.util.List; import java.util.Map; import org.springframework.stereotype.Repository; import egovframework.rte.psl.dataaccess.EgovAbstractMapper; @Repository("newfiledao") public class NewFileDao extends EgovAbstractMapper { public List NewFileDaoSelect() throws Exception { return list("sub_station", null); } }

◎ Controller.java


▼ 내용

@Resource(name = "NewFileService") NewFileService newfileservice; @RequestMapping("/testabcd") public ModelAndView abcdefg (HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println(newfileservice.getNewFile()); return null; }

마무리 하면서 위의 예제들은 진짜 순수 연동만을위한 간단간단하게 쓴것들이다.

초급자 기준으로 쌩판 모르는 사람들 기준으로 쓴건데

이해가 안가는 부분이 있으면 댓글 남기면

성실히 답변해드림


반응형
반응형


@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/**/*.xml"}) public class BbsDAOTest { @Inject private BbsDAO bdao; private static Logger logger = LoggerFactory.getLogger(BbsDAOTest.class); @Test public void testFind() throws Exception{ FindCriteria cri = new FindCriteria(); cri.setPage(1); cri.setFindType("S"); cri.setKeyword("테스트"); logger.info("********** 테스트 글목록 출력 **********"); List<BbsVO> list = bdao.listFind(cri);
for(BbsVO bvo: list){ logger.info(bvo.getBid() + ": "+bvo.getSubject()); } logger.info("********** 테스트 Data갯수 출력 **********"); logger.info("CountData: "+bdao.findCountData(cri)); } }

junit 단위 테스트 방법

@RunWith(SpringJUnit4ClassRunner.class) 로 junit 함께 실행

@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/**/*.xml"}) xml 설정 불러오기

@inject bdao 주입

@test 테스트 실행할 코드


반응형
반응형

[SOAP] 기반 웹서비스

- SOA : 해당서비스를 서로 조합해서 업구 기능을 구현한 어플리케이션을 만들어내는 소프트웨어 아키텍처

- DATA ---> XML로 표현

- UDDI : Universal Description, Discovery and Integration

* 웹서비스를 등록하고 검색하기 위한 저장소로 웹서비스를 공적으로 접근, 검색이 가능하도록 한 공개된 레지스트리

- WSDL (Web Service Description Language) : 웹 서비스 기술 언어 ( 웹서비스를 정의한 언어 XML로 표시)



이와 같이 WSDL 을 모아놓은 XML들이 모여서 UDDI가 된다 UDDI 가 WWW (월드 와이드웹) 으로 서비스 이용

# SOAP?

- HTTP, HTTPS , SMTP(1) 등을 통해서 XML기반의 메시지를 컴퓨터 네트웍상에서 교환하는 프로토콜

- XML을 통해서 제공하는 웹서비스가 SOAP기반 웹서비스다

(1)간이 전자 우편 전송 프로토콜(Simple Mail Transfer Protocol, SMTP)



SOAP 요약 그림 SOAP 부분은 XML/TXT 로 이루어짐

# SOAP 기반의 웹서비스

단점 : 1. 인코딩 , 디코딩이 어렵다.

2. HTTP 상에서 전송하기에 무겁다

3. 개발환경이 따로 필요하다

4. 개발난이도가 높다.

장점 : 1. 사용환경 , 플랫폼에 구애를 안받는다. (리눅스,윈도우,안드로이드 등) ---- XML로 이루어져있어서

2. 동적 바인딩이 가능하다, 독립된 모듈 , 서비스 연결이 느슨하게 연결 , 서비스 조립이 가능

***

[RESTful 기반의 웹서비스]

- Roy Fielding (인터넷 창시 연구한 사람) 이 박사학위 논문에서 웹 아키텍쳐가 웹의 본래 설계의 우수성을 활용하지 못한다고 판단.

웹의 장점을 최대한 활용할 수 있는 네트워크 기반의 아키텍쳐를 제안 (RESTful)

# RESTful (REpresentational State Transfer, 2000년) 표현 상태 전달? (리소스 상태 전달)

- HTTP 프로토콜로 데이터를 전달하는 프레임워크

- 클라이언트와 서버간의 구성요소를 엄격 하게 분리하여 구현을 단순화 함, 서버와 클라이언트를 독립적으로 구현함으로, 확장성을 향상

- 핵심은 Web에 개방된 리소스를 이용.

( soap 같은경운 action 과 동작과 서비스(프로세싱) 단위로 구현을 하다보니 규격화가 되있슴 ex) WSDL (XML) 만들고 UDDI에 저장을함)

- REST는 웹에 개방된 리소스들을 원격에서 또는 로컬에서 쉽게 이용할 수 있는 웹 응용

- REST 아키텍처 스타일에 따라 정의되고 이용되는 서비스나 응용프로그램을 (RESTful) 웹 서비스라고 부른다.

*** SOA(Service Oriented Architecture) 서비스를 지향하는 아키텍처 <--- SOAP (서비스를 기준)



SOAP 기반의 웹서비스는 SOA 구조에 따라서 UDDI 레지스트리를 통해서 웹서비스를 등록,탐색, 바인딩 해서 이용 (규격화)

- 상호 통신간 프로그램들이 잘 이해할 수 있는 문법에 따라 개발 되었고 , 그에따라서 개발자들은 웹 서비스의

기본 스펙을 알아야 하는 고난이도 프로그래밍 능력이 요구됨

- 사람 보다는 기계의 우선적으로 이해하기 쉬운 구조이므로 환경설정 및 개발 환경이 준비 되있어야한다 (동작과 프로세싱 중심)

*** ROA(Resource Oriented Architecture) 자원을 지향하는 아키텍처 <---- RESTful (resource (자원 지향))



Restful 웹서비스는 리소스를 등록하고 저장하는 중간 매개체 없이 리소스 제공자가 직접 요청자에게 제공

그렇기 때문에 soa 의 비해 가볍다 (규격화가 따로없다)

- 인터넷 서비스 업체들이 응용 개발자들에 손쉬운 데이터 제공을 목적으로 출발함

- Restful 은 데이터 기반 이기때문에 기계 보다는 사람이 이해하기 쉽도록 인터넷 기본(HTTP / XML) 이외에 별도의 개발 /실행 환경이 필요 없음.


반응형
반응형

RESTFUL 어노테이션

스프링 3.0 에선 @RESOPONSEBODY , @CONTROLLER 를 각각의 메소드에 써서 리턴타입으로 자원만 줬으나

스프링 4.0 에선 @RESTCONTROLLER 를 클래스에 한번만 기술하면 클래스에 있는 모든 메소드들이 자원전달 가능

주로 ajax 로 url 호출하여 데이터만 받을때 많이 쓴다

컨트롤러

@RestController //리소스 (데이타) 자체를 반환하는데 사용하는 어노테이션이다.(json,xml,문자열) @RequestMapping("/demo") public class DemoController { // <-- 이 클래스에 @RestController 붙임으로써 각 메소드별로 @ResponseBody 를 붙인것과 같은효과 @RequestMapping("hi") public String hi() { // 클래스에 @restController 이 붙으면 리턴값이 뷰리졸버에서 // 뷰의 이름을 찾는거였는데 문자열 그대로 리턴을 하게됨 return "hi!!!!! spring!!!"; } }

pom.xml

<properties> <java-version>1.8</java-version> <org.springframework-version>4.1.7.RELEASE</org.springframework-version> <org.aspectj-version>1.6.10</org.aspectj-version> <org.slf4j-version>1.6.6</org.slf4j-version> </properties>

리턴타입이 문자열일 경우 그냥 문자열이 반환 되서 뿌려주나

리턴 타입이 객체 (VO , Object , map , list 등) 리턴타입이 객체로 될경우 http 에서는 각 객체들이 어떤타입이거 무엇인지 인식을 못하기때 문에

html /http 에서도 인식할수 있는 json 으로 형 변환하여 리턴 해주어야 한다

pom. xml 에 json 라이브러리 사용방법.

pom.xml 디펜던시 추가

<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.6.3</version> </dependency>

컨트롤러

@RestController //리소스(데이타) 자체를 반환하는데 사용하는 어노테이션이다. (JSON, XML, 문자열) @RequestMapping("/demo") public class DemoController { @RequestMapping("/studentInfo") public StudentVO studentInfo(){ //StudentVO 객체를 만들어서 RETURN StudentVO svo = new StudentVO(); svo.setHakbun(1); svo.setName("김말똥"); svo.setGrade(2); return svo; } }

이렇게 Pom.xml 에 jackson 라이브러리를 추가하면 반환되는 객체(vo 를 json으로 변환하여 전달합니다)

반대로 json 객체가 들어오면 그 타입에 맞는 객체로 변환합니다.

이것들이 가능한 이유는 pom.xml에 jackson 라이브러리(json라이브러리) 가 적용되야 가능하다

response header 에는 (공급하는자 헤더에는)



이렇게 타입이 들어가있따

json 라이브러리로 보낼경우엔 저 컨텐트 타입이 application/json 으로 되있다.

content-Type : 문자열 (String) = text/html

collection(map,list ,vo,JSON등) = application / json

rest 방식은 이와같이 별도의 view 를 만들지 않고 데이터만 보냅니다.


반응형
반응형

[HTTP 상태코드]

# 100 번대 상태코드:

100 ----> 데이터의 일부를 서버가 받은 상태(처리중인 상태)

# 200 번대 상태코드 : 정상적인 처리 후 응답

200 ----> OK 에러없이 정상처리

204 ----> 정상처리 되었으나, 서버에 보낼 데이터가 없음

# 300 번대(다른 URL 처리)

301: 요청한 URL이 새로 변경되었음.

304: 기존의 데이터와 변경된것이 없음

# 400번대

400: 요청에 문제가 있기때문에 서버에서 인식할 수 없음

403: 서버에서 허락되지않음

404: 요청 URL을 찾을 수 없음

406: 전송 방식이 허락되지 않음(REST방식에서 자주 나타나는 상태코드)

# 500번대

500: 서버에서 처리시 문제가 발생(프로그램 내부적인 오류)

502: 게이트웨이, 프록시 상태의 문제(과부하)

503: 일시적인 서비스 중단 상태

504: 지정된 처리시간이 지나서 처리되지 못하는 경우


http 에러코드 전달 방법

@RequestMapping("/errorCode") public ResponseEntity<Void> errorCode(){ return new ResponseEntity<>(HttpStatus.BAD_REQUEST); }

상태코드 전달 받는 객체타입 ResponseEntity ( 객체 타입) 입니다.

리턴할때 인자로 HttpStatus.BAD_REQUEST 를 리턴하면 (http 상태 코드를 bad_request로 전달한다는 뜻이다)

뷰로 들어가면 아무것도 안뜨면서 개발자도구의 네트워크탭에 들어가면 에러코드로 400번 에러가 뜬다

*리턴할때 HttpStatus.BAD_REQUEST 가 400에러를 전달 한다는 뜻

@RequestMapping("/errorCodeData") public ResponseEntity<List<StudentVO>> errorCodeData(){ List<StudentVO> slist = new ArrayList<>(); for(int i=0; i<5; i++){ StudentVO svo = new StudentVO(); svo.setHakbun(i+1); svo.setName("이말똥"+(i+1)); svo.setGrade(1); slist.add(svo); } return new ResponseEntity<>(slist, HttpStatus.NOT_FOUND); //리턴타입인 리스트를 맞추고 404 에러코드를 담는다 }

이럴경우 list 데이터를 보내면서 404 에러코드도 같이 보낸다


반응형

+ Recent posts