3월 15일

SJY0000·2022년 3월 15일
0

Android

목록 보기
11/15

오늘 배운 것

  • TODO프로젝트 이용해서 TODO App만들기(6)
  • REST API Server 수정

MainActivity 화면만들기

대략적인 화면

표현할 item들의 layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <!-->카드형태를 만들 때 주로 사용,elevation = 살짝 띄움 그림자효과<-->
    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:cardBackgroundColor="#FFFFFFFF"
        app:cardCornerRadius="10dp"
        app:cardElevation="5dp"
        app:cardUseCompatPadding="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/img1"
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:padding="5dp"
                app:srcCompat="@mipmap/ic_launcher" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tvTitle"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="5dp"
                    android:text="할일 제목"
                    android:textSize="26sp"
                    android:textStyle="bold" />

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal">

                    <TextView
                        android:id="@+id/tvTagetDate"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_margin="5dp"
                        android:layout_weight="2"
                        android:text="목표일자"
                        android:textSize="20sp"
                        android:textStyle="bold" />

                    <TextView
                        android:id="@+id/tvDone"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_margin="5dp"
                        android:layout_weight="1"
                        android:gravity="right"
                        android:text="완료여부"
                        android:textAlignment="center"
                        android:textSize="20sp"
                        android:textStyle="bold" />

                </LinearLayout>
            </LinearLayout>
        </LinearLayout>
    </androidx.cardview.widget.CardView>
</LinearLayout>


REST API SERVER 수정

TodoDao 할 일을 가져오는 메소드 추가하기

  • left outer join으로 1:N의 관계로 DB의 데이터를 검색하고 연관데이터들을 간편하게 가져오기위해서 메소드 생성
  • 원하는 데이터만 가져오기위해 새로 메소드 생성함
  • 순서정보까지 가져오기 위하여 list사용
// 외부 조인해서 가져오기 메소드
	public User getUserAndTodos(String userName) {
		User user = null;
		List<Todo> todoList = new ArrayList<Todo>();
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		String sql = "";
		sql += " SELECT u.id as user_id, u.password, u.userName, u.firstName, u.lastName, ";
		sql += " t.id as todo_id, t.title, t.description, t.target_date, t.is_done ";
		sql += " FROM users u LEFT OUTER JOIN todos t on u.userName = t.username ";
		sql += " WHERE u.userName = ? ";
		sql += " ORDER BY target_date DESC ";
		
		try {
			conn = JDBCUtils.getConnection();
			
			// 이렇게 설정하면 rs에서 커서를 마음대로 움직일 수 있음
			pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
			pstmt.setString(1, userName);
			
			rs = pstmt.executeQuery();
			
			while (rs.next()) {
				Todo todo = new Todo();
				
				todo.setId(rs.getLong("todo_id"));
				todo.setTitle(rs.getString("title"));
				todo.setDescription(rs.getString("description"));
				todo.setTargetDate(rs.getDate("target_date").toLocalDate());
				todo.setStatus(rs.getBoolean("is_done"));
				
				todoList.add(todo); // 리스트에 추가
			} // while
			
			// 1:N일 경우 1은 반복적인 데이터 이니 한 번만 등록
			// 마지막 데이터 행으로 커서위치로 이동
			if (rs.last()) {
				user = new User();
				user.setUserName(rs.getString("userName"));
				user.setFirstName(rs.getString("firstName"));
				user.setLastName(rs.getString("lastName"));
				user.setPassword(rs.getString("password"));
				
				user.setTodolist(todoList);
			};
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.close(conn, pstmt, rs);
		}
		
		return user;
	}// getUserAndTodos
	
	
	public List<User> getAllUserAndTodoCount() {
		List<User> userList = new ArrayList<User>();
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		String sql = "";
		sql += " SELECT u.id as user_id, u.userName, u.firstName, u.lastName, ";
		sql += " COUNT(t.username) as todo_count ";
		sql += " FROM users u LEFT OUTER JOIN todos t on u.userName = t.username ";
		sql += " GROUP BY u.userName ";
		sql += " ORDER BY target_date DESC ";
		
		try {
			conn = JDBCUtils.getConnection();
			
			pstmt = conn.prepareStatement(sql);
			
			rs = pstmt.executeQuery();
			
			while (rs.next()) {
				User user = new User();
				user.setUserName(rs.getString("userName"));
				user.setFirstName(rs.getString("firstName"));
				user.setLastName(rs.getString("lastName"));
				user.setTodoCount(rs.getInt("todo_count"));
				
				userList.add(user);			
			} // while

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.close(conn, pstmt, rs);
		}
		
		return userList;
	}// getUserAndTodos

User bean에 변수추가

Integer로 받는 이유는 Integer가 객체이기 때문에 null 값이 들어와도 에러가 생기지 않고 받을 수 있다.

	private List<Todo> todolist; // 테이블 조인에서 1:N의 관계(1에다가 설정)
	private Integer todoCount;

List<User>와 totalCount를 받을 bean 클래스를 생성

package todoApp.rest.todo;

import java.util.List;

import todoApp.model.User;

public class TodoListUsersResult {

	private boolean hasResult;
	private int totalCount;
	private List<User> userlist; // 조인결과로 user가 todoList를 포함함
	
	public boolean isHasResult() {
		return hasResult;
	}
	public void setHasResult(boolean hasResult) {
		this.hasResult = hasResult;
	}
	public int getTotalCount() {
		return totalCount;
	}
	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}
	public List<User> getUserlist() {
		return userlist;
	}
	public void setUserlist(List<User> userlist) {
		this.userlist = userlist;
	}
	
	@Override
	public String toString() {
		return "TodoListUsersResult [hasResult=" + hasResult + ", totalCount=" + totalCount + ", userlist=" + userlist
				+ "]";
	}

}

doGet의 메소드 수정

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("TodoRestServlet doGet() 호출됨");
		
		// 레코드 한개 조회
		// http://localhost:8090/todo/api/todo?category=one&id=1
		
		// 레코드 특정 사용자의 데이터(여러개) 조회
		// http://localhost:8090/todo/api/todo?category=me&username=hong
		
		// 레코드 전체(여러개) 조회
		// http://localhost:8090/todo/api/todo?category=all
		String category = request.getParameter("category");
		String strJson = "";
		
		if (category.equals("one")) {
			strJson = processGetOne(request);
		} else if (category.equals("me")) {
			strJson = processGetMe(request);
		} else if (category.equals("all")) {
			strJson = processGetAll(request);
		}
		sendResponse(strJson, response);
	}

	private String processGetOne(HttpServletRequest request) {
		String strId = request.getParameter("id");
		long id = Long.parseLong(strId);
		
		Todo todo = todoDao.selectTodo(id);
		
		TodoOneResult todoOneResult = new TodoOneResult();
		
		if (todo != null) {
			todoOneResult.setTodo(todo);
			todoOneResult.setHasResult(true);			
		} else {
			todoOneResult.setHasResult(false);
		}
		String strJson = gson.toJson(todoOneResult);
		System.out.println("strJson = " + strJson);
		return strJson;
	}
	
	private String processGetMe(HttpServletRequest request) {
		String username = request.getParameter("username");
		
		User user = todoDao.getUserAndTodos(username);
		
		TodoListResult todoListResult = new TodoListResult();
		
		if (user != null) {
			todoListResult.setHasResult(true);
			todoListResult.setTotalCount(user.getTodolist().size());
			todoListResult.setUser(user);
		} else { // user == null 
			todoListResult.setHasResult(false);
			todoListResult.setTotalCount(0);
		}

		
		String strJson = gson.toJson(todoListResult);
		System.out.println("strJson = " + strJson);
		return strJson;
	}
	
	private String processGetAll(HttpServletRequest request) {
		List<User> userList = todoDao.getAllUserAndTodoCount();
		
		TodoListUsersResult result = new TodoListUsersResult();
		
		if (userList.size() > 0) {
			result.setUserlist(userList);
			result.setHasResult(true);
			result.setTotalCount(userList.size());
		} else {
			result.setHasResult(false);
			result.setTotalCount(userList.size());
		}
		
		String strJson = gson.toJson(result);
		System.out.println("strJson = " + strJson);
		return strJson;
	} // doGet

0개의 댓글

관련 채용 정보