3월 3일

SJY0000·2022년 3월 3일
0

Android

목록 보기
4/15

오늘 배운 것

  • TODO Project의 User REST API 서버 사용해보기(2)
  • retrofit 사용해보기

doDelete 완성

	@Override
	protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doDelete() 호출됨");
		addCount();
		
		request.setCharacterEncoding("utf-8"); // 한글처리
		
		String userName = request.getParameter("userName");
		
		userDao.delete(userName);
		
		UserResult userResult = new UserResult();
		userResult.setSuccess(true);
		
		String strJson = gson.toJson(userResult);
		
		sendResponse(strJson, response);
	}

REST API 서버에서 작동하는 SQL메소드

public int registerUSer(User user) { // 결과가 성공이면 1, 실패면 0이하 (에러나면 - 출력) RETURN
		String INSERT_USER_SQL = "INSERT INTO users(firstName, lastName, userName, password) "
									+ "VALUES (?, ?, ?, ?)";
		
		int result = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		try {
			conn = JDBCUtils.getConnection();
			pstmt = conn.prepareStatement(INSERT_USER_SQL);
			pstmt.setString(1, user.getFirstName());
			pstmt.setString(2, user.getLastName());
			pstmt.setString(3, user.getUserName());
			pstmt.setString(4, user.getPassword()); // pstmt 완성
			
			// 결과 실행의 갯수를 result에 저장 = 1 실패면 0
			result = pstmt.executeUpdate();	// pstmt 실행, 결과가 없는 Update, Delete, Drop, Insert 등은 executeUpdate() 사용
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.close(conn, pstmt);
		}
		return result;
	}
	
	public User getUserByUserName(String userName) {
		User user = null;
		
		String sql = "SELECT * FROM users WHERE userName = ?";
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			conn = JDBCUtils.getConnection();
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, userName);
			
			rs = pstmt.executeQuery();
			
			if (rs.next()) {
				user = new User();
				user.setFirstName(rs.getString("firstName"));
				user.setLastName(rs.getString("lastName"));
				user.setUserName(rs.getString("userName"));
				user.setPassword(rs.getString("password"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.close(conn, pstmt, rs);
		}
		
		return user;
	}
	
	public List<User> getAllUsers() {
		List<User> userList = new ArrayList<User>();
		
		String sql = "SELECT * FROM users ORDER BY userName ASC";
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			conn = JDBCUtils.getConnection();
			
			pstmt = conn.prepareStatement(sql);
			
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				User user = new User();
				user.setFirstName(rs.getString("firstName"));
				user.setLastName(rs.getString("lastName"));
				user.setUserName(rs.getString("userName"));
				user.setPassword(rs.getString("password"));
				
				userList.add(user);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.close(conn, pstmt);
		}
		return userList;		
	} // getAllUsers
	
	public void update(User user) {
		String sql = "";
		sql += " UPDATE users ";
		sql += " SET firstName = ?, lastName = ? ";
		sql += " WHERE userName = ? ";
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			conn = JDBCUtils.getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, user.getFirstName());
			pstmt.setString(2, user.getLastName());
			pstmt.setString(3, user.getUserName());
			
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.close(conn, pstmt);
		}
		
	}
	public void delete(String userName) {
		String sql = "DELETE FROM users WHERE userName = ?";

		Connection conn = null;
		PreparedStatement pstmt = null;
		
		try {
			conn = JDBCUtils.getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, userName);

			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.close(conn, pstmt);
		}
		
	} // delete

-- REST API 서버 만들기 --


retrofit 라이브러리 사용해보기

  • retrofit 라이브러리를 이용하면 Web서버에 접근을 할 수 있게 해줌
  • retrofit을 사용하려면 연관된 라이브러리들이 필요하기 때문에 MavenProject를 생성하여 라이브러리 관리를 간편하게 사용 할 수 있음

https://mvnrepository.com/ 에서 원하는 라이브러리 검색 후 maven탭에서 복사

  • maven탭에서 복사한 데이터를 dependencies태그 안에다가 넣고 저장하면 자동으로 관련 라이브러리들이 다운로드됨(사용자/이름/.m2/repository 폴더에 다운로드 됨)

기존에 만든 Bean파일들을 프로젝트에 가져옴

  • retrofit 라이브러리는 Interface를 이용하여 작동함
  • REST API 서버를 만들어 놓은 SERVLET 주소로 접근
public class EX1 {

	public static void main(String[] args) {
		Retrofit retrofit = new Retrofit.Builder()
										.baseUrl("http://localhost:8090/")
										.addConverterFactory(GsonConverterFactory.create())
										.build();
		UserService userService = retrofit.create(UserService.class);
		
		// 네트워크로 요청할 정보객체
		Call<UserOneResult> call = userService.getUser("one", "hong");
	
		call.enqueue(new Callback<UserOneResult>() {
			// 익명메소드
			// 네트워크 요청을 보냄, 서버로부터 응답이 오면 Callback객체의 onResponse 또는 onFailure가 호출됨
			public void onResponse(Call<UserOneResult> call, Response<UserOneResult> response) {
				// isSuccessful 메소드로 200번대 정상 응답이 아닌 경우 (응답코드가 300, 400, 500번대 인 경우)
				if (response.isSuccessful() == false) {
					System.out.println("onResponse 에러");
					return;
				}
				// isSuccessful 메소드로 200번대 정상 응답이 아닌 경우
				System.out.println("onResponse 성공");
				UserOneResult userOneResult = response.body();
				System.out.println("응답결과 :" + userOneResult.toString());
				
			}

			public void onFailure(Call<UserOneResult> call, Throwable throwable) {
				System.out.println("onFailure 에러 : " + throwable.getMessage());
				
			}
		});
	}// main
  • retrofit을 사용하기 위한 Interface
  • @어노테이션으로 전송방법을 결정할 수 있음
  • 시멘틱태그로 Bean 모델 형식으로 데이터를 보낼 수 있음
// Retrofit 객체의 create 메소드에 의해 자동으로 구현 객체를 만들 수 있음
// 구현된 서비스 객체의 용도는 GET, POST, PUT, DELETE 요청을 담당하는 메소드를 가짐
public interface UserService {

	@GET("todo/api/user/") // 필수 Parameter가 있다면 같이 넣어줘야함
	Call<UserOneResult> getUser(
			// 동적으로 변경해야하는 Parameter는 @Query 어노테이션을 이용해서 메소드를 호출 할 때 마다 값을 넘겨받는다	
				@Query("category") String category, 
				@Query("userName") String userName // @Query->변수명
				);
//		(@Query("category") = String category) = (category = 값) parameter 받을 떄 주소에 넣는 것 처럼

//	@GET("TODO/api/user/")
//	Call<UserOneResult> getUser(@QueryMap Map<String, String> options);
	
	@GET("todo/api/user/")
	Call<UserListResult> getUsers(@Query("category") String category);
	
	@POST("todo/api/user/")
	Call<UserResult> createUser(@Body User user); // @Body->문자열을 json타입으로 변환시켜서 전송
	
	@PUT("todo/api/user/")
	Call<UserResult> updateUser(@Body User user);
	
	@DELETE("todo/api/user/")
	Call<UserResult> deleteUser(@Query("userName") String userName);
}

0개의 댓글

관련 채용 정보