java 에러 - The processing instruction target matching "[xX][mM][lL]" is not allowed

웹 & 안드로이드/에러|2013. 10. 25. 15:32
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[Spring]6. spring MVC 시작하기.

- xml 설정파일에 직접 <bean> 태그로 등록 할 수 있지만 spring 3.0 이후부터는 대부분이 @(어노테이션)을 사용하게 된다.


1. 만든 두개의 xml 파일에 다음과 같은 코드를 추가한다.


1
2
3
4
5
6
7
8
<beans>
 
    <context:component-scan base-package="com.controller">
   </context:component-scan>
    <!-- 지정한 패키지에 존재하는 어노테이션을 사용한 클래스를 
          전부 스캔하여 여기에 <bean> 형태로 등록한다 라는 뜻이다. -->
    
</beans>


-base-package= 안에 설정에 해당하는 (서블릿 설정파일이면 컨트롤러를, 리스너의 설정파일이면 모델단에 해당하는) 패키지 명이 들어간다.


2. @(어노테이션)을 이용해 컨트롤러, 서비스 등을 만든다.


- com.controller.HelloController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
 
import com.service.HelloService;
 
@Controller
public class HelloController {
    
    @Autowired
    HelloService service;
    
    @RequestMapping("/hello.do")
    public String hello(Model model){
        System.out.println("sfefd");
        
        service.exe();
        
        //포워딩 시키고 싶은 데이터는 메소드의 매개변수로 모델을 받으면 된다.
        //모델에 속성을 추가하면 된다.
        //이렇게 만들어진 모델은 리퀘스트의 생명 주기와 같다. 
          //설정을 통해 어플리케이션, 세션으로 바꿀 수 있다.
        //jsp에서 호출을 할 때는 EL을 사용하면 된다.
        model.addAttribute("pw""1234");
        
        return "/WEB-INF/view/hello.jsp";
    }
}



-com.service.HelloService.java
 1
2
3
4
5
6
7
8
9
import org.springframework.stereotype.Service;
 
@Service
public class HelloService {
    public void exe(){
        System.out.println("service 실행");
    }
}
 




@Controller, @Service, @Repository는 @Component의 자식들이다. Component를 스캔하면 전부 스캔 되는 것이다.


@Controller는 이것만 쓰면은 기능을 못한다.

기능을 실행 하는 메소드에 @RequestMapping("/hello.do")라는 매핑 어노테이션이 필요하고,

 리턴으로 데이터를 받거나 보여줄 jsp 파일 위치가 들어가야 한다.


서비스를 호출 해야 한다면 서비스를 맴버 변수로 가지고, 위에 @Autowired 가 붙으면 자동으로 생성자나 setter를 이용한 di를 생성한다.

constructor 나 byType 혹은 byName 으로 생성자나 setter를 설정할 수 있다. 생성자나 setter가 존재 해야 가능하다.
























댓글()

[Spring]5. Spring MVC 설정하기.

- 스프링 mvc 프로젝트는 2개의 xml파일이 필요하다.

보통의 pojo객체를 관리하는 bean관리 xml, M

컨트롤러 bean을 관리하기 위한 xml. C


- 자바 빈 객체를 관리하는 xml은 톰캣 서버가 실행 될때 같이 실행 되어야 한다.

즉, 서버 실행과 동시에 spring 컨테이너가 같이 실행 되어야 한다.


- 서버가 실행 될 때를 감지하는 리스너와 spring bean 설정파일이 필요하다.

리스너는 스프링 라이브러리 안에 존재 하며, spring bean xml파일과 web.xml에 등록을 해야 한다.



1. 프로젝트에 스프링 라이브러리를 추가한다.


1-1. 일반적인 다이나믹 웹 프로젝트를 생성.



1-2. /WEB-INF/lib 폴더에 스프링 라이브러리를 추가.

- 스프링을 사용하려면 logging 라이브러리가 필요하다.





2. web.xml에 스프링 라이브러리 안에 있는 리스너와 프론트 서블릿을 추가한다.


2-1. 리스너를 추가한다.

- 리스너를 추가하는 이유는 스프링의 자바 빈을 관리하는 xml파일을 서버가 실행 할때 같이 로딩 시키기 위함.


-web.xml에 등록해야할 리스너와 xml설정파일 위치.
1
2
3
4
5
6
7
8
<listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
 
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

- 이 코드의 뜻은 이렇다.

* 서버 웹 어플리케이션안의 contextConfigLocation라는 변수에 /WEB-INF/applicationContext.xml를 넣는다.

* 서버가 실행할 때 ContextLoaderListener리스너가 실행 된다.

* 리스너는 contextConfigLocation변수 안에 존재하는

 설정 파일 패스와 이름을 호출하여 (/WEB-INF/applicationContext.xml 파일을 호출하여) 스프링 컨테이너를 실행 하게 된다.



2-2. 리스너가 로딩할 xml설정 파일을 만든다.

- 이름이 딱 정해진 것이 아니다. param-value에 자기가 정한대로 넣으면 된다.



- 스키마로 네임 스페이스를 정하는데 여기까진 beans, context를 추가 하면 된다.

나중에 더 추가 할 수 있다.




2-3. 프론트 서블릿을 추가한다. 

- 톰캣에서 만들어진 서블릿 기능을 스프링에서 만든 서블릿으로 위임하기 위함이다.


-web.xml에 등록해야 할 서블릿.

1
2
3
4
5
6
7
8
9
  <servlet>
    <servlet-name>mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>mvc</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

-모든 .do가 붙은 요청은 이 서블릿이 받는다.


2-4. 서블릿이 사용할 xml 설정 파일을 만든다.

- 이 설정 파일에는 C, Controller bean을 관리한다.

- 반드시 위에서 지정한 servlet-name에 "-servlet.xml"라는 이름으로 파일을 만들어야 한다.

"mvc-servlet.xml"







댓글()

[Spring]4. scope

 

- scope : 같은 클래스를 주입할 때 주입할 때 마다 객체를 생성 할 것인가, 아니면 같은 객체를 계속 주입 시킬것인가를 설정.

* prototype : 모든 필요한 객체를 새로 생성하여 주입.
* singleton : 모든 필요한 객체를 한번 생성한 객체로 주입.
* request : 요청이 있을때마다 객체를 생성.
* session : 새로운 세션이 생성 될 때마다 객체를 생성.

1
2
3
4
5
6
7
8
9
10
11
12
public class MainTest {
 
    public static void main(String[] args) {
        Resource resource = new ClassPathResource("applicationContext.xml");
        BeanFactory factory = new XmlBeanFactory(resource);
        Controller c1 = factory.getBean(Controller.class);
        Controller c2 = factory.getBean(Controller.class);
        
        System.out.println(c1.hashCode()+" "+c1);
        System.out.println(c2.hashCode()+" "+c2);
    }
}



1
2
3
<bean     id         = "controller" 
            class    = "Controller"
            scope    = "singleton"/>


- scope에 설정하면 된다.

댓글()

[Spring]3. Spring DI - @(어노테이션)을 이용한 DI



- @(어노테이션)을 이용한 방법.


- Spring DI는 xml로 직접 소스를 작성하지 않고, @(어노테이션)을 써도 ApllicationContext.xml 파일에 자동으로 <bean>형태로 객체를 생성한다.

 

- context 스키마를 추가한다.


 

- xml설정 파일에 다음과 같은 코드를 추가 한다.


-applicationContext.xml

1
2
3
4
5
6
<beans>
 
    <context:component-scan base-package="com"></context:component-scan>
    <!-- 지정한 패키지에 존재하는 어노테이션을 사용한 클래스를 전부 스캔하여 여기에 등록한다 라는 뜻이다. -->
    
</beans>

 

클래스에 @Component 를 추가한다.

1
2
3
4
5
6
7
@Component
public class HelloService {
    public void exe(){
        System.out.println("service 실행");
    }
}
 


끝.

'웹 & 안드로이드 > JAVA & JSP' 카테고리의 다른 글

[Spring]5. Spring MVC 설정하기.  (0) 2013.10.22
[Spring]4. scope  (0) 2013.10.21
[Spring]2. Spring DI - xml파일을 이용한 DI  (0) 2013.10.21
[Spring] 1. Spring DI  (0) 2013.10.21
XML 이란?  (0) 2013.10.21

댓글()

[Spring]2. Spring DI - xml파일을 이용한 DI

- xml설정파일을 이용하는 방법..


자바에서 클래스를 추가할 때 import를 하는것 처럼 태그를 추가할 때 xml설정 파일에도 스키마로 네임스페이스를 추가하여야 한다.



- Dao 인터페이스와 그 것을 구현한 OracleDao. 

1
2
3
4
5
6
7
8
9
10
11
public interface Dao {
    public void getList();
}
//인터페이스 구현을 통해 OracleDao를 만든다.
public class OracleDao implements Dao{
    @Override
    public void getList(){
        System.out.println("OracleDao.getList() - Oracle DB에 접근합니다.");
    }
}
 


- Service인터페이스와 구현한 OracleService. Dao에 의존성이 있기 때문에 멤버로 Dao를 가지고 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public interface Service {
    public void getList();
}
//역시 service또한 인터페이스 구현으로 만든다.
public class OracleService implements Service{
    Dao dao;
    @Override
    public void getList(){
        System.out.println("OracleService.getList() - OracleDao.GetList() 를 호출합니다.");
        dao.getList();
        System.out.println("OracleService.getList() - Dao에서 데이터를 받아 Controller에게 넘져줍니다.");
    }
    @Override
    public void setDao(Dao dao) {
        this.dao = dao;
    }
}


- Service를 가지고 있는 Coltroller.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class ListController {
    private Service service;
    
    public void setService(Service service) {
        this.service = service;
    }
    
    public void doGet(){
        System.out.println("Controller - OracleService를 호출합니다.");
        service.getList();
        System.out.println("Controller - Service에서 데이터를 받아 View에 넘겨줍니다.");
    }
}

  

- Controller를 호출할 메인 메소드.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
 
public class testMain {
 
    public static void main(String[] args) {
        Resource resource = new ClassPathResource("apllicationContext.xml");
        BeanFactory bf = new XmlBeanFactory(resource);
        ListController c = (ListController) bf.getBean("listController");
        System.out.println("Controller를 호출합니다.");
        c.doGet();
    }
 
}

- 예상 결과

Controller를 호출합니다.

Controller - OracleService를 호출합니다.

OracleService.getList() - OracleDao.GetList() 를 호출합니다

OracleDao.getList() - Oracle DB에 접근합니다

OracleService.getList() - Dao에서 데이터를 받아 Controller에게 넘져줍니다.

Controller - Service에서 데이터를 받아 View에 넘겨줍니다



- 이것을 실행 시키기 위해서는 설정된 xml파일이 필요하다.

  - 위의 세 클래스(controller, service, dao)를 이와 같이 등록한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?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:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.2.xsd">
 
    <bean id="oracleDao" class="com.OracleDao" >
        
    </bean>
    
    <bean id="oracleService" class="com.OracleService" >
        <property name="dao">
            <ref bean="oracleDao"/>
        </property>
    </bean>
 
    <bean id="listController" class="com.ListController" >
        <property name="service">
            <ref bean="oracleService"/>
        </property>
    </bean>
        
</beans>

 

- Bean은 객체이다. Spring DI는 모든 등록된 클래스를 프로젝트를 처음 실행할때 전부 객채로 생성한다. 객체가 다른 객체를 필요로 할 때, 필요로 하는 객체를 생성자나 setter를 통해 주입시켜준다.

- xml파일에 <constructor-arg>를 이용하여 생성자를 이용한 DI도 가능하다.


autowire속성으로 자동으로 의존성 주입이 가능하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<beans>
 
    <bean     id="service" 
            class="wakeup.di.service.Service">
    </bean>
            
    <bean     id="listController" 
            class="wakeup.di.controller.ListController"
            autowire="byType">
    </bean>
</beans>
 





 

- 다음 코드는 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<bean id="oracleDao" class="com.OracleDao" >
        
</bean>
    
<bean id="oracleService" class="com.OracleService" >
    <property name="dao">
        <ref bean="oracleDao"/>
    </property>
</bean>
 
<bean id="listController" class="com.ListController" >
    <property name="service">
        <ref bean="oracleService"/>
    </property>
</bean> 


     - 다음과 같다.

 
1
2
3
4
5
6
7
8
9
10
//xml파일의 id속성은 객체변수명이 되고, class는 클래스명이다.
OracleDao oracleDao = new OracleDao();
 
//property name은 멤버 Dao변수를 뜻하고, ref는 그 필드에 들어갈 객체이다.
OracleService oracleService = new OracleService();
oracleService.setDao(oracleDao);
 
//controller도 마찬가지.
ListController listController = new ListController();
listController.setOracleService(oracleService);





'웹 & 안드로이드 > JAVA & JSP' 카테고리의 다른 글

[Spring]4. scope  (0) 2013.10.21
[Spring]3. Spring DI - @(어노테이션)을 이용한 DI  (0) 2013.10.21
[Spring] 1. Spring DI  (0) 2013.10.21
XML 이란?  (0) 2013.10.21
Spring  (0) 2013.10.18

댓글()

[Spring] 1. Spring DI

1. Spring DI


 - Spring DI : 모든 클래스의 객체를 미리 생성해 두고, 어떠한 객체가 필요로 하는 객체를 주입 시켜주는 일종의 컨테이너.

주입 시키는 방법은 xml 설정과 @어노테이션이 있다. 어노테이션도 결국 xml로 바뀐다. 보통 어노테이션 방법을 많이 쓰지만 소스는 없고 클래스 파일만 가지고 있을때는 xml 설정을 쓴다.


- 생성자, setter주입을 사용한다. xml에 설정하면 자동으로 주입 시킨다.

 

- 경량 컨테이너라고도 한다. 다른 컨테이너에 비해 리소스 용량이 크지 않기 때문이다.


- DI를 사용하기 위해서는 필요한 클래스를 멤버 변수로 가지고 있어야 하고, 생성자 혹은 setter를 가지고 있어야 한다.

     

- 빈은 빈팩토리에서 getBean()을 실행 할 때 모든 객체 생성이 이루어 진다. 




'웹 & 안드로이드 > JAVA & JSP' 카테고리의 다른 글

[Spring]3. Spring DI - @(어노테이션)을 이용한 DI  (0) 2013.10.21
[Spring]2. Spring DI - xml파일을 이용한 DI  (0) 2013.10.21
XML 이란?  (0) 2013.10.21
Spring  (0) 2013.10.18
Maven  (0) 2013.10.18

댓글()

XML 이란?

 - XML(Extensible Markup Language) : 확장형 마크업 언어. 데이터 교환에 대한 표준을 정의 한다.


 - SGML(Standard Generalized Markup Language) : xml 과 html의 모체가 되는 언어. 

다양한 형태의 전자문서들을 서로 다른 시스템들 사이에 정보의 손실없이 효율적으로 전송, 저장, 자동처리를 위한 국제표준화기구, ISO 문서처리표준의 하나이다. html과 xml도 이것을 이용해 만들어졌다.

'웹 & 안드로이드 > JAVA & JSP' 카테고리의 다른 글

[Spring]2. Spring DI - xml파일을 이용한 DI  (0) 2013.10.21
[Spring] 1. Spring DI  (0) 2013.10.21
Spring  (0) 2013.10.18
Maven  (0) 2013.10.18
Transaction(트랜젝션) - 어떠한 과정을 한 묶음으로 처리하는 것.  (0) 2013.10.17

댓글()

Spring

- Spring : 스프링은 컨테이너와 같다. 객체 생성과 관리는 스프링이 한다. 스프링에서 객체는 bean이라고 한다.


- InsertController

1
2
3
4
5
6
public class InsertController {
    public void execute(){
        System.out.println("InsertController.execute() 실행.");
    }
}
 



- applicationContext.xml

* bean을 관리하는 설정 파일.

* 반드시 이런 이름을 쓸 필요는 없다.

1
2
3
4
5
6
7
8
9
10
11
12
<?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">
    
    <bean     id      = "insertController" 
            class = "wakeup.controller.InsertController">
    </bean>
 
</beans>
 



- Maintest

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
 
import wakeup.controller.InsertController;
 
public class MainTest {
    public static void main(String[] a){
        //빈 설정을 한 xml 리소스 파일의 위치를 찾음.
        Resource resource = new ClassPathResource("applicationContext.xml");
        
        //찾은 리소스 파일을 가지고 빈을 생성할 수 있는 빈 팩토리를 만든다.
        BeanFactory beanFactory = new XmlBeanFactory(resource);
        
        //빈 팩토리에서 insertController를 가져온다. id나 클래스 이름을 적는다.
        //id는 여러개의 객체에서 호출 할 때,
        //class는 하나의 객체에서 호출 할 때 사용한다.
        InsertController Controller = (InsertController) beanFactory.getBean("insertController");
        Controller.execute();
    }
}
 



- 새로 객체 생성을 할 필요 없이 spring 에서 객체를 관리하고 호출 할 수 있다.

댓글()

Maven

- group id : 패키지 명.name space.


- artifact id : 프로젝트 명.  메이븐 프로젝트는 전 세계 공유를 목적으로 하기 때문에 패키지 명과 함께 전 세계에 유일한 이름이 들어가야 한다.


모든 자바 파일은 소스와 리소스로 구성된다. xml파일은 리소스 파일이다.


maven 설정은 pom.xml 에 전부 들어간다.


pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<project xmlns="http://maven.apache.org/POM/4.0.0" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                                           http://maven.apache.org/xsd/maven-4.0.0.xsd">
                                        
  <modelVersion>4.0.0</modelVersion>
  <groupId>wakeup</groupId>
  <artifactId>maven-test</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <!-- 라이브러리를 직접 다운 받아 클래스패스에 넣지 않아도
         maven의 pom.xml 파일에 다음 코드를 입력하면 자동으로 서버에서 다운받는다.-->
  <dependencies>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
          <version>3.2.4.RELEASE</version>
      </dependency>
      
  </dependencies>
  
</project>




- 스코프

* compile 스코프

* provided 스코프

* runtime 스코프

* test 스코프



- 추이 의존성 : 의존성이 추가 될 때 라이브러리가 중복 될 때가 있다. 


- 메이븐 프로젝트는 보통의 export가 아닌 메이븐 빌드를 통해 일반 jar, war 파일로 배포해야 한다.

댓글()