My footsteps

예외 처리 / 컬렉션 본문

국비수업/수업정리

예외 처리 / 컬렉션

밀김 2023. 5. 15. 09:38
728x90

 

 

 

 

 

 

 

 

 

 


< 아침복습 >
- xml: 서블릿이 실행될수 있는 url 주소를 매핑해주는 파일
- 어노테이션으로 바꾼 이유 : 서블릿 파일 내에서 편하게 맞는 url 주소를 매핑하려고
- 리퀘스트 : 클라이언트의 요청 정보를 꺼낼수 있게
- 리스폰스: 웹서버의 응답 정보를 담아서 보냄
- 서블릿이 하는 역할 : 클라이언트 요청 응답 처리 

package kr.co.rland.web.controller.menu;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.ArrayList;
import kr.co.rland.web.entity.Menu;

@WebServlet("/menu/list") 
public class ListController extends HttpServlet{
	//정적문서를 동적문서로 만드는 방법
	protected void service(HttpServletRequest request
         ,HttpServletResponse response){
		
//      ------< 사용자로부터 값 입력받기 >--------------------------------------------
		int page = 1; //기본 페이지 : 1페이지
		
		if(request.getParameter("page")!=null) {
			String page_ = request.getParameter("page");
			page = Integer.parseInt(page_); 			
		}//null이면 첫페이지를 띄우게. null이 아니면 
		//매핑에 쿼리스트링이 없을때 1로 뜨게끔 설정(=이 상태가 null)
		//@WebServlet("/menu/list")면 null /menu/list?page=1 이면 null이아님

        List<Menu> list = new ArrayList<>();
		
//      ------< 메뉴 목록 데이터를 가져오기 >--------------------------------------------
		{
			String driverClassName ="org.mariadb.jdbc.Driver";
			//jdbc드라이버의 전체 패키지 경로와 클래스 이름
	        String url = "jdbc:mariadb://db.newlecture.com:3306/rlanddb";
	        //jdbc 드라이버가 연결할 데이터베이스의 위치를 지정하는 url 
	     
	        
			int offset = (page - 1) * 10; // 1->0, 2->10, 3->20
			int size = 10;
	          
			
	         try {
	             Class.forName(driverClassName);
	             //jdbc 드라이버 클래스 이름을 사용하여 해당 클래스를 로드
	             Connection con = DriverManager.getConnection(url,"rland","20220823");
	             //드라이버매니저 메서드를 사용하여 db와의 연결을 설정
	             //연결
	              
	              PreparedStatement st = con.prepareStatement("select * from menu limit ?,10");
	              //db에 대한 PreparedStatement 쿼리문을 
	              //미리준비한다
	              
	              st.setInt(1,offset);
	              //위의 숫자로 바꾼 id를 쿼리문에 세팅
	              //첫번째 인자에 오프셋이 들어간다
	              
	              ResultSet rs = st.executeQuery();
	              //PreparedStatement 객체를 사용하여 작성된 쿼리문을 실행하고 그 결과로 얻어진 데이터를 담은
	              //ResultSet 객체생성
	              
	              
	              while(rs.next()) {
	         		 Menu menu = new Menu( //메뉴는 10줄중에서 한줄
	         				 rs.getInt("id"),
	         				 rs.getString("name"),
	         				 rs.getInt("price"),
	         				 rs.getString("img"),
	         				 rs.getDate("reg_date"),
	         				 rs.getInt("reg_member_id")
	         				 );
	         		 list.add(menu);
	              }
	              rs.close();
	              st.close();
	              con.close();
	          } catch (ClassNotFoundException e) {
	             e.printStackTrace();
	          } catch(SQLException e){
	             e.printStackTrace();
	          }
		}
		
		
		
//      ------< 사용자에게 데이터를 포함하는 문서"출력"하기 >--------------------------------------------
		{
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		
		PrintWriter out = response.getWriter();
		//국룰
		
		out.write("<!DOCTYPE html>");
		out.write("<html>");
		out.write("<head>");
		out.write("<meta charset=\"UTF-8\">");
		out.write("<title>insert title here</title>");
		out.write("</head>");
		out.write("<body>");
		out.write("	<header>");
		out.write("		<h1>메뉴 목록</h1>");
		out.write("		<ul>");
		for(Menu menu : list) {
			out.write("			<li><a href=\"detail?id="+menu.getId()+">"+menu.getName()+"</a></li>");		
		}
		out.write("			<li><a href=\"detail?id=737\">버터쿠키</a></li>");
		out.write("			<li><a href=\"detail?id=741\">딸기에이드</a></li>");
		out.write("			<li><a href=\"detail?id=748\">자바칩쿠키</a></li>");
		out.write("		</ul>");
		out.write("	</header>");
		out.write("</body>");
		out.write("</html>");
		}
	}

}

 

 

 


 

 

 

 

package kr;
import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import kr.co.rland.web.entity.Menu;


@WebServlet("/hello") // > url 매핑
public class Snippet extends HttpServlet{
	protected void service(HttpServletRequest request
	         ,HttpServletResponse response) throws IOException,ServletException{
		
		PrintWriter out = response.getWriter();
		//getwriter로 쓰고 printwriter로 받아주면 됨
		out.write("hello");
		//서블릿 구동부분
		
		//톰캣이 서블릿을 실행시켜줌 > 그럼 서블릿이 자기 할일을 함
		
		String name = request.getParameter("name");
		//요청이옴
		System.out.println(name);
		//요청받음(요청담음) > 콘솔출력
		
		int age = Integer.parseInt(request.getParameter("age"));
		System.out.println(age);
		
		

}
}

 

 

 

 

- 예외는 수정할수가 없다

 

 

 

예외처리 던지기(throw catch)

 

 

 

 

최종결정권자가 예외를 잡아서 처리하면 된다

 

 

 

 

 

이런식으로 식별자로써의 의미로 예외객체가 생긴다

 

 

 

 

 

예외처리 잡고 프로그램은 계속 진행됨. 안끝남

 

 

 

 

		//1000넘으면 오류로 인식하게 하기
		if(result>1000)
			throw new 천을넘은예외();
            
       //이렇게 하면 예외클래스(천을넘는예외)가 자동으로 만들어지고
       //메인에서 throw 천을넘는예외 넣어주면 된다
package ex1;
public class Calculator {
	private int x;
	private int y;
	//다른 값으로 계산한다면 static
	//계속 같은 값으로 계산한다면 인스턴스
	public static int add(int x,int y) throws 천을넘은예외 { //예외를 여러개 던질수 있기 때문에 throws
		int result = x+y;
		
		//1000넘으면 오류로 인식하게 하기
		if(result>1000)
			throw new 천을넘은예외();
		
		return result;
	}
	
	public static int sub(int x,int y) {
		int result = x-y;
		return result;
	}
	
	public static int multi(int x,int y) {
		int result = x*y;
		return result;
	}
	
	public static int div(int x,int y) {
		int result = x/y;
		return result;
	}		
}
package ex1;

public class 천을넘은예외 extends Exception {

}

 

 

 

 

 

 

package ex1;

public class Program {

	public static void main(String[] args){
		int result = 0;
		try {
			result = Calculator.add(1000, 40);
		} catch (천을넘은예외 e) {
			e.printStackTrace();
		}
		System.out.println(result);
	}

}
//이런식으로도 예외처리 가능 (써라운드)

 

 

 

 

- printStackTrace()를 쓰는건 좋지 않은 방법이다. 오류로 빨갛게 뜨는것보다 내선에서 sysout으로 어떤 오류가 있는지 부드럽게 얘기하는게 좋아..서...

 

 

 

 

 

 

 

 

 

- throw는 예외처리 클래스한테 예외처리 해달라고 하는거고, try-catch는 내가 알아서 예외 해결하는것

 

 

 

- Exception은 모든 오류를 말함

 

 

 

 

 

//예외가 한가지 이상일때의 방법 처리 방법
package ex1;
public class Program {

	public static void main(String[] args){
		
		int result = 0;
		
		try {
			result = Calculator.add(30, -39);
		} catch (천을넘은예외 e) {
//			e.printStackTrace();
			System.out.println("사용법:add(합계가 1000이 안되는 x,합계가 1000이 안되는 y)");
            //이런식으로 아예 사용법을 알려줄수도 있다
		} catch(음수가되는예외 e) {
			System.out.println("음수 오류!!");
		}
		
		System.out.println(result);
	}

}

 

 

 

 

- Exception이 위쪽에 있으면 얘가 모든 예외를 다 잡기 때문에 그 밑에는 catch문이 올수가 없다

 

 

 

 

 

- else처럼 예외처리문에도 finally라는게 있어서 마무리 작업하기에 좋다(예외처리와 관계없이 항상 실행되는 코드 작성)

package ex1;

public class Program {

	public static void main(String[] args){
		
		int result = 0;
		
		try {
			result = Calculator.add(30, -39);
		} catch (천을넘은예외 e) {
//			e.printStackTrace();
			System.out.println("사용법:add(합계가 1000이 안되는 x,합계가 1000이 안되는 y)");
		} catch(음수가되는예외 e) {
			System.out.println("음수 오류!!");
		} finally {
			System.out.println("마무리작업");
		}
		
		System.out.println(result);
	}

}

 

 

 

 

- 오류가 발생한곳에서 close를 해줘야한다

rs.close();

st.close();

con.close();

 

 

 

 

    try(
	        Connection con = DriverManager.getConnection(url,"rland","20220823");
	        PreparedStatement st = con.prepareStatement("select * from menu limit ?,10");
	        )
            
 //이런식으로 try안에 커넥션이랑 프리페얼드스테이트먼트를 넣으면 아래에서도 저 둘을 사용할수있고
 //예외가 발생하면 자동으로 .close()를 해주기 때문에 이 방법이 가장 적절한 방법이다
 //try안에 기본으로 close라는 메서드를 갖고 있기 때문에 자동으로 닫아줌!!

 

 

 

 

			String driverClassName ="org.mariadb.jdbc.Driver";
	        String url = "jdbc:mariadb://db.newlecture.com:3306/rlanddb";
	        Connection con = DriverManager.getConnection(url,"rland","20220823");
	        PreparedStatement st = con.prepareStatement("select * from menu limit ?,10");
	          
	        try(
	        		con;st

	        )
            //jdk 9.0에서는 이렇게 할수도 있다

 

 

 

 

 


 

 

 

 

 

< 컬렉션 > 

 

 

- 컬렉션 : 도구화된 배열

 

- 컬렉션의 장점은 인덱스를 거론하지 않고 넣을수 있다

 

 

 

 

 

 

- 값 형식(int같은것들)들을 참조할수 있도록 하는 wrapper 클래스가 존재한다

 

- 참조를 당연하게 생각하면 안된다

 

- string은 object를 바로 물려받는 유일한 애

 

 

 

- ★ 컬렉션 만드는법 ☆

package ex06.collection;

public class Program {

	public static void main(String[] args) {
		ObjectList list = new ObjectList();
		list.add(2);
	}

}

 

 

package ex06.collection;

public class ObjectList {
	private Object[] store;
	private int index;
	private int max;
	
	public ObjectList() {
		max = 3;
		store = new Object[max];
        //여기서 Object배열의 길이를 고정으로 정해주지 말고 변수를 활용하자. 그래야 맘대로 배열 공간을 늘릴수 있으니까
		index = 0;
	}
	
	public void add(Object value) {
		
		if(index == max) {
			//공간을 늘리는 코드
		}
		store[index] = value;
		index++;
	}
}

 

 

 

 


 

 

package ex06.collection;

public class ObjectList {
	private Object[] store;
	private int index;
	private int max;
	
	public ObjectList() {
		max = 3;
		store = new Object[max];
		index = 0;
	}
	
	public void add(Object value) {
		if(index == max) {
			//공간을 늘리는 코드
			
		}
		store[index] = value;
		index++;
	}

	public Object get(int i) {
		Object obj = store[i];
		return obj;
	}
}

 

 

package ex06.collection;

public class Program {

	public static void main(String[] args) {
		ObjectList list = new ObjectList();
		list.add(2);
		
		Object obj = list.get(1);
	}

}

 

 

 

 

 

 

 

 

 

 

728x90

'국비수업 > 수업정리' 카테고리의 다른 글

인터페이스 / 다형성 / 익명클래스  (0) 2023.05.17
컬렉션 / 2 + 추상화  (0) 2023.05.16
서블릿 / 4  (0) 2023.05.12
서블릿 / 3  (0) 2023.05.11
서블릿 / 2  (0) 2023.05.10