2022.01.14 TIL

서승원·2022년 1월 14일
0

TIL

목록 보기
54/68
post-thumbnail

EL을 활용한 방법

먼저 EL에 대해 알아보면 Expression Language 로 jsp표준기술로많이 사용되면 간단한 계산이나, attribute에 직접적으로 접근할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@ page contentType="text/html; charset=utf-8" pageEncoding="EUC-KR"
    import="java.util.*"%><%
    String[] l = new String[]{"apple","banana","orange","kiwi"};
    request.setAttribute("abcd",l);
    
    List<String> l2 = new ArrayList<String>();
    l2.add("apple"); l2.add("banana"); l2.add("orange"); l2.add("kiwi");
    request.setAttribute("xyzz",l2);
    
%>
<!DOCTYPE html>
<html>
<head>
 
<body>
    ${abcd[0]} ${abcd[1]} ${abcd[2]} ${abcd[3]} 
    ${xyzz[0]} ${xyzz[1]} ${xyzz[2]} ${xyzz[3]}     
    ${xyzz.get(0)}
</body>
</html>
cs
jsp 파일에서 봤을 때, java로 배열과 List를 각각 생성해 EL 을 활용해서 해당 값을 가져오는 방법이다.
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
<%@ taglib prefix="q" uri="http://java.sun.com/jsp/jstl/core"%><%
    String[] l = new String[]{"apple","banana","orange","kiwi"};
    request.setAttribute("abcd",l);
    
    List<String> l2 = new ArrayList<String>();
    l2.add("apple"); l2.add("banana"); l2.add("orange"); l2.add("kiwi");
    request.setAttribute("xyzz",l2);
    
%>
<!DOCTYPE html>
<html>
<head>
 
<body>
    <q:forEach begin="0" end="5" varStatus="vs">
        ${vs.count-1}
    </q:forEach>
    
    <q:forEach items="${abcd}" var="t">
        ${t}
    </q:forEach>
    
    <q:forEach items="${xyzz}" var="x">
        ${x}
    </q:forEach>
</body>
</html>
cs
for문은 forEach로 다음과 같이 사용할 수 있다. xyzz 로 지정된 Attribute를 items 로 지정해 반복문에 포함시킬 수 있다.
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
<%@ page contentType="text/html; charset=utf-8" pageEncoding="EUC-KR"
    import="java.util.*, banana.*"%>
<%@ taglib prefix="q" uri="http://java.sun.com/jsp/jstl/core"%><%
 
    Bang06VO vo = new Bang06VO();
    vo.setContent("apple");
    vo.setAuthor("banana");
    
    List<Bang06VO> l = new ArrayList<Bang06VO>();
    l.add( vo );
    l.add( vo );
    l.add( vo );
    request.setAttribute("abcd" , l );
    
%>
<!DOCTYPE html>
<html>
<head>
 
<body>
    <q:forEach items="${abcd}" var="t">
        ${t.content}
        ${t.author} <br/>
    </q:forEach>
    
    <table border="1" cellspacing="0" cellpadding="8">
        <q:forEach items="${abcd}" var="t">
            <tr>
                <td>${t.content}</td>
                <td>${t.author}</td>
                <q:if test="${true}">
                    <td><img src="down.svg"></td>
                </q:if>
                <q:choose>
                    <q:when test="${empty t.fsn}">
                        <td><img src="down.svg"></td>
                    </q:when>
                    <q:otherwise>
                        <td>[다운]</td>
                    </q:otherwise>
                </q:choose>
            </tr>
        </q:forEach>
    </table>
</body>
</html>
cs
이것을 활용해서 다시 게시판을 나타내는 jsp 파일을 추려봤다. 계속해서 진행하는 코드의 핵심은 jsp와 java 파일의 역할을 확실하게 나누고, 코드의 내용 역시 사용하는 언어로 더 나눠진다는 것이다. 이제 jsp에 남아있는 java는 리스트 l 을 가져와서 setAttribute 하기위한 부분만 남았다.

Jdbc Template

Spring에서 jdbc 를 이용하는 방식으로 다시 이를 이용해 console에 간단하게 게시판을 나타내는 코드를 짜봤다.

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
public class JdbcTemplate {
    public <R> List<R> query( String sql , RowMapper<R> rowMapper) throws Exception 
    {        
        List<R> rl = new ArrayList<R>();
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("org.mariadb.jdbc.Driver");
            conn = DriverManager.getConnection(
                "jdbc:mariadb://183.111.242.21:3306/pukyung05",
                "pukyung05","pukyung00!!1");
            stmt = conn.prepareStatement("SELECT * FROM bang_06_T WHERE no > ?");
            stmt.setInt( 110 );
            rs = stmt.executeQuery();
                
            while( rs.next() ) {
                R vo = rowMapper.mapRow(rs);
                rl.add( vo );
            }
        }
        catch( Exception e ) {
            throw e; 
        }
        finally {
            if( rs != null ) rs.close();
            if( stmt != null ) stmt.close();
            if( conn != null ) conn.close();
        }        
        return rl;
    }
cs
가장 기본이 되는 JdbcTemplate 이다. 제너릭을 활용해서 사용하게 될 함수의 O-R Mapping에 맞춰서 커스텀이 가능할 것이다. qeury 함수는 제너릭을 이용한 List를 리턴하고, 매개변수로는 sql문과 제너릭을 이용한 RowMapper를 취한다. 그리고 jdbc 문을 통해서 SELECT sql문을 실행시키고, 기존의 while문에서 인스턴스에 rs의 결과를 대입하고, 그를 리스트에 추가하는 코드가 대체된 것으로 봤을 때 , RowMapper 클래스의 mapRow 함수가 그런 기능을 할 것이란 것을 알 수 있다.
1
2
3
4
5
public interface RowMapper<X> {
    public X mapRow( ResultSet rs ) throws SQLException;
        
}
 
cs
RowMapper 인터페이스다. 마찬가지로 제너릭을 사용해서 교체가가능하도록 만들었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
public class RowMapper_Bang06 implements RowMapper<Bang06VO>{
    @Override
    public Bang06VO mapRow(ResultSet rs) throws SQLException {
        Bang06VO vo = new Bang06VO();
        vo.setNo( rs.getInt("no") );
        vo.setContent( rs.getString("content") );
        vo.setAuthor( rs.getString("author") );
        vo.setFsn( rs.getString("fsn") );
        vo.setOfn( rs.getString("ofn") );
        return vo;
    }
 
}
cs
그로부터 상속을 받아 RowMapper_bang06 을 생성했다. O-R Mapping에 맞춘다는 말에 맞도록 제너릭을 Bang06VO 로 하고, 그에맞는 mapRow 함수를 오버라이딩 해주는데, 역시 JdbcTemplate에서 유추한 바와 같도록 sql 문으로부터 얻은 ResultSet의 하나의 레코드를 하나의 인스턴스에 대입한 뒤 그 인스턴스를 리턴하는 함수가 된다.
1
2
3
4
5
6
7
8
public class Test545 {
    public static void main( String[] args ) throws Exception {
        JdbcTemplate jtpl = new JdbcTemplate();
        
        List<Bang06VO> rl = jtpl.query("SELECT * FROM bang_06_T" ,new RowMapper_Bang06() );
        for( Bang06VO t : rl ) {
            System.out.println( t.getNo() + "," + t.getContent() );
        }
cs
보여지게 되는 Test545.java 이다. 비록 console 에만 나타낼 목적으로 간소화시키긴 했지만 기존의 코드들에 비해 더 간결해졌고, 에러 처리에 대한 부담도 상당히 줄어들었다. query 에 매개변수를 입력하고 그를 리스트에 대입하기만 하는 것이 끝인 코드가 됐다. 이 방법을 이용해서 RowMapper만 OR MAPPING 을 지켜 잘 설계해준다면 간단한 설계가 가능해진다.
profile
2년차 백엔드 개발자, crimy

0개의 댓글