본문 바로가기

안녕하세요!

프로그래밍 언어/Java

[ Java ] DAO, VO, Service 활용한 리스트 불러오기


 

Controller, Service, DAO, VO


 

Controller


 

Controller

Request를 "어떻게" 처리할 것인지 정의하는 곳이다.

@Controller 어노테이션을 사용하여 Controller 기능을 작동시킨다.

 

Service


 

Service

Request에 대해 "어떠한" 처리를 할지 결정하는 곳이다.

Controller에서 받은 Request에 관한 데이터 정보를 재가공해 Controller에 Data를 전달한다.

@Service 어노테이션을 사용해 Service 기능을 작동시킨다.

 

DAO


 

DAO(Data Access Object)

DB에 저장돼 있는 Data에 접근하기 위한 객체이다.

SQL 쿼리문을 작성하여 Connection 메서드를 생성 및 close하는 작업을 진행하는 곳이다.

DB에 관한 로직을 DAO 내에서 수행하도록 하여 오버헤드를 줄일 수 있다는 장점이 있다.

 

VO


 

VO(Value Object)

도메인에서 하나 이상의 속성들을 묶어서 특정 값을 나타내는 객체이다. 

setter가 없어 불변성을 가지기에 참조를 통해 공유해도 부작용이 없다.

equals와 hashcode 메소드를 재정의함으로써 동등한 값을 가질 수 있다.

 

휴일 리스트 불러오기


 

이제 휴일 지정을 위한 로직을 구성해볼 것이다.

날짜를 등록하였을 때. 등록된 휴일을 리스트에 뿌릴 것이다.

 

HolidayDAO.java


 

private String HOLIDAY_LIST =
	"SELECT YEAR, MONTH, DAY FROM SQL_HOLIDAY_LIST";

public List holidayList(Connection conn, String year, String month, String day) throws SQLException {
	
    PreparedStatement pstm = conn.prepareStatement(HOLIDAY_LIST);
    ResultSet rs = pstm.executeQuery();
    List resultList = new ArrayList();
    HolidayVO vo = null;
    
    while(rs.next()) {
    	
        vo = new HolidayVO();
        vo.setYear(CommonUtil.checkNull(rs.getString("YEAR"),""));
        vo.setMonth(CommonUtil.checkNull(rs.getString("Month"),""));
        vo.setDay(CommonUtil.checkNull(rs.getString("Day"),""));
        
        resultList.add(vo);
    }
    pstmt.close();
    return resultList;
}

 

PreparedStatement


 

메서드 타입 설명
execute() boolean 쿼리 실행 후, 반환값이 ResultSet 객체인 경우 true를,
혹은 결과 값이 없다면 false 반환
executeUpdate() int 쿼리 실행 후 적용된 행의 개수 반환  
executeQuery() ResultSet 쿼리 실행 후, 조회된 결과를 ResultSet에 저장해 테이블 형식으로 반환

 

메서드 설명
setString(n, 텍스트) n번째 물음표에 텍스트를 String 타입으로 삽입
setInt(n, 정수) n번째 물음표에 정수를 Integer 타입으로 삽입
setDouble(n, 실수) n번째 물음표에 실수를 Double 타입으로 삽입

 

PreparedStatement는 

SQL 쿼리를 실핼할 때 사용하는 클래스이다.

Connection를 인자값으로 받아와 DB와 연결시킨다.

어떤 쿼리문을 넘겨줄지 Connection.PrepareStatement(쿼리문)으로 명시해 준다.

 

ResultSet


 

ResultSet 객체는

executeQuery와 같은 메서드와 함께 사용하여 결과 값을 저장할 수 있다.

저장된 Data를 한 행의 단위로 타입을 지정해 호출할 수 있다.

ResultSet rs = PreparedStatement.executeQuery()

HOLIDAY_LIST 쿼리문의 결과 값을 ResultSet에 저장하게 된다.

 

close()


 

Service에서 데이터 가공 과정에서 DB Connection을 시도할 것인데,

자원 낭비를 줄이기 위해 close() 메서드를 반드시 사용해야 한다.

 

ArrayList()


 

List resultList = new ArrayList()

List 객체를 ArrayList() 메서드로 선언한다.

getter 메서드를 통해 YEAR, MONTH, DAY의 값이 저장된 VO의 값을 배열에 추가해 준다.

마지막으로 resultList를 return 해주면 된다.

HolidayService.java


 

public class HolidayService {

    WriteLog log = WriteLog.getInstance();

    Connection      conn    = null;
    SqlConnection   sq      = null;
    HolidayDAO      hdDao   = null;

    public HolidayService() {
        hdDao = new HolidayDAO();
    }

    public List holidayList(String year, String month, String day) {

        SqlConnection sq = new SqlConnection();
        List resultList = null;
        sq = new SqlConnection();
    
        try {
            sq.createConnection(Common.DB);
            conn = sq.getConnection();
            conn.setAutoCommit(false);
    
            // DAO 호출
            resultList = hdDao.holidayList(conn, year, month, day);

        } catch (SQLException e) {
            e.printStackTrace();
            resultList = null;

            try {
                log.log("sql_Err", "holidayList", e.toString());
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        finally {
            try {
                if(!conn.isClosed()) {
                    conn.close();
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            sq.closeConnection();
        }
        return resultList;
    }
}

 

SqlConnection


 

SqlConnection

SQL 서버에 접속학 위한 클래스이다.

sq = createConnection(Common.DB)

createConnection() 메서드를 사용하면 DB와 서버를 연결하는 객체를 만들 수 있고,

각종 쿼리를 실행시킬 수 있게 된다.

createConnection() 메서드에는 인자로 DB에 대한 정보를 넣어주면 된다.

 

List 객체를 null 값으로 resultList로 초기화 한다.

HolidayDAO에 저장된 데이터를 불러와 DB 서버 연결 및 쿼리문 실행을 시도한다.

 

HolidayList.java


 

public class HolidayList extends Common {
    public void doContent(IPortalComponentRequest request, IPortalResponse response) {

        HolidayService service = new HolidayService();

        String year     = Common.checkNull(request.getParameter("year"), "%")
        String month    = Common.checkNull(request.getParameter("month"), "%")
        String day      = Common.checkNull(request.getParameter("day"), "%")

		/**
        if(!"%".equals(year.trim())) {
            year = "%" + year + "%";
        }
        if(!"%".equals(month.trim())) {
            month = "%" + month + "%";
        }
        if(!"%".equals(day.trim())) {
            day = "%" + day + "%";
        } */

        List holidayList = service.holidayList(year, month, day);

        request.getServletRequest().setAttribute("year", Common.checkNull(request.getParameter("year"), ""));
        request.getServletRequest().setAttribute("month", Common.checkNull(request.getParameter("month"), ""));
        request.getServletRequest().setAttribute("day", Common.checkNull(request.getParameter("day"), ""));
        request.getServletRequest().setAttribute("holidayList", holidayList);

        Iresource resource = request.getResource(IResource.JSP, "jsp/holiday_List.jsp");
        response.include(request, resource);

    }
}

 

IPortalComponentRequest


 

IPortalComponentRequest

SAP에서 제공하는 인터페이스이며,

com.sapportals.portal.component로 객체를 불러올 수 있다.

모든 Request나 Response 등을 사용해 Data의 흐름을 제어할 수 있다.

 

IResource


 

IResource 인터페이스는

script, image 정적 페이지, xml, jsp 등의 Resource를 불러와

view로서 작용시켜 준다.

 

IResource resource = request.getResource(IResource.JSP, "jsp/holiday_list.jsp")

IResource에 JSP 형식의 파일 중 holiday_list.jsp를 불러와 view로 적용시킨다.

 

equals()


 

checkNull() 메서드는 null 값을 체크하는 함수이며, Common 파트에 따로 정의돼 있다.

여기서 getParameter("year"), "%"의 "%"는 year라는 String 값을 %라는 키 값으로 선언한 것이다.

만약 특정 년도의 Data를 검색하는 등의 작업에서 해당 킷값을 활용해 간단한 함수를 구성할 수도 있을 것이다.

 

주소 값을 비교하는 '=='와 달리,

equals() 메서드는 객체끼리 내용을 비교한다.

새롭게 함수를 생성하는 등의 작업이 이루어지면 주솟값은 변하기 때문에

둘 중 어느 것을 써야할 것인지 잘 확인해야 한다.

 

holiday_list.jsp


 

<tr>
    <%
        int listSize = 0;
        HolidayVO vo = null;

        if(holidayList!=null) {
            listSize = holidayList.size();
        }
    %>

    <%
        if(listSize!=0) {
            for(int i=0; i<listSize; i++) {
                vo=(HolidayVO)holidayList.get(i);
            }
        }
    %>
        <td class="center"><%=vo.getYear()%></td>
        <td class="center"><%=vo.getMonth()%></td>
        <td class="center"><%=vo.getDay()%></td>
    <%
        <tr class="white">
            <td class="center" colspan="9">
                등록된 휴일이 없습니다.
            </td>
        </tr>
    %>  
</tr>

 

%를 사용해 Javascript문으로

HolidayVO에 정의해 두었던 getter 메서드로 데이터를 뿌려준다.

반응형

 

728x90
반응형

loading