반응형

처음 스프링 프로젝트가 생성되면 아래와 그림과 같은 구조를 확인 하실 수 있습니다.

간단하게 구성을 설명 하겠습니다.


src/main/java 는 프로젝트에서 개발되는 모든 Java코의 경로가 됩니다.

개발자나 프로젝트의 기호에 따라 sql mapper, tiles 등 xml 의 경로가 포함되기도 합니다.


src/main/recoursec 는 서버가 작동될때 사용되는 파일들의 경로입니다.

DB 연동을 위한 sql mapper의 xml 파일, titles의 template.xml 파일, 다국어 지원을 위한 properties.xml 등이 포함됩니다.


src/test/java 와 src/test/resources 는 말 그대로 테스트용 경로입니다. 위 두 경로와 목적만 다릅니다.


JRE System Library 세팅된 자바 버전을 나타냅니다.


Maven Dependencies 는 pom.xml 에 등록된 라이브러리들이 표시 되어 있습니다.


src->webapp->resources 는 이미지, 자바스크립트 등 페이지를 구성하는 resources들의 경로입니다.

src->webapp->WEN-INF->spring  스프링을 구성하는 설정 파일들의 경로입니다.

src->webapp->WEB-INF->views 실제 페이지를 구성하는 jsp, html 등의 파일들의 경로입니다.





 아래부터 home.jsp 의 작동 원리를 설명 하겠습니다.





기존 Dynamic Web 프로젝트는 jsp 등 웹 파일에서 서버를 실행 하면 바로 해당 페이지에 접근을 할 수 있었습니다.

하지만 스프링에서는 보안을 위해 웹 파일들을 WEB-INF 안에 저장 하고 있습니다.

이유는 WEB-INF 는 직접 접근을 할 수 없기 때문입니다. 이러한 이유로 home.jsp 를 바로 실행 시키면 

아래처럼 404 에러가 발생합니다. 그렇기 때문에 우리는 컨트롤러를 통해 페이지를 호출 해야 합니다.

그림(스프링 작동 순서) 에서 부터 순서대로 설명 하겠습니다.





- 그림(스프링 작동 순서)




1. web.xml 은 프로젝트의 환경 설정을 해주는 파일입니다. 프로젝트가 실행되면 이 파일이 가장 먼저 실행 되고, 

DispatcherServlet이 해당 프로젝트로 들어오는 요청들을 낚아채고 핸들링을 해줍니다.

이 부분은 낚아챈 요청들을 servlet-context.xml 로 보내주는 부분입니다.


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
31
<!--?xml version="1.0" encoding="UTF-8"?-->
 
    <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>
     
    <!-- Creates the Spring Container shared by all Servlets and Filters -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
 
    <!-- Processes application requests -->
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
         
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
 
</web-app>





2. servlet-context 는 낚아챈 요청을 받아 <annotation-drive/> 란 태그를 사용하여 컨트롤러에서 어노테이션을 사용할 수 있게 해줍니다.

<context:component-scan base="com.프로젝트.패키지명"/> 태그는 어노테이션을 사용할 영역(패키지)를 설정 할 수 있게 해줍니다.

낚아챈 요청은 com.포르젝트.패키지명에  요청된 url에 맞게 맵핑이 됩니다.

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!--?xml version="1.0" encoding="UTF-8"?-->
 
    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
     
    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven>
 
    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/">
 
    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/">
        <beans:property name="suffix" value=".jsp">
    </beans:property></beans:property></beans:bean>
     
    <context:component-scan base-package="com.black.user.controller">
     
     
     
</context:component-scan></resources></annotation-driven></beans:beans>

  



3. @RequestMapping(value = "/", method=RequestMethod.GET) 에 있는 value 값을 참조하여 요청된 url과 맵핑을 합니다.

return 되는 값은 "home" 이지만, 과정 4에서 페이지 경로를 prefix(/WEB-INF/views/) , suffix(.jsp) 가 자동으로 완성해주기 때문에,

최종적으로 /WEB-INF/view/return값.jsp 가 호출이 됩니다.








localhost:8080 을 실행 해보시면 아래와 같은 결과가 나오게 됩니다.

@RequestMapping 에서 value값을 "Index" 라고 설정을 하게 되면, localhost:8080/Index 라는 url로 접근 하면 됩니다.




반응형
반응형

스프링 프로젝트에 MariaDB 와 Mybatis를 연동 후 테스트 까지 해보겠습니다.

테스트 진행은 Maria DB의 테이블 및 테스트 칼럼이 샘플이 존재해야 합니다.

* 저는 testdb 테이블에 age 란 int형 칼럼이 존재 합니다.


첫 번째로, pom.xml 에 아래 dependency를 복사 및 붙여넣기 하세요.


*Mysql 과 Maria DB의 차이 ↓

http://gabrielyj.tistory.com/119?category=732269


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
<!-- MariaDB -->
<dependency>
    <groupid>org.mariadb.jdbc</groupid>
    <artifactid>mariadb-java-client</artifactid>
    <version>1.1.7</version>
</dependency>
 
<!-- Mybatis -->
<dependency>
    <groupid>org.mybatis</groupid>
    <artifactid>mybatis</artifactid>
    <version>3.3.1</version>
</dependency>
 
<!-- Mybatis-Spring -->
<dependency>
    <groupid>org.mybatis</groupid>
    <artifactid>mybatis-spring</artifactid>
    <version>1.2.4</version>
</dependency>
 
<!-- Mybatis Spring MVC -->
<dependency>
    <groupid>org.springframework</groupid>
    <artifactid>spring-jdbc</artifactid>
    <version>${org.springframework-version}</version>
</dependency>



그 다음 WEB-INF폴더 -> spring폴더 -> root-context.xml 파일을 열어준뒤,

Namespace 메뉴를 클릭합니다.

(아래를 참고하고 aop, context, jdbc, mybatis-spring을 추가해주세요)






Namespaces에서 추가가 완료되면,

아래 내용을 root-context.xml 에 추가 해주세요.

url 의 jdbc:mysql:// 이후로는 사용하시는 IP와 포트 번호를 입력 해주시고,

username 과 password 는 각각 ID와 PW를 입력 해주시면 됩니다.

* 로컬 DB를 사용하시는분은 (jdbc:mysql://localhost:8080/DB이름) 을 입력 하시면 됩니다. 

* 혹시 localhost 인데 포트번호가 8080 아니면 해당되는 포트번호를 꼭 입력 하셔야 합니다.



1
2
3
4
5
6
7
8
9
10
11
12
<!-- 1. 데이터 베이스 연결 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
   <!-- <property name="driverClassName" value="org.mariadb.jdbc.Driver" /> -->
   <property name="driverClassName" value="com.mysql.jdbc.Driver">
   <property name="url" value="jdbc:mysql://해당DB의 IP + 포트번호">
   <property name="username" value="해당DB의 ID">
   <property name="password" value="해당DB의 PW">
</property></property></property></property></bean>
 
<!-- 2. 순서대로 진행하기 위해 아래에 추가 하겠습니다. -->
<!-- 3. 순서대로 진행하기 위해 아래에 추가 하겠습니다.-->



그 다음 Java Resources 폴더-> src/main/resources 폴더 내부에

mappers 패키지 생성 후 그 안에 testMapper.xml 을 생성하고,

그 외부에 mybatis-config.xml 파일을 추가로 생성합니다.






testMapper.xml (DB 쿼리문을 작성하는 부분입니다.)

1
2
3
4
5
6
7
8
9
10
11
<!--?xml version="1.0" encoding="UTF-8"?-->
 
<!-- 자바클래스에서 mapper 을 찾는 경로 다른 mapper와 중복되지 않도록 네임 스페이스 기재 -->
<!--?xml version="1.0" encoding="UTF-8"?-->
 
 
<mapper namespace="my.mappers.testMapper">
    <select id="selectTest" resulttype="integer">
        SELECT age FROM testdb
    </select>
</mapper>


mybatis-config.xml (이 부분은 테스트 하는 동안 수정할 필요 없습니다.입력만 잘해주세요.)

1
2
3
4
5
6
<!--?xml version="1.0" encoding="UTF-8"?-->
 
<configuration>
 
 
</configuration>




그 다음 추가로 Java Resources 폴더-> src/main/resources 폴더 내부에

mybatisUtil 이란 패키지를 생성하고,

인터페이스 TService 와 클래스 TServiceImpl를 생성해줍니다.

이 부분은 컨트롤러와 mapper 사이를 연결해주는 부분입니다.


SqlSession을 Inject 해주고,

namespace 에는 *Mapper.xml 내에서 사용하는 이름과 똑같아야 합니다.




인터페이스 TService (in mybatisUtil package)

1
2
3
4
package mybatisUtil;
public interface TService {
    public int test();
}


클래스 TServiceImpl (in mybatisUtil package)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<p>package mybatisUtil;
 
import javax.inject.Inject;
 
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Service;
 
@Service
public class TServiceImpl implements TService {
     
    @Inject
    private SqlSession sqlSession;
     
    private static final String namespace = "my.mappers.testMapper";
 
    @Override
    public int test() {
        return sqlSession.selectOne(namespace + ".selectTest");
    }
}
</p>




이제 다시 root-context.xml 로 돌아가서 아까 입력 안한 2, 3번째 부분을 완성니다.

주의할 점은, mapperLocations 부분 부터

Mapper, Service, ServiceImpl 이 일치하지 않으면, 404에러 발생합니다.

404에러가 발생하면 꼭 *Mapper.xml 부터 절차적으로 확인 해보세요!




1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- 2.SqlSessionFactory(파일 없으면 404에러뜸) -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
   <property name="dataSource" ref="dataSource"></property>
   <property name="configLocation" value="classpath:/mybatis-config.xml"></property>
   <property name="mapperLocations" value="classpath:/mappers/*Mapper.xml"></property>
</bean>
 
<!-- 3. SqlSessionTemplate DB연결 & 종료 -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
 
   <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
</bean>
 
<context:component-scan base-package="Service위치 ex)mybatisUtil"></context:component-scan>




이렇게 DB연동 작업은 끝났습니다.

마지막으로 controller 에서 실행을 하면 됩니다.


Service 부분을 @Autowired 어노태이션을 입력 하여 TService 를 등록 해주시고,

ModelAndView형 메소드를 만들어 그 안에 test() 메소드를 실행 해줍니다.

*저는 바로 int 형으로 반환을 받고 뿌려주기 위해 int 형으로 선언 하였습니다.

그리고 addObject 메소드를 이용하여 mav 객체에 담아주고,

setViewName 메소드를 이용해 호출되는 페이지명도 담아줍니다.

* test.jsp 를 불러올것이기 때문에 test를 담았습니다.




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
package controller;
 
import javax.servlet.ServletException;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
import mybatisUtil.TService;
 
@Controller
public class TestController {
     
    @Autowired
    private TService tDAO;
     
    @RequestMapping(value = "/test.do")
    public ModelAndView portList(ModelAndView mav) throws ServletException {
         
        int test = tDAO.test();
         
        mav.addObject("test", test);
        mav.setViewName("test");
        return mav;
    }
}



마지막으로 아래를 참고하여 test.jsp 를 생성해줍니다.

그 다음 EL문을 이용하여 ${test}를 입력 합니다

* 위에서 addObject 할 때 이름을 'test'로 했기 때문에 ${test}


그리고 !!!


http://localhost:8080/프로젝트명/test.do   <- 접속하세요

이 부분이 말끔히 실행되려면, servlet-context.xml 부분의

preffix="/" suffix=".jsp" 입니다.

그래서 위에 setViewName 으로 넘어온 test가 /test.jsp 가 됩니다.


1
2
3
4
5
6
7
8
9
10
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
 
 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
 
 
    ${test}





최종 결과 : 저는 DB에 입력된 age 값이 '10' 이였습니다.

 





반응형

+ Recent posts