Sptring boot 프로젝트를 war 파일로 배포하는데 

tomcat이 profils 설정을 읽지 못하는 상황.

 

프로젝트에는 아래와 같이 프로퍼티를 구분해뒀는데

 

application-dev.properties

application-prd.properties

 

프로파일 파일을 읽어오지 못하니 자꾸 에러가 발생합니다.

이런 경우 tomcat 설치 디렉토리에서 bin 폴더를 찾아서

setenv 파일을 추가해주면 됩니다.

 

Linux

setenv.sh 파일 생성 후 아래 내용 추가

JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active={profile}"

 

Window

setenv.bat 파일 생성 후 아래 내용 추가

JAVA_OPTS=%JAVA_OPTS% -Dspring.profiles.active={profile}

 

 

위 과정을 통하여 파일을 생성했으면 chmod 명령어로

실행 권한까지 부여해주어야 합니다.

 

$ chmod +x setenv.sh

 

마지막으로 톰캣을 재기동하면 정상적으로 프로파일 내용을

읽어 올 것입니다.


앞장에 이어서 테스트 class를 작성해보았습니다. 일단 이클립스에서 

Class 파일로 TestController를 먼저 만들고 아래와 같이 소스코드를 

입력했습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
@Controller
public class TestController {
 
    @Resource(name="testservice")
    private TestService testservice;
    
    @RequestMapping(value = "/")
    public void home() {    
        String text = testservice.getTestSql();
        System.out.println("result: "+ text);
    }
    
}





여기까지 입력하면 이클립스에서 에러가 출력, Create Interface 간편

하게 인터페이스를 생성해주고 해당 내용을 작성합니다.


1
2
3
4
5
public interface TestService {

    String getTestSql();
}





이제 비즈니스 로직을 입력해줄 Class를 생성해줄건데요, 이는 

ServiceImpl이라고 명명하겠습니다. 그리고 Impl Class는 Interface

TestService를 implements하여 부모의 메소드를 재정의 해줍니다.


1
2
3
4
5
6
7
8
9
10
11
@Service(value="testservice")
public class TestServiceImpl implements TestService{
 
    @Resource(name="testDAO")
    private TestDAO testDAO;
    
    public String getTestSql(){
        return testDAO.getTestSql();
    }        
    
}





다음으로 DAO Class를 작성하여 data access method를 작성합니다.

DAO는 AbstractDAO를 상속 받아 1장에서 작성한 XML 파일에서 

데이터베이스에 액세스하여 쿼리 결과를 출력합니다.


TestDAO ▼

1
2
3
4
5
6
7
8
@Repository(value="testDAO")
public class TestDAO extends AbstractDAO{
 
    public String getTestSql() {
        return (String) selectOne("getTestSql");
    }
 
}



AbstractDAO ▼

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class AbstractDAO {
    
    protected Log log = LogFactory.getLog(AbstractDAO.class);
    
    @Autowired
    public SqlSessionTemplate sqlSession;
    
    protected void printQueryId(String queryId) {
        if(log.isDebugEnabled()){
            log.debug("\t QueryId  \t:  " + queryId);
        }
    }
     
    public Object insert(String queryId, Object params){
        printQueryId(queryId);
        return sqlSession.insert(queryId, params);
    }
     
    public Object update(String queryId, Object params){
        printQueryId(queryId);
        return sqlSession.update(queryId, params);
    }
     
    public Object delete(String queryId, Object params){
        printQueryId(queryId);
        return sqlSession.delete(queryId, params);
    }
     
    public Object selectOne(String queryId){
        printQueryId(queryId);
        return sqlSession.selectOne(queryId);
    }
     
    public Object selectOne(String queryId, Object params){
        printQueryId(queryId);
        return sqlSession.selectOne(queryId, params);
    }
     
    @SuppressWarnings("rawtypes")
    public List selectList(String queryId){
        printQueryId(queryId);
        return sqlSession.selectList(queryId);
    }
     
    @SuppressWarnings("rawtypes")
    public List selectList(String queryId, Object params){
        printQueryId(queryId);
        return sqlSession.selectList(queryId,params);
    }
    
}




여기까지 진행하고 톰캣을 재기동하면 result: OK 라는 메시지가 이클립스

Console에 출력됩니다. 





  마이바티스란(Mybatis) ?


마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크입니다. 마이바티스는 JDBC로 처리하는 상당 부분의 코드와 파라미터 설정및 결과 매핑을 대신해주고, 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑하기 위해 XML과 어노테이션을 사용할 수 있게 해줍니다.


상기 내용은 Mybatis 홈페이지에서 긁어온 내용인데 이해하기가 어렵습니다. 간단하게 요약하면 객체지향 어플리케이션에서 관계형 데이터베이스의 연결을 쉽고 간결하게 처리하여 개발할 수 있도록 도와주는 프레임워크라고 말할 수 있겠네요.


이는 복잡한 JDBC 연결 코드를 걷어내어 생산성을 향상시켜주고, SQL과 어플리케이션 소스를 분리 시켜 유지보수성을 향상시켜줍니다. 엄청난 장점들이네요.^^


 


  마이바티스(Mybatis) 연동


필요 dependency는

1. Mybatis 라이브러리
2. Mybatis-Spring : Mybatis 와 Spring Framework 연동해주는 라이브러리
3. commons-dbcp : 자카르타 라이브러리로 Db컨넥션 풀을 관리해주는 라이브러리
4. ojdbc : 오라클 db 연동해주는 라이브러리
5. spring-jdbc : spring에서 db 컨넥션사용하기 위한 라이브러리


먼저 호환 가능한 버전을 확인해주고


MyBatis-Spring MyBatis Spring
1.0.0 and 1.0.1 3.0.1 to 3.0.5 3.0.0 or higher
1.0.2 3.0.6 3.0.0 or higher
1.1.0 or higher 3.1.0 or higher 3.0.0 or higher
1.3.0 or higher 3.4.0 or higher

3.0.0 or higher

1. pom.xml 해당 dependency를 추가합니다.


1. Mybatis

<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency>

 

2. Mybatis-Spring

<dependency>

    <groupId>org.mybatis</groupId>

    <artifactId>mybatis-spring</artifactId>

    <version>1.3.0</version>

</dependency>


3. MySQL connector-java

<dependency>

    <groupId>mysql</groupId>

    <artifactId>mysql-connector-java</artifactId>

    <version>5.1.40</version>

</dependency>


4. commons-dbcp

<dependency>

    <groupId>commons-dbcp</groupId>

    <artifactId>commons-dbcp</artifactId>

    <version>1.4</version>

</dependency>


5. spring-jdbc

<dependency>

   <groupId>org.springframework</groupId>

   <artifactId>spring-jdbc</artifactId>

   <version>${org.springframework-version}</version>

</dependency>



2. web.xml에 추가.


<web-app> 태그 안에 해당 소스를 추가합니다.


<context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>

        classpath:config/mappers/*-context.xml

    </param-value>   

</context-param>



3. mapper.xml 추가


src/main/resources에 config > mappers 디렉토리를 만들고 mappers 폴더에 

mapper-context.xml, db-context.xml, test_SQL.xml 을 생성해줍니다.


mapper-context.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"

    xmlns:context="http://www.springframework.org/schema/context"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource" />

<property name="mapperLocations" value="classpath*:/config/mappers/**/*_SQL.xml" />  

</bean>

     

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">

<constructor-arg index="0" ref="sqlSessionFactory" />

</bean>

</beans>


db-context.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.1.xsd

                        http://www.springframework.org/schema/jdbc  http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd">

     

<!-- MySQL 연결 -->

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>

        <property name="url" value="jdbc:mysql://주소/스키마"/>

        <property name="username" value="계정"/>

        <property name="password" value="비밀번호"/>

    </bean>

</beans>


test_SQL.xml


<?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="com.test.tester.seviceimpl.TestDAO">


<select id="testSql" parameterType="string" resultType="string">

select 'OK' as Mybatis_Test from dual

</select>


</mapper>


여기까지 추가하셨다면 기본적인 준비는 끝났습니다.

다음 장에서는 Controller에서 쿼리를 찍어보도록 하겠습니다.


Spring MVC(Model / View / Controller) 흐름


요소

설명

 Client

URL로 해당 정보를 요청합니다.

DispatcherServlet

DispatcherServlet은 web.xml에 정의한 서블릿으로써, Client의 요청을 전달받아 Controller에게 전달하고, Controller가 리턴한 결과값을 지정된 View에 전달하여 알맞은 오브젝트를 생성하도록 합니다. (제어 역할)

HandlerMapping

HandlerMapping을 이용하여 Controller 검색합니다.

Controller

Client의 요청을 처리한 뒤, 처리 결과를 DispatcherServlet에 알려줍니다.

ViewResolver

처리 결과를 어떤 View에 보낼지를 결정합니다.

View

처리 결과를 보여줍니다.



Spring MVC 개발 프로세스


- 클라이언트의 요청(URL)을 제어할 DispatcherServlet을 web.xml 파일에 설정.

- Controller의 처리 결과를 어떤 View 페이지로 넘길지 결정하는 ViewResolver를 설정.

- Controller를 작성한다.

- View페이지 코드 작성.



Spring MVC 테스트


1. Spring Legacy Project를 선택후 Next



2. Spring MVC Project를 선택후 Finish



3. WEB-INF/spring/appServlet/servlet-context.xml을 연후 경로를 수정해줍니다.


<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<beans:property name="prefix" value="/WEB-INF/test/jsp/" />

<beans:property name="suffix" value=".jsp" />

</beans:bean>


4. 브라우저창에 http://localhost:8080/를 입력하면 위 화면과 같은 페이지가 뜨면서 Hello world라는 글자가 출력됩니다.




▶ 만약 404 에러페이지가 뜬다면?

test/jsp/home.jsp로 넣어주고 톰캣을 돌려보았는데 404에러가 났었는데요.

왜 404가 날까 고민하던중 이유를 찾았는데 tomcat을 추가하고 context path를 수정하지 않았네요. tomcat을 Add and Remove를 통해서 추가하면 context path는 기본적으로 project명을 따라가는데 이는 참고하도록하고 path는 아래와 같이 수정.



▶ 만약 한글이 깨진다면?


 jsp 페이지 상단에 다음과 같은 문구를 삽입합니다.


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>