전체글
일상
코딩
게임
블로그 운영
IT
여행

스프링 프레임워크(Spring STS) 개발 #4 - 스프링 컨트롤러 JSTL을 이용한 DB값 출력

지난 글에서, 스프링 MyBatis 설정 및 연동까지 구현하였습니다. 이번 글에서는 연동한 MyBatis가 제대로 작동해서 DB 값이 출력되는지 테스트를 해보겠습니다.

스프링 컨트롤러 JSTL을 이용한 DB값 출력


spring sts


 MyBatis가 정상적으로 작동되어서 DB값이 출력되는지 확인하기 전에, 몇 가지 파일과 DB 값을 입력해놓아야합니다. 제가 테스트로 사용한 코드를 직접 보여드리면서 설명해드리겠습니다.
그 전에 테스트용 DB값을 넣어주시기 바랍니다.


테스트용 DB
CREATE TABLE 'test' (
'test_INT' INT(11) NOT NULL,
'test_TEXT' VARCHAR(50) NOT NULL,
'test_DATE' DATE NOT NULL,
'test_DOUBLE' DOUBLE NOT NULL,
PRIMARY KEY ('test_INT')
)

INSERT INTO test ('test_INT', 'test_TEXT', 'test_DATE','test_DOUBLE') VALUES ('1', '텍스트1', '2017-08-27','1.23');
INSERT INTO test ('test_INT', 'test_TEXT', 'test_DATE', 'test_DOUBLE') VALUES ('1', '텍스트1', '2017-08-27', '0.55');



1. Java Bean 만들기



 먼저 DB에 값을 입력하거나 출력할 때 사용할 Bean 클래스를 하나 만듭니다. [src/main/java] 폴더 내에 [xxx.yyy.zzz.bean] 패키지를 만들고 그 안에 [TestBean.java] 클래스를 생성합니다.




그 다음, 그 클래스 안에 table 컬럼명과 자료형이 동일한 변수들을 만들어줍니다.


TestBean.java

import java.sql.Date;


public class TestBean {

private int test_INT;

private String test_TEXT;

private Date test_DATE;

private double test_DOUBLE;

}


변수들을 추가한 뒤에 오른쪽 클릭을 하고 [Source] ▶ [Generate Getters and Setters]를 누릅니다.




[Select All]을 클릭하고 [OK]를 눌러 GetterSetter을 추가해줍니다.




 이렇게 하면, test 테이블에 쓰일 TestBean이 완성됩니다. 변수를 추가할 경우에도 동일하게 추가할 변수를 적고 GetterSetter을 추가하시면 됩니다.



2. Mapper에 쿼리문 추가


Bean을 생성한 후에, test 테이블에서 DB값을 불러올 select 쿼리문을 추가합니다.



 먼저 [Mybatis-config.xml]을 엽니다.




 test 테이블에 있는 값을 출력할 것이기 때문에, TestBean을 사용할 수 있도록 TestBean의 경로를 잡아주고 alias를 취해줍니다.


typeAlias 정해주기

<typeAliases>

<typeAlias alias="Test" type="hanazuou.imas.mlst.bean.TestBean" />

</typeAliases>




이전 글에서 만들어 놓았던 [testMapper.xml] 파일을 엽니다.
 



그리고 출력할 DB값에 대한 select 쿼리문을 입력합니다. 그 전에 <select></select> 태그 안에 프로퍼티의 의미를 알려드리겠습니다.


 id='test' : DAO나 Contoller 등 Java 내에서 불러올 때 쓰이는 id

 resultType='Test' : 결과 값의 자료형 또는 Bean(컬럼, 자료형). Test는 위에서 Alias를 취해준 JavaBean


testMapper.xml
<select id='test' resultType="Test">
select * from test
</select>




3. DB 입출력에 사용할 DAO, Service 만들기


 MyBatis를 사용하여 바로 컨트롤러에서 DB값을 입출력 할 수도 있지만, 이렇게 할 경우 컨트롤러의 코드가 너무 길어지고 속도가 느려지기 때문에 DB 입출력을 담당하는 DAO를 만들어서 DB값을 입력하거나 불러옵니다.

 DAO를 용도(table 종류별, 사용 페이지별 등)에 맞게 분리해놓으면 차후에 유지보수하기에도 편해집니다.




 [src/main/java] 폴더 내에 DAO 패키지를 만들고, 그 안에 [TestDAO.java] 인터페이스를 하나 생성합니다.

 인터페이스를 사용하는 이유는 컨트롤러나 Service에서 호출할 경우 인터페이스를 읽은 후에 인터페이스에 연결 된 하나의 메소드를 불러오는게 더 빠르고, 메소드의 양이 많아서 코드를 찾기 어렵거나 햇갈릴 경우에 인터페이스를 보면 훨씬 더 간단하게 어떤 메소드가 있는지 파악할 수 있기 때문에 인터페이스를 사용합니다. 그리고, 오타나 잘못된 메소드 입력으로 인한 오류도 한 번 걸러주는 역할을 해줍니다.



 TestDAO 인터페이스에서 DB값을 출력해줄 메소드명을 입력해줍니다. 반환 되는 DB값이 여러 row이기 때문에 List<E>를 리턴값으로 지정해줍니다. <E>의 객체는 출력해줄 Bean을 import해서 넣어줍니다.


TestDAO.java

import java.util.List;


import hanazuou.imas.mlst.bean.TestBean;


public interface TestDAO {

public List<TestBean> test() throws Exception;

}




 


그 다음, 같은 패키지 안에서 TestDAO를 상속받은 [TestDAOImpl.java]클래스를 하나 만들어줍니다. 인터페이스를 상속받아서 만드는 방법은 위에 이미지의 화살표를 참고하시기 바랍니다.




 [TestDAOImpl.java]에서 사용되는 명령어들은 하나씩 글로 설명하면 햇갈리거나 어렵기 때문에 위에 코드에 직접 기재해 놓았습니다.


TestDAOImpl.java

import java.util.List;


import javax.inject.Inject;


import org.apache.ibatis.session.SqlSession;

import org.springframework.stereotype.Repository;


import hanazuou.imas.mlst.bean.TestBean;


@Repository

public class TestDAOImpl implements TestDAO {

private static final String namespace="hanazuou.imas.mlst.testMapper";

@Inject

private SqlSession sqlSession;

@Override

public List<TestBean> test() throws Exception{

// TODO Auto-generated method stub

return sqlSession.selectList(namespace+".test");

}


}




 DAO를 만든 것과 동일하게 service 패키지와 인터페이스, 인터페이스를 상속받은 Impl 파일도 동일하게 만듭니다.

 DAO가 DB값 입출력을 담당한다면, service는 DAO에서 입력하거나 출력할 때 가공을 하는 역할을 합니다. 

 예를 들어 DB에서 매출, 매입 값을 불러왔다면, 순이익을 계산하기 위해서 service 안에 (매출-매입=순이익)이라는 공식을 넣어서 service로 순이익 값을 구하고 컨트롤러로 넘길 때 사용합니다.

 즉, 컨트롤러는 최대한 페이지만을 전환하는 역할을 하도록하고 연산이 필요할 경우 service에서 연산을 하도록 합니다.


DAO

DB 입출력을 담당


Service

연산을 담당


Controller

페이지 전환을 담당


 이렇게 역할을 분리하여 사용할 수 있는 점이 스프링 프레임워크의 큰 장점이기 때문에 가능하면 위에처럼 사용할 수 있게 코딩을 해주는게 좋습니다.




 [TestServiceImpl.java]는 TestDAO를 Inject 해서 DAO의 메소드를 사용해서 최종적으로 컨트롤가 사용할 수 있도록 만들어 줍니다.


TestServiceImpl.java

import java.util.List;


import javax.inject.Inject;


import org.springframework.stereotype.Service;


import hanazuou.imas.mlst.DAO.TestDAO;

import hanazuou.imas.mlst.bean.TestBean;


@Service

public class TestServiceImpl implements TestService {

@Inject

private TestDAO dao;

@Override

public List<TestBean> test() throws Exception {

// TODO Auto-generated method stub

return dao.test();

}


}



4. 컨트롤러 만들기



 이제 DB 값을 불러와서 웹브라우저로 출력해줄 Controller를 만듭니다.




@Inject

TestService service;

컨트롤러가 사용할 Service를 Inject 시킵니다.


@RequestMapping(value="/test",method = RequestMethod.GET)

value는 웹브라우저에서 사용할 주소값이고, method는 전송 방식입니다.


public String test(Model model) throws Exception{}

DB 값을 받아서 웹 브라우저로 보낼 것이기 때문에 메소드 매개변수로 Model을 추가해줍니다.


list = service.test();

service에 있는 test() 메소드를 실행시키고 DB값을 받습니다.


model.addAttribute("list",list)

Model에 DB값이 담긴 List<E>를 넣어줍니다. "list"는 반환된 jsp에서 쓸 변수명이고, list는 service로 부터 값을 받은 변수명입니다.


return "test"

"localhost:8080/프로젝트/test" 가 입력 되면 "test.jsp" 로 이동시킵니다.


TestController.java

import java.util.List;


import javax.inject.Inject;


import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;


import hanazuou.imas.mlst.bean.TestBean;

import hanazuou.imas.mlst.sevice.TestService;


@Controller

public class TestController {

@Inject

TestService service;

@RequestMapping(value="/test",method = RequestMethod.GET)

public String test(Model model) throws Exception {

List<TestBean> list;

list = service.test();

model.addAttribute("list",list);

return "test";

}

}





5. 컨트롤러에서 넘어온 Model을 JSP에서 JSTL로 출력하기



 컨트롤러로부터 넘어온 Model에 대한 값을 받아서 출력시킬 JSP 파일을 만들기 전에 먼저 character encording 설정을 해줍니다. [window] ▶ [Preferences]에 들어갑니다.




 좌측 내비게이션을 통해서 [Web]을 찾아서 위에 이미지처럼 [CSS], [HTML], [JSP Files]의 Encording을 UTF-8로 변경해줍니다.




 그 다음, [src/main/webapp/WEB-INF/views] 폴더에서 [test.jsp] 파일을 생성합니다.




 [test.jsp] 파일을 생성한 후에, 상단에 jstl taglib를 넣어줍니다. 스프링 메이븐에 기본적으로 포함되어 있기 때문에 오류없이 추가가 되지만, 만약 jstl 라이브러리가 없다면 메이븐으로 받기 바랍니다.

 Model의 값을 출력하기 위해 <c:forEach> 태그를 사용합니다. 


 items="${list}"

 Model이 가지고 온 변수명


 var="test"

 forEach 문에서 사용할 변수명. 자유롭게 입력하시면 됩니다.


 ${test.test_INT}

 앞에 test는 forEach문에 사용하기 위에 입력한 변수명입니다. test_INT는 Model 안에 있던 JavaBean(DB 컬럼명)입니다.


test.jsp

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

    pageEncoding="UTF-8"%>

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>   

<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>test</title>

</head>

<body>

<c:forEach items="${list}" var="test">

int = ${test.test_INT }<br>

test = ${test.test_TEXT}<br>

date = ${test.test_DATE }<br>

double = ${test.test_DOUBLE }<br>

</c:forEach>

</body>

</html>




 마지막으로 [Run as Server]를 눌러서 서버(WAS)로 돌립니다. 서버에 오류가 없이 정상적으로 구동이 되면 "localhost:8080/프로젝트/test"를 주소창에 입력해서 DB에서 불러온 값이 나오는지 확인합니다.


 이것으로 MyBatis를 DB(MariaDB, MySQL)에 연동시킨 후 DAO, Service, Controller, JSTL을 사용해서 DB 값을 출력하는 테스트를 마쳤습니다. 이제 이를 응용해서 DB에 값을 자유롭게 출력하고 변환시킬 수 있습니다.



도움이 되셨으면 공감을 눌러주세요!